专业试题库的设计与实现
摘 要 本文主要叙述了含公式、图片的专业试题库的总体设计、系统功能以及实现方法,并给出了用Ole Automation技术并结合Word VBA实现对公式及图片等专业题目的处理。该试题库在Windows环境下,用Delphi5.0+SQL Server2000+Office2000实现。关键字 试题库 客户服务器 Delphi Word VBA SQL语句 1 引言传统试题库管理系统,都是基于文本型的关系数据库来组织信息和设计开发的。理工类专业试题可能以公式、表格、图形、图像等形式表现,因此用传统的方式开发此类专业试题库在存贮、显示试题时有很大的局限性。本文以笔者开发的某专业试题库系统为例介绍了如何开发含公式、图片的专业试题库。某专业试题库系统是一套用于对《某专业考核试题库》丛书的试题进行计算机管理的应用软件。该系统主要实现丛书文档的批量数据录入、逐个数据录入、修改、检索;手工出题和自动出题;实现了网络化,使得用户可以在客户端进行远程训练、考试;能够跟Word兼容,处理公式和图片类试题;对系统用户统一管理,因人授予其使用功能和访问现有数据库的范围和权限。系统有如下功能模块:数据服务器、试题管理系统、远程训练考试系统。2 技术指标某专业试题库系统运用Delphi5.0作为前台开发工具,采用SQL Server97作为后台数据库,通过在Delphi程序中嵌入Word,实现对试题的编写。开发本课题的核心是试题管理系统的开发,重点是智能抽题部分,难点是实现与Word的结合处理含公式图片的试题、批量录入的实现和三层结构的实现。 软件的实现主要有以下技术指标:⑴ 建立后台数据库.⑵ 运用Delphi5.0动态生成SQL语句。⑶ 通过跟Word 结合实现对试题的录入、显示。⑷ 运用智能算法进行抽题。⑸ 运用Midas技术实现网络功能。⑹ 运用Word VBA技术实现批量试题录入3 功能设计与实现某专业试题库系统分为数据服务器、管理系统和远程训练考试系统三层。如图1所示。图1 总体设计数据服务器:数据服务器是为客户端存放数据的服务器,为管理系统和客户端提供服务。管理系统:管理系统是对《某专业考核试题库》丛书的试题进行管理的系统。主要完成系统设置、试题管理、抽题管理和权限设置。远程训练考试系统:远程训练考试系统(即客户端)主要用于远程计算机调用服务器抽出的试题以及用户在远程进行训练。3.1数据服务器的实现数据交换服务器的关键部件是远程数据模块,它提供了IAppServer接口。客户机数据库应用程序通过IAppServer的AS_GetProviderNames以及ClientDataSet的ProviderName属性指定数据交换服务器上的DataSetProvider或Provider组件。3.2管理系统的实现管理系统是某专业试题库系统的核心,以下重点介绍批量数据录入、Word文档入库和智能抽题算法的设计与实现。3.2.1 批量数据录入批量数据录入是指将规定格式的Word文档录入到数据库中。在每个试题编号前加一个@符号,在每一个答案前加一#作为标志。在文档的最后加一$,表示结束。批量录入是系统实现的难点之一,它是应用Delphi5.0调用Word VBA来实现的,其流程如下图所示:图2 批量录入流程其部分代码及其分析如下://循环开始,如果不是$继续循环 while s[1]<>‘$‘ do begin j:=j+1; pa:=wd1.Paragraphs.Item(j); s:=pa.Range.Get_Text;//判断是否@ if s[1]=‘@‘ then begin if j<>1 then begin filename:=ExtractFileDir(Application.Exename)+‘ emp empa.doc‘; wd2.SaveAs(filename); wd2.Close; wd2.Disconnect;//提取试题编号 stbh:=‘‘; for i:=2 to 22 do stbh:=stbh+s[i]; j:=j+1; pa:=wd1.Paragraphs.Item(j); pa.Range.Copy; quebool:=true; //新建Word文档 并将跟内容粘贴 wa1.Documents.Add(template,newtemplate); wd2.ConnectTo(wa1.Documents.Item(ItemIndex)); wd2.Content.Paste; wa1.Selection.StartOf(unit_,Extend1); wd2.Range.EndOf(unit_,count); end;//如果是#符号,则将内容存放到答案中,是正常内容则继续读取,此处代码略end;3.2.2 将Word文档入库由于《某专业考核试题库》中的试题含有公式及图片,而如何将这些含有公式及图片的试题保存成为一个要解决的难题。在设计时将每个题目及答案看作Word文档,将这些Word文档保存到数据库中便是要解决的问题。在保存这些Word文档时将每个Word文档转换成数据流,以流的形式将这些文件保存到类型为BLOB的字段中,这样就解决了题目的存放问题。在添加一条含有文件流的记录时,首先将非BLOB字段的字段添加到表内,然后通过以只读的方式创建文件流、以写入的方式创建BLOB流、读取缓存、写入数据、保存记录等一系列过程完成数据保存。具体流程如下:图3 Word文档入库过程以下是将Word文档转换成数据流保存到数据库中的代码。questionfilename:=ExtractFileDir(Application.Exename)+‘ emp empquestion.doc‘;//找到文件//以只读的方式创建文件流 MyFile:=TFileStream.Create(questionfileName,fmOpenRead);//以写入方式创建BLOB数据流Stream:=TBlobStream.Create(FieldByName(‘question‘) as TBlobField, bmWrite); MemSize := MyFile.Size; Inc(MemSize); //增加的一字节给结尾的null Buffer := AllocMem(MemSize); try Stream.Seek(0, soFromBeginning); //流指针位置放到最前 MyFile.Read (Buffer^,MemSize); Stream.Write(Buffer^,MemSize); finally MyFile.Free; Stream.Free; end; try begin dmform.Query1STB.Post; ApplyUpdates; CommitUpdates; dmform.Query1STB.close; end; except showmessage(‘保存失败!‘); exit; end;3.2.3 抽题算法抽题算法是管理系统的重点和难点,抽题分人工抽题和自动抽题两部分,人工抽题就是将符合条件的试题选择出来,用户根据自己的需求抽出试题;自动抽题是指计算机根据智能抽题算法来抽取试题。如何智能抽题成为抽题的关键。 人工抽题人工抽题是用户选择抽题的范围(如岗位、系统、适用对象等)后,系统给出所有符合条件的题目,用户根据自己的需求选择需要的题目,将其抽出。题目抽出后暂时保存到一个临时表中,然后将题目及答案合成到一起,然后将其保存到试卷表中。这里抽题用到了SQL语句:SELECT * FROM STB where STBH in(‘+idstring+‘),其中idstring是所有选中的题目的试题编号的集合。 自动抽题自动抽题是根据智能算法抽出试题。为了实现智能抽题,每道试题是指了两个参数,一个是被抽到的次数,另一个是最近抽题时间。这两个参数来决定这道题目是否参加抽题,所以叫做智能因子。智能抽题的算法如下:图4 智能抽题算法其核心代码如下://限制抽出的题目的范围s:=‘ and STBH like‘‘%1______‘‘‘;sqlstring:=‘‘;sqlstring:=‘select * from stb where ID like ‘‘%%‘‘‘+sqlstrings1+s;sqlstring:=sqlstring+‘ and sscm like‘‘%‘+cmbox1.Text+‘%‘‘ and ssfc like ‘‘%‘+fcbox1.Text+‘%‘‘ and sszj like ‘‘%‘+zjbox1.Text+‘%‘‘‘;//抽出全部符合条件的试题with dmform.Query1STB dobegin close; with sql do begin clear; add(sqlstring); end; try open except execsql; end; counter:=0; while not eof do begin counter:=counter+1; next; end;//判断题库数量是否达到待抽出的数量if counter<counter1 then begin showmessage(‘题库数量为‘+inttostr(counter)+‘不足,请重新选择条件‘); exit; end; listbox1.Clear;//进行智能抽题beginfor i:=1 to counter1 dobegin first; Randomize; k:=random(counter); for j:=0 to k do next;//check函数用来判断选中的试题编号是否重复,然后根据智能因子进行调整 if not(check(fieldbyname(‘STBH‘).asstring,listbox1))then begin if idstring=‘‘ then begin idstring:=‘‘‘‘+fieldbyname(‘STBH‘).asstring+‘‘‘‘; listbox1.Items.Add(fieldbyname(‘STBH‘).asstring); end else begin idstring:=idstring+‘,‘‘‘+fieldbyname(‘STBH‘).asstring+‘‘‘‘; listbox1.Items.Add(fieldbyname(‘STBH‘).asstring); end; end else begin first; while not eof do begin if not(check(fieldbyname(‘STBH‘).asstring,listbox1)) then begin idstring:=idstring+‘,‘‘‘+fieldbyname(‘STBH‘).asstring+‘‘‘‘; listbox1.Items.Add(fieldbyname(‘STBH‘).asstring); last; end else next; end; end;上述代码是智能抽题算法的核心,主要是将试题编号选出。编号选出后,通过SQL语句选出各个题目,生成试卷3.3 远程训练考试系统的实现远程训练考试系统包括训练、考试以及查看消息,其中训练功能就是远程抽题的功能,其实现的思路与自动抽题的思路类似,这里就不再累赘。远程考试以及查看消息都是运用SQL语句来实现的,这里不再重点介绍。这里主要介绍客户端如何向数据服务器发出请求并相应请求的。在客户端采用了客户端数据集组件(ClientDataSet)同服务器进行通信的,该组件支持编辑、纠错、检索等功能,它是通过IappServer接口与DataSetProvider组件通信,从而从远程服务器上获得数据。由于在功能设计时使用了大量的SQL语句,所以在进行传递SQL语句时采用了CommandText的传递方式。客户机服务程序通过CommandText属性覆盖掉服务器端Query组件的SQL语句,当open时,指定的语句便初到了服务器上。4 结束语某专业试题库系统界面友好,操作方便,其中加密算法的使用和独特的保存数据的方法使得安全性和可靠性大大增强,系统利用Word文档存取含公式、图片试题的方法、批量录入的方法以及智能抽题的算法在技术上属于先进水平,具有较强的实用性和可推广性,也可以为其他工程技术人员提供应用参考。参 考 文 献1《Delphi5 从入门到精通》, [美]Marco Cantu,电子工业出版社,2000年4月 2《Delphi4 核心编程技术》, 徐新华 等北京希望电脑公司 ,1998年 3《SQL 自学通》,[美] Ryan K. Stephens,Ronald R. Plew机械工业出版社,1998年10月4《Delphi3.0/4.0 多媒体与数据库编程》,吴旭东 余涛清华大学出版社, 1998年10月


0 条评论:
发表评论
订阅 博文评论 [Atom]
<< 主页