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