一、開關語句
switch(n) //n可以是數值、表達式,運算結果必須是整型
{case val: //必須是常量,如果val等于n,則打開開關...;break; //關閉執行開關,switch中不能與continue配合使用//如果所有的case后面都有break,就形成了多分支結構default: //如果所有的case都沒有匹配成功,則打開default執行開關,而且放在任何位置都一定會執行...;break; //a ... b 表示一段范圍,但是不推薦使用
}練習1:輸入一個月份,判斷季節
#include<stdio.h>int main(int argc,const char* argv[])
{int mon;printf("請輸入一個月份");scanf("%d",&mon);if(mon<1 || mon>12){printf("輸入錯誤");}else{switch(mon/3){case 1:printf("春天");break;case 2:printf("夏天");break;case 3:printf("秋天");break;default:printf("冬天");break;}}return 0;
}
練習2:輸入一個月份,忽略潤平年問題,判斷該月多少天
#include<stdio.h>int main(int argc,const char* argv[])
{char mon;printf("請輸入月份");scanf("%hhd",&mon);if(mon<1 || mon>12){printf("輸入錯誤"); }else{switch(mon){case 2:printf("該月28天");break;case 4:case 6:case 9:case 11:printf("該月30天");break;default:printf("該月31天");break;}}return 0;
}
二、循環語句
循環是一種讓一段代碼反復執行,從而達到你想要的結果
for是喲中比較靈活而且危險(相比較其他循環)的一種循環
一般使用一個變量來引導這個循環的運行,這個變量叫做循環變量i(index 索引)
for([1];[2];[3])
{[4];
}
[1] 給循環變量賦值,C99可以再次定義循環變量
[2] 判斷循環變量是否達到邊界
[4] 被反復執行的代碼語句,也叫做循環體
[3] 改變循環變量,防止出現死循環,一般對循環體變量進行自加或自減
[2]...[4]...[3]...大括號問題:1、如果循環體只有一行代碼,大括號可以省略,但不利于擴展,一般商業代碼都要求大括號不能省略。2、建議上下對齊(方便查看是否缺少大括號)for循環的多種循環:for(;;)
{//死循環
}int i = 0;
for(;i<10;i++)
{}for(int i=0;i<10;)
{printf("---");i++;
}while語句:while(條件) //當條件為真執行循環體,為假時結束{//循環體}
while循環語句相當于for循環語句的精簡版本
for循環負責明確知道循環次數的問題
while循環負責只知道結束條件而不確定循環次數的問題do while語句
do{//循環體
}while(執行條件); //分號不能少
先執行循環體語句,在判斷循環條件,該循環語句至少執行一次
適合先干活,后檢查的特殊情況,例如:輸入密碼,文件讀寫循環嵌套:循環語句中包含了循環語句外層循環執行一次,內層循環執行全部練習3:計算出所有3位水仙花數
#include<stdio.h>int main(int argc,const char* argv[])
{int num;int i;int a,b,c;for(i=100;i<1000;i++){ a=i/100;b=i/10%10;c=i%10;num=a*a*a+b*b*b+c*c*c;if(i == num){printf("%d ",num); }}return 0;
}
練習4:輸入一個正整數,判斷是否是素數
#include<stdio.h>int main(int argc,const char* argv[])
{int i;int num;int k=2;printf("請輸入一個數");scanf("%d",&num);if(num<0){printf("輸入錯誤");return -1;}for(i=2;i<(num/2);i++){if(0== num % i){k++; }}if(2==k){printf("是素數"); }else{printf("不是素數"); }return 0;
}
練習5:輸入一個整數,分解顯示
#include<stdio.h>int main(int argc,const char* argv[])
{int a[14];int num,num_0,k=0;int i;printf("請輸入一個整數");scanf("%d",&num);num_0=num;while(0 != num){a[k]=num%10;num /= 10;k++;}if(num_0<0){printf("- ");for(i=k-1;i>=0;i--){printf("%d ",0-a[i]); }}else{for(i=k-1;i>=0;i--){printf("%d ",a[i]); }}return 0;
}
練習6:輸入一個正整數,判斷是否是回文數
#include<stdio.h>int main(int argc,const char* argv[])
{int num,num_0=0,key;printf("請輸入一個正整數");scanf("%d",&num);key=num;while(0 != key){num_0=num_0*10+key%10;key /= 10;}if(num==num_0){printf("是回文數"); }else{printf("不是回文數");}return 0;
}
三、跳轉語句
goto 可以在函數內任意跳轉
它可能會破壞已經設計好的分支或者循環語句,因此絕大多數公司都是禁用的。
但是它他別適合驅動編程中的異常處理。標簽名:...goto 標簽名;練習7:不使用循環語句計算N的階乘break 1、在switch語句中用于關閉執行開關2、在循環語句中,用于跳出循環,只能跳出1層continue結束本次循環,進入下一次循環return1、返回一個數據給調用者2、結束函數的執行
練習8:不使用循環語句,計算出前N項的斐波那契數列
1 1 2 3 5 8 13
#include<stdio.h>int main(int argc,const char* argv[])
{int N;int key,num=1,ret=1;printf("請輸入N");scanf("%d",&N);if(N<=2){int i=N;
loop1:printf("1 ");i--;if(i>0){goto loop1; }return 0;}else{printf("1 1 "); N -= 2;}
loop2:key=num;num=num+ret;ret=key;N--;printf("%d ",num);if(N>0){goto loop2; }
}
作業:
1、打印99乘法表
#include<stdio.h>int main(int argc,const char* argv[])
{int i,j;for(i=1;i<10;i++){for(j=1;j<=i;j++){printf("%d*%d=%2d ",i,j,i*j); }printf(" \n");}return 0;
}
2、百雞百錢問題 公雞5 母雞3 3小雞1
#include<stdio.h>int main(int argc,const char* argv[])
{int i,j,k;for(i=0;i<=20;i++){for(j=0;j<=(100-5*i);j++){k=100-5*i-3*j;if(100 == i+j+3*k){printf("公雞%d只,母雞%d只,小雞%d只\n",i,j,3*k); }}}return 0;
}
3、計算100~1000所有素數
#include<stdio.h>int main(int argc,const char* argv[])
{int i,j,key=0;for(i=100;i<=1000;i++){key=0;for(j=2;j<=i/2;j++){if(0 == i%j){key++; }}if(0 == key){printf("%d ",i); }}return 0;
}
4、輸入一個日期(yyyy-mm-d)計算公元1年到日期為止過了多少天time(NULL) 獲取1970-1-1 0秒 到運行此函數為止過了多少秒srand(time(NULL));rand() 隨機數,偽隨機
#include<stdio.h>int main(int argc,const char* argv[])
{int year,month,day,i,daymax;int time=0;printf("請輸入日期(year-month-day)\n");scanf("%d%d%d",&year,&month,&day);if(month < 1 || month>12){printf("輸入有誤");return -1;}else{switch(month){case 2:daymax=28;break;case 4:case 6:case 9:case 11:daymax=30;break; default:daymax=31;}if(0 == year%4 && month == 2){daymax++;if(0 == year%100 && 0!= year%400){daymax--;}}if(day > daymax || day<1){printf("輸入有誤,日最大為%d",daymax);return -2;}}time += (year-1)*365;for(i=1;i<year;i++){if(0 == i%4 && 0 != i%100 || 0 == i%400){time++;}}for(i=1;i<month;i++){time += 31;switch(i){case 2:time -= 3;break;case 4:case 6:case 9:case 11:time -=1;break; }}if(0 == year%4 && 0 != year%100 || 0 == year%400){time += 1;}time += day-1;printf("過了%d天",time);return 0;
}
5、顯示平行四邊形,每個printf只能輸出一個符號
#include<stdio.h>int main(int argc,const char* argv[])
{int i,j,k,l=9;for(i=9;i>=0;i--){for(j=i;j>=0;j--){printf(" ");}for(k=0;k<10;k++){printf("*");}printf("\n");}return 0;
}