4 選擇 在正常的情況下, 電腦程式的執行是以敘述的排列次序逐步處理的 使用控制架構 (control structures) 可以改變這種既定的先後次序, 讓程式得以進行更複雜的運算, 或以更簡潔的指令來實現演算法 1/42 選擇 4.1 演算法的描述方式 4.2 變數的運用範圍 (Scope of variables) 4.3 if- 敘述 4.4 巢狀 if- 敘述 (Nested if statements) 4.5 switch 敘述 4.6 條件運算子 (Conditional Operator?: ) 4.7 goto 無條件前往敘述 2/42
演算法的描述方式 演算法 (algorithms) 是執行工作的詳細步驟 電腦只能對以演算法式 (algorithmic) 的指令進行處理, 無法直接處理直覺式 (intuitive) 的指令 所有的演算法都可以用循序 (sequence), 選擇 (selection) 以及重複 (repetition) 三種流程控制架構 (control structures) 完整描述 3/42 演算法的三種描述方式 1. 虛擬程式碼 (pseudocode) 2. 公式 (formula) 3. 流程圖 (flowchart) 4/42
求平均值的流程圖 開始 輸入 x, y 計算 Sum 輸出 5/42 結束 常用的流程圖符號 6/42
複合敘述 (compound statement) 將數個敘述 (statements) 以大括號 包起來所形成的單元 複合敘述又稱為區塊 (block) 複合敘述和單一敘述在語法上佔有同等的地位 以包含兩個敘述的複合敘述為例, 其語法為 : 7/42 或 8/42 變數的運用範圍 (Scope of variables) int x = 2; int x = 0; int y = 5;...// 在這裡 x,y 都適用,...// 但 x 為重新定義的整數且其初值為 0... // 這裡 y 已不適用,x 則回到 2 的預設值... // 在這裡 x 和 y 都為未定義, 無法使用
C++ 的兩種選擇語法 if- 敘述 (if- statement) switch 敘述 (switch statement) 9/42 if- 敘述 false false if ( 條件式 ) 條件式 if ( 條件式 ) 條件式 敘述 true _1 true 敘述_1 10/42
條件式 所有的 C++ 表達式 (expression) 都可以當做條 件式 使用關係表達式或邏輯運算式是語意比較直接的 寫法 : x > 0 x == y y <= z (y!= 0) (x>0)? >? <?? >= 11/42 程式 CharInput.cpp 使用了 if- 敘述與使用者互動 : // CharInput.cpp #include <iostream> using namespace std; // ------ 主程式 -------------------- int main() char ch; cout << " 請輸入一個字母 (Y/N):" << endl; cin >> ch; if ( ch == 'Y' ch == 'y' ) cout << " 您輸入了 yes." << endl; cout << " 您輸入了 No." << endl; return 0; 12/42
操作過程 請輸入一個字元 (Y/N): Y 您輸入了 yes. 13/42 if 敘述 條件式 false 條件式 false if ( 條件式 ) if ( 條件式 ) true true 14/42
巢狀 if- 敘述 (Nested if- statements) 可分為下列兩種 : 置入的 if- 敘述位於 if 和 之間 置入的 if- 敘述位於 之後 15/42 巢狀 if- 敘述 (Nested if- statements)-1/2 條件 _1 false true if ( 條件 _1) if ( 條件 _2) 條件 _2 false 敘述 _3 true 敘述 _3 16/42
巢狀 if- 敘述 (Nested if- statements)-2/2 條件 _1 false if ( 條件 _1) true 條件 _2 false if ( 條件 _2) true 敘述 _3 敘述 _3 17/42 if- 敘述可能的錯誤 if ( 條件 _1) if ( 條件 _2) 被解釋為 if ( 條件 _1) if ( 條件 _2) 18/42
計算二次常係數方程式兩個根的程式 Root2.cpp 19/42 // Root2.cpp #include <iostream> using namespace std; // ------ 主程式 -------------------- int main() float a, b, c, D; cout << " 請輸入 a:" << endl; cin >> a; cout << " 請輸入 b:" << endl; cin >> b; cout << " 請輸入 c:" << endl; cin >> c; if ( a == 0.0 ) if (b == 0.0) cout << " 無解! " << endl; cout << " 只有一組解 : " << -c/b << endl; D = b*b-4.0*a*c; if (D==0.0) cout << " 重根 : " << -b/(2.0*a) << endl; if (D>0.0) cout << " 有兩組實數解 " << endl; cout << " 第一組 :" << (-b+sqrt(d))/(2.0*a) << endl; cout << " 第二組 :" << (-b-sqrt(d))/(2.0*a) << endl; 20/42
cout << " 解為兩組共軛複數 " << endl; cout << " 第一組 :" << (-b)/(2.0*a) << " + i " << sqrt(-d)/(2.0*a) << endl; cout << " 第二組 :" << (-b)/(2.0*a) << " - i " << sqrt(-d)/(2.0*a) << endl; return 0; 21/42 程式 Root2.cpp 在三次操作中的互動顯示 : 狀況一狀況二狀況三 請輸入 a:0 請輸入 b:2 請輸入 c:5 只有一組解 : -2.5 請輸入 a:4 請輸入 b:2 請輸入 c:7 解為兩組共軛複數第一組 : -0.25 + i 1.29904 第二組 : -0.25 - i 1.29904 請輸入 a:1.5 請輸入 b:8.7 請輸入 c:0.6 有兩組實數解第一組 : -0.0698057 第二組 : -5.73019 22/42
if- 鏈 (if- chain) 有時又稱為 -if 鏈 ; 或 -if 架構 (-if construct) 條件 _1 false true 條件 _2 false if ( 條件 _1) if ( 條件 _2) if ( 條件 _3) 敘述 _3 敘述 _4 true 條件 _3 true 敘述 _3 false 敘述 _4 23/42 範例程式 檔案 Tax.cpp // Tax.cpp #include <iostream> using namespace std; // ------ 主程式 -------------------- int main() float GIncome, Tax; cout << "\n" << " 請輸入綜合所得淨額 : " << endl; cin >> GIncome; 24/42 if (GIncome < 0.0) cout << " 您輸入的綜合所得淨額沒有意義!\n"; if (GIncome < 330000.0) Tax = GIncome * 0.06;
if (GIncome < 890000.0) Tax = GIncome * 0.13-23100; if (GIncome < 1780000.0) Tax = GIncome * 0.21-94300; if (GIncome < 3340000.0) Tax = GIncome * 0.3-254500; Tax = GIncome * 0.4-588500; cout << " 您要繳的綜合所得稅是 : " << Tax << " 元 "; return 0; 25/42 操作過程 請輸入綜合所得淨額 : 1349832 您要繳的綜合所得稅是 : 189165 元 26/42
switch 敘述 完整的 switch 敘述包括 switch,case,default, break 四個關鍵字 switch ( 整數表達式 ) case 值 _1: case 值 _2: default: 敘述 _3 值 _1 整數表達式 值 _2 敘述 _3 27/42 28/42 範例程式 Seasons.cpp 依使用者輸入的月份判斷該月份所屬的季節, 程式內應用了 switch 敘述的特性 // Seasons.cpp #include <iostream> using namespace std; // ------ 主程式 -------------------- int main() int Month; cout << "\n" << " 請輸入一個月份 : " << endl; cin >> Month; if (Month < 1 Month >12) cout << " 您輸入的月份沒有意義!";
cout << "\n" << Month << " 月是 "; switch ((Month%12)/3) case 0: cout << " 冬季 "<< endl; case 1: cout << " 春季 "<< endl; 29/42 30/42 case 2: cout << " 夏季 "<< endl; case 3: cout << " 秋季 "<< endl; default: cout << " 程式有問題!" << endl; return 0;
操作結果 狀況一 請輸入一個月份 : 5 5 月是春季 狀況二 請輸入一個月份 : 9 9 月是秋季 31/42 範例程式 CharTest.cpp 檢查使用者輸入的字母是子音還是母音 // CharTest.cpp #include <iostream> using namespace std; // ------ 主程式 -------------------- int main() char C; cout << "\n" << " 請輸入一個字母 : " << endl; cin >> C; if (C < 65 C >122) cout << " 您輸入的不是字母!"; 32/42
33/42 cout << " 您輸入的字母是 "; switch (C) case 'a': case 'e': case 'i': case 'o': case 'u': case 'A': case 'E': case 'I': case 'O': case 'U': cout << " 母音字母 " << endl; default: cout << " 子音字母 " << endl; return 0; 操作結果 (1) 第一次操作 請輸入一個字母 : e 您輸入的字母是母音字母 (2) 第二次操作 請輸入一個字母 : 3 您輸入的不是字母! 34/42
條件運算子 條件式? 表達式 _1 : 表達式 _2; 例如, 結合等號成為指派敘述 (assignment expression), 可以寫成 c = a > b? a : b ; 35/42 範例程式 Condition.cpp 使用條件運算子以判斷數值大小和奇偶數 // Condition.cpp #include <iostream> using namespace std; // ------ 主程式 -------------------- int main() float a, b; int N; // --- (1) ------------------------- cout << "(1) 請輸入兩個數 " << endl; 36/42
37/42 endl; cout << " 請輸入第一個數 a:" << endl; cin >> a; cout << " 請輸入第二個數 b:" << endl; cin >> b; cout << "a, b 兩者中較大的是 " << ( a > b? 'a' : 'b' ) << endl ; cout << endl; // --- (2) -------------------------- cout << "(2) 請輸入一個整數 N:" << endl; cin >> N; cout << "N 是 " << ( N % 2? " 奇數 " : " 偶數 ") << endl ; 操作結果 (1) 請輸入兩個數 : 請輸入第一個數 a: 23 請輸入第二個數 b: 46 a, b 兩者中較大的是 b (2) 請輸入一個整數 N: 89 N 是奇數 38/42
goto 無條件前往敘述 39/42 40/42
範例程式 SeasonsGoTo.cpp 用 goto 敘述代替 if- 敘述 // SeasonsGoTo.cpp #include <iostream> using namespace std; int main() 41/42 int Month; cout << "\n" << " 請輸入一個月份 cin >> Month; if (Month < 1 Month >12) cout << " 您輸入的月份沒有意義!"; goto EndofProgram; cout << "\n" << Month << " 月是 "; switch ((Month%12)/3) : " << endl; 42/42 case 0: cout << " 冬季 "<< endl; case 1: cout << " 春季 "<< endl; case 2: cout << " 夏季 "<< endl; case 3: cout << " 秋季 "<< endl; default: cout << " 程式有問題!" << endl; EndofProgram: return 0;