左悅 林寧
摘要:C語(yǔ)言程序設(shè)計(jì)題動(dòng)態(tài)評(píng)閱技術(shù)被廣泛應(yīng)用于在線實(shí)時(shí)評(píng)分系統(tǒng)中;本文首先分析動(dòng)態(tài)評(píng)閱技術(shù)的現(xiàn)狀,提出了基于關(guān)鍵字匹配的動(dòng)態(tài)評(píng)閱技術(shù),并根據(jù)輸出的關(guān)鍵字有無(wú)順序給出了兩種不同的關(guān)鍵字檢測(cè)算法;通過(guò)實(shí)際應(yīng)用證明該動(dòng)態(tài)評(píng)閱技術(shù)有助于提高自動(dòng)評(píng)閱的準(zhǔn)確率;還給出了錯(cuò)誤程序的錯(cuò)誤類型,極大地方便了用戶進(jìn)行程序調(diào)試。
關(guān)鍵詞:Linux;C語(yǔ)言編程題;動(dòng)態(tài)評(píng)閱技術(shù);關(guān)鍵字匹配
中圖分類號(hào):TP311.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2019)01-0129-02
C語(yǔ)言程序設(shè)計(jì)是計(jì)算機(jī)類專業(yè)的一門重要基礎(chǔ)課程,具有較強(qiáng)的實(shí)踐性,在教學(xué)中應(yīng)加大實(shí)踐課時(shí)數(shù),通過(guò)增加學(xué)生的編程代碼量來(lái)提高學(xué)生的實(shí)踐編程能力,然而很多高校教師資源難以滿足大量實(shí)踐課程的需求。近年來(lái),越來(lái)越多的高校為了減輕教師的工作量、提高學(xué)生的編程能力,紛紛使用程序設(shè)計(jì)題在線自動(dòng)評(píng)分系統(tǒng),用于上機(jī)練習(xí)及考試。但由于程序設(shè)計(jì)題的評(píng)閱技術(shù)還不成熟,很多系統(tǒng)的使用不如人意。近幾年來(lái),國(guó)內(nèi)越來(lái)越多的專家學(xué)者對(duì)程序設(shè)計(jì)題的自動(dòng)評(píng)分技術(shù)進(jìn)行了研究,特別是對(duì)C語(yǔ)言編程題自動(dòng)評(píng)閱技術(shù),無(wú)論在程序內(nèi)容上的評(píng)閱還是運(yùn)行結(jié)果上的評(píng)閱,都取得了一定的進(jìn)展。
1 評(píng)閱技術(shù)的現(xiàn)狀及問(wèn)題
從C語(yǔ)言程序設(shè)計(jì)題自動(dòng)評(píng)閱的方式上看, 可分為動(dòng)態(tài)評(píng)閱及靜態(tài)評(píng)閱兩種方法。
在動(dòng)態(tài)評(píng)閱技術(shù)上,多數(shù)評(píng)分系統(tǒng)采用運(yùn)行結(jié)果匹配的方法來(lái)評(píng)分,就是通過(guò)編譯、運(yùn)行學(xué)生提交的程序,輸入測(cè)試值,得出運(yùn)行結(jié)果,然后通過(guò)運(yùn)行結(jié)果與正確結(jié)果進(jìn)行比對(duì);如果比對(duì)完全一致,那么判定程序是正確的,否則程序是錯(cuò)誤的。然而,這樣的評(píng)分方法過(guò)于嚴(yán)格,哪怕是多余或缺少一個(gè)空白符號(hào)也會(huì)被判斷錯(cuò)誤。
在評(píng)分的結(jié)果上,一般只有兩種結(jié)果,正確與錯(cuò)誤。國(guó)內(nèi)很多系統(tǒng)在判0分的情況下,卻沒有提示錯(cuò)誤的原因或者提示的原因非常簡(jiǎn)單。有很多學(xué)生反饋,在測(cè)試程序的時(shí)候明明是正確的,提交上去卻被判為0分,作為練習(xí)系統(tǒng)應(yīng)允許多次提交程序,學(xué)生不知道錯(cuò)誤的原因,很難修改程序,這往往使得學(xué)生失去興趣。
2 基于關(guān)鍵字匹配的動(dòng)態(tài)評(píng)閱算法
2.1 源代碼的編譯和運(yùn)行
在判分程序中使用system函數(shù)調(diào)用shell命令進(jìn)行編譯,調(diào)用的語(yǔ)句如下所示:
system(“gcc 10101.c-o 10101”);
然后判斷可執(zhí)行的文件是否生成,生成可執(zhí)行文件說(shuō)明源程序語(yǔ)法上沒有錯(cuò)誤,否則源程序有語(yǔ)法上的錯(cuò)誤。
為了使評(píng)閱結(jié)果可靠,本系統(tǒng)采用了多組測(cè)試值,多次運(yùn)行的方法來(lái)判分,這樣幾乎可以避免不限制輸出格式而造成的誤判。在運(yùn)行自動(dòng)評(píng)閱程序前,先把檢測(cè)數(shù)據(jù)以“@”為分隔符進(jìn)行分組,將每組數(shù)據(jù)分別保存到input1.txt,input2.txt等文件中,運(yùn)行程序的結(jié)果使用命令重定向“>”傳到result1.txt,result2.txt等文件中,然后再計(jì)算相似度。
2.2 動(dòng)態(tài)評(píng)閱算法
(1)令i=1,k=0。調(diào)用Linux系統(tǒng)gcc命令編譯學(xué)生提交的程序,如果生成可執(zhí)行文件,轉(zhuǎn)(2);否則,程序有語(yǔ)法錯(cuò)誤,轉(zhuǎn)(6)。
(2)運(yùn)行可執(zhí)行文件,輸入第i組檢測(cè)數(shù)據(jù),得出運(yùn)行結(jié)果,執(zhí)行i=i+1;判斷運(yùn)行結(jié)果中是否包含所有正確答案中的關(guān)鍵字;如果包含所有正確關(guān)鍵字,轉(zhuǎn)(3);否則,轉(zhuǎn)(6)。
(3)計(jì)算運(yùn)行結(jié)果和正確答案的相似度i,判斷檢測(cè)數(shù)據(jù)組輸入是否結(jié)束,如結(jié)束,轉(zhuǎn)(4);否則,轉(zhuǎn)(2)。
(4)計(jì)算平均相似度,如果平均相似度≥設(shè)定值,則轉(zhuǎn)(6);否則,轉(zhuǎn)(5)。
(5)如果(5)已經(jīng)執(zhí)行過(guò),那么動(dòng)態(tài)評(píng)判結(jié)束,轉(zhuǎn)(6);否則標(biāo)準(zhǔn)化源程序中的printf輸出語(yǔ)句[1],得到新的程序,然后轉(zhuǎn)(1)重新開始。
(6)返回平均相似度,動(dòng)態(tài)評(píng)判結(jié)束。
3 運(yùn)行結(jié)果的檢測(cè)方法
按題目的要求,輸出結(jié)果有兩種類型,即關(guān)鍵字有序和關(guān)鍵字無(wú)序,對(duì)這兩種類型的關(guān)鍵字檢測(cè)算法是不同的,在對(duì)關(guān)鍵字進(jìn)行檢測(cè)前首先判斷該題的關(guān)鍵字序列是有序的還是無(wú)序的,有序和無(wú)序采用不同的檢測(cè)方法。
3.1 關(guān)鍵字有序的檢測(cè)
有序關(guān)鍵字的檢測(cè)是根據(jù)正確答案的關(guān)鍵字序列對(duì)運(yùn)行程序的結(jié)果進(jìn)行比對(duì),運(yùn)行結(jié)果中要求滿足以下兩條規(guī)則:
(1)運(yùn)行結(jié)果中包含標(biāo)準(zhǔn)序列中所有的關(guān)鍵字;
(2)運(yùn)行結(jié)果中所包含的關(guān)鍵字排序必須與標(biāo)準(zhǔn)序列中關(guān)鍵字一致。
圖1為關(guān)鍵字有序的檢測(cè)的流程圖。
3.2 無(wú)序關(guān)鍵字的檢測(cè)
當(dāng)題目的要求為結(jié)果無(wú)序時(shí),運(yùn)行程序輸出的結(jié)果必須滿足以下要求:
(1)運(yùn)行結(jié)果中必須包含所有的正確答案中的關(guān)鍵字;
(2)所有的關(guān)鍵字在運(yùn)行結(jié)果中的位置不能出現(xiàn)重疊。
為了滿足以上兩個(gè)要求,在檢測(cè)前首先對(duì)正確答案中的關(guān)鍵字排序,規(guī)則是按照關(guān)鍵字字符串的長(zhǎng)度由大到小進(jìn)行排序,然后依次取出關(guān)鍵字,使用KMPIndex()函數(shù)判斷關(guān)鍵字在運(yùn)行結(jié)果中的位置,如果KMPIndex()函數(shù)返回值大于等于0,說(shuō)明關(guān)鍵字在運(yùn)行結(jié)果中存在,否則不存在。每次將檢測(cè)到的關(guān)鍵字在運(yùn)行結(jié)果中的位置就從運(yùn)行結(jié)果字符串中刪除,然后再檢測(cè)正確答案中剩余的關(guān)鍵字。
4 計(jì)算動(dòng)態(tài)相似度的實(shí)現(xiàn)
在判分模塊中,由dynamicJudge()函數(shù)負(fù)責(zé)計(jì)算動(dòng)態(tài)相似度。該函數(shù)的設(shè)計(jì)思路:①判斷關(guān)鍵字是有序還是無(wú)序的,如果正確答案序列是以“unorder”開始,那么關(guān)鍵字是無(wú)序的;否則,關(guān)鍵字是有序的。②當(dāng)關(guān)鍵字為無(wú)序時(shí),先調(diào)用outputSort()函數(shù)對(duì)標(biāo)準(zhǔn)結(jié)果序列按照關(guān)鍵字長(zhǎng)度由大到小的排序,然后逐一檢查運(yùn)行結(jié)果中是否包含了正確答案序列中的所有關(guān)鍵字。當(dāng)關(guān)鍵字為有序時(shí),按照正確答案的關(guān)鍵字順序逐一檢查是否包含所有的關(guān)鍵字。③如果運(yùn)行結(jié)果中不完全包含正確答案序列中的關(guān)鍵字,則動(dòng)態(tài)相似度為0,否則,計(jì)算動(dòng)態(tài)相似度。
5 程序錯(cuò)誤提示
為了使得用戶更方便修改程序的錯(cuò)誤,根據(jù)動(dòng)態(tài)評(píng)閱方法給出了七種不同的錯(cuò)誤提示:
err-1:文件提交失??!原因:文件類型不符合要求,文件過(guò)大等。
err-2:語(yǔ)法錯(cuò)誤,編譯未通過(guò)。
err-3:未按照題目要求編寫程序。
err-4:運(yùn)行錯(cuò)誤、發(fā)生溢出、死循環(huán)、讀取多余數(shù)據(jù)、內(nèi)存使用超過(guò)最大限制、CPU使用超時(shí)或沒有數(shù)據(jù)輸出等。
err-5:結(jié)果錯(cuò)誤。
err-6:部分結(jié)果錯(cuò)誤、臨界值測(cè)試錯(cuò)誤。
err-7:未按照題目要求格式輸出結(jié)果。
6 結(jié)語(yǔ)
上述設(shè)計(jì)的動(dòng)態(tài)評(píng)閱方法已經(jīng)應(yīng)用到C語(yǔ)言程序設(shè)計(jì)題自動(dòng)評(píng)閱系統(tǒng)上,通過(guò)實(shí)際的使用,評(píng)分的準(zhǔn)確率大大提高,錯(cuò)誤提示有效地幫助學(xué)生發(fā)現(xiàn)程序的錯(cuò)誤,極大地方便了學(xué)生對(duì)程序進(jìn)行調(diào)試。
參考文獻(xiàn)
[1] 林寧.一種改進(jìn)的C語(yǔ)言程序設(shè)計(jì)題自動(dòng)評(píng)閱技術(shù)[J].數(shù)字技術(shù)與應(yīng)用,2018,36(07):199-200.
Abstract:C language programming dynamic scoring technique is widely used in online real-time scoring system; Firstly, this paper analyzes the current situation of dynamic review technology, and proposes a dynamic evaluation technology based on keyword matching, and gives two different keyword detection algorithms according to the order of output keywords. It is proved by practical application that the dynamic review technique can improve the accuracy of automatic evaluation, and the error reasons of the error program are given, which greatly facilitates the user to debug the program.
Key words:Linux; C language programming; dynamic judging technology; keyword matching