KT 的 Python 進階程式設計

W04|把每一筆資料記下來:計數、加總與平均

今天完成後,我可以

  1. 把 input() 放在迴圈中,依序讀入多筆資料。
  2. 使用變數保存目前的總和或符合條件的數量。
  3. 判斷初始化、更新與最後輸出分別應放在迴圈的哪個位置。
  4. 先完成加總,再於迴圈結束後計算平均。
  5. 分辨「加上這一筆資料」與「符合條件時加一」的不同。

一、從上週的範圍走向多筆輸入

第三週的數字由 range() 依序產生:

Python 3圖片

這一週的資料改由題目逐筆提供,因此把 input() 放進迴圈:

Python 3圖片

如果 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 ____ ____
提示一:加總骨架
Python 3圖片

常見錯誤:每次都重新歸零

下面的 total = 0 如果放在迴圈內,每輸入一筆成績就會把之前的總分清掉:

Python 3圖片

累積變數只需要設定一次起始值,所以應放在迴圈前。

除錯:先看總分

平均不正確時,可以在計算平均前暫時加入:

Python 3圖片

本題請使用迴圈與累積變數完成;如果你已經知道list或sum(),這週先不要用。

2-2|b036 老師請飲料(30分)

老師要請成績80分以上(包含80分)的學生喝飲料。題目輸入學生人數,再逐行輸入每位學生的成績,請輸出需要準備幾杯飲料。

這次不是把成績加起來,而是計算「符合條件的資料有幾筆」。

思考步驟
杯數一開始是0
→ 重複輸入每位學生的成績
→ 成績達到80分時,杯數增加1
→ 全部檢查完成後,輸出杯數
提示:計數骨架
Python 3圖片

請特別測試成績剛好是 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的情況,確認「達到門檻」是否包含等於。

提示:先把規則分成兩個階段
  1. 第一階段只負責算出所有人的購買總額。
  2. 第二階段才依題目門檻決定最後金額與要輸出的文字。

4-3|a364 及格人數對決(核心挑戰)

成績大於或等於60分算及格,未滿60分算不及格。題目會逐行輸入 n 位學生的成績,請判斷哪一方人數較多,並輸出相差人數。

輸出兩行:

解題起點:分別計數

思考步驟
及格人數一開始是0
不及格人數一開始是0
→ 每輸入一筆成績,只增加其中一個人數
→ 全部輸入完成後,才比較兩個人數

請測試:

進階挑戰:你可以不要同時記錄及格與不及格人數,只使用一個統計變數嗎?

提示一:記住一方,推算另一方

總人數 n 已經知道。如果只記住其中一方的人數,另一方的人數能不能由 n 計算出來?

提示二:讓兩邊的變化互相抵消

能不能只準備一個從 0 開始的變數,遇到及格與不及格時,分別讓它往相反的方向變化?

全部處理完成後,觀察這個結果位於 0 的哪一側,以及它離 0 有多遠。這兩項資訊分別可以回答題目的哪一個問題?

變數不要命名為 pass,因為 pass 是Python的保留字;可以使用 pass_count 或其他清楚的名稱。

五、完成後自我檢查