TQC+ Python 第2版|第二章「選擇敘述與迴圈」詳解答案

BY PJ. -2025 年 6 月 26 日
(最後更新於: 2025 年 6 月 26 日)


Chapter 2 選擇敘述與迴圈 習題

習題 1:往上取整數

  • 題目描述
    請撰寫一程式,讓使用者輸入一個數值 n,然後輸出大於 n 的最小整數。

  • 輸入輸出
    (a) 輸入說明:一個數值
    (b) 輸出說明:大於 n 的最小整數

  • 範例

> 範例輸入1
請輸入一個數值:3.633
> 範例輸出1
4
> 範例輸入2
請輸入一個數值:56
> 範例輸出2
56
> 範例輸入3
請輸入一個數值:-2.263
> 範例輸出3
-2

提示:本題的目的在撰寫所謂的天花板函數 (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

  • 範例

> 範例輸入1
True, False
> 範例輸出1
A XOR B = True
> 範例輸入2
False, False
> 範例輸出2
A XOR B = False

提示:請先確定 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)。

fx function

注意:請利用導數的極限定義來計算,勿直接將導數寫在程式碼裡。

  • 輸入輸出

(a) 輸入說明:一個數值 a
(b) 輸出說明:函數 f(x) 在 x = a 的導數值

  • 範例
> 範例輸入1
2
> 範例輸出1
導數值 = 27.750001851956085
> 範例輸入2
0
> 範例輸出2
當 x = 0 時,導數不存在。
  • 提示

若函數 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
請選擇長度單位 (1->英呎、英吋;2->公分):1 英呎 = 6 英吋 = 3
> 範例輸出1
公分 = 190.5
> 範例輸入2
請選擇長度單位 (1->英呎、英吋;2->公分):2 公分 = 191
> 範例輸出2
6.0 英呎,3.196850 英吋

提示: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) 輸出說明:依兩科成績輸出「超優等」、「優等」或「甘羅嗡」

  • 範例

> 範例輸入1
微積分成績:91
計算機程式成績:95
> 範例輸出1
超優等
> 範例輸入2
微積分成績:90
計算機程式成績:80
> 範例輸出2
優等
> 範例輸入3
微積分成績:80
計算機程式成績:95
> 範例輸出3
甘罷嗲
  • 參考解法
score1 = eval(input("微積分成績:"))
score2 = eval(input("計算機程式成績:"))

if score1 >= 90 and score2 >= 90:
    print("超優等")
elif score1 >= 90:
    print("優等")
else:
    print("甘罷嗲")

習題 6:判斷數字性質

  • 題目描述
    請撰寫一程式,讓使用者輸入五個數值,計算並輸出下列數量:奇數、偶數、正數、負數、浮點數。

  • 輸入輸出
    (a) 輸入說明:輸入五個數值
    (b) 輸出說明:輸出奇數、偶數、正數、負數及浮點數數量

  • 範例

> 範例輸入
69
-48
19
-91.3425
22.333
> 範例輸出
奇數 2 個
偶數 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) 輸出說明:若有實數根則直接輸出,否則輸出「無實數根」。

  • 範例

> 範例輸入1
3,-11,7
> 範例輸出1
2.8471270883830364
0.8195395782836301
> 範例輸入2
1,-10,25
> 範例輸出2
5.0
5.0
> 範例輸入3
5,10,20
> 範例輸出3
無實數根

提示:判別式 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
2
> 範例輸出1
2 是質數
> 範例輸入2
9487
> 範例輸出2
9487 不是質數
> 範例輸入3
1
> 範例輸出3
1 不是質數

提示:質數是指在大於 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
3
> 範例輸出1
     1     
   2 1 2   
 3 2 1 2 3 
> 範例輸入2
7
> 範例輸出2
             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)


#TQC #Python #TQCPython第2版 #TQCPython第二版 #選擇敘述與迴圈 #Python認證 #Python教學 #Python基礎證照 #Python入門

💬 留言區