APP下载

考试管理系统的程序设计

2013-11-19郭向东王丽峰

中国教育网络 2013年9期
关键词:新题题库备份

文/郭向东 王丽峰

本文主要介绍基于Authorware和Access开发考试管理系统的方法。从题库管理、考试设置、注册管理到成绩回收,给出了逻辑结构和程序代码,其中对题库管理进行了比较详细的陈述。

笔者曾在《中国教育网络》2013年2~3月上发表了一篇题为《基于Authorware和Access的考试系统设计》的文章,就考试系统的设计进行了详尽的介绍。严格说来,它是一个考试客户端。一个完整的系统,应由考试子系统、数据库和管理子系统构成。它们之间的信息流关系如图1所示。很明显,这是一种传统的C/S模式。先是由管理端将数据库中为考试提供若干约束性设置的数据表和各类试题库进行更新或更换;再是考试端访问数据库获取相关信息和考题,考试完后交卷,将得分写入数据库;最后是管理端将数据库中考生分数回收、将题库备份后清空,以备下一次(科)考试。

为保证系统正常运行,数据库中可供考试端和管理端访问的数据表至少应有:shezhi存放科目名称、时限、各题型小题数及小题分;zhuce存放注册考生的学号、姓名、密码;chengji存放考生的学号、姓名、各大题得分及总成绩;而xuanzeti、tiankongti、duoxuanti等表,则分别存放单选、填空和多选等题型题目的编号、题干、各选项、正确答案。

图1 考试客户端信息关系流

图2 管理与系统

本文将基于Authorware和Access对考试管理系统的设计进行探讨。

考试管理系统的工作就是对考前和考后的数据库进行管理和处理,具体功能和流程图如图2所示。

首先,管理端必须与位于服务器上的数据库建立连接。在封面上的“服务器”文本框中(如图3所示)键入其位置,比如用局域网中某一台计算机A010充当服务器,这时可以键入\A010,回车。“图2”中“服务器”交互的“*”图标的程序和“连接数据库”图标的程序相继运行,按指定的位置、账户和密码完成连接:

position:=EntryText

--记录键入的位置。

dblist:="DSN=test info;"

图3 考试管理系统登录界面

dblist:=dblist^"Description=试题库;"

dblist:=dblist^"FIL=MS Access;"

dblist:=dblist^"DBQ="^position^"\数据包\shitiku.mdb;"

dblist:=dblist^"uid=auth;"

dblist:=dblist^"pwd=123456;"

result:=tMsDBRegister(4,dbtype,dblist)

接下来,“操作”图标的程序运行,打开数据库:

Databasename:="test info"

ODBCError:=""

ODBCHandle:=ODBCOpen(WindowHandle,ODBCError,Dat abasename,"","")

至此,管理端便可开始考试管理工作了。

科目时间设置

考试客户端作为一个考试平台,所承接的绝不会只是单一科目的考试,其科目名称、题目数量、分数分配、时间限制等都会有所不同。因此,在一场考试之前,考试管理端要将有关信息送入数据库,以供考试客户端访问并初始化。

图4 科目时间群组设置

由于时限、科目名称、各大题的小题数量、分数等设置信息量小,完全可以在系统的显示页面上即时输入。因此,我们采用“文本响应”的方式来实现。“科目时间”群组的设置如图4的“层3”,其他群组类似。在“填空”、“单选”和“多选”的题数设置时要注意键入的数值必须小于或等于题库中现有的题量。为了避免错误,在对应的图标中安排有相应的程序(以“单选”为例):

danx_num:=EntryText

sqlstring:="select count(*) from xuanzeti"

jilu_danx:=ODBCExecute(ODBCHandle,sqlstring)

if danx_num>jilu_danx then

SystemMessageBox(WindowHandle,"当前单选题库题目只有"^jilu_danx^"题。"^Return^"设置不得超过此数。","提醒",48)

GoTo(@"单选项")

end if

整个显示页面如图5所示。用8个变量将相应文本框中的设置信息记录下来,单击“确定”,便写入数据库。“确定”图标(图4)的程序如下:

sqlstring:="update shezhi set 科目="^"'"^kemu^"'"^",时限="^timelim

sqlstring:=splstring^",填空题数="^tk_num^",小题分1="^tk_fen

sqlstring:=sqlstring^",单选题数="^danx_num^",小题分2="^danx_fen sqlstring:=sqlstring^",多选题数="^duox_num^",小题分3="^duox_fen^"where shezhi.ID=1"

gengxin:=ODBCExecute(ODBCHand le,sqlstring)

ODBCClose(ODBCHandle)

SystemMessageBox(WindowHandle,"考分/时间设置成功","告知",48)

GoTo(@"操作")

图5 显示页面

题库管理

“题库管理”有三个子功能:分大类题型“传送新题”,“备份旧题”,“清空旧题”。

“传送新题”——是将当前考试要使用的题目送达题库,以供考试组题。新题文件应事先准备好,考虑到源文件最好不要依赖操作系统之外的第三方软件,我们采用txt文件。至于文件名,应固定下来。比如用于单选题传送的新题文件,取名为“传送新题_danx.txt”。新题文件中,题目编号从1开始,自然连续,不得缺号(因为缺号会在考试端随机组题时造成错误),物理顺序不限。值得特别提醒的是,用记事本编辑题目时,一定要注意每一题的各项之间用制表位分隔,而两题之间用回车符分隔,不然就会造成传送失败。同时,要注意与表结构吻合,以单选题为例,每小题均由“编号”、“题干”、“答案A”、“答案B”、“答案C”、“答案D”、“正答”等7项数据组成,不得出现缺项或错项。为了避免不同计算机上“本地磁盘”安排的不确定性,程序要求待传文件应放在c:盘上。

程序如下:

建数组,读txt源文件,检测其行数。

result:=Array("",7)xintilist:=ReadExtFile("c:\传送新题_danx.txt")xintiline:=LineCount(xintilist)

用数组变量循环读取i行j项的数据并写入xuanzeti表中的各字段,若有空项,此题不写(数据库中已设置,无须程序),并告知。

repeat with i:=2 to xintiline

resultstring:=GetLine(xintilist,i)

repeat with j:=1 to 7

result[j]:=GetLine(resultstring,j,j,Tab)if result[j]="" then

SystemMessageBox(WindowHandle,"第"^i-1^"题第"^j^"项空缺或错位,此题不能传送。"^Return^"请修改完善后再传送!","告知",48)

end if

end repeat

sqlstring:="insert into xuanzeti (编号,题干,答案A,答案B,答案C,答案D,正答)values("^result[1]

sqlstring:=sqlstring^","^"'"^result[2]^"'"^","^"'"^result[3]^"'"^","^"'"^result[4]^"'"^","^"'"^result[5]^"'"^","^"'"^resu lt[6]^"'"^","

sqlstring:=sqlstring^"'"^result[7]^"'"^")"

chuanshong:=ODBCExecute(ODBCHandle,sqlstri ng)

end repeat

测出库中xuanzeti表里的记录总数,与源文件比较,并告知用户。

sqlstring:="select count(*) from xuanzeti"

jilu_num:=ODBCExecute(ODBCHandle,sqlstring)

if jilu_num<>xintiline-1 then

SystemMessageBox(WindowHandle,"新题传送少了"^xintiline-jilu_num-1^"道题。"^Return^"题中不要使用西文单引号!","告知",48)

else

SystemMessageBox(WindowHandle,"新题悉数传送。共"^jilu_num^"道题。","告知",48)

end if

新题传送的关键是如何读取txt文件中一行(也是一题)的各项。程序使用ReadExtFile()函数读取整个源文件,再用LineCount()函数检测出总行(题)数,而GetLine()函数根据参数安排的不同既可从字符串中读出指定的某一行,也可读取其中的某一项。再辅以数组变量和循环,问题就迎刃而解了。

“备份旧题”——是将库中现存的题保存到txt文件中,以备未来使用或存档之需。同理,备份文件也被指定存放在c:上,待用户稍后取走。请看程序:

AppendExtFile("c:\备份旧题_danx.txt","

编号 题干

答案A 答案B

答案C 答案D

正答Return

sqlstring:="select min(编号) from xuanzeti"minid:=ODBCExecute(ODBCHandle,sqlstring)

sqlstring:="select max(编号) from xuanzeti"

maxid:=ODBCExecute(ODBCHandle,sqlstring)

图7

--查出最小的ID值和最大的ID值

repeat with i:=minid to maxid

sqlstring:="select * from xuanzeti where xuanzeti.编号 ="^i

jilu:=ODBCExecute(ODBCHandle,sqlstring)

AppendExtFile("c:\备份旧题_danx.txt",jilu^Return)end repeat

acctotxt:=ReadExtFile("c:\备份旧题_danx.txt")

txtline:=LineCount(acctotxt)

--从access备份形成的txt文件中得出记录的条数。

SystemMessageBox(WindowHandle,"旧题备份完毕。共"^txtline-1^"条。"^Return^"请在c:\取走文件"^"“"^"备份旧题_danx.txt”。","告知",48)

GoTo(@"题库操作")

与前面传送新题相反,它是将数据库中的信息写入txt文件,使用函数AppendExtFile()先创建txt文件,并将字段名写入,再循环读取数据库中各条记录,追加进该文件。

无论是传送还是备份,系统都要提示用户文件名是什么,放在哪里,注意些什么问题。大大提高了软件的易用性。

“清空旧题”——是将当前题库中的记录删除,只保留表结构,以备传送新题。程序代码非常简单:

SystemMessageBox(WindowHandle, "您确实要清空吗?", "警告" ,36)

sqlstring:="delete from xuanzeti"

qingkong:=ODBCExecute(ODBCHandle,sqlstring)

注册管理

因为每场考试都可能是不同的考生,为了节省时间,减少折腾,我们常常需要预先集体批量注册,把当场考试的考生信息传送至数据库,让考生开考时直接登录。

注册的传送、备份、清空与题库管理类似,只是对接的数据表不同而已。

成绩回收

考生的原始成绩信息,可以分析出很多反映试卷质量指标和教学质量指标的数据,如考试信度、效度、区分度、难度和及格率、优分率、平均分等,在程序中加入相应的模块很容易实现。考虑程序的简明,本系统未做安排。“成绩回收”只对考生最基本的成绩信息进行回收,包括“序号”、“学号”、“姓名”、“填空”、“单选”、“多选”、“总分”等。为了方便识别回收的成绩文件,程序在创建成绩文件时,文件名中包含“科目”和“日期”的信息,因此,之前要对“科目”变量kemu和“日期”变量riqi赋值。

“确定”图标中源程序如下:

AppendExtFile("c:\"^"《"^kemu^"》"^"成绩_"^riqi^".txt","序号 学号 姓名填空 单选 多选 总分"^Return)

sqlstring:="select min(ID) from chengji"

minid:=ODBCExecute(ODBCHandle,sqlstring)

sqlstring:="select max(ID) from chengji"

maxid:=ODBCExecute(ODBCHandle,sqlstring)

--查出最小的ID值和最大的ID值

repeat with i:=minid to maxid

sqlstring:="select * from chengji where chengji.ID="^i

jilu:=ODBCExecute(ODBCHandle,sqlstring)

AppendExtFile("c:\"^"《"^kemu^"》"^"成 绩 _"^riqi^".

txt",jilu^Return)

end repeat

acctotxt:=ReadExtFile("c:\"^"《"^kemu^"》"^"成绩 _"^riqi^".txt")

txtline:=LineCount(acctotxt)

--从access回收形成的txt文件中得出记录的条数。

SystemMessageBox(WindowHandle,"成绩回收完毕。共"^txtline-1^"条。"^Return^"请在c:\取走文件"^"“"^"《"^kemu^"》"^"成绩_"^riqi^".txt”。","告知",48)

GoTo(@"封面2")

当然,我们还可以为“成绩回收”增加选择性回收的功能,使其更加方便和完善。

如果不用考试管理系统,我们也可以手工对数据库进行操作,但是相当麻烦的工作,而且一要求用户有使用数据库的技能,二要求计算机能提供Access环境。特别是数据库的安全可能因此受到威胁,结构可能遭到破坏,甚至招致整个系统瘫痪。可见,考试管理系统的作用是十分重要的。

猜你喜欢

新题题库备份
VSAT卫星通信备份技术研究
整式乘法新题拾贝
新题赏析
“勾股定理”优题库
“轴对称”优题库
创建vSphere 备份任务
“轴对称”优题库
“整式的乘法与因式分解”优题库
新题速递
旧瓶装新酒天宫二号从备份变实验室