--- title: C/C++ 迴圈控制 tags: C++程式設計實習 --- # for 迴圈 :::success 語法: for(<font color='red'>**初值設定**</font>;<font color='blue'>**條件運算式**</font>;<font color='red'>**控制運算式**</font>){ 條件運算式為true要做的事情(敘述); } <font color='red'>-當已經知道執行次數時,使用for迴圈</font> ::: 1.<font color='red'>**初值設定**</font>:只會執行一次,第一次迴圈的時候。設定迴圈開始執行的初始值 2.<font color='blue'>**條件運算式**</font>:每次要執行回圈內的敘述時,都會判斷此條件是否成立(true),當此條件成立時,才會執行回圈內的敘述,否則結束迴圈</font> 3.<font color='red'>**控制運算式**</font>:每次執行迴圈內的敘述後,會執行此部分,通常用來更新條件的運算變數值 :::success 範例:for(int i=1; i<6; i++) ::: ```cpp=1 #include <iostream> using namespace std; int main() { //計算1+2+3+.....100總和 //sun為儲存總和的變數,i為for迴圈的初數值 unsigned int sum=0,i; for(i=1;i<=100;i++){ //i由1開始每次加1直到101為止 cout<<"i="<<i; sum = sum + i; //sun每次加上i的值 cout<<"\tsum="<<sum<<"\n"; } cout<<"1+2+3+.....100="<<sum<<"\n";//輸出結果 //計算51+53+55....+99 sum=0; for(i=51;i<=99;i+=2){ cout<<"i="<<i; sum = sum + i; cout<<"\tsum="<<sum<<"\n"; } //計算100~1000中17的倍數 sum=0; for(i=100;i<=1000;i++) if(i%17==0){ cout<<"i="<<i; sum += i; cout<<"\tsum="<<sum<<"\n"; } return 0; } ``` # while 迴圈 :::success -語法: 初值設定: while(條件判斷){ 執行敘述; 條件更新敘述; } <font color='red'>**-當不知道執行次數時,使用while迴圈**</font> <font color='blue'>**-while迴圈次數有可能為0次**</font> ::: 1.<font color='red'>**初值設定**</font>:只會執行一次,第一次迴圈的時候。設定迴圈開始執行的初始值 2.<font color='blue'>**條件運算式**</font>:每次要執行回圈內的敘述時,都會判斷此條件是否成立(true),當此條件成立時,才會執行回圈內的敘述,否則結束迴圈</font> 3.<font color='red'>**控制運算式**</font>:用來更新條件的運算變數值 :::info 計算100~1000中17的倍數總和 ::: ```hpp=1 include <iostream> using namespace std; int main() { //計算 100~1000中17的倍數和 unsigned int sum=0 //初值為0 unsigned int i=100; //100~1000第一個值作為初數 while(i<=1000){ //i<=1000條件成立值行while內容 if (i%7==0){ //i可以被7整除 cout<<"i="<<i; //輸出i值 sum +=i; //sum=sum+1 cout<<"sum="<<sun<<"\n"; //顯示目前累加的種和 } i++; //i=i+1 } cout<<"100~1000中17的倍數和="<<"\n"; return 0; } ``` :::info 計算BMI ::: ```hpp= #include <iostream> using namespace std; int main() { //w儲存使用者體重(kg) //h儲存使用者身高(cm) float w,h ; //當go為y或Y的時候繼續讓使用者輸入BMI資料 char go='y'; while(go=='y' || go=='Y'){ //讓使用者輸入身高和體重(空白隔開) cin>>w>>h; h/=100; //身高轉體重為多少公尺 float bmi=w/(h*h); //bmi=w/(h*h) cout<<"bmi="<<bmi<<"\n"; cout<<"繼續嗎?(Y or y):"; cin>>go; } return 0; } ``` :::info 使用輾轉相除法求最大公因數 https://zh.wikipedia.org/zh-tw/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95 ::: ![](https://i.imgur.com/gZqZFP7.png) ```cpp=1 #include <iostream> using namespace std; int main() { //計算a,b兩數的最大公因數 //r為a除b的餘數 unsigned int a,b,r; //讓使用者輸入a,b兩數(空白隔開兩數) cin>>a>>b; //輾轉相除法 while(b!=0){ r=a%b; a=b; b=r; } cout<<"GCD(a,b)"<<a<<"\n"; return 0; } ``` ```cpp=1 #include <iostream> using namespace std; int main() { //計算a,b兩數的最大公因數 //r為a除b的餘數 unsigned int a, b, r; //讓使用者輸入a,b兩數(空白隔開兩數) cin>>a>>b; //將a,b的值暫存 unsigned int tmpl=a, tmp2=b; //輾轉相除法 while(b!=0)f 當除數不是0 r=a%b;//取a除b的餘數 a = b; //b變為被除數 b = r; //r變為餘數 } cout<<"GCD(" <<tmp1<<", " <<tmp2<<" )=" <<aくく"In" ; return 0; ``` # do while 迴圈 :::success -語法: 初值設定: do{ 執行敘述; 條件更新敘述; }while(條件運算式) <font color='red'>**-當不知道執行次數時,使用do while迴圈**</font> <font color='blue'>**-do while迴圈最少執行一次1次**</font> ::: ```cpp=1 #include <iostream> using namespace std; int main() { int pwd; //儲存密碼的變數 do{ cout<<"請輸入密碼:"; cin>>pwd; }while(pwd!=1234); cout<<"密碼正確\n"; return 0; } ``` # 巢狀迴圈 :::success - 巢狀迴圈(nested loops)敘述是指迴圈敘述中還有迴圈敘述。 - 第一層迴圈內還有最少一層迴圈 ::: ![](https://i.imgur.com/tcwWT8r.png) :::info 顯示9x9的乘法表 ::: ```cpp=1 #include <iostream> using namespace std; int main() { for(int i=1; i<10; ++i){ for(int j=1; j<10;j++){ //cout<<i*j<<" "; //不會對齊 printf("%3d",i*j); //可對齊 } cout<<"\n"; } return 0; } ``` # 無窮迴圈 ::: success 迴圈永遠不會停 ::: 1. 使用for ```cpp=1 for(;;){ 要做的事 } ``` 2. 使用while ```cpp=1 while(1){ 要做的事 } while(-1){ 要做的事 } ``` # break 跳出迴圈 :::success 遇到break就執行最近的}下- ::: ```cpp=1 #include <iostream> using namespace std; int main() { int sum=0; for(int i=1;i<=100; i++){ if(i>50) break; //跑到第13行繼續執行程式 sum += i; } //cout<<sun<<"\n"; printf("%d\n",sum); return 0; } ``` # continue 繼續迴圈 :::success 遇到continue就執行最竟近的迴圈開都 ::: ```cpp=1 #include <iostream> using namespace std; int main() { int sum=0; for(int i=1; i<=100; i++){ if(i%2) continue; //遇到continue執行第8行for迴圈 sum +=i; } printf("1~100的偶數和=%d\n", sum); return 0; } ``` ## 練習題 1. 判斷使用者輸入的整數,是否能被2及5整除 ```cpp=1 /**************************************************** ** 判斷使用者輸入的整數,是否能被2及5整除 *****************************************************/ #include <iostream> using namespace std; int main() { int n; cin>>n; if(n%2==0 && n%5==0){ cout<<n<<"能被2及5整除\n"; } else { cout<<n<<"不能被2及5整除\n"; } return 0; } ``` 2. 判斷座標(x, y)在第幾象限 ```cpp=1 /**************************************************** ** 判斷座標(x, y)在第幾象限 *****************************************************/ #include <iostream> using namespace std; int main() { int x, y; cin>>x>>y; if(x>0){ if(y>0){ printf("(%d, %d)在第一象限\n",x,y); }else{ printf("(%d, %d)在第四象限\n",x,y); } }else{ if(y>0){ printf("(%d, %d)在第二象限\n",x,y); }else{ printf("(%d, %d)在第三象限\n",x,y); } } return 0; } ``` 3. 判斷是否可為三角形三邊長 ```cpp=1 /**************************************************** ** 判斷是否可為三角形三邊長 *****************************************************/ #include <iostream> using namespace std; int main() { int x , y, z; while(cin>>x>>y>>z){ if(x+y>z and x+z>y and z+y>x){ cout<<"可以為三角形三邊長\n"<<endl; }else{ cout<<"不可為三角形三邊長\n"<<endl; } } return 0; } ``` 4. 電影分級制度 ```cpp=1 /**************************************************** ** 電影分級制度 *****************************************************/ #include <iostream> case 0 ... 5: cout<<"可觀賞普遍級\n"; break; case 6 ... 11: cout<<"可觀賞普遍級跟保護級\n"; break; case 12 ... 17: cout<<"可觀賞普遍級,保護級,輔導級"; break; case 18 ... 150: cout<<"可觀賞普遍級,保護級,輔導級,限制級\n"; break; case 151 ... 999: cout<<"請輸入合理年齡\n"; break; } return 0; } ``` 5. 用for迴圈計算1 + 3 + 5 + 7 + 9 ```cpp=1 /**************************************************** ** 用for迴圈計算1 + 3 + 5 + 7 + 9 *****************************************************/ #include <iostream> using namespace std; int main() { int sum=0; for(int i=1; i<=9; i+=2){ sum+=i; } pruntf("1+3+5+7+9=%d\n",sum); return 0; } ``` 6. 利用for迴圈顯示等差數列10 8 6 4 2 ```cpp=1 /**************************************************** ** 利用for迴圈顯示等差數列10 8 6 4 2 *****************************************************/ using namespace std; int main() { for(int i=10; i>=2; i-=2){ printf("%d", i); } return 0; } ``` 7. 猜數字遊戲: 遊戲會發出提示訊息要使用者輸入所要猜的數字(1~10),若猜錯,遊戲會繼續進行,直到猜對為止。 :::info 1.加入time.h stdlib.h這2個標頭檔 2.產生亂數種子 srand(time(NULL)) 3.產生亂數: 產生(min,max)範圍的亂數,公式為<font color='red'>**亂數x=rand()%(max-min+1)+min**</font> ::: ```cpp=1 /**************************************************** ** 利猜數字遊戲: **遊戲會發出提示訊息要使用者輸入所要猜的數字(1~10), **若猜錯,遊戲會繼續進行,直到猜對為止。 *****************************************************/ #include <iostream> #include <time.h> //取得從1970/1/1午夜12點到現在所經過的秒數 #include <stdlib.h> //使用內建的srand(),rand()等亂數函數 using namespace std; int main() { //使用時間秒數建立亂數種子 srand(time(NULL)); //產生一個(1,10)的整數亂數 int x = rand()%(10-1+1)+1; //printf("%d",x); //儲存使用者猜的數字 int guess=1; int total=0; //紀錄猜的次數 while(guess!=x){ cout<<"請輸入要猜的數字:"; cin>>guess; //讀取使用者猜的數字 total+=1; //猜的數字+1 } printf("數字為%d,總共猜了%d次\n",guess,total); return 0; } ``` 8. 計算2的n次方 ```cpp=1 /**************************************************** ** 計算2的n次方 *****************************************************/ #include <iostream> using namespace std; int main() { unsigned int k=1; unsigned int n=3; cout<<"請輸入n:"; cin>>n; for(int i=1; i<=n; i++){ k = k*2; //printf("i=%d, k=%d\n",i,k); } printf("2的%d次方=%d",n,k); printf("使用左移(1<<n)即為計算2的n次方:\n\ 2的%d次方=%d",n,(1<<n)); return 0; } ``` 9. 以do…while迴圈進行成績加總,直到使用者輸入-1,才顯示總分。 ```cpp=1 /**************************************************** ** 以do…while迴圈進行成績加總,直到使用者輸入-1,才顯示總分。 *****************************************************/ #include <iostream> using namespace std; int main() { int sum=0; //儲存總分的變數 int x=0l; //輸入的成績 int n=0; //紀錄輸入的人數. do{ sum+=x; //x加入總分 n++; //人數加1 cin>>x; //讀取輸入成績 }while(x!=-1); //當x不是-1繼續執行 printf("總分為%d,人數為%d,平均為%.21f\n", sum, n-1, (double)sum/(n-1)); return 0; } ``` 10. 用*組成三角形 ```cpp=1 /**************************************************** ** 用*組成三角形 *****************************************************/ #include <iostream> using namespace std; int main() { for(int i=1; i<=5; i++){ //層數:1, 2, 3, 4, 5 for(int j=1; j<=i; j++){ //每層中的*數有i個 printf("*"); } printf("\n"); } return 0; } ``` ![](https://i.imgur.com/oB8jniw.png) ![](https://i.imgur.com/vXjDpmd.png) ```cpp=1 /**************************************************** ** 用*組成三角形 *****************************************************/ #include <iostream> using namespace std; int main() { for(int i=1; i<=5; i++){ //層數:1, 2, 3, 4, 5 for(int j=1; j<=i; j++){ //每層中的*數有i個 printf("*"); } printf("\n"); } for(int i=1; i<=5; i++){ //層數:1, 2, 3, 4, 5 for(int j=1; j<=i; j++){ //輸入*左邊的(n-1)個空白 printf(" "); } for(int j=1; j<=i; j++){ //每層中的*數有i個 printf("*"); } printf("\n"); } for(int i=1; i<=5; i++){ //層數:1, 2, 3, 4, 5 for(int j=1; j<=i; j++){ //輸入*左邊的(n-1)個空白 printf(" "); } for(int j=1; j<=(2*-1);j++){ //每層中的*數有2*i-1個 printf("*"); } printf("\n"); } return 0; } ``` 11. 顯示1∼50的質數 https://zh.m.wikipedia.org/zh-hant/%E8%B4%A8%E6%95%B0 ```cpp=1 /**************************************************** ** 顯示1∼50的質數 *****************************************************/ #include <iostream> using namespace std; int main() { for(int val=2; val<=50; val++){ //大於2的偶數,不用判斷,繼續執行下一個迴圈的值 if(val>2 && val%2==0) continue; //2是唯一的偶數質數 if(val==2) printf("%d",val); else{ //3以上的奇數 int flag=1; //假設val是質數 for(int j=3; j<val; j++){ //j:從3~val=1來測試val是否為質數 if(val%j==0){ //被j整除 flag=0; //val不是質數 break; //跳離測試的迴圈 } } //如果val是質數,顯示 if(flag) printf("%d ",val); } } return 0; } ``` 12. 計算使用者輸入數字的階乘值 ```cpp=1 /**************************************************** **計算使用者輸入數字的階乘值 *****************************************************/ #include <iostream> using namespace std; int main() { int n; scanf("%d", &n); unsigned int fact=1; //1!=1,只能存到16!的值,17!以上就無法計算 for(int i=2; i<=n; i++){ fact *= i; } printf("%d!=%d\n", n, fact); return 0; } ``` ![](https://i.imgur.com/IF6Ie2c.png) ![](https://i.imgur.com/eVHdBvK.png) ![](https://i.imgur.com/H0PXKHh.jpg) ![](https://i.imgur.com/U2J8KcW.png) ![](https://i.imgur.com/fTotd5w.png) ![](https://i.imgur.com/zqRNZvW.png) ![](https://i.imgur.com/h7rmkLj.png) ![](https://i.imgur.com/EXdeVG8.png) ![](https://i.imgur.com/ju2rttl.png) ![](https://i.imgur.com/fjXvD7K.png)