📋 U3 清單・知識點 K08

清單累計與條件統計

邊讀邊統計:總和、平均、符合條件的數量

B3-02-ListStats
練習平台
點標題可以展開或收合

1學習目標

  • 會用「重複 N 次」把一串資料一筆一筆讀進來,邊讀邊處理。
  • 會用累加變數算出總和與平均。
  • 會用計數變數數出「符合條件」的資料有幾筆。
  • 知道什麼時候需要先把資料存進清單,之後再回頭使用。

2概念說明

老師拿到全班的成績單,最常問的問題是:總分多少?平均幾分?有幾個人及格?及格率多少?

這些問題看起來不一樣,做法卻有同一個骨架:一筆一筆看資料,每看一筆,就更新一個「記錄用的變數」。看完全部資料,記錄變數裡存的就是答案。

依照你想知道的事,記錄變數有兩種常見的用法:

你想知道記錄變數初始值每讀到一筆資料要做的事
全部加起來是多少總和0總和 = 總和 + 這筆資料
有幾筆符合條件數量0如果這筆資料符合條件:數量 = 數量 + 1

把它寫成步驟,就是這個知識點每一題都會用到的骨架:

讀入 N(總共有幾筆資料)
記錄變數 設為 初始值
重複 N 次:
    讀入一筆資料
    (需要的話,先判斷這筆資料符不符合條件)
    更新記錄變數
說出答案
30
60
50
80
45
90
大於 50 的資料每出現一次,「數量」就加 1:0 → 1 → 2 → 3
邊讀邊數:看完 6 筆資料,數量=3
💡 一行有好幾個數字,要怎麼讀?

題目常把 N 個數字放在同一行、用空白隔開,例如「30 60 50 80 45 90」。平台的「詢問並等待」每次會依序拿到一個數字,所以只要重複「詢問並等待」N 次,就能照順序讀完這一行。

📌 這個單元叫「清單」,為什麼這裡沒用到清單積木?

因為這些問題的每一筆資料只需要看一次:讀到就處理,處理完就可以不管它了。只有當你需要回頭再看資料時,才需要先把資料存進清單。最後的延伸挑戰就是這種情況。

3示範題:跟著一步一步做(2 題)

先讀題,再一步一步點開來看。建議每看完一步,就先自己在平台上試著寫寫看。

示範題 1

清單加總與平均示範

L2|進階JSA01-D02
第一行輸入一個整數 N,第二行輸入 N 個整數。請輸出這 N 個數字的總和與整數平均,兩個結果各佔一行。平均值請使用整數除法,只保留整數部分。
輸入
第一行:一個整數 N。 第二行:N 個整數,以空白分隔。
輸出
第一行:總和。 第二行:整數平均。
範例1
輸入
3
10 20 30
輸出
60
20
範例2
輸入
4
1 2 3 4
輸出
10
2
第 1 步:讀題,找出輸入和輸出
  • 輸入:第一行是 N,第二行是 N 個整數。
  • 輸出:兩行,第一行是總和,第二行是整數平均(只取整數部分)。
第 2 步:把問題拆成步驟
  1. 讀入 N。
  2. 準備記錄變數「總和」,設為 0。
  3. 重複 N 次:讀入一個數字,把它加進「總和」。
  4. 說出「總和」。
  5. 說出「總和 ÷ N」無條件捨去後的整數。
讀入 N
總和 設為 0
重複 N 次:
    讀入 數字
    總和 設為 總和 + 數字
說出 總和
說出 (總和 ÷ N)無條件捨去
第 3 步:用範例走一次

輸入「3」和「10 20 30」時,每一輪迴圈結束後,變數會變成這樣:

第幾輪讀到的數字總和
開始前-0
第 1 輪1010
第 2 輪2030
第 3 輪3060

最後說出總和 60,平均是 60 ÷ 3 = 20。和範例輸出一樣。

💡 動手寫之前,先用範例在紙上走一次

像上面這樣列表追蹤變數,是找出錯誤最有效的方法。程式跑出來的答案不對時,也可以用同樣的方法一輪一輪檢查。

第 4 步:對照範例答案

寫完之後,可以在平台上按「載入範例」,看看範例答案和你的寫法哪裡不同。請特別注意這三個地方:

  • 「總和設為 0」放在迴圈外面、迴圈之前。
  • 迴圈裡面的順序是:先「詢問並等待」讀一個數字,再把它加進總和。
  • 平均用數學積木的「無條件捨去」取整數。
⚠️ 常見錯誤
  • 把「總和設為 0」放進迴圈裡:每一輪都會被清回 0,最後的總和只剩最後一個數字。
  • 平均沒有取整數:輸入「4」和「1 2 3 4」時,總和是 10,平均要輸出 2,不是 2.5。
示範題 2

大於門檻的數量

L2|進階CNT01-020
給定一個門檻值 K 與 N 個整數,請計算有幾個數字大於 K。
輸入
第一個整數為 N,第二個整數為 K,接著輸入 N 個整數。
輸出
輸出一個整數,代表大於 K 的數字數量。
範例1
輸入
6
50
30 60 50 80 45 90
輸出
3
第 1 步:讀題,找出輸入和輸出
  • 輸入:先輸入 N,再輸入門檻值 K,接著是 N 個整數。
  • 輸出:一個整數,代表大於 K 的數字有幾個。
第 2 步:和上一題差在哪裡?

骨架完全一樣,只改了兩個地方:

  1. 記錄變數從「總和」換成「數量」,初始值一樣是 0。
  2. 不是每一筆都要處理:要先判斷「這個數字大於 K 嗎?」,是的話數量才加 1。
讀入 N
讀入 K
數量 設為 0
重複 N 次:
    讀入 數字
    如果 數字 > K:
        數量 設為 數量 + 1
說出 數量
第 3 步:用範例走一次

輸入 N=6、K=50,資料是「30 60 50 80 45 90」:

讀到的數字大於 50 嗎?數量
30否0
60是1
50否(等於不算大於)1
80是2
45否2
90是3

答案是 3。

第 4 步:對照範例答案

按「載入範例」後,請注意:判斷條件用的是「>」,數量每次只加 1,不是加上那個數字。

⚠️ 常見錯誤
  • 「大於」寫成「大於或等於」:等於 K 的數字會被多算進去。範例裡的 50 就是用來檢查這件事的。
  • 讀入順序弄反:題目是先 N 再 K。如果先讀 K,迴圈次數就會錯。
  • 「數量 + 1」寫成「數量 + 數字」:這樣算出來的是總和,不是數量。

4練習題(3 題)

照順序完成這些題目。寫完之後,可以在平台上按「載入範例」和自己的寫法比較。

只加偶數

L2|進階JSL01-P02
這題多了什麼:骨架和第一題示範一樣,只是在「加進總和」之前多一道判斷:偶數才加。怎麼判斷偶數,可以回想 K03 學過的「除以 2 的餘數」。如果資料裡完全沒有偶數,總和會保持初始值 0,剛好就是題目要的答案。
看題目內容
第一行輸入一個整數 N,第二行輸入 N 個整數。請只把其中的偶數加總後輸出。本題用來練習迴圈內加入條件判斷
輸入
第一行:一個整數 N。 第二行:N 個整數,以空白分隔。
輸出
輸出所有偶數的總和。若沒有偶數,輸出 0。
範例1
輸入
5
1 2 3 4 5
輸出
6
範例2
輸入
3
1 3 5
輸出
0
💡 需要提示嗎?
走訪清單時,先判斷這一項是不是偶數,是才加進總和。

合格的裝備

L2|進階count-016
這題多了什麼:這次符合條件的資料不是加起來、也不是數數量,而是輸出出來。平台比對答案時,空白和換行視為一樣,所以最簡單的寫法是:每讀到一個重量小於 10 的數字,就直接「說出」它。範例答案用的是另一種寫法:把合格的數字接成一行文字再一次說出,兩種都可以。如果都沒有合格的數字,就什麼都不要說。
看題目內容
勇者的負重能力有限,他只能攜帶重量「小於 10」的輕型裝備。 現在清單中有一堆裝備的重量,請你利用迴圈檢查每一個裝備,只把重量小於 10 的裝備重量印出來。 輸入格式 輸入共有兩行。第一行是一個整數 N,代表裝備數量。 第二行輸入 N 個整數,代表每個裝備重量。 程式依序輸出小於 10 的數字,中間以空白隔開。 如果都沒有小於 10 的數字,則什麼都不輸出。
範例1
輸入
5
15 5 20 8 3
輸出
5 8 3
範例2
輸入
3
12 15 20
輸出
(不輸出)
💡 需要提示嗎?
走訪清單時,只把重量小於 10 的項目輸出;都沒有的話就什麼都不輸出。

通過率整數版

L2|進階STA01-004
這題多了什麼:這題同時用到「數量」和一次計算。通過率要先乘 100 再除:例如 3 人通過、共 5 人,要算 3 × 100 ÷ 5 = 60。如果先把 3 ÷ 5 取整數(得到 0)再乘 100,結果就變成 0 了。
看題目內容
給定 N 位學生的成績,分數大於或等於 60 為通過。請計算通過人數與通過率。通過率使用整數百分比,小數直接捨去。
輸入
第一個整數為 N,接著輸入 N 個整數代表成績。
輸出
輸出兩個整數,依序為通過人數與通過率百分比,中間以空白分隔。
範例1
輸入
5
80 55 60 40 90
輸出
3 60
💡 需要提示嗎?
先數出通過人數,通過率=通過人數×100 整除總人數。注意要先乘 100 再除。

5延伸挑戰(1 題)

核心題都會了嗎?這些題目需要把好幾個技巧組合起來,想挑戰的話可以試試看。

🚀 高於平均的數量 L3|挑戰
挑戰重點:平均要等全部資料讀完才算得出來,可是「有幾個數字大於平均」又需要回頭再看每一個數字。這就是需要清單的時候:第一次讀資料時,一邊加總、一邊把數字存進清單;算出平均後,再用第二個迴圈走訪清單,數出大於平均的有幾個。
給定 N 個整數,先計算整數平均,再計算有幾個數字大於平均。
輸入
第一個整數為 N,接著輸入 N 個整數。
輸出
輸出兩個整數,依序為整數平均與大於平均的數量,中間以空白分隔。
範例1
輸入
5
10 20 30 40 50
輸出
30 2
💡 需要提示嗎?
要走訪兩次:第一次算出平均,第二次再數有幾個數字大於平均。

6自我檢核

學完之後,檢查看看你能不能做到這些事。有做不到的,就回到上面對應的地方再看一次。

  • 我能說出「總和」和「數量」的初始值要設多少,以及為什麼要放在迴圈外面。
  • 我能分辨「總和 = 總和 + 數字」和「數量 = 數量 + 1」各用在什麼時候。
  • 我知道「大於」和「大於或等於」會讓答案不同,會用剛好等於的數字來檢查。
  • 我能說出什麼情況需要先把資料存進清單,什麼情況邊讀邊算就夠了。