1、一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。(3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。计划的表格格式自行设计。设计思路与设计过程运用图的拓扑排序对课程先修排列的实现,并调用递归完成拓扑排列。设计过程:用户输入信息后保存课程编排的具体信息保存可以选择的课程初始化要用到的各个数据再调用递归 递归函数,完成拓扑排序统计该层递归可以选择的课程当课程安排成功时将课程安排记录保存根据客户要求输出相应的课程安排负责输出课程信息输出课程的联系负责将课程信息写入文件将课程的联系写入文件计划与进度12.01-13.03 复习数据结构,
2、了解数学计划编制;12.04-12.07 进行需求分析;12.08-12.12 进行总体设计;12.13-12.16 进行详细设计,代码实现各模块;12.17-12.18 进行程序调试;12.19-12.20 资料归档,填写相关文档。任课教师意 见备 注课程设计报告课程: 数据结构 学号: 姓名: 班级:教师: 时间:2010.12.012010.12.20 计算机科学与技术系设计名称: 教学计划编制日期:2010年 12 月 15 日 设计内容:大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。每个专业开设课程都是确定的,而且
3、课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。设计目的与要求:设计环境或器材、原理与说明:设计环境或器材: 硬件:计算机 软件:icrosoft Visual C+设计原理说明:设计过程(步骤)和部分程序代码(可以加页):存储结构设计struct CourseHead /表头结点的结构体,保存课程信息 int flag; /标记该门课程是否已经编排int priornum; /给课程的直接先修课的个数 char Name30; /课程的名字 char Ofcourse4; /课程
4、号 float Score; /学分 CourseLink *first; /以该门课程为先修的后修课程 ;struct CourseLink /表头结点的链结点,即该门课程的后继课程 int Index; /该课程在表头结点的下标, CourseLink *next; /下一门与它有公共先修课的课程; struct Topo /保存课程安排的最终结果 int level; /标记是否平均分配, ArryInTopo *toporesualt; /一个一维数组保存课程的具体安排Topo *next; /下一种课程安排的情况struct ArryInTopo /用于保存课程编排的具体信息 int
5、 Index; /保存课程的序号 int Time; /保存课程的开课时间struct Zero /保存可以选择的课程 int zero; /课程在原始数据里的下标 Zero *next; /下一个可选课程结点的地址主要算法设计 用到的函数的功能void InitData(); /完成数据初始化 void InitData(int num); /由课程数目num来完成数据的细节 float InitData(char *b); / 方便判断输入数据的准确性而已void StartTopoSort(); /初始化要用到的各个数据再调用递归 void TopoSort(int topotempsu
6、m,int time);/递归函数,完成拓扑排序,void Check(int index); / 当选择courseindex时,相应的课 /程的priornum项要减一void CheckBack(int index); /当退选courseindex时,相应的课程 /的priornum项要加int ZERO(); /统计该层递归可以选择的课程 /并且完成可选课程的记录void Ifsuccessed(); /当课程安排成功时将课程安排记录保存 /并对课程安排做评价void Print(); /根据客户要求输出相应的课程安排void printf1(int ); / 负责输出课程信息voi
7、d printf2(); /输出课程的联系void printf1(FILE *); /负责将课程信息写入文件void printf2(FILE *); / 将课程的联系写入文件设计结果与分析(可以加页): 分析:在每一层递归开始时,必须将该层递归可以选择的课程选出来。求出可以选择的课程数目n然后要考虑在此层递归中,如何选择课程的问题:可以选一课,一直到最大的许可范围.这样便存在Cn1 + Cn 2 + +Cnn 种情况,即2n-1种情况。我开始是在每一层递归里面都建立的一个二位数组,保存每一种选课情况,0(不选),1(选),这样的话,存储空间会以2n 的速度增加,那样效果相当的不好。后来考了
8、到,若过将上面的0 1串当成是一个数据的二进制表示,那么每一种情况都与一个数是对应的,这样便可以运用数的位运算来达到遍历每一种情况。例如 : 假设某一层递归时,它的可选课程有三门:离散数学,数据结构,汇编语言,那么在该层递归里面就有23 (8-1)种选择(不可能一门课程都不选,那样的话就没有实际意义),若果按照初始思路则要建立一个二维数组:其中0 代表不选则,1 代表选择。但是结果观察,如果将它的选项的二进制看做是数的表示,则分别对应与1,2,3,4,5,6,7(23 -1).于是可以在递归里面去掉二维数组,用数的位运算来求出选课的各个情况。以下是其关键思路: (详细的源代码在“教学计划编制.
9、cpp”里)For(i=1;imath.pow(2,n);+i) /考虑每一种情况 For(j=1;) /位运算,遍历每一位二进制位if(i&j)=j) /相应的操作,即选择该门课程 j=j1; /下一个二进制位.这样的话既可以节约存储空间,又可以加快运算(位运算效率高).设计体会与建议:经过这次数据结构课程设计,我学习到:一、不拘泥于课本,将学的知识转换为自己的知识,体会到将课本知识运用到实际问题中的重要性.学习课本也只是学习其思想方法,并不是全盘照搬.比如这次我的课程设计课题教学计划编制,实际就是图的拓扑排序,但是又不是简单的排序,要考虑到实际情况,假如就像书本上的那样思路写,其结果会很不全,因为在实际课程编排中课程并没有什么第一个后继或者第二个后继,而是只要它的先修课已经全部修完,那么它在什么时候修都可以,而不是一定要马上去修这门课程.二、要与老师多交流,那样可以知道很多自己没有考虑过的问题.可以通过与老师交谈扩大自己的知识面,要明白一件事:老师的知识面远远超过我们的,所以我们应该谦虚地向老师学习。有不懂的地方要多多向老师请教。三、这次的课程设计的算法,我觉得还可以加以改进:可以调用数据库,直接在数据库里面读取课程信息(包括课程名,课程号,先修课,学分,学期数,一学期的学分上限),那样当有大量数据时才有实际应用价值,而不是在界面输入。设计成绩: 教师签名: 年 月 日