05. 流程控制

https://teachinglondoncomputing.org/resources/inspiring-unplugged-classroom-activities/the-imp-computer-activity/

Computer Science activities with a sense of fun: The Imp Computer V1.0, 3 March 2014

Created by Paul Curzon, 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

透過一連串的活動,體驗如何編譯出一支簡單的程式,並體驗流程控制的概念。

每個學生代表一個指令(instruction)。一個指揮卡代表控制的流程,它會被攜帶著指令的學生所持有,然後按照流程接著往下傳遞。如果指令的安排順序是正確的,當傳遞完畢之後,就會得到正確的結果。這個活動可以讓程式執行的過程清楚可見,有助於後續概念的解釋與探討。

在這個單元可以學習到:

  • 程式語言programming
  • if指令
  • 流程控制
  • 程式編譯階段與執行階段
  • 程式編譯的最佳化

活動說明:

1. 我們需要:一張指揮卡8條繩子(每條長1公尺)、指令卡片數張、一個空盒空白紙張數張,以及一張事先寫好的程式代碼


2. 編譯階段(compile time):

(1) 展示以下的程式碼片段(以Python 3語法為例,如果學生的英文程度對此感到困難,可以將英文的句子改用中文進行)

answer = input('can I shut down the computer?')
if ( answer == 'y' ) :
  print ('Shut down started!')
else :
  print ('Computer will keep going.') 
print ('thank you')

(2) 告訴學生,在程式被運行(run)之前,必須先經過編譯(compile),才把程式碼轉換成一種可被執行的形式。程式語言的種類很多,電腦無法直接判讀程式碼的指令,必須轉換成機器語言 - 一種電腦才看得懂的程式寫法。接下來你用這個程式碼片段來做說明。

(3) 第1回合:

        answer = input('can I shut down the computer?')

這是一個「輸入」的指令,使用者將輸入一個值,而這個值會被賦予給一個變數。

自願者1到前面來,他必需想辦法在黑板上留下這句話「can I shut down the computer?」,然後要等待這個問題的回覆,並且儲存這個回覆。

自願者2負責變數的指定,他要拿著標示「answer」的變數空盒,站在自願者1的旁邊。

自願者3扮演「螢幕」的角色,代替自願者1來跟作業系統(老師)溝通,站在黑板前面,由自願者1告訴他,應該在黑板上「顯示」些什麼字(遇到空白鍵時請說"space")。

進行到這裡時,因為必需等候使用者回應了什麼答案,所以程式暫停了。提醒學生這個時候程式還沒真正被執行。

(4) 第2回合:

       if ( answer == 'y' ) :
           print ('Shut down started!')

接下來是邏輯判斷if指令的第一個階段:測試(TEST)

自願者4拿著一條彩色繩子,繩子的另一端由自願者1拿著,告訴他指揮卡的傳遞只能透過手上的繩子。

再找兩位自願者5、6,分持兩條繩子站立於自願者4的左右,繩子的另一端由自願者4所持。

自願者4負責判斷下一步的流程走向,他的任務是要看看志願者2手上「answer」空盒內的紙片內容,如果看到「y」,下一步就交由「自願者5」來執行,如果看到了別的字,下一步則是由「自願者6」執行

(5) 第3回合:

5號自願者,手持一張卡片,內容是必需在黑板上顯示出「Shut down started!」,這個動作由自願者3來作,邊念邊在黑板上書寫訊息(遇到空白鍵一樣要說"space")。

6號自願者,手持一張卡片,他必需想辦法在黑板上留下這句話「Computer will keep going.」,這個動作由自願者3來作,邊念邊在黑板上書寫訊息。

(6) 第4回合:

最後一位自願者7,從5、6號自願者手上拿到繩子的另一端,並手持訊息卡片,這也是一個顯示訊息的指令。當他輪到執行動作的時候,他必需想辦法在黑板上留下這句話「'thank you'」,這個動作由自願者3來執行,邊念邊在黑板上書寫訊息。

因為自願者7已經是最後一位,當他完成顯示訊息的動作之後,流程就算結束了。老師扮演的角色稱為「作業系統(operating system)」。至此,編譯階段完成,所有自願者的站位分佈大致如下圖。

3. 執行階段(run time):

(1) 告訴學生,老師扮演的是作業系統的角色,接下來由老師來控制程式的執行細節。老師手持「指揮卡」用來標示現在執行到哪個步驟了。

(2) 首先是自願者1(自願者2此時站在他旁邊,手持空盒),要求自願者3在黑板上寫下「can I shut down the computer?」,接著由老師在白紙寫上「y」或是其他答案,投入盒中。

(3) 流程交給自願者4,只有他可以觀看空盒內白紙上的答案,並決定接下來的流程方向。

(4) 接到流程的自願者5或6,要求自願者3在黑板上寫下對應的訊息,結束後傳遞流程給自願者7。

(5) 自願者7要求自願者3書寫訊息「'thank you'」後,至此即完成執行階段。

運算思維:

透過活動,我們看到程式語言中的if指令,在編譯時會將流程分成兩條路線,但是最後還會結合在一起。雖然在撰寫程式碼的時候,我們是一行指令接著一行輸入的,但是實際上只會選擇其中一個分支來進行。if指令總是要先進行一個test,結果只有「是(ture)」「否(false)」兩種結果。

程式在執行(run)之前,一定要先經過編譯(compile)的階段,除了把只有人類看得懂的程式語言,轉換成電腦看得懂的形式之外,還會先檢查在語法上是否有拼寫錯誤。程式被編譯後,就可以被作業系統所執行,來得到原本我們預期的結果。在下次執行同一支程式時,不需要再重新編譯一次,除非我們更改了原本程式碼的內容

接下來我們會實際透過簡單的程式設計流程,來學習利用「if」指令功能進行邏輯的控制。

延伸活動:

由使用者輸入兩張撲克牌的「顏色」為紅色(red)黑色(black)。如果兩張同花色,則顯示「match!」;如果兩張不同花色,則顯示「not the same.」。程式碼如下:

card1 = input('Please input the color of 1st card (red or black) : ')
card2 = input('Please input the color of 2nd card (red or black) : ')

if ( card1 == 'red' and card2 == 'red') :
    print ('match!')

else :
    if (card1 == 'black' and card2 == 'black') :
        print ('match!')
    else :
        print ('not the same')
      
print ('thank you')

這次請學生嘗試安排編譯階段的所有自願者,包含站位、拉繩、放變數的盒子以及指揮卡的流程,總共需要幾位自願者?試著在紙上先畫出站位安排,再按照學生的設計,實際施實編譯與執行階段,測試會不會發生流程上的錯誤。