Post on 20-Jan-2016
description
transcript
CSIM, PU C Language
Introduction to the C Programming Language
重覆敘述 (for,while,break,continue)
適合重複性的計算或判斷
2CSIM, PU C Language
選擇性結構 (if-else statements)
if-else 敘述的語法格式如下:
Statement1
if-else 敘述的流程圖:
if (expr)
{
Statement1;
}
else
{
Statement2;
}
Statement3;
if (expr)
{
Statement1;
}
else
{
Statement2;
}
Statement3;
Statement1
expr
true
false
Statement2
Statement3
根據判斷條件的結果為真或假來執行Statement 1 或 2,
最後都會再回到 Statement3 繼續執行 .
3CSIM, PU C Language
重複性結構 根據判斷條件的成立與否
,決定程式段落的執行次數,這個程式段落就稱為迴圈的主體,如右圖的虛線範圍。
重覆敘述 (iteration statement ), 包括 while 、 for 及 do while( 下學期會教 )敘述。
Statement2
exprtrue
false
Statement1
重複性敘述的流程圖:
4CSIM, PU C Language
重覆敘述 --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種運算式若有兩個以上的參數請以逗號隔開。
此處不可加分號
5CSIM, PU C Language
重覆敘述 --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 的總和,並輸出其總和
Ch3_1_1.c
/* 定義 i 的初值為 1*/
/* 判斷 i 的值是否小於等於 100*/
/* 如果是的話就作 sum+i, 並且將 i 作加 1 的動作 */
6CSIM, PU C Language
重覆敘述 --for 迴圈 (for loop)--- 範例 2
範例 2 流程圖:
輸入一個正整數 N,計算 1累加至 N的總和,並輸出其總和
流程圖符號說明
處理符號
流向符號
判斷符號
起始符號 / 結束符號
輸入 / 輸出方塊
開始
I <= N?
Sum = Sum +I
結束
false
Sum = 0 I = 1
輸入 正整數 N
true
I = I + 1
印出累加值
7CSIM, PU C Language
重覆敘述 --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; }
Ch3_1_2.c
範例 2 程式碼:
8CSIM, PU C Language
重覆敘述 --for 迴圈 (for loop)--- 範例 3
範例 3:流程圖
輸入 5個實數,計算並輸出其平均值N表示輸入實數的個數
開始
I =1Sum = 0.0
輸入實數 Data
結束
I = N?
Avg = Sum / 5
輸出 Avg
true
false
I = I+1
Sum=Sum+Data
9CSIM, PU C Language
重覆敘述 --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
10CSIM, PU C Language
重覆敘述 --for 迴圈 (for loop)--- 範例 4
#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
範例 4: f(n)=n*(n-1)*(n-2)*(n-3)…*3*2*1
Ch3_1_4.c
11CSIM, PU C Language
九九乘法表—巢狀 for 迴圈 (nested for loop)--- 範例 5
#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
j=j+1
j=1
印出 i*j
i<=9
j<=9
false
true
truefalse
12CSIM, PU C Language
重覆敘述 --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
13CSIM, PU C Language
重覆敘述—巢狀 for 迴圈 (nested for loop)--- 範例6
#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; }
執行結果 :
練習 : 如果想改成倒三角形的話 ,程式要怎麼改呢 ?
14CSIM, PU C Language
重覆敘述 --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;}
Ch3_1_7.c
練習 1:計算字元 A,B,C 出現的次數
15CSIM, PU C Language
重覆敘述 --while loop
適用於事先不確定迴圈需要執行多少次 .while loop 的語法格式如下:
依靠一個條件運算式來判斷是否停止迴圈 .迴圈內的 statement 必須能改變條件運算式的結果才能離開迴圈 ,否則也會變成無窮迴圈 .
設定迴圈初值 ;
while ( expr )
{
statements;
}
next-statements;
設定迴圈初值 ;
while ( expr )
{
statements;
}
next-statements;
迴圈主體 ;設定增減量 ;
條件運算式
16CSIM, PU C Language
重覆敘述 (while loop)
expr
Statements( 迴圈主體 ,
設定值的增減 )
true
false
next-statements
while loop 的流程圖
17CSIM, PU C Language
重覆敘述 --while 迴圈 (while loop) 範例 1
範例 1 流程圖:
求兩數的最大公因數
開始
輸入 M和 N
X>Y?
X=MY=N
X<Y?
X!=Y?輸出 X 即為最大公因數
X=X-Y
Y=Y-X
true
true
true
false
false
false結束
18CSIM, PU C Language
重覆敘述 --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
19CSIM, PU C Language
重覆敘述 --while 迴圈 (while loop) 範例 3 /* 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 鍵
20CSIM, PU C Language
重覆敘述 --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); }
21CSIM, PU C Language
重覆敘述 --while 迴圈 (while loop) 範例 5
#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; }
某人到書局買一枝筆 a 元 , 拿一百元鈔票給老板 , 請問老板該找他幾個十元 , 幾個五元 , 幾個一元 ?
22CSIM, PU C Language
重覆敘述— for 與 while 的比較for (i=1;i<=5;i++,j++)
{
sum=sum+i*j;
}
i=1;
while(i<=5)
{ j++ ;i++;
sum=sum+i*j;
}
23CSIM, PU C Language
無窮迴圈
for( ; ; ){ statement;}
while(1){ statement;}
如果迴圈的條件永遠為真,則會形成無窮迴圈,程式將無法停止,若要強制中斷可按下 Ctrl + C 鍵強迫中止 .
24CSIM, PU C Language
重覆敘述 --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; }
無窮迴圈 , 此種寫法要小心確認終止條件一定會成立 , 否則程式會一直執行
25CSIM, PU C Language
重覆敘述 --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.
26CSIM, PU C Language
重覆敘述 --while 迴圈 (while loop) 範例 9 範例 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; }
27CSIM, PU C Language
重覆敘述 --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!
28CSIM, PU C Language
重覆敘述 (Break and Continue 比較 )
break Continue不同點 跳離迴圈 , 繼續執行接在
迴圈後面的敘述 .忽略接在 continue 後面的敘述 , 直接返回到迴圈的條件運算式 , 並判斷是否繼續執行迴圈 .
相同點 可用在 for 、 while 、 do-while
可用在 for 、 while 、 do-while
29CSIM, PU C Language
Break 與 Continue--- 範例 10 #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; }
30CSIM, PU C Language
Break 與 Continue--- 範例 10
執行結果 :
使用者輸入之值