课程设计报告题目:在线考试系统课程名称:C#课程设计学院:信息工程学院专业:软件工程班级:15软件1学生姓名:马铭璐学号:20150305142指导教师:于启红成绩:开课时间: 2017-2018 学年第二学期目录一、系统的应用背景 (1)1.1系统的应用背景 (1)1.2系统的功能 (1)1.3系统预览 (2)二、系统概要设计 (2)2.1系统实现方案和系统功能模块 (2)2.2数据库逻辑设计 (2)三、系统详细设计 (3)3.1 自动出题功能的设计 (3)3.2监控操作功能的设计 (4)3.3 校对评分功能的设计 (9)3.4 时间提醒功能的设计 (10)四、系统程序设计 (11)4.1 自动出题功能的实现 (11)4.2 监控操作功能的实现 (11)4.3 校对评分功能的实现 (14)4.4 时间提醒功能的实现 (14)五、总结 (15)参考文献 (16)在线考试系统一、系统的应用背景1.1系统的应用背景随着计算机技术的快速发展,学校管理和教学的信息化发展也有进步,各个环节都均衡发展,从软硬件双方面把学校建设成一流的信息管理、教育教学的平台。
目前设计开发的计算机考试系统也是其中重要的一个方面。
传统的考试由于涉及到组织命题、试卷印刷、考试安排、组织阅卷等诸多环节,考试的时间周期长、效率低下。
显然,随着考试类型的增加和考试要求的提高,教师的工作量将会愈来愈大,并且其工作将是项烦琐和容易出错的事情,可以说旧式的考试已经不能适应现代考试的需求了。
人们急切要求利用一些技术来进行计算机考试,以缓解教师的工作负担和提高工作效率,与此同时提高了考试的质量。
其中文件操作是使用Windows操作系统必须掌握的一项基本技能,已成为计算机初级操作员考证、计算机文化基础课考试中必考内容之一[1]。
目前,这些考试大多采用机上考试系统。
文件操作题必须提供考试所需的各文件夹及文件,而且对考生操作的要求需要做到实时监控来判断考生操作是否正确。
因此,Windows文件操作题考试应解决自动评分技术关键技术问题。
目前,许多专家已有计算机应用基础考试系统的研究,本设计主要描述自动评分技术的实现。
1.2系统的功能界面需要达到的要求是要能显示题目,提示时间,选择下一题,提交所有操作。
界面结构如下图1所示:图1界面结构图1.3系统预览窗体上一个text控件用于显示题目,默认显示提示信息:“”考生文件夹位于D盘stu文件夹。
一个label标签显示分,一个label标签显示秒,一个button用于进入下一题,一个button 用于提交评分,窗体的标题为”windows操作题”。
实际界面图2如下所示。
图2 实际界面二、系统概要设计2.1系统实现方案和系统功能模块针对需求分析提出来的运行流程,概要设计这里对自动出题、监控操作、校对评分、时间提醒这四项功能根据需用到的技术进行设计。
2.2数据库逻辑设计在form窗体加载时,程序已经完成操作题目、正确操作记录的读取。
程序中使用到的数据,在各个函数方法中都可以访问,所以定义全局变量最好。
全局变量的定义所下表1所示:表1 全局变量名称类型作用初始值mint Int 分钟59scss Int 秒钟59cur Int 当前操作题号0strtext String[] 存放题目无studone String[] 存放考生操作无sysdone String[] 存放正确操作无myDocs string考生文件夹d:\stu三、系统详细设计3.1 自动出题功能的设计自动出题这个功能使用到了,StreamReader这个类,在读写文件的过程中,Filestream 只可以进行以字节为单位原始数据流进行读写操作,为此,C#中提供了功能更加强大的StreamReader来支持文件的读写. StreamReader可以进行以字符为单位的数据读写操作。
我们使用到构造函数StreamReader(String string, Encoding encoding)。
这里的String 对象不是简单的字符串而是具体文件的地址,然后根据用户选择编码去读取流中的数据。
自动出题功能是是一项非常智能的功能,旨在题库中随机检索出指定数量的题目,按顺序显示出来,本设计的题库题目不多,实现了题目的全部检索,按顺序显示。
题库中题目按通过文本的方式保存在考生文件夹的”question.dat”文件中,每到题目的存放格式如下:题目1行数n1行1行2…行n1题目2行数n2行1行2…行n2…题目n行数nn“question.dat”文件内容如图3所示。
程序在创建form对象时候,调用form对象的构造函数通过字节流将整个文本按行读入,首先读入行数n,知道这个题目有几行,接着读入n行字符,存放在字符串数组string[] strtext里,接着读入下一题的行数。
图3 文件内容3.2监控操作功能的设计监控操作,需要利用到Windows的文件变化通知,调用CreateFile函数获得文件夹句柄,再调用ReadDirectoryChangesW获得文件变化通知。
这里要熟悉CreateFile和ReadDirectoryChangesW的使用。
CreateFile这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:控制台对象、通信资源对象、目录对象(只能打开)、磁盘设备对象、文件对象、邮槽对象、管道对象。
其函数原型:HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);lpFileName一个指向无终结符的字符串的指针,来指明要创建或打开的对象的名字。
dwDesiredAccess指明对象的控制模式。
一个应用程序可以包含读控制、写控制、读/写控制、设备查询控制。
这个参数的取值可以是下面这些的组合如下表2所示:表2 dwDesiredAccess参数表参数作用0 指定设备查询控制:程序可以不访问设备就查询到设备属性。
GENERIC_READ 指定读控制,可以从对象中读取数据(指针将可以移动)。
GENERIC_WRITE 指定写控制,可以向对象中写数据(指针将可以移动)。
dwShareMode指定对象的共享模式。
如果dwShareMode==0,表示是互斥使用的。
如果CreateFile打开成功,则别的程序只能等到当前程序关闭对象句柄CloseHandle后才能在打开或使用。
使用下面这些值的组合来表示对象的共享模式如下表3所示:表3 dwShareMode参数表参数作用FILE_SHARE_DELETE 打开操作只有在删除请求发生时才能返回成功FILE_SHARE_READ 打开操作只有在读控制请求发生时才能返回成功FILE_SHARE_WRITE 打开操作只有在写控制请求发生时才能返回成功lpSecurityAttributes一个指向SECURITY_A TTRIBUTES结构对象的指针,决定返回的句柄是否被子进程所继承。
如果lpSecurityAttributes参数为NULL,句柄就不能被子进程继承。
dwCreationDisposition指明当打开的对象存在或不存在的时候各需怎样处理。
这个参数必须是一下值的其中之一,参数如下表4所示:表4 dwCreationDisposition参数表参数作用CREATE_NEW 创建新文件/对象(当对象已经存在是将返回失败)。
CREATE_ALWAYS 总是创建(如果对象存在就覆盖它,清除当前属性,把文件属性和dwFlagsAndAttributes指定的标志相结合)。
OPEN_EXISTING 打开文件(如果不存在就返回失败)OPEN_ALWAYS 存在就打开;若不存在,假如dwCreationDisposition==CREATE_NEW就创建一个新文件。
TRUNCATE_EXISTING 存在就打开,且清空文件内容(至少要有GENERIC_WRITE权限);若文件不存在就返回失败。
dwFlagsAndAttributes指定文件属性和标志。
hTemplateFile把具有GENERIC_READ权限的句柄指定为一个模板文件。
这个模板文件提供了文件属性和扩展属性,用于创建文件。
而ReadDirectoryChangesW如果函数成功,返回值为非零。
函数原型如下所示:BOOL WINAPI ReadDirectoryChangesW(__in HANDLE hDirectory,__out LPVOID lpBuffer,__in DWORD nBufferLength,__in BOOL bWatchSubtree,__in DWORD dwNotifyFilter,__out_opt LPDWORD lpBytesReturned,__inout_opt LPOVERLAPPED lpOverlapped,__in_opt LPOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine);hDirectory为对目录进行监视的句柄,被监视的目录必须打开FILE_LIST_DIRECTORY的访问权限。
lpBuffer为一个指向DWORD类型的缓冲区,其中可以将获取的数据结果将其返回。
这个缓冲区的定义是FILE_NOTIFY_INFORMATION结构。
这个缓冲区充满要么同步或异步,这取决于如何打开目录什么价值给予lpOverlapped参数。
nBufferLength,指lpBuffer的缓冲区的大小值,以字节为单位。
bWatchSubtree,监视子目录. 一般选择 TRUE。
dwNotifyFilter,对文件过滤的方式和标准。
该过滤器的标准,功能检查,以决定是否等待操作完成。
这个参数可以是一个或多个下列值,参数如下表5所示:表5 dwNotifyFilter参数表参数作用FILE_NOTIFY_CHANGE_FILE_NA ME 任何文件名改变都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
变化包括重命名,创建或删除文件。
FILE_NOTIFY_CHANGE_DIR_NAM E 任何目录名称改变都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
改变包括建立或删除一个目录。
FILE_NOTIFY_CHANGE_ATTRIBU TES 任何属性变化,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。