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