摘 要:目前C語(yǔ)言編程題的自動(dòng)閱卷主要采用比對(duì)程序運(yùn)行結(jié)果的方法,這種方法由于不查看學(xué)生的程序內(nèi)容,因此評(píng)分有失公允并且不能反映學(xué)生的真實(shí)水平。本系統(tǒng)采用動(dòng)態(tài)評(píng)閱、結(jié)果對(duì)比、靜態(tài)評(píng)閱相結(jié)合的方法,使評(píng)分結(jié)果公正、準(zhǔn)確,更加接近于人工閱卷。該系統(tǒng)已經(jīng)用于實(shí)際的教學(xué)環(huán)節(jié)中,收到了良好的效果。
關(guān)鍵詞:C語(yǔ)言;編程題;自動(dòng)閱卷
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
1 引言(Introduction)
目前,客觀題的自動(dòng)閱卷技術(shù)已經(jīng)成熟運(yùn)用在各類(lèi)考試系統(tǒng)中,但主觀題的閱卷卻往往采用人工批改。在C語(yǔ)言的教學(xué)和考核過(guò)程中,編程題是C語(yǔ)言的常見(jiàn)題型,也是最能反映考生水平的考試題型。對(duì)于編程題,雖然程序運(yùn)行結(jié)果是有唯一標(biāo)準(zhǔn)的,但程序的表達(dá)方式往往因人而異,難以統(tǒng)一。編程題的自動(dòng)閱卷方法缺少完美的解決方法,一般需要人工輔助批改。
目前大多數(shù)閱卷方法是通過(guò)檢查考生運(yùn)行程序時(shí)生成結(jié)果文件的正確性來(lái)給分。如全國(guó)計(jì)算機(jī)等級(jí)考試(NCRE)上機(jī)考試中的編程題評(píng)閱系統(tǒng),就是依賴(lài)程序的運(yùn)行結(jié)果。此時(shí)如果考生程序中出現(xiàn)一個(gè)很小的錯(cuò)誤,就會(huì)導(dǎo)致一個(gè)幾乎接近正確的程序因無(wú)法運(yùn)行而沒(méi)有生成結(jié)果文件,考生將丟失全部分?jǐn)?shù)[1]。另一方面,有些題目通過(guò)數(shù)學(xué)計(jì)算或其他方式,可以直接做出一個(gè)正確的結(jié)果文件,無(wú)需編寫(xiě)程序,如果考生利用這點(diǎn)來(lái)投機(jī)取巧,照樣可以獲得滿(mǎn)分,這是很不公平的。這種評(píng)閱方法雖然簡(jiǎn)單,但評(píng)分很不科學(xué),不能反映出考生的真實(shí)水平。
經(jīng)過(guò)多年的研究和實(shí)踐,我們建立了一個(gè)切實(shí)可行的編程題自動(dòng)閱卷系統(tǒng),本系統(tǒng)采用動(dòng)態(tài)評(píng)閱、結(jié)果對(duì)比、靜態(tài)評(píng)閱相結(jié)合的方法,把試題的總分?jǐn)?shù)分解為結(jié)果分、語(yǔ)法分、詞法分三個(gè)部分。在進(jìn)行程序評(píng)閱時(shí),每部分單獨(dú)評(píng)分,最后累加各部分分?jǐn)?shù)之和得出總分。
2 閱卷過(guò)程(Marking process)
閱卷流程設(shè)計(jì)如圖1所示。
圖1 閱卷流程
Fig.1 marking process
具體步驟如下:
(1)先檢查考生文件夾中的學(xué)生提交的考試程序,如發(fā)現(xiàn)學(xué)生沒(méi)有做過(guò)該題,則直接給0分,同時(shí)閱卷結(jié)束。
(2)對(duì)學(xué)生保存過(guò)的程序進(jìn)行規(guī)范化處理[2],先刪除程序注釋語(yǔ)句,合并連續(xù)多個(gè)空格,保留一個(gè),然后增加一個(gè)程序塊,該程序塊的功能是自動(dòng)把程序結(jié)果輸出到某個(gè)指定文件。這樣,只要學(xué)生程序有輸出結(jié)果,這個(gè)結(jié)果就能自動(dòng)輸出到文件。
(3)通過(guò)tcc命令對(duì)考生程序進(jìn)行編譯處理,如能生成可執(zhí)行文件,表示程序沒(méi)有語(yǔ)法錯(cuò)誤,語(yǔ)法分為滿(mǎn)分。接著運(yùn)行可執(zhí)行文件,如沒(méi)有生成結(jié)果文件,結(jié)果分計(jì)為0分;如有結(jié)果文件,根據(jù)結(jié)果文件相似度給分,結(jié)果完全正確時(shí)給滿(mǎn)分。
(4)如沒(méi)有生成可執(zhí)行文件,表示程序有語(yǔ)法錯(cuò)誤,通過(guò)gcc命令可以輕松獲取c程序的編譯錯(cuò)誤信息文件,根據(jù)錯(cuò)誤信息,盡可能地改正程序中的錯(cuò)誤,并根據(jù)錯(cuò)誤數(shù)目給出相應(yīng)語(yǔ)法分,同時(shí)結(jié)果分計(jì)為0分。
(5)進(jìn)行詞法分析和關(guān)鍵詞比對(duì)[3],給出詞法分。
(6)計(jì)算總分,閱卷結(jié)束。
3 閱卷關(guān)鍵技術(shù)(Marking key technology)
(1)編譯和運(yùn)行問(wèn)題
假設(shè)prog1.c為源文件,編譯成功后會(huì)生成目標(biāo)文件prog1.obj和可執(zhí)行文件prog1.exe,通過(guò)判斷編譯之后是否生成此文件來(lái)判斷編譯是否成功。部分程序雖然沒(méi)有語(yǔ)法錯(cuò)誤,能編譯成功,但不一定能生成結(jié)果文件。特別是出現(xiàn)死循環(huán)時(shí),運(yùn)行的程序不能自行結(jié)束,系統(tǒng)用一個(gè)計(jì)時(shí)程序來(lái)解決這個(gè)問(wèn)題,即在規(guī)定時(shí)間內(nèi)檢查程序進(jìn)程,發(fā)現(xiàn)一直沒(méi)有結(jié)束,就強(qiáng)行退出。
(2)語(yǔ)法分計(jì)算
通過(guò)命令“gcc 源文件2>錯(cuò)誤結(jié)果文件”可以輕松獲取c程序的編譯錯(cuò)誤信息文件,例如:“gcc prog1.c 2>1.txt”表示編譯prog1.c文件,并把出錯(cuò)信息生成到文件1.txt中。當(dāng)編譯通過(guò)時(shí)文件內(nèi)容為空,否則顯示出錯(cuò)信息,基本格式為:“文件名:行號(hào):錯(cuò)誤提示”。例如:“prog1.c: In function `main':prog1.c:10: error: syntax error before "for" token”指出在main函數(shù)內(nèi),第10行中“for”前面有錯(cuò)。大部分情況下,for為首個(gè)關(guān)鍵字,故錯(cuò)誤在第9行末尾,往往是由于丟失分號(hào)引起的。同理 “'XX'undeclared(first use in this function)”表示在使用XX變量前未定義;“missing terminating XXcharacter”表示丟失XX符號(hào),這些錯(cuò)誤均很容易改正。每改過(guò)一行錯(cuò)誤,記錄下行號(hào)并累計(jì)錯(cuò)誤數(shù)。錯(cuò)誤改正后重新編譯程序,如仍有錯(cuò)誤,導(dǎo)致編譯不通過(guò),則根據(jù)新錯(cuò)誤的行號(hào)進(jìn)行錯(cuò)誤數(shù)累加,對(duì)已統(tǒng)計(jì)過(guò)的行號(hào)不重復(fù)計(jì)算。最后根據(jù)總錯(cuò)誤數(shù)計(jì)算出語(yǔ)法得分。
(3)結(jié)果分統(tǒng)計(jì)
由于已準(zhǔn)備好prog1.cint測(cè)試數(shù)據(jù)文件,學(xué)生程序也事先經(jīng)過(guò)了規(guī)范化處理,只要學(xué)生程序有輸出結(jié)果,就會(huì)生成格式一致的prog1.cout結(jié)果文件。測(cè)試數(shù)據(jù)文件中事先準(zhǔn)備多行測(cè)試數(shù)據(jù),對(duì)應(yīng)結(jié)果文件中也有多行結(jié)果。評(píng)分時(shí)只需將學(xué)生程序結(jié)果文件讀取并存放到二維數(shù)組中,和正確的結(jié)果文件進(jìn)行逐行比對(duì),然后根據(jù)相似度來(lái)獲得相應(yīng)的結(jié)果分值。如果學(xué)生程序有死循環(huán)等問(wèn)題,則沒(méi)有結(jié)果輸出,結(jié)果分為零分。
(4)詞法分統(tǒng)計(jì)
在人工閱卷時(shí),老師會(huì)忽略不重要的錯(cuò)誤,看關(guān)鍵語(yǔ)句是否正確,在自動(dòng)閱卷過(guò)程中具體分為結(jié)構(gòu)分析和關(guān)鍵詞比對(duì)兩步。結(jié)構(gòu)分析是指先根據(jù)算法,將程序答案分割成各個(gè)語(yǔ)句模塊,如聲明語(yǔ)句、賦值語(yǔ)句、選擇語(yǔ)句、循環(huán)語(yǔ)句、輸入輸出語(yǔ)句等。學(xué)生程序中只要有相應(yīng)模塊就給一定分值。
關(guān)鍵詞對(duì)比是指我們把標(biāo)準(zhǔn)答案中的關(guān)鍵詞,和學(xué)生答案中的關(guān)鍵詞進(jìn)行比較,根據(jù)關(guān)鍵詞的個(gè)數(shù)給分。具體如下:編程題的源程序可以看成是多行的字符串,對(duì)程序的字符串進(jìn)行掃描和分解,分離出一個(gè)個(gè)“單詞”符號(hào)。這些單詞符號(hào)就是c程序的基本詞法單位。這些單詞符號(hào)可以分成關(guān)鍵字、常數(shù)、標(biāo)識(shí)符、運(yùn)算符、界限符五類(lèi)。在c語(yǔ)言里常用關(guān)鍵字有32個(gè),如int、float,char等;常數(shù)包括整型、浮點(diǎn)型、字符型等;標(biāo)識(shí)符可以用作變量名;運(yùn)算符有算術(shù)運(yùn)算符、邏輯運(yùn)算符等;界限符有逗號(hào)、分號(hào)、括號(hào)等。分別放到不同數(shù)組中,進(jìn)行對(duì)比。
4 結(jié)論(Conclusion)
基于上述編程題的自動(dòng)閱卷系統(tǒng)已經(jīng)開(kāi)始使用,系統(tǒng)功能可以全部實(shí)現(xiàn),對(duì)于正確的考生程序,系統(tǒng)能100%準(zhǔn)確評(píng)分,對(duì)于存在錯(cuò)誤的學(xué)生程序,與人工評(píng)分的結(jié)果相差無(wú)幾,避免了極端分?jǐn)?shù)的出現(xiàn)。同時(shí)本系統(tǒng)能減輕教師批改作業(yè)的負(fù)擔(dān),使學(xué)生的成績(jī)更加公正、合理,大大提高閱卷效率,節(jié)省教學(xué)資源。采用這種方法對(duì)編程題進(jìn)行自動(dòng)閱卷,注重考生程序的內(nèi)在結(jié)構(gòu),更加符合人工閱卷的思想,同時(shí)本系統(tǒng)也適用于其他程序設(shè)計(jì)語(yǔ)言課程,具有很好的實(shí)用價(jià)值和應(yīng)用前景。
參考文獻(xiàn)(References)
[1] 喬善平,劉振,朱波.編程題的計(jì)算機(jī)閱卷[J].計(jì)算機(jī)應(yīng)用研究,
2004,8:229-231.
[2] 馬培軍,王甜甜,蘇小紅.基于程序理解的編程題自動(dòng)評(píng)分方
法[J].計(jì)算機(jī)研究與發(fā)展2009,46(7):1136-1142.
[3] 溫湘敏,胡琳.依據(jù)程序依賴(lài)關(guān)系匹配度的C語(yǔ)言程序設(shè)計(jì)題
評(píng)分方法[J].南昌大學(xué)學(xué)報(bào)(理科版),2013(10):502-506.
作者簡(jiǎn)介:
趙曉靜(1973-),女,碩士,講師.研究領(lǐng)域:計(jì)算機(jī)應(yīng)用.endprint
摘 要:目前C語(yǔ)言編程題的自動(dòng)閱卷主要采用比對(duì)程序運(yùn)行結(jié)果的方法,這種方法由于不查看學(xué)生的程序內(nèi)容,因此評(píng)分有失公允并且不能反映學(xué)生的真實(shí)水平。本系統(tǒng)采用動(dòng)態(tài)評(píng)閱、結(jié)果對(duì)比、靜態(tài)評(píng)閱相結(jié)合的方法,使評(píng)分結(jié)果公正、準(zhǔn)確,更加接近于人工閱卷。該系統(tǒng)已經(jīng)用于實(shí)際的教學(xué)環(huán)節(jié)中,收到了良好的效果。
關(guān)鍵詞:C語(yǔ)言;編程題;自動(dòng)閱卷
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
1 引言(Introduction)
目前,客觀題的自動(dòng)閱卷技術(shù)已經(jīng)成熟運(yùn)用在各類(lèi)考試系統(tǒng)中,但主觀題的閱卷卻往往采用人工批改。在C語(yǔ)言的教學(xué)和考核過(guò)程中,編程題是C語(yǔ)言的常見(jiàn)題型,也是最能反映考生水平的考試題型。對(duì)于編程題,雖然程序運(yùn)行結(jié)果是有唯一標(biāo)準(zhǔn)的,但程序的表達(dá)方式往往因人而異,難以統(tǒng)一。編程題的自動(dòng)閱卷方法缺少完美的解決方法,一般需要人工輔助批改。
目前大多數(shù)閱卷方法是通過(guò)檢查考生運(yùn)行程序時(shí)生成結(jié)果文件的正確性來(lái)給分。如全國(guó)計(jì)算機(jī)等級(jí)考試(NCRE)上機(jī)考試中的編程題評(píng)閱系統(tǒng),就是依賴(lài)程序的運(yùn)行結(jié)果。此時(shí)如果考生程序中出現(xiàn)一個(gè)很小的錯(cuò)誤,就會(huì)導(dǎo)致一個(gè)幾乎接近正確的程序因無(wú)法運(yùn)行而沒(méi)有生成結(jié)果文件,考生將丟失全部分?jǐn)?shù)[1]。另一方面,有些題目通過(guò)數(shù)學(xué)計(jì)算或其他方式,可以直接做出一個(gè)正確的結(jié)果文件,無(wú)需編寫(xiě)程序,如果考生利用這點(diǎn)來(lái)投機(jī)取巧,照樣可以獲得滿(mǎn)分,這是很不公平的。這種評(píng)閱方法雖然簡(jiǎn)單,但評(píng)分很不科學(xué),不能反映出考生的真實(shí)水平。
經(jīng)過(guò)多年的研究和實(shí)踐,我們建立了一個(gè)切實(shí)可行的編程題自動(dòng)閱卷系統(tǒng),本系統(tǒng)采用動(dòng)態(tài)評(píng)閱、結(jié)果對(duì)比、靜態(tài)評(píng)閱相結(jié)合的方法,把試題的總分?jǐn)?shù)分解為結(jié)果分、語(yǔ)法分、詞法分三個(gè)部分。在進(jìn)行程序評(píng)閱時(shí),每部分單獨(dú)評(píng)分,最后累加各部分分?jǐn)?shù)之和得出總分。
2 閱卷過(guò)程(Marking process)
閱卷流程設(shè)計(jì)如圖1所示。
圖1 閱卷流程
Fig.1 marking process
具體步驟如下:
(1)先檢查考生文件夾中的學(xué)生提交的考試程序,如發(fā)現(xiàn)學(xué)生沒(méi)有做過(guò)該題,則直接給0分,同時(shí)閱卷結(jié)束。
(2)對(duì)學(xué)生保存過(guò)的程序進(jìn)行規(guī)范化處理[2],先刪除程序注釋語(yǔ)句,合并連續(xù)多個(gè)空格,保留一個(gè),然后增加一個(gè)程序塊,該程序塊的功能是自動(dòng)把程序結(jié)果輸出到某個(gè)指定文件。這樣,只要學(xué)生程序有輸出結(jié)果,這個(gè)結(jié)果就能自動(dòng)輸出到文件。
(3)通過(guò)tcc命令對(duì)考生程序進(jìn)行編譯處理,如能生成可執(zhí)行文件,表示程序沒(méi)有語(yǔ)法錯(cuò)誤,語(yǔ)法分為滿(mǎn)分。接著運(yùn)行可執(zhí)行文件,如沒(méi)有生成結(jié)果文件,結(jié)果分計(jì)為0分;如有結(jié)果文件,根據(jù)結(jié)果文件相似度給分,結(jié)果完全正確時(shí)給滿(mǎn)分。
(4)如沒(méi)有生成可執(zhí)行文件,表示程序有語(yǔ)法錯(cuò)誤,通過(guò)gcc命令可以輕松獲取c程序的編譯錯(cuò)誤信息文件,根據(jù)錯(cuò)誤信息,盡可能地改正程序中的錯(cuò)誤,并根據(jù)錯(cuò)誤數(shù)目給出相應(yīng)語(yǔ)法分,同時(shí)結(jié)果分計(jì)為0分。
(5)進(jìn)行詞法分析和關(guān)鍵詞比對(duì)[3],給出詞法分。
(6)計(jì)算總分,閱卷結(jié)束。
3 閱卷關(guān)鍵技術(shù)(Marking key technology)
(1)編譯和運(yùn)行問(wèn)題
假設(shè)prog1.c為源文件,編譯成功后會(huì)生成目標(biāo)文件prog1.obj和可執(zhí)行文件prog1.exe,通過(guò)判斷編譯之后是否生成此文件來(lái)判斷編譯是否成功。部分程序雖然沒(méi)有語(yǔ)法錯(cuò)誤,能編譯成功,但不一定能生成結(jié)果文件。特別是出現(xiàn)死循環(huán)時(shí),運(yùn)行的程序不能自行結(jié)束,系統(tǒng)用一個(gè)計(jì)時(shí)程序來(lái)解決這個(gè)問(wèn)題,即在規(guī)定時(shí)間內(nèi)檢查程序進(jìn)程,發(fā)現(xiàn)一直沒(méi)有結(jié)束,就強(qiáng)行退出。
(2)語(yǔ)法分計(jì)算
通過(guò)命令“gcc 源文件2>錯(cuò)誤結(jié)果文件”可以輕松獲取c程序的編譯錯(cuò)誤信息文件,例如:“gcc prog1.c 2>1.txt”表示編譯prog1.c文件,并把出錯(cuò)信息生成到文件1.txt中。當(dāng)編譯通過(guò)時(shí)文件內(nèi)容為空,否則顯示出錯(cuò)信息,基本格式為:“文件名:行號(hào):錯(cuò)誤提示”。例如:“prog1.c: In function `main':prog1.c:10: error: syntax error before "for" token”指出在main函數(shù)內(nèi),第10行中“for”前面有錯(cuò)。大部分情況下,for為首個(gè)關(guān)鍵字,故錯(cuò)誤在第9行末尾,往往是由于丟失分號(hào)引起的。同理 “'XX'undeclared(first use in this function)”表示在使用XX變量前未定義;“missing terminating XXcharacter”表示丟失XX符號(hào),這些錯(cuò)誤均很容易改正。每改過(guò)一行錯(cuò)誤,記錄下行號(hào)并累計(jì)錯(cuò)誤數(shù)。錯(cuò)誤改正后重新編譯程序,如仍有錯(cuò)誤,導(dǎo)致編譯不通過(guò),則根據(jù)新錯(cuò)誤的行號(hào)進(jìn)行錯(cuò)誤數(shù)累加,對(duì)已統(tǒng)計(jì)過(guò)的行號(hào)不重復(fù)計(jì)算。最后根據(jù)總錯(cuò)誤數(shù)計(jì)算出語(yǔ)法得分。
(3)結(jié)果分統(tǒng)計(jì)
由于已準(zhǔn)備好prog1.cint測(cè)試數(shù)據(jù)文件,學(xué)生程序也事先經(jīng)過(guò)了規(guī)范化處理,只要學(xué)生程序有輸出結(jié)果,就會(huì)生成格式一致的prog1.cout結(jié)果文件。測(cè)試數(shù)據(jù)文件中事先準(zhǔn)備多行測(cè)試數(shù)據(jù),對(duì)應(yīng)結(jié)果文件中也有多行結(jié)果。評(píng)分時(shí)只需將學(xué)生程序結(jié)果文件讀取并存放到二維數(shù)組中,和正確的結(jié)果文件進(jìn)行逐行比對(duì),然后根據(jù)相似度來(lái)獲得相應(yīng)的結(jié)果分值。如果學(xué)生程序有死循環(huán)等問(wèn)題,則沒(méi)有結(jié)果輸出,結(jié)果分為零分。
(4)詞法分統(tǒng)計(jì)
在人工閱卷時(shí),老師會(huì)忽略不重要的錯(cuò)誤,看關(guān)鍵語(yǔ)句是否正確,在自動(dòng)閱卷過(guò)程中具體分為結(jié)構(gòu)分析和關(guān)鍵詞比對(duì)兩步。結(jié)構(gòu)分析是指先根據(jù)算法,將程序答案分割成各個(gè)語(yǔ)句模塊,如聲明語(yǔ)句、賦值語(yǔ)句、選擇語(yǔ)句、循環(huán)語(yǔ)句、輸入輸出語(yǔ)句等。學(xué)生程序中只要有相應(yīng)模塊就給一定分值。
關(guān)鍵詞對(duì)比是指我們把標(biāo)準(zhǔn)答案中的關(guān)鍵詞,和學(xué)生答案中的關(guān)鍵詞進(jìn)行比較,根據(jù)關(guān)鍵詞的個(gè)數(shù)給分。具體如下:編程題的源程序可以看成是多行的字符串,對(duì)程序的字符串進(jìn)行掃描和分解,分離出一個(gè)個(gè)“單詞”符號(hào)。這些單詞符號(hào)就是c程序的基本詞法單位。這些單詞符號(hào)可以分成關(guān)鍵字、常數(shù)、標(biāo)識(shí)符、運(yùn)算符、界限符五類(lèi)。在c語(yǔ)言里常用關(guān)鍵字有32個(gè),如int、float,char等;常數(shù)包括整型、浮點(diǎn)型、字符型等;標(biāo)識(shí)符可以用作變量名;運(yùn)算符有算術(shù)運(yùn)算符、邏輯運(yùn)算符等;界限符有逗號(hào)、分號(hào)、括號(hào)等。分別放到不同數(shù)組中,進(jìn)行對(duì)比。
4 結(jié)論(Conclusion)
基于上述編程題的自動(dòng)閱卷系統(tǒng)已經(jīng)開(kāi)始使用,系統(tǒng)功能可以全部實(shí)現(xiàn),對(duì)于正確的考生程序,系統(tǒng)能100%準(zhǔn)確評(píng)分,對(duì)于存在錯(cuò)誤的學(xué)生程序,與人工評(píng)分的結(jié)果相差無(wú)幾,避免了極端分?jǐn)?shù)的出現(xiàn)。同時(shí)本系統(tǒng)能減輕教師批改作業(yè)的負(fù)擔(dān),使學(xué)生的成績(jī)更加公正、合理,大大提高閱卷效率,節(jié)省教學(xué)資源。采用這種方法對(duì)編程題進(jìn)行自動(dòng)閱卷,注重考生程序的內(nèi)在結(jié)構(gòu),更加符合人工閱卷的思想,同時(shí)本系統(tǒng)也適用于其他程序設(shè)計(jì)語(yǔ)言課程,具有很好的實(shí)用價(jià)值和應(yīng)用前景。
參考文獻(xiàn)(References)
[1] 喬善平,劉振,朱波.編程題的計(jì)算機(jī)閱卷[J].計(jì)算機(jī)應(yīng)用研究,
2004,8:229-231.
[2] 馬培軍,王甜甜,蘇小紅.基于程序理解的編程題自動(dòng)評(píng)分方
法[J].計(jì)算機(jī)研究與發(fā)展2009,46(7):1136-1142.
[3] 溫湘敏,胡琳.依據(jù)程序依賴(lài)關(guān)系匹配度的C語(yǔ)言程序設(shè)計(jì)題
評(píng)分方法[J].南昌大學(xué)學(xué)報(bào)(理科版),2013(10):502-506.
作者簡(jiǎn)介:
趙曉靜(1973-),女,碩士,講師.研究領(lǐng)域:計(jì)算機(jī)應(yīng)用.endprint
摘 要:目前C語(yǔ)言編程題的自動(dòng)閱卷主要采用比對(duì)程序運(yùn)行結(jié)果的方法,這種方法由于不查看學(xué)生的程序內(nèi)容,因此評(píng)分有失公允并且不能反映學(xué)生的真實(shí)水平。本系統(tǒng)采用動(dòng)態(tài)評(píng)閱、結(jié)果對(duì)比、靜態(tài)評(píng)閱相結(jié)合的方法,使評(píng)分結(jié)果公正、準(zhǔn)確,更加接近于人工閱卷。該系統(tǒng)已經(jīng)用于實(shí)際的教學(xué)環(huán)節(jié)中,收到了良好的效果。
關(guān)鍵詞:C語(yǔ)言;編程題;自動(dòng)閱卷
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
1 引言(Introduction)
目前,客觀題的自動(dòng)閱卷技術(shù)已經(jīng)成熟運(yùn)用在各類(lèi)考試系統(tǒng)中,但主觀題的閱卷卻往往采用人工批改。在C語(yǔ)言的教學(xué)和考核過(guò)程中,編程題是C語(yǔ)言的常見(jiàn)題型,也是最能反映考生水平的考試題型。對(duì)于編程題,雖然程序運(yùn)行結(jié)果是有唯一標(biāo)準(zhǔn)的,但程序的表達(dá)方式往往因人而異,難以統(tǒng)一。編程題的自動(dòng)閱卷方法缺少完美的解決方法,一般需要人工輔助批改。
目前大多數(shù)閱卷方法是通過(guò)檢查考生運(yùn)行程序時(shí)生成結(jié)果文件的正確性來(lái)給分。如全國(guó)計(jì)算機(jī)等級(jí)考試(NCRE)上機(jī)考試中的編程題評(píng)閱系統(tǒng),就是依賴(lài)程序的運(yùn)行結(jié)果。此時(shí)如果考生程序中出現(xiàn)一個(gè)很小的錯(cuò)誤,就會(huì)導(dǎo)致一個(gè)幾乎接近正確的程序因無(wú)法運(yùn)行而沒(méi)有生成結(jié)果文件,考生將丟失全部分?jǐn)?shù)[1]。另一方面,有些題目通過(guò)數(shù)學(xué)計(jì)算或其他方式,可以直接做出一個(gè)正確的結(jié)果文件,無(wú)需編寫(xiě)程序,如果考生利用這點(diǎn)來(lái)投機(jī)取巧,照樣可以獲得滿(mǎn)分,這是很不公平的。這種評(píng)閱方法雖然簡(jiǎn)單,但評(píng)分很不科學(xué),不能反映出考生的真實(shí)水平。
經(jīng)過(guò)多年的研究和實(shí)踐,我們建立了一個(gè)切實(shí)可行的編程題自動(dòng)閱卷系統(tǒng),本系統(tǒng)采用動(dòng)態(tài)評(píng)閱、結(jié)果對(duì)比、靜態(tài)評(píng)閱相結(jié)合的方法,把試題的總分?jǐn)?shù)分解為結(jié)果分、語(yǔ)法分、詞法分三個(gè)部分。在進(jìn)行程序評(píng)閱時(shí),每部分單獨(dú)評(píng)分,最后累加各部分分?jǐn)?shù)之和得出總分。
2 閱卷過(guò)程(Marking process)
閱卷流程設(shè)計(jì)如圖1所示。
圖1 閱卷流程
Fig.1 marking process
具體步驟如下:
(1)先檢查考生文件夾中的學(xué)生提交的考試程序,如發(fā)現(xiàn)學(xué)生沒(méi)有做過(guò)該題,則直接給0分,同時(shí)閱卷結(jié)束。
(2)對(duì)學(xué)生保存過(guò)的程序進(jìn)行規(guī)范化處理[2],先刪除程序注釋語(yǔ)句,合并連續(xù)多個(gè)空格,保留一個(gè),然后增加一個(gè)程序塊,該程序塊的功能是自動(dòng)把程序結(jié)果輸出到某個(gè)指定文件。這樣,只要學(xué)生程序有輸出結(jié)果,這個(gè)結(jié)果就能自動(dòng)輸出到文件。
(3)通過(guò)tcc命令對(duì)考生程序進(jìn)行編譯處理,如能生成可執(zhí)行文件,表示程序沒(méi)有語(yǔ)法錯(cuò)誤,語(yǔ)法分為滿(mǎn)分。接著運(yùn)行可執(zhí)行文件,如沒(méi)有生成結(jié)果文件,結(jié)果分計(jì)為0分;如有結(jié)果文件,根據(jù)結(jié)果文件相似度給分,結(jié)果完全正確時(shí)給滿(mǎn)分。
(4)如沒(méi)有生成可執(zhí)行文件,表示程序有語(yǔ)法錯(cuò)誤,通過(guò)gcc命令可以輕松獲取c程序的編譯錯(cuò)誤信息文件,根據(jù)錯(cuò)誤信息,盡可能地改正程序中的錯(cuò)誤,并根據(jù)錯(cuò)誤數(shù)目給出相應(yīng)語(yǔ)法分,同時(shí)結(jié)果分計(jì)為0分。
(5)進(jìn)行詞法分析和關(guān)鍵詞比對(duì)[3],給出詞法分。
(6)計(jì)算總分,閱卷結(jié)束。
3 閱卷關(guān)鍵技術(shù)(Marking key technology)
(1)編譯和運(yùn)行問(wèn)題
假設(shè)prog1.c為源文件,編譯成功后會(huì)生成目標(biāo)文件prog1.obj和可執(zhí)行文件prog1.exe,通過(guò)判斷編譯之后是否生成此文件來(lái)判斷編譯是否成功。部分程序雖然沒(méi)有語(yǔ)法錯(cuò)誤,能編譯成功,但不一定能生成結(jié)果文件。特別是出現(xiàn)死循環(huán)時(shí),運(yùn)行的程序不能自行結(jié)束,系統(tǒng)用一個(gè)計(jì)時(shí)程序來(lái)解決這個(gè)問(wèn)題,即在規(guī)定時(shí)間內(nèi)檢查程序進(jìn)程,發(fā)現(xiàn)一直沒(méi)有結(jié)束,就強(qiáng)行退出。
(2)語(yǔ)法分計(jì)算
通過(guò)命令“gcc 源文件2>錯(cuò)誤結(jié)果文件”可以輕松獲取c程序的編譯錯(cuò)誤信息文件,例如:“gcc prog1.c 2>1.txt”表示編譯prog1.c文件,并把出錯(cuò)信息生成到文件1.txt中。當(dāng)編譯通過(guò)時(shí)文件內(nèi)容為空,否則顯示出錯(cuò)信息,基本格式為:“文件名:行號(hào):錯(cuò)誤提示”。例如:“prog1.c: In function `main':prog1.c:10: error: syntax error before "for" token”指出在main函數(shù)內(nèi),第10行中“for”前面有錯(cuò)。大部分情況下,for為首個(gè)關(guān)鍵字,故錯(cuò)誤在第9行末尾,往往是由于丟失分號(hào)引起的。同理 “'XX'undeclared(first use in this function)”表示在使用XX變量前未定義;“missing terminating XXcharacter”表示丟失XX符號(hào),這些錯(cuò)誤均很容易改正。每改過(guò)一行錯(cuò)誤,記錄下行號(hào)并累計(jì)錯(cuò)誤數(shù)。錯(cuò)誤改正后重新編譯程序,如仍有錯(cuò)誤,導(dǎo)致編譯不通過(guò),則根據(jù)新錯(cuò)誤的行號(hào)進(jìn)行錯(cuò)誤數(shù)累加,對(duì)已統(tǒng)計(jì)過(guò)的行號(hào)不重復(fù)計(jì)算。最后根據(jù)總錯(cuò)誤數(shù)計(jì)算出語(yǔ)法得分。
(3)結(jié)果分統(tǒng)計(jì)
由于已準(zhǔn)備好prog1.cint測(cè)試數(shù)據(jù)文件,學(xué)生程序也事先經(jīng)過(guò)了規(guī)范化處理,只要學(xué)生程序有輸出結(jié)果,就會(huì)生成格式一致的prog1.cout結(jié)果文件。測(cè)試數(shù)據(jù)文件中事先準(zhǔn)備多行測(cè)試數(shù)據(jù),對(duì)應(yīng)結(jié)果文件中也有多行結(jié)果。評(píng)分時(shí)只需將學(xué)生程序結(jié)果文件讀取并存放到二維數(shù)組中,和正確的結(jié)果文件進(jìn)行逐行比對(duì),然后根據(jù)相似度來(lái)獲得相應(yīng)的結(jié)果分值。如果學(xué)生程序有死循環(huán)等問(wèn)題,則沒(méi)有結(jié)果輸出,結(jié)果分為零分。
(4)詞法分統(tǒng)計(jì)
在人工閱卷時(shí),老師會(huì)忽略不重要的錯(cuò)誤,看關(guān)鍵語(yǔ)句是否正確,在自動(dòng)閱卷過(guò)程中具體分為結(jié)構(gòu)分析和關(guān)鍵詞比對(duì)兩步。結(jié)構(gòu)分析是指先根據(jù)算法,將程序答案分割成各個(gè)語(yǔ)句模塊,如聲明語(yǔ)句、賦值語(yǔ)句、選擇語(yǔ)句、循環(huán)語(yǔ)句、輸入輸出語(yǔ)句等。學(xué)生程序中只要有相應(yīng)模塊就給一定分值。
關(guān)鍵詞對(duì)比是指我們把標(biāo)準(zhǔn)答案中的關(guān)鍵詞,和學(xué)生答案中的關(guān)鍵詞進(jìn)行比較,根據(jù)關(guān)鍵詞的個(gè)數(shù)給分。具體如下:編程題的源程序可以看成是多行的字符串,對(duì)程序的字符串進(jìn)行掃描和分解,分離出一個(gè)個(gè)“單詞”符號(hào)。這些單詞符號(hào)就是c程序的基本詞法單位。這些單詞符號(hào)可以分成關(guān)鍵字、常數(shù)、標(biāo)識(shí)符、運(yùn)算符、界限符五類(lèi)。在c語(yǔ)言里常用關(guān)鍵字有32個(gè),如int、float,char等;常數(shù)包括整型、浮點(diǎn)型、字符型等;標(biāo)識(shí)符可以用作變量名;運(yùn)算符有算術(shù)運(yùn)算符、邏輯運(yùn)算符等;界限符有逗號(hào)、分號(hào)、括號(hào)等。分別放到不同數(shù)組中,進(jìn)行對(duì)比。
4 結(jié)論(Conclusion)
基于上述編程題的自動(dòng)閱卷系統(tǒng)已經(jīng)開(kāi)始使用,系統(tǒng)功能可以全部實(shí)現(xiàn),對(duì)于正確的考生程序,系統(tǒng)能100%準(zhǔn)確評(píng)分,對(duì)于存在錯(cuò)誤的學(xué)生程序,與人工評(píng)分的結(jié)果相差無(wú)幾,避免了極端分?jǐn)?shù)的出現(xiàn)。同時(shí)本系統(tǒng)能減輕教師批改作業(yè)的負(fù)擔(dān),使學(xué)生的成績(jī)更加公正、合理,大大提高閱卷效率,節(jié)省教學(xué)資源。采用這種方法對(duì)編程題進(jìn)行自動(dòng)閱卷,注重考生程序的內(nèi)在結(jié)構(gòu),更加符合人工閱卷的思想,同時(shí)本系統(tǒng)也適用于其他程序設(shè)計(jì)語(yǔ)言課程,具有很好的實(shí)用價(jià)值和應(yīng)用前景。
參考文獻(xiàn)(References)
[1] 喬善平,劉振,朱波.編程題的計(jì)算機(jī)閱卷[J].計(jì)算機(jī)應(yīng)用研究,
2004,8:229-231.
[2] 馬培軍,王甜甜,蘇小紅.基于程序理解的編程題自動(dòng)評(píng)分方
法[J].計(jì)算機(jī)研究與發(fā)展2009,46(7):1136-1142.
[3] 溫湘敏,胡琳.依據(jù)程序依賴(lài)關(guān)系匹配度的C語(yǔ)言程序設(shè)計(jì)題
評(píng)分方法[J].南昌大學(xué)學(xué)報(bào)(理科版),2013(10):502-506.
作者簡(jiǎn)介:
趙曉靜(1973-),女,碩士,講師.研究領(lǐng)域:計(jì)算機(jī)應(yīng)用.endprint