1.强化上机动手能力,在理论和实践的基础上进一步巩固《数据结构》课程学习的内容,掌握工程化软件设计的基本方法;
2.掌握图的创建和应用;
3.掌握迪杰斯特拉以及Prim等基本算法思想;
4.掌握if语句及switch语句的运用方法及嵌套应用方法;
5.掌握C语言主函数和被调用函数之间的参数传递方式,学会函数的调用过程和方法;
6.掌握结构体类型变量的定义和使用;
7.掌握指针变量和指向指针的指针变量的定义及使用,进一步了解指向结构体的指针变量的概念及使用方法;
8.能够采用模块化思想调试程序;
9.学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力;
10.为后续各门计算机课程的学习打下坚实基础。
二. 设计内容
用C语言编写了《西邮校园导游咨询系统》,通过使用循环、条件、数组、结构体、函数、指针、等相关C语言知识学习编写较大的程序,结合数据结构中的算法思想实现一个导游咨询系统基本的功能。
三.概要设计
1.功能模块图;
2.各个模块详细的功能描述。
(1).浏览校园全景
可让用户浏览校园平面全景图,图上信息包括景点名称,路径长度,风景位置,ATM机位置等,一目了然。
(2). 查看景点信息
用户根据界面显示的校园景点信息表,输入要查询的景点名称,可以查看景点信息。
(3). 从一个景点到其他所有景点的最短距离
利用迪杰斯特拉算法,由用户输入要查询的景点编号,查询该景点到其余所有景点的最短路径,以及最短路径长度。
(4). 从某一景点出发的最短连通路线
利用Prim算法求最短连通图,也就是说,让用户输入起始的景点名称就可以查询由该景点出发的所有最短连通图。
(5). 用户输入出发点和目的地获取所有游览线路
利用图的深度遍历,调用递归的思想逐个遍历景点,找到由出发点到目的地的所有游览路线,并打印出来。
(6). 两个景点之间的最短距离
在菜单中通过switch语句进入排序功能,同样使用迪杰斯特拉算法求出图中两个节点之间的最短路径,这里由用户输入两个景点的名称就可查询两个景点之间的最短路径,以及路径长度。
(7). 修改景点信息,新西邮
在菜单中通过switch语句进入修改功能,输入要修改的景点信息数目以及要修改景点的序号,输入新的信息以及修改的路径,即修改成功,重新查询就可查询到新的景点信息。
(8). 西邮沿途风景,ATM机介绍新鲜资讯
在菜单中通过switch语句进入查询功能,改模块主要是方便用户了解西邮的推荐景点的位置以及常用的ATM机的位置,每天会更新“旭日苑”和“美食广场”推荐的美食,我觉得是个比较贴近生活的模块。
(9).安全退出
用exit(0)实现,退出导游系统;
(10).main 函数
通过主函数main()将各个模块结合起来,main()函数主要调用了menu()菜单。
四.详细设计
1.功能函数的调用关系图
2.各功能函数的数据流程图
录入信息模块
查找信息模块
两景点最短路径模块
两景点所有路径模块
一景点出发的最短连通路径模块
修改景点信息模块
3.重点设计及编码
//利用Dijkstra算法求得从起点景点到终点景点的最短路线
void Dijkstra(AdjMatrix *G,int start,int end,int dist[],int path[][MAX])
{
int mindist,i,j,k,t=1;
for(i=0;i { dist[i]=G->arcs[start][i]; if(G->arcs[start][i]!=INFINITY) path[i][1]=start; } path[start][0]=1; for(i=1;i { mindist=INFINITY; for(j=0;j if(!path[j][0]&&dist[j] k=j; mindist=dist[j]; } if(mindist==INFINITY) return; path[k][0]=1; for(j=0;j { if(!path[j][0]&&G->arcs[k][j] dist[j]=dist[k]+G->arcs[k][j]; t=1; while(path[k][t]!=0)//记录最新的最短路线 { path[j][t]=path[k][t]; t++; } path[j][t]=k; path[j][t+1]=0; } } } for(i=0;i<=G->vexnum;i++) if(i==end) break; printf("%s------>%s最短路线为:",G->vex[start].name,G->vex[end].name); for(j=1;path[i][j]!=0;j++) printf("%s",G->vex[path[i][j]].name); printf("->%s距离为%dm\\n",G->vex[end].name,dist[i]); } //寻找最短路线 void Shortroute(AdjMatrix *G) { char sight[MAX]; int start,end; int dist[MAX],path[MAX][MAX]={0}; system("cls"); menu1(); printf("请输入起始景点:"); scanf("%s",sight); start=Locate(G,sight); printf("请输入终止景点:"); scanf("%s",sight); end=Locate(G,sight); Dijkstra(G,start,end,dist,path); } //修改创建新的图 int Newgraph(AdjMatrix * G) { int changenum; //计数。用于记录要修改的对象的个数 int i,m,n,t,distance,v0,v1; system("cls"); menu1(); printf("\\n下面请输入你要修改的景点的个数:\n"); scanf("%d",&changenum); while(changenum<0||changenum>G->vexnum ) { printf("\\n输入错误!请重新输入"); scanf("%d",&changenum); } for(i=0;i printf("\\n请输入景点的编号:"); scanf("%d",&m); t=Locate2(G,m); printf("\\n请输入景点的名称:"); scanf("%s",&G->vex[t].name ); printf("\\n请输入景点的简介:"); scanf("%s",&G->vex[t].introduction ); } printf("\\n下面请输入你要更新的边数"); scanf("%d",&changenum); while(changenum<0||changenum>G->arcnum ) { printf("\\n输入错误!请重新输入"); scanf("%d",&changenum); } printf("\\n下面请输入更新边的信息:\n"); for(i=1;i<=changenum ;i++) { printf("\\n修改的第%d条边的起点序号 终点序号 长度为:",i); scanf("%d %d %d",&v0,&v1,&distance); m=Locate2(G,v0); n=Locate2(G,v1); if(m>=0&&n>=0) { G->arcs[m][n] =distance; G->arcs[n][m] =G->arcs[m][n] ; } } return 1; } //打印序号为m,n景点间的长度不超过8个景点的路径 void path(AdjMatrix *G, int m,int n,int k) { int s,x=0; int t=k+1; //t 记载路径上下一个中间顶点在d[]数组中的下标 if(d[k]==n && k<8) //d[k]存储路径顶点。若d[k]是终点n且景点个数<=8,则输出 { //递归出口,找到一条路径 for(s=0;s printf("%s",G->vex[d[s]].name); //输出最后一个景点名 printf("\\n\\n"); } else { s=0; while(s { if((G->arcs[d[k]][s] visited[s]=1; d[k+1]=s; //存储顶点编号s 至d[k+1]中 path(G,m,n,t); //打印出一条m至n的路径 visited[s]=0; } s++; //试探从下一个顶点 s 开始是否有到终点的路径 } } } //打印两景点间的景点个数不超过8的所有路径 int Allpath(AdjMatrix * G) { int k,m,n; char sight1[MAX]; char sight2[MAX]; system("cls"); menu1(); printf("\\n\\n请输入你要查询的两个景点名称:\\n\\n"); scanf("%s%s",sight1,sight2); printf("\\n\\n"); m=Locate(G,sight1); //确定该顶点是否存在。若存在,返回该顶点编号 n=Locate(G,sight2); d[0]=m; //存储路径起点m (int d[]数组是全局变量) for(k=0;k visited[k]=0; visited[m]=1; //第m个顶点访问标志设置为1 path(G,m,n,0); //k=0,对应起点d[0]==m。k为d[]数组下标 return 1; } 五.测试数据及运行结果 1.正常测试数据和运行结果 2.异常测试数据及运行结果 六.调试情况,设计技巧及体会 1.改进方案 这次课程设计时间比较短,问题比较多,最大的问题就是求所有路径和最短路径,这个花了我很多时间,通过实践知道调试的时候可以多加一些printf()语句查错。另外自己再外观上通过调用DOS命令玩了很多花样比如说换背景颜色。需要改进的就是存储问题,我用的是初始化,这样修改不是很方便,我想如果有时间的话,我会改成文件存储,这样会更好,更方便。 2.体会 通过这次课程设计,我发现自己对图还很不熟,栈的运用也不是很娴熟,在这之前曾编过两个跟图有关的题,做这个的时候才不那么束手无策。发现其实程序要写得好,关键在于它的移植性,可以多次调用,代码才会简单。有些程序就是在我以前的程序上作了修改直接拿过来用的。通过这次课程设计发现自己连c语言的门都没入。C语言要学好并不是那么简单,光听老师讲就行了。有很多问题是在自己动手编的时候发现的。只有程序编得多,问题出来得多,自己才有经验,下次遇到才知道该怎么做,而不是一头雾水。自己做的系统太简陋了,无法运用不到实际生活中,与真正的系统相差甚远,实用性很差,界面也不好看。功能特不完善。对于数据结构来说,我们还只是菜鸟级别。以后要学的还有很多,踏踏实实地学好,以后才有出路。 学习的方式不是单一的,大学的学习要多提问,多寻找资源,这几天的学习,我发现共同学习,帮别人找错误都是很好的提升办法。总之,好好努力!! 七.参考文献 《c语言程序设计》 《数据结构》 八.附录: 源代码(电子版) 西 安 邮 电 大 学 (计算机学院) 数据结构设计报告 题 目:西邮校园导游咨询系统 专业名称:计算机科学与技术 班 级:计科1202班 学生姓名:苟凡 学号(8位):04121060 指导教师:曾艳 设计起止时间: 2013年12月9日—2013年12月13日下载本文