摘要:針對C語言課程傳統模式教學中的問題,我們進行了改革與探索,建立了新的教學模式。新教學模式采用了實例教學法、形象比喻法等手段,取得了良好的教學效果。
關鍵詞:程序設計;實例教學;錯誤分析;上機實踐
中圖分類號:G642文獻標識碼:A文章編號:1009-3044(2008)08-11ppp-0c
1 引言
隨著高等教育事業的不斷發展,教學改革正在逐步深化,給我們的教學工作提出了新的要求。從開設C語言課程以來,我們針對教學中發現的各種問題,不斷學習探索新的教學手段和方法,以求學生得到最好的學習效果。我們在不斷克服傳統教學模式的不足、堅持進行教學改革與探索。
2 分析教學過程中存在的問題
傳統教學模式以書本為中心,采用從概念到概念的注入式教學,關注的是向學生灌輸了哪些知識,造成教學與學生實際脫節,忽視了學生學習潛能的開發。導致學生學不深、學不透、學不懂,甚至不會運用學到的概念去解決實際問題。只能掌握基本概念,不能解決實際問題,不能舉一反三。
在傳統的教學方法中,由于片面地強調和突出教師的主導作用,忽視和壓抑了學生的能動作用;片面地強調知識的傳授與灌輸,忽視了學生創新能力的培養;注重培養“知識型”人才,忽略了“智能型”人才的培養。
傳統的教學方式是教師利用黑板、粉筆、教案等,在一般教室進行授課的一種教學方式,而多媒體輔助教學方式則是在授課過程中利用投影儀、計算機、網絡等多種現代媒體,在多媒體教室進行授課的一種新的教學方式。但是在課件制作上過分強調表現形式,忽略了內容本身,往往造成喧賓奪主,達不到預期的效果;另外在課堂上,教師過分依賴課件演示,忽略與學生溝通,削弱了教師在教學過程中應起的主導作用。
針對以上存在的不足,我們在C語言課程的教學過程中,展開了一系列的教學改革,嘗試采用了實例教學法、形象化比喻、分析常見錯誤和加強上機實踐,并合理使用多媒體輔助教學,取得了良好的教學效果。
3 采用實例教學,增強了學生綜合能力
為了改變傳統教學以書本為中心的注入式教學方式,我們探索采用了實例教學法,通過軟件開發實例,引入算法思想和語法概念。從而促進學生成為教學主體,引導學生進行自主學習、合作學習、研究性學習、探索性學習,增強學生的綜合能力。努力培養和提高學生的思維能力,從而提高教學質量,取得良好的效果。
比如說在講授數組的應用時,要求學生開發一個實例進行成績排序。學生在設計時可能會用到不同的排序算法,然后再一一進行分析,每種算法中存在的優點和不足,在什么情況下采用哪一種算法最好,這樣能加深學生對知識的理解和掌握。
4 形象化比喻,建立清晰概念
比如指針部分的教學,由于概念比較抽象,多數學生感到很難聽懂。我們在引入指針的概念教學時,采用形象生動的比喻來幫助學生理解指針的概念。指針是描述計算機內存的,指針運算是內存地址的運算,很多學生在學習C語言時,由于沒有學過操作系統課程,對內存很陌生。因此在給出指針概念前,先讓學生建立指針與計算機內存單元地址一對應的關系十分重要。教學中可用學生宿舍形象比喻計算機的內存,內存單元相當于宿舍中的每一個房間,“地址”就是內存單元的編號,相當于宿舍的門牌號,內存中存放的數據,相當于各房間的學生。明確給出指針就是首地址。在講述“指針變量”時,可以首先給出指針也是一個變量,只是這個變量中存放的是另一個變量的地址(即存放的是指針)。然后用“傳達室”作比喻。傳達室也是宿舍中的一個房間,只是住在那里的人比較特別,他知道哪個房間里住的是哪些人。在講到“直接訪問”和“間接訪問”時,用傳達室這個比喻很容易讓學生明白。如知道門牌號,直接找到學生,相當于“直接訪問”,如果通過傳達室查詢到門牌號,再找人,相當于“間接訪問”。通過這種生活中的形象比喻,學生能夠很快接受指針的相關知識。
5 分析常見錯誤,強化理解
對于C語言初學者來說往往出了錯還不知怎么回事。比如輸入數據的形式與要求不符。用scanf函數輸入數據,應注意如何組織輸入數據。假如有以下scanf函數:
scnaf(\"%d%d\\", a,b);
若按下面的方法輸入數據:
3 4↙
這時會出問題,因為對scanf函數中格式字符串中除了格式說明符外,對其他字符必須按原樣輸入。因此,應按以下方法輸入:
3 4\↙
另外,比如指針變量初始化常見錯誤:
(1)未初始化錯誤:定義了一個指針變量后,系統便給該指針變量在內存中分配一個地址單元。該地址單元中存放著一個隨機的數,不能確定該指針指向何時地址。如果此時對指向的區域進行寫操作,便有可能破壞系統的某種設置,結果使系統癱瘓。
例如:int *ip;*(ip)=100;
上述語句中指針變量ip因沒有初始化,而被隨機地指向內存單元中的某個地址。由于在執行語句*ip;后ip的內容是未知的,當程序將100賦值給一個沒有確定指向內存的指針ip,而使得在內存的某一未知地址被寫入100;雖然這個程序很小,所占的內存小,問題不明顯,也能夠得到正確的答案,但實質上它卻隱含著一個致命的錯誤。這是因為隨著程序的增大,很有可能訪問到致命的地址單元;如果指針變量中的不定值落到了系統數據區,由于*(ip)=100;的寫入操作可能覆蓋內存單元中的系統數據區,將會導致計算機系統工作區域內有用數據的破壞,引起數據段、操作系統的損毀,造成機器運行失常,甚至“死機”。未初始化的指針稱為“野指針”,它最不顯眼,卻最具破壞性和危險性。
(2)混淆數組名與指針變量的區別。
int i,a[8];for(i=O;i<8;i++) scanf(\"%d\",a++);
C語言中約定,指針是一個變量,取地址為其值;數組名是一個指針,在系統為數組分配存儲單元時確定,是一個指針常量。該指針的值是該數組的首元素的地址值。數組名由于是常量,所以不能自增自減,也不能在賦值語句中作左值。上例程中企圖通過a的改變使指針下移,每次指向欲輸入數據的數組元素。它的錯誤在于不了解數組名代表的是數組首地址,是一個地址常量,而地址常量的值是不能改變的,不能用a++。應該用指針變量指向數組元素。上例程可改為:
int i,a[8],*p;
p=a;
for(i=O;i<8;i++)
scanf(\"%d\",p++);
另外int (*p)[4]與int *p[4]的區別。前者的p表示的是一個指針變量;后者的p表示是的數組名,是一個指針常量。
(3)指針賦值帶來的內存遺漏動態內存分配。C語言雖然可以方便地實現任一數據塊的隨機分配,但這種操作很可能導致“內存遺漏”。在程序的執行過程中,函數體內的局部變量在函數結束時自動消亡。于是,很多學生認為,在函數結束時,函數體內定義的指針消亡了,它所指的動態分配的內存也將被釋放。這種理解是錯誤的,雖然指針消亡了,但它所指向的內存并沒有被釋放。編程中,忘記被釋放內存是十分危險的。含有這種錯誤的函數每被調用一次,就會為指針變量分配一定大小的內存空間,當內存空間使用完以后,系統不會自動釋放內存空問,而出現對同一指針變量的多次動態分配,在內存中產生一系列無法釋放的“無效內存塊”,由于這部分內存空間不能再被該程序訪問,同時也不能被其后任何程序訪問,因此,出現了內存空間的“丟失”,而且這種內存塊會隨著程序運行次數的增多大量“繁殖”,最終導致內存空間的耗盡。
例如:int *q1=(int *)malloc(10);int *q2=(int *)malloc(10);q1=q2;free(q1);
這個程程序段中用了兩個malloc()函數,卻只用了一個free()函數,這就造成了內存泄漏。值得注意的是,如果此時用free()函數釋放q2,程序仍然不對,這是因為q2所引用的內存已被q1釋放,但是最初由q1所引用的內存已經無法釋放了。該內存空間成了“無效內存塊”,內存空間“丟失”了;如果這個程序段被反復調用,內存愈來愈緊張,最終“死機”。正確的做法是當一個指針賦給另一個指針前,先用free()釋放所持有的內存空間,使這部分空間可以由系統重新支配,即應在賦值語句前調用free()函數。上述程序段應該改為:
int *p1=(int *)malloc(10);
int *p2=(int *)malloc(10);
free(p1);
p1=p2;
free(p1);
6 加強上機實踐
C程序設計是一門實踐性很強的課程,既要求掌握概念,又要求動手編程,且上機調試運行才能夠真正理解掌握。特別如指針的使用實在太靈活,對大多數學生而言,在實際編程中很容易出錯,而且這種錯誤往往難以發現。上機實驗是程序設計的一個步驟,是教學的一個重要環節,是對教學內容的驗證、補充。同時實驗課是學生獨立操作的課程,只有在實驗課內才真正體現了學生的主導地位,發揮學生的創造力。所以針對容易出錯的地方,必須要求學生大量上機調試、驗證,以弄清一些細節,并積累經驗。
7 結束語
綜上所述,在C程序設計課程的教學中,不僅要注意理論教學完整連貫、深入淺出,還要增強實例分析、錯誤分析,并與實踐緊密結合,讓同學們學得有趣、有勁、有用、有成,同時要注重自學能力的培養,為后續課程的學習打下堅實的基礎。
參考文獻:
[1]譚浩強. C 語言設計[M](第二版). 北京:清華大學出版社,2003.
[2]林鈞海,田滄海. C 語言高級實用編程技巧[M].北京:電子工業出版社,1999.
[3](美)A1 kelley,Ira P0h1 語言教程(英文版,第4版) [M]. 北京:機械工業出版社,2004.
[4]嚴尉敏,吳偉民. 數據結構[M]. 北京:清華大學出版社,2002.