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

## 輸入成績

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

![](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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nkust.gitbook.io/scratch-3/zhao-chu-zui-da-zhi-zui-xiao-zhi-ping-jun-zhong-wei.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
