左悅 林寧
摘要:C語言程序設計題動態評閱技術被廣泛應用于在線實時評分系統中;本文首先分析動態評閱技術的現狀,提出了基于關鍵字匹配的動態評閱技術,并根據輸出的關鍵字有無順序給出了兩種不同的關鍵字檢測算法;通過實際應用證明該動態評閱技術有助于提高自動評閱的準確率;還給出了錯誤程序的錯誤類型,極大地方便了用戶進行程序調試。
關鍵詞:Linux;C語言編程題;動態評閱技術;關鍵字匹配
中圖分類號:TP311.1 文獻標識碼:A 文章編號:1007-9416(2019)01-0129-02
C語言程序設計是計算機類專業的一門重要基礎課程,具有較強的實踐性,在教學中應加大實踐課時數,通過增加學生的編程代碼量來提高學生的實踐編程能力,然而很多高校教師資源難以滿足大量實踐課程的需求。近年來,越來越多的高校為了減輕教師的工作量、提高學生的編程能力,紛紛使用程序設計題在線自動評分系統,用于上機練習及考試。但由于程序設計題的評閱技術還不成熟,很多系統的使用不如人意。近幾年來,國內越來越多的專家學者對程序設計題的自動評分技術進行了研究,特別是對C語言編程題自動評閱技術,無論在程序內容上的評閱還是運行結果上的評閱,都取得了一定的進展。
1 評閱技術的現狀及問題
從C語言程序設計題自動評閱的方式上看, 可分為動態評閱及靜態評閱兩種方法。
在動態評閱技術上,多數評分系統采用運行結果匹配的方法來評分,就是通過編譯、運行學生提交的程序,輸入測試值,得出運行結果,然后通過運行結果與正確結果進行比對;如果比對完全一致,那么判定程序是正確的,否則程序是錯誤的。然而,這樣的評分方法過于嚴格,哪怕是多余或缺少一個空白符號也會被判斷錯誤。
在評分的結果上,一般只有兩種結果,正確與錯誤。國內很多系統在判0分的情況下,卻沒有提示錯誤的原因或者提示的原因非常簡單。有很多學生反饋,在測試程序的時候明明是正確的,提交上去卻被判為0分,作為練習系統應允許多次提交程序,學生不知道錯誤的原因,很難修改程序,這往往使得學生失去興趣。
2 基于關鍵字匹配的動態評閱算法
2.1 源代碼的編譯和運行
在判分程序中使用system函數調用shell命令進行編譯,調用的語句如下所示:
system(“gcc 10101.c-o 10101”);
然后判斷可執行的文件是否生成,生成可執行文件說明源程序語法上沒有錯誤,否則源程序有語法上的錯誤。
為了使評閱結果可靠,本系統采用了多組測試值,多次運行的方法來判分,這樣幾乎可以避免不限制輸出格式而造成的誤判。在運行自動評閱程序前,先把檢測數據以“@”為分隔符進行分組,將每組數據分別保存到input1.txt,input2.txt等文件中,運行程序的結果使用命令重定向“>”傳到result1.txt,result2.txt等文件中,然后再計算相似度。
2.2 動態評閱算法
(1)令i=1,k=0。調用Linux系統gcc命令編譯學生提交的程序,如果生成可執行文件,轉(2);否則,程序有語法錯誤,轉(6)。
(2)運行可執行文件,輸入第i組檢測數據,得出運行結果,執行i=i+1;判斷運行結果中是否包含所有正確答案中的關鍵字;如果包含所有正確關鍵字,轉(3);否則,轉(6)。
(3)計算運行結果和正確答案的相似度i,判斷檢測數據組輸入是否結束,如結束,轉(4);否則,轉(2)。
(4)計算平均相似度,如果平均相似度≥設定值,則轉(6);否則,轉(5)。
(5)如果(5)已經執行過,那么動態評判結束,轉(6);否則標準化源程序中的printf輸出語句[1],得到新的程序,然后轉(1)重新開始。
(6)返回平均相似度,動態評判結束。
3 運行結果的檢測方法
按題目的要求,輸出結果有兩種類型,即關鍵字有序和關鍵字無序,對這兩種類型的關鍵字檢測算法是不同的,在對關鍵字進行檢測前首先判斷該題的關鍵字序列是有序的還是無序的,有序和無序采用不同的檢測方法。
3.1 關鍵字有序的檢測
有序關鍵字的檢測是根據正確答案的關鍵字序列對運行程序的結果進行比對,運行結果中要求滿足以下兩條規則:
(1)運行結果中包含標準序列中所有的關鍵字;
(2)運行結果中所包含的關鍵字排序必須與標準序列中關鍵字一致。
圖1為關鍵字有序的檢測的流程圖。
3.2 無序關鍵字的檢測
當題目的要求為結果無序時,運行程序輸出的結果必須滿足以下要求:
(1)運行結果中必須包含所有的正確答案中的關鍵字;
(2)所有的關鍵字在運行結果中的位置不能出現重疊。
為了滿足以上兩個要求,在檢測前首先對正確答案中的關鍵字排序,規則是按照關鍵字字符串的長度由大到小進行排序,然后依次取出關鍵字,使用KMPIndex()函數判斷關鍵字在運行結果中的位置,如果KMPIndex()函數返回值大于等于0,說明關鍵字在運行結果中存在,否則不存在。每次將檢測到的關鍵字在運行結果中的位置就從運行結果字符串中刪除,然后再檢測正確答案中剩余的關鍵字。
4 計算動態相似度的實現
在判分模塊中,由dynamicJudge()函數負責計算動態相似度。該函數的設計思路:①判斷關鍵字是有序還是無序的,如果正確答案序列是以“unorder”開始,那么關鍵字是無序的;否則,關鍵字是有序的。②當關鍵字為無序時,先調用outputSort()函數對標準結果序列按照關鍵字長度由大到小的排序,然后逐一檢查運行結果中是否包含了正確答案序列中的所有關鍵字。當關鍵字為有序時,按照正確答案的關鍵字順序逐一檢查是否包含所有的關鍵字。③如果運行結果中不完全包含正確答案序列中的關鍵字,則動態相似度為0,否則,計算動態相似度。
5 程序錯誤提示
為了使得用戶更方便修改程序的錯誤,根據動態評閱方法給出了七種不同的錯誤提示:
err-1:文件提交失敗!原因:文件類型不符合要求,文件過大等。
err-2:語法錯誤,編譯未通過。
err-3:未按照題目要求編寫程序。
err-4:運行錯誤、發生溢出、死循環、讀取多余數據、內存使用超過最大限制、CPU使用超時或沒有數據輸出等。
err-5:結果錯誤。
err-6:部分結果錯誤、臨界值測試錯誤。
err-7:未按照題目要求格式輸出結果。
6 結語
上述設計的動態評閱方法已經應用到C語言程序設計題自動評閱系統上,通過實際的使用,評分的準確率大大提高,錯誤提示有效地幫助學生發現程序的錯誤,極大地方便了學生對程序進行調試。
參考文獻
[1] 林寧.一種改進的C語言程序設計題自動評閱技術[J].數字技術與應用,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