摘 要:為了使學生適應計算機語言考試,考核學生應用C/C++編寫程序的能力,實現C++語言考試的計算機閱卷,提出了針對C++程序上機考試的自動評分系統的構建方式與算法研究。用Windows API函數做了深入的研究與分析,對如何匹配、查找程序的關鍵語句進行了分析和研究。該系統對C++程序上機考試的客觀題和主觀題的計算機自動評分采用多種的方法,完成了對C++語言考試的自動評分。關鍵詞:自動評分;主觀題; 正則表達式; 可擴展標記語言
中圖分類號:TN911-331; G420 文獻標識碼:A
文章編號:1004-373X(2010)18-0051-02
Study on Automatic Scoring System for Programming Exams of C++ Language
ZHANG Xiao-guang, ZHANG Zhen, NIU Yong-jie
(Computing Center, Yan’an University, Yan’an 716000, China)
Abstract: The building-up mode and algorithm for the automatic scoring system dealing with the exams on computer for C++ program are proposed to make the students to accommodate the computer language exams, improve the ability of the students for writing programs with C++and realize the computer scoring for C++ language examination. The Windows API function and the method to look for keywords of a program are analyzed. The automatic scoring for C++ language exams was implemented with several methods.Keywords: automatic scoring system; subjective question; regular expression; extensible markup language
0 引 言
在當今社會計算機已經成為人們必須掌握的一項基本技能,在大學之中計算機課程也已經是每個大學生必修的課程。隨之而來的便是計算機教師的閱卷工作量不斷增長,使用計算機自動批改試卷越來越成為教師們的愿望,同時提高對學生試卷的評定精度與速度勢在必行。計算機自動評分避免了以往人工批改試卷的種種問題,保證了對試卷評定的公正與客觀。當前,對于計算機考試中自動評分技術的研究已經有了很大的進展,但是對于計算機考試完全實現自動評分卻一直未能解決。造成這一問題的重要原因是自動評分中一些關鍵技術尚不成熟,所以完全解決計算機考試自動評分問題在當前的技術條件下尚不可能。但是,對于計算機程序語言來說,因為相對自然語言,其所受到的約束和限制相當嚴格,所以實現對計算機考試中計算機程序語言考試的自動評分在技術上是可以實現的。
在當前的計算機程序語言考試中主要分為客觀題(比如填空題和改錯題)和主觀題(比如編程題)。客觀題的自動評分在技術上比較容易實現,而編程題這一常見的主觀性題型的自動評分卻沒有較好的解決方法。因為,如果僅以考生編寫的程序運行結果作為評判標準的話,雖然技術上很容易實現,但是相當的不客觀。這種方法忽視了考生的源代碼與編程思想,這是與人工評分相違背的。
要使編程題的評分客觀公正,就必須對試卷中考生所編寫的源代碼進行分析與處理,如何分析試卷中考生的源代碼已成為解決對編程題自動評分的關鍵。
1 國內外編程題自動評分研究現狀
1.1 國內編程題自動評分研究情況
在國內,上海大學段漢周[1]等人提出的程序設計考核自動評閱系統在進行評分時,需要教師事先根據試題做好一個正確的VB工程文件,然后自動評分系統提取考生所做工程文件中的內容與教師事先提供的工程文件內容進行比較判斷,統計出考生的各種錯誤,然后根據考生所犯的錯誤,依據評分標準進行評分,從而得出考生的成績。但是這套系統的評分是建立在無法通過編譯或者不能運行的程序都是完全錯誤的基礎之上的,只有沒有出現上述情況的程序才可以進行評分,否則就自動給零。此外,對于系統的可靠性,防止使用用戶程序時出現的各種問題與系統崩潰、死機等情況做出了專門的設計,取得了良好的效果。
喬善平等人提出了從人工智能可信度的角度引入[2]:執行可信度、程序的最大相似性與代碼可信度和指數曲線衡量標準與輸出可信度幾個新的概念, 然后分析了實現的過程,并且將整個程序設計分為幾個部分執行、代碼、輸出和其他因素,使之存在偏序和制約關系, 以實現自動評分。
1.2 國外編程題自動評分研究情況
由英國諾丁漢大學所研發的CourseMaster系統,其功能是比較完善的,可以自動對提交給它的計算機程序進行測試,同時給出測試結果和分析結果,包括了靜態測試和動態測試兩部分。但是在動態測試方面,由于諾丁漢大學的CourseMaster系統所用的算法設計有缺陷,因此造成了動態測試效果與實際偏差較大[3]。
2 設計思想
對于程序來說,判斷其是否正確,最直觀的辦法就是判斷它是否能夠完成規定的功能,也就是其運行結果與實際應有的結果比較是否一致。通過使用數據文件,可以將C++語言的運行結果保存起來,所以能夠很容易地將其結果文件與標準答案進行比較,從而判定考生所編寫程序的錯對,以給其應得的分數。
對于那些有結果但不正確,或者無法編譯運行的考生代碼,檢查其算法思想是否準確合理編程為工作目標,雖然在C/C++語言中對于一個問題可以用多種方法完成代碼的編寫,但是其算法思想是基本一致的。例如一個排序程序應該如下程序設計結構
for(i=0;i for(j=i+1;j if(a>b) { … } 根據C/C++語言的關鍵字,可以抽取骨架為for()for()if(){}或者for(){for()if(){}}等,從考生文件抽取的骨架與標準的骨架相對比,根據異同給予一定的分數。 在對考生程序進行評分時,由于考生編寫程序時常常出現死循環問題,而有死循環的程序如果被Shell函數調用啟動后將因無法結束而使系統崩潰。但通過Visual Basic調用Windows提供的控制應用程序API函數則可防止這種情況的出現。 為了避免考生互相抄襲,該系統采用了兩種預防措施。第一種措施,不同考生在考試期間隨即抽取試題庫中不同的試題,但是還可能出現相近考生試題相同的情況。從實際出發,該系統采用“記錄解答過程”的方法,利用Windows內部功能[4-7],或考核軟件(VC++)提供的“宏”功能,跟蹤記錄考生操作的每一步驟,形成獨立的日志文件,并通過特殊方法“固化”在當前位置,或者直接傳送到服務器上,作為評分的必需內容。評分時,如搜索不到指定日志文件,就可認定為“抄襲”[5]。 3 系統設計 在系統中對編程題的實現,使用其運行結果與標準答案之間的比較來判定分數設計也相當容易。但是,要實現當程序運行結果與標準答案比較不匹配或程序無法編譯運行的情況,則如何檢測其程序的編程思想是自動評分系統的要點。該系統設計的總體思路如圖1所示。 圖1 系統流程圖 4 結 語 該系統經過多次實際使用,有效地避免了上述問題的出現,能夠準確定位問題的位置,并且對于一題多解的問題也運行良好,在程序編程問題中,能夠基本體現公平、客觀地評價一個學生的編程思想,特別是操作日志的使用,有效地監督了學生的“抄襲”現象。對程序編程時,不能通過編譯的,但是已經編寫了一部分程序的考生,使用提取骨架的方法,基本能夠給考生一個公平的評價,改善了過去很多系統給學生打零分的情況[8-9]。 參考文獻 [1]段漢周,凌捷,鄭衍衡.Visual Basci程序設計考核自動評閱系統中若干問題的研究[J].計算機工程,2001,27(4):167-168. [2]REDMIL Felix. Exploring risk-based testing and its implications[J]. Software Testing,Verfication and Reliability,2004,14(1):3-15. [3]喬善平.基于智能移動Agent的C語言考試系統[J].計算機工程與科學,2004(4):29-31. [4]朱友芹.WindowsAPI 參考大全[M].北京:電子工業出版社,2000. [5]尉宏波.Windows API編程范例入門與提高[M].北京:清華大學出版社,2003. [6]林倉.Windows API編程[M].北京:清華大學出版社,2005. [7]求是科技.Windows API程序設計參考大全[M].北京:人民郵電出版社,2006. [8]高思丹,袁春風.主觀試題的計算機自動批改技術研究[J].計算機應用研究,2004,21(2):181-185. [9]程華.計算機語言類課程主觀試題的自動評分方案設計[J].電腦學習,2006(1):16-17. [10]李旻,陳和平.正則表達式在數據庫查詢中的應用[J].計算機工程與設計,2006,27(12):3-5. [11]田緒安,郭華磊,劉瑞光,等.基于模糊匹配的主觀題評分在線考試系統[J].現代電子技術,2007,30(12):96-98. [12]司存瑞,周巖,孫米.網絡考試系統平臺的設計與實現[J].現代電子技術,2006,29(20):44-46.