TQC+ Python 第2版|第四章「字串與檔案處理」詳解答案
BY PJ.
-2025 年 7 月 8 日
(最後更新於: 2025 年 7 月 11 日)
習題 1:計算單字數量
-
題目描述
請撰寫一程式,讓使用者輸入一個英文字句,計算並輸出句子內的單字數量。 -
輸入輸出
(a) 輸入說明:一個英文字句
(b) 輸出說明:句子內的單字數量 -
範例
參考解法
sentence = input('')
print(f'單字數量 = {len(sentence.split(' '))}')
習題2:算術運算
-
題目描述
請撰寫一程式,讓使用者輸入數學運算式(包含數字 0~9、加號 +、減號 -),計算並輸出運算結果。 注意:本題禁止直接套用內建函式eval()
到使用者輸入的運算式。 -
輸入輸出
(a) 輸入說明:數學運算式(包含數字 0~9、加號 +、減號 -)
(b) 輸出說明:運算結果 -
範例
參考解法
# 去掉空白
expr = input("輸入運算式:").replace(" ", "")
# 開頭為負號的情況:在最前面補一個 0,讓後面 split 時不會漏掉第一個負數
if expr.startswith('-'):
expr = '0' + expr
# 先以 '+' 切割
parts = expr.split('+')
ans = 0.0
for part in parts:
# 再以 '-' 切割
subparts = part.split('-')
# 加上第一個數字
ans += float(subparts[0])
# 減去後面的每一個數字
for num_str in subparts[1:]:
# subparts[1:] 肯定不是空字串,直接減即可
ans -= float(num_str)
print(f"運算結果:{ans}")
習題3:大小寫轉換
-
題目描述
請撰寫一程式,讓使用者輸入一個英文字句,依下列規則轉換每個單字內字母的大小寫: -
單字字首的大小寫互換
-
除字首外,其餘皆為小寫
-
輸入輸出
(a) 輸入說明:一個英文字句
(b) 輸出說明:依規則轉換後的英文字句 -
範例
參考解法
sentence = input("輸入:")
parts = sentence.split(' ')
new_sentence = []
for part in parts:
new_word = ''
for i in range(len(part)):
if i == 0: #每個單字首字轉換大小寫
if part[i].isupper():
new_word += part[i].lower()
else:
new_word += part[i].upper()
else:
new_word += part[i].lower()
new_sentence.append(new_word)
print('輸出:',' '.join(new_sentence),sep='')
習題4:迴文判斷
-
題目描述
請撰寫一程式,讓使用者輸入一個英文字句,在忽略字母大小寫及標點符號(逗點,
、句點.
、問號?
與空白)的前提下,判斷是否為迴文。 -
輸入輸出
(a) 輸入說明:一個英文字句
(b) 輸出說明:判斷該英文字句是否為迴文,輸出「是迴文」或「不是迴文」 -
範例
提示:迴文(palindrome)是指由左念到右或由右念到左,字母排列順序都一樣的單字、片語、句子,甚至是數字,中間的標點符號、大小寫和間隔可以忽略。例如 deed、level、1221 等。
參考解法
sentence = input('請輸入:')
sentence = [s.lower() for s in sentence if s.isalpha()] #只保留字母且統一轉換小寫
sentence = ''.join(sentence) #列表組合為字串
if sentence == sentence[::-1]:
print('是迴文')
else:
print('不是迴文')
習題5:檢查密碼
-
題目描述
請撰寫一程式,讓使用者輸入密碼,並依下列規則檢查密碼是否有效: -
至少八個字元
- 只包含英文字母與數字
-
至少包含兩個數字 符合上述規則則顯示 「valid password」,否則顯示 「invalid password」。
-
輸入輸出
(a) 輸入說明:一個密碼
(b) 輸出說明:valid password 或 invalid password -
範例
參考解法
pwd = input('請輸入密碼:')
num_cnt = 0
if len(pwd) >= 8:#初始化
valid = True
else:
valid = False
for p in pwd:
if p.isdigit() == True:
num_cnt += 1
elif p.isalpha() == True:
pass
else:#不是數字或字母
valid = False
if num_cnt < 2:
valid = False
if valid:
print('valid password')
else:
print('invalid password')
習題6:單字在檔案中出現的位置
-
題目描述
請撰寫一程式,讓使用者輸入一個英文單字s
,找出它在檔案 06.txt 中的所有位置(以字元編號計);若找不到,輸出 -1。 -
檔案 「06.txt」 部分內容:
animated series and films, a trading card game, and other related media.
The franchise takes...
-
檔案連結: 06.txt
-
輸入輸出
(a) 輸入說明:一個英文單字S
(b) 輸出說明:找出S出現在檔案內的所有位置;若找不到,則輸出-1 -
範例
參考解法
#讀取資料
f = open('06.txt','r')
data = f.read()
f.close()
s = input('請輸入單字:')
idx = 0 #尋找單字的起始位置
locs = [] #儲存找到的位置
while True:
loc = data.find(s,idx)
if loc == -1:
break
else:
locs.append(loc)
idx = loc + 1
if len(locs) == 0:
print(-1)
else:
print(f"單字 '{s}' 的出現位置:{locs}")
習題7:寶可夢計算
-
題目描述
請撰寫一程式,讀取檔案 「pokemon.csv」,其第一列為欄位名稱,且各欄位以逗點(,)分隔,計算 Type1 欄位為 Water 的寶可夢數量,並計算這些寶可夢 HP 欄位的平均值。 -
檔案 「pokemon.csv」 部分內容範例
妙蛙種子,Grass,45
妙蛙草,Grass,60
妙蛙花,Grass,80
妙蛙花Mega,Grass,80
小火龍,Fire,39
小火龍,Water,44
…(更多列)…
-
檔案下載連結:pokemon.csv
-
輸入輸出
(a) 輸入說明:無
(b) 輸出說明:Type1欄位為Water寶可夢的數量與HP平均值 -
範例
HP平均 = 70.90163934426229
參考解法
f = open('pokemon.csv','r',encoding='utf-8')
data = f.readlines()
f.close()
HPs = []
for line in data:
parts = line.split(',')
if parts[1] == 'Water':
HPs.append(eval(parts[2]))
print(f'數量 = {len(HPs)}')
print(f'HP平均 = {sum(HPs) / len(HPs)}')