李社蕾
三亞學(xué)院理工學(xué)院 海南三亞 572022
C語言是一門非常重要的計(jì)算機(jī)基礎(chǔ)課程,它既具有低級語言的特點(diǎn),又具有高級語言的優(yōu)點(diǎn)。而且C語言程序設(shè)計(jì)也是C++語言程序設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)等計(jì)算機(jī)專業(yè)課程的前導(dǎo)課程。現(xiàn)在許多高等院校將C語言作為理工科學(xué)生的第一門程序設(shè)計(jì)語言課程開設(shè)。C語言教學(xué)大都側(cè)重于語法學(xué)習(xí),教學(xué)的組織形式多是講解語法,通過例題驗(yàn)證語法,最終的目的是掌握語法知識點(diǎn)。這樣培養(yǎng)出來的學(xué)生只會讀程序,不會寫程序。
任何一種語言,都有一套定義語言的規(guī)則,這套規(guī)則稱為該語言的語法。學(xué)習(xí)語言時(shí),學(xué)習(xí)語法是其中較簡單的內(nèi)容,而學(xué)習(xí)怎樣最充分地使用語言才是真正的任務(wù)。C語言教學(xué)的重點(diǎn),就應(yīng)該是培養(yǎng)學(xué)生的編程思想和運(yùn)用計(jì)算機(jī)解決實(shí)際問題的能力。
任務(wù)驅(qū)動(dòng)式教學(xué)法,是德國職業(yè)教育在20世紀(jì)80年代大力推行的一種“行為引導(dǎo)式的教學(xué)形式”。這種以任務(wù)為主體、以職業(yè)行為為引導(dǎo)的教學(xué)方法,學(xué)生在教師的幫助下,緊緊圍繞一個(gè)共同的任務(wù)活動(dòng)中心,在強(qiáng)烈的問題動(dòng)機(jī)的驅(qū)動(dòng)下,通過對學(xué)習(xí)資源的積極主動(dòng)應(yīng)用,進(jìn)行自主探索和互動(dòng)寫作的學(xué)習(xí),并在完成既定任務(wù)的同時(shí),自覺產(chǎn)生一種學(xué)習(xí)實(shí)踐活動(dòng),帶著真實(shí)的任務(wù)在探索中學(xué)習(xí)。運(yùn)用任務(wù)驅(qū)動(dòng)教學(xué)法教學(xué),任務(wù)的設(shè)計(jì)尤其重要,是任務(wù)驅(qū)動(dòng)教學(xué)法研究的重要內(nèi)容。本文研究任務(wù)驅(qū)動(dòng)教學(xué)法在C語言中的應(yīng)用,重點(diǎn)就是研究其中的任務(wù)設(shè)計(jì)。
C語言作為入門語言,對于首次接觸計(jì)算機(jī)語言的學(xué)生來說,一切都是陌生的。大部分學(xué)生會感覺到C語言這門課和以前學(xué)習(xí)的內(nèi)容脫節(jié)了,所有的概念都是新的,找不到一點(diǎn)兒自己熟悉的東西,感覺什么都不懂,對學(xué)好這門課沒有信心。為此,本文設(shè)計(jì)任務(wù)的出發(fā)點(diǎn)在于設(shè)計(jì)的任務(wù)盡量接近學(xué)生,甚至是學(xué)生熟悉的內(nèi)容,對不同的章節(jié)內(nèi)容設(shè)計(jì)不同的任務(wù)。
計(jì)算機(jī)有兩大功能:高速運(yùn)算和海量存儲。C語言的教學(xué)目的,就應(yīng)該是培養(yǎng)學(xué)生運(yùn)用計(jì)算機(jī)的這兩大優(yōu)勢,通過C語言編程來解決實(shí)際問題的能力。
首先介紹計(jì)算機(jī)的工作過程。學(xué)生通過了解計(jì)算機(jī)的工作工程,可以幫助他們思考如何根據(jù)計(jì)算機(jī)的工作方式來控制計(jì)算機(jī),如何通過計(jì)算機(jī)語言控制計(jì)算機(jī)解決實(shí)際生活中的問題。“馮·諾依曼”結(jié)構(gòu)的計(jì)算機(jī)工作過程如圖1所示。
在了解計(jì)算機(jī)的工作過程的基礎(chǔ)上,提出具體的問題,尋求用C語言解決問題的方法和過程。根據(jù)解決問題類型的不同,將C語言內(nèi)容分為七大部分,對每一部分分別設(shè)計(jì)相應(yīng)的任務(wù),循序漸進(jìn),逐步培養(yǎng)學(xué)生的編程思想和編程能力。

圖1 “馮·諾依曼”結(jié)構(gòu)的工作原理圖
任務(wù):設(shè)計(jì)一個(gè)最簡單的任務(wù)來用C語言解決,如求表達(dá)式“3×4+9÷3”的值。
學(xué)生一看這個(gè)表達(dá)式,很興奮,這太簡單了,小學(xué)生都會算,答案脫口而出;但當(dāng)數(shù)值變大時(shí),運(yùn)算起來就有些麻煩了。用C語言來解決這個(gè)問題,學(xué)生的興趣就被提起來了。首先介紹C語言的框架(聲明部分、函數(shù)定義部分),然后引入常量、變量、運(yùn)算符、表達(dá)式、數(shù)據(jù)類型、輸入輸出函數(shù)及順序程序結(jié)構(gòu)等相關(guān)語法內(nèi)容的講解,同時(shí)通過設(shè)計(jì)大量例題,利用這些語法知識點(diǎn)來編寫程序,分析解決問題的思路。
任務(wù)1:已知下面分段函數(shù),輸入任意x的值,求y的值。用C語言編程實(shí)現(xiàn)。

看到這樣一個(gè)分段函數(shù),首先分析解決這類問題的思路,發(fā)現(xiàn)用前面的知識無法解決問題;然后引入選擇結(jié)構(gòu),引入if語句和關(guān)系運(yùn)算符、關(guān)系表達(dá)式、邏輯運(yùn)算符和邏輯表達(dá)式的講解;最后通過設(shè)計(jì)例子(比如:判斷一個(gè)三位數(shù)是不是水仙花數(shù),求三個(gè)數(shù)中的最大數(shù)或最小數(shù)等)進(jìn)行訓(xùn)練。
任務(wù)2:任意從鍵盤上輸入一個(gè)百分制成績score,按下列原則輸出其等級:score≥90,等級為A;80≤score<90,等級為B;70≤score<80,等級為C;60≤score<70,等級為D;score<60,等級為E。
這個(gè)問題完全可以使用if…else…語句的嵌套來實(shí)現(xiàn),但顯然實(shí)現(xiàn)起來很羅嗦。為解決這樣的問題,引出switch語句的講解,然后列舉生活中能夠應(yīng)用switch結(jié)構(gòu)的實(shí)例進(jìn)行訓(xùn)練。
任務(wù)1:求解“1+2+3+4+…+100”,“1*2*3*4+…*100”。
這樣的問題用前面學(xué)過的內(nèi)容解決,要寫兩個(gè)很長的表達(dá)式,在這個(gè)問題的基礎(chǔ)上引出for、while和do…while的講解。通過設(shè)計(jì)大量的例子,如兔子問題、猴子吃桃問題等,反復(fù)訓(xùn)練。
任務(wù)2:求“1到100之間的素?cái)?shù)”。
編寫程序,并分析程序的執(zhí)行效率,分析編寫程序應(yīng)考慮的兩個(gè)重要因素:時(shí)間復(fù)雜度和空間復(fù)雜度。引出break和continue的使用。
任務(wù):根據(jù)一個(gè)學(xué)生N門課的成績,計(jì)算他的平均成績;一個(gè)班50名學(xué)生,每位學(xué)生有N門課成績,計(jì)算本班級某一門課的平均成績;對學(xué)生成績從大到小排序。
用前面學(xué)過的內(nèi)容解決該問題,需要分別定義N個(gè)變量和50*N個(gè)變量,顯然不是解決問題的好方法。分析問題的特點(diǎn),引出對數(shù)組這一構(gòu)造數(shù)據(jù)類型的學(xué)習(xí)。引入解決排序問題的方法,通過冒泡排序和選擇排序等排序方法的介紹,掌握解決排序問題的方法。

圖2 C程序的結(jié)構(gòu)框架
任務(wù)1:編程求解表達(dá)式“1!+2!+……+100!”的值。
任務(wù)2:設(shè)計(jì)程序求一個(gè)班學(xué)生的各科成績的平均分、最高分和最低分的差。
用前面學(xué)習(xí)的方法解決此問題,出現(xiàn)大量的重復(fù)代碼。為了精簡程序,減小編程工作量,引出函數(shù)的概念,其中包括函數(shù)的定義、組成部分、函數(shù)的聲明、函數(shù)的調(diào)用、嵌套調(diào)用和遞歸調(diào)用等內(nèi)容,進(jìn)而引入模塊化設(shè)計(jì)的思想。
引出C程序的結(jié)構(gòu)框架,如圖2所示。學(xué)習(xí)C程序的結(jié)構(gòu)框架對于學(xué)習(xí)C語言非常重要,它使得學(xué)生對C語言有一個(gè)整體的認(rèn)識。C程序的結(jié)構(gòu)框架指出C語言是如何構(gòu)成的,以及怎樣圍繞問題構(gòu)成C程序。
任務(wù):在程序里表示一個(gè)學(xué)生(學(xué)號、姓名、年齡、性別……),怎么表示?
char number[10];
char name[12];
unsigned int age;
char sex;
想表示多個(gè)人呢?定義多個(gè)數(shù)組?例如:一個(gè)班的學(xué)生,每個(gè)學(xué)生(學(xué)號、姓名、年齡和數(shù)學(xué)成績、英語成績)打印指定學(xué)號或姓名的同學(xué)的各科成績。
分析這一問題,考慮用數(shù)組來解決,但數(shù)組中的數(shù)據(jù)有一個(gè)重要特點(diǎn),就是類型相同;現(xiàn)在學(xué)生的各項(xiàng)信息,類型不同,考慮定義多個(gè)數(shù)組;這樣各數(shù)組相互獨(dú)立,一個(gè)學(xué)生的信息被分散在多個(gè)數(shù)組中,使用起來非常不方便,從而引出結(jié)構(gòu)體和共用體來解決,同時(shí)引入順序查找和折半查找等方法。分析存儲方式,可以采用數(shù)組;利用數(shù)組存儲遇到一個(gè)問題,如果這個(gè)信息需要不斷更新,不斷地插入和刪除學(xué)生的情況下,就遇到問題,這樣就引入動(dòng)態(tài)存儲,引入指針數(shù)據(jù)類型。分別使用順序存儲和鏈?zhǔn)酱鎯帉懗龀绦颍w會兩種存儲方式各自的優(yōu)缺點(diǎn),根據(jù)具體問題的需要選擇存儲結(jié)構(gòu)。
任務(wù):考慮一個(gè)分院或者一個(gè)學(xué)校的學(xué)生信息的存儲和處理問題。
這種情況下,因?yàn)樾畔⒘刻螅瑑?nèi)存的容量有限,從而引出與文件操作相關(guān)內(nèi)容的講解,將信息存儲在硬盤上。
總之,C語言課程各部分的教學(xué)過程應(yīng)從任務(wù)設(shè)計(jì)入手,提出問題,分析怎么解決問題,進(jìn)而引出語法知識點(diǎn)。一方面通過合理的任務(wù)設(shè)計(jì),將C語言的語法知識點(diǎn)緊密聯(lián)系在一起,用貼近實(shí)踐的方式讓學(xué)生學(xué)會C語言理論知識;另一方面,針對特定任務(wù)分析問題、提出思路、編程實(shí)現(xiàn)的過程,也正是培養(yǎng)學(xué)生的編程思想的過程。教學(xué)觀念和教學(xué)思想不斷改革,才能符合教學(xué)發(fā)展的要求,這樣培養(yǎng)的學(xué)生才能滿足社會的需要。在C語言的教學(xué)中雖存在很多問題,但也不斷涌現(xiàn)出更多更好的解決辦法,要用不斷創(chuàng)新的眼光去發(fā)現(xiàn)。
[1]盧素魁,唐文彥.從學(xué)習(xí)C語言看學(xué)習(xí)程序設(shè)計(jì)的方法[J].河北大學(xué)成人教育學(xué)院學(xué)報(bào),2000(6):53-54.
[2]譚浩強(qiáng).C程序設(shè)計(jì)[M].3版.北京:清華大學(xué)出版社,2005.
[3]陳奮.提高C語言教學(xué)質(zhì)量初探[J].廈門教育學(xué)院學(xué)報(bào),2005,8(2):71-72.
[4]項(xiàng)響琴.淺談程序設(shè)計(jì)語言C的教學(xué)改革[J].電腦知識與技術(shù),2008(11):1166-1168.
[5]納普爾.高等教育與終身學(xué)習(xí)[M].上海:華東師范大學(xué)出版社,2003.