C语言程序在线分析辅导系统设计*

2017-06-05 15:04张良
中国教育信息化 2017年7期
关键词:测试用例C语言辅导

张良

(北京信息科技大学 计算中心,北京 100192)

C语言程序在线分析辅导系统设计*

张良

(北京信息科技大学 计算中心,北京 100192)

本文设计了一种针对C语言程序设计课程的在线分析与辅导系统。学生学习C语言的过程中,需要通过大量练习题巩固所学知识。目前,一些教学平台提供了在线判题的功能来检验程序的对错,但存在一些问题。该系统在在线判题系统的基础上,通过测试用例分析、编译分析、结构分析等方法,进一步细化检查和定位学生程序中的错误,为学生提供针对性的辅导,对提高学生的学习效率有一定帮助。

自主学习;在线判题智能辅导;C语言

一、引言

C语言程序设计是一门实践性很强的课程,在教学过程和学生的自主学习过程中,都需要通过大量的练习题来巩固所学知识、检验学习效果。很多C语言课程教学平台和自主学习平台也提供了大量的题目(主要是编程题)供学生练习。由于学生数量众多,学习时间也不一致,教师很难及时为每位学生所做的题目进行评价并给出针对性的指导。

目前一些教学实践过程中采用在线判题(Online Judge)系统进行自动评分。[1][2]在线判题系统大多采用测试用例的方法进行判断,即编制若干组测试用例,模拟运行程序,将数据输入程序,并将输出结果与预期结果进行匹配,如果完全匹配成功判对,否则判错。这种方法能够很直观地判断学生程序的对错,对促进学生提高实验水平也有很大帮助,但这种判断方法并不能完全适用于学生自主学习的场景。

(1)在线判题的前提是必须保证程序能够运行。而学生(尤其是初学者)编写的源程序可能存在个别语法错误而不能通过编译并生成可执行文件。这些程序不能得到分析评价和针对性辅导。

(2)输出结果与预期成果进行文本匹配来判断对错的方式,使一些只在输出格式上有错误的程序判断为错。程序中某些数据类型的精度问题也可能导致输出结果有误差,从而导致判断为错。

(3)目前的在线判题系统只能对题目整体进行判断对错,不能具体定位到程序出问题的部分并针对学生的错误进行辅导。

自主学习过程中,很多初学者可能找不到以上出错的原因,而浪费了很多学习时间,降低了学习效率。而在教师现场辅导时,可以很容易发现其中的错误,并可以根据其程序给出分析评价并进行指导。近年来,许多教改项目对在线判题系统进行改进,主要的研究思路有通过优化判题流程[3]、语义检测的稳定模型[4]、基于关键字和序列匹配[5]等方法,这些方法在一定程度上解决了以上问题。本文借鉴以上思路,结合测试用例、编译系统、结构分析法等设计了一种在线分析及辅导系统,可以用于应用C语言教学平台及自主学习系统,经过测试,在线分析和辅导系统可以模拟教师现场指导,从而提高学生学习的效率。

二、系统设计

基于对在线判题系统优缺点的分析,本系统采用以下原则进行设计:①系统基于成熟的在线判题系统,采用测试用例法对学生提交的源程序进行初步分类。②对于初步分类为错误的程序再采用编译分析、结构分析等方法进行进一步分析。设系统整体流程如图1所示。

整个系统分为四个部分——测试分析模块、编译分析模块、结构分析模块、辅导模块。

首先对源程序进行编译链接,如果编译成功,可以生成exe文件,调用测试模块进行测试。如果编译不成功,则需要对源文件进行进一步分析。①调用编译分析模块解析程序中出现的语法错误并进行自动修正。②调用结构分析模块分析程序的结构问题。

图1 系统整体结构图

在测试模块中,如果测试用例全部通过测试,程序判对并将此程序加入参考答案库中;如果部分通过,则进行用例分析,并调用结构分析模块分析程序,如果全部未通过,直接调用结构分析模块进行分析。针对各个模块分析、对比得到的程序问题,分类别(语法错误、格式错误、结构错误等)对学生进行针对性辅导。

三、详细设计

1.测试分析模块

测试模块首先要设置若干组合理的测试用例。测试用例需要覆盖到程序的所有结构路径。如分支结构中,每个分支至少要有1组测试用例。测试用例除了设置输入输出外,还需要设置测试用例说明,如分支结构中,每组测试用例必须设置该分支测试用例说明。

通过测试用例对程序进行模拟运行,如果测试用例全部通过,程序得满分,如果该程序的结构模块与参考答案库所有答案均不同,将该程序加入到参考答案库。如果部分通过,对未通过测试的用例进行分析,得到程序出现错误结构路径。针对部分同学的格式、数据类型精度等情况可能造成判错的问题,需要在现有的测试用例方法基础上增加容错的机制。常见的格式错误有:

多写或少写空格、制表符、回车符等符号造成的错误。格式控制串“%m.nf”“%md”未按要求书写造成的输出格式错误。

将间隔符号如“,”“;”等写错引起的错误。

在输出时多写或漏写了其他说明性文字引起的错误,比如输出变量a的值。格式输出要求“a=5”,而学生程序只输出了 5,漏写“a=”,或者要求输出5,而程序输出“a=5”。

为解决以上由于格式问题导致系统判错,需要对测试用例的参考输出结果和用户程序的实际输出结果进行归一化操作后再次进行比对,并对测试用例中的输出结果进行细化设置。

(1)格式归一化操作。对测试用例的参考输出结果或程序的实际输出中常用的控制字符如空格、制表符、换行符等为统一的间隔标记。归一化后再次进行比对。

(2)精度归一化。在编写程序过程中,由于学生用的数据类型不合适可能导致数据结果存在误差,如float类型数据在6位数之后出现的精度误差,需要对学生提供的源程序数据精度进行归一化,统一为精度较高的数据类型。

(3)输出结果的细化设置。在《C语言程序设计》课程中,编程题输出结果一般可分为“说明性字符串”、“计算型数值”、“间隔符号”等三大类,其中核心为“计算型数值”。在设置测试用例参考答案时分别细化标记三类输出,在进行结果比对时按照“完全匹配—>计算性数值匹配—>间隔符号匹配—>说明性字符串匹配”的顺序进行比对结果。

2.编译分析模块

目前的在线判题系统,一般是在服务端使用编译工具对用户提交的源程序进行编译链接,如果能够编译通过,进入测试用例模块进行测试。如果不能通过,则进行报错。编译系统所报的错误基本都是针对源程序中存在的语法错误,有的指示位置有偏差,有的错误是由前面的错误引起的,有的描述不直观,对初学者查找错误造成很大的误解,不能直接对学生修改程序起到指导作用。本系统根据教师在教学实践中的经验,将编译系统的报错进行分析,反推出源程序中的书写错误,并进行直观提示。由于每一种编译器的报错提示有差异,本文以VC6.0编译器为例,如表1所示。

表1 常见编译链接错误举例

根据编译器的提示错误的顺序依次自动修正源程序中的错误后重新进行编译,如果编译成功,则重新进入测试用例模块进行测试,如果编译不成功,再次修正错误,进行编译,直至可以编译或者修正次数大于设定的阈值。

3.结构分析模块

为了分析源程序的结构,需要为每道题目设置参考答案。参考答案的要求一是要标准化,采用标准流程和通用方法解决问题,参考答案书写要求规范,并详细注释。二是要鼓励多样化思维,答案不一定唯一,应给出一种或几种参考答案,形成答案库。在判题的过程中,对全部通过测试的新答案,也要加入到参考答案库中。

C语言程序的结构有如下特点:

绝大多数C语言中源程序都可以转化为“预处理命令+若干个函数”的结构,细分到每个函数,又可以分为顺序、选择和循环3种控制结构及其嵌套结构。[5]

关键语句。C语言有32个关键词,每个关键词往往代表一种语法结构。根据关键词,可得到关键语句序列。

即使算法相同,不同人编写的程序也可能完全不同,可能变量名不同、变量定义的顺序不同、控制结构不同 (比如循环语句,有人习惯用for语句,有人习惯用while语句)等。

根据C语言程序的结构特点,将整个程序解析为若干个模块,解析顺序:①预处理命令部分。②全局定义部分。定义全局变量、全局函数声明等信息。③函数模块:根据函数模块的结构特点,经过文本分析,可以获得函数的结构,并获取函数名、返回值类型、参数列表等信息。④关键语句序列,根据C语言中的关键字,获取函数中控制结构语句。形成关键语句序列。

通过解析程序可以得到程序结构分析结果及层次结构。 如:

函数结构(参数列表)

输入语句

循环结构

分支结构

循环结构

输出语句

系统采用XML格式进行存储,并进行比对。

4.辅导模块

在自主学习过程中,学生进行测试的目的主要是发现学习的薄弱环节,并得到针对性的指导。根据测试分析模块、编译分析模块、结构分析模块得到的分析结果,针对学生程序中出现的主要问题,对学生进行针对性指导。

如果程序判定为正确,将成绩记录为满分,系统推荐下一个难度的学习资料和题目进行练习。如果未得满分,依次根据以上三个模块得到的分析结果进行针对性指导。如果为格式问题,给学生展示正确的书写格式,并为学生提供格式方面的强化指导,为其推荐格式方面的训练题目,加强训练。如果是语法错误,根据编译分析系统分析结果,给出错误提示,指出修正方法。未按题目要求编写函数,或者函数的格式不正确,强化其函数定义方法及书写格式、函数参数设置等,并提供参考范例供学生学习。结构型错误,为学生提示标准答案的结构框架及参考范例。

四、总结

本文设计了一种C语言程序智能评价及辅导系统,目前在《C语言程序设计》课程的自主学习平台中进行了应用测试,作为课程的辅助教学平台。经测试与综合分析,取得了较好的效果。

(1)本系统细化了在线判题系统判题规则,改变以往的练习系统只判断对错的模式,通过编译分析模块和结构分析模块,能更细致找出学生的错误和给出细化的建议,提高了学生学习的效率。

(2)在判题系统的基础上增加了针对性辅导的功能,学生通过自主学习系统,不仅可以检验自己的学习水平,还可以得到针对性的辅导,发现学习的薄弱环节,提高学生的学习水平。

(3)在实际运行中,也发现了系统的一些缺点,比如对个别解题思路比较特别的程序不能给出准确的解读,智能化还有待提高,在下一步工作中还要继续进行研究。

[1]熊茜,雷亮,许莎,陈刘奎.基于在线判题系统的C语言实验教学改革[J].重庆科技学院学报(社会科学版), 2015(10):67-69.

[2]廖雪花,厉兰洁,唐思娩.基于Online Judge的C语言程序设计实验课教学改革研究[J].计算机教育,2016 (6):130-132.

[3]蒋燕敏.自动判题算法及网络考试平台研究[D].浙江:浙江工业大学,2014.

[4]陈晶晶,陈华,范宜标.C语言智能评分系统的开发[J].龙岩学院学报,2016(2):75-80.

[5]杨利军,董红斌,梁意文,谭成予.源程序语义检测的稳定模型分析方法[J].计算机工程,2006(15):96-98.

[6]王力洪.基于关键字和序列匹配的自动评分算法的研究[J].福建电脑,2015(12):10-12.

[7]乔少杰,杨燕,葛永明,张翠芳,戴齐.基于B/S架构的多用户在线程序评判系统设计与实现[J].计算机工程与科学,2011(s1):58-61.

(编辑:王天鹏)

G434

:A

:1673-8454(2017)07-0086-03

2015-2016年度北京信息科技大学教改校级重点项目“面向多类终端的C语言自主学习平台研发”(2015JGZD05)。

猜你喜欢
测试用例C语言辅导
回归测试中测试用例优化技术研究与探索
基于SmartUnit的安全通信系统单元测试用例自动生成
基于Visual Studio Code的C语言程序设计实践教学探索
51单片机C语言入门方法
基于C语言的计算机软件编程
高职高专院校C语言程序设计教学改革探索
基于依赖结构的测试用例优先级技术
软件回归测试用例选取方法研究
学习实践科学发展观辅导
学习实践科学发展观辅导