王靜文 崔國(guó)亮
高中信息技術(shù)新教材的編程和算法教學(xué)注重培養(yǎng)學(xué)生的計(jì)算思維,體現(xiàn)了新課標(biāo)發(fā)展學(xué)生核心素養(yǎng)和學(xué)科能力的理念。本文旨在探究如何在課堂教學(xué)中設(shè)計(jì)豐富的學(xué)習(xí)活動(dòng),培養(yǎng)學(xué)生的計(jì)算思維,并引導(dǎo)學(xué)生產(chǎn)生思維遷移以解決實(shí)際問題。
● 遞進(jìn)式培養(yǎng)策略概述
信息技術(shù)學(xué)科與時(shí)俱進(jìn),不再局限于知識(shí)技能和工具操作,而是注重培養(yǎng)學(xué)生數(shù)字化環(huán)境下的思維方式,使學(xué)生能夠合理運(yùn)用信息技術(shù)解決實(shí)際問題。為了培養(yǎng)學(xué)生的計(jì)算思維,新教材的編程和算法教學(xué)采用項(xiàng)目式學(xué)習(xí)方式,讓學(xué)生在做中學(xué),在學(xué)中做。在項(xiàng)目式學(xué)習(xí)中,應(yīng)用和實(shí)踐是學(xué)習(xí)的載體,活動(dòng)過程就是獲得知識(shí)和培養(yǎng)能力的過程。
高一學(xué)生以前沒有接觸過Python編程,面對(duì)具體的情境,學(xué)生能用自己的話說出解決問題的方法,但不知如何用計(jì)算機(jī)程序來(lái)實(shí)現(xiàn)。例如,判斷一個(gè)數(shù)的奇偶性,通常看它能否被2整除,轉(zhuǎn)換成編程計(jì)算,則采用對(duì)2取模的方法,判斷余數(shù)是否為0。學(xué)生的計(jì)算思維需要慢慢形成,可以從解決簡(jiǎn)單的問題開始培養(yǎng),讓學(xué)生在學(xué)習(xí)活動(dòng)中一邊熟悉基本語(yǔ)法,一邊提升思維能力。
教師在教學(xué)中要不斷摸索,體會(huì)“用教材教”而不是“教教材”。教材中的資源一般具有普適性,是優(yōu)質(zhì)資源,但是不一定滿足所有學(xué)生的需求,教師可以根據(jù)學(xué)情補(bǔ)充相關(guān)資源。因此,依據(jù)教材資源并結(jié)合信息學(xué)競(jìng)賽輔導(dǎo)資源,設(shè)計(jì)一系列學(xué)習(xí)活動(dòng),作為教材的補(bǔ)充,可以讓活動(dòng)內(nèi)容由淺入深,在活動(dòng)開展過程中遞進(jìn)式地培養(yǎng)學(xué)生的計(jì)算思維。
● 學(xué)習(xí)活動(dòng)一脈相承
依據(jù)項(xiàng)目式學(xué)習(xí)因“需”定“學(xué)”的特點(diǎn),基于課程標(biāo)準(zhǔn),結(jié)合學(xué)生的學(xué)情,我們對(duì)教科版必修1《數(shù)據(jù)與計(jì)算》第2單元“編程計(jì)算”的教學(xué)內(nèi)容進(jìn)行了整體規(guī)劃,設(shè)計(jì)了一系列遞進(jìn)式學(xué)習(xí)活動(dòng)。
活動(dòng)1:求一個(gè)三位正整數(shù)每位上的數(shù)字。
設(shè)計(jì)意圖:理解通過整除和取模等運(yùn)算拆分?jǐn)?shù)字的方法;學(xué)會(huì)定義變量、使用賦值語(yǔ)句。拆分?jǐn)?shù)字的方法也將用于后面的問題解決中。
算法分析:利用“//”和“%”等算術(shù)運(yùn)算符拆分一個(gè)三位數(shù),分別得到每位上的數(shù)字。
小結(jié):程序設(shè)計(jì)采用順序結(jié)構(gòu)。學(xué)生需要區(qū)分?jǐn)?shù)學(xué)與Python中算術(shù)運(yùn)算符的表示方法與運(yùn)算功能。
活動(dòng)2:輸入一個(gè)三位正整數(shù),判斷它是不是回文數(shù)。若一個(gè)數(shù)字從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數(shù)。
設(shè)計(jì)意圖:結(jié)合前面拆分?jǐn)?shù)字的算法提取出百位數(shù)和個(gè)位數(shù),判斷它們是否相等;熟練使用if分支語(yǔ)句進(jìn)行條件判斷。
算法分析:如果數(shù)字n的百位數(shù)字h和個(gè)位數(shù)字u相等,則n是回文數(shù),否則不是。
小結(jié):程序設(shè)計(jì)采用分支結(jié)構(gòu)。學(xué)生已經(jīng)掌握拆分?jǐn)?shù)字的方法,在此基礎(chǔ)上,設(shè)計(jì)判斷回文數(shù)的算法變得容易一些。
活動(dòng)3:反轉(zhuǎn)任意位數(shù)的正整數(shù),如輸入123,輸出321。
設(shè)計(jì)意圖:理解反轉(zhuǎn)數(shù)字的算法思想;了解while語(yǔ)句一般用于循環(huán)次數(shù)未知的情況。
算法分析:①將x除以10取余,求得個(gè)位數(shù),并將它添加到y(tǒng)中;②將x除以10取整,去掉個(gè)位數(shù);③重復(fù)步驟①②直到x為0;④輸出y。
小結(jié):程序設(shè)計(jì)采用循環(huán)結(jié)構(gòu)。算法中不僅包含拆分?jǐn)?shù)字的方法,還包含組合數(shù)字的方法,具有一定的難度?;顒?dòng)中教師和學(xué)生一起將流程圖補(bǔ)充完整,然后學(xué)生獨(dú)自將程序補(bǔ)充完整。
活動(dòng)4:輸出所有的“水仙花”數(shù)。所謂的“水仙花數(shù)”,是指一個(gè)三位數(shù)其各位數(shù)字的立方和等于該數(shù)本身。
設(shè)計(jì)意圖:枚舉所有的三位數(shù),使用拆分?jǐn)?shù)字的方法,得到各位數(shù)字,然后通過計(jì)算進(jìn)行判斷;綜合運(yùn)用for循環(huán)和分支語(yǔ)句解決問題。
小結(jié):解決這個(gè)問題采用了循環(huán)+分支的程序結(jié)構(gòu)。學(xué)生學(xué)習(xí)的難點(diǎn)是for語(yǔ)句的循環(huán)過程和if語(yǔ)句條件的設(shè)置。學(xué)生需要注意,range()函數(shù)設(shè)置兩個(gè)參數(shù)時(shí),會(huì)生成一個(gè)左閉右開的數(shù)字區(qū)間,在if語(yǔ)句的條件中兩個(gè)等號(hào)一起使用才能判斷相等。
活動(dòng)5:火柴棒擺數(shù)字問題。有任意數(shù)量的火柴棒,列出這些火柴棒所能擺出的自然數(shù),要求火柴棒正好用完。
設(shè)計(jì)意圖:在解決問題的過程中,學(xué)會(huì)使用自定義函數(shù)進(jìn)行程序設(shè)計(jì)。通過對(duì)算法進(jìn)行優(yōu)化,學(xué)生加深對(duì)算法設(shè)計(jì)的理解。
算法分析:首先確定任意根火柴棒所能擺出的最大數(shù)字,火柴棒數(shù)量分為奇偶兩種情況,偶數(shù)根能擺出的最大數(shù)字由“snum//2”個(gè)1組成,奇數(shù)根火柴棒則先取出三根擺放數(shù)字7,然后用剩余的火柴棒擺放“snum//2-1”個(gè)1。參考程序如圖1所示。
算法優(yōu)化:上述程序中使用“*”運(yùn)算符返回一個(gè)重復(fù)若干次的字符串,在Python語(yǔ)言中適用,在VB和C++等語(yǔ)言中都不適用。運(yùn)用for循環(huán)計(jì)算任意根火柴棒所能擺出的最大數(shù)字,會(huì)使算法更加通用,而且不會(huì)增加算法的時(shí)間復(fù)雜度。相應(yīng)代碼修改如下頁(yè)圖2所示。
小結(jié):在程序設(shè)計(jì)中使用了自定義函數(shù)。理解自定義函數(shù)的難點(diǎn)是函數(shù)的調(diào)用過程:程序執(zhí)行從主程序開始,在主程序中遇到自定義函數(shù)的調(diào)用語(yǔ)句時(shí),才會(huì)轉(zhuǎn)到自定義函數(shù)執(zhí)行,自定義函數(shù)執(zhí)行完成將返回值帶回給主程序。
拓展活動(dòng):十進(jìn)制轉(zhuǎn)換R進(jìn)制。
算法分析:把十進(jìn)制非負(fù)整數(shù)轉(zhuǎn)換為R進(jìn)制,可使用短除法,即“除R取余,逆序排列”。前面拆分十進(jìn)制數(shù)字重復(fù)執(zhí)行對(duì)10取余、再整除10的操作;而十進(jìn)制轉(zhuǎn)換R進(jìn)制則重復(fù)執(zhí)行對(duì)R取余、再整除R的操作。
小結(jié):十進(jìn)制轉(zhuǎn)換二進(jìn)制本來(lái)是一個(gè)難點(diǎn),學(xué)生不易理解,但是在前面解決了一系列數(shù)字問題之后,將解決問題的思維遷移過來(lái),這個(gè)問題就迎刃而解了。
在以上活動(dòng)中所涉及的程序從順序結(jié)構(gòu)到分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),再到分支+循環(huán)結(jié)構(gòu),程序結(jié)構(gòu)不斷升級(jí)。簡(jiǎn)單的拆分?jǐn)?shù)字方法在后面的活動(dòng)中不斷使用,探究?jī)?nèi)容保持在學(xué)生的最近發(fā)展區(qū)內(nèi)。在課堂上,學(xué)生積極思考,尋找解決問題的方法。學(xué)生在編寫代碼、調(diào)試程序、糾正錯(cuò)誤的過程中,感受到了編程的樂趣,激發(fā)了學(xué)生的學(xué)習(xí)興趣。
● 教學(xué)反思貫穿始終
學(xué)生在學(xué)習(xí)編程與算法之前,可能存在畏難情緒,認(rèn)為程序代碼晦澀難懂,算法設(shè)計(jì)比較復(fù)雜,而通過整體規(guī)劃學(xué)習(xí)活動(dòng),能夠引導(dǎo)學(xué)生步步為營(yíng),在算法學(xué)習(xí)中找到樂趣。算法教學(xué)是一項(xiàng)連續(xù)性工程,學(xué)生計(jì)算思維的形成也不是短期能實(shí)現(xiàn)的,這就需要教師不斷反思、不斷摸索,梳理教學(xué)思路,形成系統(tǒng)的知識(shí)框架,引領(lǐng)學(xué)生踏上算法學(xué)習(xí)之路,遞進(jìn)式地培養(yǎng)學(xué)生的計(jì)算思維。
蒼山點(diǎn)題
課程研究日漸深化到一線教學(xué)具體的策略內(nèi)容,這是很重要的發(fā)展環(huán)節(jié),是值得各地大力推進(jìn)的課程發(fā)展措施。
第一篇文章,介紹了如何通過中小學(xué)編程教育的貫通培養(yǎng)進(jìn)行編程教育的行動(dòng)研究,本項(xiàng)目的研究可有效彌補(bǔ)課堂教學(xué)培養(yǎng)目標(biāo)單一和深度不足的問題,能夠針對(duì)創(chuàng)新人才進(jìn)行可持續(xù)培養(yǎng),并具有一定的社會(huì)意義,具有較強(qiáng)的推廣應(yīng)用價(jià)值,主要包括以下幾個(gè)方面:本研究的成果可以為本地甚至全國(guó)提供編程貫通教育的培養(yǎng)模式,改善編程教育起步晚、學(xué)習(xí)效果不明顯等現(xiàn)狀;本研究開發(fā)的編程課程體系、校本教材等可以豐富已有的編程課程資源,為編程教育領(lǐng)域提供參考資源;通過本研究可以在本地推廣編程教育,可以在很大程度上提高學(xué)生的計(jì)算思維和數(shù)字化學(xué)習(xí)與創(chuàng)新能力,提高信息技術(shù)核心素養(yǎng)和解決實(shí)際問題的能力;另外,本研究還可以用來(lái)探索建立“雙腦”培育發(fā)展的新模式,建設(shè)中小學(xué)創(chuàng)新人才免費(fèi)培養(yǎng)的教育基地等。
第二篇文章,介紹了在高中信息技術(shù)新教材的編程和算法教學(xué)中,如何結(jié)合教材資源和信息學(xué)競(jìng)賽輔導(dǎo)資源,圍繞有趣的數(shù)字問題,設(shè)計(jì)一系列遞進(jìn)式學(xué)習(xí)活動(dòng),來(lái)破解教材難點(diǎn)。在項(xiàng)目式學(xué)習(xí)中,從解決一個(gè)簡(jiǎn)單的問題出發(fā),學(xué)生產(chǎn)生用計(jì)算機(jī)解決問題的興趣,隨著活動(dòng)的持續(xù)進(jìn)行,學(xué)生逐漸找到編程解決問題的“感覺”,最終能夠利用合理的算法解決問題,在活動(dòng)過程中遞進(jìn)式地培養(yǎng)了計(jì)算思維。
實(shí)際上,很多一線教師在奧賽輔導(dǎo)、科技社團(tuán)、公益科普等活動(dòng)中都有突出貢獻(xiàn)和顯著成果,期待大家總結(jié)、挖掘可推廣的成果與大家分享。