程序设计语言编程题自动评分的方法

文档序号:6403864阅读:333来源:国知局
专利名称:程序设计语言编程题自动评分的方法
技术领域
本发明属于程序编写验证领域,它具体涉及一种用于C、Pascal、Fortran、Basic程序设计语言编程题自动评分的方法。
背景技术
远程教育的发展以及计算机基础知识的普及使得程序设计语言考试中编程题的自动评分成为一种迫切的需要。目前程序设计语言考试中编程题的自动评分方法的切入点各不相同,但共同的缺点是处理的深度比较浅,主要使用编译技术对学生编写的程序进行语法分析,检测出学生编写的程序中的语法错误,根据语法错误进行评分,由于语法错误只能反映出学生编写程序中语法的正确性,而不能体现出学生编写的程序语义、知识及概念应用的正确性,因此,根据语法检测进行评分的评分结果不能如实反映学生编写的程序的正确性。

发明内容
本发明的目的是提供一种能够全面、综合分析、评判学生编写的计算机程序正确性的方法,以克服现有技术只能检测学生编写的程序中语法错误的局限性缺陷。本发明的技术方案如下一种程序设计语言编程题自动评分的方法,它通过以下步骤实现向计算机输入学生编写的程序S及这个题目的标准答案集T101;从标准答案集T中选择未匹配的标准答案Ti102;将程序S和标准答案Ti进行各自高级语言的词法、语法分析,利用分析结果分别生成系统依赖图Gs、系统依赖图Gt,i103;对系统依赖图Gs、系统依赖图Gt,i进行规范化处理104;进行系统依赖图Gs相应高级语言的语法检测,将系统依赖图Gs、系统依赖图Gt,i中的表达式用语法树表示105;标准化系统依赖图Gs、系统依赖图Gt,i的表达式,并消除系统依赖图Gs、系统依赖图Gt,i中的代码多样化表示形式106;对系统依赖图Gs、系统依赖图Gt,i的处理结果从程序的规模、结构、深度及知识应用四个层次进行匹配107;按照评分标准给出学生编写的程序一次匹配的得分108,判断是否标准答案集T中所有标准答案全都匹配并评分结束109;结果为否,则返回步骤102;判断结果为是,则从程序S和标准答案Ti的所有匹配结果中选择一个最高分作为学生成绩最终得分110;最后编程题自动评分结束111。本发明首先对中间表示后的学生编写的程序进行语法分析,从而获得学生编写的程序的语法错误信息,然后将学生编写的程序和标准答案进行标准化,从程序的规模、结构、深度及知识应用四个层次匹配学生编写的程序和标准答案,进而得到学生编写的程序在语义、知识概念应用方面的信息,本发明所述的自动评分方法对学生编写的程序中各种评分因素考虑的比较全面,因此,相对人工评分来说它的评分精度较高,而且进行编程题的自动评分,一方面可以推广具有实际意义的程序设计语言网络自动化考试,促进了计算机知识的普及,并且将教师从繁重的阅卷工作中解脱出来,另一方面,编程题自动评分的结果比较客观,消除了阅卷过程中人为因素的影响。


图1是本发明编程题自动评分方法的流程图,图2是本发明实施方式二的流程图,图3是实施方式三中程序标准化处理流程图,图4是实施方式四的流程图。
具体实施例方式具体实施方式
一本具体实施方式
描述的是编程题自动评分方法的步骤下面结合图1具体说明本实施方式。向计算机输入学生编写的程序S及这个题目的标准答案集T101,从标准答案集T中选择未匹配的标准答案Ti102;将程序S和标准答案Ti进行各自高级语言的词法、语法分析,利用分析结果分别生成系统依赖图Gs、系统依赖图Gt,i103;对系统依赖图Gs、系统依赖图Gt,i进行规范化处理104,进行系统依赖图Gs相应高级语言的语法检测,将系统依赖图Gs、系统依赖图Gt,i中的表达式用语法树表示105;标准化系统依赖图Gs、系统依赖图Gt,i的表达式,并消除系统依赖图Gs、系统依赖图Gt,i中的代码多样化表示形式106;对系统依赖图Gs、系统依赖图Gt,i的处理结果从程序的规模、结构、深度及知识应用四个层次进行匹配107(各个层次匹配的相似度分别为Dsize、Dstruct、Dprofound、Dnodes,根据各个层次匹配的相似度及语法进行信息检测);按照评分标准给出学生编写的程序一次匹配的得分108;判断是否标准答案集T中所有标准答案全都匹配并评分结束109,结果为否,则返回步骤102;结果为是,则从程序S和标准答案Ti的所有匹配结果中选择一个最高分作为学生成绩最终得分110;最后编程题自动评分结束111。(编程题自动评分的评分标准首先,按公式Di=λsize*Dsize-i+λstruct*Dstruct-i+λprofound*Dprofound-i+λnodes*Dnodes-i计算一次匹配的总体相似度,其中λ为四个不同层次匹配的权值,这几个权值的取值范围各自为0.05<λsize<0.20,0.15<λstruct<0.30,0.50<λprofound<0.85、0.05<λnodes<0.20,如果要想使评分结果整体高些,则应该使λsize和λstruct的值高些,反之则降低这两个值,升高λprofound的值,如果题目为编程填空题,则λsize=0,λnodes=0,并且将这两个权值按λstruct∶λprofound的比例分别加到λstruct和λprofound中;然后,按公式Vi=v*Di/1000-w计算学生编写的程序和一个标准答案匹配的最终得分Vi,其中v表示编程题的实际分值,w表示学生编写的程序中由于语法错误而减去的分值;最后,当所有的标准答案都匹配完时,按公式V=MAX(V1,...,Vi,...,Vn)求出学生编写的程序S的最终得分V,其中Vi表示每个标准答案匹配后计算出的得分,n是标准答案的个数,函数MAX是求最大值函数。)具体实施方式
二下面结合图2具体说明本实施方式。本实施方式与实施方式一的不同点是,步骤104分为以下步骤(在源程序的词法、语法分析及系统依赖图表示后,首先将程序中包含两个或两个以上语义功能的复合表达式在程序的语义不变而语法形式发生变化的条件下),把系统依赖图Gs、系统依赖图Gt,i简化为只包含一个语义功能的表达式201(例如C程序语句“n=m++;”可简化为“n=m;m++;”;然后,规范化系统依赖图中的特殊语句、选择及循环结构),把系统依赖图Gs、系统依赖图Gt,i规范简化成只包含变量说明语句、赋值语句、函数调用语句、selection语句、iteration语句、return语句、break语句、continue语句的形式202(系统依赖图出现其它类型的语句,要求在程序的语义不变而语法形式发生变化的条件下,等价地将这些语句转化到上述8种语句,例如C程序语句“m++;”可转化为“m=m+1;”,其中selection语句由一个父节点及一组选择分支组成,每个选择分支包含各自的选择条件,各个选择条件要求具有唯一性,即当一个选择条件为“真”时,其它选择条件都为“假”,C、Pascal、Fortran、Basic四种语言中所有的选择语句必须等价转化到selection语句,iteration语句由一个父节点及两个分支组成,一个分支称为“循环主体分支”,包含循环体的所有语句,另一个称为“循环初始化分支”,如果编程语言中的循环语句在检测循环控制条件之前需要执行循环体中的语句,则“循环初始化分支”包含这些语句,否则“循环初始化分支”为空,C、Pascal、Fortran、Basic四种语言中所有的循环语句必须等价转化到iteration语句);最后,将系统依赖图Gs、系统依赖图Gt,i中用TOKEN串表示的表达式转换为语法树表示形式203。
具体实施方式
三下面结合图3具体说明本实施方式。本具体实施方式
描述的是系统依赖图Gs、系统依赖图Gt,i中多样化表示形式的消除,本实施方式与实施方式一的不同点是,步骤106分为以下步骤首先利用标准化规则处理系统依赖图Gs、系统依赖图Gt,i的表达式301;判断是否标准化规则都不适用302;结果为否,则返回步骤301(表达式标准化主要是应用标准化处理规则对语法树形式的表达式进行处理,直到这些规则都不适用于表达式);结果为是,则删除系统依赖图Gs、系统依赖图Gt,i中的冗余代码303(即删除在任何条件下都不可能执行的代码或虽然能执行,但在任何一种情况下对程序都不产生影响的代码以及发生严重错误的代码);再次,利用多样化消除规则,处理系统依赖图Gs、系统依赖图Gt,i中基本语句多样化使用的现象304,判断是否所有消除规则都不适用305;结果为否,则返回步骤304;结果为是,则删除系统依赖图Gs、系统依赖图Gt,i中从未引用过的变量及中间变量306(在程序语义不变的基础上,删除系统依赖图中符合声明一次、定义一次、引用一次或未引用条件的中间变量,将程序中的变量按照类型进行分类);之后进行系统依赖图Gs、系统依赖图Gt,i中变量命名的标准化307(统计每个类型中的所有变量各自在系统依赖图中出现的次数,将同一类型变量的出现次数由多到少进行排序,并按照这个排序顺序给各个类型的变量进行重新命名,如果两个变量出现的个数相同,则以出现的先后顺序为准);最后,消除系统依赖图Gs、系统依赖图Gt,i中程序串行表示多样化308(对程序中一组连续的由于串行表示而随意排列且不存在数据相关的并列语句,在系统依赖图中数据流依赖分析的基础上,按照这些语句所包含字符串的先后顺序,将这些语句进行重新排列,消除串行表示带来的程序实现形式多样化现象);系统依赖图Gs、系统依赖图Gt,i表达式的再标准化309(这时,系统依赖图中变量的命名已改变,因此,完成上述流程后还需要对系统依赖图中的表达式进行再标准化处理。)。
具体实施方式
四下面结合图4具体说明本实施方式。本实施方式与实施方式一的不同点是,步骤107分为以下步骤判断是否是编程填空题401;结果为否,则进行系统依赖图Gs与系统依赖图Gt,i的规模匹配402;结果为是,则绕过步骤402直接进行系统依赖图Gs与系统依赖图Gt,i的结构匹配403;步骤402结束后也执行步骤403;然后进行系统依赖图Gs与系统依赖图Gt,i的深度匹配404;判断是否是编程填空题405;结果为否,则进行系统依赖图Gs与系统依赖图Gt,i的语句知识应用匹配406,步骤406结束后进入步骤108的操作;结果为是,则跳过步骤406直接进入步骤108的操作。本具体实施方式
描述的是从程序的规模、结构、深度及知识应用四个层次匹配系统依赖图Gs和系统依赖图Gt,i如图4,首先,将系统依赖图Gs、系统依赖图Gt,i中的各个语句按类型分类,每一类有不同的权值,按公式D=1000*(less(s,t)/more(s,t))计算系统依赖图Gs和系统依赖图Gt,i中每类语句的相似度,其中s、t表示两个程序中某类语句的个数,各类语句的相似度乘以各自权值后再求和,就可得出规模匹配的相似度Dsize,如果题目为编程填空题,则不进行规模匹配;其次,将系统依赖图Gs和系统依赖图Gt,i分别拷贝一份,去掉拷贝中的表达式,以及并列非selection、iteration的语句,可以得到程序的结构框图程序Ss和程序St,i,在程序St,i先根遍历(即树状结构框图的所有节点都访问一遍)的同时,将程序Ss和程序St,i中上下文环境及类型相同的节点对应起来,这样就可在系统依赖图Gs和系统依赖图Gt,i之间建立联系,然后统计程序Ss和程序St,i中选择节点、循环节点以及其它类节点的对应信息,按照公式Dstruct=1000*(λitr*(Mitr/Titr)+λsel*(Msel/Tsel)+λitr*(Moth/Toth))计算结构匹配的相似度,其中λ为各种语句的匹配权值,标准答案集T表示程序St,i中每一类节点的总数,M表示程序St,i中每一类节点中标志为已经匹配节点的总数;再次,根据程序Ss和程序St,i的对应信息,在系统依赖图Gt,i先根遍历及表达式匹配基础上,比较系统依赖图Gs中和系统依赖图Gt,i对应节点的信息及各自子节点的信息,并且将比较的相似度记录下来,当系统依赖图Gs和系统依赖图Gt,i所有对应节点都比较完后,将系统依赖图Gs和系统依赖图Gt,i中的节点分为循环、选择、跳转、赋值及其它类型共5类节点,按照公式Dprofound=λitr*Witr/Titr+λsel*Wsel/Tsel+λjmp*Wjmp/Tjmp+λast*Wast/Tast+λoth*Woth/Toth计算深度匹配的相似度,其中λ为各种语句的匹配权值,标准答案集T表示系统依赖图Gt,i中每一类节点的总数,W表示系统依赖图Gt,i中每一类节点中标志为已经匹配节点的总数;最后,取出系统依赖图Gs中循环语句、选择语句、赋值语句三类语句,在系统依赖图Gs先根遍历及表达式匹配基础上,寻找系统依赖图Gt,i中和这些语句上下文环境相同的语句,并记录匹配相似度,按公式Dnodes=λitr*Witr/Titr+λsel*Wsel/Tsel+λoth*Woth/Toth计算知识应用匹配相似度,其中λ为各种语句的匹配权值,如果题目为编程填空题,则不进行规模匹配。
具体实施方式
五本实施方式与实施方式一的不同点是,本具体实施方式
描述的是系统依赖图Gs和系统依赖图Gt,i中节点s和节点t的表达式匹配如果节点s和节点t的类型不同,则匹配相似度为0;如果节点s和节点t中不存在表达式,但类型相同,则匹配相似度为1000;如果存在表达式且类型相同,则在节点t中表达式语法树先根遍历基础上,将节点s和节点t中上下文环境及类型相同的终结节点对应起来,并记为已匹配节点,用节点t中表达式已经匹配的节点个数比上节点t中总终结节点个数,再乘以系数1000就可得到表达式匹配相似度。
权利要求
1.一种程序设计语言编程题自动评分的方法,其特征是它通过以下步骤实现向计算机输入学生编写的程序(S)及这个题目的标准答案集(T)(101);从标准答案集(T)中选择未匹配的标准答案(Ti)(102);将程序(S)和标准答案(Ti)进行各自高级语言的词法、语法分析,利用分析结果分别生成系统依赖图(Gs)、系统依赖图(Gt,i)(103);对系统依赖图(Gs)、系统依赖图(Gt,i)进行规范化处理(104);进行系统依赖图(Gs)相应高级语言的语法检测,将系统依赖图(Gs)、系统依赖图(Gt,i)中的表达式用语法树表示(105);标准化系统依赖图(Gs)、系统依赖图(Gt,i)的表达式,并消除系统依赖图(Gs)、系统依赖图(Gt,i)中的代码多样化表示形式(106);对系统依赖图(Gs)、系统依赖图(Gt,i)的处理结果从程序的规模、结构、深度及知识应用四个层次进行匹配(107);按照评分标准给出学生编写的程序一次匹配的得分(108),判断是否标准答案集(T)中所有标准答案全都匹配并评分结束(109),结果为否,则返回步骤(102);结果为是,则从程序(S)和标准答案(Ti)的所有匹配结果中选择一个最高分作为学生成绩最终得分(110);最后编程题自动评分结束(111)。
2.根据权利要求1所述的程序设计语言编程题自动评分的方法,其特征是步骤(104)分为以下步骤把系统依赖图(Gs)、系统依赖图(Gt,i)简化为只包含一个语义功能的表达式(201),把系统依赖图(Gs)、系统依赖图(Gt,i)规范化成只包含变量说明语句、赋值语句、函数调用语句、selection语句、iteration语句、return语句、break语句、continue语句的形式(202),将系统依赖图(Gs)、系统依赖图(Gt,i)中用TOKEN串表示的表达式转换为语法树表示形式(203)。
3.根据权利要求1所述的程序设计语言编程题自动评分的方法,其特征是步骤(106)分为以下步骤首先利用标准化规则处理系统依赖图(Gs)、系统依赖图(Gt,i)的表达式(301);判断是否标准化规则都不适用(302);结果为否,则返回步骤(301);结果为是,则删除系统依赖图(Gs)、系统依赖图(Gt,i)中的冗余代码(303);利用多样化消除规则处理系统依赖图(Gs)、系统依赖图(Gt,i)中基本语句多样化使用的现象(304),判断是否所有消除规则都不适用(305);结果为否,则返回步骤(304);结果为是,则删除系统依赖图(Gs)、系统依赖图(Gt,i)中从未引用过的变量及中间变量(306),进行系统依赖图(Gs)、系统依赖图(Gt,i)中变量命名的标准化(307);消除系统依赖图(Gs)、系统依赖图(Gt,i)中程序串行表示多样化(308);系统依赖图(Gs)、系统依赖图(Gt,i)表达式的再标准化(309)。
4.根据权利要求1所述的程序设计语言编程题自动评分的方法,其特征是步骤(107)分为以下步骤判断是否是编程填空题(401);结果为否,则进行系统依赖图(Gs)与系统依赖图(Gt,i)的规模匹配(402);结果为是,则绕过步骤(402)直接进行系统依赖图(Gs)与系统依赖图(Gt,i)的结构匹配(403);步骤(402)结束后也执行步骤(403);然后进行系统依赖图(Gs)与系统依赖图(Gt,i)的深度匹配(404);判断是否是编程填空题(405);结果为否,则进行系统依赖图(Gs)与系统依赖图(Gt,i)的语句知识应用匹配(406),步骤(406)结束后进入步骤(108)的操作;结果为是,则跳过步骤(406)直接进入步骤(108)的操作。
5.根据权利要求1所述的程序设计语言编程题自动评分的方法,其特征是如果节点(s)和节点(t)的类型不同,则匹配相似度为0;如果节点(s)和节点(t)中不存在表达式,但类型相同,则匹配相似度为1000;如果存在表达式且类型相同,则在节点(t)中表达式,语法树先根遍历基础上,将节点(s)和节点(t)中上下文环境及类型相同的终结节点对应起来,并记为已匹配节点,用节点(t)中表达式已经匹配的节点个数比上节点(t)中总终结节点个数,再乘以系数1000就可得到表达式匹配相似度。
全文摘要
本发明公开一种用于C、Pascal、Fortran、Basic程序设计语言编程题自动评分的方法。步骤输入学生编写的程序(S)及标准答案集;将程序(S)和标准答案(Ti)进行各自高级语言的词法、语法分析,生成系统依赖图(G
文档编号G06F17/30GK1598809SQ200410043830
公开日2005年3月23日 申请日期2004年8月25日 优先权日2004年8月25日
发明者王宇颖, 李永浩, 孙志岗, 苏小红, 李希然, 朱鲲鹏, 付忠传 申请人:哈尔滨工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1