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