2022年8月20日 星期六

[fChart, 流程圖, micro:bit] (fChart)流程圖轉(MakeCode)程式

 fChart)流程圖轉(MakeCode)程式

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

Aug. 20, 2022
[0]

問題解決(problem solving的過程(https://reurl.cc/zNry7p)中( 1),我們要培養用流程圖(flowchart來表達解決問題想法的能力,以便隨後能用各種工具(例如:程式、硬體、機構…)來實作(implement出來。

 

1:問題解決的流程

 

本文將從陳會安老師彙整的 fChart 150 (文後皆以 fChart 150 稱之)流程圖範例(https://reurl.cc/bE97Q6)中展示流程圖的有限符號是很容易和各類型的程式語言(本文將以 MakeCode 的積木程式為例)對應轉換的。這個轉換練習將有助於初學者熟稔程式邏輯,也就是說,當我們能將原始問題找到了一種解法之後,只要能將之以流程圖來表示,這個解法就能以工具來實作出來。因此,我們可以說:

 

流程圖為程式邏輯之母

問題

重複顯示五次 Hi

 

上述問題改編自前述 fChart 150 中的「04.迴圈結構─01.前測_顯示5次大家好」來說明從流程圖轉換到 MakeCode 積木程式的整個操作過程。因為 micro:bit 無法顯示中文,我們將要顯示的文字修改為英文 Hi

fChart 流程圖範例

首先,我們從 2 中可以看到紅框標示部份即為迴圈(loop。迴圈的控制有三個要素:迴圈控制變數a)、迴圈控判斷式a <= 5)及迴圈控制變數累加a = a + 1)。而每次進入迴圈時,我們就輸出一次 Hi。流程圖的執行結果如 2 右上的黑底小視窗所示。

以上這段為流程圖(認)(與閱),讀者們應該可以試著自己講給自己聽。如果能說的完整而無卡頓就代表我們真的讀懂了這個流程圖。讀懂之後再想想程式要重複輸出五次相同字串(string問題和這個流程圖是如何解決這個問題的(解決問題的)想法。因此,我們的程式邏輯就能在這樣的練功過程中被紮實的建立了。

 

2fChart 流程圖及其執行結果

流程圖追蹤(trace

結構化程式設計(structural programming由循序、選擇進入到重複結構後,是初學者很容易卡關的點,其原因概是對某些人而言,程式執行邏輯過於抽象化所致[1]。因此,本小節詳細地展示如何追蹤迴圈執行流程及其迴圈控制變數變化的一連串過程,即變數監看(watch,來協助初學者打通程式設計的任督二脈。我們將使用 fChart單步執行(single-step execution功能,逐步地追蹤 2 的完整執行過程。讀者們請特別留意此強大的視覺化功能可以十分穩固地增進我們對程式邏輯的具體了解,但前題是紮馬步的基本功一定要自己「動手」去練、去體會!

設定 fChart 直譯器(interpreter

1. https://reurl.cc/D3m6Aj 下載04-01.前測_顯示5Hi.fpp[2]並將之另存到本機資料夾的根目錄之下(文後皆以 d:\ 為例), 3

(a)


(b)


(c)



(d)
3:下載「04-01.前測_顯示5Hi.fpp

 

2. 連入 fChart 英文版的載點 https://reurl.cc/9pVEEO,將壓縮檔「fChartPython6_en.zip」下載到本機儲存[3]後將之解壓縮(要解到「根」目錄下以防止有中文徑名問題), 4

 

(a)

(b)

(c)

(d)

(e)

(f)

(g)
4:下載「fChartPython6_en.zip」並將之解壓縮到 d:\ 後執行「FlowProgramming_Edit.exe

 

3. 在「fChart Interpreter 6.00」中開啟「04-01.前測_顯示5Hi.fpp[4] 5

 

(a)


(b)


(c)
5:在 fChart 直譯器中開啟「04-01.前測_顯示5Hi.fpp

變數監看 單步執行

程式設計能力的培養分成兩部份:讀和寫,而在深入這兩種練習之前,我們十分建議初學者善用 fChart 的程式執行流程追蹤功能建立兩層面的直覺(intuition觀察(observation手動控制(manual control。我們以下列的步驟 4~6 來詳細分述之:

 

4. fChart 上方的執行控制工具列(fChart Execution Toolbar)上按下執行(execute)按鈕,觀察流程圖動態執行及結果輸出的過程來體會迴圈重複執行的迭代(iteration

5. 按下變數監看視窗啟動按鈕後,我們可以進一步觀察到流程圖在重複輸出字串時,迴圈控制變數 a 的變化過程(由 1 一直跑到 5)。

 

6:變數監看

 

6. 將延遲時間滑桿(slider往「右」打到底即可讓 fChart 進入單步執行模式。此時可以搭配控制按鈕,按一下執行流程圖中的一個符號, 7

 

7:單步執行

MakeCode 程式

本文的標是以 fChart 來訓練 1 問題解決過程的最後一段:從流程圖( 2)轉換為 MakeCode 程式[5]。為了更清楚對照,我們將這兩者併排顯示於 8 MakceCode 的完整程式碼可從 https://reurl.cc/KQMDMy 下載。

 

 

8:流程圖與 MakeCode 程式對照 

進階學習

1.         讓迴圈在「奇數次」時(即 a = 1, 3, 5)加上短音效,例如:ba ding 9

 

9ba ding 短音效

 

2.         修改 8 程式,使得程式在第 i 次迴圈時,閃爍 i Hi,例如:i = 3,則閃爍三次 Hi

3.         2,根據修改完成後的程式再以 fChart 酌修 2 的流程圖。


[0] 六種授權條款
[1] 迴圈是初學程式設計最困難的部分。透過流程圖,初學者可以清楚了解其運行「過程」。如果初學者無法自行追蹤迴圈的執行過程和了解迴圈控制變數的變化,就沒有真正的學會迴圈結構──陳會安老師如是說(https://reurl.cc/8p5aQb)。
[2] 改編自陳會安老師原版的 fChart 150 GitHubhttps://reurl.cc/9p18Oj)。
[3] 如果發生檔案有在下載但無法全部下載完時,請先暫時關閉防毒軟體。
[4] 讀者也可自行變更檔案的關聯(association程式,在 .fpp fChart 流程圖檔上雙撃時可以直接以 fChart 直譯器開啟之。
[5] 從此處就可以很容易看出流程圖和任何程式語言是可以一一對應轉換的。然而,根據陳會安老師的進一步研究,目前尚無這樣可供「自動」轉換的演算法存在。但是,人工手動轉換是可行的!

2022年8月13日 星期六

[fChart, Python] 以 fChart 馭 Python:巢狀迴圈(7/11)

 以 fChart 馭 Python:

巢狀迴圈(7/11)

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

Aug. 13, 2022
[1]

接續著本 fChart 系列前文《以 fChart 馭 Python:練 fChart 了沒?(1/11)》(https://reurl.cc/oeDGN3),我們將針對圖1 的「10 大項目之 6」的 5 個實例(可從https://reurl.cc/RXXDqr 下載),從
原始問題描述以流程圖表達解法
再對照流程圖寫出 Python 語法程式
的過程詳細說明整個問題解決(problem solving)過程。

圖 1:10 大項目之 6

2022年8月10日 星期三

[micro:bit, 流程圖, fChart] 從流程圖學程式邏輯:使用 fChart

 從流程圖學程式邏輯:使用 fChart

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

Aug. 10, 2022
[1]

綜觀各類積木程式(Google Blockly、MIT Scratch、MakeCode…)的學習,學員們拉完/玩積木後是否都已學會了程式設計的「邏輯」了呢?還是只是拼拼湊湊地在玩拼遊戲而已?
程式設計的訓練目在培養解決問題(problem solving)能力(圖 1),在這一方面,陳會安老師以自己研發的流程圖識讀工具 fChart 精編了 150 道題目(https://reurl.cc/m3G2XW) 來協助初學者從流程圖轉換到 Python、C、Java…等各程式語言語法。

圖 1:問題解決流程

因此,本文第 1 至 3 小節以問題形式來包裝所有程式語言都會支援的循序結構(sequential structure)選擇結構(selective structure)重複結構(repetitive structure)結構化程式設計共通的三大結構來呈現圖 1 的完整解題過程。
在第 4 小節中,我們從 fChart 150 題中選出符合這三大結構的三個示例來說明如何用這 150 題來熟悉圖 1 後半中流程圖識讀並能以 MakeCode 程式來實現的轉換過程。
註:fChart 能用的「有限」流程圖符號(symbols)如圖 2。原作者陳會安老師總是再三強調:就是因為它只有幾個少少的符號,所以將問題解法以流程圖來表達是很容易學會的!

圖 2:fChart 包含的流呈圖符號

2022年8月6日 星期六

[micro:bit, 電子學] 小彼特 V2 版之科普電子學:觸控(touch sensing)

 小彼特 V2 版之科普電子學:觸控(touch sensing)

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

Aug. 6, 2022
[1]


圖 1:10 大項目之 5

2022年7月20日 星期三

[fChart, Python] 以 fChart 馭 Python:迴圈和條件(6/11)

以 fChart 馭 Python:

迴圈和條件(6/11)

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

July 20, 2022
[1]

接續著本 fChart 系列前文《以 fChart 馭 Python:練 fChart 了沒?(1/11)》(https://reurl.cc/oeDGN3),我們將針對圖1 的「10 大項目之 5」的 4 個實例(可從此處 下載),從
原始問題描述以流程圖表達解法
再對照流程圖寫出 Python 語法程式
的過程詳細說明整個問題解決(problem solving)過程。

圖 1:10 大項目之 5

2022年7月18日 星期一

[micro:bit, 小彼特, BLE, 藍牙] 你的小彼特(micro:bit)藍牙好配嗎?

 你的小彼特(micro:bit)藍牙好配嗎?

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

July 18, 2022
[1]

小彼特的藍牙配對 [2] 一直是小彼特粉絲們心中的痛,眼看著明明有板載的無線通訊功能可用,但就是看的到連不到,著實氣人。本文在放棄數年後,因一個新訊息而重燃起一絲絲希望。
終於,經過日以繼夜的努力,在 V2 的主板上以 100% 的成功率實測出一套建立藍牙連線的 SOP 供讀者們做後續應用。

2022年6月26日 星期日

[fChart, Python] 以 fChart 馭 Python:迴圈結構(5/11)

以 fChart 馭 Python:

迴圈結構(5/11)

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

June 26, 2022
88x31.png[1]

接續著本 fChart 系列前文《以 fChart 馭 Python:練 fChart 了沒?(1/11)》(https://reurl.cc/oeDGN3),我們將針對圖1 的「10 大項目之 4」的 26 個實例(可從此處 下載),從
原始問題描述以流程圖表達解法
再對照流程圖寫出 Python 語法程式
的過程詳細說明整個問題解決(problem solving)過程。

圖 1:10 大項目之 4

2022年6月10日 星期五

[micro:bit, maker] 小彼特一筆畫完

 小彼特一筆畫完

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

June 10, 2022
88x31.png[1]



馬上實作,拿在手上感受

我:你可以自己畫出一筆點亮所有 LED 燈嗎?
孩:可以,馬上用筆畫出兩種。
我:那能畫出所有可能點亮的方法嗎?
孩:A…(搔頭狀),沒辦法。
我:我也沒辦法,可能性有很多,而且我畫完四個也累了。但是,電腦不怕累,可以一直工作。我可以把任務交給它,讓他發揮專長。接著從口袋拿出小彼特展示給他看。頓時,小孩的眼睛閃閃發光,問說這怎麼辦到的?
─── 小彼特的超級優點就是:馬上實作,拿在手上感受。

問題說明

從小彼特的中心點出發,找出任一條可連接 25 顆 LED 的畫法,但已畫過的點不能再重複經過(圖 1 為四種可能的畫法)。讀者們可以使用圖 2 的學習單動手畫畫看,也可以相互比一比,看看誰能畫出最多種不同的走法。

圖 1:從中心點出發的四種畫法

圖 2:一筆畫完學習單

問題分析

首先,我們以圖 3 座標軸的第一象限來定位小彼特板子上的這 25 顆 LED。圖 4 為一筆畫完的走法分析,其中,圖 4 左黃色座標格表示圖 4 右選擇的走法。

圖 3:小彼特 25 顆 LED 定位座標軸

圖 4:走法分析

麥客友( Escher Hsieh)的解方

我們在這篇 FB 分享文章(https://reurl.cc/QLkDa2)提到使用小彼特來實作的概念後,麥客友 Escher 立刻以遞迴(recursion)的程式設計技巧實作(implement)出這個問題的解法(https://reurl.cc/anDmvD)。
程式的想法很簡單:
邊往前畫邊灑下麵包屑作記號(遞迴),走不通就沿著麵包屑返迴(backtrack)再重新找路。其中,下一步的選擇順序(order) 如圖 5 中 1~4 的逆時鐘(counter clockwise)方向所示,即調整對應的 x 或 y 座標。

圖 5:尋路順序 

Ted Lee 的解析

首先,以圖 6 的方式定義了五個一維陣列 list0~4[] 代表小彼特板載 25 顆 LED 的狀態:

1 表示尚未走過;
0 表示已走過。

圖 6:陳列的初始狀態

另外,程式中定義了以下四個副程式來處理深度優先(Depth-First Search,DFS) [2] 的尋路方式:
  1. setLED():設定 LED  (x, y) 是否被畫到(記錄變數 value = 0)。
  2. findPath():遞迴找路副程式,這是這隻程式的菁華所在。它的設計邏輯是:
    往上下左右四個方向去甞試畫畫看。
    如果可以將 25 顆 LED 畫盡,那就是找到了一種畫法。
    否則,代表此路不通,退回前若干步後再換一條沒走過的路重試。
  3. shwoPath():顯示找出的一筆畫完路徑(path)
  4. getLED():取得 LED (x, y) 的值(有畫到 (x, y), value = 0;否則,value = 1)。
其中,它們之間的呼叫關係(call sequence)整理於圖 7 所示。

圖 7:副程式之間呼叫關係

最後,我們將 Escher 的程式碼再整理加註於此(https://reurl.cc/9GY3lx)供讀者細細詳參。

MakeCode 中的程式碼追蹤(code trace)技巧


上小節所整理的敘述除向原作者請益的結論之外,我們是用 MakeCode 裡的小瓢蟲(debugger)進入單步執行(single-step execution)除錯模式(debug mode)來一步步模擬與追蹤程式的執行過程──這個程式「 閱讀」技巧目非常、超級重要,精熟它必定有助於讀懂他人程式碼的思考邏輯(圖 8)。其中,讀者可以比較一下由積木程 JavaScript 進入除錯模式的差異性。後者才有中斷點(breakpoints)可以插入觀察。

圖 8:MakeCode 的除錯模式

還可以怎麼玩

可能有讀者會和筆者一樣,小時候有玩過一筆畫一個圖案(https://reurl.cc/YvoNX4)或寫一個字(https://reurl.cc/NAm91p)。一筆畫問題資訊科學(Computer Science,CS)領域有一個古典的研究叫尤拉路徑(Eulerian path)https://reurl.cc/anDm9Q),而資訊科學家(computer scientists)也就從此開展出一串圖論(Graph Theory)問題的新研究領域,有興趣的讀者可以從此處再繼續深入研究之。

延伸思考

麥客友的參考作品給了我們一個思考的方向。讀者們,我們是否還能夠再進一步改良(improve)它呢?
  1. 從 (2, 2) 出發,共有幾種不同畫法?
  2. 隨機選出發點 (x, y),x, y = 0~4?
  3. 為什麼程式找到路後不會停?能讓它停下來嗎?
  4. 能隨機找路嗎?

註:教學情境的營造──有溫度的畢典
疫情肆虐讓許多學校都只能辦遠距畢典。xx 的孩子們,你們的身體內都流淌著遠征探索的血液,xx 特使團將出動 SNG(Satellite News Gathering)車到每位畢業生家裡現場採訪,請規畫一條不重複而且能串連每個家庭的完美路線。

2022年6月4日 星期六

[micro:bit, maker] 猛龍搶珠

 猛龍搶珠 [1]

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

Jun 4, 2022
88x31.png[2]

讓金龍爭奪隨機出現的龍珠。

從觀察中建立編程邏輯直覺

請讀者們觀察本文最開頭的 GIF 動畫,比參照題目的要求,拿張白紙動手寫出/畫出該動畫可能的操作流程,而這個流程就是本文的編程邏輯。

設計

龍珠(LED 亮度最亮)會隨機出現在 5*5 的 LED 矩陣(matrix)上。
按 A 以列為主(row major),則由左到右,再由上到下搜尋;
按 B 以行為主(column major)則由上到下,再由左到右尋找。

程式解說

程式一開始時讓 micro:bit 出現開機的愛心圖示,然後讓按鈕控制變數 sw 設定成 -1,其中,
接著,按下 A 時清除畫面後開始由左到右、由上到下尋找龍珠,尋找的流程如圖 1 所示(我們利用 micro:bit 的重複執行 forever() 函式的特性,按鈕按下時在事件積木中設定對應 sw 旗標(flag)值,然後等到輪到 forever() 取得執行權時即進入圖 1 的執行邏輯。)此外,讀者們可以動動腦再想一想:圖 1 的流程圖中有幾個迴圈呢?為什麼?
另一方面,按下 B 的處理邏輯和 A 相同,可參考圖 1 的做法修改之。

圖 1:按鈕 A 的控制流程


完整程式碼如圖 2 所示,讀者可連至自行下載。

圖 2:完整程式碼

挑戰

舉出其他搜尋(search)的方法,例如:由右到左,再由上往下。並修改範例程式來實現(implement)你的想法!

學習參考

本單元配合南一書局七年級資訊科技第二冊 6-3 節的重複結構(repetitive structure)

2022年6月1日 星期三

[micro:bit, maker] 拆地雷

 拆地雷 [1]

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FBhttp://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/

Jun 1, 2022
88x31.png[2]


micro:bit 上滿佈著 25 顆地雷,請趕快通報掃雷小組盡速來拆除

圖 1micro:bit 5*5 雷區

從觀察中建立編程邏輯直覺

請讀者們觀察本文最開頭的 GIF 動畫,比參照題目的要求,拿張白紙動手寫出/畫出該動畫可能的操作流程,而這個流程就是本文的編程邏輯。

設計

按 A+B 重新開局。
按 A 後再按 B 隨機選出要拆除的第 (i, j) 顆地雷,i, j = 0~4。其中,micro:bit 的 LED 矩陣座標系統定位如圖 2:

圖 2:LED 矩陣座標系統

程式解說

完整程式碼如圖 3,以下我們來詳細說明程式的設計邏輯:

1. 開局:按鈕 A+B。如圖 3,在按鈕的ㄈ字形事件處理(event handling)積木(blocks) 內置入將 25 顆 LED 全部點亮的積木。思考:要不要先將所有 LED 清除再點亮呢?為什麼?
2. 拆彈定位:按下鈕 A 隨機選 0~4 的 X 座標位置 i;按下按鈕 B 隨機(random)選 0~4 的 Y 座標 j。
3. 拆除炸彈:當 (i, j)是亮著(請參考 MakeCode 的積木使用說明文件)時將之關閉,表示該炸彈已清除。

圖 3:完整程式碼

挑戰

加上計時功能,設定一分鐘內要全數拆完 25 顆地雷才算過關。或者,讓 micro:bit 上的地雷改為每次玩時是隨機佈 n 顆地雷,n = 1~25。註:感謝黃教授提供「暗雷」玩法,我們修改規則如下:

按 A+B 時 25 顆 LED 全亮(表示雷區範圍)開局並隨機產生 1~25 顆暗雷。
按 A 時,掃雷大隊依序移動探雷。
按 B 確認是否找到地雷。若是誤判,則發出錯誤音效。否則,將 LED 變暗表示該顆地雷已被成功拆除。

相關作品

這段影片中,我們使用了信標(beacon)技術來尋找炸彈並拆除它。相關的程式碼都放在影片留言處。
另外,我們仿做了賴盈志老師的手作做品,也實際動手做出了一個版本

學習參考

本單元配合南一書局七年級資訊科技第二冊 6-2 節選擇結構(selective structure)