王怡康 吳非凡 羅佳 沈祖?zhèn)? 劉安琪 朱小銳
摘 要:本系統(tǒng)采用B/S架構,前端利用JavaScript,CSS等語言編寫,后端數(shù)據(jù)庫利用MySQL關系型數(shù)據(jù)庫,評測機利用C#編寫。主要實現(xiàn)了代碼評測、線上考試、線上競賽、自我評測等功能。本系統(tǒng)的設計目的是減輕教師教學壓力,增加學生學習趣味性,幫助學生及時作出自我評價。
關鍵詞:計算機輔助評價;程序設計;程序自動評測
在教學方面,傳統(tǒng)的以人力檢查學生學習成果的教學模式難以跟上時代的發(fā)展。對于教師,人工檢查代碼耗時耗力巨大,且難免有判斷錯誤的情況。在學生廣泛地參與各類程序設計競賽的背景下,學生需要一款能夠隨時檢測自己學習成果,提高學習積極性的系統(tǒng)。因此,設計一款解決以上問題,且適用于學校的OnlineJudge系統(tǒng)顯得十分重要。本文著重介紹OnlineJudge系統(tǒng)的設計過程和使用的技術。
1 設計方案
1.1 開發(fā)平臺
采用MySQL數(shù)據(jù)庫用來存儲用戶、題目、比賽、班級、作業(yè)、提交記錄等信息,開發(fā)工具為Navicat 11.1.13。網(wǎng)站分為前端和后端,開發(fā)工具為VS Code1.12.1。網(wǎng)站后端基于ThinkPHP 3.2.3框架實現(xiàn),用來處理業(yè)務邏輯,讀寫數(shù)據(jù)庫,并和前端界面進行數(shù)據(jù)的傳輸。網(wǎng)站前端基于HTML和jQuery技術實現(xiàn),為用戶界面,有統(tǒng)一的頁首頁尾和側邊欄。評測機為Windows平臺的圖形界面軟件,使用C#語言,基于WindowsForms框架實現(xiàn),通過POST方式與網(wǎng)站的API接口通信,開發(fā)工具為Visual Studio 2017。
1.2 硬件結構
本系統(tǒng)需要部署Web服務器和程序評測機。
系統(tǒng)采用B/S結構,Web服務器與評測機均為安裝了Windows Server操作系統(tǒng)的服務器,兩臺服務器同時接入校園網(wǎng),也可只部署一臺Web服務器,在Web服務器上安裝虛擬機軟件,在虛擬機中部署評測機服務器。
Web服務器包含網(wǎng)站程序和數(shù)據(jù)庫,網(wǎng)站程序包含模型、視圖和控制器。評測機通過API接口與Web服務器通信,下載測試數(shù)據(jù)和用戶提交的程序代碼,自動編譯、鏈接、執(zhí)行,測評完成后上傳結果。
1.3 主要功能
本系統(tǒng)完成主要功能如下:題庫,提交記錄,比賽,班級,測試。
其中,題庫中放置了可公開的編程題目,學生可在其中挑選感興趣的題去攻克,頁面右端放有題目分類,學生也可以根據(jù)題目分類來找自己薄弱點加強練習。提交記錄可以看到用戶的提交記錄。在班級功能中,老師創(chuàng)建班級并添加學生信息、學生查看班級信息等。比賽功能可以進行編程比賽。測試功能中,管理員端可以選擇自動抽題組卷,學生端可以加入測試。
除此之外,本平臺在登錄管理員賬號后可以實現(xiàn)增刪題庫、代碼查重、數(shù)據(jù)統(tǒng)計、用戶管理等功能。
1.4 評測機設計
評測機是此程序的靈魂,其實現(xiàn)為平臺奠定了基礎。評測機整體使用微軟公司推出的C#語言和.NET Framework平臺。
評測機分為離線模式和在線模式,評測機的軟件為exe格式。評測程序需要用戶手動安裝各種語言的編譯運行環(huán)境,評測機通過調(diào)用預先設定好的批處理來編譯和執(zhí)行程序,評分方式為通過對比運行結果和事先給出的樣例來評分。
如圖1所示,當處于在線工作模式時,評測機運行一個后臺的異步工作線程,不斷地向網(wǎng)站的API請求數(shù)據(jù),如果有返回待評測的程序數(shù)據(jù)就調(diào)用本地評測功能,等待評測完畢后,再將評測結果發(fā)回API。
如圖2所示,當處于離線工作模式時,評測機需要用戶手動填寫程序代碼、測試數(shù)據(jù)、文件名、程序語言、時間內(nèi)存限制等信息,填好后手動點擊“立即評測”按鈕,評測機評測完程序后輸出評測結果。
1.5 Web網(wǎng)站設計
Web是整個系統(tǒng)與用戶的交互界面,也是核心功能實現(xiàn)的途徑。Web界面需要兼具美觀和功能性,因此,Web的設計十分重要。圖3展示W(wǎng)eb界面實現(xiàn)的部分功能。
Web端為用戶交互界面,絕大部分功能依附于Web實現(xiàn),核心功能為作業(yè)發(fā)布與提交、競賽、考試功能。工作流程如圖4所示。教師在發(fā)布作業(yè)或創(chuàng)建試題時,需要提前設置題目、應用語言范圍、創(chuàng)建班級、所需時間、試卷題型等,所有所在班級成員均可收到作業(yè)。
學生登錄,進入班級可收到最新作業(yè)。學生在網(wǎng)站做完作業(yè)可提交代碼,調(diào)用評測機評測。系統(tǒng)將選取學生最高分進行記錄。若場景為考試或練習,系統(tǒng)將學生答案與數(shù)據(jù)庫標準答案進行比對,通過計算得出學生本場考試分數(shù)并記錄在用戶中心,管理員賬號可以對學生提交代碼進行查重,并根據(jù)查重率要求學生作出相應解釋。
1.6 API接口
網(wǎng)站和評測機之間的通信通過API接口實現(xiàn),評測機不斷地向API發(fā)送數(shù)據(jù)請求,網(wǎng)站端根據(jù)請求作出相應的操作。
接口的HTTP請求方法為POST,分為“讀請求”和“寫請求”兩種請求。網(wǎng)站接收到“讀請求”時,將還沒有完成評測的程序和對應題目的測試數(shù)據(jù)返回給評測機;接收到“寫請求”時,將評測機發(fā)過來的具體評測結果寫入數(shù)據(jù)庫[1]。
評測程序需要使用專用的評測機賬號登錄。
2 網(wǎng)站后端框架
2.1 ThinkPHP框架
TinkPHP可以支持Windows/Unix/Linux等服務器環(huán)境,正式版需要PHP5.0以上版本支持,支持MySQL,PgSQL,Sqlite多種數(shù)據(jù)庫以及PDO擴展,ThinkPHP框架本身沒有特別模塊要求,具體的應用系統(tǒng)運行環(huán)境要求視開發(fā)涉及的模塊決定[2]。此系統(tǒng)用了MySQL關系型數(shù)據(jù)庫,用以存放相應的數(shù)據(jù)。
2.2 數(shù)據(jù)庫相關
數(shù)據(jù)庫表、視圖、存儲過程、函數(shù)等創(chuàng)建過程這里不進行詳細討論。E-R模式如圖5所示。
建議慎用觸發(fā)器,觸發(fā)器功能固然強大,但是它如同一把雙刃劍,過分依賴觸發(fā)器,會使數(shù)據(jù)庫邏輯受到影響。又因為本系統(tǒng)會長期供學校使用,觸發(fā)器數(shù)目過多勢必增加數(shù)據(jù)庫維護的難度。因此,觸發(fā)器在本系統(tǒng)中應謹慎使用。
3 其他相關
3.1 代碼查重
“代碼查重”中,支持計算本作業(yè)提交的程序代碼相似度,可查詢整個作業(yè)的所有學生互相之間的相似度,統(tǒng)計出最高值,也可單獨查詢某一個學生與其他學生之間的代碼相似度。代碼相似度算法如下:
(1)找出兩個字符串中相同部分最長的一段。
(2)再用同樣的方法在剩下的兩段中分別找出相同部分最長的一段,以此類推,直到?jīng)]有任何相同部分。
(3)相似度=所有相同部分的長度之和×2/兩個字符串的長度之和。相似度以百分比的形式展示,達到95%自動標為紅色,點擊百分比的鏈接可查看具體提交記錄[3]。
3.2 安全性考慮
由于本系統(tǒng)需要原樣執(zhí)行用戶提交的程序,就不可避免地會遇到有用戶提交惡意程序代碼的情況,輕則使評測機停止工作,重則破壞網(wǎng)站的文件和數(shù)據(jù)。
解決這類問題有兩種方案,一是在執(zhí)行程序之前檢測程序行為加以防范,二是在程序對評測機破壞之后自動恢復。前者由于程序的描述方式千變?nèi)f化,提前預防的方法不現(xiàn)實,只能采用后者。因此,評測機和Web服務器應部署于兩臺不同的計算機上,兩臺計算機同時接入校園網(wǎng),評測機所在的計算機上應安裝硬盤還原卡。如果硬件設備條件不夠,也可在Web服務器上安裝虛擬機軟件,在虛擬機中部署評測機,虛擬機開啟還原卡功能。
為實現(xiàn)自動恢復功能,系統(tǒng)應每隔一段時間(暫定為2 min)檢測一下評測機是否正在工作,如果不工作就說明評測機發(fā)生故障,自動向評測機所在的計算機發(fā)送重新啟動指令,由于安裝有還原卡,重啟后評測機會恢復原狀,即可實現(xiàn)評測機出錯后自動恢復的功能。
4 結語
互聯(lián)網(wǎng)時代正在改變傳統(tǒng)教學體系,以計算機為代表的新型課程越來越受到廣大高校重視。與這門學科產(chǎn)生的原因一樣,本套系統(tǒng)也是為了降低人工成本而生。目前,本套系統(tǒng)已應用于學校C語言程序設計課程教學、C語言程序設計競賽,也可為ACM競賽、天梯賽等賽事做培訓相關工作。我們未來的設計方向是UI界面更人性化,支持更多程序語言(已有包括C,C++,Java,Python在內(nèi)的多門語言),支持更多人同時在線評測等。
[參考文獻]
[1]沃森,內(nèi)格爾.C#入門經(jīng)典[M].4版.齊立波,譯.北京:清華大學出版社,2008.
[2]ThinkPHP文檔中心.ThinkPHP 3.2.3完全開發(fā)文檔[EB/OL].(2018-05-06)[2018-11-13].http://document.thinkphp.cn/manual_3_2.html.
[3]吉爾摩.PHP與MySQL程序設計[M].4版.朱濤江,譯.北京:人民郵電出版社,2017.