基于C#试题生成系统的设计与分析

2022-12-17 10:07肖仁锋李兴福
济南职业学院学报 2022年4期
关键词:综合题题型试题

肖仁锋 李兴福

(济南职业学院,山东 济南 250103)

一、概述

(一)背景描述

近年来,为了保证考试的公平性和统一性,也为了试题建设的规范化,学校正在兴起题库建设,需要组织多位教师进行出题、审核等工作。目前,这项工作基本还是靠相关教师多年的经验积累来人工完成。从出题人的角度来看,人工完成试题库建设,工作量大且容易出错,大大降低了题库建设的工作质量;从试题质量的角度来分析,如果需要形成多套试题,就会出现重复率高等问题,无法保证考试的公平性。因而,在题库建设工作中,如何提高试题的质量,如何将教师从繁重的重复工作中解放出来,是亟待解决的问题。本文中提到的试题生成系统,正是在这种情境下,依据实际的工作情况,利用现有的编程工具,设计实施的基于C#的试题自动生成系统[1]。

(二)开发环境介绍

考虑到系统的通用性和易用性,本系统使用的操作系统平台为Windows7及其后续相关产品,比如Windows8、Windows10等;以C#作为系统开发的程序语言,选用Visual Studio 2008作为语言处理程序,系统也支持更新的Visual Studio环境。为了保证准确性,系统开发完成后,曾在多个版本中测试过,均能运行正常。而数据库管理系统则使用了最为常见的SQL Server,既能满足数据库开发的需求,通用性又强。

二、系统功能设计及开发方案

在系统设计时,系统采用了三层的设计模式,即:表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。表现层主要的作用是提供一个系统与使用者之间的接口,规范系统的页面布局,用于数据的写入和输出,既可以把使用者的意图写入系统中,也可以将使用者想要看到的数据展示出来;而业务逻辑层是设计模式的中间模块,上接表现层,下连数据访问层,是上、下两层的连接器,这一层的性质与另外两层明显不同,另外两层是单纯的功能实现,而这一层则是复杂的、繁杂的业务逻辑处理和实现。在一些简单软件中,这一层的功能和地位并不明显,甚至被忽略,但是在大型的、复杂的软件中,该层却是非常重要的。可以说,软件的效率和后期的维护工作就取决于开发人员在这一层的设计是否足够高端。在本系统中,该层并不复杂,主要用于实现了验证和一些常规的计算、统计功能。最后的层次是数据访问层。顾名思义,它的作用是通过对数据库的访问,实现对试题数据的增加、删除、修改、查询等操作。通过分层次的系统设计开发,实现了“高内聚低耦合”的思想,提高了系统开发的效率,为今后系统的升级和维护奠定了良好的基础。在本系统中由于业务逻辑关系并不复杂,因此,业务逻辑层的实现就相对简单,这里主要介绍表现层和数据访问层的设计和实现[2]。

本系统是一个试题自动生成系统,大致功能分为两大模块:题目管理和试题生成。在题目管理模块中,首先根据常见的试题类型分别建立了相关的类,主要的试题类型有判断题、选择题、填空题、简答题和综合题。在每类题目中都涉及了题目的增加、删除、修改、查找等常规管理操作。虽然系统在开发时只做了这些类型的题目处理,但是有了这些题型做基础,再开发其他题型的模块,比如名词解释、论述题等,就变得比较容易了。在试题生成模块中,根据实际的工作需要,设计了三种试题的生成模式:直接抽题模式、自定义抽题模式和高级抽题模式。直接抽题模式是最简单也是最直接的抽题方式,抽题人不需要任何操作,直接点击生成试题按钮即可,试题生成系统会根据设计好的既定模式生成试题,并生成相关的答案;自定义抽题模式允许抽题人根据自己的需要选择相关的题型和数量,然后再生成试题和答案;高级抽题模式是为了满足抽题人的更高要求而设计的。首先是将抽题的过程分开了,按照题型分步抽题,当系统抽出的题目不能满足抽题人的要求时可以根据需要进行替换,直到抽题人满意为止,然后点击“写入缓存”按钮,将选好的题目保存下来,接着更换另外一种题型,继续选择相应的题目,待最后所有题目选择完毕,选择“生成试题”按钮,可以将缓存中的所有题目写入Word文档中,生成试题和答案。另外,在高级抽题模式中,还设置了过滤功能,可以根据题目所属的知识范畴过滤题目,知识范畴对应于某个课程的章节,对应数据库中的point字段。比如学完了网络课程第一章,需要做一个阶段性测试,则可以将知识范畴选为第一章,那么过滤出来的题目就都是第一章的。该项功能是为了更好地满足使用者的一些个性化需求而设置,增加了选题的灵活性。

三、相关问题及解决方案

围绕常见的题目类型,在系统的设计开发中,共涉及五种题型:判断题、选择题、填空题、简答题和综合题。其中,前四种题型在技术实现上基本类似,而综合题则与前四种完全不同。由于综合题涉及较多的题目介绍,甚至有的题目中会有图像,在处理过程中会相对复杂一点。下面根据在设计开发的过程中遇到的重点问题做详细介绍。

在开发过程中,遇到的主要问题有四个:数据预处理问题、题目重复问题、图像处理问题、题目输出问题。

(一)数据预处理问题

在题目增加模块中,本系统设计了两种方式增加新题目:录入和导入。录入方式就是将已有的题目的详细情况(包括题干、答案、科目及对应的知识点),根据提示写入相应的文本框中,然后点击“增加”按钮将题目写入数据库中;导入是指将题目事先写入Excel文档中,由系统自动导入。在录入方式中,如果所有的选项是直接录入的不会有问题,但是如果题目的题干和答案是从别的文档中复制粘贴过来的,就容易产生问题。尤其是从网页上直接粘贴下来的题目,会有很多问题。最突出的问题就是很多数据带有一些网络的格式或者一些特殊符号,会造成输出格式的混乱,在生成试题时,后期对试题维护处理时的工作量变大、工作效率降低。

为了解决这个问题,需要在写入数据库之前对数据进行处理,将特殊的格式和多余的无用字符去掉,也就是数据的预处理,或者可以称之为数据清洗。实现这一目标的方法有很多种,可以使用trim()方法,该种方法比较简单,但是经过测试,效果不理想;也可以使用replace()方法,替换数据中的指定字符,这种办法需要自定义一个方法,将其处理过程写在方法中,由于这里的数据清洗比较简单,过程并不复杂,就是将数据转换为字符串,使用replace()函数,替换掉一些指定的字符。因此,本系统就采用了这种办法。当然,就其原理而言,不仅这些方法可以去掉这些特殊字符和标记,采用SQL中的一些语句,等数据写入数据库后,统一修改也是可以的,但是这种方法是在数据录入后,可能会有漏掉的,查找起来相对麻烦一些。因此,本系统并没有采用这种办法[3]。

在数据预处理的过程中还要防止数据冗余,也就是防止重复题的出现。由于向题库中录入的题目会越来越多,难免出现将相同的题目再次录入的情况,为了避免这种问题,本系统也在数据录入数据库之前,进行了一次遍历,看数据库中是否有题干完全相同的题目,如果数据已经存在了,则不再录入,以防止出现重复题。

总之,数据的预处理需要耗费一定的时间,导致题目录入变慢,但却减少了后期的维护时间,提升了整体的效率,也提高了试题的质量。

(二)题目重复问题

本系统是自动试题生成系统,从数据库中抽取题目的时候,首先是由系统产生一个随机数,并以这个随机数作为题目的编号在数据库中抽取相应的题目,而随机数的生成是有范围的,这样当抽取的题量过大时,难免会产生重复的随机数,因而需要在抽取过程中处理数字重复的问题,具体的处理过程如下:

1.首先采用Random()函数来生成一个随机的数字SelectNum,数字的范围跟数据库中现存的题量相关,不能超过现有题目数量,不然会出现产生的数字抽不到题目。

2.判断该数字SelectNum是否已经存在。方法是将该数字与已经抽取的题号逐个进行比较,也就是遍历已经存在的题号数组tempsetpd,如果数组为空,则证明是第一次抽题,可以直接跳到第3步;如果是在数组中找到了抽取的数字,则证明该题目已经抽取过,不能再抽取;如果遍历整个数组都没找到抽取的数字,则证明尚未抽取过该题目,可以抽取该题号的题目。

3.将抽取到的题目写入缓冲区,以备后续输出使用。同时,需要将SelectNum写入题号数组tempsetpd,以备后续的比较使用。

4.循环上边的过程,继续抽取下一个题目。

经过上述过程的处理,如果数字不重复,则可以选择该习题,并把该题目放入缓冲区,用于后续的输出;否则就重新产生随机数,继续上述的操作,直到找到合适的题目,以生成试题和答案。经过上述过程的处理,抽取的试题不会出现重复。

(三)图像处理问题

在综合题中,题目的题干和答案都采用图像的方式来处理。通常情况下,对图像的处理有两种方式:第一种是将图像存在指定的文件夹中,数据库中写入图像的路径;第二种是将图像进行数据转换直接写入数据库中。二者各有所长,在这里选择第二种方式。这种方式在数据处理时相对复杂,但是后期的维护却相对简单。下面以增加题目时对图像的数据处理为例,介绍图像处理过程。

1.创建具体的题目对象,此处要注意对象中相关属性的类型,在定义类时将相关的返回值类型定义为byte,具体代码为public byte[] Options,用于接收图像数据。

2.需要在界面中设置输入的数据类型为图像,可以将题干中的图像和答案中的图像输入到系统中。

3.将题目对象中的图像数据传输到参数列表中,具体代码为:SqlParameter("@options",SqlDbType.Image);parameters[2].Value = model.Answer。

4.借助DBHelperSQL中的方法,将参数列表中的数据写入数据库,即可完成题目的增加。

(四)题目输出问题

题目输出问题是指试题选择完成后,将试题生成文件的问题。通常的处理方式有两种:一种是将试题写入记事本;另一种是将试题写入Word文档。由于第一种只能处理文本信息,而试题生成系统中的综合题是需要输出图像的,因此在这里选择将试题直接输出Word文档。由于综合题与其他四种类型题目的处理方式不同,在输出时也做了区别处理,因此写入时用了不同的处理方式。具体过程如下:

1.在系统中创建一个Word文档对象WordDoc。

2.将数据库中抽取的题目数据写入WordDoc中,具体语句为WordDoc.Paragraphs.Last.Range.Text += sbzdyzh.ToString()。

3.将题目中的图像数据进行转换后,输出到WordDoc中,具体转换语句为:

Imagezhimg = Image.FromStream(new MemoryStream((byte[])

(dszdyzh.Tables[0].Rows[k]["options"])));

Bitmapzhtu = new Bitmap(zhimg, 100, 100);

stringsfpath= "D://TEMP/" + DateTime.Now.ToFileTime() + ".jpg";

zhtu.Save(sfpath, ImageFormat.Jpeg);

myselzh.EndKey(refuniform, ref ObjNoth2);

WordDoc.InlineShapes.AddPicture(sfpath, ref ObjNoth, ref ObjNoth, ref ObjNoth);

4.关闭WordDoc对象。

四、总结和展望

试题生成系统建成后,可以根据需要自行抽题。通过测试,该试题生成系统可以在10秒内生成一套涵盖判断、选择、填空、简答和综合题等五种题型的完整试题,同时生成答案,将教师从烦琐复杂的出题工作中解放出来,并可以作为题库建设的重要工具。

虽然该试题生成系统能够实现正常的抽题功能,有力地促进了题库建设工作,但是在很多方面还存在不足,比如统计功能、智能化设置等都未能涉及,这将是今后优化试题生成系统开发工作的重点方向。

猜你喜欢
综合题题型试题
离散型随机变量常考题型及解法
一次函数与几何图形综合题
常见数列创新题型归纳
2021年高考数学模拟试题(四)
巧妙构造函数 破解三类题型
2019年高考数学模拟试题(五)
《陈涉世家》初三复习试题
2019届高考数学模拟试题(二)
随机抽样题型“晒一晒”
圆周运动与抛体运动的综合问题求解策略