以计算机和现代网络技术为特征的现代信息技术极大地促进了社会经济的发展,也引发了一场知识和信息的革命。自20世纪90年代以来,国际教育界出现了以信息技术(IT)的广泛应用为特征的发展趋向,国内学者称之为教育信息化现象。
什么是教育信息化呢?教育信息化是指以现代信息技术为基础的新教育体系,包括教育观念、教育组织、教育内容、教育模式、教育技术、教育评价、教育环境等一系列的改革和变化。其主要特点是在教学过程中广泛应用以电脑多媒体和网络通讯为基础的现代化信息技术。
教育信息化使现行的教育方式面临着前所未有的挑战。为了迎接新世纪的挑战,国务院转发了《面向21世纪教育振兴行动计划》,教育部将按照统一规划的原则,分三个层面推进教育信息化:第一个层面是以多媒体计算机技术为核心的教育技术在学校的普及和运用;第二个层面是网络的普及和应用,利用网上资源提高教学质量;第三个层面是开办现代远程教育,建设并提供大量的网络资源,不断满足社会日益增长的终身教育需求。
我国的教育科研网经过十多年的建设,已初具规模,但是在此基础上的网络资源利用率并不高,很多可以用网络基础设施及现有的硬软件条件实现的教学过程仍然沿用传统的方式,这无疑是对现有网络资源的浪费,追根究底,主要是因为与教学相关的应用系统的开发还比较匮乏。
1.1.2 传统的考试活动
我国近年来在实行教学体制的改革,对检验教师教学效果和学生学习效果的手段也一直在探讨中,但是在现在以及将来的一段时间内,教师出卷——学生答卷模式仍然是大多数学校首选的手段。而且多数情况下还是沿用传统手工处理方式,传统手工方式对处理主观性试卷的有一定的优越性势,但又不可避免的将出现以下问题。
1. 试卷缺乏随机性:因为在手工方式下,由教师手工编写具体的试卷,其中的每道试题均由教师指定,每次考试只有有限的一两套试卷,对于每个考生来说缺乏随机性,这就有可能发生下面两种情况,一种就是试卷在从教师向学生传递的过程中发生泄密,因为这个传递过程要经历好几个环节;另外一种则是在考试过程中难以从技术上避免作弊行为的发生,因为在多数情况下某门课程的所有考生都面对内容,形式完全相同的一套试卷,虽然现在有的考试采取了A/B卷的方法,但是仍不能算是一种行之有效的方法。
2. 教师的工作量极大,负担重:这主要表现在出卷环节和评卷环节上。出卷时,教师一方面要总结、整理本学期的教学内容和归纳知识要点,另一方面还要手工出题组织试卷。考试完毕后,学生返回的试卷均要由教师手工评阅评分,最后还要由教师登记分数、讲评试卷。可见教师在整个考试过程中的工作量大,工作效率不高。
3. 考试场所缺乏灵活性,考生必须在统一规定的考试地点进行考试(有时甚至具体到考试座位),这对本地考生可能问题不大,但有时却给外地考生带来了很大的不便。而且,每个考场必须由专门监考人员管理,这也是一笔不小的人力资源开销。
4. 此外,这种方式无法适应现代远程教育的需要。
本文所讲到的考试系统即是考虑到学校用传统的手工方式处理考试活动的不足,旨在用现代信息技术将考试活动纳入到学校的教育信息化系统的建设中,以充分利用网络资源来共享学校的教学资源。这也是本课题的目的所在。
1.2 开发工具的选择
1.2.1 Delphi简介
Delphi是面向对象的可视化编程工具,利用该工具既可以开发系统软件,也可以开发包括数据库软件在内的各种应用程序。Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-Oriented Language)、当今世界上最快的编辑器、最为领先的数据库技术。对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。其主要特点有:
1. 集成化的开发环境设计功能:可以在一个集成的环境中完成应用程序的开发、测试和维护。
2. 优秀的界面设计功能:Delphi提供了大量的用于设计界面的控件,用它们可以设计出各种优秀的用户界面。而且,Delphi还可以自动生成众多的定制界面,极大地简化了界面设计工作。
3. 强大的数据库功能:Delphi提供了许多与数据库相关的控件,用它们可以快速开发功能强大的数据库应用程序。Delphi中内置的数据库引擎支持访问Paradox、AccessFoxpro、dBase、Informix、Oracle、Sybase以及SQL Server等多种数据库。
4. 支持Internet/Internet开发:Delphi的Client/Server版本提供了几个用于开发Internet/Internet应用程序的组件,这些组件可以处理与Web服务器的所有通信服务。
5. 支持ActiveX控件:Delphi提供了创建ActiveX控件的向导。创建的ActiveX控件可以用于其他开发工具,如C++、Java、Visual Basic以及PowrBuilder等。
Delphi实际上是Pascal语言的一种版本,但它与传统的Pascal语言有天壤之别。一个Delphi程序首先是应用程序框架,而这一框架正是应用程序的“骨架”。在骨架上即使没有附着任何东西,仍可以严格地按照设计运行。您的工作只是在“骨架”中加入您的程序。缺省的应用程序是一个空白的窗体(Form),您可以运行它,结果得到一个空白的窗口。这个窗口具有Windows窗口的全部性质:可以被放大缩小、移动、最大最小化等,但您却没有编写一行程序。因此,可以说应用程序框架通过,为用户应用程序的开发打下了良好的基础。Delphi已经为您做好了一切基础工作——程序框架就是一个已经完成的可运行应用程序,只是不处理任何事情。您所需要做的,只是在程序中加入完成您所需功能的代码而已。
面向对象的程序设计(Object-Oriented Programming,简记为OOP)是Delphi诞生的基础。OOP立意于创建软件重用代码,具备更好地模拟现实世界环境的能力,这使它被公认为是自上而下编程的优胜者。它通过给程序中加入扩展语句,把函数“封装”进Windows编程所必需的“对象”中。面向对象的编程语言使得复杂的工作条理清晰、编写容易。说它是一场革命,不是对对象本身而言,而是对它们处理工作的能力而言。对象并不与传统程序设计和编程方法兼容,只是部分面向对象反而会使情形更糟。除非整个开发环境都是面向对象的,否则对象产生的好处还没有带来的麻烦多。而Delphi是完全面向对象的,这就使得Delphi成为一种触手可及的促进软件重用的开发工具,从而具有强大的吸引力。
一些早期的具有OOP性能的程序语言如C++,Pascal,Smalltalk等,虽然具有面向对象的特征,但不能轻松地画出可视化对象,与用户交互能力较差,程序员仍然要编写大量的代码。Delphi的推出,填补了这项空白。您不必自己建立对象,只要在提供的程序框架中加入完成功能的代码,其余的都交给Delphi去做。欲生成漂亮的界面和结构良好的程序丝毫不必绞尽脑汁,Delphi将帮助您轻松地完成。它允许在一个具有真正OOP扩展的可视化编程环境中,使用它的Object Pascal语言。这种革命性的组合,使得可视化编程与面向对象的开发框架紧密地结合起来。
1.2.2 Access 简介
Access2000数据库管理系统是Microsoft Office2000套件的重要组成部分,是Access的最新版本,可在Windows xp环境下运行。Access2000适用于小型商务活动,用以存贮和管理商务活动所需要的数据。Access2000不仅是一个数据库,而且它具有强大的数据管理功能,它可以方便地利用各种数据源,生成窗体(表单),查询,报表和应用程序等。
数据库是有结构的数据集合,它与一般的数据文件不同,(其中的数据是无结构的)是一串文字或数字流。数据库中的数据可以是文字、图象、声音等。
Microsoft Access是一种关系式数据库,关系式数据库由一系列表组成,表又由一系列行和列组成,每一行是一个记录,每一列是一个字段,每个字段有一个字段名,字段名在一个表中不能重复。每个表都有N个记录组成,一个记录占一行,每一个记录由实体的基本属性的字段组成。表与表之间可以建立关系(或称关联,连接),以便查询相关联的信息。Access数据库以文件形式保存,文件的扩展名是MDB。
Access 2000数据库由六种对象组成,它们是表、查询、窗体、报表、宏和模块。
表(Table) ——表是数据库的基本对象,是创建其他5种对象的基础。表由记录组成,记录由字段组成,表用来存贮数据库的数据,故又称数据表。
查询(Query)——查询可以按索引快速查找到需要的记录,按要求筛选记录并能连接若干个表的字段组成新表。
窗体(Form)——窗体提供了一种方便的浏览、输入及更改数据的窗口。还可以创建子窗体显示相关联的表的内容。窗体也称表单。
报表(Report)——报表的功能是将数据库中的数据分类汇总,然后打印出来,以便分析。
宏(Macro)——宏相当于DOS中的批处理,用来自动执行一系列操作。Access列出了一些常用的操作供用户选择,使用起来十分方便。
模块(Module)——模块的功能与宏类似,但它定义的操作比宏更精细和复杂,用户可以根据自己的需要编写程序。模块使用Visual Basic编程。
与Access 以前的版本比较,Access2000新增了许多功能,字段类型增加了OLE对象和超级链接,特别是与Internet的融合,在数据库中可以直接链接到指定的Web页面或网络文件,也可以把Web页面上的表格导入到数据库。Access 2000可以方便地利用各种数据源,包括dBASE, FoxBase,FoxPro,Excel,Word 等。Access 2000增加了数据库访问的安全机制,可对表一级设置访问许可权。Access 2000还可以方便地利用FoxPro数据库、Excel电子表格的数据,还可以和Word混合使用,打印通用信函或信封。
在安装Access 2000后,在“程序”菜单中会出现Microsoft Access项,单击“开始” |“程序”|“Microsoft Access”,启动Access 2000。启动后会出现一个对话框,对话框中有两个组合框,如果要新建一个数据库可以选择“空数据库”或“数据库向导”选项,如果要打开已存在的数据库,则选择“打开已有数据库”选项,并选择要打开的数据库文件,然后单击“确定”按钮。
1.2.3 C/S 简介
C/S模式即客户机/服务器(Client server)体系结构是当前非常流行的计算机体系结构。在这种体系结构中,客户机提出请求,服务器对客户机的请求作出回应。
在客户机/服务器体系结构中,客户机负责管理用户界面、接收用户数据、处理应用逻辑、生成数据库服务请求,然后将这些请求发送给服务器,并且接收服务器返回的结果,最后再将这些结果按照一定的格式返回给用户。服务器接收客户机的请求,处理这些请求,并把处理结果返回给客户机,这些处理结果包括访问数据库的结果数据和执行状态例如成功或失败。 在典型的C/S数据库应用中,数据的储存管理功能,是由服务器程序独立进行的,并且通常把那些不同的(不管是已知还是未知的)前台应用所不能违反的规则,在服务器程序中集中实现,例如访问者的权限,编号不准重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)这背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序可以变的非常“瘦小”,麻烦的事情,都交给了服务器和网络。在C/S体系的下,数据库真正变成了公共、专业化的仓库,受到独立的专门管理。
第2章 系统设计
2.1 功能设计
系统的开发,主要包括后台数据库的建立和维护,以及前端应用程序的开发两个方面.前者要求建立起资料一致性、完整性强和资料安全性好的数据库;而后者则要求应用程序具有功能完备、易使用等特点.经过分析,我们使用Borland公司的Delphi6.0所提供的各种面向对象开发工具,尤其是资料窗口这一方便而简洁的操纵数据库的智能化对象.采用Access2000进行后台数据库的设计,建立了DZJS.mdb数据库,放置2张不同用途的表,用于存放考生登录信息、题库信息等.
考生通过系统提供注册界面,输入用户名和密码进行注册,考生注册后系统会自动把注册信息保存到数据库的用户表格中供管理员操作;通过登录界面,考生输入正确的用户名和密码,即可登录到考试系统,考生登录后,系统自动为其建立一个考生文件夹,并分别从各类题库中随机抽取考题,形成一份试卷.
系统的功能分布在服务器端与客户端的计算机上,在服务器端设置面向教师的功能,在客户端设置面向考生的功能。
服务器端应用程序的主要功能如下:
1. 维护 对课程的题库进行初始装入和日常维护,对系统中的其他数据库如用户表进行维护。此功能只有超级管理员才可以进行增、删、改、查询。
2. 选题 系统提供指定选题,并提供试卷、答卷的打印功能。
3. 开考 作开考前的准备工作,包括设置考试的相关信息如题目的难易程度等。系统分为难、低二个档次的试题供考生选择。题型选择有选择题,计算题和分析题。
客户端应用程序的主要功能如下:
1. 认定 考生在进入系统时必须输入考生的相关信息,如用户名、密码。未进行注册的考生不得进入系统参加考试,考生注册后系统自动把此信息录入到用户表的数据库中。
2. 答题 考生经系统确认进入考试环境后系统即在屏幕上显示相应的试卷并提供组件。答题完毕退出时,系统提示考生是否保存次试卷。
3. 自测 学生可以针对自己学习的特点,从试题库选择试题,形成针对性的试卷进行测试,并给出标准答案供考生参考。
2.2 数据库设计
一级考试系统的规模较小,故只建立一个数据库(DZJS.mdb).在此数据库基础上,建立考生登录情况表、操作题题库、选择题题库、数据库题库,Word题题库、在数据库连接方面,采用了Delphi6.0附带的Borland数据库引擎ADO.使用ADO的ADO管道连接用MSAccess设计的后台数据库,建立一个名为DZJS的数据源.在系统的OLEcontainer中放入访问数据库的控件,将其ADOconnction指向DZJS。
系统中主要的数据文件如下:
1. 试题库:用于存放课程的试题,试题库的结构由试题的属性即科目、编号、类型、难度、分值、内容、答案和文本形式等字段组成。
2. 考生库 用于存放考生的信息包括用户名、密码。
2.3 界面设计
为了验证考生身份,设计了一个登录界面,考生登录以后,直接到试卷编辑界面。这样的好处是方便简捷。
2.4 数据文件结构
2.4.1 考试模板基本表
试卷模板表用来记录一份试卷的基本信息,包括所选课程、难度、试题类型等。如表2-1
表2-1 考试模板基本表
字段名 | 类 型 | 长 度 | 说 明 |
ID | Int | 4 | 自增型 |
SCORE | Int | 50 | 分值设置 |
TYPE_1 | Char | 8 | 题型 |
DIFLEVEL | Char | 8 | 难度 |
SUBJECT | Char | 1 | 考试类型(课程) |
BLOBDATA | OLE | 20 | 数据流 |
EXT | Char | 3 | 文本形式 |
2.4.2 学生模板基本表
该表由系统动态产生,主要存储考生的基本信息,包括用户名、用户密码等。如表2-2
表2-2 学生模板基本表
字段名 | 类 型 | 长 度 | 说 明 |
ID | int | 4 | 用户名 |
PASSWD | Char | 16 | 用户密码 |
QUES | Char | 4 | 提示问题 |
KEY_1 | Char | 6 | 提示答案 |
第3章 系统实现
3.1 功能模块
1.注册模块. 注册账号和密码自动存入数据库中。
2.登录模块 用户验证即正确输入用户名和密码如果输入的数据与数据库中数据一直,系统将提供登录成功。
3.数据库操作模块.自动从数据库题题库中抽取题目,供考生完成建立数据库文件、编辑等一系列操作。
4.Word字表处理模块.从Word题题库中抽取题目,使用OLE技术自动打开Word,让考生在Word环境中完成操作。
3.2 注册功能的实现
procedure TForm3.Button1Click(Sender: TObject);
var
ID,MA :string ;s : string;begin if trim(edit1.Text) <> '' then ID := Trim(Edit1.Text) else showmessage('请输入您的帐号!'); if trim(edit2.text) <> '' then MA := Trim(edit2.text) else begin showmessage('请输入您的密码!'); exit; end; if trim(edit2.text) <> trim(edit3.text) then begin showmessage('密码和确认密码不一致!'); exit; end;try s:='select * from use where id ='+''''+ Trim(edit1.text)+'''' ; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(s); ADOQuery1.Open;exceptend; if not(ADOQuery1.IsEmpty) then begin showmessage('该帐号已经存在!') end else begin ID:=edit1.Text; MA:=edit2.Text; adocommand1.CommandText:='inserT
into
use(id,passwd) values('+''''+ID+''''+','+''''+MA+''''+')'; adocommand1.Execute; showmessage('添加成功'); end;
3.3 登录功能的实现
procedure TForm1.Button3Click(Sender: TObject);
var
ID,MA :string ;s : string;begin if trim(edit1.Text) <> '' then ID := Trim(Edit1.Text) else showmessage('请输入您的帐号!'); if trim(edit2.text) <> '' then MA := Trim(edit2.text) else begin showmessage('请输入您的密码!'); exit; end;try s:='select * from use where id='+''''+ Trim(edit1.text)+'''' ; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(s); ADOQuery1.Open;exceptend; if ADOQuery1.IsEmpty then begin showmessage('您输的帐号不存在!') end else begin if MA = Trim(ADOQuery1.FieldByName('passwd').AsString)
then begin form2.Show; form1.Hide; end else begin showmessage('您输入的密码不正确!') end; end;
3.4 数据库功能的实现
客户端的应用程序要访问服务器端的数据库,例如在进行考生认定时要访问用户表;在进入答题界面时要访问试题库。
系统采用ADOconnection实现与数据库的直接连接,即可以完全由相关的数据连接组件实现连接而无需另外的支撑程序。
方法如下:
1. 择ADOconnection控件,双击此控件出现如下图3-1、图3-2所示
图 3-1
图 3-2
2. 配置Object Inspecter中的connection的属性为true,loginsprompt的属性为false。
3. 系统采用ADOQuery实现查询功能
3.5 Word字表处理功能的实现
主要介绍一下OLE自动化:
OLE自动化是一种为WINDOWS设计的交互进程通信机制,它让一个应用程序驱动或自动完成另一个应用程序,如在C++中创建EXCEL中的表格等。它克服了链接和嵌套中存在的缺点,即无法用编程手段对对象进行控制。实现了对OLE组件的编程式控制。
OLE自动化包括两部分应用程序:一个是把OLE组件暴露出来使之可控制的应用程序,叫做OLE自动化服务器;另一个是利用OLE服务器提供的组件,对该对象进行控制操作的应用程序,叫做OLE客户。
每个OLE对象都有属性(Property)和方法(Method),OLE自动化服务器的编写者决定哪些属性和方法将通过OLE自动化暴露出来,而私有对象对于外部用户来说是不可见的。OLE客户编程人员只需知道包含对象的应用程序的名称、对象的类的名称和想要使用的属性和方法的名称,就可以使用自动化服务器了。
OLE自动化服务器有两种创建方法:即进程内服务器和进程外服务器。进程内服务器是与客户应用程序在同一进程内运行,进程内服务器一般以DLL文件的形式存在;进程外服务器则作为一个单独的进程,在自己的地址空间中运行,一般以EXE文件的形式存在。
此系统是在Delphi中通过Ole的方法控制MS Word,主要采用的方法是通过位于System面板上的Olecontainer控件用于在应用程序的窗口上创建一个OLE用户区域,用于实现Delphi与外部某个对象的接口,当然也可以实现Delphi与Word对象的接口。用此方法是最简单的Ole嵌入,能够直接将Word文档调用,只需要调用TOleContainer的Run方法就可以将word文档直接启动。且这样启动的Word文档与Delphi程序是一个整体(从界面上看),但是它存在不可克服的缺点,即不能通过Delphi控制word文档,所以不能实现将灵活操纵word的目的。
在应用程序的实现过程中,将会运用到大量的数据控件,这必然要调用相应的数据组件.于是,就需要在各个窗体中添加数据组件.这可能会造成组件的混淆.在Delphi6.0中提供的OLEcontainer,可以很好的解决这个问题,将所有的数据组件都放到OLEcontainer中.当其它窗体需要访问数据库时,只要在其单元文件中引用OLEcontainer的单元文件,就可以直接访问到数据库中的数据了.本应用程序中OLEcontainer其设计如图3-3所示
图3-3
下面是其实现程序:
procedure scdsBLOBDataBeforePost(DataSet: TDataSet);
procedure scdsBLOBDatBeforePost(DataSet: TDataSet);
private
function GetMaxID : Integer;
{ Private declarations }
public
{ Public declarations }
end;
var
dmolecontainer: Tdmolecontainer;
implementation
//uses Unit2, Unit1, Unit4, Unit7, Unit8, Unit9, Unit10, Unit3;
{$R *.dfm}
function Tdmolecontainer.GetMaxID: Integer;
begin
try
scdsMaxID.Open;
try
Result := scdsMaxID.Fields[0].Value + 1;
except
on Exception do
Result := 1;
end;
finally
scdsMaxID.Close;
end;
end;
procedure
Tdmolecontainer.scdsBLOBDataBeforePost(DataSet: TDataSet);
begin
if (VarIsNull(DataSet.FieldByName('ID').Value)) then
DataSet.FieldByName('ID').Value := GetMaxID;
end;
procedure
Tdmolecontainer.scdsBLOBDatBeforePost(DataSet: TDataSet);
begin
if (VarIsNull(DataSet.FieldByName('ID').Value)) then
DataSet.FieldByName('ID').Value := GetMaxID;
end;
end..
第4章 考试系统的流程介绍
考试系统首页是登录界面,打开Project2即可看到如图4-1所示的考试登录书面。但是考生必须先注册得到系统验证后才能进行登录工作如图4-2,当应试学生进入到考试首页,点击“Go”后系统会先要求你输入[用户名]和[密码]后才会进入考试的第二页;此后,系统就直接进入考前设置界面如图4-3所示,并要求你键入各题型的数目与试题的难易程度,以进行考前的试卷设置工作,待上述核对正确后,系统即领你进入本次考试内容。考试内容由老师订做,考试题库资料由老师不断更新和增删,系统即会将所点选的内容合并成一份试卷,可省去老师出题的时间。点击“开始考试”按钮,此时,系统会提示你“试卷完成” 如图4-4所示,并且瞬间就有一套与你设置相应的试卷自动生成,对此套试卷系统提供保存功能,以便考生复习。如图4-5所示。
图4-1 登录界面
图4-2 注册界面
图4-3 考前设置界面
图4-4 试卷完成界面
图4-5 保存试卷面
第5章 组卷策略
在题库系统建设中,试题质量控制与参数设置、组卷策略是最重要的两个环节;题库建成后,我们需要输入一些查询参数,系统将根据这些参数抽出最适合要求的试题,组成能够实际使用的试卷,定义这种查询参数以及对这些参数进行变换算法,我们称之为组卷策略。组卷策略的实质是将对人比较直观明了的组卷参数变换成计算机能够直接操作的试题属性项,然后根据这些属性项,在题库中抽取试题组成试卷。因此,完整的组卷策略应该由三部份组成:试题属性项定义、组卷参数的定义、变换算法的说明。根据组卷方式和评价的类型不同,我们可以将组卷策略划分三大类型:智能组卷、相对评价组卷、绝对评价组卷。下面我将对第一种组卷策略作简要说明。
智能组卷只需要设置试卷的一些整体属性参数和题型结构参数,便可以组出一份满意的试卷,它对题目的知识点难度分布没有特殊要求,只设平均难度和平均区分度参数,参数设置简单直观,其组卷步骤为:
置总体参数:试卷标题、总题数、分值、平均难度;
设置题型比例表,示例值见表5-1,检查约束条件,生成最终组卷参数原型表,表的格式见表5-1
表5-1 题型比例表
题型 | 试题数 | 分数 | 难易程度 |
A | 10 | 12 | 难 |
B | 5 | 10 | 易 |
… | … | … | … |
N | 8 | 5 | 难 |
注:表中数据为示例数据,A、B…N 表示有(n)个题型。
1. 试卷难度的选择:在平均难度计算模式表中随机取一模式值,得出这份试卷的试题的难度程度,将此难度程度变换成最终组卷参数表中的难度级别参数。
n:难度的等级数,这里为5;Nn:表示各难度级别,n的取值范围是1~难度的等级数;m:题型比例表中试题的题型数;Mm:某一类题型,m的取值范围为1~题型比例表中试题的题型数;num:某类题型所占的题数;j、tmp:中间变量;算法说明:
j=m
SortMn(num) (将题型按题数多少从多到少排列)
WHILE j>0 do
BEGIN
IF num>n THEN
IF Nn>Sn THEN Extract(n, Sn) (此类题型抽n道题,第n道题的难度程度为Sn(Sn为题型分数比),若Nn<Sn,则此题型不抽)
Nn=Nn-Sn
num=num-n
Else
WriteLeftMn(num) (将此题型记录在剩余试题表中)
SortLeftMn(num) (并按剩余试题的多少从多到少排列)
End if
SortMn(num) (将题型按题数多少从多到少排列)
j=j-1
END
HandleRemainItem(num)(按比例分配剩余的试题)
2. 形成最终抽题的组卷参数表
通过以上几步变换步骤,形成最终的组卷参数表,最终抽取试题的组卷条件都是通过该表生……。
结 束 语
本系统使用Delphi6.0开发前台应用程序,采用Access进行后台数据库设计,实现了一个应用于数字电路技术基础教学的考试系统.由于使用结构化设计方法,系统功能易于扩充和更新,有良好的易维护性.在数字电路技术基础课程教学实践中,将该系统作为学生课后练习和考前模拟训练的辅助学习工具,取得良好效果.
在设计本系统之初,我的计算机编程知识几乎为空白,特别是编程语言,除了在上课时学到的一些教学语言外,我对一些新的、实用的、功能强大的语言几乎没有什么接触。 在老师和同学的帮助下,我首先用了将近一个月的时间对Delphi及Access的知识进行了强化补习,然后再根据所学的软件工程的知识,用大约一个半月的时间完成了从最初的数据库设计到最后Delphi界面的设计及代码的实现,并在这个过程中进一步熟悉了Pascal和MS SQL Server。 在这两个多月中,我按照软件工程的生命周期方法学来完成设计,即系统的需求分析、总体设计、详细设计、系统调试等开发步骤,分阶段地完成各设计任务。接着,根据设计任务书的要求,对自己需要完成的部分进行了系统的规划,根据需求分析的要求,对数据库进行设计规化,并通过前台Delphi作为界面的设计工具,对系统进行了详细设计、编码。 测试工作也是本设计的主体部分,用了大约3周的时间来完成。在设计基本完成之后,又用了大概2周的时间改进系统的性能和技术文档的编写整理,最后完成毕业设计。 在完成本设计的过程中,我既感受到了面对自己无法解决的问题时的苦恼,也体会到问题最终得以解决时的快乐。同时,也总结了以下一些经验: 1. 一个详细周密的计划对于完成一项任务的重要性。实际上,我对这次作业着手较早。但由于刚开始时间较松,在学习时就想到哪学到哪,没有认真计划。到后来发现同学们的进度都已经赶上甚至超过我,这才又着急起来,赶紧找经验丰富的同学出主意,制定出详细的计划,这才按时完成了任务。 2. 学习一门程序语言,实践是最好的方法。我对Delphi和Access的学习实际上分为两个阶段。前一阶段为学习语言而学习语言。在这一阶段中,我总有隔雾观花的感觉,学得似是而非。后一阶段边实践边学习,很多前一阶段不甚了了的问题得到迎刃而解。 3. 要学会运用互联网工具。互联网是一个具有大量资源的信息宝库,在这次毕业设计中如果没有互联网也许我多花一倍的时间也完不成任务。所以一定要会并善于运用互联网工具。 完成这次设计后回过头来看,我的这项作业完成得并不完美。还有很多需要提高和改进的地方。 首先,是系统的功能还太单一,有一些实际工作中需要用到的功能在分析时没有考虑进去,也没能实现。比如网络在线功能。 其次,是设计过程中时间分配不合理,后期紧张的时间给我的工作带来很大的被动。 三是知识积累还不够,有很多知识都是临到用了才去补,这样学到的知识毕竟不牢,而且用起来也不灵活。 总之,经过这次毕业设计,我深刻认识到要完成一项任务首先必须有一个详细周密的计划,要有系统的思维方式和方法,对待一个新的问题,要耐心、要善于运用已有的资源来解决;要勇于实践,在实践中发现和解决问题,要相信自己有解决问题的能力和勇气。 同时,通过此次毕业设计,我不但对Delphi和Access有了一定的认识,最重要积累了使用软件工程的思想来开发软件的经验,破除了以前对软件开发工作望而生畏的神秘感,摸索出了一套分析问题解决问题的方法,这使我有信心和勇气在以后的生活和工作中面对更多的困难。
由于时间和能力等原因,论文难免存在疏、漏、谬、误等,敬请各位专家和同行们予以批评指正,谢谢!
致 谢
通过这次毕业设计,论文作者基本上掌握了开发一个考试题库系统的基本思路和实施步骤。在设计和论文写作的整个过程中,指导教师XXX教授在各方面都给予了全面的指导和帮助。导师的精深渊博知识、求实创新、勤奋严谨的治学风范、忘我的工作作风时刻熏陶着我;导师的因材施教、诲人不倦的授业精神给学生留下了深刻的印象,这将使我受益终身。
在校期间,得到网络教育学院各级领导和辅导老师的亲切关怀和无私的培养,使作者在学习的过程学到了许多做人的道理。在此作者向他们道声:您们辛苦了!
感谢西南交通大学计算机与通信工程学院、网络教育学院、电气工程学院等老师多年来在工作、学习上给予的热情关怀、指导与帮助。
另外,互联网上一些朋友也给我完成设计提出了很多宝贵的意见和无私的帮助。这对于我以后的学习和工作都有很大的帮助,在此对他们表示由衷的感谢。
特别感谢我的姐姐XXX对我的默默奉献,在学习上的理解和大力支持!感谢父母及家人多年来的在生活和学习上的鼓励和支持!
参考文献
1 清宏计算机工作室. 《Delphi编程技巧(网络与数据库篇)》,北京: 机械工业出版社 , 1999.2
2 吕伟臣. 《Delphi入门与提高》,北京: 清华大学出版社, 2000.4
3 朱振元. 《Delphi面向对象程序设计及其应用》 ,西安: 西安电子科技大学出版社, 2003.1
4 电子工业出版社. 《Access2000开发实例全书》,北京:电子工业出版社,1999.1
5 (Carter,J.)《.数据库设计与编程实例详解》,北京: 电子工业出版社, 2001.8
6 王海滨. 《Delphi6.0学习教程》,北京:北京大学出版社, 2002.1
7 肖永明,张子江. 《Delphi6.0开发基础与范例》,北京:电子工业出版社, 2000.10
8 萨师煊,王珊. 《数据库系统概论(第二版)》, 北京:高等教育出版社, 2003.12
9 张海藩. 《软件工程导论(第四版)》,北京:清华大学出版社出版, 2003.12
10 陶宏才. 《数据库原理及设计》,北京:清华大学出版社出版, 2004.2
11 刘瑞新,汪远征,李凤华. 《Delphi程序设计教程》,北京:机械工业出版社出版
12 左美云,邝孔武. 《信息系统的开发与管理教程》,北京:清华大学出版社,2001.7
13 朱振元. 《Delphi面向对象程序设计及其应用》,西安:西安电子科技大学出版社,2000.5
14 朱振元,一个面向对象应用程序的设计与实现,《计算机应用》,1998.6
附 录
抽题源代码清单部分:
str:=edit5.Text;
i:=strtoint(str);
str:=edit2.text;
if str<>'' then
begin
sFileName := ExtractFilePath(Application.ExeName) + '标题3';
sFileName := sFileName + '.' +'doc';
opendialog1.FileName:=sfilename;
ofilename:=opendialog1.FileName;
wordapplication1.documents.Open(ofilename,oconfirmconversions,
oreadonly,oaddtorecentfiles,opassworddocument,opasswordtemplate,
orevert,owritepassworddocument,owritepasswordtemplate,oformat,oencoding,ovisible);
itemindex := 1;
worddocument1.connectto(wordapplication1.documents.item(itemindex));
wordapplication1.options.checkspellingasyoutype := false;
wordapplication1.options.checkgrammarasyoutype := false;
worddocument1.Range.InsertAfter(edit2.Text+'分');
worddocument1.Range.Copy;
worddocument2.Sentences.Last.Paste;
worddocument2.Range.InsertAfter(' '+#13);
worddocument1.Close(savechanges,originalformat,routedocument);
j:=strtoint(str);
score1:=(j*i) div 100;
score:=0;
j:=0;
k:=1;
dmolecontainer.scds1.Active:=false;
if (shu=false) and (mo=false) then
begin
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="易"' ;
end;
if (shu=true) and (mo=false) then
begin
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="易" and subject="模拟"' ;
end;
if (shu=false) and (mo=true) then
begin
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="易" and subject="数字"' ;
end;
dmolecontainer.scds1.Active:=true;
d:=0;
y:=dmolecontainer.scds1.RecordCount;
while (score<score1)and(k<=y)and(d<dmolecontainer.scds1.RecordCount) do
begin
randomize;
i:=random(dmolecontainer.scds1.RecordCount);
j:=j+i;
if j>=dmolecontainer.scds1.RecordCount then
begin
i:=j-dmolecontainer.scds1.RecordCount;
j:=i;
dmolecontainer.scds1.First;
end;
dmolecontainer.scds1.MoveBy(i);
n:=0;
m:=1;
while (m<k) and (n=0) do
begin
if a[m]=dmolecontainer.scds1.Fields.Fields[0].AsInteger then
n:=1
else m:=m+1;
end;
if n=0 then
begin
a[k]:=dmolecontainer.scds1.Fields.Fields[0].AsInteger;
k:=k+1;
score:=score+dmolecontainer.scds1.Fields.Fields[1].AsInteger;
if fileexists('c:\temp.doc') then
deletefile('c:\temp.doc') ;
dmolecontainer.scds1BLOBDATA.SaveToFile('c:\temp.doc');
if pd=true then
begin
if dmolecontainer.scds1.Fields.Fields[4].AsString='数字' then
begin
d:=d+1;
shuzis:=shuzis+dmolecontainer.scds1.Fields.Fields[1].AsInteger;
end
else
monis:=monis+dmolecontainer.scds1.Fields.Fields[1].AsInteger;
if shuzis>=shuzi then
begin
dmolecontainer.scds1.Active:=false;
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="易" and subject="模拟"' ;
dmolecontainer.scds1.Active:=true;
shu:=true;
pd:=false;
j:=0;
d:=k-d-1;
end;
if monis>=moni then
begin
dmolecontainer.scds1.Active:=false;
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="易" and subject="数字"' ;
dmolecontainer.scds1.Active:=true;
mo:=true;
pd:=false;
j:=0;
end ;
end
else
d:=d+1;
ofilename:=opendialog2.FileName;
wordapplication1.documents.Open(ofilename,oconfirmconversions,
oreadonly,oaddtorecentfiles,opassworddocument,opasswordtemplate,
orevert,owritepassworddocument,owritepasswordtemplate,oformat,oencoding,ovisible); itemindex := 1;
worddocument1.connectto(wordapplication1.documents.item(itemindex));
wordapplication1.options.checkspellingasyoutype := false;
wordapplication1.options.checkgrammarasyoutype := false;
str1:=inttostr(z);
worddocument1.Range.InsertBefore(str1);
z:=z+1;
worddocument1.Range.Copy;
savechanges := wddonotsavechanges;
originalformat := unassigned;
routedocument :=unassigned;
worddocument1.Close(savechanges,originalformat,routedocument);
worddocument2.Sentences.Last.Paste;
worddocument2.Range.InsertAfter(' '+#13);
end;
end;
str:=edit2.text;
j:=strtoint(str);
score1:=j-score;
score:=0;
j:=0;
k:=1;
dmolecontainer.scds1.Active:=false;
if (shu=false) and (mo=false) then
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="难"' ;
if (shu=true) and (mo=false) then
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="难" and subject="模拟"' ;
if (shu=false) and (mo=true) then
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="难" and subject="数字"' ;
dmolecontainer.scds1.Active:=true;
d:=0;
y:=dmolecontainer.scds1.RecordCount;
while (score<score1)and(d<dmolecontainer.scds1.RecordCount)and(k<=y) do
begin
i:=random(dmolecontainer.scds1.RecordCount);
j:=j+i;
if j>=dmolecontainer.scds1.RecordCount then
begin
i:=j-dmolecontainer.scds1.RecordCount;
j:=i;
dmolecontainer.scds1.First;
end;
dmolecontainer.scds1.MoveBy(i);
n:=0;
m:=1;
while (m<k) and (n=0) do
begin
if a[m]=dmolecontainer.scds1.Fields.Fields[0].AsInteger then
n:=1
else m:=m+1;
end;
if n=0 then
begin
a[k]:=dmolecontainer.scds1.Fields.Fields[0].AsInteger;
k:=k+1;
score:=score+dmolecontainer.scds1.Fields.Fields[1].AsInteger;
if fileexists('c:\temp.doc') then
deletefile('c:\temp.doc') ;
dmolecontainer.scds1BLOBDATA.SaveToFile('c:\temp.doc');
if pd=true then
begin
if dmolecontainer.scds1.Fields.Fields[4].AsString='数字' then
begin
d:=d+1;
shuzis:=shuzis+dmolecontainer.scds1.Fields.Fields[1].AsInteger;
end
else
monis:=monis+dmolecontainer.scds1.Fields.Fields[1].AsInteger;
if shuzis>=shuzi then
begin
dmolecontainer.scds1.Active:=false;
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="难" and subject="模拟"' ;
dmolecontainer.scds1.Active:=true;
shu:=true;
pd:=false;
j:=0;
d:=k-d-1;
end;
if monis>=moni then
begin
dmolecontainer.scds1.Active:=false;
dmolecontainer.scds1.CommandText:='select * from SHITI where TYPE_1="选择" and DIFLEVEL="难" and subject="数字"' ;
dmolecontainer.scds1.Active:=true;
mo:=true;
pd:=false;
j:=0;
end ;
end
else
d:=d+1;
ofilename:=opendialog2.FileName;
wordapplication1.documents.Open(ofilename,oconfirmconversions,
oreadonly,oaddtorecentfiles,opassworddocument,opasswordtemplate,
orevert,owritepassworddocument,owritepasswordtemplate,oformat,oencoding,ovisible);
itemindex := 1;
worddocument1.connectto(wordapplication1.documents.item(itemindex));
wordapplication1.options.checkspellingasyoutype := false;
wordapplication1.options.checkgrammarasyoutype := false;
str1:=inttostr(z);
worddocument1.Range.InsertBefore(str1);
z:=z+1;
worddocument1.Range.Copy;
savechanges := wddonotsavechanges;
originalformat := unassigned;
routedocument :=unassigned;
worddocument1.Close(savechanges,originalformat,routedocument);
worddocument2.Sentences.Last.Paste;
worddocument2.Range.InsertAfter(' '+#13);
end;
end;
end;
{ 以上抽取选择题目 }
{ worddocument2.Save; }
wordapplication1.visible := true;
{ worddocument2.SaveAs(ofilename,template);}
{begin
savechanges := wdsavechanges;
originalformat := unassigned;
routedocument := unassigned;
try
wordapplication1.quit(savechanges, originalformat, routedocument);
wordapplication1.disconnect;
except
on e: exception do
begin
showmessage(e.message);
wordapplication1.disconnect;
end;
end;
end; }
edit5.SelectAll;
edit5.CopyToClipboard;
showmessage('试卷完成');
{ if savedialog1.Execute then
begin
ofilename:=savedialog1.FileName;
worddocument2.SaveAs(ofilename,template);
end;}
end;
procedure TForm2.SpeedButton5Click(Sender: TObject);
begin
form1.Show;
form2.Hide;
end;
procedure TForm2.Edit2Change(Sender: TObject);
begin
end;
end.
备注:抽取分析题和计算题的源代码部分略掉。
,毕 业 设 计 任 务 书
班 级 xxx 学生姓名 xxx 学 号 xxxxxxx
开题日期: 年 月 日 完成日期: 年 月 日
题 目 考试题库系统的设计与实现
题目类型:工程设计 √ 技术专题研究 理论研究 软硬件产品开发
一、 设计任务及要求
1.按照某学院教务部门管理考试信息系统的需求分析及总体设计方案。
2.考试管理包括 用户管理、试题管理、试卷管理、登录用户权限管理、用户注册管理等几个方面 。
3.采用Access数据库,使用Delphi6.0 开发工具实现本需求分析所涉及的功能,保证软件能够正常使用
二、 应完成的硬件或软件实验
用Delphi工具开发系统,并进行系统测试。
三、 应交出的设计文件及实物(包括设计论文、程序清单或磁盘、实验装置或产品等)
毕业设计、毕业论文、含毕业设计论文和源代码的光盘
四、 指导教师提供的设计资料
1.电子稿件和电子图书
2.朱振元编著 Delphi面向对象程序设计及其应用 西安电子科技大学出版社
3.吕伟臣编著 Delphi入门与提高 清华大学出版社
五、 要求学生搜集的技术资料(指出搜集资料的技术领域)
1.软件工程方法资料。
2.考试题库系统开发资料
3.Access 、Delphi6.0 资料
六、 设计进度安排
第一部分 熟练课题,收集、整理课题相关资料 ( 1 周)
第二部分 系统需求分析与总体设计 ( 2 周)
第三部分 熟悉系统实现平台:熟练掌握delphi6.0及Access ( 2 周)
第四部分 详细设计、编码、测试 ( 3 周)
第五部分 毕业设计论文文档编写整理 ( 2 周)
评阅或答辩 ( 1 周)
指导教师: 年 月 日
学院审查意见:
审 批 人: 年 月 日
诚信承诺
一、 本设计是本人独立完成;
二、 本设计没有任何抄袭行为;
三、若有不实,一经查出,请答辩委员会取消
本人答辩(评阅)资格。
承诺人:
年 月 日
目 录
摘 要I
摘 要
目前考试系统越来越被人们所重视,它可以为院系教务部门的决策制定提供强有力的数据支持。为此,作者开发了考试题库系统,以现代计算机技术为工具来管理学生的考试进程,方便教师和管理考试人员的工作。
本系统探讨《数字电子技术基础》课程无纸化考试系统的设计方法,并加以实现,主要负责生成试卷和管理题库。用户根据不同的权限访问系统,对试卷的编码、生成等信息进行日常维护,并能生成试卷供学生测试。从数据库的安全性出发,根据需要可对数据库或数据表中的信息进行备份和恢复,以防止因不慎丢失数据而给用户造成不必要的麻烦。
本系统在设计过程中以人为本,充分考虑了用户的需求,界面力求简单;使用了Delphi6.0开发前台应用程序,采用Access2000为后台数据库开发工具,它是一套完整的基于C/S考试系统。包括考生登入、考生退出、文字录入、数据库操作、Word字表处理等主要模块。系统具有维护简单、使用方便等特点,可应用于数字电路技术基础的教学中。
关键词:考试题库系统, Delphi, Access, 功能模块,无纸化考试
第1章 前 言
本文介绍的无纸化模拟测试系统的实现方式,并采用面向对象的开发工具Delphi来实现系统的功能,系统的主要特点如下:
1. 系统的答题界面美观合理,答题方式方便灵活,系统采用一套可视化的答题组件接受答题信息,而每一答题组件都是根据试卷中试题的题型动态生成的,答题时随试卷中的当前试题的变化而改变。
2. 系统提供了“题库保存”功能,提供“题库打印”功能。
3. 系统具有“考前设置”“考生认定”等一系列的控制功能及“答题”“参考答案”等一系列的处理功能。面向教师的功能和面向考生的功能分别设置在服务器端和客户端,功能完善,可靠性和执行效率较高。
1.1 课题的来源和目的
1.1.1 教育信息化的趋势