# 資料的儲存與處理

在上一個單元中，我們只是做了很簡單的運算，透過一些函數和邏輯，繪出想要的圖形。但是，假設我們要處理的是生活中的資料，那該如何對待這些資料呢？

生活週遭的資料形形色色，簡單的包括如溫度、濕度、身高、體重、考試的各科成績等等，我們經常會有興趣想要拿來做些計算，然後找出其中重要的資訊。

舉個例子說，如果有一個裝置可以幫我們記錄一天之中每小時的溫度及濕度，在記錄了一天之後，就可以拿來計算一天中的平均溫濕度是多少，也可以計算溫濕度的中位數以及一天中的最溫度和濕度為何。如果在記錄的時候，除了溫濕度之外也同時記錄當時的時間，那麼就可以順便得知，一天中什麼時候最高溫，什麼時候溫度最低。

如果只是統計一天的溫濕度還算是容易，用人眼來看也可以，但是隨著時間的累積，記錄下來的資料愈來愈多，這時透過電腦的輔助，才能夠可快地，且自動地協助我們整理這些資訊，甚至幫我們畫出統計圖表。

## 資料的型態

如上面所說明的，不同的資料有不同的型式，例如溫度和濕度，一定是數值，而且通常都帶有小數點，身高及體重也是。但如果是座號的話，大部份都是數字，鐵定不能有小數點，沒有人會這麼麻煩自己。如果是學號的話，有些是有英文字母，有些學校的學號則沒有。以下是生活中常見的例子：

```
溫度->帶有小數的數值，有正有負
身高->帶有小數的數值，一定是正值
各科成續->帶有小數的數值，一定是正值
座號->正整數
學號->字元的組合（我們通常把它叫做字串）
姓名->字串
文章內容->字串
日期->特定格式的字串
```

在面對複雜且大量的資料時，資料型態的選擇是非常重要的，好在我們並不會面對此種情形，因此，在接下來的程式中，基本上會面對的資料，只要簡單地把它區分為「數值型式」和「字串型式」就可以了。

## 變數的使用

資料在程式中一定要有位置可以放，之後運算的時候才有可以提取使用的對象。資料被放在程式中是以「變數」的方式來放置。每一個變數都要有一個名字，給定了名字之後，才好進行操作。例如，用來儲存國文成績的變數可以把它命令為「chiscore」或直接叫做「chi」。依此類推，假設我們要計算某一同學段考國英數三科成績的總分和平均，該同學的國文\`、英文、數學三科成績分別是80, 60, 40，如果用按計算機的方式的話會如下：

```
80 + 60 + 40 => 180
180 / 3 => 60
```

如果要再計算下一個同學的話，那麼就要把所有的數字再按一遍。如果不幸的是，要計算的平均數是有加權的情形，那就更麻煩了，如下：

```
80 * 8 + 60 * 2 + 40 * 10 => 1160
1160 / 20 => 58
```

萬一你的計算機不支援先乘除後加減的運算，就還要個別先算出每一科的加權，再加總得到結果，最後再拿來除以20。但是，如果你是用變數來接收這些數字的話，就只要輸入數字，其它的部份由程式幫你算，並直接在你輸入完所有的數字之後隨即顯示出結果。

可以使用Scratch編寫如下所示的積木來計算：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG1S0bUT8iCR2knavj%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.41.49.png?alt=media\&token=b88955fe-d65c-4b54-b274-d27d38bac6e7)

\
執行的結果如下：

{% embed url="<https://youtu.be/nkqnlGsw4v0>" %}

只要編寫了程式用來計算總分和平均，就算是要計算加權的平均也只要在程式中改好就可以了，對於使用者而言，同樣都是輸入3個科目的成績，就可以得到結果。這就是可以編寫程式的好處。

## 文字與數值在處理上的不同

雖然在Scratch中使用變數不需要特別先聲明（在電腦的術語中叫做「宣告」）每一個變數要儲存的內容是什麼，但是其內容是文字還是數值，在操作上是有不同的。數字可以拿來進行算術運算，但是文字卻不行。如上面的程式例子來看，三科的成績直接使用算術式來計算，但是要輸出文字說明總分和平均的時候，就要使用字串組合這個積木，把要說出的文字「總分是」以及實際上算出來的總分數字串接在一起。這個技巧我們在十進位轉二進位的程式中有說明過，在該程式中是想要把清單項目中的所有項目，從最後一項的內容附加（串接）到第一項中，清單的內容如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG1qGigJpAbCJ5UPj2%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.43.43.png?alt=media\&token=0fb01291-35b3-4805-bdbf-b79ec5f61fd5)

在資料積木中建立了一個叫做「結果」的變數，一開始先把結果變數的內容清除成為「空」，然後再透過迴圈，一個一個把資料項目串接到「結果」這個變數中，程式積木如下所示：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG2iqtRsI75K0GuEne%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.47.22.png?alt=media\&token=469d9a9f-109d-4506-a77c-3ea722e9b2fe)

可以使用的字串相關積木如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG21vUl_8yAGQUXax4%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.44.35.png?alt=media\&token=414175a5-4b43-4009-9d25-7ba3e19d48a5)

也就是除了組合字串之外，也可以一個一個拆解出來使用，程式積木如下所示：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG3YTgwtKDm9sJkUfJ%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.51.08.png?alt=media\&token=7f0b3d80-775f-4bda-9b72-d288bb1369cf)

執行結果如下：

{% embed url="<https://youtu.be/EZud-C4Rsjw>" %}

## 清單的使用

在前面的幾個程式範例中多少都有使用到「清單」這種資料型態。在Scratch中的清單，就是一般程式語言中常見的陣列（array）或是串列（list ）的資料變數型態。

此種變數的特色是一個變數中包含了許多的項目，每一個項目均被指定了一個索引值（有些程式語言是從0開始算，但是Scratch的清單索引值是從1開始算），依序把資料項目加入到每一個索引位置中。在存取資料項目的時候，除了要指出變數的名稱之外，也要指定索引的數字，才知道要拿哪一個出來。Scratch中可以用在清單的積木如下所示：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG3lZccLZfSqbRTaWC%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.52.08.png?alt=media\&token=0fb0ea7a-140f-43ed-8816-6c68bdcdad0a)

在這個例子中我們建立了一個叫做「結果」的清單變數，建立完畢之後底下就出現了所有可以使用的積木。這些積木包括了：

* 把一個資料項目加到清單中
* 刪除指定索引值的資料項目
* 把一個資料項目加到清單的指定位置中
* 替換清單中的某一索引值中的項目
* 取出清單中的某一個指定索引位置的項目值
* 傳回清單的項目個數
* 檢查清單中是否包含指定的資料項目

有了這些積木之後，就可以對在清單中的項目做一些儲存、取出、以及刪除的處理了。同學可以看得懂前面這支程式的意思了嗎？

## 關於變數的命名

要存取變數之前，需先為要使用的變數取一個名字。習慣上，名字要以有意義的文字為主，儘量不要使用空白以及其它文字以外的符號。

傳統的文字式程式語言對於變數的名稱有非常嚴格的規範，除了要以英文字母為第一個字元以外，其它的字元只能包括英文字母和數字字元，以及少許的符號如底線或是減號。在大部份的語言中，大小寫的英文字母算是不同的變數名稱。此外，有一些預設的名稱例如print, input, sin, cos等等，也不能被拿來當做是變數名稱使用。

此外，變數名稱的命名也要有意義，最好能夠用來描述所儲存的資料內容。例如之前在計算成績的程式例子，使用「國文成績」、chinese、chi、ChineseScore等等都是可以明確表達變數內容的好範例。

在Scratch的變數名稱就鬆散多了，可以英文也可以中文字，相信其它的語言應該也可以。不過，為了養成良好的習慣，同學們還是以遵循比較嚴謹的規範為宜，因為以後有機會還是會使用其它的程式語言來編寫程式，提早養成好的習慣也比較有幫助。

至於一般程式語言的檔案處理與資料庫存取等，在現有的Scratch版本中並沒有簡易的方法，所以在此就先不做說明了。

## 清單的應用--貓咪說話程式實作

瞭解了清單之後，同學們就可以利用這個特性讓我們一的些需要比較多資料的程式在運作上更加地方便。例如要製作一個讓貓咪一直說話的程式，如果不用清單的話要這樣做：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG4JJhShlGmryQcNra%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.54.30.png?alt=media\&token=1d29f45a-9513-423a-a26d-bab5b0a83193)

如果要講的話不多，這樣子設計積木是還可以接受，但是，如果要講的話超過100句呢？先不要說拉積木的過程很麻煩，整個積木拉完了，螢幕也都被佔滿了，日後要再修改的話就會非常不方便。這時候就是清單上場的機會了。

我們可以先建立一個清單叫做speech，然後利用在一開始的時候把這個些資料都放到清單中，然後再利用一個迴圈逐一把它呈現出來，清單變數建立如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LP3IwmTS6XdsfaYku1R%2F-LP3LFOQZ2XRPnyWgNvm%2F2018-10-18_07-25-07.png?alt=media\&token=10435cdc-f184-4641-92dc-35415abca76c)

然後在程式一開始執行的時候先進行初始化的動作，如下所示：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG5BhdLQ7Y0UJfaEfO%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.58.19.png?alt=media\&token=9f8230c7-0daf-4d16-b85e-a9e06095f0ca)

然後我們就可以使用標準迴圈存取清單的方式，透過一個index變數作為輔助，只要在角色被點擊的時候，再從清單中把資料項目逐一取出利用即可，如下所示：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LaG1O1JcEDfrStrWbr5%2F-LaG5HM_sbjyk1BD8FVd%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-18%20%E4%B8%8B%E5%8D%889.58.47.png?alt=media\&token=dae25cd0-4c1b-40f6-b189-fa1ee9d84cfd)

同學們可以先想想看，那如果有另外一個角色也要使用這個清單的內容，該如何做呢？還有，如果要做成對話的形式，又該如何做到呢？
