趙馮平 張翠蓮 黃鐳
[摘 要]實(shí)踐環(huán)節(jié)是程序設(shè)計(jì)課程的重要組成部分,文章通過分析、比較相關(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)過程融入其中,培養(yǎng)學(xué)生的抽象思維能力、理解逐步求精設(shè)計(jì)思想。
[關(guān)鍵詞]程序設(shè)計(jì)課程;實(shí)踐環(huán)節(jié);作業(yè)在線評(píng)測(cè)
[中圖分類號(hào)]G642;TP311 [文獻(xiàn)標(biāo)識(shí)碼]A [文章編號(hào)]1008-7656(2020)02-0019-05
一、問題的提出及解決思路
程序設(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)試的過程,給出的是設(shè)計(jì)的結(jié)果及設(shè)計(jì)說明;學(xué)生和教師在日常生活和傳統(tǒng)學(xué)科學(xué)習(xí)中形成的慣性思維,教師往往會(huì)側(cè)重于對(duì)課本中程序的每一步進(jìn)行講解,而學(xué)生努力學(xué)習(xí)規(guī)則、理解書中程序例子,最后可能會(huì)發(fā)現(xiàn),即使課本內(nèi)容全明白了,實(shí)際的編程問題還是難以下手。
最早的在線評(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ǔ)性、入門性,更適合基礎(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)。
二、研究方法和過程
結(jié)構(gòu)化程序設(shè)計(jì)(structured programming)是E.W.Dijikstra在1965年提出的,其中包含了采用自頂向下、逐步求精的程序設(shè)計(jì)方法。逐步求精是程序設(shè)計(jì)最基本的思想方法和技術(shù),其思想是逐步逐級(jí)地把大問題分解成小問題,直至最終能用程序語言表示問題的解決過程。落實(shí)逐步求精——把逐步求精思想落實(shí)到編程的每一步行動(dòng)上(包括程序的輸入編輯過程),是系統(tǒng)設(shè)計(jì)要完成的任務(wù)。
設(shè)計(jì)編寫程序就是一個(gè)逐步填空的過程,首先明確地描述問題,寫出C++程序的基本格式框架,并描述問題框架,然后依照分步、分類思想逐步逐級(jí)地對(duì)大問題分解,并結(jié)合C++語言的語法寫出進(jìn)一步細(xì)化的格式框架和問題框架,以此作為下一步求精的基礎(chǔ),求精過程不斷進(jìn)行(保證在整個(gè)求精過程中程序都能正確編譯,程序的測(cè)試排錯(cuò)也同時(shí)進(jìn)行),直至最后用C++語言描述整個(gè)問題的解決過程。設(shè)計(jì)是一種在思路上“從總到細(xì)”的過程,是從抽象到具體的過程。要學(xué)會(huì)設(shè)計(jì)程序,還要學(xué)習(xí)C/C++語言大量具體的細(xì)節(jié)知識(shí)。學(xué)習(xí)、理解知識(shí),是從具體到抽象的思維過程。
程序設(shè)計(jì)課程作業(yè)在線評(píng)測(cè)系統(tǒng),是基于以上認(rèn)識(shí)設(shè)計(jì)并實(shí)施的。我們介紹的編程語言知識(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ì)編寫程序是一個(gè)逐步擴(kuò)展程序、逐步填空的過程,在此過程中,保證每個(gè)階段程序均能被正確編譯。按圖1中從左到右的順序依次輸入(保存)、編譯,并逐步擴(kuò)展程序,得到C++程序基本框架。
在編程入門介紹順序程序設(shè)計(jì)階段,本在線評(píng)測(cè)系統(tǒng)中設(shè)計(jì)的很多習(xí)題都強(qiáng)調(diào)按以上方法設(shè)計(jì)編寫程序。
在條件分支程序和循環(huán)設(shè)計(jì)問題中,多次反復(fù)強(qiáng)調(diào)條件語句框架、循環(huán)語句框架書寫規(guī)則,并在許多題目中按逐步求精思想展現(xiàn)設(shè)計(jì)過程,算法的設(shè)計(jì)與程序框架結(jié)合,保證在整個(gè)逐步求精設(shè)計(jì)過程中程序都能正確編譯,但只是完成部分編程解題過程,由學(xué)生按照同樣的思路完成整個(gè)題目的解答。以這樣的導(dǎo)引方式來強(qiáng)化設(shè)計(jì)程序的思想方法、操作過程,使學(xué)生在潛移默化中掌握正確的設(shè)計(jì)和操作方法。
(二)提升從具體到抽象的思維的能力(即歸納事物本質(zhì)的能力)的編程問題
設(shè)計(jì)是一種在思路上“從總到細(xì)”的過程,是從抽象到具體的過程、是逐步求精的過程,但是,除了有正確的思想方法,要實(shí)現(xiàn)設(shè)計(jì),還要學(xué)習(xí)了解編程語言知識(shí)細(xì)節(jié),以及掌握許多處理問題的算法框架。聰明的數(shù)學(xué)家們不會(huì)羞于考慮小問題,因?yàn)楫?dāng)極端情形(即便它們是平凡的情形)弄得明明白白時(shí),一般的形式就容易理解了[4]。解決小的、具體問題的程序代碼實(shí)現(xiàn)了,解決一般化的、抽象的問題的代碼就容易歸納出來了。學(xué)習(xí)理解算法框架,我們遵循從具體到抽象的認(rèn)知過程,設(shè)計(jì)一些題目使學(xué)生能學(xué)習(xí)體會(huì)歸納過程,從而更好地掌握一些算法框架,真正培養(yǎng)創(chuàng)新能力。例如,后面介紹的1310題(見21頁圖3),就是通過給出順序執(zhí)行的具體語句,要求寫出抽象的循環(huán)語句,以此來訓(xùn)練歸納、抽象能力。類似的問題反復(fù)在本在線評(píng)測(cè)系統(tǒng)的各類題目中出現(xiàn)。
(三)逐步求精程序設(shè)計(jì)思想的訓(xùn)練
我們所說的抽象思維究竟是什么呢?讓我們回到其基本定義:抽象思維是指“脫離了具體事務(wù)的邏輯表達(dá)”。這也就是計(jì)算機(jī)科學(xué)家和軟件工程師們?cè)诮⑺惴〞r(shí)所試圖去做的[3]。運(yùn)十客機(jī)副總設(shè)計(jì)師程不時(shí)說:“設(shè)計(jì)是一種在思路上‘總到細(xì)的過程”。是從抽象到具體的過程,通過大量從具體到抽象的編程問題,使學(xué)生掌握了處理問題細(xì)節(jié)的能力,在此基礎(chǔ)上,我們又通過一些問題強(qiáng)調(diào)“從總到細(xì)”的設(shè)計(jì)過程,強(qiáng)化逐步求精設(shè)計(jì)思想,最終目的是使“逐步求精”思想落實(shí)的程序設(shè)計(jì)的思維和行動(dòng)的每一個(gè)步驟。類似圖2的題目都是為了強(qiáng)調(diào)“逐步求精”過程,在這些題目中,有的給出求精過程的一個(gè)步驟,有的給出求精過程的兩、三個(gè)步驟,讓學(xué)生真切體念設(shè)計(jì)過程及操作實(shí)施過程,并模仿進(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)從具體到抽象的思維方法。例如,以下頁圖3的二進(jìn)制與十進(jìn)制轉(zhuǎn)換介紹,就包含了推導(dǎo)過程、樸素證明、手工計(jì)算操作方式和程序代碼實(shí)現(xiàn),并在此基礎(chǔ)上,再輔以上升階梯小,設(shè)計(jì)精妙的習(xí)題,學(xué)生可以逐步掌握。
(五)題目的設(shè)計(jì)強(qiáng)調(diào)入門性、循序漸進(jìn)性
為了適應(yīng)基礎(chǔ)較差的成年人和小學(xué)生學(xué)習(xí)程序設(shè)計(jì)技術(shù),我們精心設(shè)計(jì)題目,如對(duì)常用傳統(tǒng)的基礎(chǔ)入門習(xí)題,根據(jù)對(duì)學(xué)生的指導(dǎo)經(jīng)驗(yàn)以及學(xué)生的常見問題,把它拆解成幾個(gè)更加具體的題目,使學(xué)生完成淺顯的問題后能自然地解決原來的問題。關(guān)于題目的循序漸進(jìn)性,在許多地方我們都想辦法做到更好,使學(xué)生按順序做一套題的過程中毫無困難,并在最后完全掌握相應(yīng)的知識(shí)點(diǎn)。
三、研究結(jié)果及分析
以方便、促進(jìn)學(xué)生學(xué)習(xí)和對(duì)基礎(chǔ)點(diǎn)、難點(diǎn)、重點(diǎn)知識(shí)的介紹為出發(fā)點(diǎn),以突出編程思維和過程的教育為根本,我們建立了《程序設(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),按題目要求提交程序,編程過程中,學(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)上
通過一些習(xí)題,有的給出逐步求精設(shè)計(jì)過程的1個(gè)步驟,有的給出2個(gè)或3個(gè)步驟,由學(xué)生去完成余下的設(shè)計(jì),這樣學(xué)生會(huì)在潛移默化中掌握逐步求精設(shè)計(jì)方法。
(三)基礎(chǔ)的程序語言知識(shí)導(dǎo)引以及算法知識(shí)的導(dǎo)引
精心設(shè)計(jì)的知識(shí)表現(xiàn)框架(如上頁圖4)、圖例,使學(xué)生能更容易、更快地掌握程序語言知識(shí);從具體到抽象的設(shè)計(jì)導(dǎo)引,使學(xué)生更自然地掌握算法的設(shè)計(jì)和實(shí)現(xiàn)過程;落實(shí)逐步求精,從總到細(xì)、從抽象到具體的設(shè)計(jì)導(dǎo)引,目的就是把學(xué)生引向正確的設(shè)計(jì)道路。
(四)提升思維水平,反復(fù)通過從具體到抽象、抽象到具體的訓(xùn)練,使學(xué)習(xí)者達(dá)到更高的抽象思維水平
實(shí)踐表明,該系統(tǒng)確實(shí)方便學(xué)生學(xué)習(xí),提升了學(xué)習(xí)效率,學(xué)生在課后做練習(xí)可以少參考課本。作業(yè)系統(tǒng)通過系列題目介紹算法,老師對(duì)于學(xué)生針對(duì)某些題目的問題,只需指出應(yīng)該參考的簡單題目就可以了,特別在培養(yǎng)正確的思維和編程習(xí)慣上,確實(shí)給了學(xué)生很大的幫助。
四、總結(jié)
實(shí)踐證明,我們建立的在線評(píng)測(cè)系統(tǒng),方便了學(xué)生的學(xué)習(xí),激發(fā)了學(xué)生的學(xué)習(xí)欲望,使學(xué)生通過學(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é)任編輯 何一輝]