算法程序的设计实验报告.docx
- 文档编号:27113110
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:29
- 大小:189.89KB
算法程序的设计实验报告.docx
《算法程序的设计实验报告.docx》由会员分享,可在线阅读,更多相关《算法程序的设计实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
算法程序的设计实验报告
《程序设计》课程设计
姓名:
王
学号:
20100034
班级:
软件工程00班
指导教师:
王会青
成绩:
2010年6月实验一•构造可以使n个城市连接的最小生成树
专业:
—软件工程班级:
—软件:
_王学号:
_20100034
完成日期:
_2010/6/26
一、【问题描述】
给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。
1城市间的道路网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个
城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。
2显示出城市间道路网的邻接矩阵。
3最小生成树中包括的边及其权值,并显示得到的最小生成树的总代价。
4输入城市数、道路数t输入城市名t输入道路信息t执行Kruskal算法宀执行Prim算法宀输
出最小生成树
二、【问题分析】
1.抽象数据类型结构体数组的定义:
#ifndefADJACENCYMATRIXED//防止该头文件被重复引用
#defineADJACENCYMATRIXED//而引起的数据重复定义
#defineINFINITY32767//最大值
#defineMAX_VERTEX_NUM20//最大顶点个数
typedefintVRType;//权值,即边的值
typedefcharInfoType;//附加信息的类型,后面使用时会定义成一个指针
typedefcharVertexType[MAX_VERTEX_NUM];//顶点类型
typedefenum{DG=1,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向图,无向网}
typedefstructArcCell
{
VRTypeadj;//VRType是顶点关系类型。
对无权图,用1或0表示相邻否;对带
权图,则为权值类型。
InfoType*info;//该弧关系信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{
VertexTypevexs[MAX_VERTEX_NUM];//顶点向量
AdjMatrix
arcs;
//邻接矩阵
intvexnum,arcnum;
//图的当前顶点数和弧数
GraphKind
}MGraph;
kind;
//图的种类标志
typedefstruct
{
VertexTypeadjvex;
VRTypelowcost;
}closedge[MAX_VERTEX_NUM];
//普里姆算法辅助数组的定义
#endif
//结束if
2程序模块
MGraphG;
intmain(intargc,char*argv[]);
StatusLocateVex(MGraphG,VertexTypev);
StatusCreateUDN(MGraph&G);voidDisplayNet(MGraphG);
voidMiniSpanTree_KRUSKAL(MGraphG);
//网G,唯一的全局变量
//主函数
//判断城市v在网G中的位置
//创建网G的邻接矩阵
//以邻接矩阵的形式显示网G
//最小生成树的Kruskal算法
voidMiniSpanTree_PRIM(MGraphG,VertexTypeu);//StatusMinimum(closedgecloseEdge,intn);//Prim
最小生成树的Prim算法
算法中求下一个城市的函数
voidDeleteInfo(MGraph&G);
//释放堆存上动态申请的空间
3.流程图
创建用邻接矩阵表示的城市道路网
输入城市数G.vexnum、
道路数G.arcnum
输入城市名G.vexs[i]
输入表示道路的两个城市及道路值
G.arcs[i][j].adj
返回0K
Prim算法
化辅助数组closeEdge
for(i=1;i 求下一个城市k=Minimum(closeEdge, G.vexnum) 输出找到的道路 标记城市,避免重复 输出总耗费 4.数据类型定义 为了用邻接矩阵表示图G,先是定义二维数组的每一个元素含道路值然后在图的定义中定义 int型的城市数 一个此二维数组的结构成员。 并且在图中还定义一个用来存放城市的一维数组及级道路数。 用二维数组的两个下标表示道路,这两个下标又在一位数组中对应两个城市。 这样就建立起了一个城市到城市之间的道路网。 4.程序主要模块 说明: 该程序共含5个模块,本人负责其中2个模块构造: ***************LocateVex(MGraphG,VertexTypev)****************StatusLocateVex(MGraphG,VertexTypev); { while(strcmp(G.vexs[i],v)){i++;} 返回i; } ****************CreateUDN************************* { 输入城市数、道路数; for(i=0;i<城市数;++i)输入城市名; for(i=0;i<城市数;++i) for(j=0;j<城市数;++j)初始化邻接矩阵: 道路值=INFINITY; for(i=0;i<城市数;++i) for(j=0;j<城市数;++j)输入两个城市表示道路,输入道路值; } ************************** PRIM算法 MiniSpanTree_PRIM*********voidMiniSpanTree_PRIM(MGraphG,VertexTypeu){ 定义辅助数组: closedgecloseEdge;初始化: strcpy(closeEdge[j].adjvex,u); closeEdge[j].lowcost=G.arcs[k][j].adj; for(i=1;i 在其余G.vexnum-1个城市中找到离辅助数组中标记的道路最小值;显示找到的道路; 标记新找到的城市; } } **********************Minimum***************** StatusMinimum(closedgecloseEdge,intn) { 在辅助数组中找到道路值最小的道路的两点城市: if((closeEdge[i].lowcost! =0)&&(minTemp>closeEdge[i].lowcost))返回该城市在G中的位置 } 三、【功能实现】 #include #include #include #include #include"TypeDefine.h" #include"AdjacencyMatrix.h" #include"InitializeFunction.h" #include"MiniSpanTree_KRUSKAL.h" #include"MiniSpanTree_PRIM.h" #include"DisplayNet.h" #include"DeleteInfo.h" intmain(intargc,char*argv[]);//主函数 StatusLocateVex(MGraphG,VertexTypev);//判断城市v在网G中的位置 StatusCreateUDN(MGraph&G);//创建网G的邻接矩阵 voidDisplayNet(MGraphG);//以邻接矩阵的形式显示网G voidMiniSpanTree_KRUSKAL(MGraphG);//最小生成树的Kruskal算法 voidMiniSpanTree_PRIM(MGraphG,VertexTypeu);//最小生成树的Prim算法 StatusMinimum(closedgecloseEdge,intn);//Prim算法中求下一个城市的函数 voidDeleteInfo(MGraph&G);//释放堆存上动态申请的空间 intmain(intargc,char*argv[]) { CreateGraph(G); DisplayNet(G); MiniSpanTree_KRUSKAL(G); MiniSpanTree_PRIM(G,G.vexs[0]); DeleteInfo(G); cout< system("pause"); return0; } //intializeFunction.h StatusCreateDG(MGraph&G){return0;}; StatusCreateDN(MGraph&G){return0;}; StatusCreateUDG(MGraph&G){return0;}; StatusCreateUDN(MGraph&G); StatusLocateVex(MGraphG,VertexTypev){ //判断输入的顶点v在G中的位置。 //根据顶点的类型,可重载此函数。 目前为charinti=0; while(strcmp(G.vexs[i],v)){i++;} returni; } StatusCreateGraph(MGraph&G) { //采用数组(邻接矩阵)表示法,构造图G. G.kind=UDN;//默认构造无向网 /*printf("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("|1: 有向图2: 无向图3: 有向网4: 无向网\n"); printf("|请选择: []\b\b"); scanf("%d",&G.kind); printf("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");*/ switch(G.kind) { caseDG: returnCreateDG(G); //构造有向图G caseDN: returnCreateDN(G); //构造有向网G caseUDG: returnCreateUDG(G); //构造无向图G caseUDN: returnCreateUDN(G); //构造无向网G default: returnERROR; } }//CreateGraph StatusCreateUDN(MGraph&G){ //采用数组(邻接矩阵)表示法,构造图G. inti,j,k; VertexTypev1,v2; VRTypew; \n"); printf(”构造可以使N个城市连接的最小生成树 printf("请输入城市数、道路数(至少6个城市,10条道路): ");cin>>G.vexnum>>G.arcnum; for(i=0;i { printf("请输入第%d个城市名(共%d个): ",i+1,G.vexnum);cin>>G.vexs[i]; } for(i=0;i { for(j=0;j { G.arcs[i][j].adj=INFINITY; //G.arcs[i][j].info=NULL; } } printf("请输入一条道路连接的两个城市名及权值: \n"); for(k=0;k { j=LocateVex(G,v2); returnOK; }//CreateUDN //MiniSpanTreePRIM.h StatusMinimum(closedgecloseEdge,intn) { inti,flag,minTemp=INFINITY; for(i=0;i { if((closeEdge[i].lowcost! =0)&&(minTemp>closeEdge[i].lowcost)) { minTemp=closeEdge[i].lowcost; flag=i; returnflag; voidMiniSpanTree_PRIM(MGraphG,VertexTypeu) //用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。 //记录从顶点集U到V-U的代价最小的边的辅助数组定义见"AdjacencyMatrix.h"inti,j,k,totalCost=0;closedgecloseEdge;k=LocateVex(G,u); for(j=0;j { if(j! =k) { strcpy(closeEdge[j].adjvex,u);closeEdge[j].lowcost=G.arcs[k][j].adj; } } cout<<"|用Prim算法求最小生成树的各条边依次为: \n"; closeEdge[k].lowcost=0;//初始,U={u}; for(i=1;i { k=Minimum(closeEdge,G.vexnum);//求出T的下一个结点: 第k顶点 //此时closeEdge[k].lowcost=MIN{closeEdge[vi].lowcost|closeEdge[vi].lowcost> 0,vi€V-U} cout<<'<'< totalCost+=closeEdge[k].lowcost; closeEdge[k].lowcost=0;//第k顶点并入U集 for(j=0;j //新顶点并入U后重新选 { if(G.arcs[k][j].adj 择最小边 strcpy(closeEdge[j].adjvex,G.vexs[k]); closeEdge[j].lowcost=G.arcs[k][j].adj; } } } cout<<"\n|总代价: "< cout<<"+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA }//MiniSpanTree 四、【实例测试及运行结果】 乱4/W4”444Z444W矢4W仮、 : 用叶5算法求最小生成树的各条边依次为士 ;总代价i385 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA鼻 五、【心得体会】 通过本周的课程设计,我有不少收获。 既巩固和加深了对数据结构的理解,认识到《数据结构》是计算机专业一门重要的专业技术基础课程,还提高了我综合运用本课程所学知识的能力。 而且,并不是单纯的看看教材就能解决我们的实际问题,所以还要去查找各种我们所需要的资料, 所以这次课程设计也培养了我选用参考书,查阅手册及文献资料的能力。 要完成一个课程设计的 课题并不是一次就能编译成功的,中间会出现很多的大问题小问题,改错是个很繁琐的问题。 通过这次课程设计培养了我独立思考,深入研究,分析问题,解决问题的能力。 在以后的学习过程中我将要注意以下几点: 1、认真上好专业实验课,多在实践中锻炼自己。 2、 写程序的过程要考虑周到,严密。 3、在做设计的时候要有信心,有耐心,切勿浮躁。 4、认真的 学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。 5、在课余时间里多写程序, 熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。 实验二: 统计数字 专业: 软件工程班级: 软件: 王学号: 20100034 完成日期: _2010/6/28_ 1.【问题描述】 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。 已知不相同的数不 超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。 2【设计需求及分析】 (1)设计要求 原始数据保存在文件count.in中,文件包含n+1行。 第1行是整数n(1<=n<=200000),表示自然 数的个数;第2~n+1行每行一个自然数。 结果保存在文件count的尾部,其中结果包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。 每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。 (2)设计思路首先必须有文件的打开和关闭语句,将文件的容读取到数组计数。 最终输出数据和次数。 并写入文件的尾部。 A[]为容纳数据的数组, a[]中,然后对数组进行排列和对比, 序之后的容由while设置条件,用往后的排查。 最后输出数据和次数。 下面是关键步骤: FILE*fp=fopen("count.txt","a+"); if(fp==NULL){ printf("无文件"); return-1;} for(i=0;i<9;i++){ fscanf(fp,"%d",&a[i]); fscanf(fp,"\n”);} intj,t; for(i=1;i<9;i++) for(j=0;j<9-i;j++)if(a[j]>a[j+1]){ t=a[j]; a[j]=a[j+1]; a[j+1]=t; } for(i=0;i<9;i++){ fopen为文件打开函数, if进行判断。 // // // // fscanf为文件读取函数,然后进行冒泡排序。 排在不等于时,中间嵌套了一个while循环,进行 用只读/的方式打开文件 若没有文件则返回一1 读取文件 冒泡排序 count=1; if(a[i]! =a[i+1]){printf("%d\t%d\n",a[i],count);fprintf(fp,"%d\t%d\n",a[i],a[i]);i++; 对数字的循环查找和控制条件, } if(a[i]==a[i+1]) { while(a[i]==a[i+1]) { count++; i++;} } } (3)输出输入格式 输入时,为竖行依此输入文件,且为数字。 且为9个以的数字。 输出时,分为两行,第一列为数据,第二列为次数。 3.【设计功能的实现】 #include count++; i++; } printf("%d\t%d\n",a[i],count); fprintf(fp,"%d\t%d\n",a[i],count); } } fclose(fp);//关闭文件 return0; } 4.【实例测试及运行结果】 敦据结果 23 42 51 1002 濡按任意键继续•… 5.【心得体会】 本次实验使我对于文件的打开和关闭语句有了更深的理解。 有打开必须有关闭。 同时在这次的设计中,我学习到了用泛洪算法解决实际问题的基本思维和步骤。 使我对算法的层次性更加清楚,更加加深了对算法的理解。 实验三•送货 专业: 软件工程班级: 软件: 王学号: 20100034 完成日期: 2010/6/26 1.【问题描述】 小明希望设计一个方案,从编号为1的交叉路口出发,每次必须沿街道去往街道另一端的路 口,再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。 输入数据格式 输入的第一行包含两个整数n,m(1wn<10,n-1 量,交叉路口从1到n标号。 接下来m行,每行两个整数a,b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。 两个路口之间最多有一条街道。 输出输出格式 如果小明可以经过每条街道正好一次,则输出一行包含m+1个整数P1,p2,p3,...,pm+1,表 示小明经过的路口的顺序,相邻两个整数之间用一个空格分隔。 如果有多种方案满足条件,则输出字典序最小的一种方案,即首先保证P1最小,P1最小的前提下再保证P2最小,依此类推。 如果不存在方案使得小明经过每条街道正好一次,则输出一个整数-1。 测试数据 输入: 输出: 45 124134 12 13 14 24 34 输出说明: 城市的地图和小明的路径如下图所示。 输入: 输出: 46 -1 12 13 14 24 34 23 输出说明: 城市的地图如下图所示,不存在满足条件的路径。 2【问题分析】 该算法使用欧拉回路,对于欧拉图,从一个节点出发,从某个节 点开始,然后查出一个从这个出发回到这个点的环路径。 这种方法不保证每个边都被遍历。 如果有某个点的边没有被遍历就让这个点为起点,这条边为起始边,把它和当前的环衔接上。 这样直至所有的边都被遍历。 这样,整个图就被连接到一起了。 具体步骤: 1。 如果此时与该点无相连的点,那么就加入路径中 2。 如果该点有相连的点,那么就加入队列之中,遍历这些点,直到没有相连的点3。 处理当前的点,删除走过的这条边,并在其相邻的点上进行同样的操作,并把删除的点加入到路径中去。 4。 这个其实是个递归过程。 3【功能实现】 #inelude
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 程序 设计 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)