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

## 輸入成績

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_CJDkaUWvpu-dgKUDX%2F-L_CL-hySxgF90-jDHoG%2F2019-03-05_18-13-19.png?alt=media\&token=c2d53152-042a-4cb3-8182-1242c61dce9a)

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

{% hint style="danger" %}
請留意，上述的程式積木會把最後一個小於0的數值也加上去喔。
{% endhint %}

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_FsQl1O9fglV9QdqT-%2F-L_FsdwwBPss8R8ZnkGm%2F2019-03-06_10-42-37.png?alt=media\&token=bc99badd-98cc-42b2-addb-11fb48397a1b)

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_FsQl1O9fglV9QdqT-%2F-L_FsuZ4IKddA0uLnnmT%2F2019-03-06_10-44-37.png?alt=media\&token=78dfe28a-c7b5-4656-8284-1b5dfbc508b7)

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

{% hint style="info" %}
其實，不用把資料存在清單，在輸入的時候馬上計算也是一個方法。
{% endhint %}

## 逐一取出所有的資料項目

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_CJDkaUWvpu-dgKUDX%2F-L_CN0bCy5y67VK1yU9o%2F2019-03-05_18-22-06.png?alt=media\&token=a4edceb1-e546-42c9-baba-5c9b1066845d)

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

{% hint style="warning" %}
請留意，清單的索引數值是從1開始算的
{% endhint %}

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_CJDkaUWvpu-dgKUDX%2F-L_CO7BJ-xIw8uLPCcB_%2F2019-03-05_18-26-55.png?alt=media\&token=4891497b-4d19-43e4-9f94-9d1fa6203ce3)

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

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

* 最大值：max
* 最小值：min
* 平均值：average
* 總分：total

## 計算總分和平均

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_FsQl1O9fglV9QdqT-%2F-L_FtGVsB11zvHWGopI5%2F2019-03-06_10-46-09.png?alt=media\&token=61e37b89-17ae-407f-9454-99c06d24c5bc)

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

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

{% hint style="info" %}
要順利執行上述程式，別忘了要把程式積木和原有輸入成績的程式積木串在一起，才會有成績清單資料可以使用喔。
{% endhint %}

## 找出最小值的演算法

和計算總分的程式不太一樣的地方是，在逐一取出清單中每一個資料項目的同時，會把資料項目的內容加到變數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做比較，只有比它小才要變更它的內容為目前的資料值。由於一開始是一個很大的值，所以第一個項目一定會比它小，所以在每一個重複步驟中就都能夠得到目前的最小值，當所有項目都比較過一輪之後，最後的那個數值當然就會是全部的最小值了。

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

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_G3RHyUIC2EePHDRcS%2F-L_G4MpzxXgj-SiKq0qD%2F2019-03-06_11-35-00.png?alt=media\&token=e1ad966c-3969-4632-ac3f-fbc105a360b0)

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

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_G3RHyUIC2EePHDRcS%2F-L_G6U8o7NF9Mq3564re%2F2019-03-06_11-48-11.png?alt=media\&token=fc42755d-2a4a-4085-986f-e25bf5f58634)

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

{% hint style="info" %}
理解了上面的程式之後，是否同學們也可以增加一些程式積木，讓程式還可以指出最高分的是誰和最低分的是哪一位同學呢？
{% endhint %}

## 整合版程式

![](https://1789170130-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJEK4Zm0THA0vYxBYQ%2F-L_G3RHyUIC2EePHDRcS%2F-L_G7d44bXZTDIc3-bdq%2F2019-03-06_11-52-34.png?alt=media\&token=2f9d39b0-0889-4cc8-acf5-9a3456434f0d)

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

{% hint style="warning" %}
不過，由於Scratch並沒有簡便的方法可以把每一次輸入的資料保存起來，因此使用Scratch來作為成績處理系統並不實用喔。
{% endhint %}
