一、引言
許多院校的專業(yè)開設(shè)了C語言課程,將其作為學(xué)生學(xué)習(xí)程序設(shè)計技術(shù)的入門課程,這與C語言的特點是分不開的。C語言不但可以編寫系統(tǒng)軟件,而且可以根據(jù)用戶的需要編寫出滿足用戶要求的應(yīng)用軟件,尤其是C語言具有很好的對計算機的硬件編程能力。同時,C語言具有邏輯性強、處理問題周密、嚴謹?shù)奶攸c,是集知識和技能于一體,實踐性很強的課程。學(xué)生通過學(xué)習(xí)C語言可掌握程序設(shè)計的一些基本方法和技巧。然而C語言的數(shù)據(jù)類型較多、表達式豐富、語法結(jié)構(gòu)較復(fù)雜,使它成為一門教師難教、學(xué)生難學(xué)的課程。因此,在重視理論教學(xué)的同時,必須加強實驗環(huán)節(jié)。只有上機實踐才能正真學(xué)會如何編寫程序和調(diào)試程序,體會到“優(yōu)化”程序;也只有通過上機實踐才能更好地掌握程序設(shè)計的理論知識。然而,在C語言實驗課中,我這兩年的教學(xué)觀察中發(fā)現(xiàn)普遍存在以下幾個問題:
第一,學(xué)生沒有明確的實驗?zāi)繕耍瑢嶒炁d趣不大。上機時一些學(xué)生無所事事或玩游戲,不但害了自己,還影響其他同學(xué)。第二,現(xiàn)有教材中上機實驗都立足于C語言本身的一些語言規(guī)則,和實際開發(fā)脫節(jié),沒有較容易理解和生動有趣的范例,比較死板、枯燥。第三、現(xiàn)有實驗大多注重語句、語法等,沒有把編程解題思路和程序測試等放在首位,對學(xué)生分析問題和解決問題的能力訓(xùn)練不夠。
二、實驗教學(xué)探討
我在教學(xué)的過程中,職借鑒職業(yè)技術(shù)學(xué)院的職業(yè)性教學(xué)的經(jīng)驗,注重職業(yè)崗位能力與職業(yè)技能的訓(xùn)練,注重解決問題、分析問題和自學(xué)等能力的培養(yǎng)。在C語言實驗上機課中,主要是引導(dǎo)學(xué)生突破傳統(tǒng)的思維方式,培養(yǎng)學(xué)生讀、寫程序和調(diào)試程序的能力以及提高上機的學(xué)習(xí)興趣和自主實驗的方法技巧等。
1、簡化入門實驗,提高學(xué)生實驗興趣 學(xué)生大多已習(xí)慣于計算機的圖形操作界面,且基礎(chǔ)比較薄弱,動手能力相對也差,加上或多或少的惰性,而開始學(xué)習(xí)C語言后,突然進入的是一個純英文的界面和純鍵盤操作,這種反差很大。為減輕學(xué)生畏懼壓力,讓學(xué)生容易上手,可簡化C語言的入門實驗操作:(1)在桌面上創(chuàng)建TC的快捷方式,雙擊后可直接進入TC編輯環(huán)境。(2)在編輯、編譯、連接及運行C語言程序時,教學(xué)生直接按F2鍵進行存盤操作,Ctrl+F9運行程序,Alt+F5看到運行結(jié)果。而沒必要讓學(xué)生先認識TC的菜單中每個英文單詞的意義等,將TC環(huán)境的細節(jié)認識和程序的編譯、連接等單步操作留到后面實驗中逐步了解。學(xué)生一上機就能體會到成功,并利用發(fā)音和動畫程序引起學(xué)生的興趣。
2、設(shè)計針對性的實驗 設(shè)計一些學(xué)生們比較感興趣的編程題目,加強學(xué)生對程序錯誤的診察和校正能力、測試關(guān)系和邏輯表達式的能力、程序代碼優(yōu)化能力等方面的培養(yǎng)。從輸入輸出語句上機開始,我有意設(shè)計了相應(yīng)的上機實驗。如在選擇結(jié)構(gòu)中,設(shè)計如下過程:
(1)實驗內(nèi)容和步驟:①例:有如下程序段(讓學(xué)生填寫成完整的程序):
if(a>b)scanf(“%d”,x);
else scanf(“%d”,x);
為了更容易看明白程序的邏輯結(jié)構(gòu),用流程圖來加以描述。要求增加一些輸入語句和輸出語句,以便使上述程序段能在不同a,b和x值下運行,并且能觀察程序流程經(jīng)過(覆蓋)了哪些語句、哪些分支及哪些路徑。
②實驗步驟:記下分別使用下列各組數(shù)據(jù)運行時的操作流程。
⑴a=1,b=1,x=1;
⑵a=1,b=1,x=2;
⑶a=3,b=0,x=1;
⑷a=2,b=0,x=4;
⑸a=2,b=1,x=1;
⑹a=1,b=0,x=2;
⑺a=2,b=1,x=1;
⑻a=3,b=0,x=2;
(2)分析討論:①用哪一組數(shù)據(jù)就可以使程序段中的每個處理語句都執(zhí)行一次?為了找出程序中2各條處理語句中的錯誤,應(yīng)該使用什么樣的數(shù)據(jù)對程序進行測試?請上機驗證自己的結(jié)論。②用哪兩組數(shù)據(jù)就可以使程序段中的每個分支都至少運行一次?這種情形與上面的討論有何不同?如果為了找出程序中各分支中的錯誤,應(yīng)該使用什么樣的數(shù)據(jù)對程序進行測試?請上機驗證自己的結(jié)論。③用哪兩組數(shù)據(jù)就可以把判定框中的每個條件都運算一次?如果為了測試出判定條件中的錯誤,應(yīng)使用哪些數(shù)據(jù)對程序進行測試?請上機驗證自己的結(jié)論。④用哪四組數(shù)據(jù)才可以把各種條件的組合都檢測一遍?如果為了測試各種條件組合的情形,應(yīng)該使用什么樣的測試數(shù)據(jù)?請上機驗證自己的結(jié)論。⑤用哪四組數(shù)據(jù)才可以把從起始到終止的各條路徑都覆蓋一次?如果為了測試出程序在不同路徑下的錯誤,應(yīng)該使用什么樣的測試數(shù)據(jù)?請上機驗證自己的結(jié)論。
(3)進一步的實驗:①從鍵盤輸入三個數(shù),代表三條線段的長度。請寫一個判定這三條線段所組成的三角形屬于什么類型(不等邊、等腰、等邊或不能構(gòu)成三角形)的C程序。②請分別設(shè)計下列數(shù)據(jù)對自己的程序進行測試。
A.找出各條語句中的錯誤。
B.找出各分支中的錯誤。
C.找出各條件中的錯誤。
D.找出各種條件組合中的錯誤。
E.找出各條路徑中的錯誤。
而在循環(huán)語句上機中,對學(xué)生進行代碼優(yōu)化訓(xùn)練,讓學(xué)生學(xué)會刪除多余運算、代碼外提、強度削弱、變換循環(huán)控制條件等代碼優(yōu)化手段。通過這些上機實踐,學(xué)生大致知道一些軟件測試、程序優(yōu)化知識,提高了學(xué)生上機的積極性,使學(xué)生從上機就是檢驗書本例題、習(xí)題中解脫出來。
3、設(shè)計綜合性的實驗 以往大多數(shù)學(xué)生在學(xué)完C語言后,普遍反映看得清程序的設(shè)計代碼意義,但遇到實際問題就無從下手。這主要是教材上缺少實際意義的題目,為此,一定要設(shè)計短期上機實驗任務(wù)與長期任務(wù)結(jié)合的上機內(nèi)容。以一個大題目作為長期任務(wù),再按不同功能模塊分解開來,形成一個個短期任務(wù)。每一章學(xué)過之后要求完成一項或幾項編程作業(yè),而各章的編程作業(yè)不是孤立的,而是相互聯(lián)系的,實際上它們都是一個較大型較復(fù)雜程序的組成部分。這樣就可以使學(xué)生的任務(wù)形成一種連貫性,在整個學(xué)科的學(xué)習(xí)過程中始終都有一個總?cè)蝿?wù)的驅(qū)動,而學(xué)生又在一個又一個短期任務(wù)的驅(qū)動下,體驗著一次又一次邁向成功的喜悅。
例如,以“學(xué)生成績管理系統(tǒng)”為課程設(shè)計的長期任務(wù),從常用輸入/輸出語句printf和scanf開始,讓學(xué)生編寫主函數(shù)并在主函數(shù)中調(diào)用若干個空函數(shù)形成一個文本型菜單的雛形;學(xué)習(xí)常用數(shù)據(jù)類型后,再編寫一個驗證密碼輸入的函數(shù);選擇結(jié)構(gòu)后,要求編寫一個菜單選取函數(shù);循環(huán)控制和數(shù)組后,要求建立班級課程的成績輸入輸出函數(shù);學(xué)完結(jié)構(gòu)體類型后,要求使用結(jié)構(gòu)體數(shù)組來存儲和處理學(xué)生的信息;學(xué)習(xí)鏈表后,要求利用單鏈表動態(tài)管理學(xué)生的成績;最后在“文件”這一章,要求利用文件操作完成學(xué)生成績管理。當學(xué)完整個課程,完成了平時要求的各項編程作業(yè)之后,就會發(fā)現(xiàn),原來自己完成的遠不是一個一個零碎的程序段,而是在一塊一塊制作程序的各個部件,只要通過簡單的程序拼裝,就可以構(gòu)成一個比較復(fù)雜的程序。這也在潛移默化中培養(yǎng)了學(xué)生采用各個擊破的方法解決實際問題的意識。最后,學(xué)生從整體的角度來審視整個程序的設(shè)計,并通過上機進行綜合調(diào)試,達到提高編程能力的目的。
4、采用協(xié)作方式的實驗組織形式 協(xié)作學(xué)習(xí)由David W. 和Roger R. Jonson教授提出,是學(xué)生以小組形式參與、為達到共同的學(xué)習(xí)目標、在一定的激勵機制下最大化個人和他人習(xí)得成果,而合作互助的一切相關(guān)行為。
采用這種形式在上機過程中,學(xué)生之間為了達到小組學(xué)習(xí)目標,個體之間可以采用對話、商討、爭論等形式對問題進行充分論證,以期獲得達到學(xué)習(xí)目標的最佳途徑。學(xué)生學(xué)習(xí)中的協(xié)作活動有利于發(fā)展學(xué)生個體的思維能力,增強學(xué)生個體之間的溝通能力以及對學(xué)生個體之間差異的包容能力。此外,協(xié)作學(xué)習(xí)對提高學(xué)生的學(xué)習(xí)業(yè)績、形成學(xué)生的批判性思維與創(chuàng)新性思維、對待學(xué)習(xí)內(nèi)容與學(xué)校的樂觀態(tài)度、小組個體之間及其與社會成員的交流溝通能力、自尊心與個體間相互尊重關(guān)系的處理等都有明顯的積極作用。
在尊重學(xué)生個體差異和一人一機基礎(chǔ)上,利用局域網(wǎng),將學(xué)生分成小組進行協(xié)作實驗;將實驗心得體會、結(jié)論等在網(wǎng)上共享。改變以前那種各自為陣,互不往來的實驗組織方式。
三、結(jié)束語
實踐證明,C語言實驗課教學(xué)的改進增強了學(xué)生的學(xué)習(xí)熱情,讓學(xué)生從枯燥無味的語言學(xué)習(xí)中解放出來,在一定程度上提高了學(xué)生程序的編寫、調(diào)試、優(yōu)化等能力;對今后學(xué)習(xí)其他計算機課程打下良好的基礎(chǔ)。