王猛,趙軍富






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