講師: 李根逸 (Ken-Yi Lee), E-mail: feis.tw@gmail.com
程式流程控制 (上)
【第三講】
!89
課程⼤大綱
條件判斷 :
if (
表⽰示式) { ... }
[P.91]如果表⽰示式成⽴立就 ...
if (
表⽰示式) { ... } else { ... }
[P.93]如果表⽰示式成⽴立就 ... 否則就 ..
C / C++ 的複合指定與遞增遞減運算⼦子 [P.96]
重複執⾏行 (迴圈) :
while (
表⽰示式) { ... }
[P.99]當表⽰示式成⽴立就⼀一直執⾏行 ...
!90
if ( ) {
}
int main() {
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int grade;
scanf(“%d”, &grade);
system(“pause”);
if (
[?]
) { ... }如果 [?] 成⽴立 (為真 / 值⾮非零) 就 ...
printf(“PASSED !\n”);
if 關鍵字
成⽴立
不成⽴立
...
[?]
成⽴立
不成⽴立
printf(“PASSED !\n”);
grade >= 60 grade >= 60
!91
【範例】簡單計算
試寫⼀一程式讓使⽤用者輸⼊入⾥里程數 (公尺),計算後顯
⽰示應付的計程⾞車資
計程⾞車資計算公式
1.25 公⾥里內是 70 元 (起跳 70 元)
超過 1.25 公⾥里後,每 250 公尺多 5 元 [不⾜足者以 250 公尺計) 1.25 公⾥里要付 70 元, 1.26 公⾥里要付 75 元, 2.00 公⾥里要付 85 元
試寫⼀一程式讓使⽤用者做簡單的兩整數計算 [+, - , *, /] (精確到⼩小數點後兩位) [%.2f]
3+5 ANS: 8.00
3-5 ANS: -2.00
3*5 ANS: 15.00
3/5 ANS: 0.60
!92
【範例】 calc.cpp
【範例】 taxi.cpp
if ... else ... [1]
if (
[?]
) { ... } else { ... }如果 [?] 成⽴立就 ... 否則就 ...
!
巢狀 if-else 敘述 :
成⽴立
不成⽴立
...
...
[?]
if (a > b) {
printf(“a > b”);
} else {
if (a < b) {
printf(“a < b”);
} else {
printf(“a == b”);
} } if (a > b) {
printf(“a > b”);
} if (a < b) {
printf(“a < b”);
} if (a == b) {
printf(“a == b”);
}
!93
if ... else ... [2]
if (
[?]
) { ... } else { ... }如果 [?] 成⽴立就 ... 否則就 ...
!
多層 if-else 敘述 :
成⽴立
不成⽴立
...
...
[?]
if (a > b) {
printf(“a > b”);
} else if (a < b) { printf(“a < b”);
} else {
printf(“a == b”);
} if (a > b) {
printf(“a > b”);
} if (a < b) {
printf(“a < b”);
} if (a == b) {
printf(“a == b”);
}
!94
⼀一種較精簡省略的寫法
【範例】⽐比較⼤大⼩小與排序
試寫⼀一個程式讓使⽤用者輸⼊入三個數字後顯⽰示最⼤大的值 給使⽤用者看 :
!
!
!
試寫⼀一個程式讓使⽤用者輸⼊入三個數字後將數字由⼩小⾄至
⼤大依序印出
Please enter the first integer : 3 Please enter the second integer : 4 Please enter the third integer : 2 The largest integer is 4.
!95
【範例】 sort3.cpp
【範例】 max3.cpp
複合指定與遞增遞減運算⼦子
複合指定運算⼦子 加等於
+=
減等於
-=
乘等於
*=
除等於
/=
求餘等於
%=
遞增遞減運算⼦子 遞增
++
遞減
--
複合指定運算⼦子:a+=2 相等於 a=a+2 a*=2 相等於 a=a*2
遞增與遞減運算⼦子:
++a 會將 a 的值加⼀一並 回傳新值
--a 會將 a 的值減⼀一並回 傳新值
a++ 會回傳 a 原有的值 後再將 a 值加⼀一
a-- 會回傳 a 原有的值後 再將 a 值減⼀一
!96
【範例】 ++i 與 i++
判斷下⾯面程式執⾏行過程中 a 與 b 的值:
int a = 1;
int b = 2;
a = a+1;
a += 1;
a++;
a+1;
b = ++a;
b = a++;
a = a++; /* 未定義⾏行為:同⼀一句內多次指定同個變數的值 */
!97
【範例】 inc.cpp
『未定義⾏行為』: 具有未定義⾏行為的程式碼之執⾏行結果是不可以預期的
【範例】⽐比較數字
試寫⼀一程式讓使⽤用者輸⼊入⼀一個六位正整數,並判斷這 整數內含有多少個數字 7 後顯⽰示給使⽤用者看:
!
!
提⽰示 :
a = a + 1 會將 a 的值加⼀一後存回 a
Please enter a 6-digit number : 378717 The count of 7s is 3.
/ 100000 == ? / 10000 % 10 == ? / 1000 % 10 == ? / 100 % 10 == ? / 10 % 10 == ? % 10 == ?
!98
【範例】 lucky7.cpp
while (
[?]
) {... }
當 [?] 成⽴立時就 ...
!
!
!
!
while 語法會⼀一直重複執⾏行內容 直到
[?]
不成⽴立時才結束請謹慎使⽤用,確保迴圈會正常結束
while 關鍵字
while (a < 100) { a = a + 1;
}
START:
if (a < 100) { a = a + 1;
goto START;
}
成⽴立
[?] 不成⽴立
...
成⽴立
不成⽴立
a=a+1 a < 100
if (a < 100) { a = a + 1;
}
!99
【範例】猜數字
試寫⼀一個程式,在程式內部預設⼀一個整數作為猜數字 遊戲的答案。當使⽤用者執⾏行程式後,需要輸⼊入⼀一個整 數,如果該整數與程式預設的答案不同,請顯⽰示是⽐比 較⼤大或者⽐比較⼩小;如果該整數與程式預設的答案相同,
請恭喜使⽤用者。⽽而遊戲重複進⾏行問答直到使⽤用者猜到 答案後才結束。
請猜⼀一個整數: 5 太⼤大了喔.
請猜⼀一個整數: 3 太⼩小了喔.
請猜⼀一個整數: 4 你真是天才!
!100
【範例】 guess.cpp
【範例】統計資料
試寫⼀一程式,讓使⽤用者可以輸⼊入任意多筆的正整數後,
顯⽰示這些數字的個數、和、平均值與最⼤大值
當使⽤用者輸⼊入負數時表⽰示資料輸⼊入完畢
請輸⼊入⼀一個正整數 [負數則結束]: 3 請輸⼊入⼀一個正整數 [負數則結束]: 4 請輸⼊入⼀一個正整數 [負數則結束]: 5 請輸⼊入⼀一個正整數 [負數則結束]: -1 共輸⼊入 3 個數字.
總和是 12
平均是 4.000000 最⼤大值是 5
!101
【範例】 sts.cpp
【範例】迴圈的基本
試寫⼀一程式,印出由 1 ⾄至 100 間的整數
!
!
!
!
!
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,印出 1
⾄至該正整數 N 間的整數
1 2 3 4 5 6 ... 100
!102
【範例】 int.cpp
【範例】 int100.cpp
習題 [1]
[E0301] 試寫⼀一程式,輸⼊入⼀一個 0 ~ 100 分的成 績,輸出成績的等第:(A: 80~100, B: 70~79, C:
60~69), F (0 ~ 59)
!
!
[E0302] 試寫⼀一個程式,讓使⽤用者輸⼊入四個數字後 印出最⼤大與最⼩小值
[E0303] 試寫⼀一個程式,讓使⽤用者輸⼊入四個數字後 將數字由⼩小⾄至⼤大排列顯⽰示
範例輸⼊入⼀一: 90 範例輸出⼀一: A 範例輸⼊入⼆二: 40 範例輸出⼆二: F 範例輸⼊入三: 70 範例輸出三: B
!103
習題 [2]
[E0304] 試寫⼀一程式,輸⼊入⽉月份,顯⽰示該⽉月份的季 節 (春[3.4.5⽉月]、夏[6.7.8⽉月]、秋[9.10.11⽉月]或 冬 [12.1.2]⽉月)
[E0305] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一⻄西元年份 (<5000),輸出該年是否是閏年
每四年⼀一閏、每百年不閏、每四百年⼀一閏、每四千年不 閏
[E0306] 試寫⼀一程式,輸⼊入平⾯面上某點的 x 座標值 與 y 座標值,顯⽰示該點是位於原點、第幾象限或者 位於哪個座標軸上
!104
習題 [3]
[E0307] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,顯⽰示 1 ⾄至 N 之間的所有偶數
[E0308] 試寫⼀一程式,計算某⼈人跑 100 公尺,每秒 鐘會跑剩下距離的⼀一半,要過幾秒鐘才會跑到接近終 點⼩小於 1 公尺
[E0309] 試寫⼀一程式,印出所有 1 ~ 100 間所有 3 的倍數
[E0310] 試寫⼀一程式,輸⼊入⼀一個整數,印出所有該 整數的因數 (因數表⽰示所有可以整除該整數的數字)
範例輸⼊入: 10 範例輸出: 1 2 5 10
!105
習題 [4]
[E0311] 試寫⼀一程式,讓使⽤用者依序輸⼊入賣出商品 編號後,顯⽰示商品賣出的總⾦金額。(商品可以重複) (輸⼊入編號 0 的商品代表輸⼊入完畢)
商品編號 商品⾦金額
1 90
2 75
3 83
4 89
5 71
範例輸⼊入:
1 5 5 4 1 0
範例輸出:
共 411 元
!106
習題 [5]
[E0312] 試寫⼀一程式,印出所有 1 ~ 100 間所有 3 的倍數且不是 5 的倍數的整數
[E0313] (韓信點兵) 韓信要算操場上的兵,三個⼀一 數發現剩下⼀一個,五個⼀一數發現剩下三個,七個⼀一數 發現剩下兩個。試寫⼀一程式去找出到底操場上有多少 兵 ?(輸出最⼩小值)
[E0314] 試寫⼀一程式,計算個位數為 6 且可被 3 整 除的五位正整數有幾個
[E0315]* 試寫⼀一程式,找出⼀一個四位正整數,他 的反序數正好是這個四位正整數的 9 倍
反序數: 1325 的反序數是 5231
!107
習題 [6]
[E0316] [質數檢驗] 試寫⼀一程式,輸⼊入某個正整數 N,判斷 N 是不是質數
質數表⽰示除了 1 跟本⾝身以為沒有其他的因數
[E0317] [列出質數] 試寫⼀一程式,顯⽰示 1 到 1000 間所有的質數
!108
習題 [7]
[E0318] 試寫⼀一程式,輸⼊入⼗十個 0 ~ 100 分的成 績,輸出各等第的統計⼈人數:(A: 80~100, B:
70~79, C: 60~69), F (0 ~ 59)
[E0319*] 試寫⼀一程式,讓使⽤用者輸⼊入⼗十個成績 (0~100) 後,印出將最⼤大與最⼩小值去掉後的其他⼋八 個成績的總和與平均值
[E0320] 試寫⼀一程式,印出所有英⽂文字⺟母 [E0321] 輸⼊入⼀一整數,顯⽰示其為幾位數
[E0322]* 試寫⼀一程式,讓使⽤用者輸⼊入⼀一整數後將 順序顛倒顯⽰示。
範例輸⼊入:
39861
範例輸出:
16893
!109
習題 [8]
[E0323] 試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,
顯⽰示最⼤大的數字
[E0324] 試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,
依序顯⽰示最⼤大的兩個數字
[E0325] 試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,
依序顯⽰示最⼤大的三個數字
!110
習題 [9]
[E0326] 試寫⼀一程式,讓使⽤用者輸⼊入五位整數後,
判斷該整數是否是回⽂文
回⽂文指的是該數字由左⾄至右或由右⾄至左的數字是⼀一樣的
例如 : 12321,11911,39893 等...
!
!
!
[E0327]* 試寫⼀一程式,讓使⽤用者輸⼊入任意位整數 後,判斷該整數是否為回⽂文
Please enter an integer: 86312 No.
Please enter an integer: 12321 Yes.
!111
習題 [10]
[E0328] 試寫⼀一程式,讓使⽤用者分別輸⼊入每個學⽣生 的成績,輸⼊入負數則代表結束。輸⼊入完後,顯⽰示學⽣生 成績的統計圖:
級距為 (0~59, 60~69, 70~79, 80~89, 90~100)
請輸⼊入 1 號成績: 80 請輸⼊入 2 號成績: 85 請輸⼊入 3 號成績: 90 請輸⼊入 4 號成績: 95 請輸⼊入 5 號成績: 75 請輸⼊入 6 號成績: -1 0~ 59 :
60~ 69 : 70~ 79 : * 80~ 89 : **
90~100 : **
!112
習題 [11]
[E0329] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一整數後將每 位數分開顯⽰示
!
!
!
[E0330*] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一個整數後,
將該整數⽤用⼆二進位表⽰示
範例輸⼊入:
49556 範例輸出:
4 9 5 5 6
範例輸⼊入⼀一:
5
範例輸出⼀一:
101 範例輸⼊入⼆二:
3
範例輸出⼆二:
11
!113
習題 [12]
[E0331] 試寫⼀一程式,讓使⽤用者輸⼊入⻑⾧長⽅方形的⻑⾧長與 寬後,⽤用⽂文字⽅方式畫出實⼼心與空⼼心的⽅方塊:
**********
* *
* *
**********
範例輸出:
**********
**********
**********
**********
範例輸⼊入:
請輸⼊入寬度 : 10 請輸⼊入⾼高度 : 4
!114
習題 [13]
[E0332] 試寫⼀一程式,印出下列結果:
!
!
!
[E0333] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整 數,印出下列結果:
* **
*** ****
*****
範例輸⼊入⼀一:
5 範例輸出⼀一:
* **
*** ****
*****
範例輸⼊入⼆二:
3 範例輸出⼆二:
* **
***
!115
[E0334*] 試寫⼀一程式,讓使⽤用者輸⼊入某個⽉月份後,
顯⽰示⻄西元 2011 該⽉月份的⽇日曆
2012 年 1 ⽉月 1 ⽇日是星期⽇日,2 ⽉月有 29 天
Please enter the month: 3
Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
習題 [14]
!116
習題 [15]
[E0335] 試寫⼀一猜數字遊戲,輸⼊入四個 1 ⾄至 9 各不 相同的數字後,如果某個數字的位置與號碼都正確則 算⼀一個 A,如果號碼正確但是位置不正確則算⼀一個 B,將 A 與 B 的次數顯⽰示給使⽤用者看後,讓使⽤用者 猜到猜對為⽌止!
!117
請輸⼊入答案: 1234
請輸⼊入你的猜測: 4321 0A4B
請輸⼊入你的猜測: 1324 2A2B
請輸⼊入你的猜測: 6789 0A0B
請輸⼊入你的猜測: 1234 4A
恭喜你答對了!