講師: 李根逸 (Ken-Yi Lee), E-mail: feis.tw@gmail.com
程式流程控制 (下)
【第四講】
!121
課程⼤大綱
條件判斷 :
if (
表⽰示式) { ... }
[P.91]if (
表⽰示式) { ... } else { ... }
[P.93]switch (
整數值) { case
固定整數值: ...
default: ... }
[P.135]重複執⾏行 (迴圈) :
while (
表⽰示式) { ... }
[P.99]for (
初始式; 表⽰示式; 迭代式) { ... }
[P.123]do { ... } while(
表⽰示式);
[P.131]警⽰示型迴圈與計數型迴圈
迴圈控制:
break 與 continue 關鍵字
[P.133]!122
for 關鍵字
for (初始式; 表⽰示式; 迭代式) {
... }
相當於 :
!
!
!
範例 : 印出 1 ⾄至 10
{
初始式
;
while (
表⽰示式) { ...
迭代式
; }
}
for (int i = 1; i <= 10; ++i) { printf(“%d\n”, i);
}
{ int i = 1;
while (i <= 10) {
printf(“%d\n”, i);
++i;
} }
!123
成⽴立
不成⽴立
表⽰示式
...
初始式
迭代式
【範例】迴圈的基本
試寫⼀一程式,印出由 1 ⾄至 100 間的整數
!
!
!
!
!
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,印出 1
⾄至該正整數 N 間的整數
1 2 3 4 5 6 ... 100
!124
【範例】 int.cpp
【範例】 int100.cpp
【範例】迴圈列印
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,顯⽰示 1
⾄至 N 之間的所有奇數
試寫⼀一程式,印出由 100 ⾄至 1 間的整數
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,顯⽰示 1
⾄至 N 的整數和
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,印出 N 個星號 (*)
範例輸⼊入⼀一: 5 範例輸出⼀一: *****
範例輸⼊入⼀一: 8 範例輸出⼆二: ********
!125
【範例】 odd.cpp
【範例】 reverse.cpp
【範例】 sum.cpp
【範例】 print_star.cpp
警⽰示型迴圈與計數型迴圈
在選擇要使⽤用 while 或 for 時,通常以該迴圈的特 性來決定:
警⽰示型迴圈:該迴圈的結束條件是在某不明確事件 (例 如當使⽤用者輸⼊入 -1 ) 發⽣生時,請使⽤用 while
範例:猜數字
!
!
!
!
計數型迴圈:該迴圈在執⾏行明確次數後會結束的話,請 使⽤用 for
範例:算 1 ⾄至 N 的數字和
⼀一般情況下,先考慮使⽤用 for,不合適時再考慮 while
讀⼊入資料;
while (資料不是警⽰示值) { 執⾏行動作;
讀⼊入資料;
}
!126
【範例】複利計算
試寫⼀一程式,計算某⼈人在銀⾏行中的定額存款在⼗十年間 的結算⾦金額 (每年無條件捨去⾄至整數位結算⼀一次)
計算公式 :
每年結算⾦金額 = 累計⾦金額 * (1 + 年利率)
請輸⼊入本⾦金: 1000 請輸⼊入年利率: 0.05 Year Amount
1 1050 2 1102 3 1157 4 1214 5 1274 6 1337 7 1403 8 1473 9 1546 10 1623
!127
【範例】 interest.cpp
【範例】⽐比較⼤大⼩小
擂台賽! 利⽤用⼀一組變數去記錄現在擂台盟主,再⼀一
⼀一上台⽐比劃,每輪留下勝利者!
!
!
試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,顯⽰示其中最
⼤大的數字
試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,依序顯⽰示最
⼤大的兩個數字
試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,依序顯⽰示最
⼤大的三個數字
預設第⼀一個⼈人或拿個沙包為擂台主;
for (每⼀一個⼈人) {
if (與擂台主 PK 獲勝) { 換擂台主; } }
!128
【範例】 big3.cpp
【範例】 max10.cpp
【範例】 big2.cpp
【範例】暴⼒力的美
⽤用迴圈把所有可能的候選⼈人都⼀一⼀一列出來,再試著留 下我們想要的
!
!
試寫⼀一程式,輸⼊入某個正整數 N,判斷 N 是不是質 數
質數表⽰示除了 1 跟本⾝身以為沒有其他的因數
試寫⼀一程式,顯⽰示 1 到 1000 間所有的質數
for (每⼀一個可能的候選⼈人) {
if (符合要求) { 做想做的事情; } }
!129
【範例】 prime.cpp
【範例】 is_prime.cpp
【範例】巢狀迴圈
試寫⼀一程式,印出下列結果:
!
!
!
試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下 列結果:
* **
*** ****
*****
範例輸⼊入⼀一:
5
範例輸出⼀一:
* **
*** ****
*****
範例輸⼊入⼆二:
3
範例輸出⼆二:
* **
***
!130
【範例】 triangleN.cpp
【範例】 triangle.cpp
do 關鍵字
do { ... } while (表⽰示式);
⾄至少會執⾏行 {...} 的內容⼀一次的 while 語法
int grade;
do {
scanf(“%d”, &grade);
} while (grade < 0 || grade > 100);
成⽴立
不成⽴立 表⽰示式
...
!131
有兩種⽅方式可以產⽣生無窮迴圈:
使⽤用條件永遠為真的 while 迴圈:
!
!
使⽤用沒有條件的 for 迴圈 (預設為真):
【補充】無窮迴圈
!132
while (1) { // 執⾏行內容 }
for(;;) { // 執⾏行內容 }
break 和 continue 關鍵字
break: 強制結束 while, for 或 switch
!
!
!
!
!
continue: 跳⾄至 while 或 for 的下⼀一次迴圈開始
for (int i = 1; i <= 10; ++i) { if (i == 5) {
break;
} printf(“%d”, i);
}
for (int i = 1; i <= 10; ++i) { if (i == 5) {
continue;
} printf(“%d”, i);
}
!133
while (1) { 讀⼊入資料;
if (資料是警⽰示值) { break;
}
執⾏行動作;
} 參考 [P.126]
【範例】迴圈控制
試寫⼀一程式 ,印出 1 ⾄至 10 間除了 5 之外的整數
!
!
試寫⼀一程式,印出 1 ⾄至 100 間除了 5 的倍數之外 各個整數
!
試寫⼀一程式,讓使⽤用者輸⼊入⼀一個整數後,顯⽰示該整數 的平⽅方值。反覆執⾏行,直到使⽤用者輸⼊入負數時才結束。
1 2 3 4 6 7 8 9 10
!134
【範例】 squared.cpp
【範例】 no5.cpp
【範例】 no5t.cpp
switch (整數值) {
case 固定整數值: ... ; default: ...; }
switch、case 與 default
char grade = ?;
switch (grade) { case ‘A’:
case ‘a’:
countA++;
break;
case ‘B’:
case ‘b’:
countB++;
break;
case ‘C’:
case ‘c’:
countC++;
break;
default:
countErr++;
break;
}
當 grade 是 ‘A’ 或 ‘a’ 時, 會執⾏行此⾏行
當 grade 是 ‘B’ 或 ‘b’ 時, 會執⾏行此⾏行
當 grade 是 ‘C’ 或 ‘c’ 時, 會執⾏行此⾏行
當 grade 不符合上⾯面所列時,會執⾏行此⾏行
!135
【範例】 grade.cpp
【範例】統計⾦金額
試寫⼀一程式,讓使⽤用者先輸⼊入賣出商品的總數後,分 別輸⼊入每個賣出商品的編號。輸⼊入完後,顯⽰示賣出的 總⾦金額
商品編號 商品⾦金額
1 90
2 75
3 83
4 89
5 71
Please enter the number of goods: 5 1 5
5 4 1
The amount is 411.
!136
【範例】 coin.cpp
習題 [1]
以下題⺫⽬目⽤用 for 改寫:
[E0401] E0307, [E0402] E0309 [E0403] E0310, [E0404] E0312 [E0405] E0314, [E0406] E0315 [E0407] E0316, [E0408] E0318 [E0409] E0319, [E0410] E0320 [0E411] E0331, [E0412] E0334
以下題⺫⽬目⽤用 switch 改寫:
[E0413] E0311, [E0414] E0334
!137
習題 [2]
[E0415] 試寫⼀一程式,印出下列結果:
!
!
!
[E0416] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
* **
***
****
*****
範例輸⼊入⼀一:
5
範例輸出⼀一:
* **
***
****
*****
範例輸⼊入⼆二:
3
範例輸出⼆二:
* **
***
!138
習題 [3]
[E0417] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
!
!
!
[E0418] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
範例輸⼊入⼀一:
5 範例輸出⼀一:
*****
****
*** **
*
範例輸⼊入⼆二:
3
範例輸出⼆二:
*** **
*
範例輸⼊入⼀一:
5
範例輸出⼀一:
*****
****
***
**
*
範例輸⼊入⼆二:
3
範例輸出⼆二:
*** **
*
!139
習題 [4]
[E0419] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
!
!
!
[E0420] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
範例輸⼊入⼀一:
5 範例輸出⼀一:
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
範例輸⼊入⼆二:
3
範例輸出⼆二:
1 2 2 3 3 3
範例輸⼊入⼀一:
5
範例輸出⼀一:
5 5 5 5 5 4 4 4 4 3 3 3 2 2 1
範例輸⼊入⼆二:
3
範例輸出⼆二:
3 3 3 2 2 1
!140
習題 [5]
[E0421] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
!
!
!
[E0422] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
範例輸⼊入⼀一:
5 範例輸出⼀一:
5 4 4 3 3 3 2 2 2 2 1 1 1 1 1
範例輸⼊入⼆二:
3
範例輸出⼆二:
3 2 2 1 1 1
範例輸⼊入⼀一:
5
範例輸出⼀一:
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5
範例輸⼊入⼆二:
3
範例輸出⼆二:
1 1 2 1 2 3
!141
習題 [6]
[E0423] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數 ,印出下列結果:
!
!
!
[E0424] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
範例輸⼊入⼀一:
5
範例輸出⼀一 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5
範例輸⼊入⼆二:
3 範例輸出⼆二:
1 1 2 1 2 3
範例輸⼊入⼀一:
5
範例輸出⼀一:
1 2 1 3 2 1 4 3 2 1 5 4 3 2 1
範例輸⼊入⼆二:
3 範例輸出⼆二:
1 2 1 3 2 1
!142
習題 [7]
[E0425] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數 ,印出下列結果:
!
!
!
[E0426] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一整數後,繪 製相對應⾼高度的三⾓角形
範例輸⼊入⼀一:
5
範例輸出⼀一:
1 2 1 3 2 1 4 3 2 1 5 4 3 2 1
範例輸⼊入⼆二:
3 範例輸出⼆二:
1 2 1 3 2 1
範例輸⼊入⼀一:
3
範例輸出⼀一:
* ***
*****
範例輸⼊入⼆二:
5 範例輸出⼆二:
* ***
*****
*******
*********
!143
習題 [8]
[E0427] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一正奇數後,
繪製相對應⾼高度的菱形
Please enter an odd integer: 3 * ***
*
Please enter an odd integer: 5 * ***
*****
***
*
!144
習題 [9]
[E0428*] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 K 表⽰示三⾓角波的波⻑⾧長,另⼀一正整數 M 表⽰示三⾓角波的個 數後,繪製出三⾓角波圖
Please enter an integer (K): 3 Please enter an integer (M): 2
* **
*** *
** ***