許芝卉,李建華
(山西大同大學數學與統計學院,山西大同 037009)
目前,計算機程序設計語言考試評卷軟件,對于客觀題的自動評分工作能很好地完成,但對于主觀題并沒有很好的解決方法。比如程序設計題,多數采用比對結果法,即根據程序運行出來的結果給出相應的評分,而對于考生程序的內容并不查看。在這樣的評分方案下,程序題的得分只有兩個,正確滿分,錯誤或沒有結果是零分。而程序設計題若有一個小小的錯誤(如語法錯誤)都不可能有結果,而考生也將丟失整個程序的分數,這與通常意義下的人工評閱試卷的結果是不一致的,文中就是探討一種接近傳統人工閱卷的計算機自動評分算法[2]。
C程序設計是國際上廣泛流行的計算機程序設計語言,在高等院校中,大多數非計算機專業的理科生都將C 程序設計語言作為一門必修課來開設,對該門課程的考核多數采用人工命題、人工閱卷評分的方法,采用這種方法往往效率不高,通常還會受到任課教師人為因素的影響,比如代碼不規范等等。這種人工評閱程序設計試卷的方法已經不能適應高等教育發展的需要了,而利用計算機實現無紙化考試是今后教育發展的需要,現在國家計算機等級考試就是采用的這種方式。對于客觀題的自動評分工作能很好地完成,但對于主觀題的評分還是沒有好的解決方案。比如常用的結果比對法還是不能很好地反映考生的真實水平,存在很大的不合理性[4]。
對于C程序設計題自動評分主要從兩個方面著手,首先是要檢查程序的運行結果是否正確;其次是要檢查程序中的語法和程序中的邏輯是否合理。本系統的程序設計題自動評分可用結構化流程圖1。同一題目,每個人的編程思路和編程習慣是不相同的,當然程序運行結果也會有差異,錯誤也各種各樣,可能有的結果大致三種情況:(1)有結果文件,且編譯運行后得到正確結果;(2)有結果文件,但運行結果不正確;(3)沒有結果文件,源程序不能編譯運行。對于第一種情況,可利用結果比對法,對于第二種情況,說明程序代碼有問題,可能是邏輯錯誤也可能是輸出錯誤等,對于這種情況,需要針對程序中的一些特征屬性進行分析,并進行結構相似度匹配,綜合給出評分[2],對于第三種情況,那可能是由多種因素形成,需具體問題具體分析。
對于程序設計題中有運行結果的可通過比對考生的運行結果文件,若與標準答案中的結果完全一致,則可得滿分,若不完全一致,則可依據輸出數據的正確數量給予一定比例的得分[1]。
若考生程序出現無程序運行結果的情況,通常的處理方法為:(1)可以在C 系統下對程序進行模擬運行來獲得程序的運行結果;(2)若程序中有語法錯誤,則可根據語法分析來找出程序中錯誤的地方,去設計程序的改錯算法,改正考生程序中可能出現的錯誤,最終使程序能夠運行,當然錯誤信息仍需保留,若考生程序經過評閱修改得以運行,同時也獲得了正確結果,則可根據保留的錯誤信息來扣除對應的分數;(3)若利用上述方法設計仍無法運行或結果仍然不正確的情況,則可以采用下面的評閱方法[1]。

圖1 結構化流程圖
程序靜態評閱方法是指通過程序中的若干條語句靜態檢查來得到對應的評閱信息。首先本系統應做好準備工作,根據準備好的題目在考生題庫文件中設置若干條關鍵語句,然后根據關鍵語句的數量檢查學生程序的邏輯是否合理,并給出對應的分數值[1]。
上述3種評閱方法,相對于只用結果比對成績的評閱方法是有積極意義的,但和人工閱卷按步驟評分有一定差別,主要針對高等院校理科專業學生期末考試而設計的,評分規模不大且測評語句的行數也不會太多。程序自動測評準確性的提高是本文要解決的主要問題[1],下面通過實例來探討。
例1編寫程序:通過輸入x的值,輸出y的值。

例2從鍵盤輸入10個學生的成績放入score數組中,統計并輸出這10個學生的平均成績。
下面是例1 和例2 的C 程序設計題的人工評分標準。
例1 C程序如下:

例1 中若輸入函數寫成這樣scanf(“%d”,x); 編譯時不顯示語法有錯誤,再比如y=2*x-1; 若寫成y=2x-1;出現這樣的錯誤程序都不會有結果。例2中最容易錯的就是sum=0; 語句的位置,若位置錯了就不能出現正確結果。若采用結果比對法就是零分,若是人工閱卷只會失去很少的分數。為了避免這種情況的發生就需要采用動態和靜態相結合的評閱方法[4]。
C程序設計題的評分方案應從如下幾個方面來探討:
(1)通過程序運行結果來評定;
C 程序有自己的特殊性,在程序設計中可以通過設置,把程序運行結果的數據保存成數據文件,學生考試結束后,就可以根據這個數據文件中的結果與標準答案進行比對,而標準答案文件在抽取試題時已經生成。
(2)通過對源程序進行修改的方法進行評定;
C程序文件可以作為文本文件進行讀和寫的操作,C 程序經過編譯運行可能會出現兩種情況:有運行結果但不正確或沒有運行結果。若程序沒有運行結果大致的原因是這幾個方面:出現死循環、有語法錯誤、有語句問題,通過分析我們去找錯和改錯,當然要盡可能地把程序中的語法及語句錯誤標記出來,生成錯誤文件;同時也要保證學生所編寫程序正確的那些部分不被破壞。學生程序經過修改沒有問題后,可生成修改后的文件,并重新命名,新的源程序若編譯正確后生成可執行文件,若該可執行文件生成正確,則可以通過Shell 函數去調用可執行文件使學生程序得以運行,若編譯不正確則退出系統[2]。
(3)通過關鍵語句對程序進行評定。
一個程序應該如何給出合理的評閱分數呢?對同一道編程題目來說,編程思路和編程方法會有很多種,但基本語句是確定的,比如循環類問題(如求1-100 之和、求5!等),循環語句有三種(while 語句、do—while 語句和for 語句),但無論用哪一種循環基本算法是確定的,在題庫文件中先存入考試題目的關鍵語句,評分時可結合關鍵語句的數量給出較為合理的分數[3]。
主要用于在校大學生期末C程序題的考查,所考題目的程序語句不會太多(一般不會超過50行),通過上述幾種評閱方法,盡可能地給考生一個合理的評閱分數,與傳統的結果比對評分方法相比較,這種設計更加接近人工閱卷,更具推廣性。