TQC+ Python 第2版|第二章「選擇敘述與迴圈」詳解答案
BY PJ.
-2025 年 6 月 26 日
(最後更新於: 2025 年 6 月 26 日)
習題 1:往上取整數
-
題目描述
請撰寫一程式,讓使用者輸入一個數值 n,然後輸出大於 n 的最小整數。 -
輸入輸出
(a) 輸入說明:一個數值
(b) 輸出說明:大於 n 的最小整數 -
範例
提示:本題的目的在撰寫所謂的天花板函數 (ceiling function)。
參考解法
import math
n = eval(input("請輸入一個數值:"))
print(math.ceil(n))
習題 2:計算 XOR
-
題目描述
請撰寫一程式,讓使用者輸入兩個布林值 A、B,計算並輸出 A XOR B 的值。 -
輸入輸出
(a) 輸入說明:兩個布林值 A, B(以逗點隔開)
(b) 輸出說明:A XOR B -
範例
提示:請先確定 XOR 的真值表,再看看如何用 and, or, not 來實現。
參考解法
tf = input("請輸入兩個布林值,以逗點隔開:")
tf_list = [x.strip().lower() for x in tf.split(',')] #去除空白及統一改為小寫
#XOR 只有在兩者不同時才為真。
print(f'A XOR B = {tf_list[0] != tf_list[1]}')
習題 3:計算導數值
- 題目描述
請撰寫一程式,讓使用者輸入一個數 a,並給定一個函數 f(x) 如下,請計算 f(x) 在 x=a 的導數值 (derivative)。
注意:請利用導數的極限定義來計算,勿直接將導數寫在程式碼裡。
- 輸入輸出
(a) 輸入說明:一個數值 a
(b) 輸出說明:函數 f(x) 在 x = a 的導數值
- 範例
- 提示
若函數 f(x) 於 x=a 有定義,且以下極限存在,則 f(x) 在 x=a 的導數值為:
參考解法
def f(x):
y = (3 * x ** 4 - 7 * x ** 2 + 5) / x
return y
def derivative(a,h=1e-7):
y = (f(a+h) - f(a)) / h
return y
a = eval(input('請輸入一個數值a:'))
if a != 0:
print(f"導數值 = {derivative(a)}")
else:
print("當 x = 0 時,導數不存在。")
習題 4:英制與公制互換
-
題目描述
國外長度單位常使用「英制單位」,例如身高常使用英呎、英吋表示。請撰寫一程式,讓使用者選擇長度單位,並將其輸入的身高進行英制與公制互換。 -
輸入輸出
(a) 輸入說明:選擇長度單位,並輸入要轉換的英制或公制身高。
(b) 輸出說明:依選擇的長度單位,轉換到另一個長度單位的身高。 -
範例
提示:1 英呎 = 12 英吋,1 英吋 = 2.54 公分。
參考解法
method = input("請選擇長度單位(1->英呎、英吋;2->公分):")
if method == '1':
feet = eval(input("英呎 = "))
inches = eval(input("英吋 = "))
print(f"公分 = {feet * 12 * 2.54 + inches * 2.54}")
elif method == '2':
cm = eval(input("公分 = "))
inches = cm / 2.54
feet = inches // 12
inches = inches % 12
print(f"{feet} 英呎,{inches} 英吋")
習題 5:成績評等
-
題目描述
請撰寫一程式,讓使用者輸入「微積分」與「計算機程式」成績(滿分100)。如果微積分與程式成績皆 90(含)以上,則顯示「超優等」;如果只有微積分 90(含)以上,則顯示「優等」;若微積分 90 分以下,則一律顯示「甘罷嗲」。 -
輸入輸出
(a) 輸入說明:微積分
與計算機程式
成績(滿分100)
(b) 輸出說明:依兩科成績輸出「超優等」、「優等」或「甘羅嗡」 -
範例
計算機程式成績:95
計算機程式成績:80
計算機程式成績:95
參考解法
score1 = eval(input("微積分成績:"))
score2 = eval(input("計算機程式成績:"))
if score1 >= 90 and score2 >= 90:
print("超優等")
elif score1 >= 90:
print("優等")
else:
print("甘罷嗲")
習題 6:判斷數字性質
-
題目描述
請撰寫一程式,讓使用者輸入五個數值,計算並輸出下列數量:奇數、偶數、正數、負數、浮點數。 -
輸入輸出
(a) 輸入說明:輸入五個數值
(b) 輸出說明:輸出奇數、偶數、正數、負數及浮點數數量 -
範例
-48
19
-91.3425
22.333
偶數 1 個
浮點數 2 個
正數 3 個
負數 2 個
提示:
(a) 0 為偶數
(b) 既不是正數也不是負數
(c) 奇偶數僅適用於整數
參考解法
# 讀取 5 個數值
nums = []
for i in range(1, 6):
x = eval(input(f"請輸入第 {i} 個數值:"))
nums.append(x)
print(nums)
# 初始化計數器
count_odd = 0 # 奇數
count_even = 0 # 偶數(包括 0)
count_float = 0 # 浮點數(非整數)
count_positive = 0 # 正數
count_negative = 0 # 負數
# 逐一判斷
for x in nums:
# 先判斷整數或浮點
if x.is_integer():
# 是整數,再判奇偶
if x % 2 == 0:
count_even += 1
else:
count_odd += 1
else:
# 非整數就是浮點
count_float += 1
# 判斷正負(0 不算正也不算負)
if x > 0:
count_positive += 1
elif x < 0:
count_negative += 1
# 輸出
print(f"奇數 {count_odd} 個")
print(f"偶數 {count_even} 個")
print(f"浮點數 {count_float} 個")
print(f"正數 {count_positive} 個")
print(f"負數 {count_negative} 個")
習題 7:一元二次方程式
-
題目描述
請撰寫一程式,讓使用者輸入三個數值 a、b、c,其中 a ≠ 0,代表一元二次方程式 ax² + bx + c = 0,請輸出這個方程式的實數根;若無實數根也輸出「無實數根」的訊息。 -
輸入輸出
(a) 輸入說明:三個數值,以逗點隔開。
(b) 輸出說明:若有實數根則直接輸出,否則輸出「無實數根」。 -
範例
0.8195395782836301
5.0
提示:判別式 b² - 4ac ≥ 0 即有實數根,否則無實數根。
參考解法
import math
# 1. 讀取輸入
raw = input("請輸入三個數,以逗號隔開:")
parts = [s.strip() for s in raw.split(',')]
# 轉成數值
a = eval(parts[0])
b = eval(parts[1])
c = eval(parts[2])
# 計算判別式
D = b*b - 4*a*c
# 根據判別式決定輸出
if a == 0: #a不能為0
print("無實數根")
elif D >= 0:
x1 = (-b + math.sqrt(D)) / (2*a)
x2 = (-b - math.sqrt(D)) / (2*a)
print(x1)
print(x2)
else:
# 無實數根
print("無實數根")
習題 8:判斷質數
-
題目描述
請撰寫程式讓使用者輸入一個正整數,判斷該數是否為質數 (prime number)。 -
輸入輸出
(a) 輸入說明:一個正整數 n
(b) 輸出說明:判斷 n 是否為質數 -
範例
提示:質數是指在大於 1 的自然數中,除 1 和該數自身外,無法被其他自然數整除的數。
參考解法
N = eval(input("請輸入一個正整數:"))
for n in range(2, int(N/2) + 1):
if N % n == 0: #可被小於自己的數被整除
print(f"{N} 不是質數")
print(n)
break
else: #迴圈結束,沒有碰到break
print(f"{N} 是質數")
習題 9:輸出九九乘法表
-
題目描述
請撰寫一程式,以巢狀迴圈輸出九九乘法表的表格。 -
輸入輸出
九九乘法的表格 -
範例
九九乘法表
1 2 3 4 5 6 7 8 9
----------------------------------------
1 | 1 2 3 4 5 6 7 8 9
2 | 2 4 6 8 10 12 14 16 18
3 | 3 6 9 12 15 18 21 24 27
4 | 4 8 12 16 20 24 28 32 36
5 | 5 10 15 20 25 30 35 40 45
6 | 6 12 18 24 30 36 42 48 54
7 | 7 14 21 28 35 42 49 56 63
8 | 8 16 24 32 40 48 56 64 72
9 | 9 18 27 36 45 54 63 72 81
參考解法
# 1. 標題
print("九九乘法表")
# 2. 欄位標頭(留3個空格給列標籤)
print(" ", end="")
for j in range(1, 10):
print(f"{j:>4}", end="") #數字前空3位
print(" ", end="") #結束再空2位
print() # 換行
# 3. 分隔線(3*9+1 的長度)
print(" --", end="")
print("-" * (4 * 9 + 2))
# 4. 主體
for i in range(1, 10):
# 列標籤
print(f"{i} |", end="")
# 內層跑乘數
for j in range(1, 10):
print(f"{i*j:>4}", end="")
print(" ", end="")
print() # 換行到下一列
習題 10:數字金字塔
-
題目描述
請撰寫程式讓使用者輸入一個正整數,並輸出對應的數字金字塔。 -
輸入輸出
(a) 輸入說明:一個正整數 n
(b) 輸出說明:對應的數字金字塔 -
範例
1
2 1 2
3 2 1 2 3
1
2 1 2
3 2 1 2 3
4 3 2 1 2 3 4
5 4 3 2 1 2 3 4 5
6 5 4 3 2 1 2 3 4 5 6
7 6 5 4 3 2 1 2 3 4 5 6 7
參考解法
# 讀取輸入
n = int(input("請輸入一個正整數:"))
# 逐列印出金字塔
for i in range(1, n+1):
# 計算前置空白:每少一層就少兩個空格,並且預設先空一格
space = ' ' * ((n - i) * 2 + 1)
# 產生「遞減」序列 i, i-1, ..., 1
left = [str(j) for j in range(i, 0, -1)]
# 產生「遞增」序列 2, 3, ..., i(1由遞減序列寫,所以從 2 開始)
right = [str(j) for j in range(2, i+1)]
# 合併序列,並以空格連接
line = ' '.join(left + right)
# 如果是最後一列,就不印換行
end_char = '\n' if i < n else ''
print(f"{space}{line}{space}", end=end_char)