1、软件工程课程设计 题 目: 高校课表编排子系统 学 院 信息工程学院 专 业 计算机科学与技术 指 导 教 师 白 娟 2014年1 月 3 日摘要教学工作是高校的中心工作,而课表是高校日常教学活动运行的指挥调度表,是高校能否进行正常教学的关键,因此科学的,合理的课表在高校的重要性毋庸置疑。高校教务管理是一向复杂而繁重的工作,课表编排作为其中腰组成部分是长期困扰学校教务管理工作的大问题,计算机排课无疑是必然优势。课表编排是一个涉及多因素约束的,多目标的,结构复杂的典型的组合优化问题,并且已经被证明为一个NP完全类,是典型的组合优化的问题,其问题求解的时间复杂度呈指数函数增长。每个学校在排课表时
2、考虑的因素千差万别,各种约束条件也不尽相同,但是它所涉及的主要实体却具有相对稳定性。关键字:NP完全类; 约束满足;课表编排;课程设置;目录目录 4第一章 需求分析说明 51.1编写目的 51.2问题定义 51.3可行性分析 51.4任务描述 51.5目标 51.6运行环境 61.7功能需求 61.7.1功能描述 61.7.2排课约束 61.7.3操作规程 7第二章 概要设计说明 82.1数据描述与数据库设计 82.2数据表 82.2.1E-R图 92.2.2数据流图部分 92.3运行需求 102.3.1硬件 102.3.2软件 10第三章 详细设计说明 113.1模块的具体算法 113.1.
3、1登陆模块 113.1.2管理员模块 11数据库中各表的物理结构 15第四章 编码+测试 174.1登录模块 174.1.1 管理员模块 184.1.2教师模块 204.2测试方案设计 21测试结果分析: 22第五章 用户使用说明书 23第六章 实验总结 26第七章 参考文献 28第一章 需求分析说明1.1编写目的供设计人员、开发人员参考。为明确软件需求、安排项目规划进度、组织软件开发与测试,撰写本文档。1.2问题定义随着社会的发展,我们越来越接近自动化的时代。随着高校学生的日益增多、学校制度的日趋完善,我们的排课也不需要人工操作了,慢慢的交给系统自动完成。为了给操作人员提供更简便的操作,排课
4、系统必须不断完善以满足需求。根据工作人员的实际需要,高校课表排课系统主要应包括以下几个方面:(1) 任课教师只具有查询个人课程信息和教室信息以及修改密码的功能。(2) 管理员除了具有查询功能之外,还有设定排课约束,完成排课的功能。1.3可行性分析排课管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以排课管理系统应该能够为用户提供充足的信息和快捷的查询手段。对于一个课表编排子系统来说,基础表的设置是很重要的基础性问题。而基础表的设置仅仅是一个数量级问题,查询的时间复杂度是一个线性复杂度O(n)或平方复杂度O(n2)。在此基础上,较为困难的部分是排课。由于排
5、课问题已被证明为NP问题,找到最优解的时间复杂度为指数级,故采用优化的方式是必需的。对排课来说,各个学校都有着不太相同的排列方法,有每天的课节数,允许课程连排数,时间段等等,而这些方法转换为计算机语言时,往往会因为各类限制而造成死循环或者程序速度缓慢,因为排课系统要适应大部分学校使用,所以这里提供的一些要求是需要满足大部分人的。经过详细的分析与计算之后,小组成员一致认为,在一定程度的随机化算法(退火、贪心变形算法、类贪心算法)下,排课的时间复杂度可以减小到多项式级别,达到O(n3)甚至更低。故该系统是可行的。1.4任务描述1.5目标随着时代的发展,高校扩招的趋势正在加大。与此同时,高校教务管理
6、是一项复杂繁重的工作。课表编排是一项繁重的工程,计算机排课已经成为必然趋势。软件的目的是设计出一套易于使用与维护的排课子系统,能够完成课程管理、课程编排、教师、学生、课程基本信息维护等功能。软件需要较大的通用性,能够适应多学年的排课,以及一个专业多个学期的排课。同时,能够对于各种信息进行查询。1.6运行环境(1) 操作系统: Microsoft Windows 7 Ultimate / Microsoft Windows XP Professiona(2) 支持环境:.NET Framework 4.0(3) 数据库: Microsoft SQL Server 20051.7功能需求1.7.1
7、功能描述作为一个课表编排子系统,应当在完成排课任务之外,进行一部分相应的查询与管理功能。经过小组成员分析,列出主要功能如下。(1) 机构设置: 建立系、系内部门、专业、班级等信息。(2) 课程信息:建立全校开设的课程并录入相关信息。(3) 教师信息:建立教师的基本信息。(4) 教室信息:建立可用教室的信息、类型等。包括教学楼、教室。(5) 教学任务:录入教学任务,包括生成上课班级。(6) 课表编排:建立排课约束、预排课、自动排课、手动调整课表、冲突检测恢复。上述功能不仅应包括新增,还应包括查询与维护。1.7.2排课约束(1) 基本约束a) 同一时间一个教室不能够上两门课。b) 同一时间一个教师
8、不能上两门课。c) 同一时间一个班级不能上两门课。(2) 优先顺序经小组讨论分析,考虑优先顺序问题,将优先顺序分类,再按照优先顺序设计算法排课。1.7.3操作规程(1) 对于新建立的数据库,需要设定各基本信息。包括院系、职称、职位、课程类别、教室类别等。(2) 设立基本信息后,建立教学资源信息。包括教师、教室、楼房等。(3) 建立学籍信息,包括学生、班级。(4) 建立教学计划,决定每个专业在学期间的课程。(5) 安排教学任务。根据教学计划排定本学年学期的教学任务,包括对该学期每个专业的每一门课程指定上课班级和上课老师,生成教学任务。(6) 排课。包括预排课、自动生成上课记录、手动调整、冲突分析
9、检测步骤。此步需要经过反复执行。STD图如下。图1-5-3 系统操作流程图第二章 概要设计说明2.1数据描述与数据库设计2.2数据表登录表(用户名,密码,身份)教师信息表(工号,姓名,性别,出身年月,职称,联系电话)课程信息表(课程号,课程名,是否选修课,课时,学分,考试形式,是否安排,开始周次)教室信息表(教室号,容量,是否多媒体)班级课程表(班级号,课程号,任务号)教师任务书(任务号,工号,课程号,所教专业,周数,人数,要求,是否多媒体)选课表(教室号,星期,时间段,任务号,占用情况)其中,加下划线的为关键码。 2.2.1E-R图N班级课程表N讲课选课表11安排NN1安排教师信息表授课教师
10、任务书N11教授教室信息表登录11课程信息表登录表2.2.2数据流图部分 数据流图说明:系统的流程为:管理员和教师通过登录表进入该系统,管理员查询、设置排课约束以及排课等职能,排课使选课表、课程信息表数据发生变化。根据分析,可得系统顶层数据流图。将顶层数据流图进行分解,可知教师登录后有查询课程安排、修改密码的功能,这样得出了系统的数据流图。D6教师任务书排课系统管理管理员数据流图:D7班级课程表D2排课表登录表D1D3课程信息表查 询教 师教师信息表D4 教室信息表D52.3运行需求2.3.1硬件 a) x86架构CPUb) 512MB以上内存c) 1.7KB硬盘空间2.3.2软件a) 操作系
11、统:Microsoft Windows 7 Ultimate / Microsoft Windows XP Professionalb) 数据库系统:Microsoft SQL Server 2005c) 运行时环境:.NET Framework 4.0第三章 详细设计说明3.1模块的具体算法3.1.1登陆模块该模块涉及到2个登录身份:教师,管理员教师和管理员,需要用用户名和密码和身份进行验证才能登录。登录要有自己的身份识别,是教师还是管理员,可以先判断出用户是以什么身份登录的。若未选择身份就进行查询,则提示出错。程序流程图如下:YN身份为管理员 开 始YYN根据用户名和密码查询记录reade
12、r.read()N根据用户名和密码查询记录reader.read()跳转Form2name = “管理员”跳转Form2name = “教师”跳出提示信息3.1.2管理员模块管理员添加排课约束条件,进行排课;其中休息日时间不能和选修课时间冲突,同时两节选修课的时间同样也不能发生冲突。程序流程图如下:1给所有课程分开始周数 开 始查询教师任务书所有记录,Fill ds i = 0foreachNY要求 != 0require = 0require 接收查询的要求YNrequire!=0YN周数=16开始周数=require入库NY开始周数=1入库周数=8NYi/2=0开始周数=1入库开始周数=9
13、入库开始周数=1入库 结 束2选修课排课 开 始查询未安排的选修课foreach,i = 0查询该课程的任务号、人数、是否多媒体、任务号NYi/2=0上课时间为选修课约束的第二节上课时间为选修课约束的第一节select符合条件的教室random教室更新选课表、课程信息表 结 束3其他课程排课 开 始创建时间链表h查询课程号、人数按照人数降序排列YNcount!=0row0课程的所有任务排课完成foreachNY每周课时=课时/周数每周课时=6Y每周课时=4排除矛盾分派教室并入库的函数N排除矛盾分派教室并入库的函数排除矛盾分派教室并入库的函数第二节链表p指向”星期三”第一节”第二节链表p指向”星
14、期三”第一节”排除矛盾分派教室并入库的函数第三节链表p指向”星期四”第一节”排除矛盾分派教室并入库的函数排除矛盾分派教室并入库的函数 结 束排除矛盾的函数 开 始该工号该时段选修课表的记录Fill dsYNcount!=0该班级该时段选修课表的记录Fill dsYNcount!=0该时段符合条件的教室记录 Fill dsNcount!=0Y随机入库下一时间段 结 束数据库中各表的物理结构(1)登录表(2)教师信息表(3)教室信息表(4)课程信息表(5)班级课程表(6)教师任务书(7)选课表第四章 编码+测试4.1登录模块if (comboBox1.Text = 管理员) string sql
15、= select 密码 from 登录表 where 用户名= + name + and 身份=管理员; SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read() if (reader密码.ToString().Trim()=textBox2.Text) Form2 f2 = new Form2(); f2.GetName(name, 管理员); this.Hide(); f2.Show(); else MessageBox.Show(用户名
16、错误或密码错误,请核对!); else MessageBox.Show(用户名错误,请核对!); if (comboBox1.Text = 教师) string sql = select 密码 from 登录表 where 用户名= + name + and 身份=教师; SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read() if (reader密码.ToString().Trim() = textBox2.Text) Form2 f2
17、= new Form2(); f2.GetName(name, 教师); this.Hide(); f2.Show(); else MessageBox.Show(用户名错误或密码错误,请核对!); else MessageBox.Show(用户名错误,请核对!); 4.1.1 管理员模块 /排课 void MatchStartWeek() /给任务课程分前8和后8:根据周数和要求 string commString = ; SqlCommand cmd = new SqlCommand(commString, conn); / cmd.CommandText = select 课程号,周数,
18、要求 from 教师任务书; SqlDataReader reader = cmd.ExecuteReader(); / if (reader.Read() reader.Close(); /可以不使用reader,直接ds.Tables0.Rows.Count!=0就可以了 SqlDataAdapter da = new SqlDataAdapter(cmd.CommandText, conn); DataSet ds = new DataSet(); da.Fill(ds, mytable); /for (int i = 0; i ds.Tables0.Rows.Count; i+) /
19、int i = 0; foreach(DataRow Row in ds.Tables0.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 开始
20、周次 = + require + where 课程号 = + cource_num + ; cmd.ExecuteNonQuery(); else if (week_num = 16) cmd.CommandText = update 课程信息表 set 开始周次 = 1 where 课程号 = + cource_num + ; cmd.ExecuteNonQuery(); else if (week_num = 8) if (i / 2 = 0) cmd.CommandText = update 课程信息表 set 开始周次 = 1 where 课程号 = + cource_num + ;
21、cmd.ExecuteNonQuery(); else cmd.CommandText = update 课程信息表 set 开始周次 = 9 where 课程号 = + cource_num + ; else cmd.CommandText = update 课程信息表 set 开始周次 = 1 where 课程号 = + cource_num + ; cmd.ExecuteNonQuery(); i+; /MessageBox.Show(开始周数已分配!); else MessageBox.Show(教师任务书为空!); /约定无课时间安排、选修课时间安排,用变量接受,每次排课时间上排除掉
22、 /排课结束4.1.2教师模块 private void button5_Click(object sender, EventArgs e) SqlConnect(); string sql1 = ;/; SqlCommand cmd1 = new SqlCommand(sql1, conn); cmd1.CommandText = select * from 选课表; SqlDataReader reader11 = cmd1.ExecuteReader(); if (reader11.Read() if (radioButton1.Checked = true) SqlConnect();
23、 string num = textBox1.Text; string sql = ;/; SqlCommand cmd = new SqlCommand(sql, conn); if (id = 教师) cmd.CommandText = select * from 教师信息表 where 工号 = + num + ; /只有一条 SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read() name_N = reader姓名.ToString().Trim(); else reader.Close(); else cmd.Com
24、mandText = select * from 教师信息表 where 工号 = + num + ; /只有一条 SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read() name_N = reader姓名.ToString().Trim(); else MessageBox.Show(该职工号不存在,请核对!); reader.Close(); SqlDataAdapter adapter = new SqlDataAdapter(select * from 教师任务书 where 工号= + num + , conn);/
25、确定这位老师所有任务号 DataSet ds = new DataSet(); adapter.Fill(ds, mytable); if (ds.Tables0.Rows.Count != 0) for (int i = 0; i ds.Tables0.Rows.Count; i+)/对一个任务号 进行 一系列查询 /课程信息查询 cource_num = ds.Tables0.Rowsi课程号.ToString().Trim(); week_num = Convert.ToInt32(ds.Tables0.Rowsi周数.ToString().Trim(); string pross =
26、ds.Tables0.Rowsi所教专业.ToString().Trim(); cmd.CommandText = select * from 课程信息表 where 课程号= + cource_num + ; SqlDataReader reader1 = cmd.ExecuteReader(); if (reader1.Read() course_name = reader1课程名.ToString().Trim(); teststyle = reader1考试形式.ToString().Trim(); score = reader1学分.ToString().Trim(); totalh
27、our = reader1课时.ToString().Trim(); startweek = reader1开始周次.ToString().Trim(); int startweeks = Convert.ToInt32(startweek.ToString().Trim(); int endweeks = startweeks + week_num - 1; string endweek = endweeks.ToString().Trim(); weeks = + startweek + - + endweek + ; else reader1.Close(); /该老师 该任务号 该课程
28、的排课时间 地点 4.2测试方案设计测试方式:黑盒测试,白盒测试。原因:由于白盒测试需要进行某种路径覆盖,而无论是逻辑覆盖还是路径覆盖,都由于数据量过大而无法设计测试用例。故前期只采用白盒测试(部分),后期均采用黑盒测试,且测试数据来自前期的数据。由于基本模块在单元测试时全都通过,而且接口均为标准化接口,而较大的模块只是调用该接口,故只需在接口进行测试,即可保证数据的正确性。测试结果:测试结果分析: 大部分的测试都较为平稳,主要原因在于大部分的工作都由数据库来做,而数据库的查询一般情况下是安全的。而由于使用了SQL Server的性能分析器后,查询性能一般较高。第五章 用户使用说明书(1)首先将VS和数据库相连接,然后在VS中打开项目,点击调试程序,出现主界面(2)选择
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1