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