





摘要:在學校原生態編程社團環境下,筆者對計算思維進行明確的階梯型概念界定,經研究提出可操作性強,符合小學生思維習慣的1階計算思維、2階計算思維、3階計算思維概念。本文主要通過實例探究如何通過編程工具將1階計算思維轉化為2階計算思維、3階計算思維的實踐過程,為學習者在今后各類編程的學習中搭建起終身學習的“立交橋”。
關鍵詞:1-3階計算思維 "抽象 "自動化 "階梯式
在信息時代,計算思維能力已經越來越廣泛地融入人們的日常生活和生產中。《義務教育信息科技課程標準(2022年版)》明確將計算思維列為學科核心素養。培養計算思維的方式多種多樣,編程教育普遍被認為是培養學生計算思維的重要載體,所以筆者根據學生的年齡特點和認知發展水平進行計算思維實踐,分別在三、四年級開設Scratch編程社團,在五年級成立C++編程社團,旨在引導學生通過利用Scratch編程工具和C++編程工具解決身邊的實際問題,以提升學生的計算思維能力。
一、計算思維實踐的理論依據
(一)計算思維的四要素
2008年周以真教授發表論文《計算思維與關于計算的思維》,明確了計算思維的本質,是抽象(abstraction)和自動化(automation)。
谷歌公司為教育者開發了一套計算思維課程,這套課程提到培養計算思維的四要素,分別是分解、模式識別、抽象以及算法,雖然這不是建立計算思維的唯一方法,但是通過這四個步驟可以更有效地培養和提高計算思維。
(1)分解:把數據、過程或問題分解成更小的、易于管理的部分。一般我們先從現實世界的體驗中抽象出問題再進行分解。
(2)模式識別:觀察數據的模式、趨勢和規律。尋找解決問題所需要的數據、搜索已有的解決問題的方法。
(3)抽象:識別模式形成背后的一般原理。將現實生活中的事物轉化成計算機可以處理的程序。
(4)算法:為解決某一類問題撰寫一系列詳細步驟。將算法通過編程轉化成計算機可以執行的指令。
(二)計算思維階梯式的概念界定
計算思維中的抽象最終是要能夠機械地一步步自動執行。為了確保機械執行的自動化,需要在抽象過程中進行較精確的、嚴格的符號標記和建模,同時也要求計算機系統向公眾提供各種不同抽象層次之間的翻譯工具。隨著應用語言、高級語言、匯編語言和機器語言抽象性的增加,計算機系統執行的自動化也隨之增加。結合小學生的年齡和心理特點,如圖1將小學生計算思維的培養階梯式分為三個階段進行:1階計算思維、2階計算思維、3階計算思維。具體概念如下所述。
1階計算思維,人們利用已經習得的自然語言(以生活經驗和學科知識為基礎)去解決問題。
2階計算思維,人們利用圖形化的Scratch編程語言(以必要的編程知識為基礎)解決問題。
3階計算思維,人們利用符號化的C++編程語言(以必要的編程知識為基礎)解決問題。
1—3階計算思維是計算思維實踐的難點也是重點,下面以“打印九九乘法表”為例闡述具體實現的過程。
二、1階計算思維
小學生對九九乘法表并不陌生,它是由行列算式組成的表格,每個算式的兩個乘數都有規律可循。如何使用自然語言描述出九九乘法表的繪制方法呢?教師引導學生仔細觀察九九乘法表,通過“問題分解促解決—數形分析尋規律—模式建構述方法”的過程來實現1階計算思維。
(一)問題分解促解決
一個較復雜問題的解決不是一蹴而就的,需要將其分解為較易實現的多個子問題,通過將多個子問題各個擊破,最終實現復雜問題的解決。本例中,教師引導學生對九九乘法表仔細分析,從乘法表的形狀、內容上抓住其關鍵特征,將之分解為兩個子問題,這兩個子問題將貫穿整個解決過程。
(1)從形狀上,繪制以“*”為元素的直角三角形(如圖2)。
(2)從內容上,將“*”元素替換為乘法算式。
(二)數形分析尋規律
1.從形狀上,繪制以“*”為元素的直角三角形
為了更好地進行研究,可以用行、列準確定位每個“*”元素。通過分析發現形體整體呈直角三角形的形狀,共有9行,每行“*”元素的個數等于最后一個“*”元素的列數。
2.從內容上,將“*”元素替換為乘法算式
每個乘法算式的結構相同,都是乘數×乘數=結果。第一個乘數變化的規律:從1開始遞加直到等于(行數);第二個乘數變化的規律:一直等于(行數)。
(三)模式建構述方法
人們習慣于在人類世界進行思考和解決問題,再使用日常語言和數學符號進行模式建構,描述出問題求解的初始狀態和變化規律。
1.從形狀上,繪制以“*”為元素的直角三角形
為了解決實際問題,學習者習慣根據已有的知識經驗進行模式建構,大部分同學會按照以下方法進行繪制。
①繪制1個“*”,換行;②繪制2個“*”,換行;③繪制3個“*”,換行……⑨繪制9個“*”,換行。
初始狀態:最先繪制的是第1行第1列的“*”,行數和列數可使用字母i、j表示。
變化規律:列數j從1開始循環遞加到等于行數i,即每行重復繪制i個“*”。
2.從內容上,將“*”元素替換為乘法算式
九九乘法表中每一個算式的兩個乘數都是變化的,這種變化與行數i和列數j的變化息息相關。大部分同學會按照以下方法進行替換:
i=1 j=1時,1×1=1;
i=2 j=1時,1×2=2;j=2時,2×2=4,
……
i=9 j=1時,1×9=9;j=2時,2×9=18;j=3時,3×9=27;j=4時,4×9=36;j=5時,5×9=45;j=6時,6×9=54;j=7時,7×9=63;j=8時,8×9=72;j=9時,9×9=81。
初始狀態:最先替換的是第1行第1列的“*”,設行數為i,列數為j。
變化規律:算式的兩個乘數是遞增變化的,行數i從1開始遞加到9,即重復替換九行,列數j從1開始遞加到等于行數i,即每行替換i個“*”,替換之后的算式為:j*i=結果。
由此抽象出繪制九九乘法表的一般性解決方法,并使用自然語言將之描述出來,這種使用自然語言解決問題的過程,就是1階計算思維的實現過程。
三、2階計算思維
1階計算思維抽象出了問題解決的方法,要在計算機系統中實現問題解決過程的自動化,需要將之轉化為程序語言。Scratch是一款由美國麻省理工學院開發的圖形化編程工具,它將復雜的算法邏輯通過一個個不同形狀、顏色的積木塊來表達,學習者不需要記憶復雜的語法規則,只要通過指令積木的搭建就可以解決問題。在計算機系統中,需要經過“1階計算思維—形式化表達—構造—修改調試—2階計算思維”的路徑來實現問題解決的自動化。
(一)形式化表達
自然語言在不同情境下有不同的意思,有時候還具有二義性,一定程度阻礙了問題解決方法的準確表達,教師需要用更準確的方式對問題解決的方法進行形式化表達。這種表達首先要求簡練,可以通過抽象達成并忽略不重要的細節,關注重點的、有共性的特征;其次是準確,即表達沒有二義性。在計算思維實踐中,不同年齡段的學生具備的抽象能力不同,形式化表達程度也有區別。對于小學生,流程圖是用特定圖形表示算法的較好的方法,它形象直觀地描述出問題解決過程的具體步驟,可以避免自然語言的歧義,且不拘于計算機語言嚴格的語法結構,實際操作中,也可以引導學生使用在線流程圖軟件進行繪制。
1.從形狀上,如何繪制以“*”為元素的直角三角形
學習者在1階計算思維的基礎上進行總結歸納,如圖3為繪制的流程圖,教師重點引導學生理解圖中的兩個滿足條件的“循環往復”,即在一個循環中套入另一個循環。我們可以用外循環和內循環加以區別,其中外循環直觀描述了行數“i”的變化過程,內循環直觀描述了列數“j”的變化過程,整個過程通過控制行、列的遞增變化,巧妙地繪制出以“*”為元素的直角三角形。
2.從內容上,如何將“*”元素替換為乘法算式
學習者直接修改輸出內容,將“*”元素替換為乘法算式:j×i=結果,得出打印九九乘法表過程的流程圖。
流程圖的形式化表達形象直觀易理解,讓整個解決過程躍然紙上。
(二)構造
計算機系統運行的程序,必須由規范的、預先約定的程序設計語言來實現。學習者需要將解決辦法構造成一條條有序的編程語言的命令序列,這個一步步設置編程語言命令的過程就是構造的過程。構造給問題求解提供了一個框架,它建立起一個解決問題的有效操作步驟,其中有效是指每個操作步驟都是可以執行的,通過有限個步驟,一定可以解決問題。
1.從形狀上,如何繪制以“*”為元素的直角三角形
變量來源于數學,在Scratch編程語言中,也常常運用到變量,變量可以理解為只能裝一個數據的小杯子,當裝很多數據時,就需要使用“列表”這個大杯子。學習者建立變量i,j,s分別記錄行數、列數和“*”元素。因為記錄的“*”元素較多,所以選擇建立“乘法表”列表來記錄全部打印結果。
觀察流程圖發現:繪制“*”元素的過程中存在兩個不確定循環次數的循環,當滿足循環結束條件時,會一直循環;當不滿足循環結束條件時,循環結束。學習者在必要的Scratch編程語言基礎知識上,可將每一個循環構造為“重復執行直到……”積木,如圖4所示先構造外循環,它控制了行變量變化,循環結束條件是行變量igt;9;再構造內循環,它控制列變量變化,循環結束條件為列變量jgt;行變量i,通過將兩個“重復執行直到……”積木嵌套以實現對“*”元素行列的控制,在打印平面圖形時經常會使用這個結構。
2.從內容上,如何將“*”元素替換為乘法算式
分析程序,學習者將目光定位在圖4內循環繪制“*”元素的循環體,這里只需要將“*”元素替換成乘法算式即可。乘法算式本身是一個字符串,可以使用多個“連接……和……”積木將前后兩個字符連接起來,以構造實現算式:i×j=結果。
由此,學習者構造出Scratch編程語言的指令打印出九九乘法表。
(三)修改調試
學習者運行Scratch編程語言指令,發現多個算式擁擠在一起,格式不夠工整。這時需要在每一個乘法算式后添加一個空格以使輸出格式工整,即新增一個“連接……和……”積木將算式和空格相連接即可。
這種使用Scratch編程語言解決問題的過程,就是2階計算思維的實現過程。
四、3階計算思維
Scratch編程語言作為一種計算機高級語言,本身就是一種標準化的形式化表達。如果把Scratch編程語言比作一輛外觀漂亮的玩具小汽車,那么C++編程語言就是一輛引擎強勁的電動汽車。C++編程語言提供了更為完善的語言特性,一旦掌握C++編程語言,就能夠在信息高速公路上飛馳。學習者可以通過“2階計算思維—構造—修改調試—3階計算思維”的路徑到達3階計算思維。
(一)構造
1.從形狀上,如何繪制以“*”為元素的直角三角形
使用Scratch編程語言解決過程中存在的兩層循環,外層循環共重復9次,控制了行變量i的變化,內層循環重復次數與外層循環重復次數相等,控制了列變量j的變化。不難發現,Scratch編程語言“重復執行直到……”積木與其他積木的組合實現了C++編程語言中for語句的功能,需要注意的是兩種語句的邏輯是相反的:Scratch編程語言的“重復執行直到……”積木中,如果給定條件成立,就結束循環,否則就執行循環體;而在C++編程語言的計數循環for語句中,如果給定條件成立,就執行循環體,否則就結束循環。在構造時,需要將循環控制條件取反即可。
學習者構造使用for循環嵌套語句實現該過程,通過外循環控制實現行變量i的變化,內循環控制實現列變量j的變化,這是一種特別適合于計算機實現的問題解決模型。如圖5就是構造C++編程語言for循環嵌套命令的過程示意圖。
2.從內容上,如何將“*”元素替換為乘法算式
printf()是一個用于輸出格式化字符串的標準庫函數,它可以將數據按照指定的格式輸出。學習者構造語句:printf(\"%d*%d=%d\",i,j,i*j),即可實現該任務。
(二)修改調試
編譯運行后,學習者發現算式輸出格式有誤,繼續調整輸出命令中算式結果的輸出格式(完整程序如下),最終實現了C++編程語言在計算機系統中的自動化執行,打印出九九乘法表。
這種使用C++編程語言解決問題的過程,就是3階計算思維的實現過程。
結語
在計算思維實踐中,學習者從自己已有的生活經驗出發,把具體生活中的問題分解成更易解決的子問題,在人類世界通過模式建構尋找問題解決的方法,實現1階計算思維,再經歷形式化表達和構造的抽象過程,在計算機世界實現使用Scratch編程語言和C++編程語言自動化地解決問題,階梯式地到達2階計算思維和3階計算思維。對于小學生而言,培養實現1-3階計算思維,并不是要將其培養成程序員或計算機科學家,而是讓每個生活在信息時代的學生都具備有效運用計算思維解決實際問題的能力。
參考文獻:
[1]王榮良.中小學計算思維教育實踐[M].上海:上海科技教育出版社,2019.
[2]趙軍.計算思維與算法入門[M].北京:機械工業出版社,2019.
[3]董榮勝.計算思維的結構[M].北京:人民郵電出版社,2019.
[4]胡玲,劉丹鳳.小學生1—2階計算思維培養的實踐研究——以Scratch編程為例[J].安徽教育科研,2021(71):43-44.
責任編輯:唐丹丹