曾臺盛 (泉州師范學院數學與計算機科學學院;福建省大數據管理新技術與知識工程重點實驗室 智能計算與信息處理福建省高等學校重點實驗室,福建泉州 362000)
基于B/S模式的程序設計在線評測系統設計
曾臺盛 (泉州師范學院數學與計算機科學學院;福建省大數據管理新技術與知識工程重點實驗室 智能計算與信息處理福建省高等學校重點實驗室,福建泉州 362000)
針對人工評測程序設計類課程作業效率低下的問題,設計了一種基于B/S模式的程序設計在線評測系統。在具體分析系統功能需求的基礎上,介紹了系統的總體架構及功能模塊的作用,對數據庫及主要關鍵技術(包括后臺評測、相似代碼檢測和成績生成)進行了設計。實際應用表明,該系統響應速度快,判定結果準確無誤,既減輕了教師的工作負擔,又為學生進行程序設計提供了良好平臺,得到了師生的一致好評。
程序設計;在線評測系統;B/S模式
隨著計算機網絡的快速發展,傳統的程序設計類課程教學方式已經無法滿足學生的學習需要,網絡教學輔助系統在各高校程序設計類課程教學中得到了廣泛應用。現有的網絡輔助教學系統對于程序設計類作業沒有能力進行處理,需要教師對程序設計類作業逐一批閱、評判,工作量大且效率低下。為此,筆者設計了基于B/S結構的程序設計在線評測系統??泉州師范學院校自選科研項目(2011KJ07)。。用戶可以在線提交自己的程序代碼,系統自動編譯運行并給出判定結果,這對減輕教師的工作負擔,幫助學生通過網絡實現個性化學習,在線自動測試,提高了學生運用計算機分析、解決實際問題的能力。
設計該系統主要目的是為了實現代碼自動在線評測,由具備權限的教師事先設計并通過網站錄入題目,在題目中詳細描述了具有一定背景內容的問題,同時給出題目運行的時間、內存限制以及輸入、輸出格式、輸入輸出測試數據。學生通過瀏覽器訪問網站閱讀題目,學生在客戶端先調試自己的解題程序,然后提交代碼,由系統自動評判學生提交的代碼。具體評判過程如下[1-3]:①系統自動編譯學生提交的代碼,如果程序有語法錯誤,編譯無法通過則報錯并退出。②系統執行生成的可執行文件,如果運行時錯誤,則報錯并退出。③將測試輸入文件數據作為可執行文件的輸入,得到輸出文件。處理過程中如果出現時間超限或內存超限,則報錯并退出。④將輸出文件與對應的答案文件進行比對,完全一致則輸出“接受”,有多余或者缺少空格或換行則輸出格式“錯”,否則輸出答案“錯”。學生提交代碼后看到評判結果,在程序代碼沒有被系統接受前,學生可以根據系統給出的各類錯誤提示,修改代碼并重新提交,直到被判定為接受為止。
為了能夠進行上機測試和比賽并自動獲得測試成績,系統應具備競賽功能和成績生成功能。此外,為了提高學生的學習積極性,系統還應具有排行榜、討論區、用戶成績對比、競賽圖片瀏覽、比賽新聞公告等功能。
該系統總體架構采用Browser/Server(B/S)模式實現,其中Browser端提供用戶注冊、瀏覽題目、提交代碼、參與競賽、狀態查詢、競賽排名查詢、排行榜、用戶對比、討論版、相片瀏覽等基本功能。系統總體架構圖如圖1所示,其中服務器由判題服務器Judged、Web服務器和MySQL服務器3部分組成[4]。
3.1 題目管理模塊
該模塊主要完成教師對題目進行添加、修改、刪除等功能。添加一個題目時,需同時設置題目的基本信息和評判參數,基本信息包括題目名稱、題目類型(程序設計、數據結構、算法)、題目描述、輸入輸出說明,評判參數主要用于系統自動評判時使用,包括最大內存限制、最長運行時間限制、測試數據與測試結果示例。
3.2 評判模塊
該模塊具有如下功能:編譯用戶程序;重定向輸入輸出流;用測試數據作為輸入運行用戶程序;獲取輸出結果、對比答案并返回判定結果。

圖1 系統總體架構圖
3.3 競賽管理模塊
該模塊具有如下功能:競賽題目組織;考試起始時間設置;考試參與人員設置;成績評判方式制定;每道題目分值、權重確定以及最低通過標準制定。
3.4 成績生成模塊
該模塊具有如下功能:根據競賽管理模塊制定成績評判方式;根據學生解題情況自動生成成績報表并支持導出Excel表。
3.5 用戶管理模塊
該模塊具有如下功能:用戶注冊;用戶權限設置;用戶密碼維護;批量生成考試、競賽用戶等。
3.6 新聞公告模塊
該模塊主要負責考試信息通知、過往比賽成績報道等內容。
3.7 圖片瀏覽模塊
該模塊的功能是動態顯示程序設計集訓隊員參加各類競賽的比賽及獲獎照片,以激勵學生加強程序設計訓練。

表1 用戶信息表
系統使用的數據庫是MySQL數據庫,其提供眾多的PHP和C/C++的程序接口,不論是Web端PHP頁面還是判題內核Judged的各個進程都可以實現輕松高效地對數據庫的訪問。系統主要數據庫表主要包括用戶信息表(見表1)、權限表、在線狀態表、競賽題目表(見表2)、競賽提交信息表(見表3)等。
5.1 后臺評測
在評測過程中使用的C/C++語言編譯器為GCC/G++,當用戶提交代碼后,系統調用GCC編譯器進行自動編譯,使用的編譯選項為:g++testprog.cpp-o testprog-ansi-fno-asm-Wall-l——static Judged 2>error.txt。其中,testprog.cpp為用戶提交上來的程序,testprog為編譯生成的可執行程序,采用錯誤重定向“2>error.txt”,當編譯失敗時,用戶可以通過Web瀏覽器看到錯誤信息。

表2 競賽題目表

表3 競賽提交信息表
Judged為系統服務進程,主要功能為輪詢Web端或者數據庫中的任務隊列,隨時提取判題隊列,Judged的工作流程圖如圖2所示。評判算法由以下進程組成[5]:進程1運行編譯好的程序,輸入流指向測試用例;進程2通過管道接收進程1輸出,對每個接收字符和答案文件相應字符進行比較,如發現不一樣則終止2個進程,如果接收到的所有字符和答案文件均一致,則給出Accepted結論。在評判過程中如果用戶程序發生運行錯、答案錯、時間超限、內存超限等情況,通過發送sigkill信號強行終止該進程。
5.2 相似代碼檢測
在程序設計類課程的在線作業或考試過程中,個別學生可能通過各種途徑和手段提交相似代碼以欺騙系統進行判斷。為解決上述問題,采用如下方法:比較代碼運行的時間(Ti)和占用的內存空間(Mi),超過預定閾值后對疑似的2段代碼進行基于最長公共子序列方法的檢測;將2段代碼中的所有回車、空白字符刪除,得到2個長字符串然后每次找出2個串的最長公共子序列并將其刪除,直到找到的最長公共子序列小于某個閾值[3],計算被刪除的字符數目占原始數目的比例(Li),根據Ti、Mi、Li的值及對應的權重計算出2段代碼的相似度。

圖2 Judged進程工作流程圖
5.3 成績生成
成績生成主要是根據競賽管理制定的成績給定方式來進行計算,有以下方法可供選擇。第1種是傳統計算方法,即每道題目給定分值,按照學生答題情況,對每道題目給予分數,最后總計所有題目的得分情況作為學生的最終成績。第2種方法是參照ACM/ICPC程序設計競賽排名的做法,先指定考試合格的最低答題數目,以此數目作為合格的分數線,剩余每道題目用總分扣除合格分求平均值。此外,還應根據提交成功前失敗次數進行相應罰分,對于格式錯誤的代碼給予相應分值,但應確保排行榜考前的學生成績不低于排在其之后的學生成績,使得最終成績跟比賽實時排行榜名次一致。
目前,該系統承擔了泉州師范學院4個年度的程序設計競賽及多門課程的期中、期末考試測評工作,已經順利完成了50余萬次的提交任務處理,系統響應速度快,判定結果準確無誤。在200多人同時在線提交時,服務器吞吐量正常,未見任何異常。由于使用該系統可以減輕教師的工作負擔,又為學生進行程序設計提供了良好平臺,因而具有很好的應用前景。
[1]陳湘驥,徐東風,楊秋妹.在線評判在C語言課程設計教學中的應用[J].計算機教育,2010,7(3):97-100.
[2]李文新,郭煒.北京大學程序在線評測系統及其應用[J].吉林大學學報(信息科學版),2005,22(S2):170-177.
[3]張浩斌.基于開放式云平臺的開源在線評測系統設計與實現[J].計算機科學,2012,39(S3):339-343,348.
[4]蔣社想,戴書文.基于J2EE的ACM競賽在線評判系統的設計[J].安徽理工大學學報(自然科學版),2009,28(4):59-63.
[5]喬少杰,楊燕,葛永明,等.基于B/S架構的多用戶在線程序評判系統設計與實現[J].計算機工程與科學,2011,20(S1):58-61.
[編輯] 李啟棟
TP311.52
A
1673-1409(2014)34-0040-04
2014-08-15
曾臺盛(1975-),男,碩士,講師,現主要從事算法設計、無線傳感器網絡及圖像檢索方面的教學與研究工作。