鐘耀章,桂 瓊
(桂林理工大學(xué),廣西 桂林 541006)
ACM國際大學(xué)生程序設(shè)計競賽是由國際計算機協(xié)會(ACM)主辦的,比賽一般會有7~13個題目[1]。三個人一隊,共同使用一臺電腦,需要在5個小時內(nèi)使用C/C++、Java和Python中的一種來編寫程序從而解決問題。在線測評系統(tǒng)(Online Judge,OJ)先前的目標(biāo)是為了鍛煉參加ACM國際大學(xué)生程序設(shè)計競賽的參賽者們。除此之外,在實際的計算機教學(xué)環(huán)境中也起到了很大的作用,學(xué)生在學(xué)習(xí)計算機基本算法或者數(shù)據(jù)結(jié)構(gòu)類似課程的過程時,常常不能知道自己設(shè)計的算法和實現(xiàn)的代碼是否完全正確而不能做出正確的判斷。特別是一些剛?cè)腴T的程序設(shè)計愛好者常常不能對自己所寫的程序有一個很好的認(rèn)識,在線測評系統(tǒng)憑借著嚴(yán)格的判題體系和大量的測試數(shù)據(jù)的優(yōu)勢完美地解決了這個問題。在線測評系統(tǒng)對比人工評判有著如下的優(yōu)勢:(1)效率高,人工評判時間漫長,不能讓學(xué)生及時地了解到自己那些方面的不足,在線測評只需要幾秒鐘就能完成測評并實時將結(jié)果反饋給用戶。(2)使用方便,你只需要有一臺能聯(lián)網(wǎng)的電腦就可以進行算法訓(xùn)練,并且題目多樣性,大大提高學(xué)生的興趣。(3)公平性,不會存在人為主觀因素,系統(tǒng)是拿測試數(shù)據(jù)進行對比。本系統(tǒng)旨為算法愛好者提供一個在線學(xué)習(xí)、交流的平臺。
本次要開發(fā)的ACM競賽在線測評系統(tǒng)分為三個模塊:前臺服務(wù)模塊、后臺管理模塊、后臺測評模塊[2]。前臺服務(wù)模塊有:用戶注冊登錄、用戶找回密碼、修改個人信息、用戶排名、題目預(yù)覽、查看提交代碼和報名競賽等。后臺管理模塊有:用戶管理、比賽管理、題目管理和管理員注冊登錄等。后臺測評模塊有:代碼處理、代碼編譯、代碼測試。系統(tǒng)總體框圖如圖1所示。
圖1 ACM競賽在線測評系統(tǒng)總體框圖
前臺服務(wù)模塊指的是本系統(tǒng)普通用戶使用的模塊,就是用戶打開瀏覽器輸入本系統(tǒng)的url即可訪問到系統(tǒng),前臺服務(wù)模塊如圖2所示。
圖2 前臺服務(wù)模塊
(1)用戶注冊:使用本系統(tǒng)需要注冊一個用戶,輸入學(xué)號,密碼,名字,學(xué)校,專業(yè)班級,QQ,郵箱等。
(2)用戶登錄:使用本系統(tǒng)必須先登錄,如果想要通過url的方式直接訪問本系統(tǒng),也會被系統(tǒng)攔截器攔下來。
(3)用戶找回密碼:當(dāng)用戶忘記自己的密碼時,可以通過注冊時的學(xué)號和郵箱來修改新的密碼。
(4)修改個人信息:用戶可以修改除了學(xué)號的其他基本信息。
(5)用戶排名:用戶可以查看自己在本系統(tǒng)的排名,根據(jù)你的解題數(shù)和你的提交次數(shù)做一個排名。
(6)題目預(yù)覽:用戶點擊題目按鈕時,系統(tǒng)會以每頁10題的方式來顯示當(dāng)前系統(tǒng)的所有題目。
(7)查看提交代碼:當(dāng)用戶提交代碼后,系統(tǒng)會把用戶提交的代碼、運行時間、測評狀態(tài)、提交時間和使用的語言等信息存儲起來,用戶可以查看本題提交狀態(tài)和查看提交的代碼,也可以查看其他用戶提交的信息。
(8)報名競賽:用戶可以報名正在進行的競賽。
后臺管理模塊是屬于管理員的模塊,可以對用戶、題目和競賽進行管理,后臺管理模塊如圖3所示。
圖3 后臺管理模塊
(1)管理員注冊:如果想登錄系統(tǒng)的后臺管理頁面,需要注冊一個系統(tǒng)管理員用戶。
(2)管理員登錄:必須要登錄才能訪問系統(tǒng)后臺管理模塊,如果直接通過url的方式訪問后臺頁面,也會被攔截器攔截并且跳轉(zhuǎn)到登錄頁面。
(3)用戶管理:管理員可以查看用戶,并且對其進行修改刪除操作。
(4)題目管理:管理員可以為系統(tǒng)新增題目、修改題目和刪除題目。
(5)競賽管理:管理員可以新增競賽、新增競賽題目和刪除競賽。
后臺測評模塊對用戶提交的代碼進行處理,判定是C還是Java等,編譯代碼,編譯通過后運行代碼,測評結(jié)果是否正確,后臺測評模塊如圖4所示。
圖4 后臺測評模塊
(1)用戶端:用戶需要通過瀏覽器,來訪問本系統(tǒng),首先需要注冊成為本系統(tǒng)用戶,然后登錄使用本系統(tǒng)。用戶忘記密碼時,可以通過學(xué)號和電子郵箱來修改新密碼。登錄成功首頁有題目、提交、比賽、個人信息和排行榜等按鈕。題目頁面會以每頁10條數(shù)據(jù)進行分頁顯示題目,分別顯示題目標(biāo)題、題目難度、通過率和提交狀態(tài)等信息。點擊題目標(biāo)題將會跳轉(zhuǎn)到題目詳情頁面,在該頁面可以進行代碼提交。提交信息頁面分別顯示運行ID、提交用戶、題號、運行時間、測評結(jié)果、提交時間等信息,點擊運行ID會彈出模態(tài)框里面顯示該次提交的代碼。比賽頁面分別顯示競賽標(biāo)題,競賽開始結(jié)束時間和競賽當(dāng)前狀態(tài)。競賽狀態(tài)會根據(jù)競賽開始結(jié)束時間和系統(tǒng)當(dāng)前時間做對比,分3種狀態(tài):未開始、正在進行和已結(jié)束。用戶可以修改除學(xué)號之外的個人信息,查看用戶排行榜。
(2)管理員端:后臺管理模塊有用戶管理、題目管理和競賽管理功能。用戶管理有用戶修改和用戶刪除操作。題目管理有新增、修改和刪除題目操作。競賽管理有新增競賽、刪除競賽和新增競賽題目操作。
本OJ系統(tǒng)所支持的編程語言有C,C++,Java,整個測評功能模塊的工作步驟如下:
(1)獲取用戶提交的源代碼,如果是用戶使用的是C、C++語言的話,會把代碼保存在指定的文件夾下,XXXX.c或者.cpp的文件里,前面4位是系統(tǒng)隨機產(chǎn)生字符,這也是保證文件名不能相同。如果用戶選擇的是Java語言的話,首先Java的類名必須是Main,隨后生成XXXX.java文件。
(2)編譯源代碼生成的.c或者.java文件,系統(tǒng)會根據(jù)相應(yīng)的文件調(diào)用不同的編譯器,C/C++生成.exe文件,Java生成.class文件,前面的4位隨機數(shù)和編譯前是一樣的。
(3)運行已經(jīng)編譯好的.exe或者.class文件,運行文件進行數(shù)據(jù)的輸入輸出用來和錄入數(shù)據(jù)庫的測試用例對比,得到結(jié)果,并將測評結(jié)果實時反饋給用戶,測評功能模塊流程如圖5所示。
圖5 測評功能模塊
系統(tǒng)選擇C/C++的編譯器是WinGW,它是一個精簡的Windows平臺,支持C/C++、ADA編譯器,使用較為方便[3]。
Java編譯器選擇JDK,它為Java應(yīng)用程序開發(fā)提供了編譯和執(zhí)行環(huán)境,所有的Java寫程序都依賴于它。
安裝好編譯器和配置好環(huán)境后就可以直接使用cmd窗口執(zhí)行命令調(diào)用相應(yīng)的編譯器編譯運行C/C++或Java文件。
(1)先獲取用戶提交的源代碼,判斷提交的是C/C++還是Java。
(2)將用戶提交的代碼存放在系統(tǒng)指定位置,并且C/C++命名為xxxx.c文件,Java命名為xxxx.java(用戶提交的Java代碼,類名必須為Main),文件名為隨機四位字符。
(3)編譯用戶提交的代碼,使用Runtime.getRuntime().exec方法可以調(diào)用cmd命令行窗口執(zhí)行g(shù)++或者javac命令編譯.c和.java文件。
(4)執(zhí)行編譯成功后的.exe文件或者.class文件,還是使用Runtime.getRuntime().exec方法調(diào)用cmd命令行窗口[4]。
Processprocess = Runtime.getRuntime().exec(“運行命令”);//執(zhí)行編譯
BufferedWriter bout = new BufferedWriter();
bout = newOutputStreamWriter(process.getOutputStream());// 獲取子進程輸出流
bout.write(sampleInput);// 輸入數(shù)據(jù)庫的測試樣例
bout.close();
(5)將運行輸出的結(jié)果和數(shù)據(jù)庫測試數(shù)據(jù)進行對比,并將測評結(jié)果存放數(shù)據(jù)庫
例如用戶提交的是Java代碼,Java源碼測評程序流程圖如圖6所示。
圖6 Java源碼測評程序流程
ACM國際大學(xué)生程序設(shè)計競賽是計算機界最有權(quán)威的競賽之一,也被稱為計算機界馬拉松。在線測評系統(tǒng)是一個功能性很強且綜合的系統(tǒng),不僅要求會Java Web和數(shù)據(jù)庫的知識還要求實現(xiàn)頁面的簡潔美觀。本文對在線測評系統(tǒng)前臺服務(wù)模塊到后臺管理模塊和測評模塊做了詳細(xì)需求分析,著重介紹了實現(xiàn)在線測評的整個流程。系統(tǒng)設(shè)計已基本完成,能夠在線測評并實時將結(jié)果反饋給用戶。