一、問題一(成績加總)
如右圖成績陣列內有10 筆學生成績資料,請寫程式計算全部成績的總和。
想想該如何處理資料以符合需求? 既然要計算加總,顯然要準備一個總和變數來存放加總的結果,初值設定為0。接著要將陣列內的10筆資料依序取出,逐一加入總和變數內,最後再將總和變數顯示。
有了想法後,試著用流程圖符號,畫畫看。
撰寫程式-第一種
先設定總和變數等於0,接著把成績陣列中的每個元素,都累加到總和變數內。
仔細觀察右圖中的程式幾乎都相同,差別在於框線區域內存取陣列的索引值不同(分別是 1、2、3、⋯、10),這樣的特性適合用重複結構來改寫程式。
撰寫程式-第二種
參考前面介紹過的迴圈結構,可以設計出如下圖的程式,來存取陣列元素。
二、問題二(資料統計)
最近感冒大流行,每天早上進入校園都必須測量體溫,檔案 temp.txt 內存放全校600 名學生的體溫測量結果,請將資料匯入體溫陣列內,並且寫程式統計體溫高於38 度的有多少人?
當資料匯入體溫陣列後,就可以逐一檢視陣列內每個元素的值是否大於38,如果發現超過38 就要馬上記錄下來,傳統的人工作法是找一張紙畫記正字,但是在電腦程式的領域,可以宣告一個變數(初值為0)來記錄。
撰寫程式(1)
建立一個體溫陣列並匯入 temp.txt 文字檔內的體溫資料,建立索引變數(初值為1)、高溫人數變數(初值為0)
撰寫程式(2)
仿效之前設計過的重複結構,索引變數是從1開始,迴圈指令重複次數為600次(也就是陣列的長度)。
迴圈內放入要重複執行處理的程序。
撰寫程式(3)
最後再把高溫人數變數的值顯示出來就完成了。
最後完整的程式。
三、問題三(一筆畫圖形)
參考右側圖案,可從任意點出發,將所有路徑都走過一次,但是不能重複路徑,請問該如何走?請寫下你的路徑走法。
這個問題的其中一種解法是C → E → A → B → C → D →E → B → D,在此使用符號記錄下路徑行走順序
也可以使用座標(X, Y) 的方法來說明路徑的走法。例如參考右圖座標標示,若從C 走到E (C → E),用座標方式描述就是(60, -100) → (-60, 0)。
以上路徑座標若使用陣列表示,請先建立一個「X 座標陣列」,並且依序輸入上表X欄位的資料;同樣的再建立「Y座標陣列」並輸入資料。
撰寫程式
程式第2 行,先將小貓隱藏起來,讓畫出來的圖形看得更清楚。
程式第5 行,取得第1 個點的(X,Y) 座標,接著第6 行才下筆。
程式第7 行取得第2 個點的(X,Y) 座標、第8 行取得第3 個點的(X,Y) 座標,接著第9 行停筆。
走完3 個點,畫出來的兩條線段圖形如右圖。
請試著繼續取得其它的點座標,畫出完整圖形。
完整程式如右圖。
這樣的程式太冗長,從下筆之後,類似的定位程式碼重複了8次。請問如何用重複結構改寫成更精簡的程式?
回想之前曾經介紹過重複結構的程式寫法,如果索引變數初值設定2,重複8 次,每次遞增1 單位
可將原先重複多次的定位程式碼,放到重複結構內,這樣程式就變得精簡了!另外重複8次,相當於X陣列的長度(9)再減去1。
最後完整的程式。
四、問題四(演奏音樂)
在Scratch 的擴充功能提供了音樂演奏與控制節拍指令,這一節我們要使用這些指令,製作一個簡單的音樂播放程式。
請參考以下步驟,把音樂擴充指令加入開發環境中。
把音樂擴充指令加入開發環境中
點選【添加擴展】,在「選擇擴充功能」畫面內,點選「音樂」,加入音樂演奏的元件。
找到「演奏音階」指令圖示,放到程式區後,第二個參數設定節拍為1。
滑鼠點選第一個參數設定音階代號(預設60),會出現一個鋼琴鍵盤的圖樣,可以試著點選不同的鍵盤位置,立即能聽到對應的音階。
最左邊的白鍵標示(如上圖藍底區)C(60),就是 Do的意思,每個按鍵代表的意義整理如右表:
若要演奏不同的音階,只需在指令的第1個參數填寫對應的代號(例如60代表Do),第2個參數填寫節拍長度,這樣就能聽到美妙的旋律。
如果覺得演奏速度太慢,請增加下圖指令,修改速度參數(預設是60),數字愈大速度愈快。
也可以使用改變演奏樂器指令(預設是使用鋼琴演奏)。
該如何編寫一小段旋律,而且速度設定為120、使用吉他演奏呢?
請使用陣列儲存音階代號,並且設計一個演奏程式,自動播放整首樂曲。
提示
如果將整首樂曲的音階代號都存放在陣列內(如右圖),然後逐一將陣列內存放的每個音階代號取出來播放,這樣就可以把問題解決了。
撰寫程式-方法一(1)
請參考下圖建立樂曲陣列,並且輸入音階代號。
撰寫程式-方法一(2)
接著將程式改寫成重複結構,如果想要存取陣列前三個元素,程式內的索引變數初值、重複次數該如何設定?
撰寫程式-方法一(3)
藉由索引變數初值設定為1,接著連續拜訪陣列裡的每個元素,演奏出每個音階。
撰寫程式-方法二
先將音階資料輸入到文字檔內,然後回到Scratch 的舞台區,滑鼠右鍵點選樂曲陣列,再點選匯入功能,直接匯入預先編輯好的音樂檔案 [ 樂曲.txt],這樣可以簡化不少步驟。
檔案成功匯入後,由陣列內容可知這段音樂檔案裡面有24 筆資料,能夠演奏出24 個音階的旋律,請按下執行按鈕 ,聽聽音樂吧。
其實除了使用執行按鈕來啟動這段小程式外,也可以改用鍵盤上的「a」按鍵,當「a」被按下時,一樣能聽到旋律。
右圖是小星星樂譜(小星星.txt),歌詞上方的數字就是簡譜。
簡譜與唱名,以及Scratch 音階代號對照。
進階練習(1)
請參考【小星星】簡譜,使用記事本編輯音樂檔案「樂曲.txt」的內容,將音階資料輸入到檔案內,接著再匯入到Scratch 程式的樂曲陣列內,執行程式就可聽到音樂了。
進階練習(2)
請自行上網搜尋其它音樂的簡譜,將簡譜轉換成Scratch 程式的音階代號並存為文字檔,最後匯入到陣列內,使用程式播放樂曲。
五、問題五(錄製音樂)
自行設計錄製音樂的程式,在鍵盤上直接彈奏音符,即時記錄到陣列內。
提示
使用電腦鍵盤上的數字按鍵 1 2 3 4 5 6 7 8,代替鋼琴鍵盤功能。然後使用者彈奏音符時,程式馬上就能記錄到陣列中,這樣就完成錄音功能。
撰寫程式(1)
從【事件】分類找到指令「當 空白 鍵被按下」,設定「1」鍵被按下時,播放Do的音階,並且存放Do的音階代碼60到樂曲陣列。
撰寫程式(2)
加上更多的程式碼,當「2」∼「8」鍵被按下,播放對應的音階,並且存放資料到樂曲陣列內。
撰寫程式(3)
請任意按下「1」∼「8」按鍵,觀察樂曲陣列內資料會不斷的增加。
撰寫程式(4)
每個代碼將來播放長度都是1拍,如果樂曲中有些音符是2拍的話,那麼按對應鍵時就要按兩下按鈕,這樣播放時就可以聽到2拍的長度了。
撰寫程式(5)
不過陣列內的資料只是暫時保存,必須手動在陣列上點選滑鼠右鍵選擇【匯出】,然後將陣列資料匯出存放(例如存入硬碟),才能長期保存。
撰寫程式(6)
最後再將匯出的樂曲檔案,交給1-2-4小節的「演奏音樂」程式,就可以聽到自己親手錄製的音樂了。
撰寫程式-清空陣列資料(1)
在程式內新增角色,增加Microphone角色。
撰寫程式-清空陣列資料(2)
滑鼠點擊Microphone角色,在【事件】分類找到「當角色被點擊」,拖拉到程式區,就可以接著撰寫有關錄音的程式。
撰寫程式-清空陣列資料(3)
當按下Microphone角色時,立即清空樂曲陣列的內容,準備紀錄新的樂曲資料,程式如下:
進階練習
新增一個角色 Speaker, 當程式執行後, 使用者按下Speaker 圖示,就能自動播放陣列裡面紀錄的樂曲內容。
進階練習-答案
新增角色Speaker,點選Speaker後加上右方程式
六、問題六(隨機抽籤)
下一節課是體育課,老師要找四個同學到體育器材室,幫忙借課程會用到的壘球用品。請設計一個抽籤程式,從班上10 位同學(座號1 ∼ 10號)隨機抽選出4 個號碼,以協助老師準備上課用品。
Scratch 有個產生隨機亂數的指令,只要給定最小值與最大值,它會產生介於兩者之間的隨機亂數,例如以下指令會產生 1~10 之間的任意整數。
撰寫程式(1)
宣告一個變數「亂數」,搭配重複結構(重複4次),就可以產生四個隨機亂數的程式片段。
撰寫程式(2)
若要將產生出來的亂數顯示在舞台上,我們可以另外再宣告一個變數「結果字串」,在重複過程中不斷將產生的亂數,記錄到「結果字串」內,最後再一次顯示出來。
進階練習
上面的程式只要多執行幾次程式,可能就會發現產生的結果出現重複的號碼,要如何才能避免有重複抽中的情況?
撰寫程式(1)
準備一個「抽籤紀錄陣列」用來紀錄抽籤狀況。在抽籤之前都是存放字串「沒抽到」。接下來程式自動抽籤,如果抽中4、5、7、10號,就在陣列內對應的元素,註記「抽中」。
撰寫程式(2)
由於「抽籤紀錄陣列」會記錄號碼是否已經被抽中,所以每次抽出一個亂數,就可以比對判斷是否為有效的號碼,如果早已被抽中,那麼就再抽一次,如此不斷反覆抽選,直到抽出四個不同號碼為止。