婁自婷
(云南國(guó)土資源職業(yè)學(xué)院 云南省昆明市 652501)
現(xiàn)在的期末考試中,很多大中專院校都使用了在線考試系統(tǒng)進(jìn)行考試,該系統(tǒng)不僅可以提高學(xué)生實(shí)踐操作能力,做到將理論與實(shí)踐相結(jié)合;同時(shí),通過該系統(tǒng)老師也可以更便捷、高效、快速地對(duì)學(xué)生的考試成績(jī)進(jìn)行匯總、整理及分析。但是大多數(shù)在線考試系統(tǒng)都只是基于選擇題、判斷題、填空題等客觀題目,很少有主觀題目。而《JAVA 程序設(shè)計(jì)》課程是高職院校計(jì)算機(jī)專業(yè)的必修基礎(chǔ)課程,該課程主要培養(yǎng)學(xué)生動(dòng)手編寫程序的能力,因此,編程題在期末考試中占了很大的比例。但由于現(xiàn)階段對(duì)主觀編程題的技術(shù)還不成熟,所以該課程大部分采用的還是人工閱卷。因此,研究如何用計(jì)算機(jī)實(shí)現(xiàn)主觀題自動(dòng)評(píng)分具有較大的現(xiàn)實(shí)意義[1]。
早在1966年,就有外國(guó)學(xué)者Ellis Pagc 對(duì)文本相似度檢測(cè)進(jìn)行了研究,提出了讓計(jì)算機(jī)同人工閱卷一樣對(duì)主觀題如作文進(jìn)行評(píng)閱。在對(duì)自然語言的文本分析處理方法的研究同時(shí),隨著計(jì)算機(jī)教育的普及,程序代碼的檢測(cè)也在逐漸興起。目前使用比較廣泛的是Online Judge(OJ)在線判題系統(tǒng),該系統(tǒng)通過對(duì)用戶提交的代碼進(jìn)行編譯和運(yùn)行,對(duì)于能夠運(yùn)行的程序通過預(yù)先設(shè)定的測(cè)試集來檢測(cè)代碼運(yùn)行的結(jié)果,以及運(yùn)行時(shí)間是否在規(guī)定范圍之內(nèi)。該系統(tǒng)采用的是動(dòng)態(tài)評(píng)分方式,返回結(jié)果有七種:答案不完全正確,運(yùn)行超出時(shí)間限制,超出內(nèi)存限制,輸出超出限制,運(yùn)行時(shí)出錯(cuò),編譯出錯(cuò),程序通過,根據(jù)不同結(jié)果給予分值。
國(guó)內(nèi)學(xué)者對(duì)主觀編程題自動(dòng)評(píng)分技術(shù)也做了大量的研究,并取得了很好的效果。2010年,婁不夜提出了一種基于反射機(jī)制、以class 文件為判斷對(duì)象的java 編程題自動(dòng)評(píng)分技術(shù)[1]。2013年,鄭燕娥融合了程序查錯(cuò)及局部糾錯(cuò)技術(shù)、基于反射機(jī)制的黑盒測(cè)試技術(shù)、知識(shí)要點(diǎn)的正則表達(dá)式匹配評(píng)分技術(shù),實(shí)現(xiàn)了Java 編程題自動(dòng)評(píng)分[2]。2016年,曹亞妮針對(duì)C 語言設(shè)計(jì)了動(dòng)態(tài)測(cè)試方法和靜態(tài)分析方法相結(jié)合的編程題自動(dòng)評(píng)分模型,其中動(dòng)態(tài)測(cè)試方法采用黑盒測(cè)試對(duì)程序運(yùn)行結(jié)果進(jìn)行檢查,并對(duì)程序結(jié)構(gòu)的可信度進(jìn)行判定,靜態(tài)分析在代碼規(guī)范化及代碼預(yù)處理的基礎(chǔ)上使用基于字符串相似度算法進(jìn)行自動(dòng)評(píng)分[3][4]。2018年,蔣慧勇提出了一種基于Java 反射機(jī)制的自動(dòng)評(píng)分模型,該技術(shù)首先讀取考試題中考生寫的程序源代碼,然后調(diào)用Java 反射機(jī)制對(duì)程序進(jìn)行編譯執(zhí)行,并將執(zhí)行結(jié)果讀取放入內(nèi)存,參考答案保存在XML 文檔中,不同答案的組合分?jǐn)?shù)不同,實(shí)現(xiàn)需要確定組合類型和對(duì)應(yīng)分?jǐn)?shù),然后將規(guī)則寫成正則表達(dá)式[5]。2019年,李震等人提出了通過比較運(yùn)行結(jié)果、Findbugs 分析、文本相似度分析、關(guān)鍵詞分析四個(gè)評(píng)分模塊對(duì)代碼進(jìn)行評(píng)價(jià)。同樣分為動(dòng)態(tài)測(cè)試與靜態(tài)分析,首先通過編譯運(yùn)行代碼,將結(jié)果與參考答案進(jìn)行比較,然后采用Findbugs 對(duì)代碼進(jìn)行靜態(tài)分析,找出其中的潛在錯(cuò)誤和不規(guī)范的編程習(xí)慣引起的警告,根據(jù)問題個(gè)數(shù)和錯(cuò)誤等級(jí)給出分值。同時(shí)配合文本相似度分析,關(guān)鍵詞分析得出一個(gè)綜合評(píng)分。靜態(tài)分析工具Findbugs 的引入對(duì)發(fā)現(xiàn)潛在問題,減少人工預(yù)置答案的局限性,提高了系統(tǒng)可用性[6]。
基于上述研究,本文提出一種使用靜態(tài)分析與動(dòng)態(tài)模擬執(zhí)行代碼相結(jié)合,適用于簡(jiǎn)單的主觀編程題的自動(dòng)評(píng)分技術(shù),并就此設(shè)計(jì)并實(shí)現(xiàn)了完整的自動(dòng)評(píng)分考試系統(tǒng),為高職院校其他語言的編程題考試系統(tǒng)設(shè)計(jì)也提供了參考與借鑒。
在程序設(shè)計(jì)語言考試中,對(duì)于編程題而言,要實(shí)現(xiàn)某個(gè)功能方法可能存在很多種,因?yàn)楹茈y用一個(gè)簡(jiǎn)單的 文本作為標(biāo)準(zhǔn)答案給分。如果指定特定的解題方法,則會(huì)存在局限性,限制考生思維,自動(dòng)評(píng)分與人工評(píng)閱的誤差也會(huì)增大。而是用正則表達(dá)式可以描述多種解題方法,既簡(jiǎn)單有方便,且正則表達(dá)式在文本匹配方面的功能強(qiáng)大、靈活而且高效[2]。
正則表達(dá)式是對(duì)某種字符串模式規(guī)則的描述,是由普通字符(英文字母及數(shù)字等)以及元字符組成的文字模式。它是一種可以用于字符串模式匹配和替換的強(qiáng)有力的工具[2]。在Java 中,正則表達(dá)式的字符串匹配需要通過java.util.regex 包中的Pattern 和Matcher 兩個(gè)類來實(shí)現(xiàn),其中Pattern 類是編譯一個(gè)正則表達(dá)式的模式對(duì)象,Matcher 類是搜索是否匹配的匹配器對(duì)象[5]。元字符在正則表達(dá)式中的作用非常重要,其構(gòu)造的準(zhǔn)確性主要取決于元字符的應(yīng)用是否合理。Java 正則表達(dá)式常用的元字符如表1所示。
表1:正則表達(dá)式常用的元字符
在Java 程序中,“”表示轉(zhuǎn)義字符,“\”意味著正在插入一個(gè)正則表達(dá)式斜杠,那么隨后的字符具有特殊意義。比如,“d”表示數(shù)字字符,那么在Java 中“\d”就表示正則表達(dá)式中的“d”[2]。
為了驗(yàn)證自動(dòng)評(píng)分技術(shù)的合理性和準(zhǔn)確性,本人構(gòu)建了一個(gè)原型系統(tǒng)。該系統(tǒng)開發(fā)使用了Eclipse 平臺(tái)和MySQL 數(shù)據(jù)庫。系統(tǒng)前端采用jsp + JavaScript + css 的組合技術(shù)開發(fā),使用了jQuery 和bootstrap 框架,后端采用SpringBoot 框架實(shí)現(xiàn)。
系統(tǒng)分為學(xué)生端與管理員端,學(xué)生端功能有:注冊(cè)、登錄、開始考試、查看成績(jī);管理員端有登錄、學(xué)生管理(新增、修改、刪除、查詢)、學(xué)生試卷管理(查詢、閱卷)、學(xué)生成績(jī)管理(查詢、刪除)。數(shù)據(jù)庫包括管理員表admin、學(xué)生成績(jī)表performance、學(xué)生信息表student、學(xué)生試卷回答表student_answer。
學(xué)生考卷包括單選題、判斷題、填空題和編程題四個(gè)部分。系統(tǒng)核心功能是使用靜態(tài)分析與動(dòng)態(tài)模擬執(zhí)行代碼相結(jié)合,完成編程題自動(dòng)評(píng)分。其主要思想是:首先采用動(dòng)態(tài)模擬執(zhí)行代碼,將考生答案轉(zhuǎn)換為java 文件進(jìn)行編譯,能通過編譯運(yùn)行的結(jié)果與參考答案匹配,如果匹配成功或部分?jǐn)?shù)據(jù)正確,使用正則表達(dá)式對(duì)核心代碼進(jìn)行再次匹配,根據(jù)二次匹配的結(jié)果給出分值;若編譯運(yùn)行的結(jié)果與參考答案不匹配,將源代碼中的類、主方法、核心代碼進(jìn)行正則匹配,根據(jù)二次匹配的結(jié)果給出分值。
學(xué)生提交試卷后,管理員在“學(xué)生考試管理”界面可查看到所有提交試卷學(xué)生名單,如圖1所示。點(diǎn)擊操作下“詳情”按鈕,可進(jìn)入該生試卷詳情界面,如圖2所示??荚囋斍榻缑嬗稍囶}、每道試題自動(dòng)評(píng)分結(jié)果、參考答案和學(xué)生答案,各模塊總分及總得分、提交按鈕組成。該系統(tǒng)保留了修改分?jǐn)?shù)的功能。
下面以一個(gè)for 循環(huán)輸出1~100 之間的所有偶數(shù)程序?yàn)槔?。參考答案如下所示?/p>
該考生程序存在一個(gè)語法錯(cuò)誤,輸出語句、變量名稱與參考答案有細(xì)微區(qū)別但無誤,系統(tǒng)首先采用動(dòng)態(tài)模擬執(zhí)行代碼,無法得到運(yùn)行結(jié)果,因此進(jìn)行靜態(tài)分析,使用正則表達(dá)式進(jìn)行二次匹配。該題滿分為10 分,知識(shí)要點(diǎn)分為5 個(gè)得分點(diǎn),for 循環(huán)中三個(gè)表達(dá)式每個(gè)為2 分,if 語句為3 分,輸出語句為1 分。用正則表達(dá)式對(duì)這5 個(gè)得分點(diǎn)進(jìn)行描述,具體如下:
第一個(gè)得分點(diǎn):[\s\S]*int [a-zA-Z]+\s*=\s*1;[\s\S]*
第二個(gè)得分點(diǎn):[\s\S]*[a-zA-Z]+\s*<=\s*100;[\s\S]*
第三個(gè)得分點(diǎn):[\s\S]*[a-zA-Z]+\s*\+\+[\s\S]*
第四個(gè)得分點(diǎn):[\s\S]*if\s*\([a-zA-Z]+\s*%\s*2\s*==\s*0\)\s*\{[\s\S]*
第五個(gè)得分點(diǎn):
[\s\S]*System\.out\.print(ln)?\([a-zA-Z]+\s*(\+\s*\"\W+\")?\);[\s\S]*
根據(jù)學(xué)生結(jié)果,語法應(yīng)扣3 分。經(jīng)過自動(dòng)評(píng)分,得到學(xué)生評(píng)分結(jié)果為7 分,符合人工評(píng)閱結(jié)果。系統(tǒng)評(píng)分界面如圖3所示。
試題詳情界面可以針對(duì)自動(dòng)評(píng)分結(jié)果進(jìn)行二次人工閱卷,也可直接點(diǎn)擊提交。提交之后管理員可進(jìn)入“學(xué)生成績(jī)管理”中查看總分?jǐn)?shù)及各模塊得分,如圖4所示。此時(shí)學(xué)生也可再次進(jìn)入考生系統(tǒng)查看考試分?jǐn)?shù)。
考慮到學(xué)生答案存在多樣性和差異性,本文針對(duì)以上編程題抽取了一個(gè)班級(jí)共50 份考卷,除正確答案外,有11 個(gè)存在明顯語法錯(cuò)誤和差異語句的考生答案?,F(xiàn)對(duì)這11 個(gè)考生答案進(jìn)行系統(tǒng)評(píng)分與人工評(píng)分比較,結(jié)果見表2,其中與人工評(píng)閱的誤差指的是系統(tǒng)評(píng)分結(jié)果與人工評(píng)閱結(jié)果的差值。
表2:系統(tǒng)評(píng)分與人工評(píng)分結(jié)果及誤差值
通過上述實(shí)驗(yàn)結(jié)果可以看出,系統(tǒng)評(píng)分結(jié)果與人工評(píng)閱結(jié)果存在一定的誤差值,但是誤差都在1 分以內(nèi),誤差均值控制在0.545,符合自動(dòng)評(píng)分標(biāo)準(zhǔn)。其余編程題通過系統(tǒng)的實(shí)現(xiàn),也滿足實(shí)用性、合理性、高效性原則。該系統(tǒng)不僅能減輕教師負(fù)擔(dān),還使系統(tǒng)計(jì)算的學(xué)生答案得分更具公平性和合理性,也為學(xué)生及時(shí)得到反饋結(jié)果提供可能。
本文提出了一種基于Java 語言的主觀編程題自動(dòng)評(píng)分技術(shù),采用動(dòng)態(tài)模擬與靜態(tài)分析相結(jié)合的方法,首先將考生答案保存為可編譯的java 文件,判斷程序是否可以編譯運(yùn)行,如果運(yùn)行成功則返回運(yùn)行結(jié)果,并與參考答案匹配,如果匹配成功或部分?jǐn)?shù)據(jù)正確,使用正則表達(dá)式對(duì)核心代碼進(jìn)行再次匹配,根據(jù)二次匹配的結(jié)果給出分值,二次匹配的目的是檢查考生的功能語句是否符合題目要求;若編譯運(yùn)行的結(jié)果與參考答案不匹配或無法運(yùn)行,將源代碼中的類、主方法、核心代碼進(jìn)行正則匹配,根據(jù)二次匹配的結(jié)果給出分值,這樣做可以減少系統(tǒng)自動(dòng)評(píng)分與人工評(píng)分的誤差值,但也增加了正則表達(dá)式的設(shè)計(jì)難度。實(shí)驗(yàn)表明,該考試系統(tǒng)運(yùn)行良好,自動(dòng)評(píng)分結(jié)果與人工評(píng)閱結(jié)果誤差較小,具有較高的準(zhǔn)確率。且該系統(tǒng)保留了人工修改分?jǐn)?shù)的功能,對(duì)實(shí)現(xiàn)上機(jī)考試具有一定的參考價(jià)值。
圖1:學(xué)生考試管理界面
圖2:試卷詳情界面
圖3:xx 學(xué)生編程題評(píng)分界面
圖4:學(xué)生成績(jī)管理界面