唐小健
(韶關市中等職業技術學校 廣東 韶關 512028)
淺談比較教學法在《C語言》教學中的運用
唐小健
(韶關市中等職業技術學校 廣東 韶關 512028)
C語言是系統描述語言,是一種通用的程序設計語言,具有許多突出的優點,因而在許多方面都得到了廣泛應用。越來越多的程序員將C語言作為主要的編程工具;同時,越來越多的人開始學習C語言。但由于C語言靈活,功能強大,也給初學者帶來了一定的學習難度。文章從教學法出發,認為教師在《C語言》授課過程中,應根據不同的教學目的,針對不同的教學內容,采用比較教學法,以獲得良好的教學效果。
比較教學法;C語言;程序設計
C語言使用起來方便靈活,具有現代化的數據結構、結構化的控制語句、程序設計自由度大等特點。但是,C語言中諸多的符號難以駕馭,尤其是函數、指針和結構體等,學生學習起來相當吃力。近幾年來,筆者不斷對C語言教學進行探索和總結,認為在《C語言》課程教學中運用比較教學法能有效提高教學質量。
學生學習程序設計語言,只有在掌握這門高級語言自身特點的基礎上,才能進一步學習編程。教師在進行教學設計時,編排例題的順序很重要,應依據知識的連貫性,由簡單到復雜,逐層深入。例如,for循環語句這一節內容,由于介紹完單層循環,還要進一步介紹循環的嵌套,筆者選擇了下面這道編程題為“龍頭”,然后分別橫向深入和縱向深入進行“接龍”,將這一節的所有知識點都概括其中,使它們彼此聯系,相互掛鉤。
例題一(累加):求1+3+5+7+…+n(n是奇數)。

(一)橫向深入
在程序設計語言的教學過程中,教師應適時讓學生進行編程訓練。這不僅對學生理解和熟悉知識點有幫助,而且還能循序漸進地培養學生樹立程序設計思想,提高分析問題和解決問題的能力。
講完例題一,將題目稍加改動為例題二(求和):s=1+1/3+1/ 5+1/7+…+1/n(n是奇數)。這道題的源程序,除了將例題一源程序的“s+=i;”語句改為“s+=1.0/n;”語句,還要注意將“int s;”語句改為“float s;”語句。另外,在輸出語句printf中參數s的格式控制符也應作相應的改動,由“%d”改為“%f”。
此后,再將例題一稍加改動為例題三(求積):1*3*5*7*…*n(即求n的階層:n!,n是奇數)。這道題,除了將例題一源程序的“s+=i;”語句改為“s*=i;”語句外,還要注意將“s=0;”語句改為“s=1;”語句。
(二)縱向深入
將例題一和例題二結合,就成為了例題四:求1!+3!+5!+7!+…+n!(n是奇數)。這道題具有承上啟下的作用,使教學內容由單層循環引入循環嵌套。累乘由內層循環來實現,累加由外層循環來實現。
例題四源程序:main(){

借助本題的講解,可將有關循環嵌套的知識點著重介紹給學生。然后再將該題進行橫向深入:求1!+1/3!+1/5!+1/7!+…+1/n! (n是奇數)。讓學生自己動手練習。
在程序設計語言的授課過程中,任何一個問題的解決,都應該盡量通過多種途徑來實現。途徑比較法,就是通過比較各種途徑(即解決問題的辦法),引導學生發散思維。哪種途徑效率最高,各種途徑分別適用于什么情況,引導學生養成周密考慮這些問題的習慣。
例如,在求解例題一時,除了用以上方法之外,還可以有另外的解題方法。1到n(n是奇數)之間的項數(即奇數個數)可以用簡單的算法求得。假設1到n之間的項數為m,實際上這是一個公差為2的等差數列,利用公差的通項公式,則有n=1+(m-1)*2,求得m=(n-1)/2+1,利用單層循環語句for就可以馬上求得結果。源程序如下:

顯然,這個源程序的執行效率比較高。在講完用這種方法求解例題一后,筆者要求學生采用這種方法寫出例題二、三、四的源程序。絕大多數學生很快就正確地寫出來了,真正達到了學以致用、觸類旁通的教學目的。這樣的啟發引導,讓學生在了解常規解法的基礎上又找到另一種行之有效的解題方法,使學生懂得應該學會用不同的角度和方法來解題,并在解題過程中摸索出最簡單有效的方法,從而加深對《C語言》相關知識的理解,進一步增強學習《C語言》的興趣。
又如,在程序設計中經常會遇到排序問題,而學生在編程時往往不能正確地完成,或是不能根據實際情況選擇最合理的途徑完成。針對這種情況,筆者將冒泡法排序、選擇法排序、插入法排序幾種解決排序問題的方法安排在一起介紹。對于排序的幾種方法,用具體的例子幫助學生理解:學校下周要舉行運動會,要求每個班級的學生按照從高到矮的次序排成一列進場,班主任要事先將每個學生的身高寫在一張紙條上,排好后按照這個次序進場。
若用冒泡法排序,就得將相鄰兩個學生的身高逐一進行比較。這樣不斷地反復比較、交換,才能將身高按從高到矮排好序。若用選擇法排序,就必須從第一張紙條開始查,找出身高最高的紙條與第一張紙條互換位置,然后繼續從第二張紙條開始查找次身高的紙條,并與第二張紙條互換位置。若用插入法排序,就得先從排序前的那堆紙條(后面稱無序組)中拿第一張紙條擺在另一處 (后稱有序組),接著從無序組中拿第一張紙條(即原第二張紙條)和有序組中這張紙條比較,若原第二張紙條上的身高更高,則插放其前,否則,就插放其后。然后,再從無序組中拿原第三張紙條和這邊的兩張紙條上的身高進行比較,若身高較高則插放其前,否則,就插放其后。
對這三種途徑進行比較總結得出:插入法排序是一種簡單、常用的排序方法,不適用于大量數據的排序;選擇法排序雖然比較直觀、簡單,但要進行很多比較,因而速度比較慢;冒泡法排序是通過不斷比較、交換,適用于簡單數據的排序。
教學實踐表明,學生在編寫程序時往往會出現許多不同類型的錯誤,特別是一些容易混淆的知識點和概念。如混淆使用各類循環語句,搞不清各類循環語句之間的區別與聯系;混淆使用單目運算符++、--的前置運算和后置運算;混淆各種運算符的優先運算順序;混淆break語句與continue語句的功能等。對于那些容易混淆的概念和容易用錯的功能,可以使用結果比較法,即將正確的源程序和學生典型的錯誤程序一起展示給學生,讓他們自己去比較異同,認清是非,達到正確使用概念的目的。
學生在編程求解一些應用題時,大多得不到正確結果,但并不能以此認為學生不會編程或學生寫出的源程序一無是處。這些程序從整體框架來看是正確的,所使用的《C語言》語句和算法是正確的,只是在一些細節方面沒有處理好。如果因此而責備學生,很可能會產生一些負面影響,如使學生喪失自信心,興趣降低,產生自卑感等。這時,可以采用“誘導”比較法,教師一步步引導學生自己發現錯誤并改正,直至得到正確結果。這樣,學生會有一種成就感,對學好《C語言》的信心大增,學習的興趣和熱情也隨之高漲,可以達到事半功倍的效果。下面通過一道典型例題進一步說明“誘導”比較法在《C語言》中的運用。
例題五:求100到1000之間的各位數字之和為5的數有多少個?輸出這些滿足條件的數字(每行5個)并對這些數字求和輸出。
筆者要求學生自己在上機前編寫好源程序,上機時輸入源程序,進行編譯和調試,然后運行可執行程序,看是否能得到預期的結果。有的學生沒有得到正確的結果,一是程序運行后沒有任何數據輸出,二是每行輸出按照默認的格式輸出10個滿足條件的數字而不是題目所要求的5個數字,三是輸出滿足條件的數字個數和數字之和與實際不符。通過檢查他們的源程序,發現存在一些問題,歸納起來主要錯誤有:循環語句for使用不當,不會靈活應用算術運算符號,輸出函數printf使用不當。既然已經找到問題,筆者就“誘導”學生對錯誤逐個進行排查,最后得到正確的結果,其中一個學生的源程序是這樣的:

在學習《C語言》時,關鍵要熟練掌握并靈活運用好32個關鍵字。一次課記住這32個看似沒有任何規律的符號比較難,尤其是英語比較差的學生。可以根據內容的先后順序和功能給關鍵字分類,進行比較。例如,short,long,和signed用于說明整數類型數據;float和double用于說明實數類型;if和else可構成選擇結構的控制語句;在循環結構控制語句中可用for,while和do關鍵字。每節課之前,教師可以先板書已學習過的關鍵字和本節課要講的新關鍵字。新關鍵字,要寫出其全名并注上對應的漢語意思,幫助學生加深理解。久而久之,單調的關鍵字就變得容易接受并能被學生熟練掌握了。
總之,在《C語言》的授課過程中,根據不同的教學目的,針對不同的教學內容,采用不同的方法進行比較,可以收到良好的教學效果。
[1]于春凡.C語言及其高級編程技術[M].天津:南開大學出版社,1995.
[2]譚浩強.C程序設計[M].北京:清華大學出版社,1991.
[3]徐維祥.C語言程序設計教程[M].北京:高等教育出版社, 1998.
[4]嚴蔚敏,吳偉民.數據結構[M].北京:清華大學出版社,1992.
G712
A
1672-5727(2010)05-0138-02
唐小健(1972—),男,江西安遠人,韶關市中等職業技術學校教師,中學一級教師,主要從事計算機教學。