TQC+ Python 第2版|第三章「函式與陣列」詳解答案

BY PJ. -2025 年 7 月 3 日
(最後更新於: 2025 年 7 月 24 日)


Chapter 3 函式與陣列 習題

習題 1:計算寶可夢 CP 值

  • 題目描述
    請撰寫一程式,讓使用者輸入三隻寶可夢的資料,每隻寶可夢有四筆資料,並依公式計算 CP 值後再按格式(整數)輸出。

  • 輸入輸出
    (a) 輸入說明:四組資料
    (b) 輸出說明:計算 CP 值後以整數輸出

  • 範例

> 範例輸入1
Name: 皮卡丘
level: 10
sp: 5
iv: 14
Name: 小火龍
level: 8
sp: 4
iv: 10
Name: 請假王
level: 20
sp: 6
iv: 15
> 範例輸出1
=== CP 值列表 ===
皮卡丘 -> 595
小火龍 -> 224
請假王 -> 1543

提示:計算公式為

cp公式

  • 參考解法
import math

def pokemon(level,sp,iv):
    cp = (level / 10) * (sp + iv) * math.sqrt(sp * iv ** 2)
    return cp

name_list = []
cp_list = []

for _ in range(3):
    name = input("Name:")
    l = eval(input("level:"))
    s = eval(input("sp:"))
    i = eval(input("iv:"))
    cp = int(round(pokemon(l, s, i)))

    name_list.append(name)
    cp_list.append(cp)

print("=== CP 值列表 ===")
for i in range(3):
    print(f"{name_list[i]} -> {cp_list[i]}")

習題 2:計算成績

  1. 題目說明 請撰寫一程式,讓使用者重複輸入成績,輸入「-1」則結束輸入,接著再輸出排序後的成績、總成績以及平均成績(四捨五入至小數點後第二位)。

  2. 輸入輸出
    (a) 輸入說明:成績
    (b) 輸出說明:排序後的成績、總成績以及平均成績(四捨五入至小數點後第二位)

  3. 範例

> 範例輸入1
輸入成績: 80
輸入成績: 90
輸入成績: 100
輸入成績: 70
輸入成績: 32
輸入成績: -1
> 範例輸出1
成績排序: [32, 70, 80, 90, 100]
總成績: 372
平均成績: 74.40
  • 參考解法
scores = []

while True:
    score = eval(input("輸入成績:"))
    if score == -1:
        break
    else:
        scores.append(score)

print("成績排序:" , sorted(scores))
print(f"總成績: {sum(scores)}")
print(f"平均成績: {sum(scores) / len(scores):.2f}")

習題 3:尋找完全數

  • 題目描述
    請撰寫一程式,讓使用者輸入一個正整數 num,計算並輸出所有小於 num 的完全數(perfect number)。

  • 輸入輸出
    (a) 輸入說明:一個正整數 num
    (b) 輸出說明:所有小於 num 的完全數

  • 範例

> 範例輸入1
請輸入一個正整數: 100
> 範例輸出1
小於 100 的完全數: 6 28
> 範例輸入2
請輸入一個正整數: 5
> 範例輸出2
找不到小於 5 的完全數

提示
一個大於 1 的數如果恰好等於它的因數(自己除外)總和,這個數就稱為完全數。例如:
6 = 1 + 2 + 3 → 6 是完全數
8 ≠ 1 + 2 + 4 → 8 不是完全數

  • 參考解法
num = eval(input("請輸入一個正整數:"))
perfect_nums = []

def find_perfect_num(n):
    cnt = 0
    for i in range(1,int(n/2+1)):
        if n % i == 0: #因數
            cnt += i
    if cnt == n: #完全數
        return True
    else:
        return False


for j in range(1,num): #將小於num的完全數放入list
    if find_perfect_num(j):
        perfect_nums.append(j)

if len(perfect_nums) == 0:
    print(f'找不到小於 {num} 的完全數')
else:
    print(f"小於 {num} 的完全數:",end="")
    for p in perfect_nums:
        print(f" {p}",end="")

習題 4:計算字母出現次數

  • 題目描述
    請撰寫一程式,讓使用者輸入一段英文字句,計算並輸出出現次數最多的英文字母及其出現次數(區分大小寫)。

  • 輸入輸出
    (a) 輸入說明:一段英文字句
    (b) 輸出說明:出現次數最多的英文字母及其出現次數(區分大小寫)

  • 範例

> 範例輸入1
請輸入: Behind the mountains there are people to be found.
> 範例輸出1
出現次數最多: e
總共出現 8 次
> 範例輸入2
請輸入: Do one thing at a time, and do well.
> 範例輸出2
出現次數最多: o
總共出現 3 次

提示:利用內建函示 list(字串變數) 可分離出每個字元,並回傳一個字元的串列。

  • 參考解法
def most_common_letter(text):
    letters = list(text)
    letters = [l for l in letters if l.isalpha()] #只取出英文字母

    max_char = letters[0] #初始化出現最多字母
    max_fequece = 0 #初始化出現最多次數

    for u in letters:
        cnt = letters.count(u)
        if cnt > max_fequece:
            max_char = u
            max_fequece = cnt
    return max_char,max_fequece


words = input("請輸入:")
#words = 'Do one thing at a time, and do well'
max_char,max_fequece = most_common_letter(words)
print(f"出現次數最多: {max_char}")
print(f"總共出現: {max_fequece} 次")

習題 5:尋找列的最大總和

  • 題目描述
    請撰寫一程式,讓使用者輸入三列資料,每列由兩個數值且數值間以逗點隔開,計算並輸出列總和和最大值及其列索引值。

  • 輸入輸出
    (a) 輸入說明:三列資料,每列由兩個數值且數值間以逗點隔開。
    (b) 輸出說明:列總和和最大值及其列索引值

  • 範例

> 範例輸入
請輸入兩個數值,並以逗點隔開: 35,55
請輸入兩個數值,並以逗點隔開: 39,52
請輸入兩個數值,並以逗點隔開: 44,48
> 範例輸出
第 2 列有列總和和最大值為 92
  • 參考解法
value_list = []

for i in range(3):
    values = input('請輸入兩個數值,並以逗點隔開:').split(',')
    value = sum([eval(v) for v in values]) #將各列數值轉換格式後加總
    value_list.append(value)

max_value = max(value_list)
max_index = value_list.index(max_value)

print(f"第 {max_index} 列有列總和最大值為 {max_value}")

習題 6:找出最近的兩點

  • 題目描述
    請撰寫一程式,讓使用者輸入二維平面的點座標,每個點座標輸入時有兩個數值,並以逗點隔開,輸入 0,0 則結束。計算這些輸入的點集合中,彼此歐式距離最近的兩點,並輸出點座標與距離值。

  • 輸入輸出
    (a) 輸入說明:八個二維平面的點座標
    (b) 輸出說明:歐式距離最近的兩點與距離值

  • 範例

> 範例輸入1
每個點座標有兩個數值,輸入時以逗點隔開 (例如 2,3)
第 1 個點座標 (輸入 0,0 則結束): -3,-2
第 2 個點座標 (輸入 0,0 則結束): 2,3
第 3 個點座標 (輸入 0,0 則結束): 1,1
第 4 個點座標 (輸入 0,0 則結束): 0,0
> 範例輸出1
座標點個數 = 3
最近兩點為: [2, 3] [1, 1]
距離 = 2.23606797749979
> 範例輸入2
每個點座標有兩個數值,輸入時以逗點隔開 (例如 2,3)
第 1 個點座標 (輸入 0,0 則結束): -1,3
第 2 個點座標 (輸入 0,0 則結束): -1,-1
第 3 個點座標 (輸入 0,0 則結束): 1,1
第 4 個點座標 (輸入 0,0 則結束): 2,0.5
第 5 個點座標 (輸入 0,0 則結束): 2,-1
第 6 個點座標 (輸入 0,0 則結束): 3,3
第 7 個點座標 (輸入 0,0 則結束): 4,2
第 8 個點座標 (輸入 0,0 則結束): 4,-0.5
第 9 個點座標 (輸入 0,0 則結束): 0,0
> 範例輸出2
座標點個數 = 8
最近兩點為: [1, 1] [2, 0.5]
距離 = 1.118033988749895

提示 歐式距離公式

  • 參考解法
import math

idx = 1
points = []
print('每個點座標有兩個數值,輸入時以逗點隔開(例如 2,3)')

while True:
    point = input(f'第 {idx} 個點座標(輸入0,0則結束): ').strip()
    x,y = point.split(',')
    x,y = eval(x),eval(y)
    if x == 0 and y == 0:
        break
    else:
        points.append((x,y))
        idx += 1

def distance(x1,y1,x2,y2):
    d = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
    return d

n = len(points)

min_dist = float('inf') #無限大
pair = (None, None)

for i in range(n):
    for j in range(i+1,n):
        x1,y1 = points[i]
        x2,y2 = points[j]
        dist = distance(x1,y1,x2,y2)
        if dist < min_dist :
            min_dist = dist
            pair = ((x1,y1),(x2,y2))

print(f'座標點個數 = {n}')
print(f'最近兩點為 = {pair[0]} {pair[1]}')
print(f'距離 = {min_dist}')

習題 7:排序三個數

  • 題目描述
    請撰寫一程式,讓使用者輸入三個數字,接著將這三個數字傳遞到函式內,經排序後再輸出結果。

  • 輸入輸出
    (a) 輸入說明:三個數字,數字間以逗點隔開
    (b) 輸出說明:排序後的結果

  • 範例

> 範例輸入1
請輸入三個數字,數字間以逗點隔開: 5, 3.8, 3
> 範例輸出1
排序結果: 3 3.8 5
> 範例輸入2
請輸入三個數字,數字間以逗點隔開: -5, 0, -2
> 範例輸出2
排序結果: -5 -2 0
> 範例輸入3
請輸入三個數字,數字間以逗點隔開: 3.14, -2.13, 1.23
> 範例輸出3
排序結果: -2.13 1.23 3.14
  • 參考解法
nums = input('請輸入三個數字,數字間以逗點隔開:')

num_list = nums.split(',')
num_list.sort()

print('排序結果:',' '.join(num_list))

習題 8:攝氏華氏轉換

  • 題目描述
    請撰寫一程式,讓使用者選擇要輸入華氏還是攝氏溫度,接著將使用者的選擇傳遞到名為 溫度轉換() 的函式,再輸入溫度數值,計算並輸出溫度轉換的結果。

  • 輸入輸出
    (a) 溫度單位【華氏(1)/攝氏(2)】及數值
    (b) 輸出說明:溫度轉換的結果

  • 範例

> 範例輸入1
溫度單位【華氏(1)/攝氏(2)】 = 1
溫度數值(華氏) = 50
> 範例輸出1
華氏50 -> 攝氏10.0
> 範例輸入2
溫度單位【華氏(1)/攝氏(2)】 = 2
溫度數值(攝氏) = 50
> 範例輸出2
攝氏50 -> 華氏122.0
> 範例輸入3
溫度單位【華氏(1)/攝氏(2)】 = 0
> 範例輸出3
麥來亂!!

提示
- 攝氏溫度 = (華氏溫度 − 32) × 5/9
- 華氏溫度 = (攝氏溫度 × 9/5) + 32

  • 參考解法
choice = input('溫度單位【華氏(1)/攝氏(2)】= ')

def 溫度轉換(choice):
    if choice == '1':
        tp = eval(input('溫度數值(華氏) = '))
        tp_ = (tp - 32)* 5 / 9
        print(f'華氏{tp} -> 攝氏{tp_:.1f}')
    elif choice == '2':
        tp = eval(input('溫度數值(攝氏) = '))
        tp_ = (tp * 9 / 5) + 32
        print(f'攝氏{tp} -> 華氏{tp_:.1f}')
    else:
        print('麥來亂!!')

溫度轉換(choice)

習題 9:平面的點與直線關係

  • 題目描述
    請撰寫一程式,讓使用者輸入平面上的三個點座標 p0(x₀, y₀)、p1(x₁, y₁)、q(x, y),判斷 q 點位於 p0 與 p1 所形成直線 L 的上方、下方或線上。程式需包含以下兩個函式:

    (a) line_equation(x0, y0, x1, y1) - 目的:計算以 p0, p1 兩點形成的直線 L - 輸入:兩個點座標,共四個參數 - 回傳:直線 L (可將係數存成串列再回傳)
    (b) position(lst, q_x, q_y) - 目的:計算 q 點相對於 L 的位置(上/下/線上) - 輸入:一個係數串列與一個點座標 - 回傳:無

  • 輸入輸出
    (a) 輸入說明:平面上的三個點座標 p0, p1, q
    (b) 輸出說明:判斷 q 點位於 p0 與 p1 所形成直線 L 的上方、下方或線上

> 範例輸入兩點座標
== 請輸入兩個點座標,每個點座標的 x, y 值間以逗點隔開 ==
p0(x, y) = 1,5
p1(x, y) = 3,9
> 範例輸出直線方程式
直線方程式:y = 2.0x + 3.0
> 範例輸入 點座標 1
== 請輸入一個點座標,輸入 0,0 則離開程式 ==
q(x, y) = 4,2
> 範例輸出 判斷結果 1
點 q(4,2) 在直線 L: y=2.0x+3.0 的下面
> 範例輸入 點座標 2
q(x, y) = 2,10
> 範例輸出 判斷結果 2
點 q(2,10) 在直線 L: y=2.0x+3.0 的上面
> 範例輸入 點座標 3
q(x, y) = -1,-1
> 範例輸出 判斷結果 3
點 q(-1,-1) 在直線 L: y=2.0x+3.0 的下面
> 範例輸入 點座標 4
q(x, y) = 0,0
> 範例輸出 判斷結果 4
點 q(0,0) 在直線 L: y=2.0x+3.0 的下面
  • 參考解法
def line_euqation(x0,y0,x1,y1):
    a = (y1 - y0) / (x1 - x0) #斜率
    b = y0 - a * x0 #常數
    return a , b

def position(coeff,qx,qy):
    a ,b = coeff
    line_y = a * qx + b #代入qx點座標,在線上的y座標

    if qy > line_y:
        positon = '上面'
    elif qy < line_y:
        positon = '下面'
    else:
        positon = '線上'
    print(f"點 q({qx},{qy}) 在直線 L:y={a}x+{b}{positon}")

#輸出直線方程式
print('==請輸入兩個點座標,每個點座標的x, y值間用逗點隔開==')
p0x,p0y = input('p0(x,y) = ').split(',')
p1x,p1y = input('p1(x,y) = ').split(',')
p0x,p0y = eval(p0x),eval(p0y)
p1x,p1y = eval(p1x),eval(p1y)
a , b = line_euqation(p0x,p0y,p1x,p1y)
print(f'直線方程式:y = {a}x + {b}')

#判斷點在線上面、下面或線上
print('==請輸入一個點座標,輸入0,0則離開程式=')
while True:
    x, y = input('q(x,y) = ').split(',')
    x, y = eval(x),eval(y)
    position((a,b),x,y)
    if x == 0 and y == 0:
        break


#TQC #Python #TQCPython第2版 #TQCPython第二版 #函式與陣列 #Python認證 #Python教學 #Python基礎證照 #Python入門

💬 留言區