找出最大值、最小值、平均數

輸入成績

接續上一單元的內容,我們在清單中現在有許多的數值,這些數值可能是隨機產生的,也可能是由使用者輸入的。在上一單元中我們看過了使用隨機數產生的方式,下面這段程式則是由使用者輸入的例子:

在這個例子中使用scores來記錄使用者輸入的所有成績,它會一直讓使用者輸入成績,直到輸入的成績小於0才會停止。

請留意,上述的程式積木會把最後一個小於0的數值也加上去喔。

如果我們不打算把最後一個小於0的數字也加到清單的話,可以把積木簡化成如下所示的樣子:

下面是兩個程式設計方法的比較,同學們可以指出它們在邏輯上的差別嗎?

有了這些成績,就可以利用程式找出它們的最大值、最小值、平均值、甚至是中位數等。

其實,不用把資料存在清單,在輸入的時候馬上計算也是一個方法。

逐一取出所有的資料項目

在這裡我們在輸入完畢之後,再使用一個迴圈來找出這些成績的特性,因為清單的長度是已知,所以可以使用「重複次數」積木即可,方式如下:

上面這個方法可以確保迴圈的重複次數,有多少資料就會執行幾遍。但是,要如何一個一個逐次拿出來呢?需要透過一個索引變數才行。用來當做索引的變數,通常都會把它命名為index。下面這個程式可以讓貓咪逐次把資料內容依序講出來:

請留意,清單的索引數值是從1開始算的

把這個迴圈再串接到之前的輸入成績程式積木塊即可。

在所有的資料項目均可逐一取出之後,要計算最大值、最小值、平均值和總和就不是難事了。分別準備變數如下:

  • 最大值:max

  • 最小值:min

  • 平均值:average

  • 總分:total

計算總分和平均

先來看看如何計算總分和平均,以下是主程式的部份:

上面程式的主迴圈可以把所有的scores清單中的所有資料項目逐一取出。在進入迴圈之前,先把total這個變數的內容清除為0,之後在取出每一個資料項目的時候,都把它加到原有的total變數中,如此在離開迴圈之後,變數total中所儲存的就是清單中所有資料項目的總和了。

有了加總之後的成績,平均average即可利用total除以目前清單中的項目數(也就是清單的長度)獲得。之後,再讓貓咪把這兩個變數說出來即可。

要順利執行上述程式,別忘了要把程式積木和原有輸入成績的程式積木串在一起,才會有成績清單資料可以使用喔。

找出最小值的演算法

和計算總分的程式不太一樣的地方是,在逐一取出清單中每一個資料項目的同時,會把資料項目的內容加到變數total中,但是要找出最大值及最小值則不是使用加總的方式,而是逐一比較。

在前面我們定義了兩個變數分別是min以及max用來存放最小值和最大值。以找出最小值為例,在這裡我們用的演算法如下:

  1. 假設數字的範圍是0-100。

  2. 設定min的內容是999

  3. 把index設定為1

  4. 如果index的值大於清單長度,則前往第8步

  5. 取出清單中第index個項目檢查,如果小於min,則把min的內容設定為目前清單項目內容

  6. index加1

  7. 回到第4步

  8. 結束程式

上述的演算法所要表達的意思,簡單地說就是一開始先把min變數設給它一個很大的數值,之後逐一取出清單項目和min做比較,只有比它小才要變更它的內容為目前的資料值。由於一開始是一個很大的值,所以第一個項目一定會比它小,所以在每一個重複步驟中就都能夠得到目前的最小值,當所有項目都比較過一輪之後,最後的那個數值當然就會是全部的最小值了。

找出最大值和最小值的程式

找出最小值的程式積木如下:

使用相同的想法,同學們是否也知道修改上述的程式積木找出最大值了呢?程式積木如下:

上面這段程式我們把最小值和最小值一併找出來了,同學們是否能夠充份理解了呢?

理解了上面的程式之後,是否同學們也可以增加一些程式積木,讓程式還可以指出最高分的是誰和最低分的是哪一位同學呢?

整合版程式

在Scratch程式中並不是只能使用一個清單,如果依照上述的程式要發展成一個成績單計算系統的話,可以準備一個清單用來存放同學的姓名,另外幾個清單用來存放同學們的各科成績,在程式中互相搭配即可。

不過,由於Scratch並沒有簡便的方法可以把每一次輸入的資料保存起來,因此使用Scratch來作為成績處理系統並不實用喔。