翁省輝,吳方
(北京理工大學(xué)珠海學(xué)院計算機學(xué)院,廣東珠海519085)
C語言作為程序設(shè)計的入門課程,我校各理工科專業(yè)均有開設(shè)。該課程的主要目的是培養(yǎng)學(xué)生的計算思維能力,初步掌握程序設(shè)計和程序?qū)崿F(xiàn)方法,對培養(yǎng)學(xué)生程序設(shè)計基本思想、利用計算機求解問題能力有著重要的意義[1-2]。
本文針對學(xué)生在學(xué)習(xí)該課程中普遍存在的一些問題,探討以漸進(jìn)式案例教學(xué)為主線的模式,使學(xué)生更容易掌握課程知識點。本次探討并不是完全放棄傳統(tǒng)的教學(xué)方式,而是將兩者有機結(jié)合,教學(xué)過程中將案例教學(xué)融入傳統(tǒng)教學(xué)中[3]。
以北京理工大學(xué)珠海學(xué)院面向全校非計算機專業(yè)開設(shè)的C語言程序設(shè)計課程為例,該課程重點講授計算機基礎(chǔ)、進(jìn)制轉(zhuǎn)換、C語言簡介、編程環(huán)境、基本數(shù)據(jù)類型、標(biāo)識符、運算符、輸入輸出、順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、數(shù)組、字符串、函數(shù)等內(nèi)容,而課程學(xué)時為48學(xué)時。
由于課程性質(zhì)以及學(xué)時等原因,傳統(tǒng)教學(xué)容易出現(xiàn)注重語法算法知識,輔以例題講解,學(xué)生被動地接受知識[4]。這類方法雖能較好地保證知識的系統(tǒng)性,但是容易導(dǎo)致學(xué)生死記硬背知識點、學(xué)習(xí)興趣不大、掌握知識不牢固等問題,不能充分發(fā)揮學(xué)生學(xué)習(xí)的興趣,導(dǎo)致教學(xué)效果較差。
教材中的傳統(tǒng)案例多數(shù)以數(shù)學(xué)知識為主[5]。一方面我校部分學(xué)生數(shù)學(xué)較薄弱,對案例的理解有一定困難,并且離實際應(yīng)用較遠(yuǎn),學(xué)生普遍存在疑惑:學(xué)習(xí)C語言到底有什么用,無法感受C語言帶來的成就感與自豪感;另一方面這些案例大都圍繞知識點設(shè)計成一個個獨立的案例,無法有效串聯(lián)起來。
漸進(jìn)式案例教學(xué)是指在教學(xué)過程中以一個綜合案例做為主線來展開教學(xué),功能由簡到難,不斷引入新問題,利用每個章節(jié)的知識點逐步解決問題、完善功能,最終達(dá)到一個完整的、具有較強實際意義的綜合案例,從而培養(yǎng)學(xué)生興趣、培養(yǎng)學(xué)生分析、解決問題的能力的一種教學(xué)方法。具體實施時,先向?qū)W生展示案例的最終效果,然后逐步引導(dǎo)學(xué)生完成。
該教學(xué)模式有以下幾個原則:
教學(xué)案例的選擇直接影響學(xué)生的積極性。興趣是最好的老師,如果案例沒選好,學(xué)生初學(xué)時很難認(rèn)可它的價值,學(xué)習(xí)缺乏目地性。這就需要在選擇案例時要充分考慮其趣味性,讓學(xué)生產(chǎn)生興趣,從而調(diào)動學(xué)生的學(xué)習(xí)熱情。
學(xué)生參與討論是案例教學(xué)重要的一環(huán),通過分析案例,學(xué)生可由被動學(xué)習(xí)變?yōu)橹鲃?,教師組織學(xué)生討論,并通過恰當(dāng)?shù)囊龑?dǎo),讓學(xué)生主動提出問題,并思考如何解決。
初始的案例可能覆蓋部分知識點,這就要求要對案例進(jìn)行擴展,既要符合實際需求,又要盡量覆蓋大部分知識點。
本文所采用的案例是一個定時關(guān)機的綜合案例。多年的演示情況可以看出學(xué)生對這個案例表現(xiàn)出較大的興趣。整個程序的運行結(jié)果如圖1所示。
圖1 定時關(guān)機運行界面Fig.1 Timing shutdown operation interface
下面以課程教材李鳳霞教授主編的《C語言程序設(shè)計教程(第3版)》[6]為例,列舉該案例覆蓋教材中的章節(jié)內(nèi)容和知識點(我校非計算機專業(yè)學(xué)生只要求講到函數(shù),如有需要,案例可以再進(jìn)行擴展),如表1所示。
表1 定時關(guān)機案例覆蓋的章節(jié)內(nèi)容及知識點Tab.1 Timing shutdown case covered sections of content and know ledge points
例中的關(guān)機功能是通過執(zhí)行DOS命令中的shutdown來實現(xiàn)的,所以在講解案例前需要講解一些預(yù)備知識點。首先需要講解shutdown這個命令以及參數(shù)的意義,然后再講解stdlib.h中的system函數(shù)的用法。最簡單的關(guān)機代碼如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("歡迎使用定時關(guān)機程序 ");
system("shutdown-s-t 100");/*“-s”表示關(guān)閉計算機,“-t”表括示設(shè)置關(guān)機倒計時,后面的100是時間*/
return 0;
}
取消關(guān)機代碼如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
system("shutdown-a");/*“-a”表示取消關(guān)閉計算機*/
return 0;
}
下面就以上兩段代碼探討漸進(jìn)式案例教學(xué)。
在學(xué)習(xí)完最簡單的HelloWolrd程序之后,就可以利用printf函數(shù)和轉(zhuǎn)義符‘ ’在關(guān)機代碼的基礎(chǔ)上進(jìn)行主界面設(shè)計。主要代碼如下:
printf("---------------------------------- ");
printf("歡迎使用定時關(guān)機程序! 1表示關(guān)機 2表示取消關(guān)機 0表示退出 ");
printf("---------------------------------- ");printf("請輸入您的選擇: ");
不難看出,以上的代碼分別實現(xiàn)了關(guān)機和取消關(guān)機功能,能否將以上代碼合在一起實現(xiàn)一個既可以關(guān)機又可以取消關(guān)機的程序?接下來可以引導(dǎo)學(xué)生應(yīng)用所學(xué)知識來實現(xiàn)此功能。該問題的解決包括3個方面:
1)如何實現(xiàn)讓用戶輸入自己的選擇。此時可以使用scanf函數(shù),同時提醒學(xué)生注意標(biāo)識符的命名規(guī)范以及良好的代碼規(guī)范。主要代碼如下:
int choice=0;
printf("---------------------------------- ");
printf("歡迎使用定時關(guān)機程序! 1表示關(guān)機 2表示取消關(guān)機 0表示退出 ");
printf("---------------------------------- ");
printf("請輸入您的選擇: ");
scanf("%d",&choice);
2)如何跟據(jù)用戶的選擇完成相應(yīng)的功能。此時可以使用多分支if語句來實現(xiàn)。值得注意的是,學(xué)生經(jīng)常將”==”與‘=’混淆,此時可以故意寫漏一個‘=’以加深學(xué)生的印象。另外,此時可以講解1==choice與choice==1的區(qū)別,前者能夠避免將”==”寫成‘=’而編譯器檢查不出的問題。主要代碼如下:
if(1==choice)
{
system("shutdown-s-t 100");
}
else if(2==choice)
{
system("shutdown-a");
}
else if(0==choice)
{
/*此處代碼之后再添加*/
}
else
{
printf("您的輸入有誤! 請重新輸入: ");
}
3)程序運行后一旦用戶完成輸入程序立即退出。這一問題可以通過引入getch()函數(shù)(需要添加頭文件conio.h)來解決。在程序語句return 0之前添加getch()即可實現(xiàn)。
以上的程序只能讓用戶做出一次選擇,而且一旦用戶輸入錯誤,程序運行結(jié)束,程序設(shè)計不夠人性化,此時通過引入while語句和break語句可以解決這一問題。主要代碼如下:
while(1)/*條件為1,永遠(yuǎn)滿足,會一直循環(huán)直至break
退出*/
{
if(1==choice)
{
system("shutdown-s-t 100");
}
else if(2==choice)
{
system("shutdown-a");
}
else if(0==choice)
{
break;/*此處在3.2的基礎(chǔ)上增加break是為了在用戶輸入0時跳出循環(huán)*/
}
}
以上的代碼實現(xiàn)了定時關(guān)機功能,但是時間并不能由用戶自己指定,案例的實用性大打折扣,此時可以引導(dǎo)學(xué)生使用scanf函數(shù)讓用戶輸入一個時間(int型),然后通過使用itoa函數(shù)將int轉(zhuǎn)換成字符串型,最后使用字符串函數(shù)strcat函數(shù)將兩個字符串連接在一起。主要代碼如下:
int hour=0,minute=0;
int seconds=0;
printf("請設(shè)置關(guān)閉超時時間:如1 20表示1小時20分鐘后關(guān)機,請輸入 ");
scanf("%d%d",&hour,&minute);
seconds=hour*3600+minute*60;
char strTime[20];
itoa(seconds,strTime,10);
char strCommands[30]="shutdown-s-t";
strcat(strCommands,strTime);
printf("系統(tǒng)將在%d小時%d分鐘(%d秒)后關(guān)閉! ",hour,minute,seconds);
system(strCommands);
在講解函數(shù)這一章節(jié)內(nèi)容的時候?qū)⒁陨洗a中功能相近的代碼寫在一個函數(shù)中。如3.1中主界面中的代碼可以作為一個函數(shù)的函數(shù)體。主要代碼如下:
void PrintUI
{
printf("---------------------------------- ");
printf("歡迎使用定時關(guān)機程序! 1表示關(guān)機 2表示取消關(guān)機 0表示退出 ");
printf("---------------------------------- ");
printf("請輸入您的選擇: ");
}
C語言程序設(shè)計課程概念抽象、語法枯燥、知識眾多,對學(xué)生的學(xué)習(xí)帶來很大的壓力。鑒于該課程的重要性,應(yīng)該對該課程進(jìn)行各種探索,本文提出的教學(xué)模式也是一個嘗試。多年的實踐結(jié)果表明,本文中的定時關(guān)機案例能夠讓學(xué)生認(rèn)識到C語言的實用性,引起學(xué)生的極大興趣,能改變學(xué)生被動學(xué)習(xí)的局面,取得了較好的教學(xué)效果。
[1] 徐大華.C語言程序設(shè)計教學(xué)探索[J].信息技術(shù),2010(12):26-28.XU Da-hua.Discussion on teaching-method with C programming language[J].Information Technology,2010(12):26-28.
[2] 葛文庚,藺莉.程序設(shè)計基礎(chǔ)課程教學(xué)模式研究與設(shè)計[J].電子設(shè)計工程,2012(4):44-46.GE Wen-geng,LIN Li.Research and design of the program design foundation course teaching[J].International Electronic Elements,2012(4):44-46.
[3] 徐新海,林宇斐.注重計算思維的啟發(fā)式C語言語法教學(xué)[J].計算機教育,2014(17):1-4.XU Xin-hai,LIN Yu-fei.Pay attention to the heuristic C language grammar teaching of Computational Thinking[J].IT Education,2014(17):1-4.
[4] 米磊,賁可榮,趙皚.“面向?qū)W生”的C語言教學(xué)方法研究與實踐[J].計算機工程與科學(xué),2014(A1):5-9.MI Lei,BEN Ke-rong,ZHAO Ai.“Student-Oriented”teaching method of C language[J].Computer Engineering&Science,2014(A1):5-9.
[5] 劉淑嫻,阿里甫·庫爾班,李曉華.簡單案例為主線的教學(xué)模式在C語言教學(xué)中的應(yīng)用[J].計算機教育,2011(4):89-93.LIU Shu-xian,A Li-pu·KU Er-ban,LI Xiao-hua.Application of a simple case of the main line of the teaching model in C language teaching[J].IT Education,2011(4):89-93.
[6] 李鳳霞.C語言程序設(shè)計教程[M].3版.北京:北京理工大學(xué)出版社,2011.