朱林琴++劉新++張輝++李亭葳
摘 要:針對傳統(tǒng)的編程題自動評分方法無法準(zhǔn)確衡量學(xué)生對知識點掌握程度的問題,提出了一種基于最小子程序匹配的C語言自動評分算法。算法首先將程序做標(biāo)準(zhǔn)化處理,然后轉(zhuǎn)換為樹形子程序,再通過搜索檢測劃分更小粒度的子程序。再根據(jù)自動評分算法完成對C語言程序的自動評分。初步實驗結(jié)果表明:自動評分算法與普通的人工評分誤差相差不大,相較于傳統(tǒng)的自動評分方法,其結(jié)果更能反映出學(xué)生的真實水平。
關(guān)鍵詞:自動評分;子程序;樹;C語言
中圖分類號:TP311 文獻(xiàn)標(biāo)志碼:A 文章編號:1673-8454(2017)17-0026-04
引言
目前國內(nèi)外有許多程序設(shè)計在線測試系統(tǒng)[1],這類線上測試系統(tǒng)對學(xué)生提交的代碼一般采取的評分方式主要分為兩大類:①動態(tài)測試[2-8],即對學(xué)生程序進(jìn)行編譯、運行。當(dāng)編譯不通過、編譯過后運行結(jié)果錯誤、運行時間超時情況出現(xiàn)時都判定提交程序無效,該方法快速、直接。②靜態(tài)評分方法[2][9-12],靜態(tài)評分通過靜態(tài)分析學(xué)生源代碼與答案模板代碼,用抽象語法樹、系統(tǒng)依賴圖、程序依賴圖等中間表現(xiàn)形式,然后從中提取特征屬性值或度量值來進(jìn)行匹配再給出分值。
動態(tài)評分是目前較多在線測試系統(tǒng)中用到的評分方法,其前提是程序能運行成功,當(dāng)程序運行結(jié)果不匹配,隨機(jī)測試用例結(jié)果等情況都以0分處理。所以對學(xué)生的考察存在片面性。國內(nèi)外學(xué)者在靜態(tài)評分的研究上有很多,有文獻(xiàn)表明通過計算控制流圖結(jié)點的相似度進(jìn)行編程題自動評分,[13]還有文獻(xiàn)表明在考生程序生成語法樹后進(jìn)行遍歷使用Levenshtein算法完成編程題自動評分。[14]靜態(tài)分析能在一定程度上得到學(xué)生程序與模板程序的相似度,從而生成學(xué)生得分。
但由于學(xué)生編寫的源代碼存在著多樣性,以及現(xiàn)有的技術(shù)對程序的理解度、語義分析的準(zhǔn)確度還不太高等原因,評分準(zhǔn)確性會受到影響。針對這些問題,本文提出了一種基于最小子程序匹配的自動評分算法,首先根據(jù)自定義試用于匹配的子程序,對源代碼經(jīng)過詞法、語法分析,依據(jù)系統(tǒng)依賴圖將程序轉(zhuǎn)換為有序樹,該樹包含不同粒度的子程序,通過構(gòu)造樹時的關(guān)系規(guī)則將子程序圖切分為多個更小粒度的子程序集合,然后對學(xué)生子程序與模板子程序采取從小到大的遞歸式匹配方式,最后結(jié)合模板程序中標(biāo)記的權(quán)值為學(xué)生程序打分。此方法對學(xué)生是否掌握某語法知識或是結(jié)構(gòu)的使用有很好的效果。
一、基本子程序的定義
子程序[15]是能被其他程序調(diào)用、在實現(xiàn)某種功能后能自動返回到調(diào)用程序的程序。其最后一條指令一定是返回指令,故能保證重新返回到調(diào)用它的程序中去。也可調(diào)用其他子程序,甚至可自身調(diào)用。為了適用于本文算法對子程序做了重新描述,子程序是能實現(xiàn)某一功能的基本語句的集合,可以嵌套、組合,沒有返回值。在這里將一個語句塊看作一個子程序。
為了能考察學(xué)生程序中是否實現(xiàn)了某些基本的功能,首先將學(xué)生程序與模板程序分解為基本的子程序,然后依靠系統(tǒng)依賴圖的數(shù)據(jù)依賴找出子程序之間的關(guān)系,每個子程序的中間表示都是一棵具有語義信息的子樹。最后對子樹進(jìn)行匹配。分析文中處理的C語言特性,劃分組成子程序的基本單元,具體形式有:聲明語句、庫函數(shù)調(diào)用語句、賦值語句、選擇分支語句、循環(huán)語句、返回語句、跳出語句。上述基本語句單位通過并列、嵌套、順序三種關(guān)系組成功能復(fù)雜的子程序。
二、基于有序樹的程序中間表示
答案模板程序和學(xué)生程序在經(jīng)過詞法分析和語法分析時,利用標(biāo)準(zhǔn)化規(guī)則在不改變語義的情況下消除語句的多樣性,同時獲得由多個不同粒度的子程序,且子程序之間通過數(shù)據(jù)流的依賴相互聯(lián)系。實現(xiàn)排序的源代碼如下所示:
#include
int main(){
int i,j,temp,a[10];
for(i=0;i<10;i++)
scanf ("%d,",&a[i]);
for(j=0;j<=9;j++) {
for (i=0;i<10-j;i++)
if (a[i]>a[i+1]){
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
for(i=1;i<10;i++)
printf("%d,",a[i] );
return 0;
}
(1)語句①依據(jù)標(biāo)準(zhǔn)化規(guī)則處理分為以下形式:
int I;int j;int temp;int a[0]
(2)依據(jù)數(shù)據(jù)流劃分出如下子程序用有序樹表示,以下根據(jù)粒度的大小進(jìn)行排序,粒度越大的子程序中組合、嵌套的其他子程序越多,從粒度大到粒度小的子程序如圖1、2、3所示:
由于篇幅限制僅展示3幅子程序有序樹圖。圖1是最小子程序。從圖1到圖2再到圖3的轉(zhuǎn)變過程可以很明顯地看出更小粒度的子程序是根據(jù)有序樹中右子樹種切分出來的,同時右子樹的子程序的第一個結(jié)點與其父親結(jié)點是嵌套關(guān)系,而左子樹是依據(jù)程序運行子程序的順序關(guān)系連接得出的。
本例中沒有出現(xiàn)多選擇分支,鑒于并列代碼的特殊性,在此規(guī)定,當(dāng)檢測到子程序是分支語句時,構(gòu)造樹型圖時該結(jié)點下的子程序從左至右,最左邊為左子樹與上面描述一致,除了該左子樹其他均為右子樹。即一個父結(jié)點有多個子結(jié)點時,最左的子結(jié)點與父結(jié)點為順序關(guān)系,其他結(jié)點與父結(jié)點為嵌套關(guān)系,且這部分的結(jié)點之間是并列關(guān)系。由于該父結(jié)點下的子結(jié)點不滿足有序樹的定義,在有大于兩個子結(jié)點的情況下,也就是存在并列關(guān)系的節(jié)點時,子結(jié)點之間是無序的。也就是說本文中用于構(gòu)造子程序有序樹不是真正意義上的有序樹。
三、最小子程序匹配評分算法
1.子程序分塊預(yù)處理
在對編程題自動評分的研究中存在的一個難點就是C語言程序設(shè)計的多樣性,為了更多更精確地讓學(xué)生程序匹配到答案模板,都會在之前對語句做語義等價轉(zhuǎn)換,轉(zhuǎn)換規(guī)則如下所示:
(1)拆分復(fù)合語句
將復(fù)合語句被拆分為等價的語句序列,有運算表達(dá)式的拆分、函數(shù)嵌套調(diào)用的拆分、聲明語句的拆分等等,讓語句化到最簡表達(dá)形式。
(2)統(tǒng)一循環(huán)結(jié)構(gòu)表示
在循環(huán)結(jié)構(gòu)中for、while和do...while之間有差別,為消除其多樣性將統(tǒng)一進(jìn)行如下處理:將for語句轉(zhuǎn)換為while語句的表達(dá)形式,提取for語句中的表達(dá)式1到循環(huán)體外,將表達(dá)式3寫入循環(huán)體內(nèi)。do...while循環(huán)要比其他循環(huán)多執(zhí)行一次,因此將循環(huán)體提取出來作為一個塊,然后將其轉(zhuǎn)換為while循環(huán)。以上操作的處理可以讓數(shù)據(jù)依賴和控制依賴更加明確清晰。
2.劃分最小粒度子程序
模板程序與生產(chǎn)程序經(jīng)過轉(zhuǎn)換得到標(biāo)準(zhǔn)子程序后,經(jīng)過下一步驟將最大粒度子程序劃分為逐一遞減子程序:
(1)從根結(jié)點出發(fā)向左子樹進(jìn)行深度遍歷,斷開具有右子樹的結(jié)點的父連接與左子樹連接,得到“最大粒度-1”的多個子程序。
(2)保存每次切分出的不同粒度的子程序,并重復(fù)步驟1的切分方式,直到切分出的子樹種結(jié)點沒有右子樹為止。
根據(jù)文中給出的排序源碼可以得到子程序集合PArray[n]= {pList1,pList2,...,pListn},PArray是一個一維數(shù)組,按順序調(diào)用pListn,pListn是一個集合,存儲最大粒度子程序及該粒度下包含的層級遞減的細(xì)小粒度。以上面源碼為例存儲結(jié)構(gòu)如圖4所示:
3.子程序匹配
子程序之間匹配從最小粒度出發(fā),匹配子程序的數(shù)據(jù)變量數(shù)據(jù)流依賴類型以及組成子程序的基本單元類型,以匹配圖1為例,源程序中有三個變量作交換,變量temp是流依賴,作用兩個賦值語句;變量a[i]是反依賴,作用兩個賦值語句;變量a[i+1]是反依賴,作用兩個賦值語句。當(dāng)學(xué)生代碼子程序中能匹配以上信息就算匹配成功。匹配后的子程序?qū)⒉粫M(jìn)入下一個更大粒度的子程序匹配。以匹配圖2為例,在匹配圖4中子程序的時候不再匹配圖2中連接的圖4中的子程序。
4.子程序匹配的自動評分算法
基于子程序匹配的自動評分算法的基本思想是:從最小粒度的子程序開始匹配,當(dāng)學(xué)生子程序滿足模板子程序中變量的數(shù)據(jù)依賴關(guān)系和控制依賴關(guān)系時則判定為正確,并記錄該子程序在整個程序中所占的分?jǐn)?shù)權(quán)值,之后根據(jù)匹配到的該最小粒度子程序結(jié)點搜索下一個父親結(jié)點,由此往上遞推,直到匹配完模板程序中由順序關(guān)系組成的最大粒度子程序。結(jié)合圖4所示的數(shù)據(jù)存儲表描述具體算法步驟如下所示:
第一步:取帶權(quán)模板子程序數(shù)組集合TPArray[n]={tpList1,tpList2...tpListn},學(xué)生子程序數(shù)組集合SArray[m]={spList1,spList2...spListm}。y表示tpListn中子程序個數(shù),z表示spListm子程序個數(shù)。設(shè)變量i=0、變量j=0、變量t=0、變量z=0,二維數(shù)組記錄匹配帶權(quán)子程序tempSimPArray[n][max],max為tpListn中的最大長度。一維數(shù)組score存儲最大匹配到的子程序權(quán)值。
第二步:匹配spListj[i]與tpListt[z]數(shù)據(jù)的控制依賴:
(1)匹配成功i++,z++,將tpListt[z]存入tempSimPArray[t][z],當(dāng)z (2)當(dāng)匹配不成功且t 第三步:累計tempSimPArray中每一行中匹配到的子程序權(quán)值,取最大權(quán)值存入score。j++,當(dāng)j 第四步:累加score中權(quán)值,輸出。 四、程序評分實現(xiàn)及實驗結(jié)果分析 通??疾鞂W(xué)生編程題的本意是檢測學(xué)生是否掌握了某些知識點,所以與知識點相關(guān)的代碼的得分權(quán)重要比其他代碼要大一些。實驗中在沒有對模板程序做知識點標(biāo)記的情況下子程序的權(quán)值取總分均值。通過累計匹配到的子程序所帶權(quán)值,計算出學(xué)生的最終成績。 實驗系統(tǒng)的流程如圖5所示: 為了檢測自動評分的準(zhǔn)確率,實驗選取5道編程題如表1所示,并取得50名學(xué)生提交的答案及教師提供的答題模板。 為了驗證前文所述的自動評分算法的性能,首先由多名教師嚴(yán)格按照評分標(biāo)準(zhǔn)給每個答題進(jìn)行打分,將其作為專業(yè)標(biāo)準(zhǔn)評分結(jié)果;然后隨機(jī)選取C語言程序設(shè)計課程的研究生助教給所有答案打分作為普通的人工評分;最后與我們的實驗系統(tǒng)自動評分結(jié)果進(jìn)行比較,以及用Levenshtein算法進(jìn)行自動評分,評分詳情如表2所示。根據(jù)式1計算人工評分與自動評分相對于標(biāo)準(zhǔn)評分的誤差率ER。 Erate=■×100%(1) 其中SScore為專業(yè)人士的標(biāo)準(zhǔn)評分,TestScore為普通助教人員的人工評分或文中的自動評分,AllScore為總分。 在此次選取實驗數(shù)據(jù)中模板數(shù)較多的題目編號1和編號3相對人工評分的誤差要比其他模板少的誤差率要小,說明了模板的數(shù)量在一定程度上對評分的精確度有影響。題目中涉及遞歸編程的題目2自動評分誤差率最大,在后面的實驗中需要在這個方面做改進(jìn)。從整體上來看與人工的誤差率是相對較小的。 五、結(jié)束語 基于最小子程序匹配的編程題自動評分算法,是將人工評分的思維過程與考點結(jié)合起來,通過粒度小到粒度大的子程序的層級匹配能檢測出學(xué)生知識點的掌握程度。將程序劃分為不同粒度的子程序,由于子程序保存相關(guān)語義信息,在匹配過程中能提高準(zhǔn)確性。并且克服了程序?qū)崿F(xiàn)多樣性,語法、語義分析復(fù)雜度高等問題。其實驗結(jié)果表明自動評分與專業(yè)評分比較是存在誤差的,但與普通人工相比誤差控制的范圍是不大的,與Levenshtein算法相比總體上要優(yōu)于該算法。并且程序?qū)崿F(xiàn)思路清晰。在實驗過程中會得到更多的模板程序,因此在后續(xù)的匹配中準(zhǔn)確率也將會有所提高。
參考文獻(xiàn):
[1]申田靜,陳俊.國內(nèi)在線考試系統(tǒng)研究綜述[J]. 中國教育技術(shù)裝備,2015(14):19-22.
[2]李郴,史國峰.編程題綜合評分方法的研究[J]. 計算機(jī)與網(wǎng)絡(luò),2016(6):38-39.
[3]A. Drummond, Y. Lu, S. Chaudhuri, C. Jermaine, J. Warren and S. Rixner, "Learning to Grade Student Programs in a Massive Open Online Course," 2014 IEEE International Conference on Data Mining, Shenzhen, 2014:785-790.
[4]R. Romli, S. Sulaiman and K. Z. Zamli, "Test data generation framework for Automatic Programming Assessment," Software Engineering Conference (MySEC), 2014 8th Malaysian, Langkawi,2014:84-89.
[5]Alamutka K M. A Survey of Automated Assessment Approaches for Programming Assignments[J].Computer Science Education, 2005, 15(2):83-102.
[6]Pozenel M, Furst L, Mahnicc V. Introduction of the automated assessment of homework assignments in a university-level programming course[C].International Convention on Information and Communication Technology, Electronics and Microelectronics. IEEE, 2015:761-766.
[7]Cui B, Li J, Guo T, et al. Code Comparison System based on Abstract Syntax Tree[C].IEEE International Conference on Broadband Network and Multimedia Technology. IEEE, 2010:668-673.
[8]Rubio-S, Nchez M, Kinnunen P, et al. Student perception and usage of an automated programming assessment tool[J].Computers in Human Behavior, 2014,31(2):453-460.
[9]Cui B, Li J, Guo T, et al. Code Comparison System based on Abstract Syntax Tree[C].IEEE International Conference on Broadband Network and Multimedia Technology. IEEE,2010:668-673.
[10]劉月霞,牛志堯,吳寧.面向大規(guī)模在線開放課程的編程題多特征綜合自動評分方法[J].西安交通大學(xué)學(xué)報,2016(10):64-70.
[11]王倩,蘇小紅,馬培軍.有語法錯誤的編程題自動評分方法研究——用局部語法分析和采分點匹配實現(xiàn)[J].計算機(jī)工程與應(yīng)用,2010(17):239-242.
[12]馬培軍,王甜甜,蘇小紅.基于程序理解的編程題自動評分方法[J].計算機(jī)研究與發(fā)展,2009(7):1136-1142.
[13]Vujo?觢evi■-Jani■i■ M, Nikoli■ M, To?觢i■ D, et al. Software verification and graph similarity for automated evaluation of students assignments[J].Information & Software Technology, 2012, 55(6):1004-1016.
[14]劉天藍(lán).基于語義理解與運行分析的程序題自動評分算法研究[D].湖南師范大學(xué),2013.
[15]徐寶文,張挺,陳振強.遞歸子程序的依賴性分析及其應(yīng)用[J].計算機(jī)學(xué)報,2001(11):1178-1184.
[16]姜華,韓安琪,王美佳,王崢,吳雲(yún)玲.基于改進(jìn)編輯距離的字符串相似度求解算法[J].計算機(jī)工程,2014(1):222-227.
[17]張有為,劉小春,汪永紅.程序段識別算法研究[J].計算機(jī)工程,2009(5):72-100.
[18]李靜,高萬林,段晶潔等.編程題自動評測系統(tǒng)的研究與設(shè)計[J].wisdom science and technology,2016(4):11-16.
[19]Liu Y, Chai W, Li X, et al. Design and Implementation of Automatic Marking System for Programming Questions Based on Script Technique[C].2014 International Conference on Computer, Communications and Information Technology (CCIT 2014). Atlantis Press, 2014.
[20]Liu X, Tao L, Zhou Y, et al. The Automatic Marking Method of SQL Script Based on Syntax Analysis and Levenshtein Distance[J].2014.
(編輯:王天鵬)endprint