W04|把每一筆資料記下來:計數、加總與平均
今天完成後,我可以
- 把
input()放在迴圈中,依序讀入多筆資料。 - 使用變數保存目前的總和或符合條件的數量。
- 判斷初始化、更新與最後輸出分別應放在迴圈的哪個位置。
- 先完成加總,再於迴圈結束後計算平均。
- 分辨「加上這一筆資料」與「符合條件時加一」的不同。
一、從上週的範圍走向多筆輸入
第三週的數字由 range() 依序產生:
這一週的資料改由題目逐筆提供,因此把 input() 放進迴圈:
如果 n 是5,迴圈中的 input() 就會執行5次。
這裡的i只負責數圈數,迴圈裡不一定會用到它。
程式放在哪裡?
| 工作 | 位置 |
|---|---|
| 建立並設定累積變數的起始值 | 迴圈前 |
| 逐筆輸入資料 | 迴圈內 |
| 更新計數或總和 | 迴圈內 |
| 使用全部資料計算最後答案 | 迴圈後 |
| 輸出最後答案 | 迴圈後 |
二、課中練習
2-1|b023 算平均(70分)
題目先輸入班上人數 n,接著以 n 行輸入每位學生的成績,最後輸出平均成績。
不要急著計算平均,先完成總分。
總分一開始是0
→ 重複n次輸入成績
→ 每次把成績加入總分
→ 全部輸入完成後,用總分除以人數
→ 輸出平均
用小資料追蹤總分
假設有3位學生,成績依序是60、75、90:
| 讀入的成績 | 更新前的total |
更新後的total |
|---|---|---|
| 60 | 0 | 60 |
| 75 | 60 | ____ |
| 90 | ____ | ____ |
提示一:加總骨架
常見錯誤:每次都重新歸零
下面的 total = 0 如果放在迴圈內,每輸入一筆成績就會把之前的總分清掉:
累積變數只需要設定一次起始值,所以應放在迴圈前。
除錯:先看總分
平均不正確時,可以在計算平均前暫時加入:
- 總分錯誤:檢查迴圈次數、輸入位置與累加式。
- 總分正確但平均錯誤:檢查除數是否為人數
n。 - 找到錯誤後,提交JMJ前要刪除這行。
本題請使用迴圈與累積變數完成;如果你已經知道list或sum(),這週先不要用。
2-2|b036 老師請飲料(30分)
老師要請成績80分以上(包含80分)的學生喝飲料。題目輸入學生人數,再逐行輸入每位學生的成績,請輸出需要準備幾杯飲料。
這次不是把成績加起來,而是計算「符合條件的資料有幾筆」。
杯數一開始是0
→ 重複輸入每位學生的成績
→ 成績達到80分時,杯數增加1
→ 全部檢查完成後,輸出杯數
提示:計數骨架
請特別測試成績剛好是 80 的情況。
三、計數與加總差在哪裡?
| 任務 | 初始值 | 迴圈中更新什麼 |
|---|---|---|
| 加總所有成績 | total = 0 |
total加上這一筆score |
| 計算達標人數 | count = 0 |
符合條件時,count加1 |
加總:在意資料的數值是多少
計數:在意符合條件的資料出現幾次
兩者都是把目前結果保存在變數中,再隨著每一圈逐步更新。
四、課後挑戰
| 題目 | 配分 | 定位 | 本週目標 |
|---|---|---|---|
a103 小考總分 |
20分 | 基礎加總 | 獨立寫出迴圈內輸入與累加 |
c091 團購總金額 |
35分 | 情境應用 | 先完成加總,再依總額處理規則 |
a364 及格人數對決 |
45分 | 核心挑戰 | 使用兩個計數器分類統計,再比較人數 |
4-1|a103 小考總分
本題只需要輸出所有成績的總和,不必再除以人數。請從 b023 的程式找出哪些部分應保留、哪些部分應刪除。
本題仍須使用迴圈與累積變數;如果你已經知道list或sum(),這週先不要用。
4-2|c091 團購總金額
這題要先把每個人的購買金額全部加總,迴圈結束後,再根據總額判斷:
- 是否需要加上運費。
- 是否有贈品。
題目要的是整團最後付給老闆的總金額,不需要計算每個人分攤多少運費。
迴圈內:輸入並加總每一筆購買金額
迴圈後:根據最後總額處理運費與贈品
不要在資料尚未全部輸入時,就提早判斷最後的團購結果。
請另外測試購買總額剛好是1000與2000的情況,確認「達到門檻」是否包含等於。
提示:先把規則分成兩個階段
- 第一階段只負責算出所有人的購買總額。
- 第二階段才依題目門檻決定最後金額與要輸出的文字。
4-3|a364 及格人數對決(核心挑戰)
成績大於或等於60分算及格,未滿60分算不及格。題目會逐行輸入 n 位學生的成績,請判斷哪一方人數較多,並輸出相差人數。
輸出兩行:
- 及格人數較多:第一行輸出
PASS。 - 不及格人數較多:第一行輸出
FAIL。 - 人數相同:第一行輸出
SAME。 - 第二行輸出兩者相差的人數,必須是非負整數。
解題起點:分別計數
及格人數一開始是0
不及格人數一開始是0
→ 每輸入一筆成績,只增加其中一個人數
→ 全部輸入完成後,才比較兩個人數
請測試:
59與60是否分到正確的一方。- 及格較多。
- 不及格較多。
- 兩邊人數相同。
進階挑戰:你可以不要同時記錄及格與不及格人數,只使用一個統計變數嗎?
提示一:記住一方,推算另一方
總人數 n 已經知道。如果只記住其中一方的人數,另一方的人數能不能由 n 計算出來?
提示二:讓兩邊的變化互相抵消
能不能只準備一個從 0 開始的變數,遇到及格與不及格時,分別讓它往相反的方向變化?
全部處理完成後,觀察這個結果位於 0 的哪一側,以及它離 0 有多遠。這兩項資訊分別可以回答題目的哪一個問題?
變數不要命名為 pass,因為 pass 是Python的保留字;可以使用 pass_count 或其他清楚的名稱。
五、完成後自我檢查
- 我知道
input()放在迴圈內時,會在每一圈執行一次。 - 初始化只執行一次,所以寫在迴圈前。
- 加總時加入資料本身,計數時加入
1。 - 我會在條件成立時才更新對應的計數器。
- 最後答案只在所有資料處理完成後輸出。
- 平均錯誤時,我會先暫時輸出總分,縮小除錯範圍。
- 如果我已經知道
list或sum(),這週仍使用迴圈與累積變數完成練習。 - 我有測試剛好位於條件邊界的資料。
