算法程序的设计实验报告

上传人:泽*** 文档编号:75126540 上传时间:2022-04-15 格式:DOCX 页数:27 大小:138.96KB
收藏 版权申诉 举报 下载
算法程序的设计实验报告_第1页
第1页 / 共27页
算法程序的设计实验报告_第2页
第2页 / 共27页
算法程序的设计实验报告_第3页
第3页 / 共27页
资源描述:

《算法程序的设计实验报告》由会员分享,可在线阅读,更多相关《算法程序的设计实验报告(27页珍藏版)》请在装配图网上搜索。

1、程序设计课程设计姓名:王学号: 20100034班级:软件工程00 班指导教师:王会青成绩:2010年 6 月.实验一 . 构造可以使 n 个城市连接的最小生成树专业: _软件工程 _ 班级: _软件姓名: _王 _ 学号: _20100034完成日期: _2010/6/26_一、【问题描述】给定一个地区的n 个城市间的距离网,用Prim 算法或 Kruskal 算法建立最小生成树,并计算得到的最小生成树的代价。1 城市间的道路网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。2 显示出城市间道路网的邻接矩阵。3

2、最小生成树中包括的边及其权值,并显示得到的最小生成树的总代价。4 输入城市数、道路数输入城市名输入道路信息执行Kruskal算法执行Prim算法输出最小生成树二、【问题分析】1. 抽象数据类型结构体数组的定义 :#ifndef ADJACENCYMATRIXED/ 防止该头文件被重复引用#define ADJACENCYMATRIXED/ 而引起的数据重复定义#define INFINITY32767/ 最大值#define MAX_VERTEX_NUM 20/ 最大顶点个数typedef intVRType;/ 权值,即边的值typedef charInfoType;/ 附加信息的类型,后面

3、使用时会定义成一个指针typedef charVertexTypeMAX_VERTEX_NUM; / 顶点类型typedef enum DG=1, DN, UDG, UDN GraphKind;/有向图,有向网,无向图,无向网typedef struct ArcCellVRTypeadj;/VRType是顶点关系类型。对无权图,用1或 0表示相邻否;对带权图,则为权值类型。.InfoType*info;/ 该弧关系信息的指针ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedef structVertexTypevexsMAX_VERTEX_

4、NUM;/ 顶点向量AdjMatrixarcs;/ 邻接矩阵intvexnum, arcnum;/ 图的当前顶点数和弧数GraphKindkind;/ 图的种类标志MGraph;typedef struct/ 普里姆算法辅助数组的定义VertexTypeadjvex;VRTypelowcost;closedgeMAX_VERTEX_NUM;#endif/ 结束 if2 程序模块MGraph G;/ 网 G,唯一的全局变量int main(int argc, char * argv);/ 主函数Status LocateVex(MGraph G, VertexType v);/ 判断城市 v 在

5、网 G 中的位置Status CreateUDN(MGraph &G);/ 创建网 G 的邻接矩阵void DisplayNet(MGraph G);/ 以邻接矩阵的形式显示网 Gvoid MiniSpanTree_KRUSKAL(MGraph G);/ 最小生成树的 Kruskal算法void MiniSpanTree_PRIM(MGraph G, VertexType u); /最小生成树的 Prim算法Status Minimum(closedge closeEdge, int n); /Prim算法中求下一个城市的函数void DeleteInfo(MGraph &G);/ 释放堆内存

6、上动态申请的空间3. 流程图创建用邻接矩阵表示的城市道路网输入城市数G.vexnum、道路数 G.arcnum输入城市名G.vexsi.输入表示道路的两个城市及道路值G.arcsij.adj返回 OKPrim 算法化辅助数组closeEdgefor (i=1; iG.vexnum; +i)求下一个城市k = Minimum(closeEdge,G.vexnum)输出找到的道路标记城市,避免重复输出总耗费4. 数据类型定义为了用邻接矩阵表示图G ,先是定义二维数组的每一个元素含道路值然后在图的定义中定义一个此二维数组的结构成员。并且在图中还定义一个用来存放城市的一维数组及int型的城市数级道路数

7、。用二维数组的两个下标表示道路,这两个下标又在一位数组中对应两个城市。这样就建立起了一个城市到城市之间的道路网。.4. 程序主要模块说明:该程序共含5 个模块,本人负责其中2 个模块构造:*LocateVex(MGraph G, VertexType v)*Status LocateVex(MGraph G, VertexType v);while (strcmp(G.vexsi, v) i+;返回 i ;* CreateUDN*输入城市数、道路数;for (i=0; i城市数 ; +i)输入城市名;for (i=0; i城市数 ; +i)for(j=0; j城市数 ; +j)初始化邻接矩阵:

8、道路值= INFINITY;for (i=0; i城市数 ; +i)for(j=0; j城市数 ; +j)输入两个城市表示道路,输入道路值;PRIM算法* MiniSpanTree_PRIM*void MiniSpanTree_PRIM(MGraph G, VertexType u)定义辅助数组:closedge closeEdge;初始化: strcpy(closeEdgej.adjvex, u);closeEdgej.lowcost = G.arcskj.adj;.for (i=1; i closeEdgei.lowcost)返回该城市在G 中的位置三、【功能实现】#include #in

9、clude #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.MGraph G;/ 全局变量 Gint main(int argc, char * argv);/主函数Status LocateVex(MGraph G, VertexType v);/判断城

10、市v在网 G 中的位置Status CreateUDN(MGraph &G);/创建网 G 的邻接矩阵void DisplayNet(MGraph G);/以邻接矩阵的形式显示网Gvoid MiniSpanTree_KRUSKAL(MGraph G);/最小生成树的Kruskal算法void MiniSpanTree_PRIM(MGraph G, VertexType u);/最小生成树的Prim算法Status Minimum(closedge closeEdge, int n);/Prim算法中求下一个城市的函数void DeleteInfo(MGraph &G);/释放堆内存上动态申请的

11、空间int main(int argc, char * argv)CreateGraph(G);DisplayNet(G);MiniSpanTree_KRUSKAL(G);MiniSpanTree_PRIM(G, G.vexs0);DeleteInfo(G);coutendlG.vexnumG.arcnum;for (i=0; iG.vexsi;for (i=0; iG.vexnum; +i)/ 初始化邻接矩阵for (j=0; jG.vexnum; +j)G.arcsij.adj = INFINITY;/G.arcsij.info = NULL;printf(请输入一条道路连接的两个城市名及

12、权值:n);for (k=0; kv1v2w;/ 输入一条边依附的顶点及权值i = LocateVex(G, v1);/ 确定 v1、 v2 在 G中的位置j = LocateVex(G, v2);G.arcsij.adj = w;/ 弧 的权值G.arcsji = G.arcsij;/ 置 的对称弧 return OK;/CreateUDN/MiniSpan Tree PRIM.hStatus Minimum(closedge closeEdge, int n)int i, flag, minTemp = INFINITY;for (i=0; i closeEdgei.lowcost)min

13、Temp = closeEdgei.lowcost;flag = i;return flag;void MiniSpanTree_PRIM(MGraph G, VertexType u)/ 用普里姆算法从第u个顶点出发构造网G 的最小生成树T ,输出 T的各条边。./ 记录从顶点集U 到 V-U的代价最小的边的辅助数组定义见AdjacencyMatrix.hint i, j, k, totalCost=0;closedge closeEdge;k = LocateVex(G, u);for (j=0; jG.vexnum; +j)/ 辅助数组初始化if (j != k)strcpy(close

14、Edgej.adjvex, u);closeEdgej.lowcost = G.arcskj.adj;coutnn+n;cout|用 Prim 算法求最小生成树的各条边依次为:n-;closeEdgek.lowcost = 0;/ 初始, U=u;for (i=1; i 0, vi V-UcoutcloseEdgek.adjvex,G.vexsk;/ 输出生成树的边totalCost += closeEdgek.lowcost;closeEdgek.lowcost = 0;/ 第 k顶点并入U 集for (j=0; jG.vexnum; +j)if (G.arcskj.adj closeEdg

15、ej.lowcost)/ 新顶点并入U后重新选择最小边.strcpy(closeEdgej.adjvex, G.vexsk);closeEdgej.lowcost = G.arcskj.adj;coutn|总代价: totalCostendl;cout+/n;/MiniSpanTree四、【实例测试及运行结果】五、【心得体会】通过本周的课程设计,我有不少收获。既巩固和加深了对数据结构的理解,认识到数据结.构是计算机专业一门重要的专业技术基础课程,还提高了我综合运用本课程所学知识的能力。而且,并不是单纯的看看教材就能解决我们的实际问题,所以还要去查找各种我们所需要的资料,所以这次课程设计也培养了

16、我选用参考书,查阅手册及文献资料的能力。要完成一个课程设计的课题并不是一次就能编译成功的,中间会出现很多的大问题小问题,改错是个很繁琐的问题。通过这次课程设计培养了我独立思考,深入研究,分析问题,解决问题的能力。在以后的学习过程中我将要注意以下几点:1、认真上好专业实验课,多在实践中锻炼自己。2、写程序的过程要考虑周到,严密。3、在做设计的时候要有信心,有耐心,切勿浮躁。4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。.实验二:统计数字专业: _软件工程 _ 班级: _软件 _

17、 姓名: _王_ 学号: _20100034完成日期: _2010/6/28_1. 【问题描述】某次科研调查时得到了n 个自然数,每个数均不超过1500000000( 1.5*109 )。已知不相同的数不超过 10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。2【设计需求及分析】( 1)设计要求原始数据保存在文件count.in中,文件包含n+1 行。第 1 行是整数 n(1=n=200000) ,表示自然数的个数;第2n+1 行每行一个自然数。结果保存在文件 count 的尾部,其中结果包含 m行( m为 n 个自然数中不相同数的个数),按照自然数

18、从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。(2) 设计思路首先必须有文件的打开和关闭语句,将文件的内容读取到数组a 中,然后对数组进行排列和对比,计数。最终输出数据和次数。并写入文件的尾部。A 为容纳数据的数组,fopen 为文件打开函数,fscanf为文件读取函数,然后进行冒泡排序。排序之后的内容由while设置条件,用if进行判断。在不等于时,中间嵌套了一个while循环,进行往后的排查。最后输出数据和次数。下面是关键步骤:FILE* fp=fopen(count.txt,a+);/用只读 / 的方式打开文件if(fp=NULL) printf

19、(无文件 );/若没有文件则返回1return -1; for(i=0;i9;i+) fscanf(fp,%d,&ai);/读取文件fscanf(fp,n); int j,t;for (i=1;i9;i+)for(j=0;jaj+1)/冒泡排序t=aj;aj=aj+1;aj+1=t;for(i=0;i9;i+) .count=1;if (ai!=ai+1)printf(%dt%dn,ai,count);fprintf(fp,%dt%dn,ai,ai);i+;对数字的循环查找和控制条件,if(ai = ai + 1)while(ai = ai + 1)count+;i+;( 3)输出输入格式输入

20、时,为竖行依此输入文件,且为数字。且为9 个以内的数字。输出时,分为两行,第一列为数据,第二列为次数。3.【设计功能的实现】#include int main() int a100;/创建容纳文件数据的数组int i;FILE* fp=fopen(count.txt,a+);/用只读 / 的方式打开文件if(fp=NULL) printf(无文件 );/若没有文件则返回1return -1; for(i=0;i9;i+) fscanf(fp,%d,&ai);/读取文件fscanf(fp,n); int j,t;for (i=1;i9;i+)for(j=0;jaj+1)/冒泡排序t=aj;aj=

21、aj+1;aj+1=t; printf(结果为: n 数据结果 n);int count;for(i=0;i9;i+) count=1;if(ai!=ai+1)printf(%dt%dn,ai,count);printf(fp,%dt%dn,ai,ai);i+;if(ai = ai + 1)while(ai = ai + 1)count+;.i+;printf(%dt%dn, ai, count);fprintf(fp,%dt%dn, ai, count);fclose(fp);/关闭文件return 0;4【实例测试及运行结果】5. 【心得体会】本次实验使我对于文件的打开和关闭语句有了更深的

22、理解。有打开必须有关闭。同时在这次的设计中,我学习到了用泛洪算法解决实际问题的基本思维和步骤。使我对算法的层次性更加清楚,更加加深了对算法的理解。.实验三送货专业: _软件工程 _ 班级: _软件姓名: _王 _ 学号: _20100034完成日期: _2010/6/26_1. 【问题描述】小明希望设计一个方案,从编号为 1 的交叉路口出发,每次必须沿街道去往街道另一端的路口,再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。输入数据格式输入的第一行包含两个整数 n, m(1 n 10, n-1 m20) ,表示交叉路口的数量和街道的数量,交叉路口从 1 到 n 标号。接下来 m

23、行,每行两个整数a, b ,表示和标号为a 的交叉路口和标号为b 的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。两个路口之间最多有一条街道。输出输出格式如果小明可以经过每条街道正好一次,则输出一行包含m+1个整数 p1, p 2, p 3, ., pm+1,表示小明经过的路口的顺序,相邻两个整数之间用一个空格分隔。如果有多种方案满足条件,则输出字典序最小的一种方案,即首先保证p1 最小, p1 最小的前提下再保证p2 最小,依此类推。如果不存在方案使得小明经过每条街道正好一次,则输出一个整数-1 。测试数据一输入:输出:451241341 21 31 42 43 4输出

24、说明: 城市的地图和小明的路径如下图所示。.测试数据二输入:输出:46-11 21 31 42 43 42 3输出说明: 城市的地图如下图所示,不存在满足条件的路径。2【问题分析】该算法使用欧拉回路, 对于欧拉图,从一个节点出发,从某个节点开始,然后查出一个从这个出发回到这个点的环路径。这种方法不保证每个边都被遍历。如果有某个点的边没有被遍历就让这个点为起点,这条边为起始边,把它和当前的环衔接上。 这样直至所有的边都被遍历。 这样,整个图就被连接到一起了。具体步骤 :1。如果此时与该点无相连的点,那么就加入路径中.2。如果该点有相连的点,那么就加入队列之中,遍历这些点,直到没有相连的点。3。处

25、理当前的点,删除走过的这条边,并在其相邻的点上进行同样的操作,并把删除的点加入到路径中去。4。这个其实是个递归过程。3【功能实现】#include #include #include #include #include #includeusingnamespace std;constintmaxn=10005;stack st;vector vecmaxn;bool mapmaxnmaxn;intvismaxn;intcpmaxn;intn,m;void pd( inta)cpa=1;vector:iterator it;for (it=veca.begin();it!=veca.end();

26、it+)if (!cp*it)pd(*it);void dfs(inta)vector:iterator it;.for (it=veca.begin();it!=veca.end();it+)if (!mapa*it)mapa*it=1;map*ita=1;dfs(*it);st.push(*it);void prt()st.push(1);while (!st.empty()/printf(%d ,st.top();intss=st.top();st.pop();printf(%d ,ss);intmain()intnum=0;/memset(cp,0,sizeof(cp);/memset

27、(vis,0,sizeof(vis);/memset(map,0,sizeof(map);for ( inti=0;imaxn;+i)cpi=visi=0;scanf(%d %d,&n,&m);inta,b;for ( inti=0;im;+i)scanf(%d %d,&a,&b);veca.push_back(b);vecb.push_back(a);visa+;visb+;intflag=0;.pd(1);for ( inti=1;i=n;+i)if (cpi=0)flag=1;elsebreak ;if (flag)printf(-1n);elsefor ( inti=1;i=n;+i)

28、sort(veci.begin(),veci.end();if (visi%2=1)+num;if (num=0|num=2)if (num=2)if (vis1%2=1)dfs(1);prt();elseprintf(-1n);elsedfs(1);prt();elseprintf(-1n);system( Pause );return0;.4 【实验结果】5【心得体会】通过这个实验,我掌握了欧拉回路的基本思想。明白了用欧拉算法解决实际问题的具体步骤。而且明白了用算法解决实际问题的思维方法。.实验 4. 消除类游戏专业: _软件工程 _ 班级: _软件姓名: _王_ 学号: _2010003

29、4完成日期: _2010/6/28_1【问题描述】消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n 行 m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。现在给你一个n 行 m列的棋盘 (1 n,m 30) ,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。请注意:一个棋子可能在某一行和某一列同时被消除。输入数据格式:输入的第一行包含两个整数n, m ,用空格分隔,分别表示棋盘的行数和列数。接下来n 行,每行 m个整数,用空格分隔,分别表示

30、每一个方格中的棋子的颜色。颜色使用1 至 9 编号。输出数据格式:输出 n 行,每行 m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。【测试数据】为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可避免每次运行程序时都要从键盘输入数据。测试数据一输入:输出:4 52230222312345043451423203232130004422244输出说明:棋盘中第4 列的 1 和第 4 行的 2 可以被消除,其他的方格中的棋子均保留。测试数据二.输入:输出:4 5223022231

31、2300003111123203232132200022333输出说明:棋盘中所有的1 以及最后一行的3 可以被同时消除,其他的方格中的棋子均保留。2【问题分析】3【功能实现】#includestdafx.h#include#includeusing namespace std;intmain()intm, n, i ,j;inttemp;cin n m;temp = m;m = n;n = temp;int* map =new intm * n;int* mark =new intm * n;int* tmap = map;int* tmark = mark;intdif = 0;/输入fo

32、r( i = 0 ; i m ; i+ )for (j = 0; j *(tmap + i * n + j);for(i = 0; i m; i+)for (j = 0; j n; j+)/横行if(tmap + 2 - map) % n != 0 | (tmap + 1 - map) % n != 0)if(*(tmap) = *(tmap + 1) & * (tmap + 1) = *(tmap + 2)dif = tmap - map;.*(tmark + dif) = 0;*(tmark + dif + 1) = 0;*(tmark + dif + 2) = 0;/ 竖列if(tmap

33、 + 2 * n - map m * n | tmap + n - map m * n)if(*(tmap) = *(tmap + n) & * (tmap + n) = *(tmap + 2 * n)dif = tmap - map;*(tmark + dif) = 0;*(tmark + dif + n) = 0;*(tmark + dif + 2 * n) = 0;tmap = map + (j+1) + i * n;/ 输出cout endl;tmap = map;for(i = 0; i m; i+)for (j = 0; j n; j+)if(* (tmark + i * n + j) = 0)*(tmap + i * n + j) = 0;for(i = 0; i m; i+)for (j = 0; j n; j+)cout *(tmap + i * n + j) ;cout endl;system(pause );return0;.4【实验结果】5【心得体会】在该实验中,我掌握了求相同行以及相同列的数字是否相同的计算方法。先采用排序然后将相同的消去,最终得到实验结果。.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!