数据结构课程设计校园导游系统

上传人:1888****888 文档编号:37532713 上传时间:2021-11-03 格式:DOC 页数:16 大小:407KB
返回 下载 相关 举报
数据结构课程设计校园导游系统_第1页
第1页 / 共16页
数据结构课程设计校园导游系统_第2页
第2页 / 共16页
数据结构课程设计校园导游系统_第3页
第3页 / 共16页
点击查看更多>>
资源描述
1. 设计目的 设计一个学校的导游系统,方便游客游览我们学校。二. 设计内容为来访的客人提供各种信息查询服务。主要包括:查看学校的全景图各个景点的简介学校主要景点的分布查看某一景点到其它所有景点的最短路径查询任意两个景点之间的最短路径。三概要设计1功能模块图;mainIniGraphbrowserShortestpath_dijserchmapprimprintmenucmd2功能模块详细介绍;(1)main: 主函数(2) browser:(3) IniGraph:初始化学校地图,给出景点的详细信息,以及景点之间的距离。(4) Shortestpath_dij:迪杰斯特拉算法,用于求两个景点之间的最短路径。(5) serch:供游客查询单个景点的详细信息(6) prim:普利姆算法,用于得出最佳布网方案。(7) map:无参函数,打印学校的全景图。(8) menu:游客的输入界面。(9) print:打印相应的游览路线。(10) cmd:输入相应的选择进行不同的游览方式。四详细设计search1功能函数的调用关系图primShortestpath_dijCmdMainprintbrowseriniGraphmenumap2各功能函数的数据流程图无参函数,打印平面图map图存在且非空打印路线,文件存储输入起止点标号,非法则提示再次输入Prim输入起点编号,非法提示,再次输入图存在且非空Dij依次输入,到各个景点最短距离,文件存储无参函数,菜单栏Menu无向网初始化,得到景点距离,以及信息InitGraph打印景点信息图存在且非空BrowserFor循环控制结点数目,并打印。图存在且非空Print3重点设计及编码创建结构体,表示景点,成员为编号,名称,简介typedef struct /图中顶点表示主要景点,存放景点的编号、名称、简介等信息,char name30;int num;char introduction100;/简介infotype;Prim算法:void prim(MGraph *G)FILE *fp;fp=fopen(D:sight.txt,at+);if(fp=NULL)printf(fail to open!n);elseint v,u,i,w,k,j,flag=1,p101010,D1010; for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) Dvw=G-arcsvw.adj; for(u=0;uvexnum;u+) pvwu=0; if(DvwINFINITY) pvwv=1;pvww=1; for(u=0;uvexnum;u+) for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) if(Dvu+DuwDvw) Dvw=Dvu+Duw; for(i=0;ivexnum;i+) pvwi=pvui|puwi; while(flag) printf(请输入出发点和目的地的编号:); scanf(%d%d,&k,&j); if(kG-vexnum|jG-vexnum) printf(景点编号不存在!请重新输入出发点和目的地的编号:); scanf(%d%d,&k,&j); if(k=0&kvexnum&j=0&jvexnum) flag=0; fprintf(fp,%s,G-vexsk.name); for(u=0;uvexnum;u+) if(pkju&k!=u&j!=u) fprintf(fp,-%s,G-vexsu.name); fprintf(fp,-%s,G-vexsj.name); fprintf(fp, 总路线长%dmn,Dkj);fclose(fp);迪杰斯特拉算法:void ShortestPath_DIJ(MGraph * G)FILE *fp;fp=fopen(D:approach.txt,at+);if(fp=NULL)printf(Fail to open!n);elseint v,w,i,min,t=0,x,flag=1,v0; int final20, D20, p2020;while(flag)printf(请输入一个起始景点编号:);scanf(%d,&v0);if(v0G-vexnum)printf(景点编号不存在!请重新输入景点编号:);scanf(%d,&v0);if(v0=0&v0vexnum)flag=0;/endwhilefor(v=0;vvexnum;v+)finalv=0;Dv=G-arcsv0v.adj;for(w=0;wvexnum;w+)pvw=0;if(DvINFINITY)pvv0=1;pvv=1;Dv0=0;finalv0=1;for(i=1;ivexnum;i+)min=INFINITY;for(w=0;wvexnum;w+)if(!finalw)if(Dwmin)v=w;min=Dw;finalv=1;for(w=0;wvexnum;w+)if(!finalw&(min+G-arcsvw.adjarcsvw.adj;for(x=0;xvexnum;x+) pwx=pvx;pww=1;for(v=0;vvexnum;v+)if(v0!=v)fprintf(fp,%s,G-vexsv0.name);for(w=0;wvexnum;w+)if(pvw&w!=v0) fprintf(fp,-%s,G-vexsw.name); t+; if(tG-vexnum-1&v0!=v) fprintf(fp, 总路线长%dmnn,Dv); /endfor/endif/ShortestPath_DIJ end五测试数据及运行结果1 正常测试数据和运行结果2异常测试数据及运行结果六调试情况,设计技巧及体会1改进方案对于我的设计,合理之处是对每一次查询都以文件的形式进行了存储,其次,校园的平面图比较好的展现了我们学校的风貌。不足之处是使用prim算法的时候,若终点输入不合法,程序会陷入,死循环。这是致命的错误,我的改进方法是若输入字符不合法,则跳出循环,再次输入,直到合法为止。利用迪杰斯特拉算法在计算到剩下的顶点的最短距离时第一个for循环时时间复杂度是O(n),每进行一次第二个for循环的时间复杂度都是O(n),第三个for循环也就是存储途经顶点时用的循环而不是书中算法所用的只是个地址的赋值,所以时间复杂度也是O(n),这样总的时间复杂度就是O(n3)。改进设想主要就是给用户一个浏览路线的推荐本来在程序设计初期是计划要实现这个功能的,但是由于时间和能力问题没有去实现,因为它涉及到汉密尔顿路的实现,目前感觉还比较复杂所以暂时放弃了,日后如果有机会一定将这个功能完善。2体会调试过程中难免会遇见这样或者那样的问题,一个很低级的错误就是在字符串的赋值上居然还会出错,本来是不可以像int型数据那样直接用等于号赋值的,可是刚开始由于失误却犯了这样低级的错误结果导致出现102个错误,当时确实有点慌了,等冷静下来一想才把问题想明白,字符串的赋值必须用strcpy函数。看来基本功还是相当的重要的。此外,迪杰斯特拉算法其实放在这里多少有些不合适,因为不管在求任意两个景点之间的最短路径还是求某一景点到其它景点的最短路径时都要完全的执行一遍算法时间复杂度是很高的,当时在实现时也确实考虑到了这个问题只是后来感觉要是实现时间复杂度的降低不是很简单也就暂时放弃了,也就选择了将这个算法直接搬了过来,这里是一点败笔,尚需要改进。七参考文献数据结构 严蔚敏 吴为民C语言程序设计(第三版) 谭浩强 八附录:源代码(电子版)#define INFINITY 10000 /*无穷大*/#define MAX_VERTEX_NUM 40#define MAX 40#include#include#include#includetypedef struct ArCellint adj; /路径长度ArCell,AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedef struct /图中顶点表示主要景点,存放景点的编号、名称、简介等信息,char name30;int num;char introduction100;/简介infotype;typedef structinfotype vexsMAX_VERTEX_NUM;AdjMatrix arcs;int vexnum,arcnum;MGraph;MGraph b;void cmd(void);MGraph InitGraph(void);void Menu(void);void Browser(MGraph *G);void ShortestPath_DIJ(MGraph * G);void Prim(MGraph *G);void Search(MGraph *G);int LocateVex(MGraph *G,char* v);MGraph * CreatUDN(MGraph *G);void print(MGraph *G);void map();/*/void main(void) system(mode con: cols=100 lines=30); cmd();/*/void cmd(void) int i; b=InitGraph(); Menu(); scanf(%d,&i); while(i!=6) switch(i) case 1:Browser(&b);Menu();break; case 2:map();Menu();break; case 3:ShortestPath_DIJ(&b);Menu();break; case 4:Floyd(&b);Menu();break; case 5:Search(&b);Menu();break; case 6:exit(1);break; default:break; scanf(%d,&i); MGraph InitGraph(void) MGraph G; int i,j; G.vexnum=10; G.arcnum=14; for(i=0;iG.vexnum;i+) G.vexsi.num=i; strcpy(G.vexs0.name,旭日苑); strcpy(G.vexs0.introduction,难吃,洗过的筷子上面都是菜叶子); strcpy(G.vexs1.name,校医院); strcpy(G.vexs1.introduction,校医院,名副其实的校(shou)医(yi)院(yuan); strcpy(G.vexs2.name,大学生活动中心); strcpy(G.vexs2.introduction,又名大活,举办一些没什么卵用的晚会); strcpy(G.vexs3.name,美食广场); strcpy(G.vexs3.introduction,吃货的天堂,完爆旭日苑); strcpy(G.vexs4.name,图书馆); strcpy(G.vexs4.introduction,Warning!学霸出没!); strcpy(G.vexs5.name,足球场); strcpy(G.vexs5.introduction,国足的未来.23333333); strcpy(G.vexs6.name,水煮鸽子); strcpy(G.vexs6.introduction,然而他并不能吃); strcpy(G.vexs7.name,东区教学楼); strcpy(G.vexs7.introduction,又名尼伯龙根,进去就不要想出来); strcpy(G.vexs8.name,狗男女湖); strcpy(G.vexs8.introduction,湖边时常回荡着单身狗的哀嚎); strcpy(G.vexs9.name,澡堂); strcpy(G.vexs9.introduction,洗个澡,压压惊); for(i=0;iG.vexnum;i+) for(j=0;jG.vexnum;j+) G.arcsij.adj=INFINITY; G.arcs01.adj=100; G.arcs02.adj=200; G.arcs06.adj=400; G.arcs17.adj=300; G.arcs23.adj=120; G.arcs36.adj=220; G.arcs34.adj=100; G.arcs45.adj=300; G.arcs49.adj=250; G.arcs59.adj=350; G.arcs67.adj=60; G.arcs69.adj=200; G.arcs78.adj=50; G.arcs89.adj=20; for(i=0;iG.vexnum;i+) for(j=0;jG.vexnum;j+) G.arcsji.adj=G.arcsij.adj; return G;/InitGraph endvoid Menu() printf(n 西安邮(mei)电(dian)大学n); printf( n); printf( 1.校园景点介绍 n); printf( 2.校园平面图 n); printf( 3.查看所有游览路线(jiandan) n); printf( 4.选择出发点和目的地(zuiduan) n); printf( 5.查看景点信息 n); printf( 6.退出系统 n); printf( n); printf(Option-:);void Browser(MGraph *G) int v; printf(n); printf(编号景点名称 简介 n); for(v=0;vvexnum;v+) printf(%-4d%-16s%-56sn,G-vexsv.num,G-vexsv.name,G-vexsv.introduction); printf(n);/ 迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点void ShortestPath_DIJ(MGraph * G)FILE *fp;fp=fopen(D:approach.txt,at+);if(fp=NULL)printf(Fail to open!n);elseint v,w,i,min,t=0,x,flag=1,v0; int final20, D20, p2020;while(flag)printf(请输入一个起始景点编号:);scanf(%d,&v0);if(v0G-vexnum)printf(景点编号不存在!请重新输入景点编号:);scanf(%d,&v0);if(v0=0&v0vexnum)flag=0;/endwhilefor(v=0;vvexnum;v+)finalv=0;Dv=G-arcsv0v.adj;for(w=0;wvexnum;w+)pvw=0;if(DvINFINITY)pvv0=1;pvv=1;Dv0=0;finalv0=1;for(i=1;ivexnum;i+)min=INFINITY;for(w=0;wvexnum;w+)if(!finalw)if(Dwmin)v=w;min=Dw;finalv=1;for(w=0;wvexnum;w+)if(!finalw&(min+G-arcsvw.adjarcsvw.adj;for(x=0;xvexnum;x+) pwx=pvx;pww=1;for(v=0;vvexnum;v+)if(v0!=v)fprintf(fp,%s,G-vexsv0.name);for(w=0;wvexnum;w+)if(pvw&w!=v0) fprintf(fp,-%s,G-vexsw.name); t+; if(tG-vexnum-1&v0!=v) fprintf(fp, 总路线长%dmnn,Dv); /endfor/endifprintf(请稍候.n);printf(文件已经成功地保存至D:/approach.txt!n);/ShortestPath_DIJ endvoid Search(MGraph *G) int k,flag=1; while(flag) printf(请输入要查询的景点编号:); scanf(%d,&k); if(kG-vexnum) printf(景点编号不存在!请重新输入景点编号:); scanf(%d,&k); if(k=0&kvexnum) flag=0; printf(n); printf(编号景点名称 简介 n); printf(%-4d%-16s%-56sn,G-vexsk.num,G-vexsk.name,G-vexsk.introduction); printf(n);/Search endint LocateVex(MGraph *G,char* v) int c=-1,i; for(i=0;ivexnum;i+) if(strcmp(v,G-vexsi.name)=0) c=i;break; return c;void print(MGraph *G)int v,w,t=0;for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) if(G-arcsvw.adj=INFINITY) printf( ); else printf(%-7d,G-arcsvw.adj); t+; if(t%G-vexnum=0) printf(n); void Prim(MGraph *G)FILE *fp;fp=fopen(D:sight.txt,at+);if(fp=NULL)printf(fail to open!n);elseint v,u,i,w,k,j,flag=1,p101010,D1010; for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) Dvw=G-arcsvw.adj; for(u=0;uvexnum;u+) pvwu=0; if(DvwINFINITY) pvwv=1;pvww=1; for(u=0;uvexnum;u+) for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) if(Dvu+DuwDvw) Dvw=Dvu+Duw; for(i=0;ivexnum;i+) pvwi=pvui|puwi; while(flag) printf(请输入出发点和目的地的编号:); scanf(%d%d,&k,&j); if(kG-vexnum|jG-vexnum) printf(景点编号不存在!请重新输入出发点和目的地的编号:); scanf(%d%d,&k,&j); if(k=0&kvexnum&j=0&jvexnum) flag=0; fprintf(fp,%s,G-vexsk.name); for(u=0;uvexnum;u+) if(pkju&k!=u&j!=u) fprintf(fp,-%s,G-vexsu.name); fprintf(fp,-%s,G-vexsj.name); fprintf(fp, 总路线长%dmn,Dkj);fclose(fp);printf(请稍候.n);printf(文件已经成功地保存至D:/sight.txt!n);void map()printf( 西安邮电大学平面图 );printf(n);printf( 水煮鸽子 );printf(n);printf( / | );printf(n);printf( / | 足球场 =);printf(n);printf( / 美食广场 | | );printf(n);printf( 旭日苑 | | | );printf(n);printf( | | | | );printf(n);printf( | | | | );printf(n);printf( | | | | );printf(n);printf( 校医院 | 大学生活动中心 | );printf(n);printf( | | | | );printf(n);printf( | | | | );printf(n); printf( | = = 图书馆 = 狗男女湖 | );printf(n); printf( | | | );printf(n);printf( | | | );printf(n);printf( | | | );printf(n);printf( | = 体育馆=|=澡堂 );printf(n);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸下载 > CAD图纸下载


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

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


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