300 likes | 451 Views
Introduction to the C Programming Language. 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷. false. expr. true. Statement2. Statement1. Statement3. 選擇性結構 (if-else statements). if-else 敘述的語法格式如下:. if-else 敘述的流程圖:. 根據判斷條件的結果為真或假來執行 Statement 1 或 2, 最後都會再回到 Statement3 繼續執行. if ( expr )
E N D
Introduction to the C Programming Language 重覆敘述(for,while,break,continue) 適合重複性的計算或判斷
false expr true Statement2 Statement1 Statement3 選擇性結構(if-else statements) • if-else敘述的語法格式如下: • if-else敘述的流程圖: 根據判斷條件的結果為真或假來執行Statement 1或2,最後都會再回到Statement3繼續執行. if (expr) { Statement1; } else { Statement2; } Statement3; Statement1
重複性結構 • 根據判斷條件的成立與否,決定程式段落的執行次數,這個程式段落就稱為迴圈的主體,如右圖的虛線範圍。 • 重覆敘述(iteration statement ), 包括 while 、for 及do while(下學期會教)敘述。 • 重複性敘述的流程圖: true expr Statement1 false Statement2
重覆敘述--for迴圈(for loop) for ( expr1 ; expr2 ; expr3 ) { statements; } next-statements; • for 迴圈的語法格式如下: 此處不可加分號 • 運算式 1(expr1 ) 為迴圈控制變數的初值。 • 運算式 2 (expr 2) 為迴圈是否重覆執行的條件。 • 運算式 3 (expr 3) 為迴圈控制變數的增減值。 • 以上3種運算式若有兩個以上的參數請以逗號隔開。
重覆敘述--for迴圈(for loop)---範例1 • #include<stdio.h> • 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的總和,並輸出其總和 /*定義i的初值為1*/ /*判斷i的值是否小於等於100*/ /*如果是的話就作sum+i,並且將i作加1的動作*/ Ch3_1_1.c
流程圖符號說明 重覆敘述--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 • #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; • } 範例2 程式碼: Ch3_1_2.c
重覆敘述--for迴圈(for loop)---範例3 範例3:流程圖 輸入5個實數,計算並輸出其平均值 N表示輸入實數的個數 開始 I =1 Sum = 0.0 false I = N? true I = I+1 輸入實數Data Avg = Sum / 5 Sum=Sum+Data 輸出 Avg 結束
重覆敘述--for迴圈(for loop)---範例3 • #include<stdio.h> • 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
#include<stdio.h> 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 重覆敘述--for迴圈(for loop)---範例4 範例4: f(n)=n*(n-1)*(n-2)*(n-3)…*3*2*1 Ch3_1_4.c
#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; } 九九乘法表—巢狀for迴圈(nested for loop)---範例5 開始 i為外層迴圈的控制變數 j為內層迴圈的控制變數 i=1 i=i+1 false true j<=9 印出i*j j=j+1 true i<=9 j=1 false 結束
重覆敘述--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
#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; } 執行結果: 練習:如果想改成倒三角形的話,程式要怎麼改呢? 重覆敘述—巢狀for迴圈(nested for loop)---範例6
重覆敘述--for迴圈(for loop)---範例7 • #include<stdio.h> • 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;} 練習1:計算字元A,B,C出現的次數 Ch3_1_7.c
重覆敘述--whileloop 設定迴圈初值; while ( expr) { statements; } next-statements; • 適用於事先不確定迴圈需要執行多少次. • while loop的語法格式如下: • 依靠一個條件運算式來判斷是否停止迴圈. • 迴圈內的statement必須能改變條件運算式的結果才能離開迴圈,否則也會變成無窮迴圈. 條件運算式 迴圈主體; 設定增減量;
while loop的流程圖 重覆敘述(while loop) expr false true Statements (迴圈主體, 設定值的增減) next-statements
重覆敘述--while迴圈(while loop)範例1 開始 範例1 流程圖: 求兩數的最大公因數 輸入M 和N X=M Y=N false 輸出X即為 最大公因數 結束 X!=Y? true true X=X-Y X>Y? false true Y=Y-X X<Y? false
#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; } 重覆敘述--while迴圈(while loop)---範例1 Ch3_2_1.c
/* 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鍵 重覆敘述--while迴圈(while loop)範例3
重覆敘述--while迴圈(whileloop)範例4 • 假設有一盒子中, 裝了1024顆雞蛋, 若每次拿取盒中一半的雞蛋, 請問拿取幾次後, 盒中只剩一顆雞蛋? • /*the last one*/ • main() • { • int n=1024, takes=0; • while (n>1) • { • n=n/2; • takes++; • } • printf("拿 %d 次後盒中只剩下一顆雞蛋\n", takes); • }
#include<stdio.h> 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; } 重覆敘述--while迴圈(whileloop)範例5 某人到書局買一枝筆a元, 拿一百元鈔票給老板,請問老板該找他幾個十元, 幾個五元,幾個一元?
重覆敘述—for與while的比較 for (i=1;i<=5;i++,j++) { sum=sum+i*j; } i=1; while(i<=5) { j++ ;i++; sum=sum+i*j; }
for( ; ; ) { statement; } while(1) { statement; } 無窮迴圈 如果迴圈的條件永遠為真,則會形成無窮迴圈,程式將無法停止,若要強制中斷可按下Ctrl + C鍵強迫中止.
重覆敘述--for迴圈(無窮迴圈) ----範例8 範例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) ---範例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.
範例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"); 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; } 重覆敘述--while迴圈(while loop)範例9
重覆敘述--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!
#include<stdio.h> #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---範例10
Break與Continue---範例10 • 執行結果: 使用者輸入之值