變數箱子
譯者:許連逢
版權聲明:
Computer Science activities with a sense of fun: Created by Paul Curzon, and Peter McOwan Queen Mary University of London for Teaching London Computing: http://teachinglondoncomputing.org
本教材以創用CC 3.0 姓名標示-非商業性-相同方式分享釋出(creative commons 3.0 BY-NC-SA)
https://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_TW
原文教案與教材連結:
https://teachinglondoncomputing.org/resources/inspiring-unplugged-classroom-activities/the-box-variable-activity/
活動名稱:變數箱子 BoxVariable
教學時間:10-20分鐘
教學單元:
程式編寫(programing)
- 指派(assignment)
- 變數(variables)
- 值(values)
- 宣告(declaration)
- 初始化(initialisation)
- 序列化(sequencing)
教學目標:此活動適合用來了解變數以及指派的運作方式。
對象:10歲以上、3人以上
先備知識:非常簡易的程式語言能力,對於變數及指派的運作有些許認知
課前準備:
- 3個A4紙紙箱的蓋子
- 變數名稱標籤(列印在紙上後打洞,綁上緞帶或繩子)
- 值卡(將與顏色相關的文字列印在紙上)
- 程式碼(可以用投影片、寫在黑板上或是做成講義)
活動設計:
- 概要
把學生們當成電腦去模擬執行一個包含變數及指派的簡易程式。拿著箱子的學生們會代表不同的變數,並讓在箱子中的值依照程式指令在他們之間複製來複製去。教師實際展示:
- 變數如何被創造
- 如何利用複製的方式取變數的值
- 把值存入變數時會覆蓋掉該變數所原本擁有的值。
- 如何進行
引起興趣:說明變數及指派的觀念對於程式編寫的能力極為重要,但也是相當容易混淆觀念的地方。只要能度過這個關卡,程式編寫會輕鬆許多。將一個變數想成一個盒子是個不錯的思考方法,而且特別的是每個盒子都內建有專屬的碎紙機及複印機,代表每個箱子除了可以進行儲存也可以進行創造或銷毀。
- 活動內容
建議先讓學生看一個簡易的程式(例如說,將一個剛印好的值儲存在一個箱子中),然後展示一個功能在於互換變數裡所存的值的程式,說明將要展示這支程式如何運作,其重點放在變數和指派如何運作。
資料處理是電腦很重要的工作之一,它們儲存值—包含數字、文字、圖像、聲音等,將他們操縱、計算、更改、將其結果儲存直到我們需要利用的時候。例如,音樂編輯軟體記錄下聲響的樣本,編輯,於其他樣本結合,儲存其結果並且撥放其最終版本。而一個做簡訊傳送或推特發文的程式會儲存你所打的文字,並且在你要發送訊息前都允許你編輯。
程式語言因此需要一個方法讓程式設計者寫的指令可以傳達給電腦,讓電腦可以執行資料儲存和移動。我們需要做的第一件事是告訴電腦該資料將要儲存的位置,而這些位置程式設計者們稱它為"變數"。當一個程式需要同時使用多個變數時,我們需要分辨不同的變數,所以我們給它們名稱。而這些名稱就可以在之後程式編寫的過程中使用去代表所對應的變數。
而在使用這些變數前你必須先創建他們,在某些程式語言中(例如Python)在你第一次提及某一個變數時系統便會自動幫你創建該變數。也有些其他的程式語言中(例如Scratch)你必須先告訴系統讓它創建該變數。還有的程式語言(例如Java)必須明確地使用其特定的語言指令去創建一個變數,該指令被稱作為"宣告"。[就以當時所要教導的程式語言為範例,以下我們會以Python做說明:以適合的程式語言做替換]。
當你要創建一個變數時,你首先要做的事就是幫該資料在記憶體中找一個位置做儲存,看到程式中的第一句指令:
colour1 = “red”
該指令會創建一個變數叫colour1然後將字串red儲存於其中。在此強調對該等號最好的稱呼為"得到該值"所以整句指令為"colour1得到red"。
選一位學生上台並給它一個盒子,並指出你剛剛創建了一個新的變數—一個儲存空間。一個變數就像一個盒子可以擁有一個單一的東西,當你的程式擁有的變數愈來愈多時,你必須要有方法去分辨哪一個是哪一個,所以你給它們名稱。拿寫著colour1的標籤繫在該名同學的脖子上,指出該同學已經遺忘他之前的名字了(就是他媽媽幫他取的名字!),從現在開始他會被叫做colour1。說明在寫程式時你可以為變數取任何名字,只要你是持續使用該名字來借代其所指定的變數,也就是那個儲存盒。
剩下的指令是指派,意思是將一個值儲存在變數中,也就是將某個物品放入盒子中。首先在符號"="的左邊給與一個變數名稱,也就是給予一個儲存位置,並在"="的右邊給予你要儲存的東西。在這邊所要儲存的值為字串"red"。
colour1 = "red"
所以這次的指派將值"red"存在叫做colour1的變數中,遵照指令將寫有"red"的值卡放進名為colour的盒子中。
接著下一個指令:
colour2 = "green"
這是非常相似的指令,當該變數還沒有存在時,系統就創造一個變數叫colour2,然後將"green"儲存於其中。尋找下一個自願的學生,給他一個盒子及標籤並且將寫有"green"的卡放進該盒子中。
第一次將值儲存於變數中稱為將該變數初始化,在之前的兩個指派之中,便分別以"red"初始化了colour1,"green"初始化了colour2。
須強調變數名稱與值不同的地方。值指的是放在盒子中的物品—那些值卡。名字就只是標籤(圍繞在自願者的脖子上)。在程式語言中字串的值需要加上引號表示他是值而不是變數名稱。如果沒加上引號代號代表他可能是關鍵字或者是變數名稱。
我們用了兩個值來初始化變數後,我們便可以開始用那些儲存於其中的資料來做些事。在我們簡易的小程式中,我們將會互換兩個變數的值,所以最終結果會是colour1放著"green"的字卡而colour2放著"red"的字卡。
而下一個指令
temp = colour1
我們還沒有看到過temp所以我們必須先宣告該變數。找第三個自願者並給她盒子和標籤。但是這次的指派與之前的兩個稍有不同,符號的右手邊是一個變數名稱而不是值,這表示他第一次得到的會是儲存於另一個變數中的複製品,也就是放在colour1裡的複製品,然後將此複製品放在叫做temp的變數中。
走向代表colour1的人旁,展示一下他的標籤做確認,問他盒子裡儲存了什麼,然後製作一個他的複製品,不管是寫在一張空白的紙上還是利用已經做好的字卡,將複製品放進叫做temp的盒子中。要強調colour1沒有做任何改變,他還是擁有其原本的值不曾被動過,而變數temp只有它的複製品而已。也強調該指派是'temp得到在colour1裡的複製品'而不是其他方法,其移動的方向為
temp ← colour1
下一個指派與此很相像
colour1 = colour2
然而我們已經完成了這兩個變數的創建—這個指派中的變數都是我們以前就已經創建好的,而這個指派只是在複製colour2中的值並將其儲存在colour1中。
走向代表colour2的人旁,並找出他們儲存的值。做一個複製品。再次發生了新的事情,我們不只是做一個初始化,我們正在將值儲存在已經具有值的變數中。在這裡重要的是要強調變數只能儲存一個值。當你把一個新的值卡放在一個盒子裡的時候便會銷毀舊的值卡。當你把新的值放在colour1中,做一個拿出舊的字卡的展示然後摧毀它 - 把它揉爛、撕掉它、吃掉它、把它放在腳底下跳上下 —做個戲劇性地動作將它破壞。指出這個值卡現在已經永遠消失了並且其儲存的新值是剛從其他變數中的複製品。
最後一個指派也很相似,這次將值從temp複製到colour2中並且其舊值被破壞:colour2獲取temp的值。
colour2 = temp
用與前一個類似的方式將此操作表達出來。指出temp中的值是在前一步中從colour1中儲存的那個。這意味著即使在colour1的值被破壞,因為有一個複製品先被安全儲存,我們最終在colour2中得到相同的值。
最後看看結果。發生了什麼? colour1和colour2中的值已經被交換了—藉由使用temp作為額外的儲存空間。原來colour1是存"red"而colour2是存"green"。現在colour1存著"green"而colour2存"red"。
重新強調變數就像特殊的儲存盒作結束並也特別強調:
- 變數被給予名稱所以能再被提及
- 變數擁有著值:實際儲存其中的資料
- 不要將值與變數名稱混淆是很重要的
- 一個變數一次只能存一個值
- 當你儲存一個新值在變數中的同時也摧毀了任何先前儲存於其中的值
- 當你從一個變數取值時是做其值的複製,所以變數的值是不曾更動的
當總結完重點後再回到盒子上。趁志願者還沒下台前,讓班上同學對剛剛的狀況發問,並用道具來解釋。
- 變化與延伸
- 交換錯誤
藉由一個沒有額外儲存空間而會出現交換錯誤的程式(如下)重複模擬執行
colour1 = “red”
colour2 = “green”
colour1 = colour2
colour2 = colour1
事先看看班上能不能預測會發生什麼結果,讓他們說明每一個步驟會發生的事情並試著解釋原因。
- 模擬練習
我們強烈的建議在展示操作完後馬上讓學生進行模擬指派練習,驅使他們了解並可以迅速的更正學生可能擁有的錯誤觀念。
- 其他程式
利用箱子當作變數展示其他較為簡易的程式,包含學生們試著寫過的簡易程式的答案。
- 型態
以類似的方式演示型態(Type),使用例如小盒子代表整數型態而大盒子代表字串型態。這最好作為一個單獨的後續活動而不是在演練變數和指派的同時解釋它。對於那些很苦惱實際上怎麼運作的學生,最關鍵的就是讓他們理解一般的變數和指派怎麼運作的。
- 陣列
陣列可以被展示為具有隔間的盒子,整個盒子擁有一個名稱標籤,並且每個隔間編有號碼。可以將一系列盒子裝在一起製成一個。