数据结构教学计划编制课程设计指导书.docx
《数据结构教学计划编制课程设计指导书.docx》由会员分享,可在线阅读,更多相关《数据结构教学计划编制课程设计指导书.docx(7页珍藏版)》请在冰豆网上搜索。
![数据结构教学计划编制课程设计指导书.docx](https://file1.bdocx.com/fileroot1/2023-2/2/608b977e-e6f4-4c8b-a99b-86cc24e08a27/608b977e-e6f4-4c8b-a99b-86cc24e08a271.gif)
数据结构教学计划编制课程设计指导书
课程设计指导书
姓名
学号
班级
课程名称
数据结构
课程性质
专业必修课
设计时间
2010年12月1日——2010年12月20日
设计名称
教学计划编制
设计目的
使用MicrosoftVisualC++设计教学计划编制,并能够在程序设计中调用
设计要求
(1)输入参数包括:
学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。
(2)允许用户指定下列两种编排策略之一:
一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
(3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。
计划的表格格式自行设计。
设计思路
与
设计过程
运用图的拓扑排序对课程先修排列的实现,并调用递归完成拓扑排列。
设计过程:
用户输入信息后保存课程编排的具体信息
保存可以选择的课程
初始化要用到的各个数据再调用递归
递归函数,完成拓扑排序
统计该层递归可以选择的课程
当课程安排成功时将课程安排记录保存
根据客户要求输出相应的课程安排
负责输出课程信息
输出课程的联系
负责将课程信息写入文件
将课程的联系写入文件
计划与进度
12.01-13.03复习数据结构,了解数学计划编制;
12.04-12.07进行需求分析;
12.08-12.12进行总体设计;
12.13-12.16进行详细设计,代码实现各模块;
12.17-12.18进行程序调试;
12.19-12.20资料归档,填写相关文档。
任课教师
意见
备注
课程设计报告
课程:
数据结构
学号:
姓名:
班级:
教师:
时间:
2010.12.01~2010.12.20
计算机科学与技术系
设计名称:
教学计划编制
日期:
2010年12月15日
设计内容:
大学的每个专业都要制定教学计划。
假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。
每个专业开设课程都是确定的,而且课程在开设时间的安排必须满足先修关系。
每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。
每门课恰好占一个学期。
试在这样的前提下设计一个教学计划编制程序。
设计目的与要求:
(1)输入参数包括:
学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。
(2)允许用户指定下列两种编排策略之一:
一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
(3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。
计划的表格格式自行设计。
设计环境或器材、原理与说明:
设计环境或器材:
硬件:
计算机软件:
MicrosoftVisualC++
设计原理说明:
运用图的拓扑排序对课程先修排列的实现,并调用递归完成拓扑排列。
设计过程(步骤)和部分程序代码(可以加页):
存储结构设计
structCourseHead//表头结点的结构体,保存课程信息
{
intflag;//标记该门课程是否已经编排
intpriornum;//给课程的直接先修课的个数
charName[30];//课程的名字
charOfcourse[4];//课程号
floatScore;//学分
CourseLink*first;//以该门课程为先修的后修课程
};
structCourseLink//表头结点的链结点,即该门课程的后继课程
{
intIndex;//该课程在表头结点的下标,
CourseLink*next;//下一门与它有公共先修课的课程
};
structTopo//保存课程安排的最终结果
{
intlevel;//标记是否平均分配,
ArryInTopo*toporesualt;//一个一维数组保存课程的具体安排
Topo*next;//下一种课程安排的情况
};
structArryInTopo//用于保存课程编排的具体信息
{
intIndex;//保存课程的序号
intTime;//保存课程的开课时间
};
structZero//保存可以选择的课程
{
intzero;//课程在原始数据里的下标
Zero*next;//下一个可选课程结点的地址
};
主要算法设计
用到的函数的功能
voidInitData();//完成数据初始化
voidInitData(intnum);//由课程数目num来完成数据的细节
floatInitData(char*b);//方便判断输入数据的准确性而已
voidStartTopoSort();//初始化要用到的各个数据再调用递归
voidTopoSort(inttopotempsum,inttime);//递归函数,完成拓扑排序,
voidCheck(intindex);//当选择course[index]时,相应的课//程的priornum项要减一
voidCheckBack(intindex);//当退选course[index]时,相应的课程
//的priornum项要加
intZERO();//统计该层递归可以选择的课程
//并且完成可选课程的记录
voidIfsuccessed();//当课程安排成功时将课程安排记录保存
//并对课程安排做评价
voidPrint();//根据客户要求输出相应的课程安排
voidprintf1(int);//负责输出课程信息
voidprintf2();//输出课程的联系
voidprintf1(FILE*);//负责将课程信息写入文件
voidprintf2(FILE*);//将课程的联系写入文件
设计结果与分析(可以加页):
分析:
在每一层递归开始时,必须将该层递归可以选择的课程选出来。
求出可以选择的课程数目n然后要考虑在此层递归中,如何选择课程的问题:
可以选一课,一直到最大的许可范围.这样便存在Cn1+Cn2+……+Cnn种情况,即2n-1种情况。
我开始是在每一层递归里面都建立的一个二位数组,保存每一种选课情况,0(不选),1(选),这样的话,存储空间会以2n的速度增加,那样效果相当的不好。
后来考了到,若过将上面的01串当成是一个数据的二进制表示,那么每一种情况都与一个数是对应的,这样便可以运用数的位运算来达到遍历每一种情况。
例如:
假设某一层递归时,它的可选课程有三门:
离散数学,数据结构,汇编语言,那么在该层递归里面就有23(8-1)种选择(不可能一门课程都不选,那样的话就没有实际意义),若果按照初始思路则要建立一个二维数组:
其中0代表不选则,1代表选择。
但是结果观察,如果将它的选项的二进制看做是数的表示,则分别对应与1,2,3,4,5,6,7(23-1).于是可以在递归里面去掉二维数组,用数的位运算来求出选课的各个情况。
以下是其关键思路:
(详细的源代码在“教学计划编制.cpp”里)
For(i=1;i{//考虑每一种情况
For(j=1;;)
{//位运算,遍历每一位二进制位
if((i&j)==j)
{
//相应的操作,即选择该门课程
}
j=j<<1;
//下一个二进制位
}
}.
这样的话既可以节约存储空间,又可以加快运算(位运算效率高).
设计体会与建议:
经过这次数据结构课程设计,我学习到:
一、不拘泥于课本,将学的知识转换为自己的知识,体会到将课本知识运用到实际问题中的重要性.学习课本也只是学习其思想方法,并不是全盘照搬.比如这次我的课程设计课题《教学计划编制》,实际就是图的拓扑排序,但是又不是简单的排序,要考虑到实际情况,假如就像书本上的那样思路写,其结果会很不全,因为在实际课程编排中课程并没有什么第一个后继或者第二个后继,而是只要它的先修课已经全部修完,那么它在什么时候修都可以,而不是一定要马上去修这门课程.
二、要与老师多交流,那样可以知道很多自己没有考虑过的问题.可以通过与老师交谈扩大自己的知识面,要明白一件事:
老师的知识面远远超过我们的,所以我们应该谦虚地向老师学习。
有不懂的地方要多多向老师请教。
三、这次的课程设计的算法,我觉得还可以加以改进:
可以调用数据库,直接在数据库里面读取课程信息(包括课程名,课程号,先修课,学分,学期数,一学期的学分上限),那样当有大量数据时才有实际应用价值,而不是在界面输入。
设计成绩:
教师签名:
年月日