摘要:C程序設計課程中概念繁雜,例題繁多,不少學生死記硬背。針對這種情況,本文從激發(fā)興趣、創(chuàng)造成績入手,給出了4個教學示例的組織過程,特點是起點簡單,步驟間逐步添加知識點,步步有成果,基本覆蓋了c程序設計課程的核心內容,能起到通過趣味促進實踐、激發(fā)創(chuàng)造力的作用。
關鍵詞:程序設計;教學組織;相似性;抽象;實踐
中圖分類號:G642
文獻標識碼:B
1引言
C程序設計課程一般開設在大一上學期,大多數學生處在從中學學習方法向大學學習方法的過渡期,他們知道這門課程是計算機專業(yè)的第一塊基石,卻常常以死記硬背的方法應付,更無法找到課程的趣味。對初學者而言,C程序設計語言課程的概念繁雜,例題繁多,教材內容給讀者的系統感不強??蓪嶋H教學中,理論課時和上機課時常顯不足,教師忙于完成教學內容,知識點間的聯系常被淡化。如何在增加課時的前提下,提高教學效率,是一個值得關注的教學課題。
學習的第一動力是興趣,筆者在多年的C程序設計教學中,感到最無奈的是學生缺乏對課程的興趣。編程類課程的趣味性,一在于其中知識點的聯系,二在于成果有實際的應用價值。教師的教學重點應是通過教材內容的重組織,引導學生發(fā)掘課程興趣點,帶動課程難點的學習。雖然教學示例俯手皆拾,但示例的選擇、組合卻可以匠心獨到。
示例的組織不僅應自然顯示出同類問題、方法的代碼相似性,更應展現出層次遞進的抽象思維過程;示例的組織應讓每一步都有新意,但難度變化不應過大,還應讓每一步都有成果,成果是興趣的激發(fā)點;示例的組織還應既便于教師連續(xù)講解,也便于暫停數次,讓學生自我探索實踐。筆者在課程教學中有意摸索、積累了若干此類示例,在此拋磚引玉。
2數值程序的趣味
在講解循環(huán)結構和函數時,數制轉換程序常常作為示例,但這么一個涉及到計算機專業(yè)最基本概念的程序若只被提及一次,實在太可惜了??梢栽噷⒃撌纠纸鉃橐韵?個步驟。
第1階段,講解將十進制數轉換為二進制數的程序,這個程序以main函數的形式展現給學生,讓學生體會到循環(huán)的流程和調試的成果。這是本例的最基本目標。
第2階段,改造代碼為函數A1,函數有一個參數x,實現將任意十進制數x轉換為二進制數的功能。這提升了程序的結構。
第3階段,擴展函數A1為函數A2,在函數接口中增加參數m、n,實現將m進制數x轉換為n進制數的功能。函數在具體代碼的基礎上,抽象程度有所提高。
第4階段,設計main函數,反復調用函數A2,計算1至100所有十進制數的二、三、…、九進制的表示,并將結果輸出到某文本文件中。
第5階段,將結果文件內容,粘貼到Excel文件中,排版成一張精美的各進制的數字對照表。
以上每個階段所涉及的技術都屬于基本技能,但以一條主線帶動學生,逐步深入,步步都有成果。與Excel聯合應用,更使學生開闊了學習和實踐的視野。
3類型變換程序的趣味
在講解字符串處理時,類型轉換是基本例題。如將數值轉換數字串,將數字串轉換為數值等。結合數制概念,可將問題多樣化。雖然教學意圖是開闊學生思路,卻常常使學生感到程序繁雜無序。實際上,合適的示例組合可促進學生自己發(fā)現、領悟其中的規(guī)則??梢栽噷⑦@些示例組成以下6個步驟。
第1階段,講解函數B1,函數有參數s,實現將lO進制數字串s轉換為10進制整數的功能。
第2階段,擴展函數B1功能,在接口中增加參數k,實現將k進制數字串轉換為k進制的整數的功能。通過代碼的抽象,強化了對核心代碼的認識,也降低了編程難度。
第3階段,講解函數B2,函數有參數x,實現將10進制整數x轉換為10進制數字串的功能。
第4階段,擴展函數B2功能,在接口中增加參數k,實現將k進制整數轉換為k進制數字串的功能。
第5階段,設計函數B3,函數有參數s、m、t、n,調用Bl函數,將m進制數字串s轉換為m進制整數;調用上節(jié)中的A2函數,將m進制整數轉換為n進制整數;調用B2函數,將n進制整數轉換為n進制數字串。
第6階段,設計main函數,反復調用函數B3,計算十進制數字串“001”至“100”對應的二、三、…、九進制數字串;將結果輸出到文本文件;將文件內容粘貼到Excel文件中,排版成一張與上節(jié)相同的各進制數字串對照表。
以上6個階段,以易于掌握的函數入手,通過增加函數參數提高函數的抽象性,增強函數的功能,第2、4階段的成果都有一定的應用價值,第5、6階段培養(yǎng)了函數組合調用的能力。
4加密、解密程序的趣味
在字符串編程的練習中,對稱加密、解密算法是一個有趣的話題,可以充分利用它引導學生做更深入的實踐。可以試將此示例分解為以下6個步驟。
第l階段,講解加密函數C1,函數有參數s、k,對存于字符數組s的明文采用密鑰k進行對稱加密。這一短小精干的程序可以讓學生體驗字符串操作的一般方法。
第2階段,擴展函數C1,在接口中增加參數n、f2,實現讀取n指定的明文文件,將其中的每行字符串用密鑰k加密,生成密文文件f2;設計main函數,實現獨立的加密程序。
第3階段,講解解密函數C2,函數有參數s、k,對存于字符數組s的密文采用密鑰k進行對稱解密。
第4階段,擴展函數C2,在接口中增加參數f1、f2,實現讀取n指定的密文文件,將其中的每行字符串用密鑰k解密,生成明文文件位;設計main函數,實現獨立的解密程序。
第5階段,使用main(int argo,char*argv)函數的接口參數,將加密、解密程序合二為一,具體執(zhí)行時,使用命令行參數識別加密或解密功能。如命令行參數是“-e a1.txta2.txt 5”表示對a1.txt使用密鑰5加密,結果密文存于a2.txt;如命令行參數是“-d a2.txt a3.txt 5”表示對a2.txt使用密鑰5解密,結果明文存于a3.txt。
第6階段,對于優(yōu)秀的學生,還可以鼓勵他們進一步探索,在沒有密鑰情形下如何猜測某個密文文件的密鑰進行解密。這種探索性的實踐會帶給學生更廣闊的編程視野。
在以上6個階段中,C1和C2函數非常相似,對這種相似性的留意不僅能強化編程中的概念,更能提高編程、調試的效率。最終的軟件成果已經具備商業(yè)軟件的雛形,學生們會更加興奮。
5打印字符圖案的趣味
在學習循環(huán)、分支結構時,用字符打印特定的幾何圖案是最簡的示例??上н@個示例的思路沒有繼續(xù)延伸,只是局限在打印完全規(guī)則的圖案。可以試將此示例分解為以下7個步驟。
第1階段,講解一個打印固定規(guī)則圖案的函數Dl,實現用某種字符打印一個固定形狀的三角形。
第2階段,擴展函數DI,在接口中增加參數base、angle、scale,base是圖案打印基點,angle是圖案旋轉角度(0或90或180或270),scale是圖案的大小比例的參數,值可以是1或2或3等正整數。
第3階段,按照函數D1的形式,引導學生編程更多的打印規(guī)則圖案的函數:建立函數的調度管理函數D2;
第4階段,利用二維數組存儲圖案數據,數組元素為1或0,表示在相應位置上打印或不打印字符。二維數組相當于任意字符圖案的數據結構。設計函數D3,參數是一個二維數組,實現打印任意不規(guī)則圖案的功能。
第5階段,擴展函數D3,在接口中增加參數base、angle、scale,意義同第2階段,函數的功能也類似第2階段。
第6階段,調試函數D3的圖案數據,建立起對任意圖案的數據增加、修改、調用等管理函數D4.
第7階段,設計函數D5,以菜單形式組織函數D2、D4,實現規(guī)則圖案和任意圖案的多種形式的打印。此時程序的結構已經比較復雜了。這個示例不僅充分鍛煉了編程技術,更為將來學習圖像處理技術做了鋪墊。
6結束語
本文給出了數值程序、類型變換程序、加密/解密程序、打印字符圖案等4個教學示例的組織過程,每個示例的起點簡單,每個步驟涉及的新知識較少,思維跳躍小,但每個步驟的收獲喜人,最終涉及到了除指針、結構之外的所有c語言知識點。每個示例可以一次講解,也可以分步驟多次講解,或空缺一二步驟,讓學生實踐完成,尤其能起到通過懸念、興趣促進實踐、激發(fā)創(chuàng)造力的作用。