小型應用程式專題
進階專題四步曲:需求分析 → 設計 → 編寫 → 測試。設計時先定資料結構(字典)同函式分工(加分、統計、存檔);測試要涵蓋正常輸入和極端輸入(文字當分數、空字典、重複姓名)。
- 專題四步曲:需求分析 → 設計 → 編寫 → 測試,次序不可亂。
- 設計先定兩件事:資料結構(字典:姓名→分數)和函式分工(每個函式只做一件事)。
- 選單配 while 迴圈;記住 input 回傳字串,比較時要寫 == "1"。
文體小知識:專案指南課由企劃到評估逐步帶你完成整個製作,適合接著做小組功課和比賽作品。
§課文原文 Passage
1寫一個真正的程式,不是一坐下就打代碼。專業流程有四步:需求分析(搞清楚要做什麼、給誰用)→ 設計(計劃資料結構、函式分工、介面樣式)→ 編寫(分段寫、一邊寫一邊試)→ 測試(正常情況、極端情況都要試)。跳過前兩步,之後幾乎一定會推倒重來。
2以示範專案「成績記錄器」為例。需求分析:同學想用一個程式記錄各科測驗分數,可以隨時加入新分數、查看平均與最高分,關掉程式後資料仍然保留。這三句就是需求 — 每一項之後都要在測試時逐一驗證。
3設計階段:資料結構選字典 grades = {"小明": 85, "Mary": 90},鍵是姓名、值是分數;函式分工為 add_score() 加分、show_stats() 顯示統計、save() 存檔、load() 讀檔;主程式用 while 迴圈顯示選單,讓用戶輸入 1 至 4 選功能。設計畫在紙上,寫代碼時就不會迷失方向。
4編寫與測試:每次只寫一個函式,寫完立即試用,確保無誤才寫下一個。測試時要問三個問題:正常輸入對不對(85 和 90 的平均是 87.5)?極端輸入會怎樣(輸入 "abc" 當分數、姓名重複、字典空時計平均)?資料存檔後重新載入是否一模一樣?全部通過,專案才算完成。
1重點摘要 Summary
專題四步曲:需求分析 → 設計 → 編寫 → 測試。設計時先定資料結構(字典)同函式分工(加分、統計、存檔);測試要涵蓋正常輸入和極端輸入(文字當分數、空字典、重複姓名)。
2生字卡 Vocabulary
確定程式要做什麼、給誰用的階段,產出清晰的功能清單。
計劃資料結構、函式分工和介面樣式,作為編寫前的藍圖。
按設計逐個函式把代碼寫出來,一邊寫一邊試的階段。
用正常和極端輸入驗證程式是否合乎需求的階段。
列出功能編號讓用戶選擇的介面,配合 while 迴圈反覆顯示。
檢查用戶輸入是否合理(例如分數必須是數字),不合理就提示重輸。
把程式拆成各司其職的小函式,容易編寫、測試和修改。
最容易被忽略的極端情況,例如空清單、零分、重複姓名。
記錄程式的功能、用法和設計決定,方便他人和未來的自己理解。
3逐步講解 Steps
- 專題開發的第一步:需求清單寫真正的程式不是一開機便打代碼。專業流程的第一步是寫需求清單:把程式要做的事逐條寫下,每條一句。以「成績記錄器」為例:一,可以加入學生姓名和分數;二,可以顯示平均分和最高分;三,關閉程式後資料仍在。三條需求之後會逐條驗收,未完成的便未算完工。需求寫得清楚,後面的設計與測試才有依據;跳過這一步,寫到一半往往發現功能遺漏,要推倒重來。
- 選定資料結構第二步按需求選定資料結構。成績記錄器需要「以姓名查分數」,字典正合適:grades = {"小明": 85, "Mary": 90},姓名做鍵、分數做值。加入記錄即 grades["阿強"] = 78;查詢即 grades["小明"];統計之前用 grades.values() 取出全部分數。若需求是「依先後次序記錄事件」,便該選清單;「以姓名查電話」選字典。資料結構選對,之後每個功能都順手;選錯則處處受阻。
- 函式分工第三步把工作分配給函式,每個函式只做一件事:add_score(grades, name, score) 負責加入記錄;show_stats(grades) 負責計算並顯示平均與最高分;save(grades) 與 load() 負責存檔讀檔。單一職責的好處有二:出錯時能迅速定位是哪個函式的問題;想修改計算平均的方法,只需改動 show_stats 一處。函式之間以參數傳遞資料、以 return 交回結果,主程式只負責調度指揮。
- 主選單迴圈與輸入主程式用 while True: 建立選單迴圈:先 print("1 加分 2 統計 3 離開"),再 choice = input("請選擇:"),其後 if choice == "1": 加入分數,elif choice == "3": break 跳出。關鍵細節:input() 傳回的是字串,"1" 不是數字 1,比較時必須寫 choice == "1";若要當數字使用,須以 int(choice) 轉換。忘記這一點是新手最常見的錯誤,程式會對輸入 1 毫無反應,令人一頭霧水。
- 輸入驗證:防呆設計用戶不一定照規矩輸入。若用戶在分數欄輸入 "abc",int(text) 會報錯令程式崩潰。解法用 try/except:text = input("分數:") 之後,try: score = int(text) except ValueError: print("請輸入數字") 並 continue 回到選單。這樣程式遇到非法輸入只提示、不崩潰。專業軟件與遊戲的防呆設計,全部源自這個思想:假設用戶會出錯,預先擋住,體驗才會順暢。
- 測試正常與極端情況測試分兩類。正常情況:加入 85 與 90 之後選統計,期望平均 87.5、最高 90;把期望值預先寫在紙上,跑完逐項核對。極端情況:不輸入任何分數便看統計,空字典會除以零出錯,必須先判斷 len(grades) == 0;輸入重複姓名,程式應更新而非重複記錄;存檔之後關閉程式再重開,資料必須一模一樣。極端情況最能揭發隱藏錯誤,正式交付之前必須逐項通過。
- 專題的完成標準專題完成的標準不是「程式能跑」,而是三問全部通過:正常輸入結果正確嗎?極端輸入會否崩潰?資料存檔重載是否一致?此外宜回看需求清單逐條打勾。過程中「每次只寫一個函式,寫完立即試用」的紀律,能把除錯範圍縮到最小;一口氣寫完全部才測試,錯誤會互相糾纏。這套「需求、設計、分段編寫、雙向測試」的流程,適用於往後任何編程專題。
4圖解 Diagrams
5例題示範 Example
例題:為成績記錄器編寫 show_stats(grades) 函式,輸出平均分與最高分,並以 grades = {"小明": 85, "Mary": 90, "阿強": 78} 演示。
- 先擋空字典:if len(grades) == 0: print("暫無記錄") 後 return,避免除以零。
- 取出分數:scores = list(grades.values()),得 [85, 90, 78]。
- 計算統計:average = sum(scores) / len(scores) = 253 ÷ 3 ≈ 84.33;highest = max(scores) = 90。
- 輸出:print("平均分", round(average, 1), "最高分", highest),畫面顯示平均分 84.3 最高分 90。
- 補充測試:以空字典 {} 呼叫一次,確認顯示「暫無記錄」而非報錯。
- 答案:show_stats 先擋住空字典,再由 [85, 90, 78] 算出平均 84.3 分與最高 90 分並印出。要點是防禦式開頭(檢查空字典)與以 round 控制小數位。
6常見錯誤 Mistakes
75 題快測 Quick check
Q1小型應用程式開發的正確次序是?A. 編寫→測試→設計→需求分析 B. 需求分析→設計→編寫→測試 C. 設計→編寫→需求分析→測試
Q2成績記錄器中,grades = {"小明": 85, "Mary": 90},grades["阿強"] = 78 之後,len(grades) 是多少?
Q3用戶輸入分數時打了 "abc",哪種寫法可以令程式不崩潰?
Q4grades 是空字典時呼叫 show_stats() 計平均會出什麼問題?應該怎樣處理?
Q5寫出測試成績記錄器的任何三項檢查。
8重點回顧 Recap
- 專題四步曲:需求分析 → 設計 → 編寫 → 測試,次序不可亂。
- 設計先定兩件事:資料結構(字典:姓名→分數)和函式分工(每個函式只做一件事)。
- 選單配 while 迴圈;記住 input 回傳字串,比較時要寫 == "1"。
- 輸入驗證用 try-except 接住 ValueError,程式遇到錯誤輸入不崩潰。
- 測試要涵蓋正常和極端情況:空字典、重複姓名、存檔重載都要逐一驗證。