許芝卉,李建華
(山西大同大學(xué)數(shù)學(xué)與統(tǒng)計學(xué)院,山西大同 037009)
目前,計算機(jī)程序設(shè)計語言考試評卷軟件,對于客觀題的自動評分工作能很好地完成,但對于主觀題并沒有很好的解決方法。比如程序設(shè)計題,多數(shù)采用比對結(jié)果法,即根據(jù)程序運行出來的結(jié)果給出相應(yīng)的評分,而對于考生程序的內(nèi)容并不查看。在這樣的評分方案下,程序題的得分只有兩個,正確滿分,錯誤或沒有結(jié)果是零分。而程序設(shè)計題若有一個小小的錯誤(如語法錯誤)都不可能有結(jié)果,而考生也將丟失整個程序的分?jǐn)?shù),這與通常意義下的人工評閱試卷的結(jié)果是不一致的,文中就是探討一種接近傳統(tǒng)人工閱卷的計算機(jī)自動評分算法[2]。
C程序設(shè)計是國際上廣泛流行的計算機(jī)程序設(shè)計語言,在高等院校中,大多數(shù)非計算機(jī)專業(yè)的理科生都將C 程序設(shè)計語言作為一門必修課來開設(shè),對該門課程的考核多數(shù)采用人工命題、人工閱卷評分的方法,采用這種方法往往效率不高,通常還會受到任課教師人為因素的影響,比如代碼不規(guī)范等等。這種人工評閱程序設(shè)計試卷的方法已經(jīng)不能適應(yīng)高等教育發(fā)展的需要了,而利用計算機(jī)實現(xiàn)無紙化考試是今后教育發(fā)展的需要,現(xiàn)在國家計算機(jī)等級考試就是采用的這種方式。對于客觀題的自動評分工作能很好地完成,但對于主觀題的評分還是沒有好的解決方案。比如常用的結(jié)果比對法還是不能很好地反映考生的真實水平,存在很大的不合理性[4]。
對于C程序設(shè)計題自動評分主要從兩個方面著手,首先是要檢查程序的運行結(jié)果是否正確;其次是要檢查程序中的語法和程序中的邏輯是否合理。本系統(tǒng)的程序設(shè)計題自動評分可用結(jié)構(gòu)化流程圖1。同一題目,每個人的編程思路和編程習(xí)慣是不相同的,當(dāng)然程序運行結(jié)果也會有差異,錯誤也各種各樣,可能有的結(jié)果大致三種情況:(1)有結(jié)果文件,且編譯運行后得到正確結(jié)果;(2)有結(jié)果文件,但運行結(jié)果不正確;(3)沒有結(jié)果文件,源程序不能編譯運行。對于第一種情況,可利用結(jié)果比對法,對于第二種情況,說明程序代碼有問題,可能是邏輯錯誤也可能是輸出錯誤等,對于這種情況,需要針對程序中的一些特征屬性進(jìn)行分析,并進(jìn)行結(jié)構(gòu)相似度匹配,綜合給出評分[2],對于第三種情況,那可能是由多種因素形成,需具體問題具體分析。
對于程序設(shè)計題中有運行結(jié)果的可通過比對考生的運行結(jié)果文件,若與標(biāo)準(zhǔn)答案中的結(jié)果完全一致,則可得滿分,若不完全一致,則可依據(jù)輸出數(shù)據(jù)的正確數(shù)量給予一定比例的得分[1]。
若考生程序出現(xiàn)無程序運行結(jié)果的情況,通常的處理方法為:(1)可以在C 系統(tǒng)下對程序進(jìn)行模擬運行來獲得程序的運行結(jié)果;(2)若程序中有語法錯誤,則可根據(jù)語法分析來找出程序中錯誤的地方,去設(shè)計程序的改錯算法,改正考生程序中可能出現(xiàn)的錯誤,最終使程序能夠運行,當(dāng)然錯誤信息仍需保留,若考生程序經(jīng)過評閱修改得以運行,同時也獲得了正確結(jié)果,則可根據(jù)保留的錯誤信息來扣除對應(yīng)的分?jǐn)?shù);(3)若利用上述方法設(shè)計仍無法運行或結(jié)果仍然不正確的情況,則可以采用下面的評閱方法[1]。
圖1 結(jié)構(gòu)化流程圖
程序靜態(tài)評閱方法是指通過程序中的若干條語句靜態(tài)檢查來得到對應(yīng)的評閱信息。首先本系統(tǒng)應(yīng)做好準(zhǔn)備工作,根據(jù)準(zhǔn)備好的題目在考生題庫文件中設(shè)置若干條關(guān)鍵語句,然后根據(jù)關(guān)鍵語句的數(shù)量檢查學(xué)生程序的邏輯是否合理,并給出對應(yīng)的分?jǐn)?shù)值[1]。
上述3種評閱方法,相對于只用結(jié)果比對成績的評閱方法是有積極意義的,但和人工閱卷按步驟評分有一定差別,主要針對高等院校理科專業(yè)學(xué)生期末考試而設(shè)計的,評分規(guī)模不大且測評語句的行數(shù)也不會太多。程序自動測評準(zhǔn)確性的提高是本文要解決的主要問題[1],下面通過實例來探討。
例1編寫程序:通過輸入x的值,輸出y的值。
例2從鍵盤輸入10個學(xué)生的成績放入score數(shù)組中,統(tǒng)計并輸出這10個學(xué)生的平均成績。
下面是例1 和例2 的C 程序設(shè)計題的人工評分標(biāo)準(zhǔn)。
例1 C程序如下:
例1 中若輸入函數(shù)寫成這樣scanf(“%d”,x); 編譯時不顯示語法有錯誤,再比如y=2*x-1; 若寫成y=2x-1;出現(xiàn)這樣的錯誤程序都不會有結(jié)果。例2中最容易錯的就是sum=0; 語句的位置,若位置錯了就不能出現(xiàn)正確結(jié)果。若采用結(jié)果比對法就是零分,若是人工閱卷只會失去很少的分?jǐn)?shù)。為了避免這種情況的發(fā)生就需要采用動態(tài)和靜態(tài)相結(jié)合的評閱方法[4]。
C程序設(shè)計題的評分方案應(yīng)從如下幾個方面來探討:
(1)通過程序運行結(jié)果來評定;
C 程序有自己的特殊性,在程序設(shè)計中可以通過設(shè)置,把程序運行結(jié)果的數(shù)據(jù)保存成數(shù)據(jù)文件,學(xué)生考試結(jié)束后,就可以根據(jù)這個數(shù)據(jù)文件中的結(jié)果與標(biāo)準(zhǔn)答案進(jìn)行比對,而標(biāo)準(zhǔn)答案文件在抽取試題時已經(jīng)生成。
(2)通過對源程序進(jìn)行修改的方法進(jìn)行評定;
C程序文件可以作為文本文件進(jìn)行讀和寫的操作,C 程序經(jīng)過編譯運行可能會出現(xiàn)兩種情況:有運行結(jié)果但不正確或沒有運行結(jié)果。若程序沒有運行結(jié)果大致的原因是這幾個方面:出現(xiàn)死循環(huán)、有語法錯誤、有語句問題,通過分析我們?nèi)フ义e和改錯,當(dāng)然要盡可能地把程序中的語法及語句錯誤標(biāo)記出來,生成錯誤文件;同時也要保證學(xué)生所編寫程序正確的那些部分不被破壞。學(xué)生程序經(jīng)過修改沒有問題后,可生成修改后的文件,并重新命名,新的源程序若編譯正確后生成可執(zhí)行文件,若該可執(zhí)行文件生成正確,則可以通過Shell 函數(shù)去調(diào)用可執(zhí)行文件使學(xué)生程序得以運行,若編譯不正確則退出系統(tǒng)[2]。
(3)通過關(guān)鍵語句對程序進(jìn)行評定。
一個程序應(yīng)該如何給出合理的評閱分?jǐn)?shù)呢?對同一道編程題目來說,編程思路和編程方法會有很多種,但基本語句是確定的,比如循環(huán)類問題(如求1-100 之和、求5!等),循環(huán)語句有三種(while 語句、do—while 語句和for 語句),但無論用哪一種循環(huán)基本算法是確定的,在題庫文件中先存入考試題目的關(guān)鍵語句,評分時可結(jié)合關(guān)鍵語句的數(shù)量給出較為合理的分?jǐn)?shù)[3]。
主要用于在校大學(xué)生期末C程序題的考查,所考題目的程序語句不會太多(一般不會超過50行),通過上述幾種評閱方法,盡可能地給考生一個合理的評閱分?jǐn)?shù),與傳統(tǒng)的結(jié)果比對評分方法相比較,這種設(shè)計更加接近人工閱卷,更具推廣性。