You are on page 1of 28

程式流程控制

• 迴圈
– for 敘述
– 關係運算子與邏輯運算子
– while 敘述
– do while 敘述
• 條件式結構 ( 決策判斷 )
– if 敘述
– Switch 敘述
– break
– goto
for 敘述
• for 迴圈用以進行重複性之計算
• 單迴圈基本型式
– 單迴圈 : 僅有一參數遞增減

Method 1
int i;
for (i=0;i<10;i++)
{
}

( 起始值 ; 終止條件 ; 增
量)
運算式置於 { } 內
• 單迴圈各種寫法 ( 以下省略變數宣告 )

Method 2: Correct Method 2: Wrong


for(j=0;j<n;j++) for(j=0;i<n;j++) { fprintf(fp,”%d”,j+n); }
{ fprintf(fp,”%d”,j+n); }
變數錯誤 , 應為 j

Method 3: Correct
for(j=0;j<n;j++) 不加 {} Method 3: Correct
fprintf(fp,”%d”,j+n); for(j=0;j<n;j++) fprintf(fp,”%d”,j+n);

Method 4: Correct - VC++ 以” ;” 作為每一行指令之結束


for(j=0;j<n;j++) { - { } 將一些指令組合成群組 , 迴圈中每
fprintf(fp,”%d”,j+n); 次自變數改變 , 該群組中指令依序執行
fprintf(fp,”%d”,j+n+1); 一次
} - {} 前後均不加” ;”
Method 3: Wrong Method 3: Wrong
for(j=0;j<n;j++); fprintf(fp,”%d”,j+n); for(j=0;j<n;j++) fprintf(fp,”%d”,j+n)

不該放” ;” 少放了” ;”

Method 4: Wrong Method 4: Wrong


for(j=0;j<n;j++) { for(j=0;j<n;j++)
fprintf(fp,”%d”,j+n); fprintf(fp,”%d”,j+n);
fprintf(fp,”%d”,j+n+1); fprintf(fp,”%d”,j+n+1);

少放了” }” for 後面有兩行指令成一群組 ,


若如此寫 , 則第一個 fprintf 會執行
N 次 , 第二個 fprintf 只執行一次 .
• 雙迴圈基本型式
– 雙迴圈 : 迴圈中有兩個參數遞增減
雙迴圈 ( 兩個 for 組成 執行邏輯 :
Method 5: Correct 內外回圈 ) i=0, j=0
int i,sum,sun; j=1
sum=sun=0; 初始值設定 …
for (i=0;i<10;i++) j=9
{ 可在 for 迴圈內宣
i=1, j=0
for (int j=0;j<10;j++) 告變數 , 該變數壽 j=1
{ 命僅止於該迴圈內

sum=sum+j;
sun+=i; j=9
} i=2, j=0
} …

i=9, j=9
故共執行 9x9 次
• 雙迴圈錯誤語法

Method 5: Wrong
int i,sum,sun;
Method 5: Wrong
sum=sun=0;
int i;
該行後面不能放” ;” for (i=0;i<10;i++)
for (i=0;i<10;i++);
{
for (int j=0;j<10;j++){ j 未宣告
sum 初始值未指定 for (int j=0;j<10;j++)
sum=sum+j;
{
sun+=i; sun 初始值未指定 j=j+1; j 數值將錯亂
}
sum=sum+j;
sun+=i;
}
}
• 雙迴圈其它寫法

Method 6: Correct Method 7: Correct


int i,sum,sun; int i,sum,sun;
sum=sun=0; sum=sun=0;
for (i=0;i<10;i++){ 左 { 置於 for 最後
for (i=0;i<10;i++) 外迴圈不加 {}
for (int j=0;j<10;j++){ for (int j=0;j<10;j++){
sum=sum+j; sum=sum+j;
sun+=i; sun+=i;
} }
}
• 迴圈更多範例
終止條件以變數指定
Method 3: Correct
Int i;
int n=100;
int sum,step;
for(i=0;i<n;i++) { for(k=0;k<m;k++){
fprintf(fp,”%d”,i+n); for(j1=0;j1<n1;j1++){
} sum=i+j;
}
for(j2=0;j2<n2;j2++){
int i,j,n1,n2; step=sqrt(i*j);
for(i=0;i<n1;i++) }
{ }
for(j=0;j<n2;j++)
{
k=i+j;
}
}
關係運算子與邏輯運算子
1. > >= < <= Correct:
a>b; a 大於 b Int a=3; == 比較
a>=b; a 大於或等於 b Int b=5;
a<b; a 小於 b if(a==b)
a<=b; a 小於或等於 b {
AfxMessageBox(“Case: true”);
2. == }
a==b; a 與 b 比較 else
a=b; a 等於 b, {
將 b 內容放於 a 記憶體內 AfxMessageBox(“Case: false”);
}

wrong:
if(a=b)
{
}
= 指定 b 的內容給 a, 錯誤用法
If 內絕對不可只用一個等號
且 或

4. && || A=false;
3. ! !=
BOOL A,B,C; B=false;
! not, 非
C=A&B;// 相當少用 C=A|B
!= not equal,
if((a==b) && (c==d)) int a=4, b=3;
不等於 ( 用於比較 )
{ int c=2, d=4;
a!=b;
} If((a==b) || (c==d))
if(a!=b)
else {
{
{ }
}
} else
else
{ {
} }
•若 a 與 b 相等 , 並且 c 與 d 相等
C=!A;
則執行第一組 {} 內指令 , 否
則執行第二組 {} 內指令
Correct
if(a!=b) •若 a 與 b 相等 , 或 c 與 d 相等
{ 則執行第一組 {} 內指令 , 否
AfxMessageBox(“Case: TRUE”); 則執行第二組 {} 內指令
}
while 敘述
• 當迴圈次數不確定時使用
• 一般會設定一旗標 (Flag) ,預設為 FALSE( 或 TRUE), 當
某一條件符合時,變化旗標狀態,即可順利離開該迴圈

Method 1 宣告一變數 , 資料型態為 BOOL,


BOOL factor=false; 當變數狀態只有 TRUE 與 FALSE
//factor=false; 時 , 一般以 BOOL 宣告
while (factor!=true) While 的條件式 , 只要該條件不滿足 ,
{ 則 { } 內指令一直反復執行
if(…….)
if 指令 , 用來改變條件式狀態 , 一但
factor=true;
某種狀況滿足後 , 即使用 if 改變 factor
} 狀態
範例
該範例中 , 迴圈共執行幾次 ?

初始旗標狀態
宣告 i, 宣告完後
i 的內容為亂碼 , i 初始值要設定
非0

注意 : 執行圈數為 i
Method 2
j=0;
while (j<10)
{
j++;
}

此一型式與 for 迴圈類似 ,


但需注意迴圈執行次數
Method 3
while ( )
{
while ( )
{

}
}

雙重 while 迴圈 , 由於在圈數計算上 ,
比 for 迴圈困難 , 一般較少用
for 迴圈的執行圈數基本上需要已知 , while 迴圈則可以
未知 , 執行過程中改變條件式作為離開迴圈的依據 .

for 迴圈 , 執行圈數
要事先設定

執行圈數無法事先了解
Tip:
若迴圈數已知時 , 使用 for 迴圈
若迴圈數未知 , 終止條件由執行中決定 , 則使用 while 迴圈
Method 4
BOOL factor;
factor=FALSE;
int i;
i=0;
while (factor==FALSE)
{


i++;
if(i>10) factor=TRUE;
}

執行 10 次
迴圈執行次數需特別注意
案例 :
do while 敘述
Method 1
int j; 等同於 等同於
j=0; int i; j=0;
do for (i=0;i<3;i++) while (j<3)
{ { {
j++; } j++;
}while (j<3); }

Do while 與 while 差異 :
- 對於 while 而言 , 先判段條件式 , 滿足時才進入迴圈
迴圈執行幾次 ?
- 對於 do while 而言 , 先執行迴圈 , 每執行一次後 , 才
3次 判斷條件式是否滿足
Example: Do while

直接先進入迴圈

條件式 , 若不滿足 ,
則離開迴圈
if 敘述
• if 為判斷式指令,作為各種條件執行選項之
判斷
• if 基本型式
if(…)
Method 1:
{
單一條件 雙重條件 多重條件 }
if(i<10) if(i>10) if(j>10) else if (…)
{ { { {
} } } }
else else if (j>=11 && j<20) else if(…)
{ { {
} } }
else else
{ {
每一條件之群組指令均置放於 {} 內 } }
• if 指令各種寫法
Method 2
if(j>10 || j<20)
{

Method 3
Wrong
if(j>10 || j<20) fprintf ();
if(j>10 || j<20); fprintf ()
; 放錯位置

Method 4
if(i>10) fprintf(cond A); Method 5
else if (i==10) fprintf (cpnd B); if(i>10) fprintf(cond A);
else fprintf (cond C); else {


}
p1: 3 conditions, q1: 3 conditions
5. 優先順序
(a) ! -(negative) ++ --
(b) * / %
(c)+ -(add)
(d)< <= > >=
(e) == !=
(f) && ||
switch 敘述

Method 1
int I;
switch (i)
{
case 1: fprintf();
break; 等同於
case 2: fprintf(); int i;
break; i=2;
case 3: fprintf(); if(i==1)
break; AfxMessageBox("APPLE");
else if (i==2)
default:
AfxMessageBox("ORANGE");
fprintf(); else if (i==3)
} AfxMessageBox("Cherry");
else
AfxMessageBox("---");
break

Method 1
for(j=0;j<10;j++)
{

if(j>5)
break;
}

較少用
switch 範例
goto

Method 1
begin:
if(i>j)
goto stop;
goto begin;
stop:
return;
int j,k;
start:
j+=1;
if(j>10) goto stop;
goto start;
stop:

You might also like