


摘要:基于“最近發展區”理論,借鑒ACM國際程序設計競賽的形式,提出旨在激發學生編程興趣、不斷突破自我的C語言教學方法,闡述如何在打牢語法知識和調試能力基礎的前提下分階段組織教學內容,在每階段末尾進行突擊能力提升的課堂測試、測試用例與語法示例統籌設計,最終通過類ACM式的測試方法有效提高學生編程解決較難實際問題的能力。
關鍵詞:C語言;教學設計;最近發展區;ACM;程序設計
1 背景
維果斯基的“最近發展區”理論指出學生的發展存在兩種水平,即通過基本學習能夠獨立完成一定任務的“現有發展水平”和在教師啟發下經過自身努力可能達到的“潛在發展水平”,兩者之間的差距就是“最近發展區” 。基于這一理淪,教學應著眼于學生的“最近發展區”,通過合理的教學設計充分調動學生的主觀能動性,激發其潛能,從而加深其對所學知識的理解,鍛煉解決實際問題的能力。
由美國計算機協會主辦的始于1970年的ACM國際大學生程序設計競賽(簡稱ACM)是一項旨在展示大學生創新能力、團隊精神和在壓力下編寫程序、分析和解決問題能力的年度競賽,已經成為最具影響力的世界性大學生計算機競賽,并成為一種全新的發現和培養計算機科學頂尖人才的途徑 。
C語言作為典型的結構化程序設計語言,因其豐富的數據類型、運算功能和控制結構,高效的代碼生成與執行效率,較好的可移植性,已經成為高等院校首選的入門級程序設計語言。針對C語言教學方法的研究一直是教改工作的熱點之一,其中不乏基于“最近發展區”理論和ACM競賽模式的研究。前期基于“最近發展區”理淪的C語言教學主要關注教師如何通過在授課時設計循序漸進的問題啟發學生理解并使用相關語法知識 。基于ACM模式的程序設計教學則側重使用ACM式的程序設計實踐替代傳統課程實驗,從而鍛煉學生實踐編程解決問題的能力 。
上述兩種方法分別從課上知識講授和課下實踐動手兩方面對程序設計教學進行改進,筆者將二者相結合,提出基于“最近發展區”理論的類ACM式教學方法,將由易到難的問題求解貫穿于理論知識講授和實踐技能訓練的全過程,并以類ACM式的課堂測試完成跨越“最近發展區”的關鍵一步。
2 教學設計
“最近發展區”理論的一種通俗表述就是“跳一跳,摘桃子”。本節基于這一表述對第一作者在國防科學技術大學從事C語言程序設計課程教學過程中的教學設計展開介紹。
2.1 先下蹲——打牢語法和調試基礎
“最近發展區”的基礎是學生的“現有發展水平”,該水平的高低直接決定了“最近發展區”的起點與難度。第一作者在C語言語法知識點講授的過程中,一直堅持文獻所給出的注重計算思維的啟發式教學方法:語法與算法并重、從基礎見思維,并針對各種語法規則設計相應的啟發式案例,讓學生深刻理解C語言定義各個基本語法規則的原因和形式,為其熟練使用正確的語法解決實際問題奠定基礎。
提高編程解決實際問題的能力是C語言教學的最終目的,調試是加深知識點理解和提高編程能力的關鍵。在傳統教學中,師生都可能存在因重結果輕過程而忽略調試能力訓練的現象。在本文所述教學設計中,自開始編程完成作業起,就要求學生使用VC++6.0工作環境的調試功能:首先通過單步執行觀察程序的執行流程;而后在遇到具體問題時,通過調試執行發現并糾正程序錯誤。
通過上述方法,學生可以打牢語法知識和調試能力基礎,為后續在老師的引導下進一步激發潛能實現“跳一跳,摘桃子”做好準備。
2.2 再起跳——跨越“最近發展區”
有了高起點的“現有發展水平”,如何設計合理的“最近發展區”成為課程教學的關鍵。原則上,該區的跨度既要讓大多數學生擁有經自身努力能夠順利通過的信心,又要讓學生實現真正的跨越從而提高自身能力,為此,我們做了專門的教學設計。
首先,結合所使用教材《C++程序設計(第2版)》的章節編排 ,將C語言程序設計教學內容劃分為圖1所示的3個階段,在完成每個階段的正常課上學習和課下作業實踐后,專門利用兩學時(50分鐘/學時)時間進行課堂測試,適當提高測試題的難度,測試成績計入課程平時成績。這樣做的目的首先是及時發現學生在基本知識學習中的問題,避免問題的積累,另一個目的是實現“最近發展區”的跨越。
具體而言,第1階段主要包括數據類型、運算符和表達式,輸入輸出,控制結構,函數4章內容,其中前兩章為基本知識點,主要通過課下作業進行練習。在完成控制結構和函數兩章的學習后,學生應該已經具備設計簡單的算法和編寫獨立程序模塊的能力,為此,教師很有必要為該階段設計具有一定難度的問題,引導學生鞏固基礎知識提升程序設計能力。第2階段主要包括數組和指針兩章內容,這兩章是C語言學習的重點與難點,因此該課程的啟發式教學力求在將相關語法知識講透徹的基礎上,通過設計專門的課堂測試,求解相對較高難度的問題以提高學生理解和使用數組指針的能力。第3階段主要包括結構、鏈表和文件3章內容,這3章的知識既可以起到鞏固前兩階段知識的作用,又利于用程序表示客觀世界。因此,教師也為此階段設計了專門的課堂測試,以提高學生編程解決實際問題的能力。
其次,在設計本課程各階段的測試題時遵從循序漸進的思路,將課上講授語法知識點所使用的案例和測試所需要的案例聯系起來,統籌設計,力求做到讓學生感到熟悉但不簡單。具體來說,測試案例的設計力爭做到以下3個層次:銜接課上知識點原案例,鞏固對已有知識的理解;又不同于原案例,使學生能觸類旁通;加大難度或多種知識組合,突擊提高程序設計能力,超越自我。
2.3 摘桃子——類ACM式課堂測試
除了高起點的“現有發展水平”和階段性的“最近發展區”測試案例,課堂測試的組織形式也是課程設計成功與否的關鍵。好的課堂測試應能夠充分調動學生的積極性,利用有限的課時突擊鍛煉學生的程序設計能力,為此,課程借鑒ACM程序設計競賽的形式,精心設計了類ACM式的課堂測試組織方法。
類ACM式的課堂測試一方面保留ACM競賽的基本形式,即要求參賽選手在規定的時間內完成給定問題的編程;另一方面,結合課上測試時間和學生編程水平的實際情況,對競賽的題量、組隊、評分、判題等形式進行相應調整。標準ACM競賽與類ACM課堂測試比較見表l。
如表1所示,由于受到課時限制,類ACM測試將測試時間從5小時縮減為2學時,相對應的題量也由10道縮減至2或3道;測試形式由3人組隊變為個人完成,這是因為對于C語言程序設計的初學者而言,首先需要訓練個人能力,而不是訓練其團隊協作編程能力;評分形式則是由整題汁分變為按點計分且各小點計分之和大于滿分,這是因為測試案例大多包含由淺人深的幾個子問題,按點計分有助于激發學習積極性,也利于引導學生完成較難問題的求解,而小點計分之和后大于滿分也有利于學生獲得較好的平時成績。閱卷、判題根據教學平臺的不同既可以選擇機器判題,又可以選擇人工判定。對于2學時的測試時問,我們進行了進一步細分,第1學時由學生獨立完成測試并計分,第2學時先由教師對題目進行講解和必要的程序演示,再留半小時給學生進行測試,但此時通過測試所獲得的分值將有所降低。
3 “最近發展區”案例
基于第2節的課程教學設計,本節重點對基于“最近發展區”理論的類ACM式C語言教學方法中貫穿授課與測試的主體——案例展開介紹。篇幅所限,筆者只選取兩個代表案例,介紹其考核的知識點、分點計分的各個小點、在語法知識講授時的鋪墊以及解題的基本思路.,
3.1 長整數求“根”
求數“根”測試要求主函數從鍵盤讀人一個整數,求出該整數的“根”,即對該整數的各位數字相加求和,若得到的和大于9,則對該結果的各位數字再次相加求和,直到結果小于10為止,這個小于10的整數就是長整數的“根”,如整數12345的“根”為6,因為1+2+3+4+5=15,而1+5=6。該案例主要用于考查學生對控制結構的理解,但學生也可以通過遞歸函數知識編寫出正確的代碼。案例設計了3個層次的計分點,難度逐步加大,具體如下:①輸入整數的長度固定為7位;②輸入整數的長度不定,但不超過9位;③輸入整數的長度不定,但不超過100位。
作為鋪墊,授課教師應在課堂舉例或布置作業時將計分點1作為一個獨立問題,給出編程思路交由學生思考求解,如先使用一個for循環進行定數循環,求解7位整數的和;再利用一個while循環判定和是否小于10,大于10則重復第一個求和的過程,小于10則輸出結果。有了這一鋪墊,進行類ACM式課堂測試時學牛就比較容易理解題目要求,并能夠較順利地編寫程序求解計分點l。對于計分點2,輸入整數可直接存儲在一個整型變量中,教師應在測試時提示學生使用兩次while循環,即外層循環控制當的數是否小于10,內層循環用于求各位數字之和。計分點3的輸入整數已超過整型的表示范圍,教師可以提示學生先使用getchar函數,邊讀取輸入整數邊做一次按位求和,從而將計分點3的問題轉變成計分點2的問題。
3.2 基于動態內存分配的掃雷
掃雷是類似Windows操作系統白帶扣雷游戲的案例,主要考查學生對數組和指針的理解、掌握與使用情況,同樣分為3個層次的汁分點:①掃雷邊界區域固定為20×20的網格,每個網格有雷的概率固定為0.2,要求程序能夠在屏幕I:輸出雷的二維分布情況,即顯示一個20行20列的字符信息(有雷打‘X’,無雷打‘O’);②在計分點1的基礎上,要求在無雷處輸出該網格周圍雷的個數,即與Windows系統游戲類似的規則;③在計分點2的基礎上,要求雷區的網格規模是動態輸入決定的。
作為鋪墊,教師在課上講解隨機數生成并基于隨機數進行概率判定的方法,且在課件中給出詳細代碼,學生可以直接拷貝使用。在課堂測試時,針對計分點1的提示是用一個20×20的二維數組存儲隨機數結果,并根據隨機數結果在屏幕上輸出‘X’或‘0’;計分點2的提示是使用一個22×22的二維數組,邊界元素均賦值為無雷,從而簡化中間區域無雷網格的周邊雷數計算過程;計分點3則提示學生使用指向指針的指針進行動態內存分配,需要說明的是指向指針的指針使用方法教師也已在課上舉例時通過其他案例進行了介紹,學生只需要模仿編程即可。
通過上述兩個案例的介紹,可以看出測試案例均具有一定難度。在傳統程序設計教學中,對于沒有編程基礎的大一新生,往往很少能夠接觸到具有上述難度的習題,但本課程的實踐結果表明,基于“最近發展區”理論,有了測試前課堂教學時的相關示例鋪墊,學生對上述測試表現出了濃厚的興趣,并能夠在有限的課堂測試時間內顯著加深對相關知識點的理解,提高程序設計水平。
4 教學成效
2014年春季,筆者在給國防科學技術大學大一新生高級班2班(高級班學員是通過以選擇題為主的摸底考試選拔出來的,僅能反映其對計算機的理解較好,即大學計算機基礎知識掌握較好,但并不代表其具備編程基礎 ,如高級班2班僅4人在高中階段接觸過程序設計)講授計算機程序設計課程時使用了基于“最近發展區”理論的類ACM式C語言教學方法。期末機試成績見表2。
如表2所示,在學期末的機試考核中,高2班的平均分達到84.25分,及格率100%,優秀率39.39%,并有2人獲得滿分,各項指標均大幅高于全校整體水平(全校整體成績數據已扣除高2班的人員影響),也明顯高于另兩個高級班。值得注意的是高1班的及格率低于全校整體的及格率,這也在一定程度上反映出高級班的學生在課程學習之前并不一定具有更好的編程基礎這一事實。
上述統計數據尤其是平均分和優秀率數據表明,在同樣的學習時間內,基于筆者所提出的C語言教學方法可有效激發學生的學習興趣,幫助學生跨越“最近發展區”,顯著提高編寫程序解決實際問題的能力。
5 結語
筆者結合在國防科學技術大學從事程序設計課程教學的經驗,提出基于“最近發展區”理論,借鑒ACM程序設計競賽模式的C語言程序設計教學方法——分階段教學,進行類ACM式的階段課堂測試,統籌設計課上語法知識示例與課堂測試用例。教學實踐結果表明,使用該方法教學的高級班學生具備更好的通過編寫程序解決實際問題的能力;在學期末的程序設計機試考核中,該班各項成績指標都大幅領先全校以及其他高級班的學生。