段敬利 ,張春飛,魏久鴻
C語言是大學(xué)教育的必修課程之一。目前很多C語言教學(xué)中的上機練習(xí)系統(tǒng)和上機考試系統(tǒng)一般都包括填空、改錯和程序設(shè)計3部分。填空和改錯這樣的客觀題目的自動評分技術(shù)比較成熟[1],但是對于主觀題的閱卷技術(shù)卻一直停滯難前[2]。目前主要采用的是結(jié)果對比評分法,即依據(jù)程序運行結(jié)果和標準答案對比給出相應(yīng)分數(shù),結(jié)果正確得滿分,不正確得零分。這種方法衡量的只是一個輸出文件或者輸出結(jié)果,完全忽略了考生的源代碼,顯然有失公允,不能反映學(xué)生的真實水平。而且現(xiàn)有的考試系統(tǒng)多為單機版和基于C/S模式的,存在時間和空間受限的缺點。
針對上述問題,本文研究了一套基于Web的C語言考試及自動評分系統(tǒng),該評分系統(tǒng)充分考慮學(xué)生的源代碼,在結(jié)果對比評分的基礎(chǔ)上,給出了修復(fù)編譯、代碼對比相結(jié)合的評分方法。
C語言教學(xué)中上機考試及評分系統(tǒng)主要包含3部分:考試系統(tǒng)、試卷管理系統(tǒng)和評分系統(tǒng),如圖1所示??荚囅到y(tǒng)采用基于Web的B/S模式,只有服務(wù)器端,客戶端為Web瀏覽器。服務(wù)器其實是一個網(wǎng)站,管理員也可通過Web瀏覽器對數(shù)據(jù)庫進行維護。而學(xué)生也是通過瀏覽器進行登錄、試題抽取和提交考試結(jié)果。本系統(tǒng)學(xué)生提交的不是文件,而是以表單的形式把學(xué)生的答案提交到數(shù)據(jù)庫對應(yīng)的字段,評分系統(tǒng)提取學(xué)生答案,再組成C文件進行評分,考生在線考試過程如圖2所示。
圖1 功能模塊圖
圖2 在線考試過程
C語言教學(xué)中上機考試及自動評分系統(tǒng)采用微軟的SQL Server作為系統(tǒng)數(shù)據(jù)庫,在Windows XP操作系統(tǒng)、IIS服務(wù)器和Asp.net環(huán)境下設(shè)計動態(tài)網(wǎng)頁,實現(xiàn)考試系統(tǒng)。自動評分系統(tǒng),則在Visual C++.net環(huán)境下實現(xiàn)。
評分系統(tǒng)的主觀題采用結(jié)果對比、修復(fù)編譯與代碼對比相結(jié)合的評分方法。結(jié)果對比是檢查考生程序的運行結(jié)果是否與標準答案的運行結(jié)果一致。修復(fù)編譯是修改源文件中的語法錯誤,使程序生成EXE文件,再進行結(jié)果對比評分。代碼對比評分是將規(guī)范化處理后的學(xué)生程序與標準答案知識要點進行相似度計算,得到各知識點分值,再累計得到總分,它類似于教師在評閱主觀題時的思維方法。系統(tǒng)評分方法如圖3所示。
圖3 系統(tǒng)評分方法圖
程序設(shè)計題評分之前的一項重要工作是保存程序設(shè)計題的各知識要點和評分標準。由于是課程考試,給出的程序不會很復(fù)雜,先分析程序設(shè)計題并設(shè)定知識要點及其分值,一道試題的各知識要點的分值之和等于該試題的分值,將每道程序設(shè)計題的知識要點、分值分別保存在知識要點評分表answerkey的 q_answerkey和 q_keyscore字段中。程序設(shè)計題的評分過程分為以下4個步驟:
a.排除未答題考生。
先判斷考生程序設(shè)計題答案字段stu_answer是否存在,若不存在,則得0分,存入試題得分表detailscore中的e_score字段中;若存在,則轉(zhuǎn)到評分模塊進行評分。用偽代碼表示如下:
if stu_answer exist then
e_score=0
else go to評分模塊
b.結(jié)果對比。
結(jié)果對比是檢查考生程序的運行結(jié)果是否與標準答案的運行結(jié)果一致,若一致,則可得滿分,并將得分存入detailscore表(各試題得分表)中的e_score字段中;否則轉(zhuǎn)到代碼對比評分。
c.修復(fù)編譯。
即使學(xué)生思路明確,程序中也可能出現(xiàn)語法錯誤,致使程序不能產(chǎn)生運行結(jié)果。修復(fù)編譯的作用是修改學(xué)生程序中的語法錯誤,進而使程序能通過編譯和鏈接,生成EXE文件和答案。但是每修改一次語法錯誤要從該題目總分中扣除相應(yīng)的分數(shù),比如總分100分,一次修改扣10分的話,經(jīng)過一次修改生成EXE文件,并且輸出和標準答案相同的結(jié)果,則可得到90分。如果修改的次數(shù)超過規(guī)定次數(shù),則進入代碼對比評分。常見的語法錯誤主要是標點符號的遺失和輸入錯誤的標識符。下面簡要概述修復(fù)編譯的過程和關(guān)鍵技術(shù)。
首先對源程序中的單詞進行詞性分析,詞性分析的主要任務(wù)是識別各個詞匯的類型的值,識別后的各個詞的類型保存在一個鏈表word_list中。詞性分析過程中用到的結(jié)構(gòu)體定義如下:
struct word
{
char lab_name;//標識類型
int state;//狀態(tài)
int number;//序號
int line;//行號
char name[50]//詞匯
struct word*next;//指向下一節(jié)點的指針
}
對程序掃描后,各個單詞保存在各自的結(jié)構(gòu)體變量中,并生成鏈表word_list,供語法分析使用。
然后對word_list鏈表進行語法分析,如不合法,則判斷錯誤位置,并嘗試修正。如果是標點符號遺漏,則還需要判斷遺漏的是何種標點,然后在遺漏位置插入相應(yīng)的標點符號。如果發(fā)現(xiàn)未定義的標識符,則查找本程序中已定義的標識符表和關(guān)鍵字表,如發(fā)現(xiàn)相似度較高的單詞,則進行替換。經(jīng)過上述步驟,可修改程序中的一處語法錯誤,然后進行下一次編譯。
d.代碼對比評分。
代碼對比評分是在評分系統(tǒng)的題庫中事先存放不同算法的正確關(guān)鍵代碼,評分的時候系統(tǒng)通過對比學(xué)生程序中這些關(guān)鍵代碼,給出相應(yīng)的分數(shù)。但是,同樣一個程序設(shè)計題目,同樣的算法,其書寫的方法和格式也是千變?nèi)f化的,而且標識符的定義也是由個人喜好決定。用簡單的、死板的關(guān)鍵字對比,顯然是行不通的。這里采用正則公式[3]來應(yīng)對C語言的語法特性。
如求10的階乘的程序關(guān)鍵代碼如下:
int a=1,i=1;
while(i<=10){a=a*i;i++}
其中存放結(jié)果的變量a和循環(huán)控制變量i,不同的學(xué)生會用不同的名字來命名,那么可用一種通用的表示方法來表示這段代碼:
int@VAR@=1,@VAR@=1;
while(@VAR@<=10){@VAR@=@VAR@*@VAR@;@VAR@++}
這里可以用C語言變量的正則表達式“(s)*(w)+(s)*”對上面的代碼進行匹配。
評分系統(tǒng)首先用正則公式對學(xué)生代碼進行規(guī)范化處理,然后根據(jù)知識要點評分表中給出的知識要點和評分標準,評判程序?qū)χR要點的覆蓋情況,計算學(xué)生代碼和各知識要點的相似度值,分別存入知識要點得分表中的e_keyscore字段。最后計算各知識點得分的總和,存入該題總分(e_score)字段中。
本文所提出的C語言程序設(shè)計題目的評分方法,結(jié)合了幾種不同的評分方法,取長補短,彌補了現(xiàn)有評分方法的不足,避免了出現(xiàn)一點錯誤即得零分的不合理現(xiàn)象,可以更客觀地反映學(xué)生的真實水平,增強了考試的公平性和真實性。實踐證明,采用上述評分方法的考試系統(tǒng)適合用于C語言教學(xué)中的上機練習(xí)和考試。本文提出的修復(fù)編譯還僅限于標點符號遺失和標識符錯誤的修復(fù),雖然不能完全替代教師的閱卷工作,但卻是一種充分考慮學(xué)生源代碼的新思路,為研究出更科學(xué)的評分方法提供了依據(jù)。
[1] 孟愛國,卜勝賢,李鷹,等.一種網(wǎng)絡(luò)考試系統(tǒng)中主觀題自動評分的算法設(shè)計與實現(xiàn)[J].計算機與數(shù)字工程,2005(7):147-150.
[2] 王永生.計算機閱卷中主觀題型的單層模糊綜合評判[J].青海大學(xué)學(xué)報,2000(3):46-49.
[3] 佛瑞德(Jeffrey Friedl E F).精通正則表達式[M].3版.余晟譯.北京:電子工業(yè)出版社,2012.