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