小學生都看得懂的C語言入門(2): 判別 循環的一些應用實例
1.bool 類型
定義bool類型之前需要導入#include <stdbool.h>
#include <stdio.h> #include <stdbool.h> int main() { bool b=6>5; bool t=true; printf("%d\n",b); //仍然是整數形式輸出 得到1 return 0; }
2.邏輯運算
非! 或|| 和&& x>4 && x<6 !age<20 永遠成立,!age=0或1 優先級順序 ! && ||
賦值運算等級最低
// 短路 邏輯運算時從左向右的,左邊已經可以覺得結果了,右邊就不做了
//條件運算符 m<n? x:a+5 表示m<n 則 取x, 否則為a+5 ,這種表達式少用,會搞錯 !!
//逗號 等級最低的
#include <stdio.h> #include <stdbool.h> int main() { int i=3+4, 5+6; //出錯了 為什麽 printf("%d\n",i); //7 int j=(3+4,5+6); // 正確 printf("%d\n",j); //11 return 0; }
逗號什麽用? 主要在for 中使用,可以放多個計算. for(i=0,j=10;i<j:i++,j--)...
3.分段函數
#include <stdio.h> int main() { int x=10; int f=0; if(x<0){ f=-1; } else if(x==0){ f=0; } else{ f=2*x; }
printf("%d\n",f); //20 return 0; }
if else 後面只有一個執行語句的話,可以不加{}
#include <stdio.h> int main() { int x=10; int f=0; if (x<0) f=-1; else if(x==0) f=0; else f=2*x; printf("%d\n",f); //20 return 0; }
4.switch
為什麽已經有了if 還需要用switch?
#include <stdio.h> int main() { int type; scanf("%d",&type); if (type==1) printf("nihao"); else if(type==2) printf("zaoshanghao"); else if(type==3) printf("wanshanghao") ; else printf("no") ; // 上述當type=4 需要一個一個判別過來,不太好 ,因此引入switch return 0; }
用switch() {case 1:...; break; case 2:... ;break;...default:...;break;}
#include <stdio.h> int main() { int type; scanf("%d",&type); switch(type){ case 10: //tpye=10 就直接做這個, printf("nihao"); break; //一定要有break, 阻止語句往下執行 case 20: printf("zaoshanghao"); break; case 30: //tpye=30 就直接做這個,不用判別前面兩種了 printf("wanshanghao"); break; default: printf("no"); return 0; }
註意: switch 只能用整數型, type不能是double!
#include <stdio.h> int main() { //成績轉化 int grade; scanf("%d",&grade) ; grade/=10; switch(grade){ case 10: 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("F\n"); break; } return 0; }
5.簡單小例子
#include <stdio.h> int main() { // 計算log2的整數部分 int x; int ret=0; scanf("%d",&x); int t=x; while(x>1){ x/=2; ret++; } printf("log2 of %d is %d\n",t,ret); return 0; }
12
log2 of 12 is 3
求平均數,輸入數字, 以-1 結束,求出-1之前的平均數
#include <stdio.h> int main() { int num; int sum=0; int count=0; scanf("%d",&num); while(num!=-1){ sum+=num; count++; scanf("%d",&num); } printf("%f\n",1.0*sum/count); return 0; }
猜數字遊戲 (1-100) 過程中需要提示:大了 小了,記錄猜數字次數.
#include <stdio.h> #include <stdlib.h> //rand 可以用了 #include <time.h> int main() { srand(time(0)); //讓隨機數能夠像隨機數一樣 int num=rand()%100+1; //產生一個1-100之間的隨機數 int a=0; int count=0; //猜數次數 printf("我已經想好了一個1到100內的數\n"); do{ printf("please guess a number:\n"); scanf("%d",&a); count++; //無論對錯都算一次 if (a>num) printf("大了"); else if (a<num) printf ("小了"); }while(a!=num); printf("bingo!,你用了%d次就成功了\n",count); return 0; }
數字逆序輸出 ,整數x逆序 作用x%10 得到個位數 x/10 去掉個位數,
#include <stdio.h> int main() { int x=500; int t=x; int num; int ret=0; while(x>0){ num=x%10; ret=ret*10+num; x/=10; } printf("the reverse of %d is %d\n",t,ret); return 0; }
the reverse of 500 is 5 , 沒有得到005 有缺陷!
註意:容易出錯的地方, if後面沒有加{} 如果執行語句只有一句,可以不加,有多句一定要{} .
if() 後面不用加; 否則if 直接結束了,執行後面語句
#include <stdio.h> int main() { int age=50; if (age>60); //加了; { printf("can be treat carefully"); } return 0; }
得到:
can be treat carefully 這個結果就是 if 在不執行設麽就直接結束了,進入printf 語句
好的風格的代碼.
#include <stdio.h> int main() { int x=10; int f=0; if (x<0) { f=-1; } else if (x==0) { f=0; } else { f=2*x; } return 0; }
上述優點在於如要註釋幾行不會影響其他行. 特別是{ }最會受註釋行的影響.
//判斷素數
#include <stdio.h> int main() { int x; scanf("%d",&x); int i; int isprime=1; for(i=2;i<x;i++) { if(x%i==0) { isprime=0; // break; break也可以放在外面 } break; } if(isprime==0) printf("不是素數"); else printf("是素數"); return 0; }
13
是素數
//輸出30以內的素數 雙重循環
#include <stdio.h> int main() { int x; for(x=2;x<30;x++) { int i; int isprime=1; for(i=2;i<x;i++) { if(x%i==0) { isprime=0; } break; } if(isprime==1) printf("%d ",x); } return 0; }
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29
// 輸出前20個素數
#include <stdio.h> int main() { int x=2; int cnt=0; while(cnt<20) { int i; int isprime=1; for(i=2;i<x;i++) //x還是會輸出2的 { if(x%i==0) { isprime=0; } break; } if(isprime==1) { printf("%d ",x); cnt++; } x++; } return 0; }
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
//另一種方法, 不用while, 用for
#include <stdio.h> int main() { int x; int cnt=0; for(x=2;cnt<20;x++) { int i; int isprime=1; for(i=2;i<x;i++) //x還是會輸出2的, 但是只有一次循環 { if(x%i==0) { isprime=0; } break; } if(isprime==1) { printf("%d ",x); cnt++; } } return 0; }
//湊硬幣 1 2 5元 湊成100元以下的金額 (輸出第一個符合條件的即可) 三重循環
#include <stdio.h> int main() { int x; int one ,two,five; int exit=0; scanf("%d",&x); for (one=1;one<x;one++){ for (two=1;two<x/2;two++){ for(five=1;five<x/5;five++){ if(one+2*two+five*5==x){ printf("用%d個一元 %d個兩元 %d個五元得到%d元\n", one,two,five,x); exit=1; break; //只能結束當前循環,如何跳出三個循環 ?增加exit變量 接力break } } if (exit==1)break; } if (exit==1)break; } }
23
用1個一元 6個兩元 2個五元得到23元
//上述稱為接力break, 還有一種方法 用goto, 可以免去寫很多個break
#include <stdio.h> int main() { int x; int one,two,five; scanf("%d",&x); for (one=1;one<x;one++) { for (two=1;two<x/2;two++) { for(five=1;five<x/5;five++){ if(one+2*two+five*5==x){ goto out; //後面定out的位置 } } } } out: printf("用%d個一元%d個兩元 %d個五元得到%d元\n",one,two,five,x); }
12
用1個一元3個兩元 1個五元得到12元
//求和 1+1/2+1/3+1/4...+1/n
#include <stdio.h> int main() { int n; int i; double sum=0.0; scanf("%d",&n); for(i=1;i<=n;i++){ sum+=1.0/i; } printf("f(%d)=%f\n",n,sum) ; }
10
f(10)=2.928968
//求和 1-1/2+1/3-1/4...+(-1)^(n-1)*1/n, 增加sign符號
#include <stdio.h> int main() { int n; int i; int sign=1; double sum=0.0; scanf("%d",&n); for(i=1;i<=n;i++){ sum+=sign*1.0/i; sign=-sign; } printf("f(%d)=%f\n",n,sum) ; }
4
f(4)=0.583333
//求兩個數的最大公約數
方法1: 先找到兩數的較小者min , 循環 i=1:min找公因子, 循環結束得到的就是最後一個(最大公因數)
#include <stdio.h> int main() { int a,b; int min ; scanf("%d %d",&a,&b); if (a<b){ min=a; } else{ min=b; } int ret=0; int i; for(i=1;i<min;i++){ if (a%i==0 && b%i==0){ ret=i; } } printf("%d and %d 的最大公約數是%d",a,b,ret); }
10 25
10 and 25 的最大公約數是5
//方法2: 輾轉相除法 a=12, b=18 ,t記錄a%b 然後a=b, b=t, 繼續做下去
思路:
// a b t
//12 18 12
//18 12 6
//12 6 0
//6 0 b是0的時候結束, 此時a是最小公約數
#include <stdio.h> int main() { int a,b; int t; scanf("%d %d",&a,&b) ; while(b!=0){ t=a%b; a=b; b=t; } printf("gcd=%d\n",a); }
//正序分解整數 12345 輸出 1 2 3 4 5
//先回顧逆序輸出... x%10 得到最後一個數字. x/10去掉最後一個數
#include <stdio.h> int main() { int x; scanf("%d",&x); //x=12345; do{ int d=x%10; //得到個數數字 printf("%d ",d); x/=10; } while(x>0); }
1200
0 0 2 1
// 正序可以通過逆序兩次得到
#include <stdio.h> int main() { int x; int t=0; scanf("%d",&x); //x=12345; do{ int d=x%10; //得到個數數字 t=t*10+d; x/=10; } while(x>0); printf("t=%d\n",t); x=t; do{ int d=x%10; //得到個數數字 printf("%d ",d); x/=10; } while(x>0); }
1329
t=9231
1 3 2 9
但是輸入600 得到的 t=6 最後結果也是6 不是 006,修改思路如下
// 思路 : x=1234
//1234/1000 1 ..
//1234%1000 234
//1000/10 100
//234/100 2. ..
//234%100 34
//100/10 10
//34/10 3. ..
//34%10 4
//10/10 1
//4/1 4 ...
//4%1 0
//1/10 0
#include <stdio.h> #include<math.h> int main() { int x; scanf("%d",&x); int t=x; int cnt=0; //計算位數 do{ x/=10; cnt++; } while(x>0); printf("%d\n",cnt); int m=pow(10,cnt-1);// pow沒有定義?? 增加#include<math.h> printf("%d\n",m); x=t; do{ int d=x/m; printf("%d ",d); x%=m; m/=10; }while(m>0); }
123
3
100
1 2 3
上述沒必要用pow求
#include <stdio.h> #include<math.h> int main() { int x; scanf("%d",&x); int m=1; int t=x; while(x>9){ x/=10; m*=10; } x=t; do{ int d=x/m; printf("%d ",d); x%=m; m/=10; }while(m>0); }
小學生都看得懂的C語言入門(2): 判別 循環的一些應用實例