李利明
摘要;把計(jì)算思維貫穿到《C++程序設(shè)計(jì)》課程的教學(xué)中,讓計(jì)算思維和實(shí)證思維、邏輯思維一樣,成為學(xué)生的基本科學(xué)思維能力。對(duì)基于計(jì)算思維的《C++程序設(shè)計(jì)》課程教學(xué)實(shí)踐及強(qiáng)化計(jì)算思維能力培養(yǎng)的教學(xué)方法進(jìn)行了有益的探索。介紹了基于計(jì)算思維教育的《C++程序設(shè)計(jì)》課程設(shè)計(jì)。
關(guān)鍵詞:計(jì)算思維;程序設(shè)計(jì);教學(xué)實(shí)踐;算法
中圖分類(lèi)號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)07-0143-03
《程序設(shè)計(jì)基礎(chǔ)》是大多數(shù)理工科學(xué)生及部分文科學(xué)生的選修課甚至必修課,而C++語(yǔ)言又是大多數(shù)學(xué)校教授這門(mén)課程的首選語(yǔ)言。開(kāi)設(shè)這門(mén)課程的意義,很多學(xué)生甚至部分老師認(rèn)為就只是為了掌握一門(mén)編程語(yǔ)言,為語(yǔ)言而學(xué)習(xí)語(yǔ)言,為編程而學(xué)習(xí)編程。事實(shí)上,大多數(shù)學(xué)生沒(méi)有認(rèn)識(shí)到的是,通過(guò)學(xué)習(xí)一門(mén)編程語(yǔ)言,進(jìn)而學(xué)會(huì)編程,可以讓他們擁有與聽(tīng)說(shuō)讀寫(xiě)同等重要的認(rèn)知能力——計(jì)算思維。可以說(shuō)計(jì)算思維是我們和計(jì)算機(jī)對(duì)話的接口,通過(guò)學(xué)習(xí)這門(mén)課程,讓學(xué)生具備初步的計(jì)算思維能力也是開(kāi)設(shè)《程序設(shè)計(jì)基礎(chǔ)》這門(mén)課程的一個(gè)重要目的。
什么是計(jì)算思維,卡內(nèi)基梅隆大學(xué)的周以真教授對(duì)其進(jìn)行了系統(tǒng)闡述和推廣。周以真教授認(rèn)為,計(jì)算思維代表著一種普遍的認(rèn)識(shí)和一類(lèi)普適的技能,每一個(gè)人,都應(yīng)熱心于它的學(xué)習(xí)和運(yùn)用。如果一個(gè)人具備計(jì)算思維能力,則能讓他“像計(jì)算機(jī)科學(xué)家一樣思考”。對(duì)于計(jì)算思維,她是這樣定義的:“計(jì)算思維是運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念去求解問(wèn)題、設(shè)計(jì)系統(tǒng)和理解人類(lèi)的行為。計(jì)算思維包括了涵蓋計(jì)算機(jī)科學(xué)之廣度的一系列思維活動(dòng)”。那么,什么是像計(jì)算機(jī)科學(xué)家一樣的思考呢?因?yàn)橛?jì)算機(jī)科學(xué)家具備了豐富的計(jì)算機(jī)科學(xué)理論和知識(shí),總是以自己扎實(shí)的學(xué)科知識(shí)從事計(jì)算機(jī)相關(guān)的研究工作,同時(shí),在日常的生活中,也會(huì)自覺(jué)或者不自覺(jué)地運(yùn)用計(jì)算機(jī)學(xué)科知識(shí)解釋身邊的現(xiàn)象、解決身邊的問(wèn)題。
計(jì)算思維描述的不僅是計(jì)算,能計(jì)算不等于有計(jì)算思維;計(jì)算思維是人的思維,不是程序,也不是計(jì)算機(jī)的思維,大學(xué)生學(xué)習(xí)《C++程序設(shè)計(jì)》這門(mén)課,應(yīng)該從單純的語(yǔ)言、編程的學(xué)習(xí),轉(zhuǎn)變到計(jì)算思維的培養(yǎng)學(xué)習(xí)上來(lái),使計(jì)算思維如同實(shí)證思維、邏輯思維一樣,成為每個(gè)學(xué)生應(yīng)該具備的基本科學(xué)思維能力。
如何把計(jì)算思維引入到《C++程序設(shè)計(jì)》這門(mén)課程中來(lái),本人在教學(xué)過(guò)程中開(kāi)展了有益的實(shí)踐和探索,得到了學(xué)生的認(rèn)可。
1基于經(jīng)典算法的計(jì)算思維教學(xué)實(shí)踐
將《C++程序設(shè)計(jì)》課程的重點(diǎn)轉(zhuǎn)到程序設(shè)計(jì)的思想和方法上來(lái),而不是僅僅教授一門(mén)程序設(shè)計(jì)語(yǔ)言及其應(yīng)用。課程以“發(fā)現(xiàn)問(wèn)題——分析問(wèn)題一尋求不同解決方法—對(duì)比選優(yōu)—解決問(wèn)題”的“問(wèn)題求解驅(qū)動(dòng)式”的講授方法,通過(guò)實(shí)際的案例中的一些經(jīng)典算法,盡可能地講授清楚計(jì)算思維在解決實(shí)際問(wèn)題中的作用。
比如在講授完排序算法后,給出一個(gè)背包問(wèn)題的案例;出去遠(yuǎn)足,允許你帶一個(gè)規(guī)定大小的背包,裝盡可能多能量(卡路里)的食品。這是經(jīng)典的背包問(wèn)題。你可以預(yù)先將所有食品的能量按大小排序,然后按順序從高到低裝包。但你的背包是限重的,能量高的食品可能很重,導(dǎo)致你裝的食品很少,從而總能量并不高。一種方法是以卡路里/重量的比率排序,按比率從高到低的順序?qū)⑹称费b入背包,從而希望裝入背包的食品總能量最高。這種以每次價(jià)值最大為依據(jù)解決問(wèn)題的思想就是貪心策略。
貪心策略的基本思想是把求解問(wèn)題的任務(wù)分解為若干個(gè)步驟,但算法在每一步驟的決定可能是短視的,即該步驟所采取的方法是局部最優(yōu)而非全局最優(yōu)解。盡管并不是所有問(wèn)題的局部最優(yōu)解就是全局最優(yōu)解,但在實(shí)際問(wèn)題求解過(guò)程中,仍然可以用貪心策略得到可以接受的問(wèn)題解。
從計(jì)算思維的角度看,貪心策略為我們提供了解決問(wèn)題的一個(gè)方法:以當(dāng)前和局部最優(yōu)化為出發(fā)點(diǎn)去求解問(wèn)題簡(jiǎn)單易行,具有一定的適用性。
在講授函數(shù)的遞歸調(diào)用這個(gè)知識(shí)點(diǎn)時(shí),通過(guò)介紹歸并排序這個(gè)實(shí)例提出分治策略的思想,即把一個(gè)較復(fù)雜的問(wèn)題分解為若干個(gè)與原問(wèn)題同結(jié)構(gòu)但規(guī)模較小的子問(wèn)題,然后以遞歸的方式求解這些子問(wèn)題,并通過(guò)合并子問(wèn)題的解得到原問(wèn)題的解。
分治策略也體現(xiàn)了一種計(jì)算思維在里面,它是解決工作和生活中很多問(wèn)題的一種常用方法。分治策略為我們提供了這樣一種思路,當(dāng)面對(duì)復(fù)雜問(wèn)題時(shí),可以把問(wèn)題轉(zhuǎn)化為相互之間具有一定聯(lián)系的、規(guī)模較小的、解決方法類(lèi)似的子問(wèn)題,最后通過(guò)合并子問(wèn)題的解得到原問(wèn)題的解。
通過(guò)這樣的案例,講解若干典型算法在問(wèn)題求解中的應(yīng)用,揭示其所體現(xiàn)的計(jì)算思維,讓學(xué)生在學(xué)習(xí)算法思想的過(guò)程中逐步培養(yǎng)他們的計(jì)算思維能力。同時(shí)感受具備一定的計(jì)算思維能力所帶來(lái)的好處。
2強(qiáng)化計(jì)算思維能力培養(yǎng)的教學(xué)方法
《C++程序設(shè)計(jì)》作為非計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生的計(jì)算機(jī)語(yǔ)言的入門(mén)課程,要學(xué)好它是有難度的,C++的語(yǔ)法規(guī)則繁瑣、枯燥、抽象,對(duì)具體語(yǔ)法規(guī)則的學(xué)習(xí)和記憶會(huì)影響學(xué)生對(duì)語(yǔ)言本身內(nèi)涵的理解和計(jì)算思維的體驗(yàn)。本人在教學(xué)過(guò)程中,從訓(xùn)練學(xué)生的計(jì)算思維為出發(fā)點(diǎn),將計(jì)算思維的本質(zhì)——抽象和自動(dòng)化作為主線,貫穿于整個(gè)教學(xué)過(guò)程中。從問(wèn)題出發(fā),通過(guò)抽象、約簡(jiǎn),轉(zhuǎn)化成解決問(wèn)題的算法描述,最后得到算法的C++語(yǔ)言實(shí)現(xiàn)。將《C++程序設(shè)計(jì)》課程從以往偏重講授一個(gè)個(gè)孤立的語(yǔ)法知識(shí)點(diǎn)轉(zhuǎn)變?yōu)橐杂?jì)算思維為出發(fā)點(diǎn),把重點(diǎn)放在問(wèn)題求解和算法的實(shí)現(xiàn)上,這樣的教學(xué)方法,可以達(dá)到對(duì)學(xué)生的計(jì)算思維進(jìn)行更好的訓(xùn)練的目的。
在教學(xué)過(guò)程中,多用生活中的例子解釋計(jì)算機(jī)課程中的概念,是讓學(xué)生盡早建立起計(jì)算思維的好方法。比如在講解算法的概念時(shí),從生活中的問(wèn)題求解(比如做菜)出發(fā),講解其與計(jì)算機(jī)求解問(wèn)題的異同點(diǎn),進(jìn)而引出算法的概念、特點(diǎn)和描述方法。在講解遞歸這個(gè)在計(jì)算思維中非常重要的概念時(shí),從生活中的現(xiàn)象出發(fā),比如兩塊面對(duì)面放著的鏡子中的影像,去引導(dǎo)學(xué)生理解遞歸的概念。通過(guò)講解數(shù)學(xué)中的階乘的遞歸定義,讓學(xué)生理解遞歸算法中的兩個(gè)重要條件:求解問(wèn)題的自相似性和遞歸出口。
在教學(xué)過(guò)程中,多用一題多解來(lái)引導(dǎo)學(xué)生深入思考,也是培養(yǎng)學(xué)生計(jì)算思維能力的一個(gè)好方法。教學(xué)中,一些問(wèn)題往往不止一種解決方案,通過(guò)一題多解讓學(xué)生去發(fā)現(xiàn)、尋求更好的解決方法。比如找假幣問(wèn)題,9個(gè)銅幣,其中有一枚假幣比其余的真幣輕,現(xiàn)在有一個(gè)天平,請(qǐng)?jiān)O(shè)計(jì)一個(gè)算法,找出其中的假幣。方法一,每?jī)蓚€(gè)銅幣一組,分為4組,分別放到天平上稱(chēng),前面4組任一組有假幣都可以通過(guò)天平稱(chēng)出來(lái),如果4組都一樣,則假幣是沒(méi)有被分組的那個(gè)銅幣,所以最多稱(chēng)4次可以找到假幣;方法二,先將其中的8個(gè)平分為兩組,如果相等,則剩下的是假幣,否則,假幣一定在較輕的一組里,把這一組的4個(gè)平分成兩組,假幣一定在較輕的一組里,再把較輕一組的兩放到天平上稱(chēng)重找到假幣。這種方法最多需要稱(chēng)3次可以找到假幣。方法三,將9個(gè)銅幣每三個(gè)分為一組,將其中的兩組放到天平上稱(chēng)一次,可以確定假幣在哪一組,再將有假幣的一組分為3組,每組一個(gè)幣,將其中的兩組放到天平上稱(chēng)一次,即可確定假幣。這種方法最多稱(chēng)兩次即可找到假幣??梢钥吹?,三種方法雖然都能找到假幣,但顯然第三種方法效率最高。在教學(xué)中經(jīng)常采用這樣的一題多解的方式可以更好地提高學(xué)生分析問(wèn)題、解決問(wèn)題的能力。
在教學(xué)過(guò)程中,多安排學(xué)生上機(jī)實(shí)踐,它也是培養(yǎng)學(xué)生計(jì)算思維能力的重要方法之一。在實(shí)踐環(huán)節(jié),教師應(yīng)該盡量設(shè)計(jì)難度適中、趣味性比較強(qiáng)的實(shí)驗(yàn)題目,提高學(xué)生的學(xué)習(xí)興趣。比如在講授C++的循環(huán)結(jié)構(gòu)時(shí),要求學(xué)生上機(jī)完成打印輸出一個(gè)由“*”構(gòu)成的菱形圖案,在完成題目的過(guò)程中理解循環(huán)嵌套的機(jī)制,分析內(nèi)循環(huán)和外循環(huán)在輸出圖形中所起的作用,總結(jié)發(fā)現(xiàn)規(guī)律,最后得出打印輸出一般二維圖形的方法。
3基于計(jì)算思維教育的《c++程序設(shè)計(jì)》課程設(shè)計(jì)
計(jì)算思維不僅僅是編寫(xiě)程序,而是運(yùn)用計(jì)算機(jī)的相關(guān)概念、技術(shù)去求解問(wèn)題、設(shè)計(jì)系統(tǒng)和理解人類(lèi)與自然界的行為和現(xiàn)象。大學(xué)應(yīng)該以培養(yǎng)學(xué)生的計(jì)算思維能力為核心,使它成為每個(gè)學(xué)生都具備的基本科學(xué)思維能力。
如何在程序設(shè)計(jì)課程中引入計(jì)算思維,是很多高校正在開(kāi)展的實(shí)踐和探索_8_。下面介紹針對(duì)全校非計(jì)算機(jī)專(zhuān)業(yè)學(xué)生開(kāi)設(shè)“計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(C++)”課程的具體實(shí)施方法。
“計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(C++)”這門(mén)課程的目標(biāo)是:學(xué)生學(xué)過(guò)這門(mén)功課后,能夠系統(tǒng)掌握結(jié)構(gòu)化程序設(shè)計(jì)和面向?qū)ο蟪绦蛟O(shè)計(jì)的理論、方法與技術(shù),增強(qiáng)學(xué)生的動(dòng)手能力,培養(yǎng)學(xué)生的計(jì)算思維能力和創(chuàng)新能力,提高學(xué)生學(xué)習(xí)計(jì)算機(jī)知識(shí)的興趣。
表1是這門(mén)課的教學(xué)安排。除了課程內(nèi)容的講授,實(shí)驗(yàn)和實(shí)踐環(huán)節(jié)也是非常重要的,我們精心準(zhǔn)備了與課程內(nèi)容同步的實(shí)驗(yàn),并且在理論課程結(jié)束后還安排了16學(xué)時(shí)的實(shí)踐環(huán)節(jié),學(xué)生集中在一到兩周內(nèi)完成一個(gè)大的完整的課程設(shè)計(jì)作業(yè),通過(guò)這種形式來(lái)幫助學(xué)生綜合運(yùn)用課程中所學(xué)的知識(shí)來(lái)解決實(shí)際問(wèn)題,從而達(dá)到提高學(xué)生分析問(wèn)題、提高計(jì)算思維能力的目的。
在這門(mén)課程的教學(xué)中,教師時(shí)刻注意以講授程序設(shè)計(jì)的基本思想和方法為綱,在這個(gè)過(guò)程中潛移默化地將計(jì)算思維融入到學(xué)生的思維體系中。
4結(jié)束語(yǔ)
計(jì)算思維能力的培養(yǎng)還處于小規(guī)模的、探索性的階段,本文的很多想法和做法都還不成熟,如何將原來(lái)以面向語(yǔ)法為中心的程序設(shè)計(jì)教學(xué)轉(zhuǎn)變?yōu)橐悦嫦騿?wèn)題求解為主的教學(xué),讓培養(yǎng)學(xué)生的計(jì)算思維能力成為這門(mén)課程的核心目標(biāo),仍然有許多需要亟待解決的問(wèn)題,需要我們共同努力。