CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷
CSIM, PU C Language 2 選擇性結構 (if-else statements) if-else 敘述的語法格式如下: Statement1 if-else 敘述的流程圖: if (expr) { Statement1; } else { Statement2; } Statement3; Statement1 expr true false Statement2 Statement3 根據判斷條件的結 果為真或假來執行 Statement 1 或 2, 最 後都會再回到 Statement3 繼續執 行.
CSIM, PU C Language 3 重複性結構 根據判斷條件的成立與否 ,決定程式段落的執行次 數,這個程式段落就稱為 迴圈的主體,如右圖的虛 線範圍。 重覆敘述 (iteration statement ), 包括 while 、 for 及 do while( 下學期會教 ) 敘述。 Statement2 expr true false Statement1 重複性敘述的流程圖:
CSIM, PU C Language 4 重覆敘述 --for 迴圈 (for loop) for 迴圈的語法格式如下: for ( expr1 ; expr2 ; expr3 ) { statements; } next-statements; for ( expr1 ; expr2 ; expr3 ) { statements; } next-statements; 運算式 1(expr1 ) 為迴圈控制變數的初值。 運算式 2 (expr 2) 為迴圈是否重覆執行的條件。 運算式 3 (expr 3) 為迴圈控制變數的增減值。 以上 3 種運算式若有兩個以上的參數請以逗號隔開。 此處不可加分號
CSIM, PU C Language 5 重覆敘述 --for 迴圈 (for loop)--- 範例 1 #include main() { int i, sum=0; /* 宣告變數 i 、 sum 為整數 */ for (i=1;i<=100;i++) { sum= sum+ i; } printf(“sum = %d \n”, sum); /* 迴圈結束時,印出 sum 的值 */ } 範例 1 :計算 1 累加至 100 的總和,並輸出其總和 Ch3_1_1.c /* 定義 i 的初值為 1 */ /* 判斷 i 的值是否小於等於 100 */ /* 如果是的話就作 sum+i, 並且將 i 作加 1 的動作 */
CSIM, PU C Language 6 重覆敘述 --for 迴圈 (for loop)--- 範例 2 範例 2 流程圖: 輸入一個正整數 N ,計算 1 累加至 N 的總和,並輸出其總和 流程圖符號說明 處理符號 流向符號 判斷符號 起始符號 / 結束符號 輸入 / 輸出方塊 開始 I <= N? Sum = Sum +I 結束 false Sum = 0 I = 1 輸入 正整數 N true I = I + 1 印出累加值
CSIM, PU C Language 7 重覆敘述 --for 迴圈 (for loop)--- 範例 2 #include 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 範例 2 程式碼:
CSIM, PU C Language 8 重覆敘述 --for 迴圈 (for loop)--- 範例 3 範例 3 :流程圖 輸入 5 個實數,計算並輸出其平均值 N 表示輸入實數的個數 開始 I =1 Sum = 0.0 輸入實數 Data 結束 I = N ? Avg = Sum / 5 輸出 Avg true false I = I+1 Sum=Sum+Data
CSIM, PU C Language 9 重覆敘述 --for 迴圈 (for loop)--- 範例 3 #include int main() { int i; double avg,sum; float Data; for(i=1,sum=0; i<=5; i++) { printf(" 請輸入實數 : "); scanf("%f", &Data); sum = sum+Data; } avg = sum/5.0; printf(“ 平均值 =%.3f\n”,sum); /*.3f 表示只印至小數點第三位之值 */ system("pause"); return 0; } 範例 3 : 程式碼 Ch3_1_3.c
CSIM, PU C Language 10 重覆敘述 --for 迴圈 (for loop)--- 範例 4 #include int main() { int i, n, f; printf(" 請輸入一個正整數 n : "); scanf("%d", &n); f=1; for (i=n; i>1; i--) { f=f*i; printf(" 迴圈變數 i 值 = %d ",i); printf(" 連乘積 f 值 = %d\n", f); } system("pause"); return 0; } 執行結果 : 請輸入一個正整數 n : 4 迴圈變數 i 值 = 4 連乘積 f 值 = 4 迴圈變數 i 值 = 3 連乘積 f 值 = 12 迴圈變數 i 值 = 2 連乘積 f 值 = 24 範例 4 : f(n)=n*(n-1)*(n-2)*(n-3)…*3*2*1 Ch3_1_4.c
CSIM, PU C Language 11 九九乘法表 — 巢狀 for 迴圈 (nested for loop)--- 範例 5 #include 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 j=j+1 j=1 印出 i*j i<=9 j<=9 false true false
CSIM, PU C Language 12 重覆敘述 --for 迴圈 (for loop)--- 範例 5 範例 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
CSIM, PU C Language 13 重覆敘述 — 巢狀 for 迴圈 (nested for loop)--- 範例 6 #include 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; } 執行結果 : 練習 : 如果想改成倒三角形的話, 程 式要怎麼改呢 ?
CSIM, PU C Language 14 重覆敘述 --for 迴圈 (for loop)--- 範例 7 #include int main() { char ch; int i, sumA=0, sumB=0, sumC=0; for (i=0; i<10; i++) { printf(“ 請輸入一個字元 ch : ”); /* 讓使用者可一再輸入字元, 直到滿足 for 迴圈或 break 條件 */ scanf("%c",&ch); switch (ch) { case 'A' : sumA++; break; case 'B' : sumB++; break; case 'C' : sumC++; break; } fflush(stdin); if (!(ch>='A'&& ch<='C')) break; /* 當使用者輸入之值不在 A~C 的範圍時就會跳離開迴圈 */ } printf("\nA 出現 %d 次 \n", sumA); printf("B 出現 %d 次 \n", sumB); printf("C 出現 %d 次 \n", sumC); system("pause"); return 0;} Ch3_1_7.c 練習 1 :計算字元 A,B,C 出現的次數
CSIM, PU C Language 15 重覆敘述 --while loop 適用於事先不確定迴圈需要執行多少次. while loop 的語法格式如下: 依靠一個條件運算式來判斷是否停止迴圈. 迴圈內的 statement 必須能改變 條件運算式的結果才能離開迴圈, 否 則也會變成無窮迴圈. 設定迴圈初值 ; while ( expr ) { statements; } next-statements; 設定迴圈初值 ; while ( expr ) { statements; } next-statements; 迴圈主體 ; 設定增減量 ; 條件運算式
CSIM, PU C Language 16 重覆敘述 (while loop) expr Statements ( 迴圈主體, 設定值的增減 ) true false next-statements while loop 的流程圖
CSIM, PU C Language 17 重覆敘述 --while 迴圈 (while loop) 範例 1 範例 1 流程圖: 求兩數的最大公因數 開始 輸入 M 和N和N X>Y? X=M Y=N X<Y? X!=Y? 輸出 X 即為 最大公因數 X=X-Y Y=Y-X true false 結束
CSIM, PU C Language 18 重覆敘述 --while 迴圈 (while loop)--- 範例 1 #include 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
CSIM, PU C Language 19 重覆敘述 --while 迴圈 (while loop) 範例 3 /* Copy the input to screen */ #include int main() { char ch; while ( ( ch = getche() ) != '\r' ) { /* 判斷輸入的字元是不是換行符號 */ putchar(ch); printf("\n"); } system("pause"); return 0; } 執行結果 : 輸入 g 與 x, 再按下 enter 鍵
CSIM, PU C Language 20 重覆敘述 --while 迴圈 (while loop) 範例 4 假設有一盒子中, 裝了 1024 顆雞蛋, 若每次拿取盒中一半的雞蛋, 請問拿取 幾次後, 盒中只剩一顆雞蛋 ? /*the last one*/ main() { int n=1024, takes=0; while (n>1) { n=n/2; takes++; } printf(" 拿 %d 次後盒中只剩下一顆雞蛋 \n", takes); }
CSIM, PU C Language 21 重覆敘述 --while 迴圈 (while loop) 範例 5 #include int main() { int a, b, n10=0, n5=0, n1=0; printf(" 請輸入鉛筆盒金額 a 元 : "); scanf("%d", &a); b=100-a; n10=0; while(b>10) /* 可換成多少個 10 元 */ { b=b-10; n10++; } if (b>5) /* 可換成多少個 5 元 */ { b=b-5; n5++; } else /* 可換成多少個 1 元 */ n5=0; n1=b; printf(" 鉛筆盒金額 %d 元 \n", a); printf(" 給 100 元,退還 %d 元 \n", 100-a); printf(" 10 元 %d 個 \n", n10); printf(" 5 元 %d 個 \n", n5); printf(" 1 元 %d 個 \n", n1); system("pause"); return 0; } 某人到書局買一枝筆 a 元, 拿一百元鈔票給老板, 請問老板該找他幾個 十元, 幾個五元, 幾個一元 ?
CSIM, PU C Language 22 重覆敘述 —for 與 while 的比較 for (i=1;i<=5;i++,j++) { sum=sum+i*j; } i=1; while(i<=5) { j++ ;i++; sum=sum+i*j; }
CSIM, PU C Language 23 無窮迴圈 for( ; ; ) { statement; } while(1) { statement; } 如果迴圈的條件永遠為真,則會形成無窮迴圈,程式將無法停止,若要強制中 斷可按下 Ctrl + C 鍵強迫中止.
CSIM, PU C Language 24 重覆敘述 --for 迴圈 ( 無窮迴圈 ) ---- 範例 8 範例 6 :無窮 for 迴路 (for loop with forever loop) #include 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; } 無窮迴圈, 此種寫法要小心 確認終止條件一定會成立, 否則程式會一直執行
CSIM, PU C Language 25 重覆敘述 --for 迴圈 (for loop) --- 範例 8 範例 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.
CSIM, PU C Language 26 重覆敘述 --while 迴圈 (while loop) 範例 9 範例 2:while(1) 與 switch 的應用 #include 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"); break; case 3: printf(" Fair!\n"); break; case 4: printf(" Bye!\n"); break; default: /* 若輸入之值不在 1~4*/ printf(" Illegal number try again!\n"); } if(i==4) /* 當 i 之值全等於 4 時, 才離 開此迴圈 */ break; } system("pause"); return 0; }
CSIM, PU C Language 27 重覆敘述 --while 迴圈 (while loop) 範例 9 執行結果 執行結果 : 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!
CSIM, PU C Language 28 重覆敘述 (Break and Continue 比較 ) breakContinue 不同點跳離迴圈, 繼續執行接在迴 圈後面的敘述. 忽略接在 continue 後面的敘 述, 直接返回到迴圈的條件 運算式, 並判斷是否繼續執 行迴圈. 相同點可用在 for 、 while 、 do- while
CSIM, PU C Language 29 Break 與 Continue--- 範例 10 #include 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; }}
CSIM, PU C Language 30 Break 與 Continue--- 範例 10 執行結果 : 使用者輸入之值