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