李建華,許芝卉*
(山西大同大學(xué)數(shù)學(xué)與統(tǒng)計(jì)學(xué)院,山西大同 037200)
C 語(yǔ)言是高級(jí)程序設(shè)計(jì)語(yǔ)言,是各高校中理工科的一門(mén)必修課,也是計(jì)算機(jī)等級(jí)考試的科目之一。C語(yǔ)言的編程題如果能夠用計(jì)算機(jī)自動(dòng)評(píng)分的話,那么對(duì)學(xué)生編程練習(xí)自評(píng)以及利用計(jì)算機(jī)實(shí)現(xiàn)無(wú)紙化考試都具有十分重要的意義。因此,各種自動(dòng)評(píng)分系統(tǒng)也應(yīng)用而生。動(dòng)態(tài)測(cè)試評(píng)分法是目前較多在線測(cè)試系統(tǒng)中用到的評(píng)分方法,其前提是程序能運(yùn)行成功,程序編譯失敗或運(yùn)行結(jié)果不匹配等情況都以0分處理[1-3]。這種評(píng)分方法對(duì)學(xué)生的學(xué)習(xí)考察存在著片面性。我們知道C 語(yǔ)言畢竟是語(yǔ)言類(lèi),用它編程和我們用漢語(yǔ)言寫(xiě)作一樣,存在著多樣性。這樣由于學(xué)生編寫(xiě)的源代碼存在著多樣性,以及現(xiàn)有的技術(shù)對(duì)程序的理解度、語(yǔ)義分析的準(zhǔn)確度還不是很成熟等原因,評(píng)分的細(xì)節(jié)及準(zhǔn)確性會(huì)受到影響。
那么,如果為了迎合評(píng)分軟件的功能,對(duì)于程序設(shè)計(jì)題規(guī)定算法結(jié)構(gòu),這樣就背離了此類(lèi)試題考核的初衷,也不符合程序設(shè)計(jì)的靈活多樣性特征。語(yǔ)言類(lèi)課程教學(xué)的最終目的就是培養(yǎng)學(xué)生的實(shí)際應(yīng)用能力,然而面對(duì)紛繁復(fù)雜的現(xiàn)實(shí)問(wèn)題,不同學(xué)生對(duì)于同一個(gè)問(wèn)題的解答結(jié)果也是不盡相同的。因此,沒(méi)有必要也不應(yīng)該強(qiáng)求答案的一致性,這就給計(jì)算機(jī)自動(dòng)評(píng)分帶來(lái)很大困難。
目前針對(duì)程序主觀題的自動(dòng)評(píng)分方法主要分為兩類(lèi):靜態(tài)分析和動(dòng)態(tài)測(cè)試。這兩種方法各有利弊。動(dòng)態(tài)測(cè)試實(shí)現(xiàn)起來(lái)簡(jiǎn)單快速,但局限性強(qiáng),只能處理程序完整的題目,結(jié)果只是滿分或零分兩種情況,不能按步驟給分;靜態(tài)分析與人工閱卷評(píng)分方式較為貼近,可以按照程序步驟給分,這樣也就可以適用于絕大多數(shù)程序題的自動(dòng)閱卷。然而靜態(tài)分析通常需要完備答案庫(kù),才可能使學(xué)生的多樣化答案找到匹配答案。所以這會(huì)出現(xiàn)本來(lái)答案正確但是沒(méi)匹配到答案的情況,導(dǎo)致不能完全保證評(píng)分正確。針對(duì)這些問(wèn)題,提出一種基于人工評(píng)分思想的評(píng)分算法,從實(shí)際出發(fā),采用靜態(tài)分析、動(dòng)態(tài)測(cè)試相結(jié)合的方法進(jìn)行自動(dòng)評(píng)分,盡可能減少錯(cuò)誤批改,客觀公正地給出考試成績(jī)。
教師在人工評(píng)分時(shí)會(huì)將學(xué)生編寫(xiě)的程序與試卷標(biāo)準(zhǔn)答案進(jìn)行比對(duì),如果與標(biāo)準(zhǔn)答案的結(jié)果一樣就會(huì)給出滿分。如果學(xué)生編寫(xiě)的代碼與所有的備案答案都不完全一樣,教師會(huì)根據(jù)評(píng)分標(biāo)準(zhǔn)按知識(shí)點(diǎn)給分。正是參考人工閱卷的這種方式來(lái)解決自動(dòng)閱卷的難點(diǎn)問(wèn)題。
先用動(dòng)態(tài)測(cè)試評(píng)分方法來(lái)測(cè)試。動(dòng)態(tài)測(cè)試的過(guò)程是將源程序進(jìn)行預(yù)處理和編譯,然后檢測(cè)是否生成相應(yīng)的可執(zhí)行文件[4-5]。動(dòng)態(tài)測(cè)試記錄程序運(yùn)行時(shí)的編譯結(jié)果與運(yùn)行結(jié)果,如果編譯成功,并且結(jié)果運(yùn)行正確,那就是滿分;如果編譯成功,但結(jié)果運(yùn)行與答案不匹配,或編譯不成功,那么轉(zhuǎn)為靜態(tài)評(píng)分法。靜態(tài)分析方法的本質(zhì)是模式匹配,也就是對(duì)考生答案的源程序進(jìn)行語(yǔ)法語(yǔ)義等分析,依據(jù)考生答案和標(biāo)準(zhǔn)答案之間的匹配度給考生判分。
目前的很多自動(dòng)化評(píng)分系統(tǒng)的評(píng)分策略是按結(jié)果評(píng)分的,這種策略會(huì)產(chǎn)生不合理的結(jié)果,如:僅因?yàn)閭€(gè)別小錯(cuò)誤而使一個(gè)基本正確的程序不能編譯運(yùn)行,這種情況系統(tǒng)會(huì)給予整個(gè)程序不得分的結(jié)果。就這一不合理情況進(jìn)行一些改進(jìn),系統(tǒng)設(shè)計(jì)的總體思路如圖1所示。
圖1 系統(tǒng)流程圖
建立測(cè)試程序相應(yīng)的輸入、輸出對(duì)的集合,對(duì)學(xué)生答題的源程序進(jìn)行編譯連接,編譯成功,運(yùn)行學(xué)生程序,然后判定對(duì)于特定的輸入程序能否得到期待的輸出。如果運(yùn)行結(jié)果與標(biāo)準(zhǔn)答案內(nèi)容完全相同,則說(shuō)明結(jié)果正確,得滿分。用windows 內(nèi)部功能,記錄考生操作的每一步驟,形成獨(dú)立日志文件,傳送到服務(wù)器上,作為評(píng)分的必需內(nèi)容。評(píng)分時(shí),如搜索不到指定日志文件,就可認(rèn)定為“抄襲”[6]。根據(jù)C程序的編譯原理,源文件編譯成功后會(huì)生成相對(duì)應(yīng)的后輟為.obj 文件和后輟為.exe 的目標(biāo)文件,可通過(guò)判斷編譯之后是否有后輟為.exe文件來(lái)確定編譯是否成功。
當(dāng)程序編譯不成功,或運(yùn)行結(jié)果與答案不符,轉(zhuǎn)入靜態(tài)分析評(píng)分。以下是總結(jié)的幾種靜態(tài)分析方式。
2.2.1 基于得分語(yǔ)句查找的評(píng)分
人工評(píng)分時(shí),教師會(huì)在學(xué)生所寫(xiě)程序中找出相應(yīng)能得分的點(diǎn),并根據(jù)評(píng)分標(biāo)準(zhǔn)給出相應(yīng)的得分,如果沒(méi)有找到關(guān)鍵得分的程序段,就不會(huì)得到分?jǐn)?shù)。由教師提供一系列試題答案,記錄在答案文本文件中。教師在答案模板中把關(guān)鍵得分語(yǔ)句按得分點(diǎn)分成一段一段的,并標(biāo)配相應(yīng)得分分?jǐn)?shù)。自動(dòng)評(píng)分過(guò)程是對(duì)學(xué)生源程序進(jìn)行詞法分析后,查找能與關(guān)鍵得分語(yǔ)句相匹配的程序語(yǔ)句,并把相應(yīng)可得的分?jǐn)?shù)累計(jì)起來(lái)。該方法保證在學(xué)生程序有語(yǔ)法錯(cuò)誤、不能正常運(yùn)行的情況下,也能得到合理的分?jǐn)?shù)。
2.2.2 算法思想的對(duì)比評(píng)分
算法思想對(duì)比,可以通過(guò)抽取程序骨架與標(biāo)準(zhǔn)骨架相比對(duì)。這種方法可用于語(yǔ)義有錯(cuò)誤的情況。如那些編譯成功,但運(yùn)行出來(lái)的結(jié)果卻與答案不同,或者是無(wú)法編譯運(yùn)行的代碼,可以通過(guò)提取骨架的方法來(lái)檢查其算法思想是否合理準(zhǔn)確。雖然在C語(yǔ)言中針對(duì)于同一個(gè)問(wèn)題的解答結(jié)果是不盡相同的,可以編寫(xiě)出多種不同的代碼,但是其算法思想是基本一致的[6]。例如用不同的方法來(lái)實(shí)現(xiàn)排序:
(1)用起泡法來(lái)實(shí)現(xiàn)排序
(2)用選擇排序法實(shí)現(xiàn)排序
(3)用一般排序法實(shí)現(xiàn)排序
根據(jù)C語(yǔ)言的關(guān)鍵字對(duì)以上幾種程序進(jìn)行骨架的抽取,盡管用不同的方法來(lái)實(shí)現(xiàn)程序,但我們會(huì)發(fā)現(xiàn)骨架都為for()for()if(){}或者for(){for()if(){}}等,這樣就可以用從考生文抽取的骨架與標(biāo)準(zhǔn)的骨架相對(duì)比,根據(jù)異同程度給予一定的分?jǐn)?shù)。
2.2.3 書(shū)寫(xiě)格式多樣化評(píng)分
C 語(yǔ)言程序的一大特點(diǎn)就書(shū)寫(xiě)格式靈活多樣。如命名多樣性,同樣性質(zhì)的變量可以定義為不同的名稱,標(biāo)識(shí)符只要滿足規(guī)范可以任意組合字符,而且書(shū)寫(xiě)時(shí)會(huì)出現(xiàn)有無(wú)空格之類(lèi)的區(qū)別。針對(duì)這種情形可以先采用正則表達(dá)式來(lái)表示程序中的關(guān)鍵算法,然后再進(jìn)行字符匹配方法。例如一段簡(jiǎn)單的程序
可表示為:
這種形式可以表示程序的核心算法,而且具有通用性。
2.2.4 基于程序語(yǔ)義分析的評(píng)分
對(duì)程序進(jìn)行語(yǔ)義分析,將學(xué)生程序進(jìn)行程序標(biāo)準(zhǔn)化轉(zhuǎn)換,這種轉(zhuǎn)化就是消除程序表達(dá)方式多樣化,如把while 和do…while 語(yǔ)句等表循環(huán)的語(yǔ)句都換成for 語(yǔ)句。然后與由教師提供的記錄在答案文本文件中的一系列模板程序(相當(dāng)于提供編程題的參考答案)進(jìn)行程序匹配。計(jì)算它們的語(yǔ)義相似程度,給出學(xué)生程序的評(píng)分結(jié)果。語(yǔ)義相似度越高,程序得分就越高。該方法保證在程序運(yùn)行結(jié)果有誤但基本思路正確的情況下也可以得到合理的分?jǐn)?shù)[7]。
根據(jù)人工批卷的主觀思想而設(shè)計(jì)的自動(dòng)評(píng)分系統(tǒng)算法,自動(dòng)評(píng)分系統(tǒng)可用于面向?qū)W生實(shí)踐能力考核的C語(yǔ)言編程題考試。動(dòng)態(tài)測(cè)試與靜態(tài)分析相結(jié)合可以更好得體現(xiàn)人工閱卷的思維過(guò)程,如果將上述的四種靜態(tài)分析方法能靈活地結(jié)合在一起的話,效果會(huì)更佳。自動(dòng)評(píng)分系統(tǒng)不僅可以減輕教師的閱卷負(fù)擔(dān),還可以用于學(xué)生自評(píng),其反饋結(jié)果可幫助學(xué)生進(jìn)一步了解學(xué)情,從而有針對(duì)的進(jìn)行改進(jìn)與學(xué)習(xí),對(duì)于實(shí)現(xiàn)無(wú)紙考試具有重要的實(shí)際應(yīng)用意義和推廣價(jià)值。