TQC+ Python 第2版|第三章「函式與陣列」詳解答案
BY PJ.
-2025 年 7 月 3 日
(最後更新於: 2025 年 7 月 24 日)
習題 1:計算寶可夢 CP 值
-
題目描述
請撰寫一程式,讓使用者輸入三隻寶可夢的資料,每隻寶可夢有四筆資料,並依公式計算 CP 值後再按格式(整數)輸出。 -
輸入輸出
(a) 輸入說明:四組資料
(b) 輸出說明:計算 CP 值後以整數輸出 -
範例
level: 10
sp: 5
iv: 14
level: 8
sp: 4
iv: 10
level: 20
sp: 6
iv: 15
皮卡丘 -> 595
小火龍 -> 224
請假王 -> 1543
提示:計算公式為
參考解法
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」則結束輸入,接著再輸出排序後的成績、總成績以及平均成績(四捨五入至小數點後第二位)。
-
輸入輸出
(a) 輸入說明:成績
(b) 輸出說明:排序後的成績、總成績以及平均成績(四捨五入至小數點後第二位) -
範例
輸入成績: 90
輸入成績: 100
輸入成績: 70
輸入成績: 32
輸入成績: -1
總成績: 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 的數如果恰好等於它的因數(自己除外)總和,這個數就稱為完全數。例如:
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) 輸出說明:出現次數最多的英文字母及其出現次數(區分大小寫) -
範例
總共出現 8 次
總共出現 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) 輸出說明:列總和和最大值及其列索引值 -
範例
請輸入兩個數值,並以逗點隔開: 39,52
請輸入兩個數值,並以逗點隔開: 44,48
參考解法
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 個點座標 (輸入 0,0 則結束): -3,-2
第 2 個點座標 (輸入 0,0 則結束): 2,3
第 3 個點座標 (輸入 0,0 則結束): 1,1
第 4 個點座標 (輸入 0,0 則結束): 0,0
最近兩點為: [2, 3] [1, 1]
距離 = 2.23606797749979
第 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
最近兩點為: [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) 輸出說明:排序後的結果 -
範例
參考解法
nums = input('請輸入三個數字,數字間以逗點隔開:')
num_list = nums.split(',')
num_list.sort()
print('排序結果:',' '.join(num_list))
習題 8:攝氏華氏轉換
-
題目描述
請撰寫一程式,讓使用者選擇要輸入華氏還是攝氏溫度,接著將使用者的選擇傳遞到名為溫度轉換()
的函式,再輸入溫度數值,計算並輸出溫度轉換的結果。 -
輸入輸出
(a) 溫度單位【華氏(1)/攝氏(2)】及數值
(b) 輸出說明:溫度轉換的結果 -
範例
溫度數值(華氏) = 50
溫度數值(攝氏) = 50
提示
- 攝氏溫度 = (華氏溫度 − 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 的上方、下方或線上
p0(x, y) = 1,5
p1(x, y) = 3,9
q(x, y) = 4,2
參考解法
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