Introduction to the C Programming Language 重覆敘述(for,while,break,continue) 適合重複性的計算或判斷 若傋註 C: 參見 “C語言教學手冊”,洪維恩著 yrjean:“結構化程式語言投影片”, 簡永仁老師
選擇性結構(if-else statements) if (expr) { Statement1; } else Statement2; Statement3; 根據判斷條件的結果為真或假來執行Statement 1或2,最後都會再回到Statement3繼續執行. Statement1 expr true false Statement2 Statement3 Statement1
重複性結構 true false 根據判斷條件的成立與否,決定程式段落的執行次數,這個程式段落就稱為迴圈的主體,如右圖的虛線範圍。 重覆敘述(iteration statement ), 包括 while 、 for 及do while(下學期會教)敘述。 重複性敘述的流程圖: true expr Statement1 false Statement2
重覆敘述--for迴圈(for loop) for ( expr1 ; expr2 ; expr3 ) { statements; } next-statements; 此處不可加分號 運算式 1(expr1 ) 為迴圈控制變數的初值。 運算式 2 (expr 2) 為迴圈是否重覆執行的條件。 運算式 3 (expr 3) 為迴圈控制變數的增減值。 以上3種運算式若有兩個以上的參數請以逗號隔開。
重覆敘述--for迴圈(for loop)---範例2 範例2 流程圖: 輸入一個正整數N,計算1累加至N的總和,並輸出其總和 開始 輸入 正整數 N Sum = 0 I = 1 流程圖符號說明 false 起始符號/結束符號 I = I + 1 I <= N? 處理符號 true Sum = Sum +I 印出累加值 輸入/輸出方塊 流向符號 結束 判斷符號
重覆敘述--for迴圈(for loop)---範例2 範例2 程式碼: #include<stdio.h> int main() { int i ,N , sum=0; printf("Please input an integer: "); /*由鍵盤輸入數值N*/ scanf("%d", &N ); for (i=1; i<=N; i++) sum= sum+i; /*計算1+2+…+N*/ } printf("1+2+…+%d = %d \n",N, sum); /*印出sum的值*/ system("pause"); return 0; Ch3_1_2.c
九九乘法表—巢狀for迴圈(nested for loop)---範例3 #include<stdio.h> int main() { int i, j; for (i=1; i<=9; i++) /*外層迴圈*/ for (j=1; j<=9; j++) /*內層迴圈*/ printf("%d*%d=%2d ", i, j, i*j); } system(“pause”); return 0; } 開始 i為外層迴圈的控制變數 j為內層迴圈的控制變數 i=1 i=i+1 false j<=9 true 印出i*j j=j+1 true i<=9 j=1 false 結束
重覆敘述--for迴圈(for loop)---範例3 範例5 執行結果: 若要將表格排列如下,應如何修改? 1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 2*1= 2 2*2= 4 2*3 = 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1= 3 3*2= 6 3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1= 4 4*2= 8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4* 8=32 4*9=36 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1= 7 7*2=14 7*3=21 7 *4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6= 48 8*7=56 8*8=64 8*9=72 9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
重覆敘述—巢狀for迴圈(nested for loop)---範例4 #include<stdio.h> int main() { int i,k; for(i=1;i<=5;i++) for(k=1;k<=i;k++) printf(“%d”,k); } printf("\n"); system("pause"); return 0; 執行結果: 練習:如果想改成倒三角形的話,程式要怎麼改呢?
重覆敘述--while loop while loop的語法格式如下: 適用於事先不確定迴圈需要執行多少次. 依靠一個條件運算式來判斷是否停止迴圈. 迴圈內的statement必須能改變條件運算式的結果才能離開迴圈,否則也會變成無窮迴圈. 設定迴圈初值; while ( expr ) { statements; } next-statements; 條件運算式 迴圈主體; 設定增減量;
重覆敘述(while loop) false expr true Statements (迴圈主體, 設定值的增減) next-statements
重覆敘述--while迴圈(while loop)範例1 範例1 流程圖: 求兩數的最大公因數 開始 輸入M 和N X=M Y=N false 輸出X即為 最大公因數 結束 X!=Y? true true X>Y? X=X-Y false true X<Y? Y=Y-X false
重覆敘述--while迴圈(while loop)---範例1 #include <stdio.h> int main(void) { int M, N, X, Y; printf("輸入兩個正數值M,N \n"); scanf("%d %d",&M, &N); /*由鍵盤輸入數值*/ X=M; Y=N; while(X != Y) { if(X > Y) X=X-Y; if(X < Y) Y=Y-X; } printf("M和N的最大公因數=%d ",X); printf("\n"); system("pause"); return 0; } Ch3_2_1.c
重覆敘述--while迴圈(while loop)範例2 /* Copy the input to screen */ #include<stdio.h> #include<stdlib.h> int main() { char ch; while ( ( ch = getche() ) != '\r' ) /*判斷輸入的字元是不是換行符號*/ putchar(ch); /*印出使用者輸入值*/ printf("\n"); } system("pause"); return 0; 執行結果: 輸入g與x,再按下enter鍵
do-while 至少會執行一次;while 可能一次都沒有執行。 重覆敘述(do-while loop) do-while 則是先執行敘述(statements)後, 再判斷運算式(expr)之值是否為真, 再決定是否重覆執行敘述。 do { statements; } while ( expr ); statements true do-while 至少會執行一次;while 可能一次都沒有執行。 C,hu do-while 與 while不同處在於while先判斷運算式是否為真, 再決定是否執行敘述, 而do-while 則是先執行敘述(statements)後, 再判斷運算式(expr)之值是否為真, 再決定是否重覆執行敘述。 do-while 至少會執行一次;while 可能一次都沒有執行。 和 while迴圈一樣要注意無窌迴圈的問題。 expr false
重覆敘述-- 重覆敘述(do-while loop)範例1 #include<stdio.h> /*sum*/ main() { int a, sump=0; do printf("請輸入一個整數a : "); scanf("%d", &a); if (a>0) /*若a為正整數則累績到sump*/ sump=sump+a; } while (a!=0); /*會重覆輸入,直到a輸入為0才結束*/ printf("總和= %d\n", sump); system("pause"); } C dowhilesum.c 從鍵盤輸入一個整數a,若a 為正整數則累績到sump, 再重覆輸入, 直到a輸入為0才結束, 然後, 輸出印出sump的值(總和)
重覆敘述-- 重覆敘述(do-while loop)範例1執行結果 執行結果: 請輸入一個整數a : 1 請輸入一個整數a : 2 請輸入一個整數a : 3 請輸入一個整數a : 4 請輸入一個整數a : 5 請輸入一個整數a : 0 總和= 15
重覆敘述-- 重覆敘述(do-while loop)範例2 從鍵盤輸入一個整數a,若a為正整數則累績到sumP,再重覆輸入,若a為負整數則累績到sumN,再重覆輸入直到a輸入為0才結束, 然後, 輸出印出sumP 以及sumN 的值(總和) 因為此題目是要先輸入一整數,再來作累加的動作,所以非常適合使用do- while #include<stdlib.h> main() { int a, sumP=0, sumN=0; do { printf("請輸入一個整數a : "); scanf("%d", &a); if (a>0) sumP=sumP+a; else sumN=sumN+a; } while (a!=0); printf("正數總和= %d\n", sumP); printf("負數總和= %d\n", sumN); system("pause"); }
重覆敘述—for, while與do while的比較 for (i=1;i<=5;i++,j++) { sum=sum+i*j; } i=1; while(i<=5) { i++; j++ ; sum=sum+i*j; } i=1; do { i++; j++ ; sum=sum+i*j; } while (i<=5); hu
無窮迴圈 for( i=1; ; i++) { statement; } while(1) { statement; } do { 如果迴圈的條件永遠為真,則會形成無窮迴圈,程式將無法停止,若要強制中斷可按下Ctrl + C鍵強迫中止. for( i=1; ; i++) { statement; } while(1) { statement; } do { statement; }while(1);
重覆敘述--for迴圈(無窮迴圈) ----範例1 範例6:無窮for迴路 (for loop with forever loop) #include<stdio.h> int main() { int i; int count = 1; for ( ; ; ) printf("\1: guess number here: "); scanf("%d",&i); if ( i == 5 ) /*表示當i之值全等於5時,就會離開此迴圈*/ break; count++; /*若i之值不等於5,則繼續將count變數加1*/ } printf("\2: You take %d times to get it.\n",count); system(“pause”); return 0; } 無窮迴圈,此種寫法要小心確認終止條件一定會成立,否則程式會一直執行
重覆敘述--for迴圈(for loop) ---範例1 範例6 執行結果: ☺: guess number here: 1 ☺: guess number here: 2 ☺: guess number here: 3 ☺: guess number here: 19 ☺: guess number here: 5 ☻: You take 5 times to get it.
重覆敘述--while迴圈(while loop)範例2 範例2:while(1)與switch的應用 #include<stdio.h> #include<stdlib.h> int main() { int i; while(1) { /*無論如何一定要執行此迴圈*/ printf("Enter 1-4 for exit==>"); scanf("%d",&i); switch(i) case 1: printf(" Excellent!\n"); break; case 2: printf(" Good!\n"); case 3: printf(" Fair!\n"); break; case 4: printf(" Bye!\n"); default: /*若輸入之值不在1~4*/ printf(" Illegal number try again!\n"); } if(i==4) /*當i之值全等於4時,才離 開此迴圈*/ system("pause"); return 0;
重覆敘述--while迴圈(while loop)範例2 執行結果 執行結果: Enter 1-4 for exit==>1 Excellent! Enter 1-4 for exit==>2 Good! Enter 1-4 for exit==>3 Fair! Enter 1-4 for exit==>4 Bye!
重覆敘述(Break and Continue比較) 不同點 終止do, for, switch, while,等敘述在break 那一層次的執行工作 若在巢狀迴圈(nested loop)中, break只中止該層次的執行, 而繼績執行下一迴圈 若要中止整個巢狀迴圈可使用return 忽略接在continue後面的敘述,直接返回到該層迴圈的條件運算式,並判斷是否繼續執行迴圈. 相同點 可用在for、while、do-while
Break與Continue---範例1 #include<stdio.h> else #include<stdlib.h> int main() { char ch; int ans,keyin,num1,num2; while(1) /*外層的while迴圈*/ printf("\n請輸入兩個整數:\n"); scanf("%d %d",&num1,&num2); ans=num1*num2; while(1) /*內層的while迴圈*/ printf("%d * %d =",num1,num2); scanf("%d",&keyin); if(keyin==ans) printf("答對了\n"); break; /*若答對就離開內層的迴圈,跳至接在內層迴圈後的程式碼*/ } else { printf("答錯了\n"); continue; /*若答錯就回到內層的迴圈判斷條件*/ } printf("\n是否繼續執行:"); ch=getche(); if(ch==‘n’) /*若輸入n表示要離開外層迴圈,跳至接在外層迴圈後的程式碼*/ break; printf("\n"); system("pause"); return 0;
Break與Continue---範例1 執行結果: 使用者輸入之值
重覆敘述--(continue跳躍敘述)範例2 #include<stdlib.h> main() { int f=1,n; printf("請輸入一個正整數n : "); scanf("%d",&n); while (n>0) if ((n%2)==0) {n--; continue;} /*n為偶數則忽略 f=f*n; */ f=f*n; /*f是奇數連乘積 1*3*5*...*/ n--; } printf("f=%d\n",f); /*印出f值*/ system("pause"); } 請自行練習將此範例改以do while或for迴圈來撰寫 C continue.c 從鍵盤輸入一個正整數n , 計算 f=1*3*5*7…*n 若 n 為偶數, 執行n--, 跳到while敘述,略過第11, 12 行的敘述 若 n 為奇數, 執行第11, 12行的敘述。