1、长 治 学 院课 程 设 计 报 告课程名称: 软件工程导论 设计题目: 学生考试管理系统 系 别: 计算机系 专 业: 计算机科学与技术 组 别: 第五组 学生姓名: 栗丽兵 学 号: 07407213 起止日期: 2010 年 7 月 7 日 2010 年 7 月 11 日指导教师: 赵秀梅 目 录第一章 考试管理系统可行性分析 .11.1问题描述及开发背景 11.2开发意义、资金消耗及应用范围分析 1第二章 考试管理系统需求分析 .12.1用户需求及功能分析汇总 12.2系统流程图及数据流图 22.3数据字典 22.4数据库设计 3第三章 考试管理系统概要设计 .43.1系统模块划分 4
2、3.2确定目标系统实现方案 5第四章 目标系统详细设计 .64.1数据库设计 64.2创建数据源并通过数据库操作事务对象连接 64.3创建前台控件与数据源间数据传输的数据窗口对象和查询对象 74.3创建数据管道 8第五章 系统编码、测试 .95.1数据管道编程 95.2定义存储过程 125.3数据操作编程 125.4用户自定义查询编程实现 13第六章 测试 .146.1单元模块测试与分析 146.2集成测试与分析 146.3确认测试与分析 15总结 .15参考文献 .171第一章 考试管理系统可行性分析1.1问题描述及开发背景随着教育改革的进行,目前高中阶段教学已逐步采用同大学教学类似的学分制
3、,原先对于学生考试管理成绩资料的那种人工或半人工的管理方式的低效性越来越明显;而对于中学若采购成套资料管理系统,无论从资金还是人员配置方面多少都有些小题大做。鉴于以上话题的诸多特征,策划设计一个功能、可操纵性以及资金消耗与之适合的学生考试管理系统。1.2开发意义、资金消耗及应用范围分析开发此类系统主要是想,在兼顾到性能和资金消耗的前提下,加速中学的信息管理方式同教育改革相适应的速度。该系统预定开发周期为一周,开发人员三人,每天工作八小时。规划同劳动量等值市场开发经费为 500 元(具体规划为:人员酬劳每人每小时酬劳为 20元,共计 420 元;市场调研、计算机设备使用以及交付客户初期的系统适应
4、性维护等经费 80 元。该系统主要面向中学学生考试成绩资料管理人员。第二章 考试管理系统需求分析2.1用户需求及功能分析汇总(1)保密方面:采用密码登陆方式启动。(2) 数据存储管理方面:采用服务器工作站方式,仅在服务器上运行数据库管理软件,各年级办公室的计算机共享数据资源;具备不同服务器间、已购数据库系统间数据块的传输功能。(3)数据操作方面:学生基本信息的录入、修改和查询功能;课程开设情况记录的录入、修改和查询功能;学期考试各课程的考场、开考时间以及考试时长等记录的录入、修改和查询功能;学生成绩的查询功能。(4)易以操纵性:窗口界面布置风格尽量一致,要求输入类的操作尽量少。(5)容错性能:
5、由于操作人员主要为教师或学生,所以对误操作的处理能能力要相对强一些。(6)硬件及系统软件要求:基本的 windowsXP平台即可。2(7)提供必要的维护文档。2.2系统流程图及数据流图系统流程图如图 2-1 所示(其中:“ ”表示后台数据流动,“ ” 表示信息管理员的前端操作) 。数据流图如图 2-2 所示。2.3数据字典(1)名字:事务描述:需管理员操作的活动;(2)名字:后台事务描述:通过激活的事件或数据库系统完成的活动,对于管理员是透明的。图 2-1 系统流程图3(3)名字:学生基本信息定义:学生基本信息=学号+ 姓名+性别+专业+ 总学分+备注位置:数据库(4)名字:课程信息定义:课程
6、信息=课程号+ 课程名+开课时间+学时 +学分位置:数据库(5)名字:考试安排定义:考试安排=考场号+ 考查课程号+开考时间 +考试时长位置:数据库(6)名字:学生成绩定义:学生成绩=学号+课程号+成绩+学分图 2-2 系统数据流图2.4数据库设计E-R图如图 2-3所示。4图 2-3 E-R图第三章 考试管理系统概要设计3.1系统模块划分系统层次结构如图 3-1所示,模块划分如图 3-2所示。图 3-1系统层次结构示意图5图 3-2系统设计模块划分示意图说明:我负责数据库构建模块的设计。3.2确定目标系统实现方案方案一:快速原型增量模式开发优点:开发出最终版本的系统之前,所有原型系统都已通过
7、与用户交互而得到验证,据此产生的规格说明文档正确地描述了用户的要求,因此,在开发过程的后续阶段不会因为发现了规格说明文档错误而进行较大的返工。开发人员通过建立原型系统已经学到了许多东西(至少知道了“系统不应该做什么,以及怎样不去做不该做的事情” ) ,因此,在设计和编码阶段发生错误的可能性也比较小,这自然减少了在后续阶段需要改正前面阶段所犯错误的可能性。劣势:该模式的本质特征是“快速” ,但由于原型系统的用途是获知用户的真正需求,一旦需求确定了,原型版本就将被抛弃。这也决定了其对人员配备和劳动量有较高的要求。方案二:文档驱动模块化一次性开发优点:由其文档驱动的特性,决定了这种方案具有阶段性和依
8、赖性,同时可最大限度推迟系统的具体代码实现。实践表明,对于规模相对较大的软件6项目来说,往往编码开始的越早,最终完成开发工作所需要的时间反而越长。因为,前面阶段的工作没做或做得不扎实,过早地考虑进行程序实现,往往导致大量返工,有时甚至发生无法弥补的问题,带来灾难性结果。可强迫开发人员采用规范的方法严格地规定了每个阶段必须提交的文档,这将使软件开发设计变得相对容易一些。由于是模块化设计,单元编码和测试,最后总装,正使得系统具有了一定的开放性。一者简化了测试阶段复杂度,另一方面也有利于软件发布以后的运行为阶段完善性维护和适应性维护。劣势:系统的开发过程完全由文档驱动,同方案一相比,开发周期可能会较
9、长些。确定:从该系统的规模、应用范围、开发经费消耗和现实的开发意义等方面综合考虑,决定开发过程采用方案二进行。第四章 目标系统详细设计说明:由于在开发过程中我主要负责数据库模块的设计,故接下来的内容将主要叙述数据库模块的详细设计思路。4.1数据库设计根据第二章中图 2-3所示的 E-R数据结构示意图设计了四个而为关系表,分别是:学生基本信息表 xs,如表 4-1所示;课程信息表 kc,如表 4-2所示;考试安排表 ks,如表 4-3 所示;学生成绩表 xs_cj,如表 4-4 所示;4.2创建数据源并通过数据库操作事务对象连接总共创建两个数据源:本地服务器数据源(用于本校日常管理) ,远程数据
10、源(用于上传或下载数据) 。采用 PowerBuilder 的初始化文件 PB.INI 文件,利用通用方式通过事务对象连接数据源。连接的程序流程如图 4-1 所示。表 4-1 学生基本信息表定义名称 数据类型 字节大小 可为空 默认值 备注学号 char 6 否 主键姓名 char 8 否专业名 char 10 否性别 bit 1 否出生日期 datetime 8 否7总学分 float 8 可 0备注 char 20 可 Null表 4-2 课程信息表定义名称 数据类型 字节大小 可为空 默认值 备注课程号 Char 3 否 主键课程名 Char 16 否开课学期 Float 8 可学时 F
11、olat 8 否学分 Float 8 否表 4-3 考试安排表定义名称 数据类型 字节大小 可为空 默认值 备注考场号 Char 3 否 主键课程号 Char 3 否 主键,外键开考时间 datetime 8 可考试时长 int 4 否表 4-4 学生成绩表定义名称 数据类型 字节大小 可为空 默认值 备注学号 Char 6 否 主键,外键课程号 Char 3 否 主键,外键成绩 Float 8 可学分 Float 8 否4.3创建前台控件与数据源间数据传输的数据窗口对象和查询对象d_cjupdata:存储过程类数据窗口对象,用于录入、修改、删除学生成绩表中的记录;d_kc:sql 类数据窗口
12、对象,用于通过课程号参数查询课程表中的对应记录;d_kcpudata:quickSelect 类型数据窗口对象,用于录入、修改、删除课程表中的记录;d_stuupdata: quickSelect 类型数据窗口对象,用于录入、修改、删除学生基本信息表中的记录;d_score:sql 类数据窗口对象,用于通过学号参数查询学生成绩表中的相应记录;d_xs:sql 类数据窗口对象,用于通过学号参数查询学生基本信息表中的相8应记录;query_xs:查询对象,与 d_xs 搭配使用;query_kc: 查询对象,与 d_kc 搭配使用;query_xs_xscj: 查询对象,与 d_score 搭配使
13、用;图 4-1 通过事务对象连接数据源程序流程示意图4.3创建数据管道表结构定义时曾强调,表名、列名、类型、宽度、Null 值等一经确定,便难以修改。要更改表的这些属性,只有利用数据管道。此外我们还经常要复制表的结构及表中部分后全部数据、讲一个表中数据加到另一个表中去(即使两个表的结构不一样),还有讲一个数据库中的表复制到另一个数据库(可能是两个不同类型的数据库包括服务器和本地库) 。数据管道都能满足这些要求。具体创建使用程序流程如图 4-2 所示。9图 4-2 数据管道创建和使用程序流程示意图第五章 系统编码、测试5.1数据管道编程/(1)wf_connectdb(boolean flag,
14、transaction trans)returns Integer 两个入口参数的作用分别为:trans 为定义的事务处理对象; flag=TRUE 表示要连接localdb,否则连接 serverdb。返回参数为 transaction 信息代码Environment env/环境变量String startupfile,start,autocommit/获取 os 的 typeif (getenvironment(env)0 thenmessagebox(string(trans.sqlcode),trans.sqlerrtext)end ifreturn trans.sqlcode/(2
15、)wf_error(integer ret)returns(none)其中入口参数 ret,表示执行数据管道操作返回的错误代码string msgchoose case retcase -1msg=“打不开数据管道“case -211msg=“列数太多“case -3msg=“要创建的表已经存在“case -4msg=“要增加的数据的表不存在“case -5msg=“未建立与数据库的连接“case -6msg=“参数错误“case -7msg=“列不匹配“case -8msg=“访问源数据库的 sql 语句有致命错误“case -9msg=“访问目标数据库的 sql 语句有致命错误“case
16、-10msg=“已经达到指定的最大错误数“case -12msg=“不正确的标语法“case -13msg=“需要关键字,单位指定关键字“case -15msg=“数据管道已经在运行“case -16msg=“源数据库出错“case -17msg=“目标数据库出错“case -18msg=“目标数据库处于只读状态,不能写入数据 “case -20msg=“系统出错:得不到环境信息。n 终止应用.“case -21msg=“系统出错:未知的操作系统。n 终止应用.“end choosemessagebox(“数据管道运行出错“,msg,stopsign!,ok!)/(3)wf_startpipe
17、(transactionsuorcetrans,transaction destrans,string p_object)returns (none)其中三个入口参数:sourcetrans 表示源事务处理对象;desttrans 表示目标事务处理对象;p_object 表示数据库花瓣中创建的数据管道对象int retu_pipe.dataobject=p_objectret=u_pipe.start(sourcetrans,desttrans,w_pipe.dw_1,“计算机“)12if ret1 thenwf_error(ret)elsemessagebox(“数据库管道运行成功“,“操作
18、成功“)end if sle_written.text=string(u_pipe.rowswritten)sle_read.text=string(u_pipe.rowsread)sle_error.text=string(u_pipe.rowsinerror)5.2定义存储过程CREATE PROCEDURE stu_grade ASselect xs_cj.学号,xs_cj. 课程号,xs_cj.成绩,xs_cj.学分from xs_cj;5.3数据操作编程/(1)在数据窗口控件 dw_1 中显示相应表的所有数据dw_1.retrieve()/(2) 将数据窗口控件 dw_1 的焦点一到
19、当前行的下一行dw_1.scrollnextrow()dw_1.selectrow(dw_1.getrow()-1,false)dw_1.selectrow(dw_1.getrow(),true)/(3) 将数据窗口控件 dw_1 的焦点一到当前行的上一行dw_1.scrollpriorrow()dw_1.selectrow(dw_1.getrow()+1,false)dw_1.selectrow(dw_1.getrow(),true)/(4)末行插入一条记录long rowrow=dw_1.insertrow(0)/dw_1.setrow(row)dw_1.scrolltorow(row)d
20、w_1.setrow(row)dw_1.setfocus()/(5)删除当前行的记录dw_1.deleterow(dw_1.getrow()/(6)在当前位置插入一条记录long rowrow=dw_1.insertrow(dw_1.getrow()dw_1.setrow(row)dw_1.scrolltorow(row)dw_1.setfocus()/(7)操作结束后,将数据窗口控件 dw_1 中的数据更新到数据库13dw_1.update()dw_1.reset()dw_1.retrieve()5.4用户自定义查询编程实现/通过动态游标实现int m,nstring mysql,strmy
21、sql=mle_1.text/读取查询语句lb_1.reset() /重置文本框 lb_1 的内容declare mycur dynamic cursor for sqlsa;/声明动态游标变量 mycurprepare sqlsa from :mysql using sqlca;/sqlsa 是 PowerScript 提供的一种数据类型,用来存储动态 Sql 语句所用的所有信息describe sqlsa into sqlda;open dynamic mycur using descriptor sqlda;/打开游标fetch mycur using descriptor sqlda;
22、/读游标m=sqlda.numoutputsif sqlca.sqlcode=-1 thenmessagebox(“,sqlca.sqlerrtext,exclamation!)returnend if/将游标中的记录逐条插到文本框 lb_1 中do while sqlca.sqlcode=0str=“for n=1 to mchoose case sqlda.outparmtypencase typeinteger!,typedecimal!,typedouble!str=str+string(sqlda.getdynamicnumber(n)+“ “case typestring!str=
23、str+string(sqlda.getdynamicstring(n)+“ “case typedate!str=str+string(sqlda.getdynamicdate(n)+“ “end choosenextlb_1.additem(str)fetch mycur using descriptor sqlda;loop14close mycur;/关闭游标第六章 测试6.1单元模块测试与分析(1)数据管道连接测试详见表 6-1 所示。(2)数据操作测试:由于该单元的录入、修改、查询、删除和更新这些操作的控制均由后台数据库系统管理,而后台数据库系统采用的是 Microsoft 发布的
24、成熟系统,故可能出问题主要发生在前台向后台传送操作参数过程中,而这需要同人机交互模块联合测试。所以该测试推迟到集成测试阶段。表 6-1 管道连接测试测试用例 预测 测试结果 分析本地、远程数据库均运行:先上传 50条记录,然后再下载全部数据上传结束,提示成功上传 50 条记录;下载结束,提示出错行数为零上传结束,提示成功上传 50 条记录;下载结束,提示出错行数为零管道运行程序正确仅运行本地数据库服务器:先上传 50行记录,然后下载数据仅尽可上传数据,但上传结果为:所有记录均出现问题上传结束后,返回了 50 条有问题的记录;下载数据失败管道运行程序正确仅运行远程本地数据库服务器:先上传数据,然
25、后下载50 行记录仅尽可下载数据,但下载结果为:所有记录均出现问题上传失败;下载数据结束后,提示全部数据下载失败管道运行程序正确6.2集成测试与分析三模块集成后,对数据库设计方面的测试如表 6-2 所示。表 6-2 集成测试阶段对数据库设计方面的测试测试类型 测试用例 预测 测试结果 分析数据操作测试查询类分别查询确定存在、确定不存在的学生、课程、考试安排、学生成绩记录各一次存在的记录正确显示;不存在的记录,查询失败后弹出出错提示存在的记录均准确显示;不存在的记录查询后提示:不存在由于查询时不需要输入,股不存在输入性错误。15更新类对于学生信息、课程信息、考试安排、学生成绩分别录入格式正确和错
26、误的记录各一条,然后更新;分别修改一条记录,然后更新;分别删除一条,然后更新。每次更新后,到数据库中查看结果录入格式不正确的记录在更新时提示格式不匹配,停止更新;更新成功后,录入正确记录、修改、查询对数据库中记录均发生相应改动更新操作时失败,提示记录类型不匹配;更新操作成功执行,数据库中数据均发生相应变动系统用容错机制限制了输入性操作的健壮性数据管道测 试本地、远程数据库均运行:先上传 50条记录,然后再下载全部数据上传结束,提示成功上传 50 条记录;下载结束,提示出错行数为零上传结束,提示成功上传 50 条记录;下载结束,提示出错行数为零管道接口运行程序正确6.3确认测试与分析根据图 2-
27、1 系统流程,遍历所有功能分支,验证操作是否能正确执行。总结(1)承担的主要工作本系统在数据共享上,采用了 C/S 模式,我主要承担 C/S 模式中后台数据库的搭建和建立前台与后台数据流通方式的工作。(2)仍存在的问题和缺陷还应该有的辅助功能:数据更新的返回按钮应该具有提醒保存的功能;查询功能当查不到时,给出提示;给各个窗口的按钮添加热键;学生成绩查询应该是只输入学号,然后检索出所有科目成绩和总成绩;统计图初始化。存在的缺陷:主窗口关闭后,格子窗口应该自动关闭;查询窗口也可以通过继承创建。(3)心得体会本次设计,对于软件项目开发过程中的每个阶段都走了一遍;虽然本学期已在教材中认真学了,但具体到
28、实践中亲手做出来时总还是多少有些陌生。从开始熟悉系统设计要求到整体设计规格说明的制定,再从概要设计、详细设计到开始编码,以及最后的调试,整个过程经历后总感觉要不是团队小组16积极地合作讨论,即使是文档驱动一个人也肯定坚持不下来。在单元设计中遇到了不少困难,但通过查阅相关资料,向指导老师请教以及与同学互讨论,最终克服了不少。经过这段时间的课程设计,确实学到了不少的东西,同时也深感自己知识的欠缺。整个下来,感觉有几点对于课题设计的总体进行的效率很重要:分析也好,讨论也好,必须在对盖顶要求的清醒认识的前提下;开发小组的成员间要保持良好的沟通,团队团结很重要;模块划分时,对各模块的接口规范一定要清晰,
29、否则可能会出现最后集成时,模块见无法对接。由于课程设计时间较短和自己知识的局限性,所以该设计还有许多不尽如人意的地方,比如功能繁杂,分析模块未能实现等问题,可能在实际应用中有些功能设计的不到位。不过我会在今后的学习工作之余中,继续学习这块知识。17参考文献1 郑阿奇,殷红先,张为民。Power-Builder使用教程M. 北京:电子工业出版社, 2009.2 张海藩.软件工程导论(第五版)M. 北京:清华大学出版社,2009 18指导教师评语:指导教师签名: 年 月 日项 目 权重 成绩1、设计过程中出勤、学习态度等方面 0.12、设计技术水平 0.43、编程风格 0.24、设计报告书写及图纸规范程度 0.3成绩评定总 成 绩