You are on page 1of 36

選擇結構

 關係運算子與邏輯運算子
 if 敘述
 switch – case 敘述
關係運算子與邏輯運算子
關係運算子
邏輯運算子

 常用來判斷複合條件,結果是布林值,
不是 1 (true),就是 0 (false)
 邏輯運算子及其真值表
邏輯運算子

 實例

 0 ≤ x <1
(0 <= x) && ( x < 1)
if 敘述
if 指令
 條件式 true,執行敘述,否則執行 if 外

的下一行敘述
 屬於單向選擇結構
if 指令

 if 內有多個敘述,應用 { } 將敘述括起來
if 指令

 非 0 的數值,布林值是 true
 以下敘述是相同的
if (運算式 != 0) if (運算式)
if (運算式 == 0) if (!運算式)
if - else 敘述

 條件式true,執行敘述1,否則執行敘述 2
 屬於雙向選擇結構
if - else 敘述

 if - else 可使用運算子 ? : 來簡化


 ? : 運算子

條件式成立,執行運算式 1,否則執行運
算式 2
if - else 敘述

實例
 a = (7 == 3) ? 4 : 3

條件式 7 == 3 為 false,所以 a = 3

 b = (7 == 4 + 3) ? 4 : 3

條件式 7 == 4 + 3 為 true,所以 b = 4
if - else 敘述

 求 a 和 b 兩數之最大數 max
max = (a > b) ? a : b;

 求 a 的絕對值 ab
ab = (a >= 0) ? a : -a;

 判斷 n 是否為奇數 odd
odd = (n % 2) ? 1 : 0;
if else if 敘述
巢狀選擇結構

 if 內包含 if 敘述
 使用巢狀選擇結構時,應注意 if 和 else
的配對
switch – case 敘述
switch – case 敘述

1. 運算式和 case 的值需是整數或字元,


不能是浮點數
2. 運算式的值會依序和每個 case 的值比
較,若相等,執行此 case 後的敘述,
直到碰到 break 指令
3. break 可讓程式跳離 switch 區塊
4. break 可省略。若省略,程式不會跳離
switch,會繼續往下執行其他 case 子句
switch – case 敘述

5. 若運算式的值與全部 case 的值都不相


等,會執行 default 後的敘述
6. 不一定要有 default 敘述
7. case 子句若包含多個敘述,不必用 { }
括起來
練習題
 練習題 a012 Hashmat的戰役
 練習題 d050. 妳那裡現在幾點了?
 練習題 d064: ㄑㄧˊ 數?
 練習題 d068: 該減肥了!
 練習題 d058: BASIC 的 SGN 函數
 練習題 d065: 三人行必有我師
 練習題 d060: 還要等多久啊?
 練習題 a003-兩光法師占卜術
 練習題 d063: 0 與 1
 練習題 a053-Sagit's 計分程式
 練習題 a004-文文的求婚 判斷閏年
 練習題 d067: 文文的求婚--續集 (1 行版)
 練習題 d069: 文文的求婚--續集 (n 行版)
 練習題 d070: 文文的求婚--續集 (0 尾版)
 練習題 d072: 文文的求婚--續集 (Case 版)
 練習題 a006-一元二次方程式
練習題
 練習題 d460: 山六九之旅
 練習題 d143: UVa Q11172: Relational Operators
 練習題 d039 UVa 11044 - Searching for Nessy
 練習題 d057 11494 - Queen
 挑戰題 c006. Combination Lock
 挑戰題 d140-On Sale.
 練習題 a273: 小朋友下樓梯 除法 小心m與n為0
 練習題 d579: 兩條線
 練習題 d095. 579 - ClockHands
 練習題 c004: Beat the Spread!
 挑戰題 d040 11207 - The easiest way
 練習題 d669: 11677 - Alarm Clock
 練習題 d980: 11479 - Is this the easiest problem?
 練習題 d511: 小明的作業
 挑戰題 a410: 解方程
 練習題 a799: 正值國
 練習題 d485: 我愛偶數
重複結構(迴圈)
 重複結構是重複執行某些敘述,直到滿
足特定條件為止,也稱為迴圈 (loop)
 重複結構有 for、while 兩種
 for 用於有固定次數的迴圈,
while, do-while 用於不固定次數的迴圈
 for 和 while 先判斷條件,再決定是否執
行重複結構
do - while 先執行一次重複結構,再判斷
條件,決定是否繼續執行迴圈
for

 以變數作為計數器,控制迴圈執行的次
數,又稱為計數迴圈
 指令格式

※ 括號內三者以分號 ; 隔開
for 指令格式

1. 將 i 的宣告和初始化放到初始值中
for (int i = 1; i <= 100; i++ )
sum += i;
迴圈內宣告,只在迴圈內有效, 離開迴圈
就不能使用,若要使用,必須再宣告
2. 將變數初始化放到初始值中
for (sum = 0, i = 1; i <= 100; i++ )
sum += i;
while 迴圈
前測式重複結構 while
 已知迴圈數:用 for

無法預知迴圈數:用 while
 while 屬於前測式重複結構,執行迴圈前,
會先檢查條件式是否成立
前測式重複結構 while
 指令格式

 條件式 false,不執行迴圈,跳到迴圈外
的下一敘述
 條件式 true,執行迴圈,再檢查條件式,
不斷循環,直到條件式不成立
前測式重複結構 while

共執行 5 次,
最後 i 值為 5

輸出 54321
前測式重複結構 while

 for 可使用 while 替換


前測式重複結構 while

 計算 1 加到 n

 無窮迴圈
for ( ; ; ) while ( 1 )
5.2.1 前測式重複結構 while

 重複讀取資料
while (cin >> 變數1 >> 變數2 ⋯)
 重複讀取 x, y 值,直到輸入為空 (NULL)
while ( cin >> x >> y )

 輸入NULL:按 ctrl + z 鍵後,再按 enter


 重複「輸出 "輸入兩整數",將 i 設為 0,
讀取 x, y 的值」
while ( cout << "輸入兩整數", i = 0, cin >> x >> y )
後測式重複結構 do - while
 指令格式

 while 後面要有分號 ;
 先執行一次,再判斷條件式是否成立,
若成立,再執行迴圈,否則跳離迴圈
後測式重複結構 do - while
 可用於限制輸入值的範圍
 例如要確保輸入值在 1 ~ 12,可將輸入的
敘述放到 do –while 結構內
多重迴圈

 for 迴圈內還有 for 迴圈


 例如九九乘法表
for (col = 2; col <= 9; col++){
for (row = 2; row <= 9; row++)
cout << col << “×” << row << “=“
<< col * row << "\t";
cout << endl;
}
改變迴圈的執行
continue
 continue, break, goto皆可改變迴圈的執行

 goto 可以跳離好幾層結構,不建議使用

 continue 會讓程式跳回迴圈的開頭,再
繼續執行下一次迴圈
break 跳躍指令

 break 可跳離 switch 和迴圈


 讓程式跳至迴圈外的下一敘述繼續執行

 break :會結束整個迴圈
continue:只結束本次迴圈,不會終止整
個迴圈
break 跳躍指令

 質數問題
 質數:除了 1 和本身外,沒有其他因數
 例如網路安全的公開金鑰密碼系統,常
使用大質數作為金鑰
• N = 大質數 A × 大質數 B,
N 可能幾百位數,所以可公開,因為很
難分解出是那兩個質數的乘積
• 所以系統的安全強度和所用的質數大小
有關,質數越大,安全性越高
break 跳躍指令


練習題
 練習題 c005. UVa環保獎金
 練習題 a058: MOD3
 練習題 a005-Eva 的回家作業
 練習題 d010- 盈數、虧數和完全數
 練習題 d074: 電腦教室
 練習題 a148: You Cannot Pass?
 練習題 d122: Oh! My Zero!
 練習題 a024- 最大公因數(GCD)
 練習題 a147: Print it all
 練習題 a215-明明愛數數
 挑戰題 a010-因數分解
 挑戰題 a040-阿姆斯壯數
 挑戰題 c079-UVa- Peter's Smokes
 挑戰題 a007-判斷質數
 練習題 d260: 11455 - Behold my quadrangle
 練習題 a121: 質數又來囉
練習題
 挑戰題 d087: acm-107 - The Cat in the Hat
 練習題 c013-acm-488-Triangle Wave
 練習題 b112:93全國 5. 高中運動會
 練習題 c087: acm-412 Pi 互質
 練習題 d693: 最小公倍數
 練習題 a244: 新手訓練 ~ for + if
 練習題 d186:acm 11461 - Square Numbers
 練習題 10849 - Move the bishop
 練習題 a781: 3. Checkerboard 印棋盤
 練習題 d356: NOIP2002 1.级数求和
 練習題 c022: 10783 - Odd Sum
 練習題 d660: 11764 - Jumping Mario

You might also like