


【摘 要】基于計算思維的項目化實踐,從真實情境出發,提出項目主題,引導學生分析、分解問題,對數據進行分析和組織,利用相關算法,解決實際問題,概括總結出一般框架,遷移至類似問題解決中去,分環節細化培養學生的計算思維。本文以“寬度優先搜索”算法為例做具體闡述。
【關鍵詞】計算思維;C++程序設計;項目化實踐
【中圖分類號】G434" "【文獻標識碼】B
【論文編號】1671-7384(2023)010-053-03
現狀與問題
2017年,教育部頒布的《普通高中信息技術課程標準》明確提出將計算思維作為學科核心素養之一,是個體運用計算機領域的思想方法,在形成問題解決方案的過程中產生的一系列思維活動。
C++程序設計語言不僅擁有計算機高效運行的實用性特征,同時還致力于提高大規模程序的編程質量與程序設計語言的問題描述能力,具有非常廣泛的作用,也是全國青少年信息學奧林匹克競賽使用的語言。程序設計離不開算法,也離不開問題分析與解決的能力,因此,程序設計教學對于培養學生的計算思維具有不可忽視的重要作用。但是,在傳統的程序設計教學模式中,教師會先教授基本的語法規則,然后讓學生通過簡單的上機編程訓練進行相關知識點的學習,學生通常會感覺學習難度較大,難以入門,同時純粹的程序設計教學與生活實際脫離,學生并不能理解學習編程的真正意義,最終導致放棄程序設計的學習。而程序設計教學的最終目的是讓學生掌握解決現實生活中真實問題的方法,故本研究嘗試基于真實問題情境,采用項目式教學方法,在C++程序設計過程中培養學生的計算思維。
基于計算思維的項目化研究
國內外學者研究表明,項目化學習可以設計跨學科的復雜任務,以引導學生綜合運用學科知識與計算思維技能形成項目成果,將有助于綜合發展計算思維,同時還具有激發學生學習興趣、支持學生應用科技手段和其他工具與技能、創建良好的溝通氛圍、滿足個性化學習需求等優勢。如周平紅等人在STEM課程“植物工廠”項目實踐中探索出面向計算思維培養的STEM工程設計教學模式,該模式以計算思維、STEM學科內容知識以及教學法的整合為核心,通過工程設計發揮“系統流程”優勢,將科學、技術與數學的相關內容、活動整合在一起,讓學生在“需要知道”和“需要做”的循環過程中感知情境性問題,解決挑戰性任務[1]。
本研究采用項目化學習方式,嘗試在C++程序設計過程中培養學生的計算思維。但是籠統地培養計算思維是困難的,也不利于后期的評價,因此結合新課標中計算思維的描述將計算思維細化,分為問題分析與分解能力、抽象與轉化能力、算法思維能力以及評估與概括能力這四個方面的能力,將這些能力融入教學中去。基于此,結合教學設計,構建了基于計算思維的C++程序設計項目化學習模式(圖1),從真實情境出發,提出項目主題,引導學生分析、分解問題,抽象問題特征,對數據進行分析和組織,轉化為數據模型。然后,利用相關算法,解決實際問題,概括總結出一般框架,遷移至類似問題解決中去,最終培養學生的計算思維。
基于計算思維的項目化實踐
筆者在高一年級選修課開展了項目化實踐,通過對教學目標、學情、學習內容的分析,進行了基于真實問題情境的項目式教學設計與實施,下面以項目“寬度優先搜索”算法為例進行具體闡述。
1.學習內容與教學目標分析
寬度優先搜索是最基本的圖的搜索算法之一,其核心算法思想為:從出發節點開始,通過寬度優先搜索策略產生第一層后繼節點,判斷目標節點是否在這些節點之中,若有,程序結束;若沒有,再用相同的策略將剛剛第一層產生的節點逐一擴展,得到第二層后繼節點,并逐一檢查這些后繼節點中是否包含目標節點;若沒有,再繼續用相同的策略產生第三層后繼節點……以此類推,直到發現目標節點為止。這一算法也是很多重要的圖論算法的原型,可用于求最短路徑、最小生成樹等問題。
因此,寬度優先搜索的教學目標如下:(1)理解寬度優先搜索算法的核心思想;(2)掌握寬度優先搜索算法的算法描述;(3)能抽象出實際問題特征,利用寬搜算法解決問題;(4)概括總結出寬度優先搜索的一般算法框架。
2.學情分析
寬度優先搜索是在學生了解了基本圖論,學習了深度優先搜索的基礎上進行的,已經有了關于搜索的理解,為學生理解寬度優先搜索打下了基礎。而基于項目的學習強調要讓學生去解決真實的問題,本項目以一個真實的情境“開家長會”引入主題,比較貼近學生生活,同時與項目式學習融合。
3.項目設計理念
在項目設計中,教師根據核心素養和新課標要求,在分析教學內容、學習目標和學生情況的基礎上,創設真實情境,提出與學生生活聯系緊密的項目主題,確定開家長會的最短路徑。學生需要分析、理解項目問題,此過程可以有效培養學生計算思維中的問題分析與分解能力,然后抽象轉化數據模型,基于一定的算法思想,解決問題,在真實情境的項目問題解決過程中,認識和掌握相關算法,發展計算思維。
4.項目學習過程
(1)情境引入
基于真實情境創設項目問題,確定開家長會的最短路徑。高一要開家長會,地點在體育館二樓,小宇的媽媽第一次來學校,對學校的地形不太熟悉。她從西門進入學校,假設每段路長度一致,現在請你幫她設計一條最近的路線,并輸出路徑。
(2)分析與分解問題
分析項目實施的目標,該情境其實是要找從起點到終點的最短路徑。分解一下問題細節,發現每個地點之間并沒有先后關系,每條路徑長度一致。經過以上問題的分析與分解,學生便可以比較容易明確,這個情境問題事實上就是一個不帶權值的無向圖求最短路徑的問題。
(3)抽象與轉化
明確了項目需求之后,對問題進行去情境化,便可以將實際地圖轉化為一個無向圖(圖2)。針對該無向圖,學生接下來考慮的就是用什么樣的數據結構來存儲和處理數據。實踐中大多數學生容易想到的是用鄰接矩陣的方式來分析和存儲數據(表1),用0表示能走,用1表示不能走,如此,就能將實際的問題抽象轉化為算法問題。
鏈接已學內容,可以采用隊列的思想,用數組a來存儲產生結點的隊列,a[i]記錄經過的地點,通過一層一層的層次擴展,第一次擴展到終點的路徑就是最短路徑。用pre[i]記錄前驅地點,這樣就可以倒推出最短路線了。
(4)算法描述
通過以上分析,這種利用隊列來進行路徑搜索的算法就是寬度優先搜索算法(又稱廣度優先搜索),具體過程如下。
第一步要將起點入隊,隊首元素初始化為0,隊尾元素初始化為1。第二步將所有與隊首元素指向的地點直通的建筑入隊,(入隊之前,先用一個布爾數組來判斷這個地點是否在隊列中出現過,如果出現過,此次就不再入隊了),同時將這些地點的前驅地點保存在pre數組中,將隊首指針加1,隊首元素出隊,得到新的隊首元素。重復以上步驟,直到到達目標位置,搜索結束。利用pre[i]倒推出最短路徑,得出答案。
(5)概括評估
通過解決這樣一個真實情境的項目問題,讓學生明白,程序設計是為了解決真實問題而存在的,不是為了編程而編程。在此基礎上,概括總結出一般框架,可以遷移至類似問題解決中去。寬度優先搜索的一般算法描述如下:
int bfs(){
初始化,初始狀態存入隊列;
隊首指針f=0; 隊尾指針r=1;
do {
隊首指針f后移一位(f++),指向待擴展節點;
for (int i=1;ilt;=所有可能性;i++) {" " " "http://產生新結點的規則
if (子節點符合條件 amp;amp;新節點沒有入過隊 ) {
隊尾指針r后移一位(r++);
將新節點存入列尾;
else" if (新結點==目標結點) 輸出并退出;
}
}
}while(flt;r);" " " " " " " " " " " "http://隊列為空,結束搜索
}
總結與展望
經過一學年的項目化實踐探索,筆者認為基于計算思維的C++程序設計項目化學習是有效的,學生的算法設計能力得到發展,競賽成績有了顯著提升,更重要的是學生對于程序設計的興趣明顯更濃了。
1.分解細化,讓計算思維培養落于實處
在基于計算思維的項目化實踐探索中,為切實提升學生的計算思維,筆者將計算思維分解細化為問題分析與分解能力、抽象與轉化能力、算法思維能力以及評估與概括能力這四個方面。針對每一個能力維度來設計項目實施中的學生活動,每一位學生活動就是相應能力維度的培養環節,使得計算思維能力培養落到實處,也有利于后期對于計算思維培養的細化評價和項目化實施環節的迭代優化。經過一學年的項目實踐,綜合學生計算思維問卷的前測與后測數據分析、學生參加各類程序設計比賽的情況、學生算法的掌握程度等,結果顯示,學生的計算思維能力得到顯著提升,特別是抽象與轉化能力、算法思維能力方面。
2.問題解決,有效激發學生內在驅動力
基于真實問題的項目式程序設計教學有其獨特的優勢,教學設計緊緊圍繞著學生自身情況,并根據真實情境的問題開展教學,根據學情和問題分析設計解答。讓學生們深切體會到程序設計就是幫助我們高效地解決實際問題的,體會程序設計的魅力,激發學生學習的內在驅動力,鼓勵學生利用所學算法思想,解決自己身邊的問題,讓計算思維運用到實際生活的方方面面,而不是局限在編程學習中,可進一步拓寬計算思維的培養路徑。
當然,單一運用項目式學習的方式去解決問題,設計的程序方案并不能保證總是全面、完整的,這需要在以后的教學中繼續進行摸索,在原有基礎上補充,不斷創新項目設計方案,提高C++程序設計的教學效果。另一方面,教師也應繼續深入理解基于計算思維的項目化學習模式,將計算思維根植于課堂教學之中。
注:本文系江蘇省教育科學“十三五”規劃2020年度立項課題“基于計算思維的高中生設計與智造的項目化實踐研究”階段性成果(課題編號:D/2020/02/283);江蘇省普通高中課程基地項目“像工程師一樣實踐:普通高中工程整合課程基地”階段性成果
參考文獻
周平紅,牛鈺琨,王康,張屹,李幸,上超望. 面向計算思維培養的STEM工程設計教學模式及應用[J]. 現代遠程教育研究,2022,34(1).
編" "輯:王曉波