摘 要:針對C語言教學(xué)存在枯燥、學(xué)生學(xué)習(xí)興趣不高、以及不能很好地利用C語言解決實際工程問題,本文首先分析了C語言本質(zhì)是人們利用計算機解決實際問題的一種交互工具,確定了C語言教學(xué)的目的是培養(yǎng)學(xué)生利用計算機為人類服務(wù)的工程實踐能力。改革教學(xué)內(nèi)容,從以前注重C語言語法知識和案例的講解,轉(zhuǎn)變?yōu)閷栴}進(jìn)行求解能力的培養(yǎng)。教學(xué)地點從教室轉(zhuǎn)到實驗室,教學(xué)方式采用邊講邊練方式,通過這些教學(xué)改革,使教學(xué)不再局限于C語言的語法規(guī)范和例題的講解,而是致力于培養(yǎng)學(xué)生分析問題、解決實際問題的工程實踐編程能力的培養(yǎng)。
關(guān)鍵詞:C語言;程序設(shè)計;工程實踐;教學(xué)改革
中圖分類號:G642.4;TB-4
C語言以其限制少、使用方便靈活、功能強、直接操縱硬件等諸多優(yōu)點贏得眾多程序設(shè)計人員的喜愛,它是程序設(shè)計的主要工具之一[1-2],是計算機及相關(guān)專業(yè)程序設(shè)計的基礎(chǔ)課程,也是大部分學(xué)生學(xué)習(xí)程序設(shè)計的第一門課程。由于初學(xué)者缺乏計算機基礎(chǔ)知識,同時由于初次接觸程序設(shè)計,許多學(xué)生對類英文的C程序能實現(xiàn)特定的功能感到不可思議。學(xué)習(xí)過程中,C語言具有抽象、邏輯性強、使用靈活等特點[2-4],容易使得學(xué)生感覺這門課程枯燥無味,找不到編程的感覺,學(xué)生不能體會到它的實用性、藝術(shù)性,從而喪失對該課程學(xué)習(xí)的積極性,且遇到難以解決的編程問題(如:語法問題、編譯問題、邏輯問題等)容易放棄。
同時,C語言作為一門實踐性很強的課程,實踐能力的培養(yǎng)是學(xué)好C語言的關(guān)鍵環(huán)節(jié),而傳統(tǒng)的方法只注重C語言語法知識(理論講解)和基本案列的講解的,上課時盡管學(xué)生聽懂教師所講解內(nèi)容,但下課實踐時對題目產(chǎn)生無法下手的感覺。因此,為了改善C語言教學(xué)效果和培養(yǎng)學(xué)生的工程實踐能力,需要對現(xiàn)有的C語言教學(xué)進(jìn)行改革,以符合C語言是人操作計算機的一個工具的特征。
1 明確教學(xué)目的
C語言的教學(xué)中,絕大多數(shù)教師認(rèn)為C語言程序設(shè)計終極目的就是培養(yǎng)學(xué)生的編程能力。這種認(rèn)知存在很大的偏差。使用計算機完成人們預(yù)先給定的任務(wù),必須告訴計算機“做什么”以及“怎樣做”(計算機其實是很“笨”的);反之,計算機完成任務(wù)時,要將計算得到的結(jié)果反饋給用戶,因此,就產(chǎn)生了計算機和人之間通信的問題。人機通信需要信息的載體,這種信息的載體既要被計算機“理解”,也要被人所理解,而“語言”是最好的人機通信的工具。自然語言存在詞匯量大、語法復(fù)雜、語義常出現(xiàn)二義性、語義的理解依賴上下文、以及某些語義不能用符號描述等問題,因而不能作為人機通信工具。這樣一來,迫使人們不得不設(shè)計出詞匯量較小、語法簡單、語義明確的并且適用于計算機描述的語言,這樣的語言稱為“程序設(shè)計語言”(或人工語言)。人工語言有很多,如PASCAL、FORTRAN等,而C語言只是其中的一種人工語言(人工語言的本質(zhì)是人機通信工具)。因此,從這個角度看,C語言教學(xué)目的重點不在C語言語法本身,而在于培養(yǎng)學(xué)生利用計算機這個工具為人類服務(wù)的工程實踐能力,在這個大目的下,最重要的是培養(yǎng)學(xué)生利用計算機這種特殊的工具分析問題、解決問題、并最終將分析問題所得求解問題的精確步驟(即算法)用C語言的語法設(shè)計的程序進(jìn)行驗證的工程實踐能力的培養(yǎng)。
2 教學(xué)內(nèi)容改革
程序設(shè)計是一種具有創(chuàng)造性的工作,程序設(shè)計具有一定的抽象性,它用數(shù)學(xué)的方法去描述一些問題[5]。因此,在C語言課程教學(xué)中,必須打破舊有的教學(xué)模式和知識體系,從以前注重C語言語法知識(理論講解)和基本案例的講解的,轉(zhuǎn)變?yōu)樽⒅啬芰Φ呐囵B(yǎng),在教學(xué)的過程中不能單單滿足于授予學(xué)生多少知識內(nèi)容,而是要加強學(xué)生獨立分析問題、解決問題能力的培養(yǎng)。教學(xué)中,在對每個案列講解時都必須做如下的分析:首先分析程序?qū)⑻幚淼臄?shù)據(jù)以及處理之后的結(jié)果是什么:即哪些是給定的數(shù)據(jù)(顯式/隱式,隱式數(shù)據(jù)必須充分分析給定案列才能得到)、哪些是需要輸入的數(shù)據(jù)(包含數(shù)據(jù)的基本類型)、程序有無輸出?若有,哪些需要輸出。其次,確定求解問題的難點和關(guān)鍵點,對難點和關(guān)鍵點進(jìn)行重點分析,分解到難點和關(guān)鍵點前一步需要做什么,中間過程做什么,最后做什么?當(dāng)分析、難點和關(guān)鍵點問題解決后,就可給出解題思路,形成算法,直至最后代碼的編寫。
其次,是抽象能力的培養(yǎng)。將程序中出現(xiàn)的某些數(shù)據(jù)進(jìn)行抽象,找出數(shù)據(jù)之間的相互關(guān)系,得到問題求解的一般化過程處理方法。
下面以求:1+2+…+100為例,給出分析問題、問題抽象等的過程。
第一步:分析,首先分析問題的功能:求和;再次分析問題的輸入輸出,輸入:無;輸出:1-100數(shù)之和。
第二步:重點分析如何求和?
解決方法:采用小學(xué)生初次拿到該題目時的做法,是多數(shù)學(xué)生能想到的辦法(也是一種“笨”方法,而這種“笨”方法又特別適合找出問題求解的一般規(guī)律,特別適合用程序代碼實現(xiàn)),具體過程如表1所示。
表1 求和問題過程描述
問題抽象:在表1所列步驟中,第1步加2,第2步加3,…,第99步加100,可看出其規(guī)律為:被加數(shù)是次數(shù)+1;其次:每次和的結(jié)果為:上一次的和+被加數(shù),因此,根據(jù)C語言賦值語句特點,將上面得到的結(jié)論抽象為:和=和+被加數(shù)(這里的“=”是C語言中的賦值符號)。
變量的定義:大多數(shù)學(xué)生對一個程序中到底需要多少個變量很迷茫,一種簡單有效的原則:需要變量時在變量定義部分增加即可;同時確定每個變量在整個程序設(shè)計中扮演的角色(一個變量可能扮演多個角色)。根據(jù)上面的分析,該程序所需的變量個數(shù)為2個:一個是次數(shù)(該變量還承擔(dān)被加數(shù)的角色);一個是和值變量(承擔(dān)中間結(jié)果、最終結(jié)果這2個角色)。
初始狀況:和的初始情況:認(rèn)為第1步之前還做了一步求和的操作,按照問題抽象步驟可寫:和=和+被加數(shù)的形式,因此可得到:和+1=1,這個和就是和變量的初始情況,其值為0;其次:做的次數(shù)是從1開始,因此:次數(shù)的初始值為1。
結(jié)束和循環(huán)條件:最后被加的那個數(shù)是100,前面的被加數(shù)均小于100,因此結(jié)束條件就是被加數(shù)大于100,從而根據(jù)結(jié)束條件確定循環(huán)條件為被加數(shù)≤100。
算法描述:通過上面的分析很容易給出該問題的求解過程:初始化和及被加數(shù)的值、當(dāng)被加數(shù)小等于100時不停求和及改變被加數(shù)、最后輸出結(jié)果。
至此,很容易根據(jù)C語言的語法編寫出相應(yīng)的程序代碼了。當(dāng)學(xué)生對問題分析能力得到培養(yǎng)和鍛煉后,面對更復(fù)雜的問題就能找解決問題的方法和切入點,而不至于拿到存在問題無法下手的感覺。
3 教學(xué)模式的改革
教學(xué)改革:一般的C語言教學(xué)中,都是語法規(guī)則的講解,然后是例子講解,最后是工程實踐。到最后,語法規(guī)則講完課程也結(jié)束了。這種教學(xué)固然嚴(yán)謹(jǐn),但存在一些問題:一是方式比較枯燥,學(xué)生比較容易失去興趣;二是容易學(xué)生上課聽懂,下課實踐時對題目無法下手的感覺。三是容易導(dǎo)致學(xué)生產(chǎn)生這樣的誤解,學(xué)習(xí)語法知識是為寫程序而學(xué),不是為解決問題學(xué)。因此面對實際問題就無從下手,不知所措。四是容易讓產(chǎn)生惡性循環(huán)影響,使得教師在后續(xù)程序設(shè)計課程(如VC++、Java、C#等),仍然采用這樣的方式、方法去講解,使得學(xué)生始終不能用掌握到的編程工具解決實際工程項目問題。因此,改變傳統(tǒng)的教學(xué)模式,直接在實驗室進(jìn)行教學(xué),采用邊教學(xué)邊讓學(xué)生親自動手實踐體會各個知識點;其次,改變傳統(tǒng)教學(xué)中只關(guān)注正確格式的書寫,采用正確格式+錯誤格式教學(xué)模式,教學(xué)過程中有意在程序代碼中寫成錯誤的格式或使用學(xué)生錯誤的程序代碼進(jìn)行教學(xué),教學(xué)效果比全部使用正確代碼教學(xué)的效果好許多。
考核改革:改變期末“筆試”這種單一的、“一考定終身”式的考核方式,重視對學(xué)生學(xué)習(xí)過程和工程實踐能力的考核。變單一考核為復(fù)合考核,從多個方面對學(xué)生進(jìn)行考核。改變課程總成績構(gòu)成,由平時成績、實踐(實驗)成績、階段考核3個部分構(gòu)成,每部分所占的比例為:25%、35%、40%。平時成績考核包括出勤、隨堂實訓(xùn)、課堂提問、作業(yè)等的考核。實踐(實驗)成績針對課程的實驗進(jìn)行考核,要求每個實驗均要提交實驗報告;階段考核將學(xué)習(xí)的內(nèi)容分為5個模塊(基礎(chǔ)語法知識、程序設(shè)計結(jié)構(gòu)、數(shù)組及自定義數(shù)據(jù)、函數(shù)和指針、文件操作),每個模塊教學(xué)結(jié)束就分段考試,不再組織期末考試。
實踐改革:C語言作為一門實踐性很強的課程,實踐能力的培養(yǎng)是學(xué)好C語言的關(guān)鍵環(huán)節(jié)。大實驗+小實驗方式,大實驗根據(jù)需要設(shè)計3-5個;每次實驗需要學(xué)生編寫一個實踐報告,報告的主要內(nèi)容包括:算法或關(guān)鍵技術(shù)介紹、實驗代碼、實驗過程(包括:編譯過程中的代碼出錯、原因分析及修改;多組測試數(shù)據(jù)及對應(yīng)的測試結(jié)果)、算法的改進(jìn)、程序的實現(xiàn)、體會及編程心得(含多種方法實現(xiàn)該算法以及對算法執(zhí)行時間進(jìn)行改進(jìn)等)。通過實踐報告的撰寫,進(jìn)一步熟悉C語言的語法知識,深入了解該算法,培養(yǎng)高效、精煉的編程風(fēng)格。
4 結(jié)論
本文針對C語言教學(xué)中存在的問題,分析了C語言的本質(zhì),并從教學(xué)目的的明確、教學(xué)內(nèi)容、教學(xué)地點和方式、實踐環(huán)節(jié)進(jìn)行改革,以適應(yīng)C語言一種人機通信工具本質(zhì)。著重培養(yǎng)學(xué)生利用計算機這個工具為人類服務(wù)的工程實踐能力,即:培養(yǎng)學(xué)生利用計算機這種特殊的工具分析問題、解決問題、并最終將分析問題所得求解問題的精確步驟用C語言的語法設(shè)計的程序進(jìn)行驗證的工程實踐能力的培養(yǎng)。
參考文獻(xiàn):
[1]譚浩強.C程序設(shè)計(第四版)[M].北京:清華大學(xué)出版社,2012.
[2]Kernighan B W, Ritchie D M. The C Programming Language(2nd Edition)[M].Prentice Hall,2001.
[3]Peter Rinz,Tony Crawford.C:In a Nutshell[M].Reilly Media,2006.
[4]Donald E. Knuth. The Art of Computer Programming[M].Addison-Wesley,2002.
[5]雷學(xué)生,胡多.C語言程序設(shè)計教學(xué)方法探討[J].計算機教育,2007(6):41-43.
作者簡介:陳慶利(1975-),男,四川眉山人,副教授,博士,研究方向:數(shù)字圖像處理。
作者單位:樂山師范學(xué)院 計算機科學(xué)學(xué)院,四川樂山 614000
基金項目:樂山師范學(xué)院教學(xué)模式與方法改革試點項目《C語言程序設(shè)計》。