天天看點

Java程式設計題自動評分技術的研究與實作(二)

1.4 課題的研究思路

    本文以 Java 程式設計題為例,結合人工評閱的方法,對不同的考生程式采用不同的評分方法。考生的程式大緻可分為兩種情況: 可以通過編譯和無法通過編譯。

    第一種情況,對于可以通過編譯的考生程式,利用 Java 反射機制提取考生程式的相關資訊進行黑盒測試。反射機制可以輕松提取考生程式中與輸入有關的變量或對象屬性,系統根據變量或對象屬性的資料類型給定輸入值,然後調用具有傳回值的方法來驗證該方法的輸出結果是否與預期的輸出值一緻,給出測試分,再結合文法分、結果分,計算出總得分。該評分方法簡稱為“功能性測試評分方法”。

    第二種情況,對于無法通過編譯的考生程式,利用本地 jdk 包中自帶的編譯器對考生程式進行編譯,結合使用錯誤流擷取編譯的錯誤資訊,然後使用Scanner 類來分解錯誤資訊并進行局部錯誤,每糾正一個錯誤都要重新編譯以消除虛假錯誤。對于糾錯後能順利通過編譯的考生程式,采用“功能性測試評分方法”計算總得分。對于無法糾錯的考生程式,則采取放棄糾錯,根據錯誤種類适當給出文法分,再結合知識要點比對情況計算總得分,稱該評分方法為“知識要點比對評分方法”。

    1.5 研究目标

    本文以設計出能對 Java程式進行自動評分,并且評分過程能夠較合理、靈4活及評分結果與人工評分大緻相符為目标。避免因極小錯誤或标準答案中沒有給出多種可能的參考答案而導緻失分嚴重的情況的發生。對于有極小錯誤的考生程式,應該采取查錯并糾正錯誤,如果運作正确,适當扣點文法分,考生仍然可以得高分;對于後者采用黑盒測試也可以降低評分的誤差,使得評分結果更加合理性。在評分系統總體方案設計中,結合UML模型圖,以圖形化的方式更清晰、直覺地展示系統模型。對于。此外,評分系統的功能除了自動評分外,還包含成績查詢、成績圖表統計等後續處理,可以減輕教師繁重的工作量。

    1.6 課題的難點與解決方法

    評分系統的難點在于無法通過編譯的考生程式如何進行查錯及局部糾錯處理、語義多樣化問題的解決、特殊算法的處理。查錯及局部糾錯處理方案是利用java自帶的編譯器編譯考生程式,結合使用錯誤流擷取 編譯的錯誤資訊,然後使用Scanner類來分解錯誤資訊并糾正簡單的錯誤,每糾正一個錯誤都要重新編譯以消除虛假錯誤。對于無法糾錯的考生程式,則放棄糾錯,根據錯誤種類扣文法分,然後結合知識要點比對評分。對于語義多樣化的問題,采用正規表達式這個強大的比對工具描述所有可能的解答方法,然後與考生答案進行比對給分。對于沒有在标準答案檔案中給出的特殊算法,采用在評分過程中結合了功能測試的方法,以輔助的方式、比較有效地處理這種特殊情況,進而有效縮小評分誤差。

    1.7 系統開發工具

    程式設計語言: Java

    Java開發包:JDK7.0

    內建開發環境: Eclipse3.7.0

    資料庫: SQL Server 2005

    運作平台:Windows XP

    UML繪圖工具:StarUML5.0

    正規表達式測試工具:RegexBuddy 35

    1.8 論文組織結構

    論文共分為五章,結構如下:

    第一章 介紹本文的研究背景,研究目的及意義,闡述了國内外的研究現狀,提出了本文的研究思路及研究目标,同時對課題的難點提出相應的解決方法,并簡要介紹了系統開發工具。

    第二章 介紹系統所涉及到的相關技術。闡述了Java反射機制、正規表達式應用步驟;概括了幾種常用的UML模型圖以及UML模組化過程,并介紹了XML文檔的驗證、解析、查詢技術。

    第三章 闡述自動評分系統的總體設計。對系統需求、靜态結構和動态行為進行模組化、對資料庫及試卷标準答案的存儲格式進行設計,同時對XML資料進行加解密。

    第四章 闡述自動評分系統的實作與測試。重點介紹自動評分系統的三大關鍵技術的實作,包括:程式查錯及局部糾錯技術的實作、基于反射機制的黑盒測試技術的實作以及知識要點的正規表達式比對評分技術的實作,建構原型系統進行測試以及實驗結果分析。

    第五章 總結本文主要的研究工作,并指出系統需要在哪些方面進行完善。6第 2 章 相關技術簡介

    2.1 Java 反射機制

    自動評分系統的基本工作原理是提取考生程式的相關資訊與标準答案進行比對評分。反射機制在讀取和修改屬性或方法方面具有十分強大的功能。通過Java的反射機制,可以得知一個運作中的Java程式所包含的任何類的屬性和方法,可以設定其對象的屬性值及調用其對象的任何方法。是以,反射機制用于評分系統的功能測試具有較好的靈活性。

    2.1.1 Java 反射機制原理

    Java反射機制應用的前提是已知名稱的Class必須能通過編譯,允許于程式運作時取得該類的所有屬性和方法,還可建立對象、設定對象的屬性值以及調用對象的方法。反射機制主要借助于java.lang.reflect包中的Class、Field、Constructor及Method等四個類來實作,其中Class表示一個類,Field表示類的成員變量,Constructor表示類的構造方法,Method表示類的方法。

    Class類是反射機制應用的入口,即反射機制應用前要先建立一個“Class”對象;然後利用該“Class”對象獲得類的内部資訊;再通過反射APIs動态處理便可獲得類成員的具體資訊。具體地說,任何一個Java類檔案(通過程式編譯後,便可生成的位元組碼檔案)被JVM裝入記憶體後都用Class對象來表示。

    Class對象調用getDeclaredField()、getDeclaredConstructor()和getDeclaredMethod()等方法便可得到類中Field、Method和Constructor對象。

    再利用這些反射對象,可友善地擷取其相關的類成員的具體資訊。比如要擷取方法的修飾符和傳回類型,隻要通過Method對象調用getModifiers()與getReturnType()即可實作。同樣,可通過Field 對象通路變量或修改變量值,方法分别為get(Object obj)與set(Object obj1 , Object obj2 )。