您好, 访客   登录/注册

基于Linux的C语言程序设计题的动态评阅技术

来源:用户上传      作者:

  摘要:C语言程序设计题动态评阅技术被广泛应用于在线实时评分系统中;本文首先分析动态评阅技术的现状,提出了基于关键字匹配的动态评阅技术,并根据输出的关键字有无顺序给出了两种不同的关键字检测算法;通过实际应用证明该动态评阅技术有助于提高自动评阅的准确率;还给出了错误程序的错误类型,极大地方便了用户进行程序调试。
  关键词:Linux;C语言编程题;动态评阅技术;关键字匹配
  中图分类号:TP311.1 文献标识码:A 文章编号:1007-9416(2019)01-0129-02
  C语言程序设计是计算机类专业的一门重要基础课程,具有较强的实践性,在教学中应加大实践课时数,通过增加学生的编程代码量来提高学生的实践编程能力,然而很多高校教师资源难以满足大量实践课程的需求。近年来,越来越多的高校为了减轻教师的工作量、提高学生的编程能力,纷纷使用程序设计题在线自动评分系统,用于上机练习及考试。但由于程序设计题的评阅技术还不成熟,很多系统的使用不如人意。近几年来,国内越来越多的专家学者对程序设计题的自动评分技术进行了研究,特别是对C语言编程题自动评阅技术,无论在程序内容上的评阅还是运行结果上的评阅,都取得了一定的进展。
  1 评阅技术的现状及问题
  从C语言程序设计题自动评阅的方式上看, 可分为动态评阅及静态评阅两种方法。
  在动态评阅技术上,多数评分系统采用运行结果匹配的方法来评分,就是通过编译、运行学生提交的程序,输入测试值,得出运行结果,然后通过运行结果与正确结果进行比对;如果比对完全一致,那么判定程序是正确的,否则程序是错误的。然而,这样的评分方法过于严格,哪怕是多余或缺少一个空白符号也会被判断错误。
  在评分的结果上,一般只有两种结果,正确与错误。国内很多系统在判0分的情况下,却没有提示错误的原因或者提示的原因非常简单。有很多学生反馈,在测试程序的时候明明是正确的,提交上去却被判为0分,作为练习系统应允许多次提交程序,学生不知道错误的原因,很难修改程序,这往往使得学生失去兴趣。
  2 基于关键字匹配的动态评阅算法
  2.1 源代码的编译和运行
  在判分程序中使用system函数调用shell命令进行编译,调用的语句如下所示:
  system(“gcc 10101.c-o 10101”);
  然后判断可执行的文件是否生成,生成可执行文件说明源程序语法上没有错误,否则源程序有语法上的错误。
  为了使评阅结果可靠,本系统采用了多组测试值,多次运行的方法来判分,这样几乎可以避免不限制输出格式而造成的误判。在运行自动评阅程序前,先把检测数据以“@”为分隔符进行分组,将每组数据分别保存到input1.txt,input2.txt等文件中,运行程序的结果使用命令重定向“>”传到result1.txt,result2.txt等文件中,然后再计算相似度。
  2.2 动态评阅算法
  (1)令i=1,k=0。调用Linux系统gcc命令编译学生提交的程序,如果生成可执行文件,转(2);否则,程序有语法错误,转(6)。
  (2)运行可执行文件,输入第i组检测数据,得出运行结果,执行i=i+1;判断运行结果中是否包含所有正确答案中的关键字;如果包含所有正确关键字,转(3);否则,转(6)。
  (3)计算运行结果和正确答案的相似度i,判断检测数据组输入是否结束,如结束,转(4);否则,转(2)。
  (4)计算平均相似度,如果平均相似度≥设定值,则转(6);否则,转(5)。
  (5)如果(5)已经执行过,那么动态评判结束,转(6);否则标准化源程序中的printf输出语句[1],得到新的程序,然后转(1)重新开始。
  (6)返回平均相似度,动态评判结束。
  3 运行结果的检测方法
  按题目的要求,输出结果有两种类型,即关键字有序和关键字无序,对这两种类型的关键字检测算法是不同的,在对关键字进行检测前首先判断该题的关键字序列是有序的还是无序的,有序和无序采用不同的检测方法。
  3.1 关键字有序的检测
  有序关键字的检测是根据正确答案的关键字序列对运行程序的结果进行比对,运行结果中要求满足以下两条规则:
  (1)运行结果中包含标准序列中所有的关键字;
  (2)运行结果中所包含的關键字排序必须与标准序列中关键字一致。
  图1为关键字有序的检测的流程图。
  3.2 无序关键字的检测
  当题目的要求为结果无序时,运行程序输出的结果必须满足以下要求:
  (1)运行结果中必须包含所有的正确答案中的关键字;
  (2)所有的关键字在运行结果中的位置不能出现重叠。
  为了满足以上两个要求,在检测前首先对正确答案中的关键字排序,规则是按照关键字字符串的长度由大到小进行排序,然后依次取出关键字,使用KMPIndex()函数判断关键字在运行结果中的位置,如果KMPIndex()函数返回值大于等于0,说明关键字在运行结果中存在,否则不存在。每次将检测到的关键字在运行结果中的位置就从运行结果字符串中删除,然后再检测正确答案中剩余的关键字。
  4 计算动态相似度的实现
  在判分模块中,由dynamicJudge()函数负责计算动态相似度。该函数的设计思路:①判断关键字是有序还是无序的,如果正确答案序列是以“unorder”开始,那么关键字是无序的;否则,关键字是有序的。②当关键字为无序时,先调用outputSort()函数对标准结果序列按照关键字长度由大到小的排序,然后逐一检查运行结果中是否包含了正确答案序列中的所有关键字。当关键字为有序时,按照正确答案的关键字顺序逐一检查是否包含所有的关键字。③如果运行结果中不完全包含正确答案序列中的关键字,则动态相似度为0,否则,计算动态相似度。   5 程序錯误提示
  为了使得用户更方便修改程序的错误,根据动态评阅方法给出了七种不同的错误提示:
  err-1:文件提交失败!原因:文件类型不符合要求,文件过大等。
  err-2:语法错误,编译未通过。
  err-3:未按照题目要求编写程序。
  err-4:运行错误、发生溢出、死循环、读取多余数据、内存使用超过最大限制、CPU使用超时或没有数据输出等。
  err-5:结果错误。
  err-6:部分结果错误、临界值测试错误。
  err-7:未按照题目要求格式输出结果。
  6 结语
  上述设计的动态评阅方法已经应用到C语言程序设计题自动评阅系统上,通过实际的使用,评分的准确率大大提高,错误提示有效地帮助学生发现程序的错误,极大地方便了学生对程序进行调试。
  参考文献
  [1] 林宁.一种改进的C语言程序设计题自动评阅技术[J].数字技术与应用,2018,36(07):199-200.
  Abstract:C language programming dynamic scoring technique is widely used in online real-time scoring system; Firstly, this paper analyzes the current situation of dynamic review technology, and proposes a dynamic evaluation technology based on keyword matching, and gives two different keyword detection algorithms according to the order of output keywords. It is proved by practical application that the dynamic review technique can improve the accuracy of automatic evaluation, and the error reasons of the error program are given, which greatly facilitates the user to debug the program.
  Key words:Linux; C language programming; dynamic judging technology; keyword matching
转载注明来源:https://www.xzbu.com/8/view-14760573.htm