# 程式流程控制
# 結構化程序設計
- 目標
設計出結構清晰、可讀性強、易於分工合作編寫的 - 步驟
- 自上而下的分析:把複雜的問題分解成若干小問題以後再解決
- 模組化設計:將程序劃分為多個模組,每個模組獨立存放、完成一個特定功能。
- 結構化編碼:使用基本控制結構控制程序的流程。
# 模組
- 組成:可以是一條敘述句、一段程式、一個函式等等...
- 基本特徵:僅有一個入口和一個出口
- 模組間的關係:相互獨立、內聚性很強
# 基本控制結構
graph TD | |
subgraph 循環結構 | |
F-->G{條件?} | |
G-->|條件成立|F[語句序列] | |
G-->|條件不成立|H[ ] | |
end | |
subgraph 選擇結構 | |
C{條件?}-->|條件成立|D[語句序列A] | |
C-->|條件不成立|E[語句序列B] | |
end | |
subgraph 循序結構 | |
A[語句序列1] --> B[語句序列2] | |
end |
語句序列可以是一條語句或是一組複合語句喔~
# 順序結構中使用的語句
- 說明語句
- 賦值語句
- I/O 語句 (輸入 / 輸出語句)
- 複合語句和空語句
# 其他控制結構中使用的語句
- 流程控制語句
- 選擇語句
- 條件分支
if
else
- switch 分支
switch
case
- 條件分支
- 循環語句
- 已知次數
for
- 已知條件
while
、do while
- 已知次數
- 選擇語句
- 輔助控制語句
break
、continue
、goto
return
# 選擇語句
# 單路分支語句 if
if(表達式) | |
{ | |
語句序列 | |
} |
graph LR | |
B{表達式?}-->|成立|D[語句序列]-->C | |
B-->|不成立|C[ ] |
# 雙路分支語句 if else
if(表達式) | |
{ | |
語句序列1 | |
} | |
else | |
{ | |
語句序列2 | |
} |
graph LR | |
B{表達式?}-->|成立|D[語句序列1]-->C | |
B-->|不成立|F[語句序列2]-->C[ ] |
# 多路分支語句 else if
if(表達式1) | |
{ | |
語句序列1 | |
} | |
else if(表達式2) | |
{ | |
語句序列2 | |
} | |
else | |
{ | |
語句序列3 | |
} |
graph LR | |
B{表達式1?}-->|成立|D[語句序列1]-->C[ ] | |
B-->|不成立|A{表達式2?}-->|成立|F[語句序列2]-->C | |
A-->|不成立|G[語句序列3]-->C |
# 內嵌分支語句 巢狀if
if(表達式1) | |
{ | |
if(表達式2) | |
{ | |
語句序列1 | |
} | |
else | |
{ | |
語句序列2 | |
} | |
} | |
else | |
{ | |
語句序列3 | |
} |
graph LR | |
B-->|成立|A{表達式2?}-->|成立|F[語句序列1]-->C | |
B{表達式1?}-->|不成立|D[語句序列3]-->C[ ] | |
A-->|不成立|G[語句序列2]-->C |
# switch 分支 switch
switch (表達式) | |
{ | |
case 常數表達式1: | |
語句序列1; | |
case 常數表達式2: | |
語句序列2; | |
.............. | |
default: | |
語句序列3; | |
} |
graph LR | |
B{常數表達式1?}-->|成立|D[語句序列1]-->C[ ] | |
B-->|不成立|A{常數表達式2?}-->|成立|F[語句序列2]-->C | |
A-->|不成立|G[語句序列3]-->C |
# 例子:轉換成績
例子在裡面喔!!
將一個輸入的百分成績經過運算得到相應的 5 制成績。
轉換前後的成績對應如下:
100~90 | 5 |
89~80 | 4 |
79~70 | 3 |
69~60 | 2 |
60 分以下 | 1 |
#include<iostream> | |
using namespace std; | |
int main() | |
{ | |
int old_grade, new_grade; | |
cin >>old_grade; | |
switch (old_grade/10) | |
{ | |
case 10: | |
case 9: new_grade = 5;break; | |
case 8: new_grade = 4;break; | |
case 7: new_grade = 3;break; | |
case 6: new_grade = 2;break; | |
default: new_grade = 1; | |
} | |
cout <<new_grade; | |
return 0; | |
} |
- 整數表達式作為運算表達式
switch(old_grade/10)
- 分支描述
case 10: | |
case 9: new_grade = 5;break; | |
case 8: new_grade = 4;break; | |
case 7: new_grade = 3;break; | |
case 6: new_grade = 2;break; |
- 缺省分支敘述
default: new_grade = 1; |
- 中斷語句:
break
# 循環語句
# 已知次數 for
for(表達式1; 表達式2; 表達式3) | |
{ | |
語句序列; | |
} | |
// 表達式 1:< 資料型態 > < 變數 >=< 初值 > | |
// 表達式 2:表示循環條件 | |
// 表達式 3:表示增量 (減量) |
graph LR | |
A[表達式1]-->B{表達式2?} | |
B-->|不成立|C[ ] | |
B-->|成立|D[語句序列] | |
D-->E[表達式3] | |
E-->B |
# 例子:計算累加和
例子在裡面喔
計算 的總和並顯示結果。
#include <iostream> | |
using namespace std; | |
int main() | |
{ | |
int sum=0,i,n; | |
cin>>n; | |
for(i=1; i<=n; i++) { | |
sum=sum+i; | |
} | |
cout << sum<<endl; | |
return 0; | |
} |
# 例子:乘法表 (巢狀迴圈)
例子在裡面喔
按照三角形式顯示九九乘法表
格式如下:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
......
1*9=9 2*9=18 3*9=27 ... 9*9=81
#include <iostream> | |
using namespace std; | |
int main(){ | |
int i,j; | |
for(i=1; i<=9; i++){ // 外層循環 | |
for(j=1; j<=i; j++) // 內層循環 | |
cout << j<<"*"<<i<<"="<<j*i<<"\t"; // \t 輸出對齊 | |
cout<<endl; | |
} | |
return 0; | |
} |
# 已知條件 while
do while
while (表達式) | |
{ | |
語句序列 | |
} |
graph LR | |
B{表達式?}-->|不成立|C[ ] | |
B-->|成立|D[語句序列] | |
D-->B |
do | |
{ | |
語句序列 | |
} while (表達式); |
graph LR | |
A[語句序列]-->B | |
B{表達式?}-->|不成立|C[ ] | |
B-->|成立|D[語句序列] | |
D-->B |
# 例子:求 e 值
例子在裡面喔!!
使用下列級數近似計算 e 值,直到最後一個通項 ui<10-7 為止
#include <iostream> | |
using namespace std; | |
int main() | |
{ | |
double e = 1.0,u = 1.0; // 基數 e,通項 u | |
int n = 1; // 第 n 項 | |
while(u >= 1.0E-7) | |
{ | |
u = u/n; // 通項 | |
e = e+u; // 累加和 | |
n++; | |
} | |
cout << "e = " << e << " ( n = " << n << " )" << endl; | |
return 0; | |
} |
#include <iostream> | |
using namespace std; | |
int main() | |
{ | |
double e=1.0,u = 1.0; | |
int n= 1; | |
do | |
{ | |
u = u/n; | |
e = e+u; | |
n = n+1; | |
} while (u>=1.0E-7); | |
cout << "e = " << e << " ( n = " << n << " )" << endl; | |
return 0; | |
} |
# 例子:計算實數 n 次方根
例子在裡面喔!!
寫一個能夠根據輸入 x 和 n 計算 x 的 n 次方根的程式
具體要求:
- 輸入 0 0 時,程序結束
- 當 (x<0 且 n<=0) 或 (x<=0 且 1/n 不為整數) 時,顯示輸入錯誤,並能讓使用者再輸入
- 否則,計算並顯示 x 的 n 次方根並允許用戶繼續輸入
#include<iostream> | |
#include<cmath> | |
using namespace std; | |
int main(){ | |
double x,n; | |
while (1){ // 無限迴圈 | |
cin>>x>>n; | |
if(x==0&&n==0){ | |
cout<<"Program terminated"<<endl; | |
break; // 能夠跳出所有位置最近的迴圈 | |
} | |
else { | |
if((x<0&&n<=0)||(x<0&&1/n!=int(1/n))){ | |
cout<<"error reinput"<<endl; | |
continue; // 能夠跳過後續的過程,進到下一個迴圈 | |
} | |
cout<<x<<"\t"<<n<<"th root"<<pow(x,1.0/n)<<endl; | |
} | |
} | |
return 0; | |
} |