摘要:本文提出在Online Judge系統(tǒng)基礎(chǔ)上實(shí)現(xiàn)對(duì)C語言課程設(shè)計(jì)進(jìn)行在線評(píng)判的方法,從而減少任課教師的工作負(fù)擔(dān),提高學(xué)生的學(xué)習(xí)興趣與主動(dòng)性,進(jìn)而提高整個(gè)課程的教學(xué)質(zhì)量。
關(guān)鍵詞:C語言課程設(shè)計(jì);在線評(píng)判;教學(xué)質(zhì)量
C語言課程設(shè)計(jì)是計(jì)算機(jī)相關(guān)專業(yè)學(xué)生的重要實(shí)踐教學(xué)內(nèi)容之一。它主要用于解決一個(gè)中等規(guī)模的實(shí)際問題,可以同時(shí)運(yùn)用一門或多門課程所涉及的知識(shí)域或知識(shí)點(diǎn)[1]。目前市面上有不少C語言課程設(shè)計(jì)的教材[2-4],這些教材為任課教師選題和組織教學(xué)提供了很好的參考。盡管如此,要使課程設(shè)計(jì)教學(xué)取得最佳教學(xué)效果,我們?nèi)砸鎸?duì)一些問題。
(1) 課程設(shè)計(jì)中的代碼量較大,教師檢查代碼的工作繁重。以設(shè)計(jì)一個(gè)小型倉庫管理軟件為例,代碼一般為幾百到上千行,一名教師指導(dǎo)兩個(gè)班(約60名學(xué)生),全部檢查需要閱讀幾萬行代碼,如果在教學(xué)過程中增加檢查的次數(shù),則工作量更大。因而,教師一般不直接檢查代碼,而采用抽檢的方式,但效果不理想。
(2) 由于過程監(jiān)控力度不夠,抄襲現(xiàn)象嚴(yán)重。
(3) 用考勤、設(shè)計(jì)報(bào)告等有限的評(píng)分依據(jù)難以對(duì)學(xué)生學(xué)習(xí)情況作出客觀評(píng)價(jià),相反,它在一定程度上還挫傷學(xué)生的學(xué)習(xí)積極性。
針對(duì)上述問題,有人提出將目前軟件工程中的代碼自動(dòng)測試的方法引入到C語言課程設(shè)計(jì)教學(xué)中來,讓系統(tǒng)對(duì)學(xué)生提交的代碼進(jìn)行自動(dòng)評(píng)判,從而減輕教師的工作負(fù)擔(dān),提高過程的監(jiān)控力度,并使評(píng)分更為客觀,進(jìn)而提高整個(gè)課程設(shè)計(jì)教學(xué)的質(zhì)量。然而,設(shè)計(jì)一套這樣的系統(tǒng)對(duì)一所高校來說并非易事。本文提出通過對(duì)目前越來越多高校普遍采用的Online udge(OJ)系統(tǒng)進(jìn)行功能改造,從而實(shí)現(xiàn)對(duì)課程設(shè)計(jì)中的代碼進(jìn)行在線自動(dòng)評(píng)判的方法。實(shí)踐表明,該方法實(shí)現(xiàn)較為簡單,且效果良好。
1OJ系統(tǒng)
OJ系統(tǒng)是一個(gè)在線的判題系統(tǒng)。用戶可以在線提交多種語言(如C、C++、Java)的源代碼,系統(tǒng)對(duì)源代碼進(jìn)行編譯和執(zhí)行,并通過預(yù)先設(shè)計(jì)的測試數(shù)據(jù)來檢驗(yàn)程序源代碼的正確性。OJ系統(tǒng)最初使用于ACM/ICPC(國際大學(xué)生程序設(shè)計(jì)競賽)和OI(信息學(xué)奧林匹克競賽)當(dāng)中,現(xiàn)廣泛應(yīng)用于世界各地高校學(xué)生程序設(shè)計(jì)的訓(xùn)練、參賽隊(duì)員的訓(xùn)練和選拔、各種程序設(shè)計(jì)競賽以及數(shù)據(jù)結(jié)構(gòu)和算法的學(xué)習(xí)和作業(yè)的自動(dòng)提交評(píng)判中。常用的OJ系統(tǒng)涉及的主要數(shù)據(jù)類型與功能如圖1所示。
圖1常用OJ的主要數(shù)據(jù)類型與功能示意圖
基金項(xiàng)目:華南農(nóng)業(yè)大學(xué)教育教學(xué)改革與研究重點(diǎn)課題(JG07012);華南農(nóng)業(yè)大學(xué)教育教學(xué)改革與研究課題(JG07096)。
作者簡介:陳湘驥(1976-),男,廣西桂林人,講師,在讀博士生,研究方向?yàn)槎嗝襟w技術(shù)。
在OJ系統(tǒng)中,題目詳細(xì)地描述了待解決的問題,用戶可以選定題目并提交相應(yīng)的解答,評(píng)判機(jī)起到自動(dòng)評(píng)判的作用,具體評(píng)判過程如下。
(1) 編譯并執(zhí)行解答程序,如果出現(xiàn)編譯錯(cuò)誤或運(yùn)行時(shí)錯(cuò)誤,則報(bào)錯(cuò)并退出。
(2) 將題目中設(shè)定的測試數(shù)據(jù)作為解答程序的輸入,解答程序處理后,輸出處理結(jié)果。
(3) 將解答程序的輸出與結(jié)果數(shù)據(jù)進(jìn)行對(duì)比,相符則輸出“接受(accepted)”,否則判錯(cuò)。
解答提交后一般經(jīng)過數(shù)秒,便可看到評(píng)判結(jié)果,學(xué)生可以不斷修改代碼并提交,直到OJ系統(tǒng)判定為“接受”為止。
2OJ系統(tǒng)的改進(jìn)與課程設(shè)計(jì)的在線評(píng)判
在OJ系統(tǒng)中,一個(gè)題目針對(duì)一個(gè)具體問題,比如排序或求最短路徑等。而一個(gè)課程設(shè)計(jì)題目遠(yuǎn)比OJ系統(tǒng)中的單個(gè)題目所涉及的內(nèi)容要多,但是課程設(shè)計(jì)題目可以分解成多個(gè)小的功能模塊,比如設(shè)計(jì)一個(gè)小型倉庫管理系統(tǒng)可以分成多個(gè)小功能模塊,如讀入庫存物品信息、按物品名查詢物品信息、物品入庫、物品出庫、數(shù)據(jù)存盤,等等。這些分解出的小功能模塊所要解決的往往是一個(gè)具體問題,這就與OJ系統(tǒng)中的題目對(duì)應(yīng)上了。
為此,在現(xiàn)有OJ系統(tǒng)上增加新的數(shù)據(jù)類型(如圖2所示),以達(dá)到對(duì)課程設(shè)計(jì)題目進(jìn)行分解,并完成自動(dòng)評(píng)判的目的。
圖2增加新數(shù)據(jù)項(xiàng)后的OJ系統(tǒng)
course problem(課程設(shè)計(jì)題目)可以分成多個(gè)小功能模塊,每個(gè)模塊所要解決的問題對(duì)應(yīng)一個(gè)可在線評(píng)判的problem(即原OJ系統(tǒng)中的題目),因而course problem與problem的關(guān)系是一對(duì)多,但在實(shí)際設(shè)計(jì)中,將course problem與problem的關(guān)系設(shè)計(jì)成多對(duì)多,主要是為了提高problem的復(fù)用性。因?yàn)椴煌恼n程設(shè)計(jì)題目分解出的小功能模塊所對(duì)應(yīng)的problem可能相同或相似(比如“設(shè)計(jì)小型圖書管理系統(tǒng)”與“設(shè)計(jì)小型倉庫管理系統(tǒng)”兩個(gè)課程設(shè)計(jì)題目均有按關(guān)鍵詞查找數(shù)據(jù)這樣的設(shè)計(jì)要求),因而可以設(shè)定相同的一個(gè)problem以滿足多個(gè)課程設(shè)計(jì)題目對(duì)這部分模塊的評(píng)判要求。
course solution(課程設(shè)計(jì)解答)是由學(xué)生提交的針對(duì)某一個(gè)課程設(shè)計(jì)題目的解答(以源碼方式)。由于OJ系統(tǒng)只能評(píng)判對(duì)應(yīng)problem的solution(題目解答),所以一個(gè)course solution將根據(jù)設(shè)定的course problem與problem的對(duì)應(yīng)關(guān)系,分解為多個(gè)對(duì)應(yīng)的solution,之后由評(píng)判機(jī)評(píng)判。
對(duì)course solution的評(píng)判過程描述如下。
(1) 學(xué)生提交設(shè)計(jì)代碼,創(chuàng)建course solution,并根據(jù)course problem與problem的關(guān)系創(chuàng)建對(duì)應(yīng)的多個(gè)solution。
(2)solution進(jìn)入評(píng)判隊(duì)列,按OJ的評(píng)判規(guī)則完成評(píng)判。
(3) 對(duì)course solution的評(píng)判由上面多個(gè)solution的評(píng)判結(jié)果匯總得到。
course solution的評(píng)判結(jié)果通過計(jì)算帶權(quán)累加和得到。用P表示課程設(shè)計(jì)題目,pi(1≤i≤n)表示由P分解得到的n個(gè)problem,wi(1≤i≤n,且 , wi>0)代表由難易程度確定的n個(gè)problem的權(quán)值,si(1≤i≤n)代表解答中對(duì)應(yīng)n個(gè)problem的評(píng)判結(jié)果。由于在OJ系統(tǒng)中,只有“接受”與“不接受”(包括編譯錯(cuò)誤、超時(shí)、結(jié)果錯(cuò),等等)兩種評(píng)判結(jié)果,故接受pi的解答則令si 等于1,否則令si 等于0。則綜合評(píng)判結(jié)果S可按如下公式計(jì)算:
S是一個(gè)在[0,100]范圍內(nèi)的一個(gè)分值。
在這一過程中,有兩個(gè)技術(shù)問題需要解決,一個(gè)是如何將course solution分解為多個(gè)solution;另一個(gè)是如何對(duì)每個(gè)solution進(jìn)行評(píng)判。
首先,由于C語言課程設(shè)計(jì)一般為小項(xiàng)目,且代碼中均為標(biāo)準(zhǔn)C命令與函數(shù),故為了處理簡便,規(guī)定學(xué)生提交的源代碼僅用一個(gè)文件存放。將一個(gè)course solution分解為多個(gè)solution的方法是將學(xué)生提交的代碼以函數(shù)的方式分解為多個(gè)代碼片段,每個(gè)代碼片段包含對(duì)應(yīng)某個(gè)problem的solution。為了能夠做到系統(tǒng)自動(dòng)分解,在設(shè)定course problem的時(shí)候,嚴(yán)格規(guī)定設(shè)計(jì)中實(shí)現(xiàn)子功能模塊的函數(shù)首部,這樣就可以通過識(shí)別函數(shù)首部找出相應(yīng)的代碼段。此外,為了識(shí)別出代碼中的各個(gè)函數(shù)首部,還需要進(jìn)行一些預(yù)處理操作,比如去除代碼中與評(píng)判無關(guān)的注釋、多余的空格與Tab符號(hào),等等。下面是分解過程的描述。
(1) 代碼預(yù)處理,例如,將縮排的Tab符號(hào)轉(zhuǎn)為空格符號(hào),去除代碼中的注釋與多余空格。
(2) 掃描預(yù)處理后的代碼,得到函數(shù)列表與函數(shù)調(diào)用關(guān)系圖。
(3) 對(duì)于course problem對(duì)應(yīng)的每個(gè)problem進(jìn)行如下步驟。
<1> 創(chuàng)建該problem的solution;
<2> 將course solution源代碼中的頭文件部分拷貝到solution;
<3> 在函數(shù)列表中找到目標(biāo)函數(shù),將該函數(shù)的實(shí)現(xiàn)部分拷貝到solution;
<4> 在函數(shù)調(diào)用關(guān)系圖中,以找到的目標(biāo)函數(shù)為起點(diǎn)進(jìn)行搜索,將目標(biāo)函數(shù)直接或間接調(diào)用的所有函數(shù)拷貝到solution。
經(jīng)過上面步驟便可得到,實(shí)現(xiàn)每個(gè)problem的對(duì)應(yīng)的solution。
對(duì)每個(gè)solution的評(píng)判則采用如下方法:由于每個(gè)solution中的代碼是一個(gè)或多個(gè)函數(shù),沒有main函數(shù),因而,在將solution送OJ系統(tǒng)進(jìn)行評(píng)判前需要增加一個(gè)預(yù)處理環(huán)節(jié),在該環(huán)節(jié)中增加main函數(shù)部分,該main函數(shù)主要實(shí)現(xiàn)讀入數(shù)據(jù),調(diào)用函數(shù)以及輸出結(jié)果的功能,這樣便得到一個(gè)完整的程序,可以象OJ中的代碼一樣進(jìn)行編譯、執(zhí)行和評(píng)判了。由于讀入數(shù)據(jù)和輸出數(shù)據(jù)的格式被嚴(yán)格規(guī)定,另外調(diào)用的函數(shù)首部也被嚴(yán)格規(guī)定,因而,同一problem的不同學(xué)生提交的solution可以采用相同的main函數(shù)實(shí)現(xiàn)。這樣可以將main函數(shù)代碼設(shè)定在problem中,在評(píng)判時(shí)取用。
3課程設(shè)計(jì)考核與評(píng)價(jià)
一般來說,對(duì)學(xué)生課程設(shè)計(jì)的最終評(píng)價(jià)要綜合考慮多個(gè)因素,主要包括階段考核、代碼完成情況、設(shè)計(jì)報(bào)告以及答辯。如果分別用P1~P4表示這四個(gè)因素,并分配各自在總分中所占的權(quán)重,分別用w1~w4(wi>0)表示,則最終評(píng)價(jià)可由計(jì)算 得到,pi為Pi的得分。為得到范圍在[0,100]的評(píng)分,規(guī)定 ,pi∈[0,100]。
階段考核評(píng)分可以通過學(xué)生各個(gè)階段提交的代碼的評(píng)測結(jié)果以及考勤記錄綜合得到。首先,在課程設(shè)計(jì)過程中規(guī)定若干個(gè)檢查時(shí)間點(diǎn)CPi(0
(a)
(b)
(c)
圖3學(xué)生完成情況折線圖
從折線圖中我們可以看出學(xué)生完成設(shè)計(jì)的動(dòng)態(tài)過程,它一般可分為3類:圖3(a)顯示學(xué)生循序漸進(jìn),逐步掌握設(shè)計(jì)方法并完成設(shè)計(jì)任務(wù);圖3(b)顯示學(xué)生有較強(qiáng)能力,很快完成了設(shè)計(jì)任務(wù),有需要可以給予額外任務(wù);圖3(c)顯示存在問題,學(xué)生抄襲的可能性很大。
最終代碼的完成情況可以通過最后一個(gè)檢查時(shí)間點(diǎn)的代碼評(píng)分來確定。如果有需要,也可以增加上機(jī)演示環(huán)節(jié)以增加該項(xiàng)評(píng)分的準(zhǔn)確性。設(shè)計(jì)報(bào)告及答辯的具體評(píng)分方法則不屬本文范圍,故不在此討論。
階段考核、代碼完成情況、設(shè)計(jì)報(bào)告以及答辯各
項(xiàng)權(quán)值可以根據(jù)具體教學(xué)情況而定,筆者在教學(xué)中設(shè)定的權(quán)值分別為0.2、0.3、0.3、0.2。
4結(jié)語
高要求、高質(zhì)量完成C語言課程設(shè)計(jì),對(duì)學(xué)生熟悉C語言、掌握編程技能,尤其是培養(yǎng)編程興趣具有重要的意義。本文提出的方法,一方面能夠減輕任課教師的工作負(fù)擔(dān);另一方面能夠提高學(xué)生的學(xué)習(xí)興趣與主動(dòng)性,從而改善課程的教學(xué)質(zhì)量。
參考文獻(xiàn):
[1] 林丕源,劉財(cái)興,張明武. 軟件工程專業(yè)的實(shí)踐教學(xué)改革初探[J]. 實(shí)驗(yàn)室研究與探索,2007(12):238-240.
[2] 黃明,梁旭,萬洪莉,等. C語言課程設(shè)計(jì)[M]. 北京:電子工業(yè)出版社,2006.
[3] 王新,孫雷. C語言課程設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2009.
[4] 姜靈芝,余健. C語言課程設(shè)計(jì)案例精編[M]. 北京:清華大學(xué)出版社,2008.
Application of Online Judge in C Language Programming Course Design
CHEN Xiang-ji, XU Dong-feng, YANG Qiu-mei
(College of Informatics, South China Agricultural University, Guangzhou 510640, China)
Abstract: The paper proposes the method of online judging the codes submitted by students in a course of C language programming course design based on an OJ(online judge) System. The method reduces the heavy burdens of teachers and promotes interest and initiative of students. It improved teaching quality of the course in practice.
Key words: C language programming course design; online judge; teaching quality
(編輯:郭小明)