摘要: C語言程序設(shè)計課程在高校的相關(guān)專業(yè)往往是編程的入門課程,從“門外漢”變成“門內(nèi)漢”的過程不僅需要學(xué)習(xí)基礎(chǔ)的概念、編程知識、編程方法,還需要能夠把自己的智慧轉(zhuǎn)換成計算機能夠識別的代碼,這個轉(zhuǎn)換過程中思維方式也要發(fā)生一些變化,學(xué)習(xí)C語言、實現(xiàn)算法的過程的教學(xué)也需要對學(xué)生進行思維方式的引導(dǎo)和培養(yǎng)。
C語言程序設(shè)計是計算機及信息管理專業(yè)的一門專業(yè)基礎(chǔ)課,一般開在大一年級,課程教學(xué)過程中往往出現(xiàn)學(xué)生“聽得懂、看得懂,編不出”的現(xiàn)象,也就是學(xué)生聽得懂老師講課,也看得懂書上或一些資料上的程序,但是到了讓他們自己編程時,卻編不出來的現(xiàn)象。針對這種現(xiàn)象,結(jié)合作者本人的教學(xué)經(jīng)驗,提出一些關(guān)于教學(xué)的思考。
我們首先分析這種現(xiàn)象產(chǎn)生的原因,因為這是一個普遍現(xiàn)象,就要先分析學(xué)生的接受過程和學(xué)習(xí)能力了。
C語言程序設(shè)計課程往往開在大一年級,絕大多數(shù)學(xué)生沒有任何關(guān)于編程的基礎(chǔ),甚至于一些關(guān)于計算機的基礎(chǔ)知識也似是而非,停留在對計算機的強大功能等表面的東西感興趣,對于內(nèi)部的原因不了解的感性認識上。剛開始他們很多人認為學(xué)編程類似于學(xué)習(xí)應(yīng)用軟件,較快的時間的學(xué)習(xí)就能夠成為編程“高手”。而C語言程序設(shè)計作為入門的第一門課程,必須首次講授關(guān)于編程的一些基本概念,比如常量、變量、數(shù)據(jù)類型、運算符、表達式等。這些內(nèi)容相對顯得枯燥一些,一部分性急的學(xué)生需要耐下心來繼續(xù)學(xué)習(xí),另外,由于這些內(nèi)容是編程的基礎(chǔ),又要求學(xué)生深入掌握,對學(xué)生的心理就需要有所把握了。
隨著學(xué)習(xí)內(nèi)容的推進,有些學(xué)生慢慢的跟不上了,能聽得懂,自己編程則不知從何入手,究其原因,一方面是對算法沒有掌握,一方面是對這門語言本身不太了解。算法是貫穿在整個編程過程中的,有了算法,也就有了編程的思路,學(xué)生對算法不理解或者掌握不夠,直接影響編程,除此之外,對于把現(xiàn)成的算法變成C語言程序,許多學(xué)生雖然能編的出來,但是對解決問題的思路和方法不甚理解,如果沒有給出現(xiàn)成的算法,就又不知如何是好了。這就要求教師在教學(xué)過程中,把算法講透,用各種方法使學(xué)生理解算法,在這個過程中,還有一個關(guān)鍵的問題,就是思維的模式。
計算機編程的思維不僅要求嚴謹,還要求能夠符合編譯器的能力。嚴謹?shù)乃季S才能編出漏洞少的程序,符合編譯器的能力則要求學(xué)生理解計算機能做什么,其在操作過程中是怎么做的,編譯器能編譯什么樣的語句。當(dāng)然具體操作過程是怎么做的并不需要知道具體二進制代碼或命令,那不是C語言的研究范疇,這里需要學(xué)生理解的是計算機能夠識別什么樣的語句,雖然對常量、變量、運算符、表達式等學(xué)生已經(jīng)有所了解和理解,但要把問題都分解到計算機能處理的語句的地步學(xué)生還不太適應(yīng),對于這種思維的培養(yǎng)和訓(xùn)練,作者認為是學(xué)習(xí)C語言的關(guān)鍵。算法本身沒有這么細致,但是卻是這種思維的精簡的表達,對于要解決的問題,也是在計算機能識別什么能處理什么的基礎(chǔ)上表達出解決的方法或步驟,為什么要細到這種程度,很多學(xué)生不清除,怎么細化到這種程度,很多學(xué)生一頭霧水,由于對這種思維的不適應(yīng),很多學(xué)生自己考慮算法時,就表達不出來算法,當(dāng)然編程序也跟著受影響。這種思維模式轉(zhuǎn)變過來了,算法也就容易表達出來,程序也就可以轉(zhuǎn)換過來了。這種思維模式的培養(yǎng)卻是從學(xué)這門課開始,貫穿在整個C語言教學(xué)過程中的。
學(xué)習(xí)C語言從引入常量、變量、運算符、表達式等基本概念的時候,思維已經(jīng)進入編程的準備階段,這個時候不僅要使學(xué)生理解這些概念本身是怎么回事,還需要讓學(xué)生理解這些就是編程的素材,C語言解決所有的問題最終都要細化到語句,而語句就是這些內(nèi)容組成的,怎么樣能把這些常量、變量、運算符、表達式靈活的組合成解決問題的語句,這是編程的關(guān)鍵。就象我們?nèi)绾伟褲h語的一個個單個的詞匯組合成表達特定含義的語句一樣 ,C語言的常量、變量、運算符、表達式相當(dāng)于詞匯,把它們組合成表達特別含義、執(zhí)行特定內(nèi)容的語句需要思維的處理和提升的過程,表達的最具體的就是程序,稍微粗一點就是算法了。而我們在結(jié)構(gòu)化編程中,尤其是初學(xué)者,往往只能是從總體到具體、逐步細化、逐步分解的進行,有了計算機能夠執(zhí)行什么的清楚認識,寫出算法往往就比較貼近實際。
一個人如果知道很多的漢語詞匯,但是不能把詞匯連接成通順的句子,那么就不能說這個人表達能力好。學(xué)習(xí)編程的過程中,如果知道具體的基本的概念和知識,而不能靈活的用來解決問題,就不能認為編程能力強了。因為計算機只是執(zhí)行語句,不去主動解決什么問題,那我們編寫程序,解決問題還需要思維的整理、方式、方法,當(dāng)然這些方式、方法要能夠在計算機上實現(xiàn),就是編寫算法的過程,教學(xué)過程也可以使學(xué)生理解這些方式,漸漸熟悉這種思維,熟悉編程語言。
我們學(xué)習(xí)編程語言的時候很難象我們學(xué)習(xí)漢語一樣,時時都有一個環(huán)境,那么只在課堂的時間去接觸C語言,熟悉的進程必然較慢。課堂上的作用在于接觸、理解,而要掌握則需要自己去試著使用的過程。也就是教師們常說的“C語言的編程能力不是看出來的 ,不是聽出來的,而是自己動手練出來的”。教師在教學(xué)過程中,根據(jù)學(xué)生的接受能力、學(xué)習(xí)能力,化繁為簡,學(xué)生可能能夠接受的更快一些。作者個人的經(jīng)驗,打比方是個非常有效的辦法,能夠幫助學(xué)生對基本概念的理解,如對變量的理解,兩個數(shù)交換的方法的理解、指針的理解等等。要讓學(xué)生自己動手去編程序,除了課后布置的練習(xí)以外,課堂上的練習(xí)也是非常必要的。因為教師很難控制課后學(xué)生到底用了多長時間去編程、去思考編程,課堂上的練習(xí)又要占用大量時間,這和緊張的課時有些沖突,作者認為比較折中的辦法是編程時教師多用板書,這樣在板書過程中教師帶動學(xué)生思維,學(xué)生能夠跟著思考,部分代碼教師可以特意空出來,告知學(xué)生這部分代碼要做什么事,然后可以由學(xué)生補充完整。