本论文在其他论文栏目,由论文格式网整理,转载请注明来源www.lwgsw.com,更多论文,请点论文格式范文查看
基于Authorware通用测试系统的题库设计与实现
[摘 要]分析了利用Authorware技术和SQL Server数据库技术设计通用测试系统题库的方法,对题库的安全性、数据源的网络配置与应用、随机抽题的实现、难易题型的调用以及题库交卷处理等功能进行了研究。
[关键词]题库;Authorware;ODBC;SQL Server
1 引言
随着网络和多媒体技术在教学领域的广泛应用,在CAI软件中建立题库系统,甚至开发专门的考试系统来适应教育发展的要求。在目前的题库设计中,大部分设计采用Access建立题库,利用Authorware图标编程来实现自动选题,这种方式对于题库的安全性和通用性均存在一定的局限性。同时如何对题库中难易题型的智能抽取也是题库设计需要考虑的一个重要方面。目前,许多测试系统的开发,正朝着智能化方向发展。Authorware作为最常用的多媒体教学软件开发工具,具有丰富的系统变量和系统函数,支持数据库和用户自定义函数,强大的扩展性,非常适合设计题库系统。在后台数据库管理方面,SQL Server2000是Microsoft公司最新开发的大型关系数据库管理系统,具有非常强大的关系数据库创建、开发、设计与管理功能。其严格的加密机制与对象认证机制能以密码锁定和访问权限的形式,确保题库管理的安全,并能有效防止黑客和病毒通过网络对题库进行破坏。文章讨论基于Authorware和SQL Server如何设计题库,突出题库设计的关键技术与过程实现,以及各部分的联系。
2 题库系统的设计
1测试系统菜单基本框架,如图1所示:
2 数据源题库的建立与连接
(1) 题库结构,如图2所示:
题库建立及手工连接examdata数据库后,载入ODBC.U32库函数包,在Authorware 6.5版本前,它包含三个函数:ODBCOpen(打开数据源)、ODBCExecute(填入合法参数及SQL指令语句)、ODBCClose(关闭数据源)。但是,ODBCOpen函数只能在建立单一数据源的情况下使用,当要配置其它数据源时,还得重新手工配置。在7.0版本后的ODBC.U32函数包中,新增的ODBCOpenDynamic函数要比ODBCOpen方便灵活得多,并且无须手工启动“配置数据源向导”进行数据源连接。因此,它可以方便操作和关闭多个不同的数据源。
(2) 局域网数据源连接
方法一:利用ODBC.u32库函数包可以方便实现局域网数据源连接,代码及操作如下:
DNS_type:=baReadIni("accesstype", "Type", "", FileLocation^"setup.ini")
if DNS_type="局域网(mdf)" then
ODBCHandle:=ODBCOpenDynamic(WindowHandle,"ErrorVar","DRIVER={SQLserver}; server
="^server^";address="^address^";Database="^DNS_menu^";UID=;PWD=
jensenduan;")
acc_menu:="SELECT menu_text FROM menu ORDER by menu_text"
acc_menu:=ODBCExecute(ODBCHandle, acc_menu)
ODBCClose(ODBCHandle)
end if
执行代码前,确定配置好了数据源的网络使用类型,如图3所示,并以menu.mdf中的数据项menu_text作为试卷名的关联调用。那么系统就会自动将这些信息保存到setup.ini文件里。若选择“局域网”类型,那么系统就自动构建为局域网测试系统。而文件读取函数baReadIni则对系统目录下的setup.ini文件进行读取操作(baWriteIni为写入命令),并返回"Type"所指定的值(局域网(mdf)),用变量DNS_type储存起来,提供联网类型的条件判断。然后进行SQL数据源的连接,即利用ODBCOpenDynamic函数进行数据库连接。接着,利用ODBCExecute打开指定的SQL语句(acc_menu),最后,用ODBCClose来关闭连接(ODBCHandle),释放系统资源。此外,setup.ini里的信息还可以手工对其修改。利用这样的文件操作技术既可以省略了烦琐的数据操作,又可以永久保存一些系统的当前设置,并给用户提供重要信息,同时也方便了对其修改等。当用户下次登录时,系统就可以从setup.ini中自动调用这些设置,以免用户又要重新配置。在setup.ini中还包括了一些目录路径、数据源路径以及信息、图片地址等。
方法二: 利用Tmsdsn.u32库函数包中的tMsDBRegister函数实现数据源的自动配置、增加和删除。语法结构如下:
result := tMsDBRegister(dbReqType, dbType, dbList)
dbReqType:填写1到7的整数值。其中4为增加系统数据源;DbType:指定数据源驱动程序的类型;dbList:指该ODBC数据源名称、描述以及相连的数据库名。结合SQL Server数据库:exam_date.mdf,进行以下操作:首先,载入一个命名为“ODBC自动注册” 的计算图标,输入如下代码:List1:="DSN=examdate;"
List2:="Description=这是一个ODBC自动配置的例子"
server:="server=gui;" –-SQL Server服务管理器名。
address:="address=""^filelocation^"exam_date.mdf;" –-数据库物理地址。
Database:="Database=exam_date;"
Dblist:=List1^List2^server^address^Database
tMsDBRegister(4,"SQL server", Dblist) 最后再结合 ODBCOpen便可对数据库examdate进行操作。
(3) 远程数据源连接
方法一: 利用ENSODEX公司的HOSTSOCKETS中间插件(MiddleWare)来实现通过TCP/IP协议来连接远程数据库。方法二: 先构建一ASP网页,再利用Authorware网络功能ReadURL接口函数完成数据库操作。由ReadURL接口函数将数据库操作的任务交给ASP,由ASP在服务器端完成数据库操作,然后将结果返回给ReadURL函数。再由客户端进行相关的处理操作。方法三: 利用ODBCOpenDynamic也可以实现基于SQL Server远程数据库连接和配置,代码如下:
ODBCHandle:=ODBCOpenDynamic(WindowHandle,"ErrorVar","DRIVER={SQLserver};server="^se
rver^";address="^address^";Network="^Network^";Database="^Database^";UID="^user^";PWD="^其中ODBCOpenDynamic参数项包含有远程服务器,即:SQL Server 服务管理器(server),以及SQL数据源地址(address)、TCP/IP协议(Network)。基于这样的功能,只要对参数变量正确赋值,便可实现远程数据源连接。接着就是编写SQL查询语句以及结合ODBC指令来对数据源的处理调用。
3 题库系统的基本设计
(1) 题库的调用与显示
学生端登陆并开始答题后,对“单选题”、“多选题”、“填空题”、“简答题”进行切换测试。这样便可实现题型的调用和显示。而题型之间的调用和显示是类似的技术。以“单选题”为例,它的试题调用和显示的实现过程如下:
ADD_D_tihao:=[:] –-定义数组ADD_D_tihao[ ]。
find_D_tihao:="SELECT 单选题号 FROM 测试题单选 ORDER by 单选题号"
find_D_tihao:=ODBCExecute(ODBCHandle,find_D_tihao)
Record:=LineCount(find_D_tihao , "\r") –-统计记录个数。
repeat with i:=1 to Record
D_tihao:=GetLine(find_D_tihao,i,i,"\r") –-以记录行的方式读取数据表中的记录。
AddProperty(ADD_D_tihao, D_tihao, "" ) –-将D_tihao记录存入数组ADD_D_tihao里。
end repeat
WriteExtFile(FileLocation^"D_tihao.ini", ADD_D_tihao)
将数组内容写入系统目录下的D_tihao.ini文件里。
代码执行后,在系统流程中有一个名为:"题目列表"的Microsoft forms 2.0 Listbox控件,通过它
可显示试题内容。然后,再有如下代码:
CallScriptIcon(IconID@"打开数据源")
find_D_tihao:="SELECT 单选题号 FROM 测试题单选 ORDER by 单选题号"
find_D_tihao:=ODBCExecute(ODBCHandle,find_D_tihao)
Record:=LineCount(find_D_tihao , "\r")
ADD_D_tihao:=ReadExtFile (FileLocation^"D_tihao.ini")
–-把系统目录下的D_tihao.ini文件的内容读出到变量ADD_D_tihao中。
ADD_D_tihao:=List(ADD_D_tihao) –-将ADD_D_tihao的值以列表的形式存到变量中。
repeat with i:=1 to Record
List_D_tihao:=GetLine(find_D_tihao,i,i,"\r")
da_an:=ADD_D_tihao[List_D_tihao] –-将数组内容赋给变量。
if da_an="" then da_an:="未答"
CallSprite(@"题目列表",#AddItem,i^"\t"^List_D_tihao^"\t"^da_an)
–-向列表框中增加数据项(AddItem),而最后的字符串变量是要增加的内容。
end repeat
CallScriptIcon(IconID@"关闭数据源")
SetSpriteProperty(@"题目列表", #LISTINDEX, 0) –-将列表项索引值设为0 。
代码的实现主要是基于“测试题单选”数据表来给"题目列表"添加单选题号和答题情况,以便用户可直观地对试题进行操作。而D_tihao.ini文件已对一些单选数据即时存储,由ReadExtFile函数读取。通过以上技术还可由列表框中的题号来调用对应的题目内容,方法是:利用“单选”表中的“题号”字段和“测试题单选”表中的“单选题号”字段进行条件查询。即当这两个字段的值相等时,就开始试题内容的调用和显示。在系统中,当按下列表题号项或“提交答案”按钮时,它就会智能地显示相应的题目内容。如果选了答案,还可在题号列表中显示所选答案,并把答案存放到“答题”数据表和D_tihao.ini配置表中(不同的题型,配置表会不同)。待交卷后,根据所选答案为该题评分。至于答案的提交和显示,用到了一些列表显示和数据表的写入操作,其中也还涉及到一些变量的使用,通过这些变量来跟踪用户的答题情况。例如:当选中单选按钮A时,就把选中的“A”答案用变量储存,以便进行相关操作。要实现这种功能,只需设计好实现的SQL代码和条件判断即可。
(2)交卷处理
考生端在规定时间里答题完毕后,便可进行交卷。“交卷”也是题库信息的综合处理。为此,必须将答题信息进行临时读取,并用变量储存,以便提供后台评分处理。由于配置文件D_tihao.ini(单选题)、DX_tihao.ini(多选题)、TK_tihao.ini(填空题)、JD_tihao.ini(简答题)储存着考生作答的答案。所以临时存储是为了交卷后可立即删除这些配置文件,以便增强题库的严密性,防止学生交卷后随意篡改其中的答案。而测试目录会自动恢复到原始状态,使得前一个考生的操作不会影响下一个考生的考试。实现代码如下:
ADD_D_tihao:=ReadExtFile (FileLocation^"D_tihao.ini")
ADD_DX_tihao:=ReadExtFile (FileLocation^"DX_tihao.ini")
ADD_TK_tihao:=ReadExtFile (FileLocation^"TK_tihao.ini")
ADD_JD_tihao:=ReadExtFile (FileLocation^"JD_tihao.ini")
临时存储答题后,以考生学号作为存储条件写入“答题”表中,进行以后的成绩统计。实现代码如下:
addSQL_up:="Update 答题 set 单选题答案='"^ADD_D_tihao^"',多选题答案='"^ADD_DX_tihao^"',填空题答案='"^ADD_TK_tihao^"',简答题答案='"^ADD_JD_tihao^"' where 学号='"^find_ID^"'"
ODBCExecute(ODBCHandle, addSQL_up)
交卷后,删除配置文件代码:
DeleteFile(FileLocation^"D_tihao.ini")
DeleteFile(FileLocation^"DX_tihao.ini")
DeleteFile(FileLocation^"TK_tihao.ini")
DeleteFile(FileLocation^"JD_tihao.ini")
DeleteFile(“FlieName”)函数除了可以删除文件外,还可删除空文件夹;而建立空文件夹命令还可用CreateFolder( “FlieName”); CopyFile(“FlieName” )函数可以复制文件;FileType(“FileName”)函数可以检测文件类型,当文件不存在目标文件夹时,返回0。利用这些函数可以扩展系统的一些文件操作功能。经过以上操作后,就可以进行成绩统计与显示。
(3) 试题设置
如图4所示:后台管理系统为教师提供题库的管理功能:题库的新建、修改、增加、删除等。
题型设置
该部分包括了单选题、多选题、填空题、简答题的设置,以单选题为例,代码如下:
find_R_D_tihao:="SELECT 单选题号 FROM 测试题单选 ORDER by 单选题号"
find_R_D_tihao:=ODBCExecute(ODBCHandle,find_R_D_tihao)
find_D_tihao:="SELECT 题号 FROM 单选 ORDER by 题号"
find_D_tihao:=ODBCExecute(ODBCHandle,find_D_tihao)^"\r" –-多出一个回车符,实现换行。
Record_R:=LineCount(find_R_D_tihao , "\r")
repeat with i:=1 to Record_R
List_R_D_tihao:=GetLine(find_R_D_tihao,i,i,"\r")
if Find(List_R_D_tihao, find_D_tihao)<>0 then
Find为字符模式匹配函数,判断find_D_tihao是否在List_R_D_tihao里,不在则返回0。
find_D_tihao:=Replace(List_R_D_tihao^"\r", "", find_D_tihao)
Replace为字符替换,在这里是把find_D_tihao里的所有List_R_D_tihao^"\r"用空值代替。
end if
CallSprite(@"当次试题列表",#AddItem,List_R_D_tihao) –-向“当次试题列表”中增加题号。
end repeat
Record:=LineCount(find_D_tihao , "\r")
repeat with t:=1 to Record
List_D_tihao:=GetLine(find_D_tihao,t,t,"\r")
CallSprite(@"试题库列表",#AddItem,List_D_tihao)–-向“试题库列表”中增加题号。
end repeat
执行“增加”按钮的执行代码:
TM:=GetSpriteProperty(@"试题库列表", #text) –-获得试题库列表中选定的内容。
把用户选定的内容逐行添加到“当次试题列表”中:
CallSprite(@"当次试题列表",#AddItem,TM)
lindex:=GetSpriteProperty(@"试题库列表", #ListIndex) –-获得用户在试题列表中选定的行号。
CallSprite(@"试题库列表",#RemoveItem,lindex) –-移除用户选择的行号内容。
TM:=GetSpriteProperty(@"当次试题列表", #text) –-获得试题库列表中选定的内容。
执行“移除”按钮的执行代码片段:
CallSprite(@"试题库列表",#AddItem,TM) –-把用户选定的内容逐行添加到“当次试题列表”中。
lindex:=GetSpriteProperty(@"当次试题列表",#ListIndex) –-获得用户在列表中选定的行号。
scount:=CallSprite(@"当次试题列表",#RemoveItem,lindex) –-删除用户选择的行号内容。
(2) 随机抽题
所谓“随机”的含义也就是对一些数据集进行无序性的操作。“随机抽题”就是在输入框中指定抽取题目数量后,无序地抽取题目来进行测试。其实现代码如下:
ti_num:=MojoInputBox("抽取题目数量","请输入抽取题目数量","") –-产生输入对话框。
再利用ti_num设计循环体的次数,以便可对多条题目添加或移除。
SyncPoint(0) –-设置时间同步。
SyncWait(0.5) –-设置等待时间为0.5秒,实现记录增减的延迟效果。
num:=Random(0, (Record-i), 1) –-产生一个由0到Record-i之间的随机题号。
SetSpriteProperty(@"试题库列表", #LISTINDEX, num)
设置列表的随机索引属性,确定num产生的随机题号对应的列表项。
List_DD_tihao:=GetSpriteProperty(@"试题库列表", #text) –-获取SetSpriteProperty后的值。
CallSprite(@"当次试题列表",#AddItem,List_DD_tihao) –-向"当次试题列表"增加获取的值。
lindex:=GetSpriteProperty(@"试题库列表", #ListIndex) –-获取随机的LISTINDEX的值 。
CallSprite(@"试题库列表",#RemoveItem,lindex) –-移除随机的LISTINDEX所对应的项。
“随机抽题”就是根据上述步骤实现,但这种选题方式还存在一定的盲目性,具体表现在它的难度分布和覆盖范围上的不合理性。改进方法如下:
1 随机选择法:计算机每次从题库中随机选择一个习题。但是这样就会有一定的盲目性,可能在习题中出现难度分布不均、覆盖面不广的现象。所以系统中所利用的这种测试方式应进行改进。
2 闪牌排队法:采用轮流法选择习题。先将所有系统练习一遍后,再重新做答错的习题,直到熟练掌握为
止。该法保证学生在难题上有较多的练习机会,但习题量不宜太多。
3 变距排队法(闪牌排队法的改进):控制再次练习时习题出现的顺序,以加深学生对习题的印象。
为了达到良好的测试效果,对系统的选题方式进行改进,这些方法很值得参考。虽然系统可用手动选题替换,但是面临题量较多的情况,这种方式难免也有不足。2和3的实现方法可以采用系统变量或数组对题目出现的顺序或上次测试中答错的题目进行临时跟踪赋值,并用文件录入的形式进行保存,当再次登陆时,系统可以自动调用这些设置。对于3来说,还可以利用“判断图标”控制习题的出现次序,从而保证习题出现的频率和覆盖的范围更合理化。此外,对于试题的难度的分布,以及题目智能地抽取,这是当前的一大热点。它以试题难度作为分类并组合成题库,这样就能保证试题难度的均匀分布。现以1选题法为例来简述:首先,把难度各异的题目进行手工标号,并把它们存入题库相应的表中,或者也可利用配置文件来跟踪标号。接着,在随机抽题技术的基础上,进行对标号的判断和题目的条件筛选,以及难易题目的数量限制等,进行对题库的建立和处理。最后,就初步搭建了试题难度均匀分布的题库。
(4)题库设置
“题库设置”主要完成的功能是题库的新建和删除以及题型的新增和删除,如图5所示:
(1) 新建题库
SQL Server数据库在附加使用时,是不允许拷贝、移动和删除的。这是由于它自身的安全机制所致的。所以,利用SQL Server作为后台题库的新建模板时,必须要分离出该数据库模板,同时要保持以模板数据库名一致,由于SQL Server中多个主数据库可通过同一个日志文件来共用关联,所以保存的路径必须要不同。其代码如下:
old_acc:=OpenFileDlg("请打开SQL题库模板", "", FileLocation^"SQL data", "exam_date.mdf", "*.mdf|*.mdf|All files|*.*|")
生成一个选择SQL Server主数据库模板对话框,并返回模板数据库名。
new_acc:=baGetFilename("save",FileLocation^"exam_date",old_acc,"*.mdf|*.mdf|All files|*.*|", 2+4+32+524288+2097152, "新试题库", FALSE, -1, 0)
保存并返回新增的SQL Server主数据库名(old_acc)。
qr:=CopyFile( old_acc , new_acc ,"Always+" ) –-将源文件old_acc复制到new_acc目标文件。
addSQL:="insert into menu(menu_text) values('"^SubStr(new_acc, (RFind("\\\\", new_acc)+1), (RFind(".", new_acc)-1))^"')" –-向menu数据表(题库)中插入内容。
以上代码建立了一个结构与模板一样的新题库文件。接着利用ODBC指令即可实现该数据库的操作,同时,利用SQL命令exec sp_renamedb还可对题库名的更改。
(2) 删除题库
以下代码均在分离相关数据库,及断开连接时才可实现:
acc_menu:="SELECT menu_text FROM menu ORDER by menu_text" –-查询menu表中的字段内容。
……
del_menu:=ListBox((ScreenWidth-250)/2, (ScreenHeight-100)/2, 50, 10, acc_menu)
产生一个列表框,并增加acc_menu到列表中。
del_menu_:="delete * from menu where menu_text='"^del_menu^"'"–-按条件删除menu表的内容。
DeleteFile(SubStr(DNS_menu,1,RFind("\\\\",DNS_menu))^del_menu^".mdf")
删除与del_menu名字对应的试题库文件。
(3) 题型新增与删除
题目类型的新增和删除功能,也可通过ODBC指令把手工录入的内容写进数据库或更新数据库内容。为此只需在条件判断下更改对应的SQL语句即可实现。
3 总结:
题库系统的构建需要考虑到其通用性、兼容性、安全性等,以及题库数据源的连接和应用技巧,题库的动态管理和维护。本系统充分利用了Authorware强大的交互功能进行题库管理,并灵活采用选题的方法,使得试题难度均匀分布以及合理调用,能根椐用户的实际情况不断更新题库,解决了只能建立单一试题的局限性,并能适用于各个学科,在教学实践中收到了良好的效果。
参考文献:
1、 薛伟胜、王博亮,基于Authorware的网络题库的实现 厦门大学学报(自然科学版),第41卷,第2期,2002.3:258-260
2、徐全生、王艳,基于Authorware题型的自动阅卷系统的设计与实现 沈阳工业大学学报 2005.2第1期
3、 杨象驰 基于authorware的多媒体教学软件设计研究 计算机工程与设计 2004.5第5期
4、 支建飞 基于authorware的网上考试系统的开发 西南民族大学学报·自然科学版 第29卷第3期
5、 赵经成、李贝贝 《网络教学课件制作[M]》 人民邮电出版社 2004.10
6、 雷任风 DIY 一个简易考试系统——用Authorware实现自动化考试 中小学信息技术教育,2003.7
7、 于丽华 也谈用Authorware实现自动化考试 中小学信息技术教育 2003.8:69-70
8、 毕广吉 Authorware使用的外部函数 《Authorware 变量、函数、控件、手册与范例》 电子工业出版社,2003.9