摘要:指出課堂理論講授效果不理想,學生實踐編程能力差的現狀,提出在C語言程序設計課程中對理論教學和實踐教學進行改革。建議運用建構主義理論,淡化語法規則,強調基本算法,科學安排教學內容的層次結構及算法實例,將在線裁判系統運用于實踐教學,革新程序設計課的教學手段和方法,會取得良好的教學效果。
關鍵詞:C語言;建構主義;在線評測系統;計算機專業
1研究背景
高級程序設計語言是計算機專業的專業基礎課,在計算機教學中占有重要地位,很多學校都將C程序設計作為計算機專業的程序設計入門課程。該課程具有較強的理論性和實踐性,課程的目標是使學生學會基本程序邏輯的表達,培養其問題求解的計算思維,使學生建立良好的編程習慣,練好程序設計的基本功,為學習后續專業課程打好基礎。
常規的教學情況是,教師以語法結構為主線,穿插說明語法問題,并具體舉例。教學形式是以教師為主體的“教授法”,單向地向學生灌輸知識。學生被動地“囫圇吞棗”,他們普遍認為程序設計難學,教學內容枯燥乏味,缺乏主動探索問題的興趣,實踐動手能力嚴重滯后,缺乏創新思想,考試得高分卻寫不出程序。
我們經過觀察、總結和研究,改革了C程序設計的理論教學和實踐教學。嘗試運用建構主義的學習理論,以學生已有的知識結構作為基礎,科學組織和架構教學內容,以建構主義的任務驅動為基礎,引入基于ACM模式的在線評測系統,將之運用于實踐教學。從近兩年來的教學測評反饋信息看,取得了良好的教學效果。
2在建構主義指導下組織教學內容
在皮亞杰“認知結構說”基礎上發展起來的建構主義認為,學習是一個積極主動的建構過程。在這個過程中,知識、內容等不能被訓練、被吸收,而只能被建構,學習者不是被動地接受外在信息,而是根據先前的認知結構主動和有選擇地知覺外在信息,建構當前事物的意義。學習總是與一定的社會文化背景即“情境”相聯系,學習者在一定的情境,即社會性背景下,借助其他人(包括教師和學習伙伴)的幫助,利用必要的學習材料,通過意義建構的方式而獲得知識[1-2]。在C語言程序設計教學中,我們對教學內容進行了大膽改革,用經驗“構建”有趣且具有實際應用背景的問題,引導學生運用C語言表達自己的求解問題想法,以學生為中心,幫助學生樹立“算法”思想。
2.1淡化語法規則,注重算法
我們面對的情況是,C語言設計的概念復雜,規則繁多,而另一方面,絕大部分學生的C語言是零基礎。需要講授的知識可分為C語言語法和程序設計兩部分內容。許多學完程序設計的學生,死記硬背下語法規則的條條框框,或是只能寫出幾個打印由星號組成的矩形類的“玩具”程序,而對計算機科學的基礎與靈魂——算法卻一無所知。他們不知道怎樣讓計算機解決具體問題,甚至不能敏感地意識到哪些問題適合用計算機處理[3],這不能不說是程序設計課程的失敗。這繼而導致學生程序設計基本技能的缺失,而在學習數據結構、算法設計等課程時就遇到困難或難以學精。
而在教學探索中,對于語言語法知識,我們只講實際應用中用到的核心部分,其他語法內容則通過引導學生自學、在線答疑等方法補充完善。我們認為,在語法上耗費太多的課時會讓學生覺得枯燥無味,學生死記語法應付了本門課程考試,但是沒有達到程序設計課程的既定教學目標。我們把重點放到應用和算法上,讓學生從應用和算法中學習語法,而不是反過來。我們讓學生盡早地接觸結構化程序設計,盡快適應計算機的“機器思維”(也稱“計算思維”)。
面對各類具體問題,快速找到計算機求解此問題的方法,并且用C語言表達出來,對于初學者來說,是一種全新的思維方式,確實讓很多沒有接觸過程序的學生無所適從。課堂上所選用的實例必須來源于現實生活,與學生的日常生活經驗息息相關。教師的重要任務是設計合適的實例,為學生編程任務提供真實的情境,通過設置問題情境把學生引入門,讓學生應用經驗和前面的知識分析問題、解決問題。學生可以獨自思考,也可以小組討論,最后使用C語言將算法表達成可運行的正確程序。這樣的教學過程不再是“填鴨式”地從流程圖到寫代碼地滿堂灌,不再讓學生被動地被教師牽著鼻子走,而是通過學生自己的主動建構主動地獲取新知識。
2.2精心安排教學內容和算法實例
教學內容的科學組織是提高教學質量的關鍵,我們在組織教學內容時強調理論和實踐的結合。以建構主義為指導,我們有選擇地組織和架構教學內容,合理安排教學內容的層次結構及算法實例。學生在以往的學習和日常生活中,必然已經形成了許多概念,通過適當的解釋和推理,更易于形成新的知識。所以,在教授過程中,教師要注意把學生現有的知識當做新知識的生長點,引導學生從原有的知識經驗中生長出新的知識經驗[2]。
因此,我們將C語言的課堂教學內容按順序分成9個部分,每個部分都組織相應的算法實例跟進,讓程序設計和算法思想齊頭并進。具體內容如下:
1) 第1部分:編程入門與if判斷的用法。通過main函數和輸入輸出函數,給學生一個C程序簡單框架的認識。輸入輸出函數讓學生能夠體會字符界面下數據的輸入輸出,然后介紹if條件語句,提出相應的算法實現,如2個數如何比大小、如何求最大值等。
2) 第2部分:循環與數組。以前面的例子為基礎提出問題,即3個數求最大值,4個數求最大值……直到100個數求最大值。機器最擅長做的事情就是“重復”,自然引出for循環結構。把題目中的求最大值改成數據排序,機器的存儲——數組的使用自然而然就引出了。
3) 第3部分:多分支和多重循環。這一部分內容建立在前面內容的基礎上。通過使用大量實例,靈活地將順序結構、選擇結構和循環結構與一維數組等內容融會貫通,介紹一些常用算法,比如冒泡排序、選擇排序等。在第1部分和第2部分沒有涉及到的switch、while等結構,也可以在此時引導學生自學,同時具體運用。
4) 第4部分:用二維數組處理批量數據。由數字照片的像素引入,介紹矩陣運算中的轉置、水平翻轉、垂直翻轉、加法、減法、乘法等基本運算的實現。
5) 第5部分:分工合作的模塊化設計——函數及遞歸。引入多個函數構成C程序的例子。比如判斷某年至某年間有多少閏年,判斷是否閏年可以用函數實現,再進一步,輸入年份和月份,輸出類似Windows自帶的日歷,年、月、日和星期幾對應的輸出等。遞歸涉及的算法有菲波拉契數列、河內塔游戲等。
6) 第6部分:文本的處理——字符串。字符串的存儲與字符串處理的介紹,通過大整數的加減、密碼加密、解密等內容結合在一起。
7) 第7部分:指針。包括指針變量、數組名、數組的動態分配。用數組和字符串處理相關的很多算法都可以用指針實現,同時可以比較其異同。
8) 第8部分:構件化的基礎——結構體。典型的問題有電話簿、鏈表等。
9) 第9部分:數據的持久化——文件。主要是對文本文件和二進制文件的基本操作。
在內容層次上的算法實例僅僅是一個簡要的介紹,具體安排與課時和學生的掌握情況相關,一些零散的知識點穿插在算法實例的講解中。課堂介紹固然重要,但教師應引導學生更多地提出問題,讓學生自己課外花時間弄清楚各種語法知識。課堂時間總是有限的,教師應引導學生利用課外時間自己看書、實踐和查資料,補充課堂沒有介紹的內容和細節,解決遇到的問題,提高自學能力。
在教學過程中,針對某個知識點,教師可以采用問題驅動法和討論法開展教學,使學生建立程序設計思想。教師創設問題情境,起到組織者、指導者、幫助者和促進者的作用,利用情境、會話和協作等學習環境要素,讓學生用自己已有的知識結構去過濾和解釋新的C語言程序設計知識,將其復制、吸納或改善到自己的認知結構中。比如,從“超級女生”節目獲得的PK經驗可以運用于算法,學生學習2個數比大小、求3個數的最大值就很簡單。這個過程體現了學生的觀察、思考和吸收過程[3]。編程的時候,if就是中文“如果”的英文單詞,把要表達的意思用英文“建構”,把算法轉變成源代碼也并不復雜。這樣,學生的學習成為一個積極主動的自主操作過程,學生有選擇地接受外在的信息,形成新知識,大大提高了學習興趣和學習主觀性[4]。
3基于評測系統的C語言程序實踐教學設計
C語言程序設計是一門實踐性很強的課程,只有多練習,多動手寫程序才能學好,因此實踐教學至關重要。我們將ACM程序設計競賽中的評測系統引入到C程序設計實踐教學中。ACM競賽的評測系統方法成熟,許多高校,如北京大學、清華大學等都開發了自己的OJ(Online Judge)系統。在教學實踐中,筆者采用北京大學的POJ搭建了在線評測系統,改進C程序設計課教學。
3.1引入評測系統到實踐教學的優勢
在程序設計課程實踐教學的傳統方式中,教師按照實驗教材布置相應的上機題,提前將實驗過程中可能遇到的問題進行講解,對解題思路加以提示,之后學生獨自上機編程,遇到問題請教師分別解答。這種方式暴露出很多問題:教師不能全面掌握學生做題的數量和效果,僅僅對個別學生留有印象;學生之間交流不多,各做各的;教師不能面對面回答每一個學生提出的問題;教師之前的提示在學生尚未思考之前,只能讓學生機械記住而不能理解,實驗中的集中講解不能適應每個學生的不同進度,不能達到好的效果。久而久之,會使學生在惰性和畏難情緒中喪失學習興趣,教師的重復工作量很大。
與傳統的教學方式相比,將評測系統引入到實踐教學中具有很大優勢,具體表現如下。
1) 評測系統在服務器端運行提交的程序,將結果與標準答案進行字符比較,通過嚴格的數據測試進行評判,由機器來評判對錯[5],這是人工評判遠不能及的,既顯公正又對學生編程思維的嚴謹程度提出高要求。
2) 增強學生之間的討論和交流氛圍,學生之間也可以看到排名,形成一種你追我趕的學習氛圍[6]。
3) 減少了教師在實踐教學中的重復工作量。根據學生提交的次數和排名及源代碼,教師可以查看學生的整體情況,在網上監督學生的作業完成情況,減輕了教師檢查任務、批改作業的負擔,提高了批改的準確性,可以在討論區解答存在的問題[7]。
4)“比賽”排名與算法的空間復雜度和時間復雜度相關,可以提高學生對程序運行時間空間復雜度的敏感性。
5)B/S結構提供了開放、自主學習的實驗環境。學生通過網絡可以輕松訪問,不受時間地點約束,無形中增加了課外上機的動力。
3.2基于評測系統的實踐教學設計
實驗教學的過程是:布置任務→組織學生上機實踐→輔導學生疑難問題→實驗結束前10分鐘簡要分析本次實驗中存在的問題→根據結果分析每次實驗的效果,調整下次實驗任務。
每次實驗前,我們在評測系統中給出本次實驗的題目和正確執行的測試數據,將不同難度層次的題目設計為一組實驗任務,學生上機就當是一次“練習賽”。比賽在規定時間開始,學生要在2小時內完成3~5題。系統要求每個學生使用自己的用戶名和密碼登錄,針對每一道題在本機的VC環境中調試運行,無誤后在線提交自己的程序代碼,服務器根據運行情況給出Accepted等結果。學生可以在幾秒鐘內知道是對是錯,錯在哪里[8],系統支持多次提交。系統對參加“比賽”的用戶即時地進行排名,提交正確的任務個數越多、用時越少的學生,排名越靠前。
我們將評測系統引入到C程序設計實驗教學中,激發了學生的學習熱情和潛力。利用好評測系統,為C程序設計教學服務的關鍵是精心設計實驗任務,在實際運用中,我們采取了如下措施。
1) 將傳統的實驗內容改編為ACM題目[6]。改編既要保留待考察的知識點,又要增加題目的趣味性,測試數據必須全面、準確。通過具體問題描述,學生自主選擇合理的算法解題,加深對基本知識的掌握水平,真正做到學以致用。
2) 多個任務的難易要分配得當。任務過于容易,學生得不到鍛煉,任務過難,沒有或只有少數學生能完成任務,學生的自信心和興趣受到打擊。不同難度層次的實驗任務,能夠滿足不同水平層次學生的需求。
3) 任務的考察點要和理論課講解的算法緊密相關。讓學生在模仿的前提下變通,“復制”和“同化”知識。
4結語
在C語言程序設計課的教學改革中,我們輕語法規則,強調算法和計算思維,在建構主義指導下安排教學內容的層次結構及算法實例,利用在線評測系統引導激勵學生動手編程,將以教師為中心、單方面灌輸、學生被動接受知識,轉變為激發學生興趣、學生主動獲取知識,讓學生在“你追我趕的競賽”中提高編程能力。本教學改革在湖南農業大學信息科學技術學院、東方科技學院2009級計算機、信息工程、電子商務專業共12個班級的教學實踐中取得了很好的教學效果。
參考文獻:
[1] 許曉東. 基于建構主義的計算機任務驅動式教學法[J]. 重慶工學