数据结构课设教学计划编制问题Word格式.docx
《数据结构课设教学计划编制问题Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课设教学计划编制问题Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
表1.1列出了若干门计算机系本科课程,其中有些课程不要求先修课程,例如,C1是独立于其他课程的基础课,而有些课程却需要有先修课程,比如,学完程序设计语言C++和离散数学后才能学习数据结构。
具体情况如表1.1所示。
表1.1课程以及课程之间的依赖关系
课程代号
课程名称
先修课程
C1
高等数学
无
C2
计算机科学导论
C3
离散数学
C4
程序设计语言C++
C1、C2
C5
数据结构
C3、C4
C6
计算机原理
C2、C4
C7
数据库原理
C4、C5、C6
先修课程规定了课程之间的依赖关系,这种关系可以用AOV网来表示,其中顶点表示课程,弧表示依赖关系,如图1.1所示。
图1.1表1.1对应的AOV网
程序的主要功能是实现课程的排序,以满足同一学期所修的课程相互之间无依赖关系,并且已修完其所有先修课程。
另外,设置学分变量,控制每个学期的课程量基本均匀。
2概要设计
2.1数据表示
教学计划编制问题中,操作对象是课程。
课程之间的依赖关系用AOV网表示,AOV网的构造采用邻接表实现。
因此,本程序设计定义了两个类:
课程类和邻接表类。
课程类(Lesson)添加了5个私有成员变量用来定义课程的5个属性:
课程代号、课程名称、课程序号、课程学分以及是否被选择过的课程标记。
同时还定义了8个成员函数,已实现相关的操作功能。
邻接表类(ALGraph)定义了2个整型成员变量和1个结构体数组来存放顶点数、边数和顶点表。
同时还定义了4个成员函数实现用来实现AOV网的构造、删除、排序以及相关输出功能。
2.2数据处理
数据处理必须借助函数来实现。
本程序设计通过调用类的各种成员函数实现各种需要操作。
课程类(Lesson)的成员函数如表2.1所示。
表2.1Lesson类的成员函数
函数名称
功能声明
voidSetLes()
对课程各种属性进行赋值
stringGetNum()
获得课程代号
stringGetName()
获得课程名称
floatGetLesScore()
获得课程学分
intGetLesNo()
获得课程序号
boolGetSelect()
获得是否选择过的标志变量
voidSetSelect()
设置选择控制标志变量,以避免重复选课
voidSetName()
单独定义设置课程名称的函数,以方便一些操作
邻接表类(ALGraph)的成员函数如表2.2所示。
表2.2ALGraph类的成员函数
ALGraph()
构造函数
~ALGraph()
析构函数
voidTopSort()
实现AOV网中顶点的排序并进行相应的输出
voidBalanScore()
平衡每次输出的顶点的数目
3详细设计
3.1课程类的定义
课程类(Lesson)添加了5个私有成员变量:
LesNum(课程代号)、LesName(课程名称)、LesScore(课程学分)、LesNo(课程序号)以及Select(是否被选择过的课程标记),分别用来定义课程的5个属性;
同时还定义了8个成员函数:
SetLes(对课程各种属性进行赋值)、GetNum(获得课程代号)、GetName(获得课程名称)、GetLesScore(获得课程学分)、GetLesNo(获得课程序号)、GetSelect(获得是否选择过的标志变量)、SetSelect(设置选择控制标志变量)和SetName(单独定义设置课程名称),用来实现相关的操作功能。
计算机系一共有65门课程,其中相互之间存在依赖关系的课程有56门,另外9门为独立课程,不存在依赖关系。
LessonB[65]定义课程类的对象数组,可以通过调用课程类的各种成员函数对65门课程的课程序号、课程代号、课程名称以及课程学分等等进行操作。
3.2邻接表类的定义
邻接表是一种顺序存储与链接存储相结合的存储方法。
在邻接表中存在两种结点结构:
顶点表结点和边表结点,如图3.1所示。
顶点表结点边表结点
图3.1邻接表表示的结点结构
采用C++中的结构类型描述上述结点,用C++中的类实现基于邻接表存储结构下图的各种数据类型和操作功能。
由于采用了C++的模板机制,邻接表中的数据元素可以是任意的。
在本次课程设计中,邻接表中的数据元素初始化为课程类对象。
3.3重要函数的实现
(1)邻接表构造函数ALGraph
邻接表构造函数ALGraph(Ta[],intn,inte,intedge[][73]),初始化一个有n个顶点、e条边和73个依赖关系的AOV网。
当定义一个邻接表类的对象时,调用该构造函数,通过实参与形参相结合,实现课程信息的存储,建立AOV网,实现课程及课程之间的关系。
流程图如图3.2所示。
图3.2邻接表ALGraph的构造函数
(2)邻接表成员函数TopSort
邻接表成员函数TopSort(TOutLes[10][100],TB[65])按批次扫描AOV网,每次扫描后都将得到的入度为0的顶点依次存入数组的每行,同时对存入顶点的后继顶点进行入度减1操作。
不同批次扫描得到的顶点存在数组的不同列。
在此函数中通过用户的输入,还实现了专业课选择操作,并且实现了相关的输出功能。
邻接表成员函数TopSort流程图如图3.3所示。
(3)邻接表类成员函数BalanScore
邻接表类成员函数BalanScore(TOutLes[10][100],intcount,ints,floatscore,TB[65])主要通过设置学分变量对每个学期的课程量进行控制,以实现不同学期的课程数目大致相等。
对于某个学期课程学分未达到最少修读学分的问题,主要通过插入独立课程补足学分解决,同时在插入的同时设置学分上限,以免超过学分修读范围。
最后将课程信息按不同学期依次进行输出。
邻接表类成员函数BalanScore流程图如图3.4所示。
4运行环境与测试结果
4.1运行环境
在本课程设计中,系统开发平台为WindowsXP,程序运行环境为VisualC++6.0,程序设计语言为C++。
VisualC++一般分为三个版本:
学习版、专业版和企业版,不同版本适合于不同类型的应用开发。
实验中可以使用这三个版本的任意一种,在本课程设计中,以VisualC++6.0为编程环境。
VisualC++以拥有“语法高亮”,IntelliSense(自动编译功能)以及高级除错功能而著称。
比如,它允许用户进行远程调试和单步执行等。
还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。
其编译及建置系统以预编译头文件、最小重建功能及累加链接著称。
这些特征明显缩短程式编辑、编译及链接的时间花费,在大型软件计划上尤其显著。
VisualC++6.0秉承VisualC++以前版本的优异特性,为用户提供了一套良好的开发环境,主要包括文本编辑器、资源编辑器、工程创建工具和Debugger调试器等等。
用户可以在集成开发环境中创建工程,打开工程,建立、打开和编辑文本,编译、链接、运行和调试应用程序。
4.2测试结果
(1)对所有课程输出情况的测试
在主函数运行初,先利用课程类定义了对象数组,通过对象数组调用了各种成员函数,实现对计算机系本科课程信息的总体输出。
同时,使用制表符和设置宽度函数,调整输出结果,使查看更清楚。
计算机系本科课程信息部分输出如图4.1所示。
图4.1部分本科课程输出
(2)对利用学分均匀每学期课程量的测试
输出数组OutLes[10][100]第一行元素保存的课程名称,即第一学期课程名称,独立课程暂时不计入内。
如图4.2所示。
图4.2排序输出及已选学分
学分未达到修读要求,根据提示选择可选的独立课程补足学分。
具体情况如图4.2、4.3和4.4所示。
图4.3提示输入选择课程的序号
图4.4提示与选择
当所选课程的学分已大于学分修读下限时,此时停止选择,输出第1个学期的课程信息。
第1个学期的课程信息输出情况如图4.4所示。
图4.4第1个学期课程信息
(3)对选择专业选修课的测试
当排序输出过程中遇到专业选修课时,可以通过根据提示输入所选课来进行选择,如图4.5所示。
图4.5选择专业选修课
(4)对计算机系本科课程安排计划的输出测试
通过对课程排序、保存、判断、选择和插入等一系列操作,最终解决计算机系本科课程的编制的问题,并输出结果。
前3个学期的课程安排计划输出如图4.6、4.7和4.8所示。
图4.6第1个学期的课程安排计划
图4.7第2个学期的课程安排计划
图4.8第3个学期的课程安排计划
5课程设计心得体会;
在这次课程设计中我又进一步地了解了数据结构中算法的核心思想的重要性,懂得了一个程序地好坏关键在于算法是否优秀,一个好的优秀的算法可以使我们的程序更加完善,安全性更高以及有更高的效率。
这次设计中我发现了自己的许多不足,如对指针的机制掌握的还不是很透彻,有的时候会出现指针指向错误以及空指针的错误,还有不能很好地分析自己算法地复杂度以及不能很好地使用控制机制使自己的程序流畅地运行。
#ifndefGRAPH_H//定义头文件
#defineGRAPH_H
#include<
string>
usingnamespacestd;
//定义边表结点
structArcNode
{
intadjvex;
//邻接点域
ArcNode*next;
};
//定义顶点表结点
template<
classT>
structVertexNode
Tvertex;
//数据域
intindegree;
//入度
ArcNode*firstedge;
constintMaxSize=56;
//图的最大顶点数
classALGraph
public:
ALGraph(Ta[],intn,inte,intedge[][73]);
//构造函数,初始化一个有n个顶点e条边73个依赖关系的图
~ALGraph();
//析构函数,释放邻接表中各边表结点的存储空间
voidTopSort(TOutLes[10][100],TB[64]);
//排序并进行相应的输出,按批次保存顶点,并且每次保存的顶点入度都为0
voidBalanScore(TOutLes[10][100],intcount,ints,floatscore,TB[64]);
//平衡每次输出的顶点的量
private:
VertexNode<
T>
adjlist[