1、C3、C4C6计算机原理C2、C4C7数据库原理C4、C5、C6先修课程规定了课程之间的依赖关系,这种关系可以用AOV网来表示,其中顶点表示课程,弧表示依赖关系,如图1.1所示。图1.1 表1.1对应的AOV网程序的主要功能是实现课程的排序,以满足同一学期所修的课程相互之间无依赖关系,并且已修完其所有先修课程。另外,设置学分变量,控制每个学期的课程量基本均匀。2 概要设计2.1 设计思路数据结构课程主要讨论数据表示和数据处理的基本问题。数据要能被计算机处理,首先必须能够存储在计算机的内存中,这项任务称为数据表示,数据表示的核心任务是数据结构的设计;一个实际问题的求解必须满足各项处理要求,这项任
2、务称为数据处理,数据处理的核心任务是算法设计。本课程设计是基于C+程序设计语言实现的。C+语言的主要特点表现在两个方面,一是全面兼容C,二是支持面向对象的方法。因此,C+既支持面向过程的程序设计,又支持面向对象的程序设计。C+语言最有意义的方面是支持面向对象的特征,基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的。在此基础上利用了继承机制和多态性,就成为面向对象的程序设计。数据结构中的数据表示和数据处理问题都可以通过C+类中数据和对数据进行操作的函数来实现。2.2 数据表示教学计划编制问题中,操作对象是课程。课程之间的依赖关系用AOV网表示, AOV网的构造采用邻接表实现。因此,
3、本程序设计定义了两个类:课程类和邻接表类。课程类(Lesson)添加了5个私有成员变量用来定义课程的5个属性:课程代号、课程名称、课程序号、课程学分以及是否被选择过的课程标记。同时还定义了8个成员函数,已实现相关的操作功能。邻接表类(ALGraph)定义了2个整型成员变量和1个结构体数组来存放顶点数、边数和顶点表。同时还定义了4个成员函数实现用来实现AOV网的构造、删除、排序以及相关输出功能。2.3 数据处理数据处理必须借助函数来实现。本程序设计通过调用类的各种成员函数实现各种需要操作。课程类(Lesson)的成员函数如表2.1所示。表2.1 Lesson类的成员函数函数名称功能声明void
4、SetLes()对课程各种属性进行赋值string GetNum()获得课程代号string GetName()获得课程名称float GetLesScore()获得课程学分int GetLesNo()获得课程序号bool GetSelect()获得是否选择过的标志变量void SetSelect()设置选择控制标志变量,以避免重复选课void SetName()单独定义设置课程名称的函数,以方便一些操作邻接表类(ALGraph)的成员函数如表2.2所示。表2.2 ALGraph类的成员函数ALGraph()构造函数ALGraph()析构函数void TopSort()实现AOV网中顶点的排序
5、并进行相应的输出void BalanScore()平衡每次输出的顶点的数目3 详细设计3.1 课程类的定义课程类(Lesson)添加了5个私有成员变量:LesNum (课程代号)、LesName(课程名称)、LesScore(课程学分)、LesNo(课程序号)以及Select(是否被选择过的课程标记),分别用来定义课程的5个属性;同时还定义了8个成员函数:SetLes(对课程各种属性进行赋值)、GetNum(获得课程代号)、GetName(获得课程名称)、GetLesScore(获得课程学分)、GetLesNo(获得课程序号)、GetSelect(获得是否选择过的标志变量)、SetSelect
6、(设置选择控制标志变量)和SetName(单独定义设置课程名称),用来实现相关的操作功能。计算机系一共有65门课程,其中相互之间存在依赖关系的课程有56门,另外9门为独立课程,不存在依赖关系。Lesson B65定义课程类的对象数组,可以通过调用课程类的各种成员函数对65门课程的课程序号、课程代号、课程名称以及课程学分等等进行操作。3.2 邻接表类的定义邻接表是一种顺序存储与链接存储相结合的存储方法。在邻接表中存在两种结点结构:顶点表结点和边表结点,如图3.1所示。 顶点表结点 边表结点图3.1邻接表表示的结点结构采用C+中的结构类型描述上述结点,用 C+中的类实现基于邻接表存储结构下图的各种
7、数据类型和操作功能。由于采用了C+的模板机制,邻接表中的数据元素可以是任意的。在本次课程设计中,邻接表中的数据元素初始化为课程类对象。3.3 重要函数的实现(1)邻接表构造函数ALGraph邻接表构造函数ALGraph(T a,int n,int e,int edge73) ,初始化一个有n个顶点、e条边和73个依赖关系的AOV网。当定义一个邻接表类的对象时,调用该构造函数,通过实参与形参相结合,实现课程信息的存储,建立AOV网,实现课程及课程之间的关系。流程图如图3.2所示。图3.2 邻接表ALGraph的构造函数(2)邻接表成员函数TopSort邻接表成员函数TopSort(T OutLe
8、s10100,T B65)按批次扫描AOV网,每次扫描后都将得到的入度为0的顶点依次存入数组的每行,同时对存入顶点的后继顶点进行入度减1操作。不同批次扫描得到的顶点存在数组的不同列。在此函数中通过用户的输入,还实现了专业课选择操作,并且实现了相关的输出功能。邻接表成员函数TopSort流程图如图3.3所示。 (3)邻接表类成员函数BalanScore邻接表类成员函数BalanScore(T OutLes10100,int count,int s,float score,T B65)主要通过设置学分变量对每个学期的课程量进行控制,以实现不同学期的课程数目大致相等。对于某个学期课程学分未达到最少修
9、读学分的问题,主要通过插入独立课程补足学分解决,同时在插入的同时设置学分上限,以免超过学分修读范围。最后将课程信息按不同学期依次进行输出。邻接表类成员函数BalanScore流程图如图3.4所示。4 运行环境与测试结果4.1 运行环境在本课程设计中,系统开发平台为Windows XP,程序运行环境为Visual C+ 6.0,程序设计语言为C+。Visual C+一般分为三个版本:学习版、专业版和企业版,不同版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一种,在本课程设计中,以Visual C+ 6.0为编程环境。Visual C+以拥有“语法高亮”,IntelliSense(自
10、动编译功能)以及高级除错功能而著称。比如,它允许用户进行远程调试和单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加链接著称。这些特征明显缩短程式编辑、编译及链接的时间花费,在大型软件计划上尤其显著。Visual C+ 6.0秉承Visual C+ 以前版本的优异特性,为用户提供了一套良好的开发环境,主要包括文本编辑器、资源编辑器、工程创建工具和Debugger调试器等等。用户可以在集成开发环境中创建工程,打开工程,建立、打开和编辑文本,编译、链接、运行和调试应用程序。4.2 测试结果(1)对所有课程输出情况
11、的测试在主函数运行初,先利用课程类定义了对象数组,通过对象数组调用了各种成员函数,实现对计算机系本科课程信息的总体输出。同时,使用制表符和设置宽度函数,调整输出结果,使查看更清楚。计算机系本科课程信息部分输出如图4.1所示。图4.1部分本科课程输出(2)对利用学分均匀每学期课程量的测试输出数组OutLes10100第一行元素保存的课程名称,即第一学期课程名称,独立课程暂时不计入内。如图4.2所示。图4.2排序输出及已选学分学分未达到修读要求,根据提示选择可选的独立课程补足学分。具体情况如图4.2、4.3和4.4所示。图4.3提示输入选择课程的序号图4.4提示与选择当所选课程的学分已大于学分修读
12、下限时,此时停止选择,输出第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 结束语这次课程设计内容是计算机系本科课程
13、教学计划编制,这对我来说是个很有挑战性的任务,虽然只编制出了教学计划,但通过两个星期的设计也从中学到了不少,更深刻地理解了课本中的内容。数据结构是计算机及相关专业的一门重要的专业基础课,也是计算机及相关专业考研和水平等级考试的必考科目,而且正逐渐发展成为众多理工专业的热门选修课。要从事与计算机和科学与技术相关的工作,尤其是计算机应用领域的开发和研制工作,必须具备坚实的数据结构基础。并且,数据结构是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。同时再次深刻理解了C+中类的思想和实现,数据结构的概念和相关操作。根据实际问题的需要,对各方面的优缺点加以综合平衡,从中
14、选择比较适宜的数据结构和实现方法。在本次课程设计中,我明白了理论与实际结合的和总要性,培养了基本的、良好的程序设计技能,提高了综合运用所学知识的能力。通过本次课程设计,我学到了很多东西。对我个人编程动手能力有一定的提高,使我知道编程不是简单的写作业。一个系统,我们要从各方面考虑,有可能出现的问题是要事先考虑清楚的。同时,在设计初期一定要选择好数据结构,因为这将影响到整个系统的可扩展性。而且,我在编程过程中,更加认识到了C+语言的魅力和精确。一些以往中忽视掉的和误解的概念,也在这次编程中有新的理解和感悟。我也总结了不少有利的编程习惯。比如,每写一个函数就测试一下功能是否正确,合理的书写注释,遇到
15、难题时,最好的方法是另外编写一个小的程序,测试其错误的地方以便加以修该。定义在主函数中的变量,大多数是要在多个函数中要用到的。我发现,将函数的参数命名为我的变量名,给我省下不少麻烦。这些都是在不断的调试和改错中,提取出来的经验。可能这些经验已经被大多数编程者知晓,但我的亲身体验让我更加理解这些被提倡的习惯。在这次课程设计中曾遇到了不少问题,就单凭我一个人的能力很难准时有效的完成这次课程设计。在此,我衷心感谢我的指导老师XXX老师。黄老师对工作认真负责,耐心辅导,知识丰富。在这次课程设计中给了我很大的帮助。他严谨的治学精神和深厚的理论水平都使我获益匪浅。同时还要感谢我的同学,他们为我提出了很多有
16、用的建议,帮助我完成了这次的课程设计。最后也要感谢我们学校为我们提供良好的编程环境,使我们能够按时完成任务。参考文献1 G.Perry. C+程序设计教程. 北京:清华大学出版社,19942 Kenneth A.Reek . 徐波. C和指针. 北京:人民邮电出版社,20083 G.Perry. C+程序设计教程. 北京:4 王为青,刘变红 . C语言高级编程及实例剖析 . 北京:人民邮电出版社,20075 严蔚敏 等 .数据结构(C语言版).北京:清华大学出版社,19976 周晓聪,李文军,李师贤. 面向对象程序设计实践与提高. 中山大学计算机科学学院讲义,1999附录:源程序清单/ 程序名
17、称:graph.h,graph.cpp,information.h,main.cpp/ 程序功能:采用面向对象方法设计程序,解决教学计划编制问题/ 程序作者:XX/ 最后修改日期:2009-9-18/邻接表头文件/采用邻接表来存储图的顶点和边#ifndef GRAPH_H /定义头文件#define GRAPH_H #includeusing namespace std;/定义边表结点struct ArcNode int adjvex; /邻接点域 ArcNode *next;/定义顶点表结点templatestruct VertexNode T vertex; /数据域 int indegr
18、ee; /入度 ArcNode *firstedge;const int MaxSize=56; /图的最大顶点数class ALGraphpublic: ALGraph(T a,int n,int e,int edge73); /构造函数,初始化一个有n个顶点e条边73个依赖关系的图 ALGraph(); /析构函数,释放邻接表中各边表结点的存储空间 void TopSort(T OutLes10100,T B64) ;/排序并进行相应的输出,按批次保存顶点,并且每次保存的顶点入度都为0 void BalanScore(T OutLes10100,int count,int s,float
19、score,T B64);/平衡每次输出的顶点的量private: VertexNode adjlistMaxSize; /存放顶点表的数组 int vertexNum,arcNum; /图的顶点数和边数#endif/定义邻接表的cpp文件iostream#include graph.h/引入头文件/邻接表构造函数ALGraphALGraph:ALGraph(T a,int n,int e,int edge73) int i1,j1; /边所依附的两个顶点的序号 int lat=-1; vertexNum=n;arcNum=e; /输入顶点信息,初始化顶点表 for(int i=0;ivert
20、exNum;i+) adjlisti.vertex=ai; /ai为输入的课程信息,通过实参与形参结合实现课程信息存储 adjlisti.firstedge=NULL; adjlisti.indegree=0; /根据数组中调出的每一条边的信息,初始化边表,并在相应的边表中插入结点 for(int k=0;karcNum;k+) i1=edge0+lat; j1=edge1lat; couti1j1 adjvex=j1; /生成一个边表结点s s-next=adjlisti1.firstedge; /将结点s插入到结点i的边表的表头 adjlisti1.firstedge=s; /最后生成i-
21、j adjlistj1.indegree=adjlistj1.indegree+1; /入度加1/邻接表的析构函数ALGraphi+) /依次删除顶点结点 ArcNode * p=adjlisti.firstedge; while(p!=NULL) /循环删除边结点 adjlisti.firstedge=p-next; delete p; p=adjlisti.firstedge; /排序并进行相应的输出,按批次保存顶点入二维数组OutLes,并且每次保存的顶点入度都为0void ALGraphadjvex; adjlistk.indegree-; /将入度减1 p=p- /对每个顶点的相关信
22、息进行输出,暂时不计独立的顶点 /在本程序中顶点的类型其实就是课程类 /所以下面的循环就是对课程的课程名称进行输出,暂时不计独立的科目 for( ;bcount+1;b+) cout第b+1个学期课程的课程名称如下:说明:独立的课程暂时不计入内 float score=0; for(int a=0;as;a+) /对专业选修课进行选择 if(OutLesba.GetName()=JAVA程序设计(C#程序设计) cout请从JAVA程序设计和C#程序设计中任选一门您的专业选修课 string p2=JAVA程序设计,C#程序设计 int q; coutq; while(!(q=0|q=1);p
23、q OutLesba.SetName(pq); else coutOutLesba.GetName()/提示用户所选的课程名称 score=score+OutLesba.GetLesScore();/对学分进行统计 BalanScore(OutLes, count, s,score, B); /在本例中其实就是利用学分变量对每个学期的课程量进行控制BalanScore(T OutLes10100,int count,int s,float score,T B65) /学分的控制范围为21score29 if(!(21score) float Allscore=163;/总学分数为163 float Avescore=Allscore/7;/每个学期平均学分数 coutn每个学期平均学分数为:Avescoren您每个学期所选的课程学分应大于 Avescore-2且小于Avescore+6/输出每个学期的平均学分数以及学分修读范围要求 /对课程量不够的学期,增加一定量的课程,直到达到学分修读要求为止n本学期课程量不够,请从以下课程中选择一定量的课程,以满足学分修读要求n for(int i=56;65;i+
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2