趙馮平 張翠蓮 黃鐳
[摘 要]實踐環(huán)節(jié)是程序設(shè)計課程的重要組成部分,文章通過分析、比較相關(guān)的程序在線評測網(wǎng)站,結(jié)合教學(xué)實踐,建立了程序設(shè)計課程作業(yè)在線評測系統(tǒng)網(wǎng)站,系統(tǒng)給學(xué)生提供編程練習(xí)題,在線提交程序,在線即時評測。系統(tǒng)在習(xí)題中融入程序設(shè)計知識、編程技巧介紹,有些題目的設(shè)計,更是把程序設(shè)計的思維及行動過程融入其中,培養(yǎng)學(xué)生的抽象思維能力、理解逐步求精設(shè)計思想。
[關(guān)鍵詞]程序設(shè)計課程;實踐環(huán)節(jié);作業(yè)在線評測
[中圖分類號]G642;TP311 [文獻(xiàn)標(biāo)識碼]A [文章編號]1008-7656(2020)02-0019-05
一、問題的提出及解決思路
程序設(shè)計課程的實踐環(huán)節(jié)非常重要,如果把紙面作業(yè)、傳統(tǒng)的紙面試卷考試作為重點,是很難真正學(xué)會編程的。學(xué)生上機的機時不足或其他原因造成的實踐環(huán)節(jié)欠缺,程序的設(shè)計與程序編輯輸入、程序的調(diào)試分離等原因,學(xué)生學(xué)習(xí)程序設(shè)計感到比較困難;傳統(tǒng)教材上的程序例子往往難以表現(xiàn)程序設(shè)計、調(diào)試的過程,給出的是設(shè)計的結(jié)果及設(shè)計說明;學(xué)生和教師在日常生活和傳統(tǒng)學(xué)科學(xué)習(xí)中形成的慣性思維,教師往往會側(cè)重于對課本中程序的每一步進(jìn)行講解,而學(xué)生努力學(xué)習(xí)規(guī)則、理解書中程序例子,最后可能會發(fā)現(xiàn),即使課本內(nèi)容全明白了,實際的編程問題還是難以下手。
最早的在線評測系統(tǒng)主要應(yīng)用在高端的編程算法競賽中,隨著互聯(lián)網(wǎng)的發(fā)展、普及,大量的在線程序設(shè)計評測系統(tǒng)也應(yīng)用到了算法設(shè)計、數(shù)據(jù)結(jié)構(gòu)和程序設(shè)計的教學(xué)領(lǐng)域[1],使學(xué)習(xí)更富趣味性和挑戰(zhàn)性。為此,我們順應(yīng)潮流,利用現(xiàn)代的工具方法,借助北京大學(xué)的openjudge.cn平臺[2],實現(xiàn)一個評測系統(tǒng),要求系統(tǒng)實現(xiàn)以下目標(biāo):與現(xiàn)有的系統(tǒng)相比更加講求基礎(chǔ)性、入門性,更適合基礎(chǔ)薄弱的學(xué)生學(xué)習(xí);系統(tǒng)在題目中融入基礎(chǔ)知識、重點難點知識介紹,并以清晰明了的方式去呈現(xiàn);題目中給出編程方法導(dǎo)引,引導(dǎo)學(xué)生把逐步求精設(shè)計方法落到實處,引導(dǎo)學(xué)生形成正確的思維方式;學(xué)習(xí)上升進(jìn)步曲線坡度緩、每一步向上的階梯小,理論與實踐緊密結(jié)合。
我們設(shè)計的在線作業(yè)系統(tǒng),最終目的是方便學(xué)生學(xué)習(xí)編程,激發(fā)學(xué)習(xí)興趣,掌握正確的思維和行動方法,以正確的思維去理解和構(gòu)建復(fù)雜的程序系統(tǒng)。
二、研究方法和過程
結(jié)構(gòu)化程序設(shè)計(structured programming)是E.W.Dijikstra在1965年提出的,其中包含了采用自頂向下、逐步求精的程序設(shè)計方法。逐步求精是程序設(shè)計最基本的思想方法和技術(shù),其思想是逐步逐級地把大問題分解成小問題,直至最終能用程序語言表示問題的解決過程。落實逐步求精——把逐步求精思想落實到編程的每一步行動上(包括程序的輸入編輯過程),是系統(tǒng)設(shè)計要完成的任務(wù)。
設(shè)計編寫程序就是一個逐步填空的過程,首先明確地描述問題,寫出C++程序的基本格式框架,并描述問題框架,然后依照分步、分類思想逐步逐級地對大問題分解,并結(jié)合C++語言的語法寫出進(jìn)一步細(xì)化的格式框架和問題框架,以此作為下一步求精的基礎(chǔ),求精過程不斷進(jìn)行(保證在整個求精過程中程序都能正確編譯,程序的測試排錯也同時進(jìn)行),直至最后用C++語言描述整個問題的解決過程。設(shè)計是一種在思路上“從總到細(xì)”的過程,是從抽象到具體的過程。要學(xué)會設(shè)計程序,還要學(xué)習(xí)C/C++語言大量具體的細(xì)節(jié)知識。學(xué)習(xí)、理解知識,是從具體到抽象的思維過程。
程序設(shè)計課程作業(yè)在線評測系統(tǒng),是基于以上認(rèn)識設(shè)計并實施的。我們介紹的編程語言知識有:順序程序設(shè)計,如何形成逐步求精的程序設(shè)計習(xí)慣;理解條件分支,并在設(shè)計中落實逐步求精思想;理解循環(huán),如何在循環(huán)設(shè)計中落實逐步求精技術(shù)?;舅惴ㄓ信判颉?shù)的進(jìn)位制及其轉(zhuǎn)換、暴力搜索、打印二維圖形、素數(shù)檢測等。對如何呈現(xiàn)知識和介紹算法,是我們應(yīng)該反復(fù)斟酌、精心打磨的工作。
(一)以強化逐步求精技術(shù)為目標(biāo)的程序設(shè)計題目
設(shè)計編寫程序是一個逐步擴展程序、逐步填空的過程,在此過程中,保證每個階段程序均能被正確編譯。按圖1中從左到右的順序依次輸入(保存)、編譯,并逐步擴展程序,得到C++程序基本框架。
在編程入門介紹順序程序設(shè)計階段,本在線評測系統(tǒng)中設(shè)計的很多習(xí)題都強調(diào)按以上方法設(shè)計編寫程序。
在條件分支程序和循環(huán)設(shè)計問題中,多次反復(fù)強調(diào)條件語句框架、循環(huán)語句框架書寫規(guī)則,并在許多題目中按逐步求精思想展現(xiàn)設(shè)計過程,算法的設(shè)計與程序框架結(jié)合,保證在整個逐步求精設(shè)計過程中程序都能正確編譯,但只是完成部分編程解題過程,由學(xué)生按照同樣的思路完成整個題目的解答。以這樣的導(dǎo)引方式來強化設(shè)計程序的思想方法、操作過程,使學(xué)生在潛移默化中掌握正確的設(shè)計和操作方法。
(二)提升從具體到抽象的思維的能力(即歸納事物本質(zhì)的能力)的編程問題
設(shè)計是一種在思路上“從總到細(xì)”的過程,是從抽象到具體的過程、是逐步求精的過程,但是,除了有正確的思想方法,要實現(xiàn)設(shè)計,還要學(xué)習(xí)了解編程語言知識細(xì)節(jié),以及掌握許多處理問題的算法框架。聰明的數(shù)學(xué)家們不會羞于考慮小問題,因為當(dāng)極端情形(即便它們是平凡的情形)弄得明明白白時,一般的形式就容易理解了[4]。解決小的、具體問題的程序代碼實現(xiàn)了,解決一般化的、抽象的問題的代碼就容易歸納出來了。學(xué)習(xí)理解算法框架,我們遵循從具體到抽象的認(rèn)知過程,設(shè)計一些題目使學(xué)生能學(xué)習(xí)體會歸納過程,從而更好地掌握一些算法框架,真正培養(yǎng)創(chuàng)新能力。例如,后面介紹的1310題(見21頁圖3),就是通過給出順序執(zhí)行的具體語句,要求寫出抽象的循環(huán)語句,以此來訓(xùn)練歸納、抽象能力。類似的問題反復(fù)在本在線評測系統(tǒng)的各類題目中出現(xiàn)。
(三)逐步求精程序設(shè)計思想的訓(xùn)練
我們所說的抽象思維究竟是什么呢?讓我們回到其基本定義:抽象思維是指“脫離了具體事務(wù)的邏輯表達(dá)”。這也就是計算機科學(xué)家和軟件工程師們在建立算法時所試圖去做的[3]。運十客機副總設(shè)計師程不時說:“設(shè)計是一種在思路上‘總到細(xì)的過程”。是從抽象到具體的過程,通過大量從具體到抽象的編程問題,使學(xué)生掌握了處理問題細(xì)節(jié)的能力,在此基礎(chǔ)上,我們又通過一些問題強調(diào)“從總到細(xì)”的設(shè)計過程,強化逐步求精設(shè)計思想,最終目的是使“逐步求精”思想落實的程序設(shè)計的思維和行動的每一個步驟。類似圖2的題目都是為了強調(diào)“逐步求精”過程,在這些題目中,有的給出求精過程的一個步驟,有的給出求精過程的兩、三個步驟,讓學(xué)生真切體念設(shè)計過程及操作實施過程,并模仿進(jìn)行進(jìn)一步設(shè)計,直至完成題目的任務(wù)。
(四)嵌入基礎(chǔ)知識、編程方法、算法知識介紹,算法設(shè)計與程序設(shè)計密切配合
平常在教學(xué)中總結(jié)良好的教學(xué)方法、認(rèn)知方法,巧妙地融入題目中。有相關(guān)的題目介紹條件和循環(huán)命令等基礎(chǔ)知識和重點難點知識;有相關(guān)題目總結(jié)歸納出通用的算法框架,題目側(cè)重于展現(xiàn)從具體到抽象的思維方法。例如,以下頁圖3的二進(jìn)制與十進(jìn)制轉(zhuǎn)換介紹,就包含了推導(dǎo)過程、樸素證明、手工計算操作方式和程序代碼實現(xiàn),并在此基礎(chǔ)上,再輔以上升階梯小,設(shè)計精妙的習(xí)題,學(xué)生可以逐步掌握。
(五)題目的設(shè)計強調(diào)入門性、循序漸進(jìn)性
為了適應(yīng)基礎(chǔ)較差的成年人和小學(xué)生學(xué)習(xí)程序設(shè)計技術(shù),我們精心設(shè)計題目,如對常用傳統(tǒng)的基礎(chǔ)入門習(xí)題,根據(jù)對學(xué)生的指導(dǎo)經(jīng)驗以及學(xué)生的常見問題,把它拆解成幾個更加具體的題目,使學(xué)生完成淺顯的問題后能自然地解決原來的問題。關(guān)于題目的循序漸進(jìn)性,在許多地方我們都想辦法做到更好,使學(xué)生按順序做一套題的過程中毫無困難,并在最后完全掌握相應(yīng)的知識點。
三、研究結(jié)果及分析
以方便、促進(jìn)學(xué)生學(xué)習(xí)和對基礎(chǔ)點、難點、重點知識的介紹為出發(fā)點,以突出編程思維和過程的教育為根本,我們建立了《程序設(shè)計課程作業(yè)在線評測系統(tǒng)》網(wǎng)站(http://gxdd.openjudge.cn/),并在使用測試實踐環(huán)節(jié)中,對系統(tǒng)做了一定的改進(jìn)和完善工作。系統(tǒng)實現(xiàn)了以下目標(biāo)。
(一)在線作業(yè)、在線提交、實時評測
每個學(xué)生都可以在系統(tǒng)上建立自己的賬號,按題目要求提交程序,編程過程中,學(xué)生要考慮題目的每一個細(xì)節(jié)和特殊的邊界條件,而不是程序大體正確就行,對于培養(yǎng)嚴(yán)謹(jǐn)、周密的程序設(shè)計作風(fēng)極為有效[2]。
(二)引導(dǎo)并強制學(xué)生把逐步求精設(shè)計方法落實到編程實踐的每一步思維和行動上
通過一些習(xí)題,有的給出逐步求精設(shè)計過程的1個步驟,有的給出2個或3個步驟,由學(xué)生去完成余下的設(shè)計,這樣學(xué)生會在潛移默化中掌握逐步求精設(shè)計方法。
(三)基礎(chǔ)的程序語言知識導(dǎo)引以及算法知識的導(dǎo)引
精心設(shè)計的知識表現(xiàn)框架(如上頁圖4)、圖例,使學(xué)生能更容易、更快地掌握程序語言知識;從具體到抽象的設(shè)計導(dǎo)引,使學(xué)生更自然地掌握算法的設(shè)計和實現(xiàn)過程;落實逐步求精,從總到細(xì)、從抽象到具體的設(shè)計導(dǎo)引,目的就是把學(xué)生引向正確的設(shè)計道路。
(四)提升思維水平,反復(fù)通過從具體到抽象、抽象到具體的訓(xùn)練,使學(xué)習(xí)者達(dá)到更高的抽象思維水平
實踐表明,該系統(tǒng)確實方便學(xué)生學(xué)習(xí),提升了學(xué)習(xí)效率,學(xué)生在課后做練習(xí)可以少參考課本。作業(yè)系統(tǒng)通過系列題目介紹算法,老師對于學(xué)生針對某些題目的問題,只需指出應(yīng)該參考的簡單題目就可以了,特別在培養(yǎng)正確的思維和編程習(xí)慣上,確實給了學(xué)生很大的幫助。
四、總結(jié)
實踐證明,我們建立的在線評測系統(tǒng),方便了學(xué)生的學(xué)習(xí),激發(fā)了學(xué)生的學(xué)習(xí)欲望,使學(xué)生通過學(xué)習(xí)能夠掌握正確的思維和行動方法,以正確的思維去理解和構(gòu)建復(fù)雜的程序系統(tǒng)。由于使用系統(tǒng)的學(xué)生人數(shù)樣本不多,造成了對系統(tǒng)的測試、評估和改進(jìn)工作還存在不足,需要后續(xù)研究加以改進(jìn)。
[參考文獻(xiàn)]
[1]李文新,郭煒.北京大學(xué)程序在線評測系統(tǒng)及其應(yīng)用[J].吉林大學(xué)學(xué)報(信息科學(xué)版),2005(S2).
[2]李文新,郭煒,余華山.程序設(shè)計導(dǎo)引及在線實踐[M].北京:清華大學(xué)出版社,2007.
[3]Russell L. Shackelford.計算與算法導(dǎo)論[M].章小莉,孫厚琴,汪永好等,譯.北京:電子工業(yè)出版社,2003.
[4]Ronald L.Graham,Oren Patashnik, Donald E.Knuth.具體數(shù)學(xué)[M].張明堯,張凡,譯.北京:人民郵電出版社,2013.
[責(zé)任編輯 何一輝]