周松
摘要:本文對(duì)當(dāng)前自動(dòng)閱卷系統(tǒng)中編程題的現(xiàn)狀進(jìn)行了分析,并提出了使用代入法解決完善程序題和使用文件輸出法解決編程題兩種解決方法,同時(shí)給出了一些實(shí)現(xiàn)細(xì)節(jié)。
關(guān)鍵詞:自動(dòng)閱卷;編程題;VBA
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 論文編號(hào):1674-2117(2016)23-0071-03
現(xiàn)狀和問(wèn)題
在現(xiàn)代教學(xué)中,計(jì)算機(jī)課程的閱卷系統(tǒng)越來(lái)越多,從Office應(yīng)用到各種高級(jí)編程語(yǔ)言都有,不過(guò)計(jì)算機(jī)本身的智能化程度不高,主要是按照事先設(shè)定好的程序運(yùn)行的,所以在批改選擇題時(shí)非常有優(yōu)勢(shì),速度快,準(zhǔn)確率高,但對(duì)主觀程度比較高的,如完善程序,特別是編寫(xiě)程序,很多閱卷系統(tǒng)還解決得不夠好,而編程題恰恰又是計(jì)算機(jī)編程語(yǔ)言課程考試的常見(jiàn)題型。
選擇題的實(shí)現(xiàn)已經(jīng)非常成熟,本文不再討論。填空、簡(jiǎn)答、論述等題型也有了各種解決方法,雖然效果還不是很理想,但技術(shù)也是在不斷進(jìn)步的,這部分也不是本文要討論的。本文以VBA為例,主要討論主觀性很強(qiáng)且會(huì)有多種不同答案但結(jié)果又都正確的完善程序和編寫(xiě)程序兩種題型的閱卷方法。
完善程序題
1.一般的解決方法
完善程序題其實(shí)是填空題的一種,但里面填寫(xiě)的是程序的代碼,下面就是一個(gè)完善程序的例子。
題目:從大到小輸入3個(gè)數(shù),如不符合要求則顯示“輸入不符合要求”,在空白處填入程序代碼完善程序(如圖1)。
一般的閱卷程序都在用枚舉答案的方法,如將可以想到的x > y And y > z和y < x And z < x等答案和學(xué)生的答案進(jìn)行比較,如果相符則判對(duì),否則扣分。但其實(shí)這道題目還有很多其他答案也是正確的,如y < x And x > z和x > y And z < x,甚至也會(huì)有學(xué)生寫(xiě)成Not x <= y And Not y <= z和Not (x <= y Or y <= z)等答案。枚舉是一種方法,但只適應(yīng)于答案非常單一的題目,因此建議盡量不使用。下面筆者將介紹一種代入法,將學(xué)生的答案代入到閱卷系統(tǒng)中,根據(jù)生成的表達(dá)式結(jié)果來(lái)判定答案是否正確。
2.代入法
代入法就是將學(xué)生寫(xiě)的答案代入到事先編寫(xiě)好的程序中進(jìn)行驗(yàn)證,圖2中的函數(shù)t15就是為上題編寫(xiě)的驗(yàn)證函數(shù),其中的參數(shù)x、y、z為輸入的三個(gè)數(shù),sExpression為獲得的學(xué)生編寫(xiě)的答案。在t15函數(shù)中的第三行,就是On Error和Exit Function之間是一個(gè)空行,學(xué)生的代碼將代入到這里。
那么如何在一個(gè)程序中動(dòng)態(tài)地插入一行代碼并運(yùn)行呢?這里要用到module對(duì)象中的ProcStartLine屬性和ReplaceLine方法。ProcStartLine屬性是指返回一個(gè)值,該值標(biāo)識(shí)指定的過(guò)程的起始行。ReplaceLine方法是指在標(biāo)準(zhǔn)模塊中替換指定行。下面給出代入法的代碼,如圖3。
其中:①score是模塊的名稱(chēng)。②sExpression = "t15 = " & "Not x <= y And Not x <= y"是將學(xué)生的答案存儲(chǔ)在sExpression中。最終sExpression中存放的是“t15 = Not x <= y And Not y <= z”,這樣如果“Not x <= y And Not y <= z”計(jì)算正確,則函數(shù)t15返回值為true,否則返回false。③lineNum = md.ProcStartLine("t15", vbext_pk_Proc)+3得到要將sExpression代入到t15函數(shù)的位置。④md.ReplaceLine lineNum, sExpression的功能是進(jìn)行替換。將sExpression代入到t15函數(shù)中。⑤MsgBox(IIf(t15(5, 4, 3, sExpression), "得分", "不得分"))調(diào)用代入了學(xué)生答案的t15函數(shù),得到結(jié)果。
3.注意事項(xiàng)
上述代碼中給出的making()過(guò)程是一個(gè)演示程序,其中的"Not x <= y And Not y<= z"為學(xué)生編寫(xiě)的答案,應(yīng)該是從學(xué)生的答案中提取,而不是像本例中這樣直接寫(xiě)出來(lái)。另外對(duì)答案的處理使用了代碼MsgBox(IIf(t15(5, 4, 3, sExpression), "得分", "不得分")),對(duì)于結(jié)果只是進(jìn)行了顯示,在實(shí)際應(yīng)用中應(yīng)該是將結(jié)果寫(xiě)入到學(xué)生的成績(jī)表中。而且在函數(shù)t15(5, 4, 3, sExpression)中使了5, 4, 3為測(cè)試參數(shù),應(yīng)該按照軟件測(cè)試的方法給出測(cè)試數(shù)據(jù),多次調(diào)用t15函數(shù)進(jìn)行驗(yàn)證。
編程題
編程題是主觀性非常強(qiáng)的題目,每位學(xué)生的答案都有可能不一樣,如果根據(jù)學(xué)生每句代碼是怎么編寫(xiě)的給分是不現(xiàn)實(shí)的,所以好的解決方法是根據(jù)結(jié)果給分。具體方法是將學(xué)生的答案寫(xiě)入到一個(gè)文件中,然后閱卷系統(tǒng)讀取該文件中的內(nèi)容,判斷答案是否正確。
將答案寫(xiě)入文件的代碼如圖4所示,其中"answer.dat"為答案文件名,tAnwser是學(xué)生的答案。
在具體實(shí)現(xiàn)時(shí)可以采用兩種方法,一種是事先為學(xué)生搭建好程序的框架,上面的文件輸出代碼寫(xiě)在最后,要求學(xué)生不能修改已有的代碼,完成編碼后需運(yùn)行代碼。還有一種方法就是利用Module.InsertLines(Line, String)方法將文件輸出代碼插入到學(xué)生編寫(xiě)的代碼的后面來(lái)輸出答案。
結(jié)論
本文提出了準(zhǔn)確評(píng)判學(xué)生編寫(xiě)的程序的方法,解決了程序設(shè)計(jì)上機(jī)考試中主觀題評(píng)判不夠準(zhǔn)確的問(wèn)題。提供的方法簡(jiǎn)單、容易實(shí)現(xiàn),大大提高了判卷的準(zhǔn)確性。這里還需要特別說(shuō)明的是,學(xué)生編寫(xiě)的表達(dá)式或代碼會(huì)有錯(cuò)誤,所以在代碼中一定要使用on error代碼來(lái)對(duì)可能的錯(cuò)誤進(jìn)行處理,以保證閱卷的順利進(jìn)行。