王猛,趙軍富
摘要:C語(yǔ)言程序設(shè)計(jì)在評(píng)分過(guò)程中,大多數(shù)的考試系統(tǒng)只能按照結(jié)果評(píng)分,這就導(dǎo)致學(xué)生考試成績(jī)要么滿分要么零分,不能夠真實(shí)反映學(xué)生的學(xué)習(xí)水平,利用正則表達(dá)式對(duì)C語(yǔ)言的程序進(jìn)行知識(shí)點(diǎn)的過(guò)程評(píng)分,并通過(guò)預(yù)設(shè)輸入值,讓學(xué)生運(yùn)行自己的程序,得出結(jié)果與預(yù)設(shè)結(jié)果值進(jìn)行匹配,得出結(jié)果分,最終結(jié)合是否編譯,得出總分。
關(guān)鍵詞:C語(yǔ)言程序設(shè)計(jì);過(guò)程評(píng)分;正則表達(dá)式
中圖分類(lèi)號(hào):G642? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)35-0037-03
1 引言
C語(yǔ)言程序設(shè)計(jì)是大學(xué)本科工科類(lèi)專業(yè)所開(kāi)設(shè)的必修課程,對(duì)于程序設(shè)計(jì)題目,在平時(shí)的作業(yè)及考試都需要對(duì)程序設(shè)計(jì)題目進(jìn)行評(píng)分,有些院校對(duì)于程序設(shè)計(jì)題還是人工評(píng)分,尤其是作業(yè);有些院校采購(gòu)了考試系統(tǒng),但大多數(shù)的考試系統(tǒng)或網(wǎng)絡(luò)評(píng)測(cè)系統(tǒng)中,評(píng)測(cè)都是以運(yùn)行結(jié)果作為評(píng)分依據(jù)。并不查看學(xué)生的編程過(guò)程,其評(píng)分原則并不能體現(xiàn)學(xué)生對(duì)知識(shí)的掌握程度,有其局限性。對(duì)于程序設(shè)計(jì)題這種間于自然語(yǔ)言和程序語(yǔ)言之間的主觀題,可部分?jǐn)[脫語(yǔ)言的約束和限制[1-2],具有較高研究?jī)r(jià)值。本方法在對(duì)過(guò)程評(píng)分主要通過(guò)正則表達(dá)式進(jìn)行評(píng)定,因?yàn)檎齽t表達(dá)式不僅能夠處理傳統(tǒng)的文本匹配,更重要的是正則表達(dá)式具有強(qiáng)大的結(jié)構(gòu)描述能力,同時(shí)能夠描述文本深層次的特征,可以通過(guò)簡(jiǎn)單有效的方式對(duì)文本進(jìn)行的復(fù)雜控制[3-4]。根據(jù)正則表達(dá)式的特點(diǎn),其特別適用于程序類(lèi)代碼的匹配評(píng)測(cè)。
2 C語(yǔ)言過(guò)程評(píng)分實(shí)現(xiàn)
C語(yǔ)言程序題在評(píng)分由三個(gè)部分構(gòu)成:結(jié)果分值、編譯分值、過(guò)程分值[5]。結(jié)果分值通過(guò)評(píng)判數(shù)據(jù)庫(kù)中預(yù)設(shè)的結(jié)果來(lái)評(píng)定;編譯分值通過(guò)是否編譯評(píng)定;過(guò)程分值由事先設(shè)定的多個(gè)正則表達(dá)式評(píng)定,其中正則表達(dá)式由參考代碼中的關(guān)鍵代碼構(gòu)成,然后利用ckstr函數(shù)對(duì)參考代碼進(jìn)行匹配,得出過(guò)程分。C語(yǔ)言整體評(píng)測(cè)過(guò)程如圖 1所示:
對(duì)于正則表達(dá)式,常用的替換字符包括:.*可以匹配單行任意字符;[\s\S].*可以匹配多行任意字符;[ ].*可以匹配零個(gè)或多個(gè)空格;[ ]+可以匹配一個(gè)或多個(gè)空格。利用正則表達(dá)式的這些特點(diǎn),我們可以對(duì)常用的C語(yǔ)言結(jié)構(gòu)及部分帶代碼,用正則表達(dá)式去表示。
例如選擇結(jié)構(gòu)單分支結(jié)構(gòu)語(yǔ)法如下:
if(條件)
{
表達(dá)式;
}
轉(zhuǎn)換為正則表達(dá)式如下:if[ ]*\(.*\)[ ]*\{[\s\S]*\}
對(duì)于數(shù)據(jù)庫(kù)中題目表的部分主要字段設(shè)置如表 1:
最終分值計(jì)算的公式如下:
$fz_cfd=100*($bl_cfd/($bl_da+$bl_by+$bl_cfd))*($cfd/$sum)
$zf=$fz_da+$fz_by+$fz_cfd;
說(shuō)明如下:
$sum為所有正則表達(dá)式的分值
$cfd為考生獲取正確正則表達(dá)式的值
$fz_cfd為過(guò)程分值
$fz_da為結(jié)果分值
$fz_by為編譯分值
以下為程序評(píng)定過(guò)程中的部分代碼:
$sum=0;
$cfd=0; ? ? //用于統(tǒng)計(jì)各個(gè)正則表達(dá)式采分點(diǎn)的和
while($row=mysqli_fetch_array($result_zz))
{
$sum=$sum+$row[1]; //row數(shù)組為數(shù)據(jù)庫(kù)中正則表達(dá)式
$str1="/".$row[0]."/";
$str2=$content;? ?//$content為參考代碼
if(ckstr($str1,$str2)==1)
{
$cfd=$cfd+$row[1];
}
}
if($sum==0)
$fz_cfd=0;
else
$fz_cfd=round(100*(1.0*$r_tm->bl_cfd/($r_tm->bl_da+$r_tm->bl_by+$r_tm->bl_cfd))*(1.0*round($cfd,2)/$sum),2);
$zf=$fz_da+$fz_by+$fz_cfd;
3 實(shí)例分析
1) 題目?jī)?nèi)容:
實(shí)現(xiàn)功能:請(qǐng)編寫(xiě)一個(gè)函數(shù)fun,該函數(shù)的功能是:計(jì)算正整數(shù)n以內(nèi)(包括n),能被5或9整除的所有自然數(shù)的倒數(shù)的和,并將計(jì)算結(jié)果作為函數(shù)值返回在主函數(shù)中保留兩個(gè)小數(shù)位輸出。
例如:若輸入n的值為20,則輸出結(jié)果為0.58.
注意:
① 所寫(xiě)代碼中,不得定義其他變量;
② 本題必須使用for循環(huán),if語(yǔ)句;
③ 不允許改動(dòng)預(yù)編譯命令行及主程序,且必須運(yùn)行程序;
④ 程序代碼編寫(xiě)在****BEGIN*****與****END****之間;
⑤*********BEGIN**********和*********
END**********不可刪除。
⑥ 其中函數(shù)void bky(? )為自動(dòng)評(píng)分函數(shù),禁止修改、刪除
2)給出代碼如下:
#include<stdio.h>
void bky( );
float fun( int n)
{
int i;
float sum=0;
/***********BEGIN*********/
/***********END*********/
}
void main()
{
float fun( int n);
int m;
float s;
printf("\n 請(qǐng)輸入一個(gè)正整數(shù):");
scanf("%d",&m);
s=fun(m);
printf("\n the result is:%.2f",s);
bky();
}
void bky()
{
FILE *IN,*OUT;
float s ;
int t;
float o;
IN=fopen("in.dat","r");
if(IN==NULL)
{
printf("Read FILE Error");
}
OUT=fopen("out.dat","w");
if(OUT==NULL)
{
printf("Write FILE Error");
}
fscanf(IN,"%d",&t);
o=fun(t);
fprintf(OUT,"%.2f\n",o);
fclose(IN);
fclose(OUT);
}
3) 題目?jī)?nèi)容設(shè)置如圖 2所示,設(shè)置答案、編譯及過(guò)程的采分比例如圖 3所示:
4) 設(shè)置的正則表達(dá)式采分點(diǎn)如所表 2示:
5) 參考答案如下:
for(i=1;i<=n;i++)
if(i%5==0 || i%9==0)
sum=sum+1.0/i;
return sum;
6) 分別找cs和cs2兩位測(cè)試同學(xué)進(jìn)行測(cè)試,學(xué)生代碼如圖 4下:
根據(jù)前面題目分值比例的設(shè)置:本題的結(jié)果分為50分;編譯分為10分;過(guò)程分為40分。cs這位同學(xué)的結(jié)果、編譯、正則表達(dá)式所有的采分點(diǎn)全部正確,得分100;而cs2這位同學(xué)的結(jié)果錯(cuò)誤,結(jié)果分為:0分、編譯過(guò),編譯分為:10分,過(guò)程分共40分,但正則表達(dá)式中,其中第5項(xiàng)和第8項(xiàng)不正確,只能拿到6/8的過(guò)程分,故總分=0+10+40*6/8=40分,具體評(píng)分結(jié)果如表 3 :
4 結(jié)語(yǔ)
本文提出了一種可以實(shí)現(xiàn)C語(yǔ)言程序自動(dòng)評(píng)分的方案。在C語(yǔ)言程序中,評(píng)分過(guò)程無(wú)非三個(gè)方面:結(jié)果是否正確,是否進(jìn)行編譯,代碼準(zhǔn)確率三個(gè)方面,本方法不僅可以評(píng)判結(jié)果,更重要的是可以評(píng)判代碼的準(zhǔn)確率,使得C語(yǔ)言程序的評(píng)判更加客觀和準(zhǔn)確,減輕了教師的負(fù)擔(dān)。
但在評(píng)判代碼準(zhǔn)確率的時(shí)候,通過(guò)前文可知道,需要對(duì)給定程序做出很多限定,例如:功能實(shí)現(xiàn)時(shí),限定代碼必須用for循環(huán)結(jié)構(gòu)實(shí)現(xiàn);還有代碼中限定不得再定義其他變量;還有些較復(fù)雜代碼,限定變量的含義等缺陷。但是鑒于目前人工智能、信息技術(shù)的發(fā)展水平,目前這種評(píng)判方法是一種高效、客觀、準(zhǔn)確率高的方法,而且本方法也可適用于其他類(lèi)編程語(yǔ)言的自動(dòng)評(píng)分,具有較高的推廣價(jià)值。
參考文獻(xiàn):
[1] 曹亞妮.C語(yǔ)言在線考試系統(tǒng)開(kāi)發(fā)及關(guān)鍵技術(shù)的研究[D].西安:西安理工大學(xué),2016.
[2] 吳艷玲.基于WEB的C語(yǔ)言編程題自動(dòng)閱卷系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2011.
[3] 姜英杰.支持正則表達(dá)式的文本匹配優(yōu)化算法[D].沈陽(yáng):東北大學(xué),2012.
[4] 張雪英.基于機(jī)器學(xué)習(xí)的文本自動(dòng)分類(lèi)研究進(jìn)展[J].情報(bào)學(xué)報(bào),2006(6):730-739.
[5] 刁善會(huì).C程序設(shè)計(jì)考試系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].重慶:重慶大學(xué),2009.
【通聯(lián)編輯:王力】