当前位置:文档之家› 软件工程课程设计--高校课表编排子系统

软件工程课程设计--高校课表编排子系统

软件工程课程设计--高校课表编排子系统题目:高校课表编排子系统学院信息工程学院专业计算机科学与技术指导教师白娟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操作规程 (6)第二章概要设计说明 (8)2.1数据描述与数据库设计 (8)2.2数据表 (8)2.2.1E-R图 (9)2.2.2数据流图部分 (9)2.3运行需求 (11)2.3.1硬件 (11)2.3.2软件 (11)第三章详细设计说明 (12)3.1模块的具体算法 (12)3.1.1登陆模块 (12)3.1.2管理员模块 (13)数据库中各表的物理结构 (17)第四章编码+测试 (19)4.1登录模块 (19)4.1.1 管理员模块 (20)4.1.2教师模块 (22)4.2测试方案设计 (24)测试结果分析: (24)第五章用户使用说明书 (25)第六章实验总结 (28)第七章参考文献 (30)第一章需求分析说明1.1编写目的供设计人员、开发人员参考。

为明确软件需求、安排项目规划进度、组织软件开发与测试,撰写本文档。

1.2问题定义随着社会的发展,我们越来越接近自动化的时代。

随着高校学生的日益增多、学校制度的日趋完善,我们的排课也不需要人工操作了,慢慢的交给系统自动完成。

为了给操作人员提供更简便的操作,排课系统必须不断完善以满足需求。

根据工作人员的实际需要,高校课表排课系统主要应包括以下几个方面:(1)任课教师只具有查询个人课程信息和教室信息以及修改密码的功能。

(2)管理员除了具有查询功能之外,还有设定排课约束,完成排课的功能。

1.3可行性分析排课管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以排课管理系统应该能够为用户提供充足的信息和快捷的查询手段。

对于一个课表编排子系统来说,基础表的设置是很重要的基础性问题。

而基础表的设置仅仅是一个数量级问题,查询的时间复杂度是一个线性复杂度O(n)或平方复杂度O(n2)。

在此基础上,较为困难的部分是排课。

由于排课问题已被证明为NP问题,找到最优解的时间复杂度为指数级,故采用优化的方式是必需的。

对排课来说,各个学校都有着不太相同的排列方法,有每天的课节数,允许课程连排数,时间段等等,而这些方法转换为计算机语言时,往往会因为各类限制而造成死循环或者程序速度缓慢,因为排课系统要适应大部分学校使用,所以这里提供的一些要求是需要满足大部分人的。

经过详细的分析与计算之后,小组成员一致认为,在一定程度的随机化算法(退火、贪心变形算法、类贪心算法)下,排课的时间复杂度可以减小到多项式级别,达到O(n3)甚至更低。

故该系统是可行的。

1.4任务描述1.5目标随着时代的发展,高校扩招的趋势正在加大。

与此同时,高校教务管理是一项复杂繁重的工作。

课表编排是一项繁重的工程,计算机排课已经成为必然趋势。

软件的目的是设计出一套易于使用与维护的排课子系统,能够完成课程管理、课程编排、教师、学生、课程基本信息维护等功能。

软件需要较大的通用性,能够适应多学年的排课,以及一个专业多个学期的排课。

同时,能够对于各种信息进行查询。

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功能描述作为一个课表编排子系统,应当在完成排课任务之外,进行一部分相应的查询与管理功能。

经过小组成员分析,列出主要功能如下。

(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 图2.2.2数据流图部分数据流图说明:系统的流程为:管理员和教师通过登录表进入该系统,管理员查询、设置排课约束以及排课等职能,排课使选课表、课程信息表数据发生变化。

根据分析,可得系统顶层数据流图。

将顶层数据流图进行分解,可知教师登录后有查询课程安排、修改密码的功能,这样得出了系统的数据流图。

数据流图: 教师授教师登登安选安教室教课程讲班级N 1 1 N 111 N 1 1 N N 管系统排D 班级D教师教 查D 登D 排D 课程D 教师D 教室2.3运行需求2.3.1硬件a)x86架构CPUb)512MB以上内存c)1.7KB硬盘空间2.3.2软件a)操作系统:Microsoft Windows 7 Ultimate /Microsoft Windows XP Professionalb)数据库系统:Microsoft SQL Server 2005c)运行时环境:.NET Framework 4.0第三章详细设计说明3.1模块的具体算法3.1.1登陆模块该模块涉及到2个登录身份:教师,管理员教师和管理员,需要用用户名和密码和身份进行验证才能登录。

登录要有自己的身份识别,是教师还是管理员,可以先判断出用户是以什么身份登录的。

若未选择身份就进行查询,则提示出错。

程序流程图如下:3.1.2管理员模块管理员添加排课约束条件,进行排课;其中休息日时间不能和选修课时间冲突,同时两节选修课的时间同样也不能发生冲突。

程序流程图如下:① 给所有课程分开始周数开 始身YN根据用户名和跳转Y N跳出提根据用户名和跳转YN 开 查询教师任务书所for 要YN② 选修课排课requrequire 接requ开始周数周数NNYY开始周周N Y开始周i/开始周开始周YN结开 查询未安forea查询该课程的任务号、人③ 其他课程排课 上课时上课时select 符rando更新选课表、结开④排除矛盾的函数第二节链排除矛第三节链排除矛排除矛排除矛排除矛第二节链结开数据库中各表的物理结构(1)登录表(2)教师信息表(3)教室信息表(4)课程信息表下一couNY随机结(5)班级课程表(6)教师任务书(7)选课表第四章编码+测试4.1登录模块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 = new Form2();f2.GetName(name, "管理员");this.Hide();f2.Show();}else{MessageBox.Show("用户名错误或密码错误,请核对!");}}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 = 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); //mandText = "select 课程号,周数,要求 from 教师任务书";SqlDataReader reader = cmd.ExecuteReader(); //if (reader.Read()){reader.Close(); //可以不使用reader,直接ds.Tables[0].Rows.Count!=0就可以了SqlDataAdapter da = new SqlDataAdapter(mandText, conn);DataSet ds = new DataSet();da.Fill(ds, "mytable");//for (int i = 0; i < ds.Tables[0].Rows.Count; i++) //int i = 0;foreach(DataRow Row in ds.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){mandText = "update 课程信息表 set 开始周次 = " + require + " where 课程号= '" + cource_num + "'";cmd.ExecuteNonQuery();}else if (week_num == 16){mandText = "update 课程信息表set 开始周次= 1 where 课程号= '" + cource_num + "'";cmd.ExecuteNonQuery();}else if (week_num == 8){if (i / 2 == 0){mandText = "update 课程信息表 set 开始周次 = 1 where 课程号 = '" + cource_num + "'";cmd.ExecuteNonQuery();}else{mandText = "update 课程信息表 set 开始周次 = 9 where 课程号 = '" + cource_num + "'";}}else{mandText = "update 课程信息表set 开始周次= 1 where 课程号= '" + cource_num + "'";cmd.ExecuteNonQuery();}i++;}//MessageBox.Show("开始周数已分配!");}else{MessageBox.Show("教师任务书为空!");}}//约定无课时间安排、选修课时间安排,用变量接受,每次排课时间上排除掉/////////////////////////////////////////排课结束4.1.2教师模块private void button5_Click(object sender, EventArgs e){SqlConnect();string sql1 = "";//;SqlCommand cmd1 = new SqlCommand(sql1, conn);mandText = "select * from 选课表";SqlDataReader reader11 = cmd1.ExecuteReader();if (reader11.Read()){if (radioButton1.Checked == true){SqlConnect();string num = textBox1.Text;string sql = "";//;SqlCommand cmd = new SqlCommand(sql, conn);if (id == "教师"){mandText = "select * from 教师信息表 where 工号 = '" + num + "'"; //只有一条SqlDataReader reader = cmd.ExecuteReader();if (reader.Read()){name_N = reader["姓名"].ToString().Trim();}else{}reader.Close();}else{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);//确定这位老师所有任务号DataSet ds = new DataSet();adapter.Fill(ds, "mytable");if (ds.Tables[0].Rows.Count != 0){for (int i = 0; i < ds.Tables[0].Rows.Count; i++)//对一个任务号进行一系列查询{//课程信息查询cource_num = ds.Tables[0].Rows[i]["课程号"].ToString().Trim();week_num = Convert.ToInt32(ds.Tables[0].Rows[i]["周数"].ToString().Trim()); string pross = ds.Tables[0].Rows[i]["所教专业"].ToString().Trim();mandText = "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();totalhour = 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();//该老师该任务号该课程的排课时间地点4.2测试方案设计测试方式:黑盒测试,白盒测试。

相关主题