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