1、苏州科技学院二一 二一一学年第一学期电子信息工程学院课程设计报告书课程名称: 面向对象技术 班 级: 组 号: 组长姓名: 组成员姓名: 指导教师: 二一一年七月一 类设计class edgetype /定义含权边类protected:char v1; /两个结点char v2;float edgeweight; /权值public:friend graph; ;class graph /定义含权无向图类public:graph(); /构造函数 graph(graph /拷贝构造函数 graph(); /析构函数 void addnode(char a); /添加结点 void deleno
2、de(char c); /删除结点 void addedge(char p,char q,float weight); /增加含权的边 void deledge(char c,char b); /删除含权的边,该边的权值以 MAX 表示 void printnodenum(); /求图中结点的个数 void printedgenum(); /求图中边的个数 void Ppath(int path,int i,int v); /前向递归查找路径上的顶点 void Dispath(float dist,int path,float s,int n,int v); /输出路径(以 MAX 表示两点重
3、合的情况) void Dijkstra(int v); /用 Dijkstra 算法求单源最短路径 void build(); /建立图的邻接矩阵存储 void print(); /输出邻接矩阵 int locate(char v); /找顶点 V 在图中的位置 int find(int father,int v,int num); /找下标为 v 的结点的根父节点 void kruskal(int father); /kruskal 算法求最小生成树 void open(); /从文件中读取数据void save(); /保存数据protected:int nodenum; /顶点数int
4、arcnum; /边数char *vex; /顶点信息(动态) float *a; /邻接矩阵(动态) edgetype *edge; /边数组(动态)二 ;小组成员分工graph:graph() /构造函数 graph:graph(graph int i,*father,v;float weight;char q,a,c;father=NULL;printname();menu();cini;while(i!=0)switch(i)case 1:g.build ();break;case 2:g.print ();break;case 3:printf(“请输入你要添加的结点:“);cina
5、;g.addnode(a);break;case 4:printf(“请输入你要删除的结点:“);cinc;g.delenode(c);break;case 5:printf(“请输入要增加的边的两个端点和该边的权值:n“);cinacweight;g.addedge(a,c,weight);break;case 6:printf(“请输入用两个端点表示你要删除的含权的边:“);cinac;g.deledge(a,c);break;case 7:g.printnodenum();break;case 8:g.printedgenum();break;case 9:printf(“请输入源点:“
6、);cinq;v=g.locate(q);g.Dijkstra(v);break;case 10:g.kruskal(father);break;case 11:g.save();break;case 12:g.open();break;menu();cini;return 0;三 类源程序代码class graph; /提前引用声明class edgetype /定义含权边类protected:char v1; /两个结点char v2;float edgeweight; /权值public:friend graph; ;class graph /定义含权无向图类public:graph()
7、; /构造函数 graph(graph /拷贝构造函数 graph(); /析构函数 void addnode(char a); /添加结点 void delenode(char c); /删除结点 void addedge(char p,char q,float weight); /增加含权的边 void deledge(char c,char b); /删除含权的边,该边的权值以MAX 表示 void printnodenum(); /求图中结点的个数 void printedgenum(); /求图中边的个数 void Ppath(int path,int i,int v);/前向递归查
8、找路径上的顶点 void Dispath(float dist,int path,float s,int n,int v);/输出路径(以 MAX 表示两点重合的情况) void Dijkstra(int v); /用 Dijkstra 算法求单源最短路径 void build(); /建立图的邻接矩阵存储 void print(); /输出邻接矩阵 int locate(char v);/找顶点 V 在图中的位置 int find(int father,int v,int num);/找下标为 v 的结点的根父节点 void kruskal(int father);/kruskal 算法求最
9、小生成树 void open(); /从文件中读取数据void save(); /保存数据protected:int nodenum; /顶点数int arcnum; /边数char *vex; /顶点信息(动态) float *a; /邻接矩阵(动态) edgetype *edge; /边数组(动态);graph:graph() /构造函数 vex=NULL;a=NULL;edge=NULL;arcnum=0;nodenum=0;graph:graph(graph arcnum=g.arcnum;nodenum=g.nodenum;vex=new charnodenum;a=new floa
10、t*nodenum;for(i=0;ib;arcnum=arcnum+b;edge1=edge;edge=new edgetypearcnum;for(i=0;ipqweight;for(c=0;cpqweight;for(c=0;c=0 void menu() /菜单 printf(“n“);printf(“ *含权边类与含权无向图类*nn“);printf(“ 01.-建立图的邻接矩阵存储- 02.-输出邻接矩阵-nn“);printf(“ 03.-添加结点- 04.-删除结点-nn“);printf(“ 05.-增加含权的边- 06.-删除含权的边-nn“);printf(“ 07.-求
11、图中结点的个数- 08.-求图中边的个数-nn“);printf(“ 09.-用 Dijkstra 算法求单源最短路径- 10.-用 kruskal 算法求最小生成树nn“);printf(“ 11.-保存数据- 12.-从文件中读取数据-nn“);printf(“ 00.-退出-nn“);printf(“ *n“);printf(“ 请选择:“);/* Method Name: main* Discription: 主函数,用于测试对象 graph.* Parameter:graph g;* int i,*father,v;float weight;* char q,a,c; * Retur
12、n: return 0;* Author: 柏雪,田晓霞,华丽娜* Date: 2011/07/02* Version: V0.1*/int main() /main 函数graph g;int i,*father,v;float weight;char q,a,c;father=NULL;printname();menu();cini;while(i!=0)switch(i)case 1:g.build ();break;case 2:g.print ();break;case 3:printf(“请输入你要添加的结点:“);cina;g.addnode(a);break;case 4:pr
13、intf(“请输入你要删除的结点:“);cinc;g.delenode(c);break;case 5:printf(“请输入要增加的边的两个端点和该边的权值:n“);cinacweight;g.addedge(a,c,weight);break;case 6:printf(“请输入用两个端点表示你要删除的含权的边:“);cinac;g.deledge(a,c);break;case 7:g.printnodenum();break;case 8:g.printedgenum();break;case 9:printf(“请输入源点:“);cinq;v=g.locate(q);g.Dijkst
14、ra(v);break;case 10:g.kruskal(father);break;case 11:g.save();break;case 12:g.open();break;menu();cini;return 0;四 调试分析过程描述1 在删除某些点时,一开始忘了删除与那点有关的边了,导致后来求邻接矩阵时出错,后来将那些边的权值都修改为 MAX 表示已被删了,这样才解决了问题。2 在用*表示删除了的边后,在求结点的个数时,忘了将*排除在外了,后来加上了一个 if 判断条件语句才修改了错误。3 由于我们的含权无向图类是动态的,一开始我们在保存数据和读取数据时,用的是fwrite()和 f
15、read()函数,这两个函数是将类里面的数据整体保存和读出,但是由于我的类里面的数据有的为指针,这样做是不行的,后来我们采用的是 fprintf()和fscanf()函数才解决了问题。4 由于未看清源点的性质,我们在执行时一直以为程序有错误,结果在老师的指点下,我们理解了源点这个函数概念的定义,最终实验完成。五 本组的创新内容1在删除结点时,一开始我们想到的是,将存放顶点的字符数组从要删除的结点的后一个依次往前移一个,将要删除的店覆盖,但是后来发现,这么做,要对邻接矩阵做很大的改动,而且这样做会导致要修改很多的数据成员,为下面输出邻接矩阵,求单源最短路径和求最小生成树带来了很大的麻烦,最终,我
16、们决定用*来代替要删除的结点, ,这样,操作会大大简化,大部分数据成员都不需要修改,只需要修改邻接矩阵对应的点和一些边的权值,大大简化了后面的操作。这是我们举得一个例子:下面是原邻接矩阵:这是删除了点 c 之后的邻接矩阵:由此图可以看出:c 点被*替换了,原来 c 点所在的行和列的权值都变成了 MAX2这个项目的题目要求中没有让我们用动态,但是我们考虑到如果不用动态,一旦程序的规模大起来,对内存空间的浪费是非常大的所以我们将它做成了动态。这样跟利于内存空间的释放。六 总结1 通过这次的课程设计,我们能深刻地体会到面向对象与面向过程在实现功能方面的不同,面向对象具有面向过程所不具有的许多特点,就
17、拿 C 语言与 C+来说,C是一个面向过程的语言,C+是同时具有面向过程与面向对象功能的语言,C 语言在写小型程序时非常具有优势,但是一旦程序的规模大起来了,那么 C 语言就现在力不从心了,这时 C+的面向对象的功能就发挥出来了。如果一个大型程序你用C 来写,你要考虑好多细节方面的东西,很是麻烦。2 在用面向对象技术设计程序时,类的设计非常非常的重要,这直接关系到你后面的工作,把哪些成员封装起来,把哪些成员作为私有的,把哪些成员作为公有的,怎么样把这些成员3 通过这才的实践,我们体会到了团队分工、团队合作的重要性,在完成一个比较大的项目时,怎么样根据你们小组成员的实际情况来给他们分配任务是非常重要的一个环节,只有做好这个环节,你才能发挥出一个团队的最好水平,这样你的任务完成起来会相对比较好了。