摘 ?要:文章源于教育教學(xué)實踐,通過對計算思維起源做了簡要闡述,并選擇了計算思維的核心要素:抽象和自動化;從洞察思維過程層層細化、問題需求層層拓展、解決問題算法層層深入等三個方面著手,通過線下課程細節(jié),如數(shù)值的比較、數(shù)組的引入、素數(shù)算法等展現(xiàn)在C語言程序設(shè)計課堂中如何將計算思維有效融入,如何開展計算思維融入程序設(shè)計課堂教學(xué)的實踐研究。
關(guān)鍵詞:計算思維;程序設(shè)計;算法
中圖分類號:TP312;G642 ? ? 文獻標(biāo)識碼:A 文章編號:2096-4706(2020)04-0105-03
Abstract:Based on the practice of education and teaching,this paper briefly expounds the origin of computational thinking,and selects the core elements of computational thinking:abstraction and automation;from three aspects of insight into the process of thinking layer by layer refinement,problem demand layer by layer expansion,problem-solving algorithm layer by layer in-depth,through offline course details,through the comparison of numerical value,the introduction of array,the prime number algorithm and so on,it shows how to effectively integrate the calculation thinking into the C language programming classroom,and how to carry out the practical research on how to integrate the calculation thinking into the programming classroom teaching
Keywords:computational thinking;programming;algorithm
0 ?引 ?言
自周以真提出計算思維后,以計算思維為導(dǎo)向的教學(xué)改革在國際上悄然興起,我國2017年推出的《普通高中信息技術(shù)課程標(biāo)準(zhǔn)(2017年版)》已將計算思維作為信息技術(shù)學(xué)科的核心素養(yǎng)之一。目前,學(xué)術(shù)界尚未在計算思維的內(nèi)涵、教學(xué)內(nèi)容、教學(xué)工具、測評工具等方面達成相對統(tǒng)一的共識,但多數(shù)學(xué)者認為計算思維的本質(zhì)核心是抽象和自動化。抽象是把現(xiàn)實問題的核心抽離出來的過程,關(guān)注現(xiàn)實對象的本質(zhì)特征;自動化是指計算過程在現(xiàn)實系統(tǒng)運作中的所采取的表現(xiàn)形式,如何有效地高效地自動化是計算思維的重要問題。
自上世紀(jì)80年代,全國各院校相繼開設(shè)了計算機相關(guān)課程。C語言程序設(shè)計作為一門必修的入門課程,被廣泛采用?;凇坝嬎闼季S”的C語言課程教學(xué)模式,將不再偏重語法,而是將重點放在思維訓(xùn)練上,課堂上以問題求解為核心。教師的授課重點放在問題求解思路、算法和程序?qū)崿F(xiàn)上。以計算思維為導(dǎo)向的教學(xué)改革,根據(jù)汪紅兵等的提法,分析和梳理了C語言程序設(shè)計各章節(jié)知識點及其對應(yīng)的計算思維培養(yǎng)點,“程序是對實際系統(tǒng)的抽象,C語言程序開發(fā)過程是對系統(tǒng)建模的過程,算法過程體現(xiàn)了計算思維的自動化”,比如說,數(shù)據(jù)類型是實現(xiàn)抽象的載體,C語句是自動化實現(xiàn)的基本單位,函數(shù)體現(xiàn)了模塊功能的抽象,控制結(jié)構(gòu)是對問題求解步驟的抽象和自動執(zhí)行單位。
筆者根據(jù)C語言教學(xué)經(jīng)驗總結(jié),嘗試基于“洞察思維、問題需求、解決算法”三部曲,將計算思維融入程序設(shè)計課堂,進行計算思維融入C程序設(shè)計課堂的初探。
1 ?洞察思維層層細化
在C語言教學(xué)的第一節(jié)課,筆者提問了學(xué)生們兩個問題:“你們知道計算機是如何思維的嗎”“你們知道自己是如何思維的嗎”,面對著兩個問題,同學(xué)鴉雀無聲。一方面可能還不理解思維是什么,另一方面思維的確難以言表。
筆者在課堂上做了個實驗,在屏幕同時展示隨機10個自然數(shù)(比如3、7、12、24、8、21、20、5、16、13)后,然后請同學(xué)們迅速說出最大值和最小值,同學(xué)們立刻異口同聲說出了最大值24,最小值3。這時繼續(xù)提問上面的問題,換了方式,“你們怎么得出最大值24,最小值3”,同學(xué)們依然欲言又止,對于在10個數(shù)字中找出最大值和最小值,對于他們來說是顯而易見的事;然后在屏幕上繼續(xù)同時展示了100個隨機自然數(shù),請他們說出最大值和最小值,此時同學(xué)們有點困惑,隨著時間慢慢過去,報出來的答案參差不齊;接下來又給同學(xué)們依次展示100隨機整數(shù),展示完就要求得出最大值和最小值,這次同學(xué)們在最后一個數(shù)字出現(xiàn)之后,便再一次異口同聲地報出了正確結(jié)果。
通過上面的例子,說明在一些簡單問題上,很容易忽略具體的思維過程。然而讓計算機通過程序設(shè)計來解決的實際問題,往往是簡單問題的巨型化。上述案例說明了計算機如何比較多個數(shù)中的最大值和最小值,其本質(zhì)就是數(shù)值的兩兩比較,對于微小數(shù)據(jù)量的比較,人類往往忽視過程,當(dāng)出現(xiàn)較大數(shù)量級的時候卻有時手足無措。正如周以真指出:計算思維是運用計算機科學(xué)的基礎(chǔ)概念進行問題求解、系統(tǒng)設(shè)計和理解人類行為,是通過約簡、嵌入、轉(zhuǎn)化和仿真等方法,將一個看來困難的問題重新闡述成一個我們知道怎么解決的問題。為此在C語言程序教學(xué)中,對于經(jīng)典的程序算法等,需要引導(dǎo)同學(xué)剖析思維過程,比如質(zhì)數(shù)的算法、水仙花數(shù)的算法等。
2 ?問題需求層層拓展
通過對問題需求層層拓展,幫助學(xué)生建立已有概念的知識鏈,達到鞏固已有知識和引入新知識的目的,實現(xiàn)優(yōu)化抽象建模和自動化水平,發(fā)展計算思維水平的目的。例如在數(shù)組的教學(xué)引入中:設(shè)計一個程序,輸入要求某班10位同學(xué)某門課程的分數(shù),最后打印出總分。根據(jù)學(xué)生們已有的知識和編程技能,很容易建立抽象模型int score=0; //存儲分數(shù)的變量,long sum = 0L; //總分數(shù),float average = 0.0f; //平均分;以及實現(xiàn)自動換解決方案:
for(int i=0;i<10;i++)
{ printf("Enter score:");
scanf("%d",&score);//從鍵盤讀入一個分數(shù)
sum += score;}//將讀入的分數(shù)加到總分數(shù)里面
此時教師對實際需求進行第一次拓展,形成與已有解決方案的沖突,要求同時輸出10位同學(xué)的最高分和最低分,引導(dǎo)學(xué)生深入思考,發(fā)現(xiàn)該方法只保留了最后一個學(xué)生的分數(shù)。因此,如果在此程序的基礎(chǔ)上繼續(xù)求最高分和最低分是行不通的。此時,同學(xué)們重新建立抽象模型和優(yōu)化自動化過程,應(yīng)用到了數(shù)值比較大小的算法思路,int max = 0; //存最大值int min = 100; //存儲最小值,程序做了如下調(diào)整:
for(int i=0;i<10;i++)
{ printf("Enter score:");
scanf("%d",&score);//從鍵盤讀入一個分數(shù)
sum += score;//將讀入的分數(shù)加到總分數(shù)里面
if(score>max)max= score;//保證max中存儲分數(shù)最大值
if(score 此方法雖然能解決最高分和最低分的問題,但除了最高分、最低分以及最后一位同學(xué)的分數(shù),其他學(xué)生的分數(shù)全丟失了,這與現(xiàn)實不符,也不利于后續(xù)的排序計算等,接著教師對現(xiàn)實需求進行第二次拓展,要求保留所有學(xué)生信息,并為后續(xù)計算做好準(zhǔn)備,有學(xué)生可能會使用多個變量存儲分數(shù):int score0=0,score1=0,score2=0,score3=0,score4=0,int score5=0,score6=0,score7=0,score8=0,score9=0;但隨著學(xué)生數(shù)量的增加,此種抽象顯然欠妥,再者也不便于for循環(huán)自動化的進行,教師繼續(xù)制造已有方案與需求之間的沖突,引導(dǎo)學(xué)生計算思維發(fā)展,改進抽象模型和自動化過程,從而引入新的抽象模型——數(shù)組。 3 ?解決問題算法層層遞進 講解編程例題時,解決同一問題的方法要層層遞進,通過不斷優(yōu)化算法,引導(dǎo)學(xué)生不斷思考,幫助學(xué)生不斷擴展認知水平,實現(xiàn)優(yōu)化抽象建模和自動化水平,發(fā)展計算思維水平的目的。例如:在講解判斷并輸出100以內(nèi)所有素數(shù)例題。根據(jù)素數(shù)的定義,因為素數(shù)除了1和本身之外沒有其他約數(shù),所以判斷n是否為素數(shù),最直觀的方法:根據(jù)定義直接判斷從2到n-1是否存在n的約數(shù)即可。 for(int i=3;i<100;i++) for(int j=2;j<99;j++) if (i % j == 0) break;//遇到可以整除的數(shù),即跳出內(nèi)層循環(huán),說明此i不是素數(shù) else return true;//自然結(jié)束內(nèi)層循環(huán),說明此i是素數(shù) 上述自動化方法存在算法時間效率低下的問題。對于每個正整數(shù)n,其實并不需要從2判斷到n-1,根據(jù)數(shù)學(xué)經(jīng)驗可知,一個數(shù)若能進行因數(shù)分解,那么分解時得到的兩個因數(shù)一定一個小于等于sqrt(n)(其算術(shù)平方根),一個大于等于sqrt(n),據(jù)此,上述方法中并不需要遍歷到n-1,只需遍歷到sqrt(n),因為若sqrt(n)左側(cè)找不到約數(shù),那么右側(cè)也一定找不到約數(shù)。以此引導(dǎo)學(xué)生進行算法優(yōu)化;優(yōu)化算法如下: for(int i=3;i<100;i++) for(int j=2;j<=sqrt(i);j++) if (i % j == 0) break;//遇到可以整除,即跳出內(nèi)層循環(huán),說明此i不是素數(shù) else ? ?return true;//自然結(jié)束內(nèi)層循環(huán),說明此i是素數(shù) 此時的算法時間復(fù)雜度已經(jīng)有所降低,同時學(xué)生理解起來難度也不大。到這一步已經(jīng)適合大多數(shù)學(xué)生對素數(shù)求解的算法優(yōu)化需求。但此時仍需要給學(xué)生一個認知的拓展空間,引導(dǎo)學(xué)生認識到在算法優(yōu)化的道路上永無止境,隨著認知水平的提升,可能會設(shè)計出更巧妙的算法過程。通過觀察素數(shù)分布的規(guī)律發(fā)現(xiàn),超過5的素數(shù)有這樣的規(guī)律:與6的倍數(shù)相鄰。例如5和7,11和13,17和19,23等;此時若能給出學(xué)生能夠容易理解的證明最好,例如:令x≥1,將大于等于5的自然數(shù)表示如下:…6x,6x+1,6x+2,6x+3,6x+4,6x+5…可得,不在6的倍數(shù)兩側(cè),即6x兩側(cè)的數(shù)為6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2)它們不可能是素數(shù),再除去6x本身,素數(shù)顯然只可能出現(xiàn)在6x的相鄰兩側(cè)。注意,在6的倍數(shù)相鄰兩側(cè)并不一定就是素數(shù)。 根據(jù)以上素數(shù)的分布規(guī)律,判斷素數(shù)可以6個單位步長,即將優(yōu)化算法循環(huán)中i++步長設(shè)置為6,代碼如下: if (num == 2 or num == 3)// 兩個較小的數(shù)進行處理 return True; if (num % 6 != 1 and num % 6 != 5)// 不在6的倍數(shù)的兩側(cè)的一定不是素數(shù) return False; temp = int(sqrt(num)); for(int i=2;i if (num % i == 0 or num % (i+2) == 0) return False return True // 剩下的全是素數(shù) 通過不同難度算法的層層遞進,使得不同層次的同學(xué)都能找到適合自己的建模需求和自動化過程,這樣既滿足了不同學(xué)生的需求,也在各層次學(xué)生中融入了計算思維。 4 ?結(jié) ?論 文章從思維過程、問題需求、問題算法等三個方面著手,通過課程細節(jié),展現(xiàn)在C語言程序設(shè)計課堂中如何將計算思維有效融入,如何開展計算思維融入程序設(shè)計課堂教學(xué)的實踐研究。此外,注重采用多種方法來解決同一問題;在教學(xué)過程中通過逐步改變條件或增加條件的途徑來拓展案例;在教學(xué)過程中注重從問題分析開始到算法流程圖設(shè)計,再到程序設(shè)計完整地講解一些典型的C程序設(shè)計例題等等也是很多研究者嘗試的途徑。 參考文獻: [1] 王立翔.基于計算思維的python語言課程教學(xué)改革芻議 [J].教育現(xiàn)代化,2017,4(15):12-13. [2] 余先榮.基于計算思維的C語言課程教學(xué)研究 [J].科技資訊,2018,16(26):161-162. [3] 陳國良,董榮勝.計算思維的表述體系 [J].中國大學(xué)教學(xué),2013(12):22-26. [4] 胡曉輝,吳嘉昕,陳永,等.C語言程序設(shè)計課程中計算思維能力的培養(yǎng) [J].教育現(xiàn)代化,2019,6(10):38-40+52. [5] 汪紅兵,姚琳,武航星,等.C語言程序設(shè)計課程中的計算思維探析 [J].中國大學(xué)教學(xué),2014(9):59-62. 作者簡介:周龍(1989-),男,漢族,江蘇鎮(zhèn)江人,教師,講師,碩士研究生,研究方向:計算機編程、計算機網(wǎng)絡(luò)。