# 程式流程控制

# 結構化程序設計

  • 目標
    設計出結構清晰、可讀性強、易於分工合作編寫的
  • 步驟
    • 自上而下的分析:把複雜的問題分解成若干小問題以後再解決
    • 模組化設計:將程序劃分為多個模組,每個模組獨立存放、完成一個特定功能。
    • 結構化編碼:使用基本控制結構控制程序的流程。

# 模組

  • 組成:可以是一條敘述句、一段程式、一個函式等等...
  • 基本特徵:僅有一個入口一個出口
  • 模組間的關係:相互獨立、內聚性很強

# 基本控制結構

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
      • 已知條件 whiledo while
  • 輔助控制語句
    • breakcontinuegoto
    • 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
  1. else 總是會和它上方最接近的 if 做配對
  2. 如果 ifelse 的數量不一樣可以用大括號 {} 確定關係

# 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~905
89~804
79~703
69~602
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;
}
  1. 整數表達式作為運算表達式 switch(old_grade/10)
  2. 分支描述
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;
  1. 缺省分支敘述
default: new_grade = 1;
  1. 中斷語句: break
  1. case 後面必須加上冒號,而不是大括號
  2. case 的敘述結束之後。需加上 break ,中斷這個 switch,否則會繼續向下執行下一個 case

# 循環語句

# 已知次數 for

for(表達式1; 表達式2; 表達式3)
{
	語句序列;
}
// 表達式 1:< 資料型態 > < 變數 >=< 初值 >
// 表達式 2:表示循環條件
// 表達式 3:表示增量 (減量)
graph LR
  A[表達式1]-->B{表達式2?}
  B-->|不成立|C[ ]
  B-->|成立|D[語句序列]
  D-->E[表達式3]
  E-->B

# 例子:計算累加和

例子在裡面喔

計算1+2+3+...+n1+2+3+...+n 的總和並顯示結果。

#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;
}
  1. 表達式之間的 ; 是不能省略的
  2. for(;;) 在語法上是正確的,表示無限循環
  3. if 一樣如果 for 只有執行一個指令 {} 是可以省略的

# 已知條件 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 為止

e=1+11!+12!+...+1n!+...e = 1 + \frac{1}{1!} + \frac{1}{2!} + ... + \frac{1}{n!} + ...

ui=1i!=1(i1)!/i=ui1/iu_i = \frac{1}{i!} = \frac{1}{(i - 1)!}/i = u_{i-1} / i

#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; 
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay