文/黎青霞 楊乘
對(duì)于當(dāng)前紙質(zhì)化的C語言試卷或是無紙化的C語言試卷,其包含的題型可以分為以下幾個(gè)大類:單選題、判斷題、填空題、程序改錯(cuò)題和便編程題。選擇題、判斷題、填空題、程序改錯(cuò)題這幾類題型客觀性較強(qiáng),無論是人工閱卷還是機(jī)器閱卷都幾乎不存在爭議。編程題主觀性較強(qiáng),在人工閱卷的過程中難免會(huì)存在爭議,對(duì)于機(jī)器閱卷而言,這更是一個(gè)難題。編程題具有很強(qiáng)的靈活性,有的評(píng)分系統(tǒng)為降低系統(tǒng)實(shí)現(xiàn)的難度,構(gòu)建系統(tǒng)時(shí)幾乎沒有考慮人工閱卷的思維方式,在評(píng)判編程題時(shí)只考慮結(jié)果分值而忽略過程分值。學(xué)生編寫的代碼運(yùn)行結(jié)果與標(biāo)準(zhǔn)答案一致,則獲得滿分,運(yùn)行結(jié)果與標(biāo)準(zhǔn)答案不同,則判為零分;有的評(píng)分系統(tǒng)雖然考慮了人工閱卷的思維方式,但并沒有很好地與之相契合,過程分值的判斷依據(jù)不是很合理。針對(duì)當(dāng)前編程題評(píng)分系統(tǒng)的現(xiàn)狀,希望能研究出一個(gè)比較合理的C語言編程題智能評(píng)分系統(tǒng),一方面減輕教師的工作量,將以往用于批改試卷的大量時(shí)間節(jié)約下來;另一方面,對(duì)于C語言這種實(shí)踐操作性高的學(xué)科,在線考試系統(tǒng)更能貼合其對(duì)操作性的要求。許多學(xué)校因評(píng)分系統(tǒng)的問題還是會(huì)選擇紙質(zhì)化的考試形式,一個(gè)合理的評(píng)分系統(tǒng)可以提升在線考試系統(tǒng)的價(jià)值,以更好的達(dá)到計(jì)算機(jī)評(píng)判系統(tǒng)的公平性、情理性,會(huì)促進(jìn)學(xué)校對(duì)其的使用。
當(dāng)前比較普遍的編程題智能評(píng)分系統(tǒng)采用的評(píng)分方法主要分為三類:
(1)軟件質(zhì)量度量方法;
(2)動(dòng)態(tài)測試方法;
(3)靜態(tài)分析方法。
“軟件質(zhì)量度量方法是立足于軟件復(fù)雜性的程度和程序的特征來評(píng)價(jià)學(xué)生程序的質(zhì)量,從而給學(xué)生編寫的程序評(píng)分。它的劣勢(shì)在于分析源代碼結(jié)構(gòu)時(shí)理解性較差,不能理解程序的意思,單靠該技術(shù)給學(xué)生編寫的程序評(píng)分很難得到合乎情理的結(jié)果。”
動(dòng)態(tài)測試方法指通過運(yùn)行需要測試的程序,檢查運(yùn)行的結(jié)果與預(yù)期結(jié)果的差異,并分析運(yùn)行效率等性能。這種方法由三部分組成:構(gòu)造測試實(shí)例、執(zhí)行程序、分析程序的輸出結(jié)果。但學(xué)生編寫的程序有時(shí)要么會(huì)出現(xiàn)語法錯(cuò)誤,導(dǎo)致程序無法通過編譯;要么會(huì)出現(xiàn)語義錯(cuò)誤而導(dǎo)致死循環(huán),得不到程序執(zhí)行的結(jié)果,最后的評(píng)分為零,這樣的評(píng)分標(biāo)準(zhǔn)不符合教師人工閱卷的標(biāo)準(zhǔn)。該評(píng)分方法還很有可能忽略學(xué)生設(shè)計(jì)程序題的思路,無法還原學(xué)生掌握知識(shí)的真實(shí)程度,不利于教師對(duì)學(xué)生的學(xué)習(xí)做客觀、合理的評(píng)價(jià)。
靜態(tài)分析方法是指不運(yùn)行需要測試的程序本身,即無需編譯學(xué)生編寫的代碼,僅通過分析或檢查學(xué)生編寫的程序的語法、結(jié)構(gòu)、過程、接口等以及與標(biāo)準(zhǔn)答案進(jìn)行對(duì)比給出學(xué)生成績。該方法會(huì)運(yùn)用軟件進(jìn)行代碼的質(zhì)量度量,其原理是根據(jù)標(biāo)準(zhǔn)代碼中指定的一些特征,如:關(guān)鍵字、骨架代碼、標(biāo)識(shí)符長度等,來與學(xué)生編寫的代碼進(jìn)行比對(duì),給與分值。但由于學(xué)生編寫的代碼可能會(huì)存在結(jié)構(gòu)的問題或是不規(guī)范現(xiàn)象,采用這種方法搭建的評(píng)分系統(tǒng)在應(yīng)用時(shí)會(huì)帶來實(shí)用性的問題。同時(shí),如果學(xué)生編寫的代碼有語法錯(cuò)誤靜態(tài)評(píng)分方法也無法進(jìn)行評(píng)判。
國外對(duì)編程題評(píng)分系統(tǒng)的研究起步較早,“Douce 等人將其發(fā)展過程分為三個(gè)階段:早期的自動(dòng)評(píng)分系統(tǒng)、基于工具的評(píng)分系統(tǒng)和面向 Web 的評(píng)分系統(tǒng)。”國外在第一階段中具有代表性的評(píng)分系統(tǒng)評(píng)判Algol語言的程序自動(dòng)評(píng)分系統(tǒng)。該系統(tǒng)通過對(duì)程序題進(jìn)行動(dòng)態(tài)測試和數(shù)值分析等方法,實(shí)現(xiàn)了如下的功能:提供測試數(shù)據(jù)、記錄運(yùn)行時(shí)間和維護(hù)一個(gè)“成績冊(cè)”。第二代評(píng)分系統(tǒng)結(jié)合了已經(jīng)存在的工具箱和由操作系統(tǒng)和編程環(huán)境提供的工具,更重要的是以命令行或圖形用戶界面的形式展現(xiàn)出來,操作者應(yīng)用起來比較方便。第三代評(píng)分系統(tǒng)最大的特點(diǎn)是面向 Web,同時(shí)結(jié)合了富有經(jīng)驗(yàn)的測試技術(shù)和模塊。
國內(nèi)對(duì)編程題評(píng)分系統(tǒng)的研究起步較晚,2000年后一些權(quán)威的高校陸續(xù)自行開發(fā)建立編程語言的在線測評(píng)平臺(tái)。蘇小紅教授利用靜態(tài)分析的方法進(jìn)行代碼測試,在考慮到代碼風(fēng)格與軟件質(zhì)量度量的基礎(chǔ)上,通過提取抽象語法樹的方式進(jìn)行程序的形式轉(zhuǎn)換?!袄钣篮蒲芯砍隽嘶诔绦蚶斫獾淖詣?dòng)評(píng)分策略,該策略利用程序理解的常規(guī)過程以及基本策略作為依據(jù)制定編程題機(jī)器評(píng)分的方案?!盵4]馬培軍等人對(duì)于程序理解的評(píng)分模型做了進(jìn)一步的研究,采用系統(tǒng)依賴圖作為程序之間的中間表示形式。在進(jìn)一步優(yōu)化后將學(xué)生編寫的代碼與標(biāo)準(zhǔn)代碼的依賴圖進(jìn)行匹配,以此為依據(jù)進(jìn)行編程題的評(píng)分。
現(xiàn)存的國內(nèi)外編程題的評(píng)分系統(tǒng)在一定程度上實(shí)現(xiàn)了機(jī)器評(píng)閱編程題的目標(biāo),但大多數(shù)評(píng)分系統(tǒng)的評(píng)分思維向人工閱卷的思維靠攏的情況并不樂觀。如果能結(jié)合動(dòng)態(tài)測試與靜態(tài)分析的方法研究出針對(duì)中職學(xué)校C語言課程的編程題智能評(píng)分系統(tǒng),并使其評(píng)分思維向人工閱卷的思維靠攏,這樣的系統(tǒng)在中職學(xué)校的利用價(jià)值是可觀的。
B/S結(jié)構(gòu)即瀏覽器和服務(wù)器結(jié)構(gòu)。客戶機(jī)上只要安裝一個(gè)瀏覽器,服務(wù)器安裝上數(shù)據(jù)庫,瀏覽器就可以通過Web Server同數(shù)據(jù)庫進(jìn)行數(shù)據(jù)交互。
JSP(Java Server Pages)服務(wù)器端頁面技術(shù)。JSP通常返回給客戶端的是HTML文本,客戶端只要有瀏覽器就能進(jìn)行瀏覽。
Java是一門面向?qū)ο缶幊陶Z言,其程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。
Eclipse是一種可擴(kuò)展的開放源代碼IDE。Eclipse允許在同一IDE中集成來自不同供應(yīng)商的工具,并實(shí)現(xiàn)了工具之間的互操作性。
MySQL是一個(gè)可用于各種流行操作系統(tǒng)平臺(tái)的關(guān)系數(shù)據(jù)庫系統(tǒng),它具有客戶機(jī)/服務(wù)器體系結(jié)構(gòu)的分布式數(shù)據(jù)庫管理系統(tǒng)。
隨著C語言在線考試系統(tǒng)的不斷優(yōu)化,對(duì)于編程題評(píng)分的合理性與準(zhǔn)確性,機(jī)器評(píng)閱思維的人性化已成為人們追求的目標(biāo)。本研究針對(duì)的群體主要是中職學(xué)生,與大學(xué)生相比他們學(xué)習(xí)的C語言知識(shí)相對(duì)簡單些。他們更多的是希望通過C語言的學(xué)習(xí)提升自我的邏輯思維、對(duì)程序的理解能力以及一定程度上的編碼能力。在這樣的情況下實(shí)現(xiàn)一個(gè)根據(jù)算法過程評(píng)分的系統(tǒng),給與學(xué)生合理的分?jǐn)?shù)就顯得極為有必要。本文的主要研究內(nèi)容如下:
(1)C語言編程題智能評(píng)分系統(tǒng)的評(píng)分原理。該系統(tǒng)的評(píng)分原理包括對(duì)學(xué)生編寫的程序運(yùn)行結(jié)果的分析、代碼中關(guān)鍵字的分析、骨架代碼的分析以及將學(xué)生編寫的代碼與標(biāo)準(zhǔn)代碼進(jìn)行相似度的匹配。
(2)C語言編程題智能評(píng)分系統(tǒng)使用的技術(shù)。該系統(tǒng)使用的技術(shù)包括B/S架構(gòu)、JSP技術(shù)、Java編程語言、Eclipse開發(fā)平臺(tái)、MySQL數(shù)據(jù)庫。
(3)C語言編程題智能評(píng)分系統(tǒng)的組成部分。該系統(tǒng)組成部分包括數(shù)據(jù)庫關(guān)系模式,該模式包括學(xué)生登陸信息表、教師登陸信息表、管理員登陸信息表、試題庫信息表、學(xué)生成績信息表、學(xué)生考試分析信息表等;登錄功能模塊,該模塊劃分為管理員端、教師端、學(xué)生端;主界面、在線考試管理模塊、編程題評(píng)分管理模塊、修改用戶信息模塊等。
圖1:C語言編程題智能評(píng)分系統(tǒng)
本文立足于當(dāng)下C語言在線考試系統(tǒng)的現(xiàn)狀,找出了一些使編程題在線評(píng)閱更合理應(yīng)考慮的問題。結(jié)合現(xiàn)狀要考慮的問題有:編程題靈活性很強(qiáng),編寫的代碼形式并不唯一,如何解決代碼的多樣性問題;編寫的程序運(yùn)行結(jié)果不正確怎么評(píng)分;編寫的程序不能通過編譯怎么評(píng)分。在這些問題的基礎(chǔ)上結(jié)合了C語言代碼骨架與編譯報(bào)錯(cuò)的情況設(shè)計(jì)了一套編程題評(píng)分算法流程:
①先編譯學(xué)生編寫的代碼,判斷是否編譯成功;②編譯成功則將學(xué)生程序運(yùn)行的結(jié)果與標(biāo)準(zhǔn)答案進(jìn)行對(duì)比;③判斷對(duì)比結(jié)果是否一致;④結(jié)果一致,進(jìn)行⑥;⑤結(jié)果不一致,先扣除一定分?jǐn)?shù)再進(jìn)行⑥;⑥將學(xué)生編寫的代碼與標(biāo)準(zhǔn)代碼模板進(jìn)行匹配,如果匹配程度達(dá)到最低下限,則給與匹配滿分,否則扣除一定分?jǐn)?shù),再進(jìn)行第⑦步;⑧編譯不成功,根據(jù)報(bào)錯(cuò)的個(gè)數(shù)扣除一定分?jǐn)?shù),再進(jìn)行⑥;⑦統(tǒng)計(jì)編程題的最終分值。流程圖如圖1所示。
本文研究的C語言編程題智能評(píng)分系統(tǒng)立足于中職學(xué)校的C語言課程特點(diǎn),與其他評(píng)分系統(tǒng)相比針對(duì)性較強(qiáng)。開發(fā)過程中所要考慮的問題基本來源于中職學(xué)校的C語言課程,在實(shí)際使用的過程中也無需將課程與系統(tǒng)生硬的結(jié)合,而是根據(jù)課程需要利用系統(tǒng),減輕教師批改試卷的工作量,系統(tǒng)的分析學(xué)生知識(shí)的掌握情況,以更好的促進(jìn)學(xué)科的教學(xué)效率。該系統(tǒng)面向的是中職學(xué)校的C語言課程,所以實(shí)現(xiàn)該系統(tǒng)需耗費(fèi)的人力、物力相對(duì)較少,開發(fā)周期占用的時(shí)間也相對(duì)較少而且還方便進(jìn)行測試。當(dāng)前雖已有多種多樣的在線考試系統(tǒng),但并沒有一種專門適用于中職學(xué)校的C語言考試系統(tǒng)。某些中職學(xué)校即使購買了在線考試系統(tǒng),在使用的過程中可能會(huì)出現(xiàn)課程與考試系統(tǒng)的生硬結(jié)合,在后期的使用當(dāng)中維護(hù)系統(tǒng)將會(huì)耗費(fèi)大量時(shí)間,也會(huì)花費(fèi)大量的資金和人力。如果一開始的開發(fā)就立足于中職學(xué)校的C語言課程,所消耗的時(shí)間、資金以及后期的使用和維護(hù)都相對(duì)較少。
本文研究的系統(tǒng)旨在結(jié)合動(dòng)態(tài)測試與靜態(tài)分析的方法,使系統(tǒng)能借助相應(yīng)的編譯工具完成對(duì)程序的編譯與運(yùn)行。以及對(duì)程序進(jìn)行分析,分析其中的詞法、語法并與標(biāo)準(zhǔn)程序模板進(jìn)行相似度的匹配。這種動(dòng)靜結(jié)合的方法有助于改善以往只考慮結(jié)果的編程題評(píng)分系統(tǒng),使C語言編程題智能評(píng)分系統(tǒng)評(píng)判編程題的“思維”更接近于人工評(píng)判編程題的思維。在閱卷的過程中實(shí)現(xiàn)評(píng)分的多步走、合理走,讓該系統(tǒng)在執(zhí)行過程中像人腦一樣工作。該編程題評(píng)分系統(tǒng)雖然在一定的程度上降低了計(jì)算機(jī)自動(dòng)評(píng)閱編程題的不合理性,減輕了教師的部分工作量,但與人腦相比還存在較大的機(jī)械性。如果能在教師模塊中添加一個(gè)計(jì)算每道題正確率的試題反饋結(jié)果模塊,教師就可以借助每道題的正確率來獲知班上學(xué)生對(duì)某知識(shí)的掌握程度并對(duì)后續(xù)的教學(xué)做相應(yīng)的改進(jìn),再提升該學(xué)科的教學(xué)效率。