一、基礎(chǔ)練習(xí)
練習(xí)1:輸入兩個(gè)數(shù),實(shí)現(xiàn)兩個(gè)數(shù)的交換
?法1:三杯水交換(常規(guī)的方式)
#include <stdio.h>
int main(int argc, const char *argv[]){
int a = 0;
int b = 0;
int temp = 0; //定義一個(gè)臨時(shí)變量
printf("輸入兩個(gè)數(shù)字:");
scanf("%d%d",&a,&b); //10 20
temp = a;
a = b;
b = temp;
printf("a = %d, b = %d\n", a, b);//20 10
return 0;
}
法2:如何不使用額外的內(nèi)存空間,實(shí)現(xiàn)兩個(gè)交換(沒有空杯子了)
?三次異或?qū)崿F(xiàn)交換? (異或:不同為1,相同為0 )
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 0;
int b = 0;
printf("請輸入兩個(gè)數(shù)字:");
scanf("%d%d",&a,&b); //10 20 --> 二進(jìn)制分別為 a: 0000 1010 b: 0001 0100
a = a ^ b;
#if 0 //講解
a: 0000 1010
b: 0001 0100
a= 0001 1110 <--現(xiàn)在的a被賦值成這個(gè)值
#endif
b = a ^ b;
#if 0 //講解
a: 0001 1110
b: 0001 0100
b= 0000 1010 <--現(xiàn)在的b被賦值成這個(gè)值
#endif
a = a ^ b;
#if 0 //講解
a: 0001 1110
b: 0000 1010
a= 0001 0100 <--現(xiàn)在的a被賦值成這個(gè)值
#endif
printf("a = %d b = %d\n", a, b); //20 10
return 0;
}
練習(xí)2:改變燈的狀態(tài)
?燈的編號順序 8 7 6 5 4 3 2 1,進(jìn)行如下操作。
1. 有8個(gè)led燈,分別在8個(gè)不同的教室
2. 8個(gè)燈初始狀態(tài)未知
3. 點(diǎn)亮第 1 3 5 7 號燈
4. 把5號燈熄滅
5. 把4號燈點(diǎn)亮
6. 把除了4號燈的其他燈全熄滅
#include <stdio.h>
int main(int argc, const char *argv[])
{
unsigned char led = 0; //使用無符號char(1個(gè)字節(jié)= 8bit)類型來表示八個(gè)燈的狀態(tài)
//點(diǎn)亮第1 3 5 7號燈
led = led | 0x55; //這樣不會影響2 4 6 8 原有的狀態(tài)
//若直接賦值,把1 3 5 7 點(diǎn)亮的同時(shí),把其他燈熄滅了
//把5號燈熄滅
led = led & ~(1<<4);
printf("led = %#x\n", led);//0x55
//把4號燈點(diǎn)亮
led = led | (1<<3);
printf("led = %#x\n", led);//0x4d
//把除了4號燈的其他燈全熄滅
led = led & (1<<3);
printf("led = %#x\n", led);//0x08
return 0;
}
二、分支控制語句練習(xí)題:if..else 語句
練習(xí)3:從終端輸入一個(gè)字符:
如果是大寫的 轉(zhuǎn)換成小寫,如果是小寫的 轉(zhuǎn)換成大寫,如果是 0-9 按照 %d 輸出對應(yīng)整型的 0-9,其他字符 轉(zhuǎn)換成 #,并輸出
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("請輸入一個(gè)字符:");
//法1:輸入字符方式
char ch = getchar(); //getchar 表示在終端獲取一個(gè)字符
getchar(); //清理垃圾字符 回車
//法2:輸入字符方式
char ch = 0;
scanf("%c",&ch);
if(ch >='A' && ch <='Z'){
ch = ch + ('a'-'A');
printf("%c\n",ch);
}else if(ch >='a' && ch <='z'){
ch = ch -('a'-'A');
printf("%c\n",ch);
}else if(ch >= '0' &&ch <= '9'){
ch = ch - '0';
printf("%d\n",ch);
}else{
ch = '#';
printf("%c\n",ch);
}
return 0;
}
?練習(xí)4:輸入一個(gè)年份 判斷是平年還是閏年。
(閏年: 能被4整除且不能被100整除 或者能被400整除)提示:整除: 沒有余數(shù) year%4==0
2000 閏年、2004 閏年、2022 平年、1900 平年
#include <stdio.h>
int main(int argc, const char *argv[])
{
int year = 0;
printf("輸入一個(gè)年份:");
scanf("%d",&year);
if(year%4 == 0 && year%100 != 0 || year%400 == 0){
printf("閏年\n");
}else{
printf("平年\n");
}
return 0;
}
練習(xí)5:輸入三角形的三邊長,判斷能否構(gòu)成三角形
如果能,輸出是什么三角形(等邊、等腰、直角、普通)。如果不能,輸出不能
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 0, b = 0, c = 0;
printf("請輸入三角形的三邊長:");
scanf("%d%d%d",&a,&b,&c);
if( a+b>c && b+c>a && a+c>b){ //構(gòu)成三角形:任意兩邊大于第三邊
printf("能構(gòu)成三角形\n");
if(a == b && b == c && a==c){
printf("等邊三角形\n");
}else if(a==b || b==c || a==c){
printf("等腰三角形\n");
}else if(a*a + b*b == c*c ||a*a + c*c == b*b || a*a + c*c == b*b ){
//上面判斷不能用a^2 + b^2 = c^2 ,在c語言中"^" 是異或
printf("直角三角形\n");
}else{
printf("普通三角形\n");
}
}else{
printf("不能構(gòu)成三角形\n");
}
return 0;
}
練習(xí)6:求孩子身高
每個(gè)做父母的都關(guān)心自己孩子成人后的身高,據(jù)有關(guān)生理衛(wèi)生知識與數(shù)理統(tǒng)計(jì)分析表明,影響小孩成人后身高的因素有遺傳、飲食習(xí)慣與堅(jiān)持體育鍛煉等。小孩成人后身高與其父母身高和自身性別密切相關(guān)。父親、母親、孩子 身高都用double,設(shè)faHeight為其父身高,moHeight為其母身高,基礎(chǔ)身高預(yù)測公式為:
????????男性成人時(shí)身高 = (faHeight + moHeight) * 0.54(cm)
????????女性成人時(shí)身高 = (faHeight * 0.923 + moHeight) / 2(cm)
此外,如果喜愛體育鍛煉,那么可在基礎(chǔ)身高上增加身高 2%
如果有良好的衛(wèi)生飲食習(xí)慣,那么可在基礎(chǔ)身高上增加身高1.5%
程序要求:父親的身高與母親的身高、小孩的性別、是否喜愛體育鍛煉和是否有良好的衛(wèi)生飲食習(xí)慣也從鍵盤上輸入,最終輸出預(yù)測的身高。
提示:
小孩性別的輸入方式,可在屏幕給出提示“請輸入小孩的性別(男孩輸入1,女孩輸 0):”,
然后通過if語句來判斷從鍵盤輸入的字符是 1 還是 0。是否喜愛體育鍛煉也可以通過類似的方式實(shí)現(xiàn)。
測試:
????????180 160 男 體 習(xí) --->190.026? ?%.3f
#include <stdio.h>
int main(int argc, const char *argv[])
{
double faHeight = 0;
double moHeight = 0;
double childHeight = 0;
double dpe = 0; //體育增量
double dfood = 0; //習(xí)慣增量
int sex = 0; //1 男 0 女
int pe = 0; //1 喜歡 0 不喜歡
int food = 0;//1 喜歡 0 不喜歡
printf("請輸入父親的身高與母親的身高:");
scanf("%lf%lf", &faHeight, &moHeight);
printf("請輸入孩子的性別(1 男, 0 女):");
scanf("%d",&sex);
printf("是否喜愛體育鍛煉(1 喜愛, 0 不喜愛):");
scanf("%d",&pe);
printf("是否有良好的衛(wèi)生飲食習(xí)慣(1 有, 0 沒有):");
scanf("%d",&food);
if(sex == 1){
childHeight = (faHeight + moHeight) * 0.54;
}else if(sex = 0){
childHeight = (faHeight*0.923 + moHeight) / 2;
}
if(pe == 1){
dpe = childHeight *0.02; //若pe = 0時(shí),表示 dpe 還為初始值0
}
if(food == 1){ //若food = 0時(shí),表示 dfood 還為初始值0
dfood = childHeight *0.015;
}
childHeight = childHeight + dpe + dfood;
printf("%.3f\n",childHeight);
return 0;
}
?三、switch..case 語句練習(xí)題
練習(xí)7:實(shí)現(xiàn)一個(gè)簡易的計(jì)算器功能
只能操作一個(gè)運(yùn)算符即可 (+ - * / %)。輸入表達(dá)式 輸出結(jié)果
如: 5+4 = 9? ?3*4= 12 10%4 = 2
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 0;
int b = 0;
char operator = 0;
printf("請輸入:");
scanf("%d %c%d", &a, &operator, &b);
//在%c前加一個(gè)空格,表示清理垃圾字符。若不加必須輸入如:a+b 不能帶空格
switch(operator){
case '+':
printf("%d + %d = %d\n", a, b, a+b);
break;
case '-':
printf("%d - %d = %d\n", a, b, a-b);
break;
case '*':
printf("%d * %d = %d\n", a, b, a*b);
break;
case '/':
printf("%d / %d = %f\n", a, b, (float)a/(float)b);
//因?yàn)閍和b本身是int類型 計(jì)算的結(jié)果會舍棄小數(shù)位,所以要轉(zhuǎn)換成float參與運(yùn)算
break;
case '%':
printf("%d %% %d = %d\n", a, b, a%b);
//要想打印 % 必須輸入 %% 才行
break;
}
return 0;
}
練習(xí)8:學(xué)生成績管理
輸入一個(gè)學(xué)生的成績,[90,100] A 、[80,90) B? 、[70,80) C 、[60,70) D 、[0,60) 不及格 、其他 輸入錯(cuò)誤。使用switch..case 語句實(shí)現(xiàn)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int ret = 0;
int score = 0;
printf("輸入一個(gè)學(xué)生的成績:");
ret = scanf("%d",&score);
//scanf函數(shù)執(zhí)行成功返回值是 按指定格式輸入變量的個(gè)數(shù)
//scanf函數(shù)未按照格式輸入時(shí),數(shù)據(jù)并沒有存到變量中,此時(shí)返回值為0,即ret = 0。
//在本代碼中若按int格式輸入則return 1,未按格式輸入則return 0
//輸入'+'或其他非數(shù)字時(shí),若不進(jìn)行if語句的判斷,則直接執(zhí)行case 0:輸出不及格
getchar(); //清理下垃圾字符
if(ret==1){
switch(score / 10){
case 10: //利用case擊穿原則
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("不及格\n");
break;
}
}else{
printf("輸入錯(cuò)誤\n");
}
return 0;
}
四、使用goto實(shí)現(xiàn)循環(huán)
練習(xí)9:使用goto計(jì)算 1+2+3+...+99+100 的和。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int sum = 0; //sum必須初始化為0,否則隨機(jī)值會影響計(jì)算的結(jié)果
int i = 1; //用來控制循環(huán)次數(shù)的變量
LOOP:
sum += i;
i++;
if(i <= 100){
goto LOOP; //goto XX; XX可以為其他的,上面跟這個(gè)相同即可。
}
printf("%d\n", sum);
return 0;
}
五、while 循環(huán)
練習(xí)10:使用while循環(huán) 計(jì)算 1~100 的和?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int sum = 0; //sum必須初始化為0,否則隨機(jī)值會影響計(jì)算的結(jié)果
int i = 1; //用來控制循環(huán)次數(shù)的變量
while(i <= 100){
sum += i;
i++;
}
printf("%d\n", sum);
return 0;
}
練習(xí)11、猴子吃桃問題
一個(gè)猴子第一天摘了若干個(gè)桃,當(dāng)即就吃了一半數(shù)量的桃,沒吃過癮,又多吃了一個(gè),第二天,將剩下的桃又吃了一半數(shù)量,沒吃過癮,又多吃了一個(gè),以后的每一天都吃一半數(shù)量多一個(gè),到第十天再想吃桃的時(shí)候,發(fā)現(xiàn)只剩一個(gè)桃了。問:猴子第一天摘了多少個(gè)桃。
用while循環(huán)實(shí)現(xiàn)。把每天吃之前的桃子數(shù)量 都打印出來 應(yīng)該怎么做?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num = 1; //第十天剩一個(gè)
int i = 0; //循環(huán)變量 控制循環(huán)次數(shù)
while(i < 9){
printf("猴子第%d天有%d個(gè)桃\n",10-i,num);
num = (num+1)*2;
i++;
}
printf("猴子第一天有%d個(gè)桃\n",num);
return 0;
}
?
六、do..while 循環(huán)
練習(xí)12: do..while說明
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
do{
//不管while后面的條件為真還是為假
//代碼塊都會先執(zhí)行一次
printf("hello world\n");
i++;
}while(i<5);
return 0;
}
七、for 循環(huán)
練習(xí)13:使用for循環(huán) 計(jì)算 1-100 的和
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int num = 0;
for(i=1; i<101; i++){
num += i; // += 為復(fù)合賦值運(yùn)算符 相當(dāng)于num = num +i;
}
printf("%d\n",num);
return 0;
}
練習(xí)14:輸出 [100,999] 范圍內(nèi)所有的水仙花數(shù)
水仙花數(shù):個(gè)*個(gè)*個(gè) + 十*十*十 + 百*百*百 == 自身
例如 153:1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 == 153
所以 153 就是一個(gè)水仙花數(shù)
答:153、370 、371、?407
#include <stdio.h>
int main(int argc, const char *argv[])
{
int ge = 0;
int shi = 0;
int bai = 0;
int i = 0;
for(i = 100; i < 1000; i++){
// 不要在循環(huán)里面定義變量 因?yàn)檠h(huán)里面定義的變量的生命周期和作用域都是循環(huán)的
// 循環(huán)每執(zhí)行一次 都會釋放原來的空間 然后重新分配 會有時(shí)間上的開銷 效率低
ge = i % 10;
shi = i /10 % 10;
bai = i / 100;
if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i){
printf("%d 是一個(gè)水仙花數(shù)\n",i);
}
}
return 0;
}
練習(xí)15:輸入一個(gè)日期 輸出這個(gè)日期是這一年的第幾天
注意,得考慮平年閏年的問題。如:輸入:2021-3-24
輸出:2021年3月24日是2021年的第 83 天
#include <stdio.h>
int main(int argc, const char *argv[])
{
//輸入日期的變量
int year = 0;
int mon = 0;
int day = 0;
int mon2_day = 0; //2月天數(shù)變量
int mon_day = 0; //月份的天數(shù)
int sum_day = 0; //總天數(shù)
int i = 1; //月份初始為1月
printf("輸入一個(gè)日期:");
scanf("%d-%d-%d",&year,&mon,&day);
//判斷2月有多少天數(shù)
if((year%4 == 0 )&& (year%100 != 0) || year%400 == 0){
mon2_day = 29;
}else{
mon2_day = 28;
}
if(mon >= 0 && mon <= 12 ){ //判斷輸入月份是否正確
while(i < mon ){ //若輸入為5月,循環(huán)求出前幾個(gè)月的月份天數(shù)
switch(i){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
mon_day = 31;break;
case 2:mon_day = mon2_day;break;
case 4:case 6:case 9:case 11:mon_day = 30;break;
}
sum_day = sum_day + mon_day; //月份天數(shù)遞加
i++; //月份自增
}
}else{
printf("請輸入正確月份\n");
}
//當(dāng)i 正好為 輸入的月份時(shí),注判斷輸入日期滿足不超過當(dāng)月的天數(shù)
if(mon == i ){
switch(i){ //求當(dāng)月的天數(shù)
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
mon_day = 31;break;
case 2:mon_day = mon2_day;break;
case 4:case 6:case 9:case 11:mon_day = 30;break;
}
if(day <= mon_day){ //判斷輸入日期day 是否小于等于 當(dāng)月天數(shù)
sum_day = sum_day + day; //若滿足 用之前滿月的天數(shù)加上輸入的 day
printf("%d年%d月%d日是%d年的第%d天\n",year,mon,day,year,sum_day);
}else{
printf("請輸入正確日期\n");
}
}
return 0;
}
?八、控制語句綜合練習(xí)
練習(xí)16:輸出 [3,100] 范圍內(nèi)所有的偶數(shù)?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
//遍歷3-100
for(i=3; i <= 100; i++){
if( i%2 == 0){
printf("偶數(shù) %d\n",i);
}
}
return 0;
}
練習(xí)17:輸入一個(gè)數(shù),輸出這個(gè)數(shù)的所有因子
如:輸入 12 則輸出 1 2 3 4 6 12
#include <head.h>
int main(int argc, const char *argv[])
{
int num = 0;
int i = 0;
printf("輸入一個(gè)數(shù):");
scanf("%d",&num);
//遍歷1-num,尋找因子
for(i = 1; i <= num; i++){
//如果整數(shù)A除B,得出結(jié)果是沒有余數(shù)的整數(shù),就稱B是A的因子。
if(num%i == 0){
printf("因子: %d\n", i);
}
}
return 0;
}
練習(xí)18:輸出 1000 以內(nèi)的所有完數(shù)
完數(shù):又叫完備數(shù),也叫完美數(shù)。一個(gè)數(shù)除了自身之外的所有因子和還等于自身的數(shù)。
如: 6 就是一個(gè)完數(shù) 1 + 2 + 3 == 6
#include <stdio.h>
int main(int argc, const char *argv[])
{
int sum = 0;
int i = 0;
int j = 0;
//遍歷1~1000 因?yàn)槊總€(gè)數(shù)都有可能是完數(shù)
for(i = 1; i <= 1000; i++){
sum = 0;
//注意:sum還保留著 上一個(gè)數(shù)的所有因子和,所有必須清0
for(j = 1; j < i; j++){ //先獲取i所有因子的和
if(i%j == 0){
sum += j;
}
}
//當(dāng)for循環(huán)結(jié)束時(shí) sum是i 除了自身之外所有因子的和
//判斷i是不是完數(shù)
if(sum == i){
printf("%d 是完數(shù)\n", i);
}
}
return 0;
}
練習(xí)19:輸出 [3,100] 范圍內(nèi)所有的質(zhì)數(shù)
質(zhì)數(shù):因子只有1和本身的數(shù)
解法1:根據(jù)循環(huán)結(jié)束的狀態(tài)處理。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int j = 0;
//遍歷 3-100
for(i = 3; i<= 100; i++){
// [2,i-1] 范圍內(nèi) 有任何一個(gè)能把i整除的數(shù) 都說明i不是質(zhì)數(shù)
for(j = 2; j < i; j++){
//說明i不是質(zhì)數(shù)
if(i % j == 0){
break;
}
}
//上面的for循環(huán)有兩種結(jié)束條件
//1.由于 j==i 循環(huán)正常結(jié)束
//2.由于break導(dǎo)致的退出,此種退出是 j一定是小于i的
if(i == j){
printf("%d 是質(zhì)數(shù)\n",i);
}
}
return 0;
}
解法2:使用標(biāo)志位來處理
#include <stdio.h>
int main(){
int i = 0;
int j = 0;
int flag = 0; //0 不是質(zhì)數(shù) 1 質(zhì)數(shù)
//遍歷 3-100
for(i = 3; i <= 100; i++){
flag = 1;//每次需要重新置1
// [2,i-1] 范圍內(nèi) 有任何一個(gè)能把i整除的數(shù) 都說明i不是質(zhì)數(shù)
for(j = 2; j < i; j++){
if(i%j == 0){
//說明i不是質(zhì)數(shù)
flag = 0;
}
}
if(flag == 1){
printf("%d 是質(zhì)數(shù)\n", i);
}
}
return 0;
}
九、一維數(shù)組練習(xí)
練習(xí)20:求數(shù)組中最大值,及最大值的下標(biāo)
定義一個(gè)int類型的一維數(shù)組,長度為10,從終端給數(shù)組賦值
找出數(shù)組中最大值,及最大值的下標(biāo),并輸出。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int s[10] = {0};
//循環(huán)給數(shù)組成員賦值
for(i = 0;i < 10; i++){
scanf("%d",&s[i]);
}
//找最大值及最大值下標(biāo)
int max_index = 0;
for(i = 1; i < 10; i++){
if(s[max_index] < s[i]){
//
max_index = i;
}
}
//當(dāng)循環(huán)結(jié)束的時(shí)候 max_index 中記錄的是最大值的下標(biāo)
//通過最大值的下標(biāo) 也就找到了最大值
printf("最大值:%d 下標(biāo):%d\n",s[max_index],max_index);
return 0;
}
練習(xí)21:斐波那契數(shù)列
斐波那契數(shù)列 1 1 2 3 5 8 13 21 ....? 前兩個(gè)數(shù)固定為 1 從第三個(gè)開始 依次是前兩個(gè)數(shù)的和,
要求定義一個(gè)數(shù)組 類型為int 長度為20,給數(shù)組中的成員賦斐波那契數(shù)列的值,并輸出
#include <stdio.h>
int main(int argc, const char *argv[])
{
int s[20] = {1,1}; //不完全初始化 沒有初始化的位 默認(rèn)用0初始化
//循環(huán)給數(shù)組賦值 注:不要越界
int i = 0;
for(i = 0; i < 18; i++){
s[i+2] = s[i] +s[i+1];
}
//輸出數(shù)組的值
for(i = 0; i < 20; i++){
printf("%d ",s[i]);
}
printf("\n");
return 0;
}
練習(xí)22:使用循環(huán)打印下面的圖案
?F
_FE
__FED
___FEDC
____FEDCB
_____FEDCBA
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int j = 0;
char ch = 0;
//外層循環(huán)控制行數(shù)
for(i = 0; i < 6; i++){
ch = 'F';
//若使用后不置為F,就不是從F開始打印
//內(nèi)層循環(huán)控制每行的打印
//打印每行的 下劃線
for(j = 0; j < i; j++){
printf("_");
}
//打印每行的字母
for(j = 0; j <= i; j++){
putchar(ch); //向終端輸出字符 也可以用printf
ch--;
}
putchar(10); //換行 相當(dāng)于printf("\n");
}
return 0;
}
練習(xí)23:冒泡排序
將一維數(shù)組按照上升的順序排列
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int j = 0;
int s[9] = {9,5,6,8,2,7,3,4,1};
//排序前
for(i = 0; i < 9; i++){
printf("%d ",s[i]);
}
putchar(10);
//升序 整個(gè)排序的流程
int temp = 0;
int len = sizeof(s)/sizeof(s[0]);
//外層循環(huán)控制比較的趟數(shù) len-1 最后一趟只剩下一個(gè)元素就不用排序了
for(i = 0; i < len-1; i++){
//內(nèi)層循環(huán)控制一趟排序比較的次數(shù)
//每趟都能確定一個(gè)最值,最值在下一趟中就不用再參與比較了 所有l(wèi)en-i-1
for(j = 0; j < len-i-1; j++){
if(s[j] > s[j+1]){
//交換
temp = s[j];
s[j] = s[j+1];
s[j+1] = temp ;
}
}
}
//排序后
for(i = 0; i < 9; i++){
printf("%d ",s[i]);
}
printf("\n");
return 0;
}
?十、二維數(shù)組練習(xí)
練習(xí)24:找出數(shù)組中最大值以及最大值的行號、列號,并輸出?
定義一個(gè)int類型的3行4列的二維數(shù)組,并以行為單位完全初始化,找出數(shù)組中最大值,及最大值的行號,列號 并輸出。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int s[3][4] = {{12,32,42,11},
{7,4,90,6},
{1314,520,100,678}};
int max_hang = 0;
int max_lie = 0;
int i = 0;
int j = 0;
for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
if(s[max_hang][max_lie] < s[i][j]){
max_hang = i;
max_lie = j;
}
}
}
//當(dāng)循環(huán)結(jié)束時(shí) max_hang 里存的就是最大值的行號
//max_lie 里存的就是最大值的列號
printf("最大值:%d 行號:%d 列號:%d\n",
s[max_hang][max_lie],max_hang,max_lie);
return 0;
}
十一、字符串處理函數(shù)?及字符串倒置
練習(xí)25:自己實(shí)現(xiàn)strlen函數(shù)的功能(計(jì)算字符串的長度)
#include <stdio.h>
int main(int argc, const char *argv[])
{
char s[32] = "book";
int len = 0;
//一般不確定長度的時(shí)候 使用while循環(huán)比較多
while(s[len] != '\0'){ //0 和'\0'都可以 '0'不可以
len++;
}
//循環(huán)結(jié)束時(shí) len 中保存的就是字符串的長度
printf("%d\n",len);
return 0;
}
練習(xí)26:自己實(shí)現(xiàn) strcpy 函數(shù)的功能(字符串的復(fù)制)
#include <stdio.h>
int main(int argc, const char *argv[])
{
char s1[32] = "homework";
char s2[32] = "happy";
//要保證 s1 足夠大 否則會越界
int i = 0;
while(s2[i] != '\0'){
s1[i] = s2[i];
i++;
}
//將s2的'\0'也拷貝給 s1
s1[i] = s2[i];
printf("s1 = %s\n", s1); //happy
printf("s2 = %s\n", s2); //happy
return 0;
}
練習(xí)27:自己嘗試實(shí)現(xiàn) strcat 函數(shù)的功能(字符串的追加)
#include <stdio.h>
int main(int argc, const char *argv[])
{
char s1[32] = "homework";
char s2[32] = "happy";
int i = 0;
int j = 0;
//先找到s1 的 '\0'
while(s1[i] != '\0'){
i++;
}
//當(dāng)上面循環(huán)結(jié)束的時(shí)候 i 就是s1 的 '\0' 的下標(biāo)
//開始追加
while(s2[j] != '\0'){
s1[i] = s2[j];
i++;
j++;
}
//將s2的 '\0' 也追加給s1
s1[i] = s2[j];
printf("%s\n",s1);
printf("%s\n",s2);
return 0;
}
練習(xí)28:將字符串倒置輸出
有一個(gè)以空格分隔的多個(gè)單詞的字符串(空格的個(gè)數(shù)不確定有幾個(gè))
"this is a book"
將這個(gè)字符串 以單詞為單位,倒置輸出
"book a is this"
#include <stdio.h>
int main(int argc, const char *argv[])
{
char s[32] = "this is a book";
//先將字符串整體倒置 ---> koob a si siht
int i = 0;
int j = 0;
int temp = 0;
//先找到字符串的最后一個(gè)字符
while(s[j] != '\0'){
j++;
}
//上面循環(huán)結(jié)束的時(shí)候, j是'\0'的下標(biāo)
j--; //讓 j 做為 'k' 的下標(biāo)
//開始交換前面數(shù)據(jù)和后面數(shù)據(jù)
while(i < j){
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
printf("第一次處理:[%s]\n",s);
//進(jìn)行單詞倒置 -->book a is this
int k = 0; //用來控制整體單詞的循環(huán),同時(shí)當(dāng)個(gè)中間變量
i = 0; //控制空格
j = 0; //控制單詞
while(s[k] != '\0'){
i = k;
//當(dāng)不是空格時(shí),不執(zhí)行
while(s[i] == ' ' && s[i] != '\0'){
i++;
}
//交換完所有單詞時(shí),i的下標(biāo)在'\0',跳出循環(huán)
while(s[i] == '\0'){
break;
}
// 沒交換完單詞時(shí),i 的下標(biāo)在每個(gè)單詞的第一個(gè)字符上,將該下標(biāo)給 j
j = i;
while(s[j] != ' ' && s[j] != '\0'){
j++;
}
k = j; //j 的下標(biāo)在空格上,將j 的值賦給 k ,讓k 賦給i
//若直接賦給i,會影響下面代碼 i 的下標(biāo)
j--;
// j 的下標(biāo) 在單詞的最后一個(gè)字符上,i 在單詞的第一個(gè)字符上
while(i < j){
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
printf("第二次處理:[%s]\n",s);
return 0;
}
?十二、指針練習(xí)題
?練習(xí)29:看代碼輸出小練習(xí)題
int *p = NULL;
printf("%d %d %d\n", p+1, p, (p+1)-p);
上面代碼會輸出什么?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int *p = NULL;
printf("%d %d %d\n", p+1, p, (p+1)-p);//4 0 1
//p = NULL; NULL 就是 (void *)0
//p+1 : 0 + 1 個(gè)int 所以p+1 是4號地址 4
//(p+1) - p: 兩個(gè)int * 指針做差 得到的結(jié)果 相差的int的個(gè)數(shù) 1
return 0;
}
練習(xí)30:根據(jù)要求寫程序
定義一個(gè)普通變量a 類型為 int ,里面存儲數(shù)據(jù) 9999
定義一個(gè)指針變量 p1 類型為 int *, 讓p1指向a
然后通過p1將a中的內(nèi)容修改為 0x12345678
再定義一個(gè)指針p2 類型為 char *,讓p2也指向 a
用 %#x 輸出 *p2 的值 以及 *(p2+1) *(p2+2) *(p2+3)的值
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 9999;
int *p1 = &a;
*p1 = 0x12345678;
char *p2 = (char *)&a;
printf("%#x %#x %#x %#x\n",*p2,*(p2+1),*(p2+2),*(p2+3));
return 0;
}
//我們使用的主機(jī)是小端存儲
//所有結(jié)果:0x78 0x56 0x34 0x12
?練習(xí)31:?請你設(shè)計(jì)一個(gè)程序,判斷主機(jī)是大端存儲還是小端存儲?
?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 0x12345678;
char *p = (char *)&a;
if(0x78 == *p){
printf("小端\n");
}else if(0x12 == *p){
printf("大端\n");
}
return 0;
}
練習(xí)32:看代碼輸出小練習(xí)題
int x = 0x41424344;
printf("%s\n", &x);
上面的代碼會輸出什么?
答:小端存儲的前提下,輸出DCBA+不確定的東西。
練習(xí)33:使用指針實(shí)現(xiàn) strlen 函數(shù)的功能
#include <stdio.h>
int main(int argc, const char *argv[])
{
char s[32] = "book";
char *p = s;
int count = 0;
#if 0 // 法一
while(*p != 0){
count++;
p++;
}
#endif
//法二
while(*p++){
count++;
}
printf("%d\n",count);
return 0;
}
練習(xí)34:使用指針實(shí)現(xiàn) strcpy 函數(shù)的功能
#include <stdio.h>
int main(int argc, const char *argv[])
{
char s1[32] = "hello world";
char s2[32] = "book";
char *p1 = s1;
char *p2 = s2;
while(*p2 != '\0'){
*p1 = *p2;
p1++;
p2++;
}
*p1 = *p2;
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
練習(xí)35:使用指針實(shí)現(xiàn) strcat 函數(shù)的功能
#include <stdio.h>
int main(int argc, const char *argv[])
{
char s1[32] = "hello world";
char s2[32] = "book";
char *p1 = s1; //將p1指向s1
char *p2 = s2;
//先將p1 下標(biāo)循環(huán)到最后一個(gè)字符
while(*p1 != '\0'){
p1++;
}
//循環(huán)結(jié)束的時(shí)候 p指向 s1 的'\0'
//循環(huán)將s2 的字符追加到 s1 的后面
while(*p2 != '\0'){
*p1 = *p2;
p1++;
p2++;
}
*p1 = *p2;
printf("%s\n",s1);
printf("%s\n",s2);
return 0;
}
十三、指針和一維數(shù)組的練習(xí)
?練習(xí)36:字符串轉(zhuǎn)換及統(tǒng)計(jì)數(shù)字個(gè)數(shù)
從終端輸入一個(gè)字符串 gets,將所有的大寫轉(zhuǎn)成小寫,將所有的小寫轉(zhuǎn)成大寫,如果有數(shù)字,統(tǒng)計(jì)數(shù)字的個(gè)數(shù),其他字符全部轉(zhuǎn)換成 -,并輸出轉(zhuǎn)換后的字符串 及 數(shù)字的個(gè)數(shù)?
#include <stdio.h>
int main(int argc, const char *argv[])
{
char buff[128] = {0};
gets(buff);
printf("處理前:[%s]\n",buff);
char *p = buff;
int count = 0;
while(*p != '\0'){
if(*p >= 'A' && *p <= 'Z'){
*p = *p + ('a'-'A');
}else if(*p >= 'a' && *p <= 'z'){
*p = *p - ('a'-'A');
}else if(*p >= '0' && *p <= '9'){
count++;
}else{
*p = '-';
}
p++;
}
printf("處理后:[%s] 共有數(shù)字 %d 個(gè)\n",buff,count);
return 0;
}
練習(xí)37:自己實(shí)現(xiàn) atoi函數(shù) 的功能
atoi 將字符串的數(shù)字 轉(zhuǎn)成整型的數(shù)
"12345678" ---> 12345678
#include <stdio.h>
int main(int argc, const char *argv[])
{
char buff[32] = "12345678";
char *p = buff;
int sum = 0;
while(*p != '\0'){
sum *= 10 ;
sum += (*p -'0');
p++;
}
printf("%d\n",sum);
return 0;
}
?練習(xí)38:使用命令行傳參的方式 實(shí)現(xiàn) 簡易計(jì)算器的加減功能
如: ./a.out 10 + 20 ---> 30
./a.out 100 - 50 ---> 50
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int left_value = atoi(argv[1]);
int right_value = atoi(argv[3]);
if(0 == strcmp(argv[2],"+")){
printf("%d+%d=%d\n",left_value,right_value,left_value + right_value);
}else if(0 == strcmp(argv[2],"-")){
printf("%d-%d=%d\n",left_value,right_value,left_value + right_value);
}
return 0;
}
十四、函數(shù)練習(xí)題
練習(xí)39:自己封裝一個(gè) 能輸出 1~n 求和結(jié)果的函數(shù)
n由參數(shù)傳遞,并調(diào)用測試
#include <stdio.h>
#include <stdlib.h>
//函數(shù)聲明時(shí) 可以只寫類型 不寫形參名
void my_sum(int );
int main(int argc, const char *argv[])
{
int num = atoi(argv[1]);
my_sum(num);
return 0;
}
//定義時(shí) 必須要寫 形參名 因?yàn)楹瘮?shù)內(nèi)部要使用這個(gè)名字
void my_sum(int n){
int i = 0;
int sum = 0;
for(i = 0; i <= n; i++){
sum += i;
}
printf("%d\n",sum);
}
練習(xí)40:實(shí)現(xiàn) 兩個(gè)整數(shù) 加減乘除 的功能
編寫4個(gè)函數(shù),my_add, my_sub, my_mul, my_div ,分別實(shí)現(xiàn) 兩個(gè)整數(shù) 加減乘除 的功能,并調(diào)用測試。
#include <stdio.h>
#include <stdlib.h>
//函數(shù)聲明
int my_add(int, int);
int my_sub(int,int);
int my_mul(int,int);
float my_div(int,int);
int main(int argc, const char *argv[])
{
int a = atoi(argv[1]);
int b = atoi(argv[2]);
printf("%d\n",my_add(a,b));
printf("%d\n",my_sub(a,b));
printf("%d\n",my_mul(a,b));
printf("%.3f\n",my_div(a,b));
return 0;
}
int my_add(int x,int y){
return x+y;
}
int my_sub(int x,int y){
return x - y;
}
int my_mul(int x,int y){
return x * y;
}
float my_div(int x,int y){
return (float)x/(float) y;
}
?練習(xí)41:將前面冒泡排序的功能 封裝成函數(shù)
int sort(int *p, int len, int flag);
flag 1 升序 、 flag 0 降序?
#include <stdio.h>
//flag 1 升序 flag 0 降序
void my_sort(int *p,int len,int flag){
int i = 0;
int j = 0;
int temp = 0;
for(i = 0; i <len -1; i++){
for(j = 0; j < len-i-1; j++){
if(flag == 1){ //升序
if(p[j] > p[j+1]){
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}else if(flag == 0){ //降序
if(p[j] < p[j+1]){
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
}
}
}
void my_print(int *p,int len){ //打印數(shù)組
int i = 0;
for(i = 0; i < len; i++){
printf("%d ",p[i]);
}
printf("\n");
}
int main(int argc, const char *argv[])
{
int s[10] = {2,1,8,5,4,3,7,9,6,10};
//排序前
my_print(s, 10);
//升序排序
my_sort(s, 10, 1);
//排序后
my_print(s, 10);
//降序排序
my_sort(s, 10, 0);
//排序后
my_print(s, 10);
return 0;
}
練習(xí)42:將 strlen 封裝成函數(shù)?
法一:?文章來源:http://www.zghlxwxcb.cn/news/detail-715600.html
#include <stdio.h>
//函數(shù)調(diào)用
void my_strlen(char *p){
int len = 0;
while(*p++){ //先進(jìn)行 p++ 后 *(p++)
len++; //統(tǒng)計(jì)字符個(gè)數(shù)
}
printf("%d\n",len);
}
int main(int argc, const char *argv[])
{
char s[32] = "book";
my_strlen(s);
return 0;
}
法二:文章來源地址http://www.zghlxwxcb.cn/news/detail-715600.html
#include <stdio.h>
int my_strlen(const char *str){
int len = 0;
while(*str != '\0'){
len++;
str++;
}
return len;
}
int main(int argc, const char *argv[])
{
char s[32] = "hello world";
printf("%d\n", my_strlen(s));
return 0;
}
練習(xí)43:將strcpy?封裝成函數(shù)?
#include <stdio.h>
int my_strcpy(char *dest, const char *str){
while(*str != '\0'){
*dest = *str;
str++;
dest++;
}
*dest = *str;
return 0;
}
int main(int argc, const char *argv[])
{
char s1[32] = "hello world";
char s2[32] = "book";
my_strcpy(s1,s2);
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
練習(xí)44:將 strcat 封裝成函數(shù)?
#include <stdio.h>
int my_strcat(char *dest, const char *str){
//先讓dest 的下標(biāo)指向'\0'
while(*dest != '\0'){
dest++;
}
//讓str 的字符循環(huán)追加到 dest的后面
while(*str != '\0'){
*dest = *str;
str++;
dest++;
}
*dest = *str; //將str 的 '\0' 賦給 dest
return 0;
}
int main(int argc, const char *argv[])
{
char s1[32] = "hello world";
char s2[32] = "book";
my_strcat(s1,s2);
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
練習(xí)45:將 strcmp 封裝成函數(shù)?
#include <stdio.h>
int my_strcmp(char *s1, const char *s2){
while(*s1 == *s2 && *s1 != '\0'&& *s2 != '\0'){
s1++;
s2++;
}
//如果循環(huán)結(jié)束時(shí) *s1 == *s2 說明 *s1 和 *s2 都是 '\0'
if(*s1 == *s2){
return 0;
}else{
return *s1-*s2;
}
}
int main(int argc, const char *argv[])
{
char s1[32] = "hello";
char s2[32] = "halloasdfqewr";
int ret = my_strcmp(s1,s2);
if(ret == 0){
printf("s1 == s2\n");
}else if(ret > 0){
printf("s1 > s2\n");
}else if(ret < 0){
printf("s1 < s2\n");
}
return 0;
}
到了這里,關(guān)于C基礎(chǔ):45道練習(xí)題匯總(初學(xué)者加油)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!