软件工程课程设计.docx
- 文档编号:23946207
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:31
- 大小:1.27MB
软件工程课程设计.docx
《软件工程课程设计.docx》由会员分享,可在线阅读,更多相关《软件工程课程设计.docx(31页珍藏版)》请在冰豆网上搜索。
软件工程课程设计
题目:
高校课表编排子系统
学院信息工程学院
专业计算机科学与技术
指导教师白娟
2014年1月3日
摘要
教学工作是高校的中心工作,而课表是高校日常教学活动运行的指挥调度表,是高校能否进行正常教学的关键,因此科学的,合理的课表在高校的重要性毋庸置疑。
高校教务管理是一向复杂而繁重的工作,课表编排作为其中腰组成部分是长期困扰学校教务管理工作的大问题,计算机排课无疑是必然优势。
课表编排是一个涉及多因素约束的,多目标的,结构复杂的典型的组合优化问题,并且已经被证明为一个NP完全类,是典型的组合优化的问题,其问题求解的时间复杂度呈指数函数增长。
每个学校在排课表时考虑的因素千差万别,各种约束条件也不尽相同,但是它所涉及的主要实体却具有相对稳定性。
关键字:
NP完全类;约束满足;课表编排;课程设置;
目录
目录4
第一章需求分析说明5
1.1编写目的5
1.2问题定义5
1.3可行性分析5
1.4任务描述5
1.5目标5
1.6运行环境6
1.7功能需求6
1.7.1功能描述6
1.7.2排课约束6
1.7.3操作规程7
第二章概要设计说明8
2.1数据描述与数据库设计8
2.2数据表8
2.2.1E-R图9
2.2.2数据流图部分9
2.3运行需求10
2.3.1硬件10
2.3.2软件10
第三章详细设计说明11
3.1模块的具体算法11
3.1.1登陆模块11
3.1.2管理员模块11
数据库中各表的物理结构15
第四章编码+测试17
4.1登录模块17
4.1.1管理员模块18
4.1.2教师模块20
4.2测试方案设计21
测试结果分析:
22
第五章用户使用说明书23
第六章实验总结26
第七章参考文献28
第一章需求分析说明
1.1编写目的
供设计人员、开发人员参考。
为明确软件需求、安排项目规划进度、组织软件开发与测试,撰写本文档。
1.2问题定义
随着社会的发展,我们越来越接近自动化的时代。
随着高校学生的日益增多、学校制度的日趋完善,我们的排课也不需要人工操作了,慢慢的交给系统自动完成。
为了给操作人员提供更简便的操作,排课系统必须不断完善以满足需求。
根据工作人员的实际需要,高校课表排课系统主要应包括以下几个方面:
(1)任课教师只具有查询个人课程信息和教室信息以及修改密码的功能。
(2)管理员除了具有查询功能之外,还有设定排课约束,完成排课的功能。
1.3可行性分析
排课管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以排课管理系统应该能够为用户提供充足的信息和快捷的查询手段。
对于一个课表编排子系统来说,基础表的设置是很重要的基础性问题。
而基础表的设置仅仅是一个数量级问题,查询的时间复杂度是一个线性复杂度O(n)或平方复杂度O(n2)。
在此基础上,较为困难的部分是排课。
由于排课问题已被证明为NP问题,找到最优解的时间复杂度为指数级,故采用优化的方式是必需的。
对排课来说,各个学校都有着不太相同的排列方法,有每天的课节数,允许课程连排数,时间段等等,而这些方法转换为计算机语言时,往往会因为各类限制而造成死循环或者程序速度缓慢,因为排课系统要适应大部分学校使用,所以这里提供的一些要求是需要满足大部分人的。
经过详细的分析与计算之后,小组成员一致认为,在一定程度的随机化算法(退火、贪心变形算法、类贪心算法)下,排课的时间复杂度可以减小到多项式级别,达到O(n3)甚至更低。
故该系统是可行的。
1.4任务描述
1.5目标
随着时代的发展,高校扩招的趋势正在加大。
与此同时,高校教务管理是一项复杂繁重的工作。
课表编排是一项繁重的工程,计算机排课已经成为必然趋势。
软件的目的是设计出一套易于使用与维护的排课子系统,能够完成课程管理、课程编排、教师、学生、课程基本信息维护等功能。
软件需要较大的通用性,能够适应多学年的排课,以及一个专业多个学期的排课。
同时,能够对于各种信息进行查询。
1.6运行环境
(1)操作系统:
MicrosoftWindows7Ultimate/MicrosoftWindowsXPProfessiona
(2)支持环境:
.NETFramework4.0
(3)数据库:
MicrosoftSQLServer2005
1.7功能需求
1.7.1功能描述
作为一个课表编排子系统,应当在完成排课任务之外,进行一部分相应的查询与管理功能。
经过小组成员分析,列出主要功能如下。
(1)机构设置:
建立系、系内部门、专业、班级等信息。
(2)课程信息:
建立全校开设的课程并录入相关信息。
(3)教师信息:
建立教师的基本信息。
(4)教室信息:
建立可用教室的信息、类型等。
包括教学楼、教室。
(5)教学任务:
录入教学任务,包括生成上课班级。
(6)课表编排:
建立排课约束、预排课、自动排课、手动调整课表、冲突检测恢复。
上述功能不仅应包括新增,还应包括查询与维护。
1.7.2排课约束
(1)基本约束
a)同一时间一个教室不能够上两门课。
b)同一时间一个教师不能上两门课。
c)同一时间一个班级不能上两门课。
(2)优先顺序
经小组讨论分析,考虑优先顺序问题,将优先顺序分类,再按照优先顺序设计算法排课。
1.7.3操作规程
(1)对于新建立的数据库,需要设定各基本信息。
包括院系、职称、职位、课程类别、教室类别等。
(2)设立基本信息后,建立教学资源信息。
包括教师、教室、楼房等。
(3)建立学籍信息,包括学生、班级。
(4)建立教学计划,决定每个专业在学期间的课程。
(5)安排教学任务。
根据教学计划排定本学年学期的教学任务,包括对该学期每个专业的每一门课程指定上课班级和上课老师,生成教学任务。
(6)排课。
包括预排课、自动生成上课记录、手动调整、冲突分析检测步骤。
此步需要经过反复执行。
STD图如下。
图1-5-3系统操作流程图
第二章概要设计说明
2.1数据描述与数据库设计
2.2数据表
登录表(用户名,密码,身份)
教师信息表(工号,姓名,性别,出身年月,职称,联系电话)
课程信息表(课程号,课程名,是否选修课,课时,学分,考试形式,是否安排,开始周次)
教室信息表(教室号,容量,是否多媒体)
班级课程表(班级号,课程号,任务号)
教师任务书(任务号,工号,课程号,所教专业,周数,人数,要求,是否多媒体)
选课表(教室号,星期,时间段,任务号,占用情况)
其中,加下划线的为关键码。
2.2.1E-R图
N
班级课程表
N
讲课
选课表
1
1
安排
N
N
1
安排
教师信息表
授课
教师任务书
N
1
1
教授
教室信息表
登录
1
1
课程信息表
登录表
2.2.2数据流图部分
数据流图说明:
系统的流程为:
管理员和教师通过登录表进入该系统,管理员查询、设置排课约束以及排课等职能,排课使选课表、课程信息表数据发生变化。
根据分析,可得系统顶层数据流图。
将顶层数据流图进行分解,可知教师登录后有查询课程安排、修改密码的功能,这样得出了系统的数据流图。
D6
教师任务书
排课
系统管理
管理员
数据流图:
D7
班级课程表
D2
排课表
登录表
D1
D3
课程信息表
查询
教师
教师信息表
D4
教室信息表
D5
2.3运行需求
2.3.1硬件
a)x86架构CPU
b)512MB以上内存
c)1.7KB硬盘空间
2.3.2软件
a)操作系统:
MicrosoftWindows7Ultimate/MicrosoftWindowsXPProfessional
b)数据库系统:
MicrosoftSQLServer2005
c)运行时环境:
.NETFramework4.0
第三章详细设计说明
3.1模块的具体算法
3.1.1登陆模块
该模块涉及到2个登录身份:
教师,管理员
教师和管理员,需要用用户名和密码和身份进行验证才能登录。
登录要有自己的身份识别,是教师还是管理员,可以先判断出用户是以什么身份登录的。
若未选择身份就进行查询,则提示出错。
程序流程图如下:
Y
N
身份为管理员
开始
Y
Y
N
根据用户名和密码查询记录reader.read()
N
根据用户名和密码查询记录reader.read()
跳转Form2
name=“管理员”
跳转Form2
name=“教师”
跳出提示信息
3.1.2管理员模块
管理员添加排课约束条件,进行排课;其中休息日时间不能和选修课时间冲突,同时两节选修课的时间同样也不能发生冲突。
程序流程图如下:
1 给所有课程分开始周数
开始
查询教师任务书所有记录,Fillds
i=0
foreach
N
Y
要求!
=0
require=0
require接收查询的要求
Y
N
require!
=0
Y
N
周数==16
开始周数=require入库
N
Y
开始周数=1入库
周数==8
N
Y
i/2==0
开始周数=1入库
开始周数=9入库
开始周数=1入库
结束
2 选修课排课
开始
查询未安排的选修课
foreach,i=0
查询该课程的任务号、人数、是否多媒体、任务号
N
Y
i/2==0
上课时间为选修课约束的第二节
上课时间为选修课约束的第一节
select符合条件的教室
random教室
更新选课表、课程信息表
结束
3 其他课程排课
开始
创建时间链表h
查询课程号、人数按照人数降序排列
Y
N
count!
=0
row[0]课程的所有任务
排课完成
foreach
N
Y
每周课时=课时/周数
每周课时==6
Y
每周课时==4
排除矛盾分派教室并入库的函数
N
排除矛盾分派教室并入库的函数
排除矛盾分派教室并入库的函数
第二节链表p指向”星期三””第一节”
第二节链表p指向”星期三””第一节”
排除矛盾分派教室并入库的函数
第三节链表p指向”星期四””第一节”
排除矛盾分派教室并入库的函数
排除矛盾分派教室并入库的函数
结束
④排除矛盾的函数
开始
该工号该时段选修课表的记录Fillds
Y
N
count!
=0
该班级该时段选修课表的记录Fillds
Y
N
count!
=0
该时段符合条件的教室记录Fillds
N
count!
=0
Y
随机入库
下一时间段
结束
数据库中各表的物理结构
(1)登录表
(2)教师信息表
(3)教室信息表
(4)课程信息表
(5)班级课程表
(6)教师任务书
(7)选课表
第四章编码+测试
4.1登录模块
if(comboBox1.Text=="管理员")
{
stringsql="select密码from登录表where用户名='"+name+"'and身份='管理员'";
SqlCommandcmd=newSqlCommand(sql,conn);
SqlDataReaderreader=cmd.ExecuteReader();
if(reader.Read())
{
if(reader["密码"].ToString().Trim()==textBox2.Text)
{
Form2f2=newForm2();
f2.GetName(name,"管理员");
this.Hide();
f2.Show();
}
else
{
MessageBox.Show("用户名错误或密码错误,请核对!
");
}
}
else
{
MessageBox.Show("用户名错误,请核对!
");
}
}
if(comboBox1.Text=="教师")
{
stringsql="select密码from登录表where用户名='"+name+"'and身份='教师'";
SqlCommandcmd=newSqlCommand(sql,conn);
SqlDataReaderreader=cmd.ExecuteReader();
if(reader.Read())
{
if(reader["密码"].ToString().Trim()==textBox2.Text)
{
Form2f2=newForm2();
f2.GetName(name,"教师");
this.Hide();
f2.Show();
}
else
{
MessageBox.Show("用户名错误或密码错误,请核对!
");
}
}
else
{
MessageBox.Show("用户名错误,请核对!
");
}
}
4.1.1管理员模块
////////////////////////////////排课
voidMatchStartWeek()//给任务课程分前8和后8:
根据周数和要求
{
stringcommString="";
SqlCommandcmd=newSqlCommand(commString,conn);//
cmd.CommandText="select课程号,周数,要求from教师任务书";
SqlDataReaderreader=cmd.ExecuteReader();//
if(reader.Read())
{
reader.Close();//可以不使用reader,直接ds.Tables[0].Rows.Count!
=0就可以了
SqlDataAdapterda=newSqlDataAdapter(cmd.CommandText,conn);
DataSetds=newDataSet();
da.Fill(ds,"mytable");
//for(inti=0;i inti=0; foreach(DataRowRowinds.Tables[0].Rows) { cource_num=Row["课程号"].ToString().Trim();// week_num=Convert.ToInt32(Row["周数"].ToString().Trim()); if(Row["要求"].ToString().Trim()=="") { require=0; } else { require=Convert.ToInt32(Row["要求"].ToString().Trim()); } if(require! =0) { cmd.CommandText="update课程信息表set开始周次="+require+"where课程号='"+cource_num+"'"; cmd.ExecuteNonQuery(); } elseif(week_num==16) { cmd.CommandText="update课程信息表set开始周次=1where课程号='"+cource_num+"'"; cmd.ExecuteNonQuery(); } elseif(week_num==8) { if(i/2==0) { cmd.CommandText="update课程信息表set开始周次=1where课程号='"+cource_num+"'"; cmd.ExecuteNonQuery(); } else { cmd.CommandText="update课程信息表set开始周次=9where课程号='"+cource_num+"'"; } } else { cmd.CommandText="update课程信息表set开始周次=1where课程号='"+cource_num+"'"; cmd.ExecuteNonQuery(); } i++; } //MessageBox.Show("开始周数已分配! "); } else { MessageBox.Show("教师任务书为空! "); } } //约定无课时间安排、选修课时间安排,用变量接受,每次排课时间上排除掉 /////////////////////////////////////////排课结束 4.1.2教师模块 privatevoidbutton5_Click(objectsender,EventArgse) { SqlConnect(); stringsql1="";//; SqlCommandcmd1=newSqlCommand(sql1,conn); cmd1.CommandText="select*from选课表"; SqlDataReaderreader11=cmd1.ExecuteReader(); if(reader11.Read()) { if(radioButton1.Checked==true) { SqlConnect(); stringnum=textBox1.Text; stringsql="";//; SqlCommandcmd=newSqlCommand(sql,conn); if(id=="教师") { cmd.CommandText="select*from教师信息表where工号='"+num+"'";//只有一条 SqlDataReaderreader=cmd.ExecuteReader(); if(reader.Read()) { name_N=reader["姓名"].ToString().Trim(); } else { } reader.Close(); } else { cmd.CommandText="select*from教师信息表where工号='"+num+"'";//只有一条 SqlDataReaderreader=cmd.ExecuteReader(); if(reader.Read()) { name_N=reader["姓名"].ToString().Trim(); } else { MessageBox.Show("该职工号不存在,请核对! "); } reader.Close(); } SqlDataAdapteradapter=newSqlDataAdapter("select*from教师任务书where工号='"+num+"'",conn);//确定这位老师所有任务号 DataSetds=newDataSet(); adapter.Fill(ds,"mytable"); if(ds.Tables[0].Rows.Count! =0) { for(inti=0;i { //课程信息查询 cource_num=ds.Tables[0].Rows[i]["课程号"].ToString().Trim(); week_num=Convert.ToInt32(ds.Tables[0].Rows[i]["周数"].ToString().Trim()); stringpross=ds.Tables[0].Rows[i]["所教专业"].ToString().Trim(); cmd.CommandText="select*from课程信息表where课程号='"+cource_num+"'"; SqlDataReaderreader1=cmd.ExecuteReader(); if(reader1.Read()) { course_name=reader1["课程名"].ToString().Trim(); teststyle=reader1["考试形式"].ToString().Trim(); score=reader1["学分"].ToString().Trim(); totalhour=reader1["课时"].ToString().Trim(); startweek=reader1["开始周次"].ToString().Trim(); intstartweeks=Convert.ToInt32(startweek.ToString().Trim()); intendweeks=startweeks+week_num-1; stringendweek=endweeks.ToString().Trim(); weeks=""+startweek+"-"+endweek+""; } else { } reader1.Close(); //该老师该任务号该课程的排课时间地点 4.2测试方案设计 测试方式: 黑盒测试,白盒测试。 原因: 由于白盒测试需要进行某种路径覆盖,而无论是逻辑覆盖还是路径覆盖,都由于数据量过大而无法设计测试用例。 故前期只采用白盒测试(部分),后期均采用黑盒测试,且测试数据来自前期的数据。 由于基本模块在单元测试时全都通过,而且接口均为标准化接口,而较大的模块只是调用该接口,故只需在接口进行测试,即可保证数据的正确性。 测试结果: 测试结果分析: 大部分的测试都较为平稳,主要原因在于大部分的工作都由数据库来做,而数据库的查询一般情况下是安全的。 而由于使用了SQLServer的性能分析器后,查询性能一般较高。 第五章用户使用说明书 (1)首先将VS和数据库相连接,然后在VS中打开项目,点击调试程序,出现主界面 (2)选择
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)