您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 理学 > 基于C语言开发一种自动编排课表系统
1基于C语言开发一种自动编排课表系统摘要:排课是学校教学管理中十分重要又相当复杂的管理工作之一。其实质就是为学校所设置的课程安排时间和地点,从而使整个教学能够有计划有秩序地进行。而通常所用的手工排课费时费力且多易出错,因此学校教务管理对计算机自动编排课表的要求变的非常迫切。自动编排课表系统是通过将排课问题予以简化,在一定的约束条件下,制定针对该条件的算法流程,用C语言编写程序,实现计算机自动编排课表的要求。系统输入教师数据和教室的数据,如授课科目数、每门科目的代码、不排课时段的特殊要求和教室数目等,就可自动生成学院所使用教室的课表以及每位老师的个人的课表。该系统能在一定程度上帮助解决相应的排课问题,提高教学管理效率。关键词:C语言;自动排课;系统21世纪这个信息急速发达的时代,办公自动化也已成为现实。智能化的产品也越来越多地应用于学习、办公、教育等领域。智能化产品不仅能够使人们工作和学习越来越轻松,而且可以大大提高工作效率。对于学校来说,排课调课是高校教务管理的一项日常工作,因其费时费力,手工完成多易出错,所以利用计算机这个工具进行自动排课的想法自然而生。国外从20世纪50年代就有人研究排课问题,到20世纪90年代关于课表问题的研究依然十分活跃。所用方法有整数规划、图论、分支定界技术及模拟退化法等。国内从20世纪80年代初期开始排课问题的研究,从模拟手工排课到构建专家系统都有尝试,采用的算法有分组优化决策算法、回溯法[5]、遗传算法、专家系统法智能学习算法等。在高等院校中,培养学生的主要途径是教学。在教学活动中,有一系列管理工作,其中教学计划的实施是一个重要的教学环节。每学期管理人员都要整理教学计划,根据教学计划下达教学任务书,然后根据教学任务书编排课表。2排课表工作非常复杂,即有大量繁琐的数据整理工作,更有严谨思维的脑力劳动,还要填写大量的表格,通常手工操作要花费大量的精力,且效率低下,教学资源也很难充分利用。因此,这是一个急需解决又非常棘手的问题,由于高校教学单位和课程众多,且相互交叉,教师和教室有严重短缺,很难用手工制定出准确、统一、高效、合理的课表。另一方面教学管理的信息化不可能建立在手工操作的基础上,而理论研究和软件技术的成熟已为我们提供了计算机自动排课的重要手段,编制出一套高效、实用、准确的排课表程序已成为可能。加之,随着教学改革的进行,新的教育体制对课表的编排提出了更高的要求。手工排课时信息的上通下达是极其麻烦的,而采用计算机排课,教学中信息可以一目了然,对于优化学生的学习进程,评估每位教师对教学的贡献,领导合理决策具有重要意义,必将会大大推进教学的良性循环。高校排课的主要任务是把全院各班或各授课部门的课进行汇总,然后根据教学计划和教学资源制订各院系的和各班级的专业课课表,以充分满足专业教学的要求,并优化配置各种教学资源,使教学工作科学、高效、顺利的进行。计算机排课问题的难点归结为多约束条件和解的不确定性。众所周知,排课时要受到时间、空间等各种条件的限制,在一定条件下,某一课程可排在课表的位置又不是唯一的。综合诸多因素,如何才能排出理想的课表,解决课表的无冲突性,合理性是排课问题的关键,教务工作者有长期实践的经验,有一套技巧和方法,而要用计算机实现自动编排课表则需要设计出一套可行的算法,并配合人工排课的经验,设计出一套符合实际现状的实用的课表。从实际使用的情况来看,国内外研制开发的这些软件系统在使用性上仍不尽如人意。一方面原因是作为一个很复杂的系统,排课要想面面俱到是一件很困难的事;另一方面每个学校由于其各自的特殊性,自动排课软件很难普遍适用,特别是在调度的过程中,一个很小的变动要引起全部课程的大调整,着意味着全学院课程的大变动,在实际的应用中这是很难实现的事。1数据结构3在程序当中,我们使用了两个二维数组(2Darray)以及一个三维数组(3Darray)。第一个二维数组(mask_array[4][5])是用来在指定某位老师时,协助判断该位老师有哪些时段可以指定;第二个二维数组(data_array[40][12])是用来储存所有输入的教师相关资料。在三维数组(classroom[4][8][5])的部份,我们加上了结构(structure)的概念,用这个三维数组分别储存四间教室的数据(包含:教师职等、教师编号、科目代号与一个用来帮助判断该教室特定时段是否有被使用的指示旗标(flag))。这三个所使用的数组所表示的内容如下所示:1)mask_array[4][5]说明:第一个索引值“[4]”代表课表共有4列(第1~4节课),第二个索引值“[5]”代表课表共有5行(星期一~星期五)如表1示:mask_array[0][1][2][3][4][0]00000[1]00000[2]00100[3]00100说明:若在程序执行中,若mask_array[][]的值等于“1”,表示该老师在该时段不能排课;若mask_array[][]的值等于“0”,表示该老师在该时段可以排课。在上图中表示该老师在星期三、四的下午不能排课。2)data_array[40][12]说明:第一个索引值“[40]”代表共有40列(1~40位老师),第二个索引值“[12]”代表共有12行(分别表示不同的资料,如表4,一列代表一位老师的资料)如表2示:表14表2第二个索引值[0][1][2][3][4][5][6][7][8][9][10][11]代表资料教师职等教师编号教授科目数限制时段个数教授科目代号#1教授科目代号#2教授科目代号#3教授科目代号#4限制时段编号#1限制时段编号#2限制时段编号#3限制时段编号#4资料数值范围0~401~991~40~40000~99990~9说明:若data_array[][]第一个索引值为“[1]”而第二个索引值“[0~11]”的数据分别为“1,3,2,2,3,17,0,0,5,7,0,0”其代表的意义为:在此数组中第二位教师的职等为“TP”(1:TP、2:TA、3:TT以及4:TL),该教师的编号为“03”、所教授的科目共有两科(分别为位于第二个索引值“[4]”与“[5]”的“0003”与“0017”)以及有两个限制排课的时段(分别为位于第二个索引值“[8]”与“[9]”的“5”与“7”)(0:MA、1:MP、2:TA、3:TP、4:WA、5:WP、6:HA、7:HP、8:FA以及9:FP)。3)classroom[12][4][5]说明:第一个索引值“[12]”代表教室共有十二间(0:M01、1:M02、2:M03、3:M04……11M12),第二个索引值“[4]”代表该教室的课表共有4列(第1~54节课),第三个索引值“[5]”代表该教室的课表共有5行(星期一~星期五),classroom[3][3][4].teacher_level用来存放被指定在M04教室、星期五的第四节课的教师职等;classroom[3][3][4].teacher_no用来存放被指定在M04教室、星期五的第四节课的教师编号;classroom[3][3][4].score_no用来存放被指定在M04教室、星期五的第四节课的科目编号;classroom[3][3][4].flag用来指示M04教室、星期五的第四节课的时间是否有被使用(0:没有被使用;1:有被使用)。2算法描述2.1排课中的基本原则在课程的编排中应遵循一定的规则,只有按照基本规则来进行课程的排课才能够减少冲突的发生,这些基本规则主要有以下几条:1)同一班级的学生在同一时间(某些特定的选修课除外)不能安排两门课程。2)同一教室在同一时间不能安排两门课程。3)同一教师在同一时间不能安排两门课程。4)同一时间排课的课程总数不能大于所能提供的教室总数。5)某一课程参加学习的总人数不能大于所安排教室的座位数。2.2本系统的基本假设1)学院有十二教室可供使用,也就是说,在同一时段最多只能有十二门课同时开授(教室代码格式为:M01,M02,M03,M04,M05,M06,M07,M08,M09,M10,M11,M12)。2)每节课的课时单元为两小时,连续一次排完。3)学院有授课老师四十位,教师职位(用输入编码代号的方式来代表输入教授、副教授、讲师、助教)如表3示:教师职等实际代码编码代号表36教授TP1副教授TA2讲师TT3助教TL44)在数据的输入操作上,我们以编码输入方式代替字符串输入方式,来简化字符串处理的部分,也就是说以数字选择的方式来输入所需的数据。5)不排课时段的要求(用输入编码代号的方式来代表要求哪一个时段不排课)如表4示:时段实际代号编码代号星期一(早上)MA0星期一(下午)MP1星期二(早上)TA2星期二(下午)TP3星期三(早上)WA4星期三(下午)WP5星期四(早上)HA6星期四(下午)HP7星期五(早上)FA8星期五(下午)FP92.3排课算法概述1)从data_array[][]中选出一位教师的资料(假设:该位教师储存在data_array[][]的资料为“1,3,2,2,3,17,0,0,5,7,0,0”,这些资料表示一位编号为TP03的教授,有两门课要排(教授科目编号分别为CS0003与CS0017)以及两个限制不排课的时段(分别为星期三下午与星期四下午)。2)将该位教师所指定的限制时段(即不能排课的时段),设定mask_array[][]上相对应的位置。如表5示:表47mask_array[0][1][2][3][4][0]00000[1]00000[2]00110[3]001103)将要排课教室的课表上有排课的节次设定mask_array[][]上相对应的位置(假设:要排课的教室号码为M00,已经排课的时段表6示)。classroom[0][][].flag[0][1][2][3][4][0]00000[1]10000[2]01001[3]00000则将要排课教室的课表上有排课的节次设定mask_array[][]上相对应的位置,其结果如表7:mask_array[0][1][2][3][4][0]00000[1]10000[2]01111[3]001104)找出在mask_array[][]上没有排课且满足排课策略的时段,排定所要的课程。在mask_array[][]上可供排课的时段为上图数值为“0”的位置,即剩下(星期一下午)与(星期二、三、四、五的早上)。5)在data_array[][]上依序选出两门科目编号,以星期为参考顺序排定科目,并设定在classroom[0][][]上相对应的资料(包含:教师职等、教师编号、科目代号与一个用来帮助判断该教室特定时段是否有被使用的指示旗标表5表6表78(flag))以及mask_array[][]。在此范例当中系统会将科目CS0003排在星期一的第3节,而科目CS0017排在星期二的2节。3程序构成3.1主程序3.1.1主程序流图(如图1)9图1103.1.2主程序功能描述1)程序的输入输出输入数据:方式一:教师人数(教授TP##、副教授TA##、讲师TT##、助教TL##,##为教师编号,介于01~99);每位教师所授科目数与每们科目代码(CS####,##为代码号);每位教师不排课时段要求(以半天为一个单位,最多指定四个单位)。方式二:将所要输入的教师数据存放在.txt文本文档中,调用函数void,data_teac-her2(),避免重复输入。输出数据:学院所使用教室的课表以及每位老师的个人的课表会输出到一个文档中(文件名为result.txt)。2)算法一名称:sort_data_array功能:将所输入的教师数据个数,依照教师职等的高低与条件限制数目的多寡做排序(存放在data_array[][]数组中)。输入数据:教师人数(bound)。方法:Step1:利用排序方法,依据教师职等排定优先级(顺序为教授、副教授、讲师最后是助教)。Step2:根据Step1所排序完成的数据,再次利用排序方法,针对相同职等的数据,依据教师所限制不能排课时段的多寡排定优先级(限制条件越
本文标题:基于C语言开发一种自动编排课表系统
链接地址:https://www.777doc.com/doc-5473259 .html