1、1孝感学院计算机与信息科学学院09级数据结构课程设计报告题目:GPS 导航系统简洁版班级: 0917142学号:091714208姓名:付园园指导老师:李志敏2首页GPS 导航系统简洁版课题:GPS 导航系统与图的应用设计:计科学院 软件工程 091714208 付园园指导老师:李志敏运用原理:图的存储与寻最短路径描述语言:c 程序设计语言实现功能:详见功能介绍3目录:目的与要求 .5设计及实现要点 .6程序设计的基本结构: .6功能介绍: .9改进创新: .9期间遇到的问题,解决方案,总结: .9漏洞发现与解决 txt: 10源程序: .10功能测试与调试: .26功能测试 1 26功能测试
2、 2 28功能测试 3 28功能测试 3 29功能测试 4 30功能测试 5: 30功能测试 6: 31功能测试 7: 32功能测试 8: 33功能测试 9 34功能测试 10 35功能测试 11 36功能测试 12 37功能测试 13 38功能测试 14 39结后语 .454目的与要求目的: 1:掌握图结构的存储 运用 Floyd 算法的实现寻最短路径;2:理解运用图结构解决问题的思想;3:运用功能函数实现寻找最短路径的方法;要求 (1)基本要求: 利用 C 语言面向过程的编程思想来完成系统的设计; 1. 突出 C 语言的函数特征,以多个函数实现每一个子功能; 2画出功能模块图; 3.进行简
3、单界面设计,能够实现友好的交互; 4. 具有清晰的程序流程图和数据结构的详细定义; 55设计及实现要点程序设计的基本结构:GPS 导 航 系 统管 理 员 端(密 码) 用 户 端修改矩阵查看矩阵返回登录寻最短距离路径寻最少花费路径寻最短时间路径返回登录新建存储Floyd 算法 邻接矩阵存储 图的优先及深度遍历 寻最短路径6数据结构设计#define GRAPHMAX 20#define MAX 100#define FALSE 0#define TRUE 1#define QueueSize 30typedef structchar nameMAX;arcell;typedef struct
4、 arcell vexsGRAPHMAX;int edgesGRAPHMAXGRAPHMAX;int edgestimeGRAPHMAXGRAPHMAX;int edgescostGRAPHMAXGRAPHMAX;int n,e; MGraph;int shortestGRAPHMAXGRAPHMAX;int costGRAPHMAXGRAPHMAX;int pathGRAPHMAXGRAPHMAX;int visited10;7主体函数及说明:void biaotu(MGraph *G).显示表格以便用户选择使用;void CreateMGraph(MGraph *G)创建图的邻接矩阵存储;
5、int display( MGraph *G,int i,int j)显示最短路径所经的站点void floyed(MGraph *G) Floyd 算法实现void juzhengvision(MGraph* G).矩阵存储,以便调试查看void leastcost(MGraph *G).寻最少花费的路径void leasttime(MGraph *G).寻最短时间的路径void locatetosave1(MGraph *G,int i,int j).进行矩阵准确定位以便存储void locatetosave2(MGraph *G,int i,int j) .进行矩阵准确定位以便存储voi
6、d locatetosave3(MGraph *G,int i,int j) .进行矩阵准确定位以便存储void pathvision(MGraph *G)路径展示void shortestdistance(MGraph *G )核心算法与功能8功能介绍:图的存储和遍历 1-更新邻接矩阵 2-深度优先遍历 0-返回上一界面 printf(“n *“)【查 询 最 短 路 线 (1 号键) 】 用户端 【查 询 最 短 时 间 (2 号键) 】 【查 询 最 少 花 费 (3 号键 )】 【退 出 系 统 (0 号键) 】 printf(“n *“)printf(“t*新建(1 号键) 查看(2
7、 号键)*n“);管理员端 printf(“t*删除(3 号键) 修改(4 号键)*n“);printf(“t* 退出(0 号键) *n“); 改进创新:期间遇到的问题,解决方案,总结:9漏洞发现与解决 txt:针对以上遇到的问题或者功能的不完善,在后期的强化过程中都得到解决,虽然不是超级完美但依旧是一种进步;经历这么一个过程后,对 c 语言确实有了新的认识和提高!源程序:# include # include # include # include #define GRAPHMAX 20#define MAX 100#define FALSE 0#define TRUE 1#define Q
8、ueueSize 30typedef structchar nameMAX;arcell;typedef struct arcell vexsGRAPHMAX;int edgesGRAPHMAXGRAPHMAX;int edgestimeGRAPHMAXGRAPHMAX;int edgescostGRAPHMAXGRAPHMAX;int n,e; MGraph;int shortestGRAPHMAXGRAPHMAX;int costGRAPHMAXGRAPHMAX;int pathGRAPHMAXGRAPHMAX;int visited10;10void locatetosave1(MGra
9、ph *G,int i,int j)/.准确定位存储距离int m=0,n=0;for(m=1;mn;m+)if(m=i)for(n=1;nn;n+)if(n=j)scanf(“%d“,void locatetosave2(MGraph *G,int i,int j)/准确定位存储时间int m=0,n=0;for(m=1;mn;m+)if(m=i)for(n=1;nn;n+)if(n=j)scanf(“%d“,void locatetosave3(MGraph *G,int i,int j)/准确定位存储花费int m=0,n=0;for(m=1;mn;m+)if(m=i)for(n=1;n
10、n;n+)if(n=j)scanf(“%d“, void CreateMGraph(MGraph *G)int i=0,j=0,k;11printf(“n 【请 输 入 模 拟 导 航 图 的 城 市 数 并 按 回 车 :】“);scanf(“%d“, printf(“n 【请 输 入 模 拟 导 航 图 的 边 数 并 按 回 车 :】“);scanf(“%d“, /输入定点数,边数for(i=1;in;i+) system(“cls“);/输入顶点printf(“ntt 请输入第%d 个城市名称并按回车 :“,i);scanf(“%s“,for(i=1;in;i+)for(j=1;jn;
11、j+)G-edgestimeij=MAX;G-edgescostij=MAX;G-edgesij=MAX;for(k=1;ke;k+) printf(“n 请 输 入 第 %d 条 边 的 城 市 代 号 ( 格 式 如 : 1 , 3 ):“,k);printf(“n 请 输 入 起 点 城 市 代 号 (1-%d 内) “,G-n); scanf(“%d“,/连用要在一起if(iG-n)printf(“请重新输入:n“);scanf(“%d“,printf(“n 请 输 入 终 点 城 市 代 号 (1-%d 内) “,G-n);scanf(“%d“,if(jG-n)printf(“请重新
12、输入:n“);scanf(“%d“,printf(“n 请 输 入 第 %d 条 边 %d-%d 之 间 距 离: “,k,i,j);locatetosave1(G,i,j);/ 需要一个定位函数。否则不能准确存值printf(“n 请 输 入 %d-%d 所 需 的 时 间 :“,i,j);locatetosave2(G,i,j);printf(“n 请 输 入 %d-%d 所 需 的 费 用 :“,i,j);locatetosave3(G,i,j);12/.如何解决不能连续输入这个问题.getchar() 接受任意字符for(i=1;in;i+)G-edgesii=0;G-edgestim
13、eii=0;G-edgescostii=0;for(i=1;in;i+)for(j=1;jn;j+)G-edgesji=G-edgesij;G-edgestimeji=G-edgestimeij;G-edgescostji=G-edgescostij;/.实现互补.floyed 算法前必不可少的更正!/cost 数组的 赋值./*void DFSM(MGraph *G,int i) int j;printf(“n 深度优先遍历序列:%cn“,G-vexsi);visitedi=FALSE;printf(“ DFSM n“);for(j=1;jn;j+)if(G-edgesij=1void DF
14、STraverseM(MGraph *G) /深度优先遍历 int i;for(i=1;in;i+)visitedi=FALSE;printf(“ DFST n“);for(i=1;in;i+)if(!visitedi)DFSM(G,i);*/void wait()13int i=200000000;while(i)i-;/.时间延长 以达到动态效果.void biaotu(MGraph *G)int count;for(int i=1;in;i+)count+;if(count%3=0)printf(“n“);printf(“n%10s(%d)“,G-vexsi.name,i);void f
15、loyed(MGraph *G) / flyed 算法 最短路径求解的核心算法int i,j,k;for(i=1;in;i+)for(j=1;jn;j+)shortestij=costij;pathij=22;/path赋初值 22 表示无路径for(k=1;kn;k+)for(i=1;in;i+)for(j=1;jn;j+)if(shortestij(shortestik+shortestkj)shortestij=shortestik+shortestkj;pathij=k;pathji=k;void pathvision(MGraph *G)14int i,j;printf(“ path
16、 的存值与路径关联 :n“);for(i=1;in;i+)printf(“n“);for(j=1;jn;j+)printf(“%5d“,pathij);int display( MGraph *G,int i,int j)/ int a,b;int p20,count=0; /p存储最短距离上的点,count 来计数a=i;b=j;if(shortestij!=MAX)if(i=1;count-)printf(“%5s“,G-vexspcount.name);printf(“%5s“,G-vexsb.name);elseprintf(“%5s“,G-vexsa.name);while(path
17、ij!=22)printf(“%5s“,G-vexspathij.name);if(ivexsb.name);/return shortestab;elseprintf(“sorry ! 不存在此路径n“);return NULL;void leastcost(MGraph *G) int i,j;for(int m=1;mn;m+)for(int n=1;nn;n+)costmn=G-edgescostmn;printf(“该导航图的矩阵表示为:n“);for(int k=1;kn;k+)printf(“n“);for(int b=1;bn;b+)printf(“%5d“,costkb);/
18、此处需要一个图像显示函数,以供用户选择!biaotu(G);printf(“nn 请输入要查询两个城市 的起点城市编号:【 】“);scanf(“%d“,/连用要在一起if(i0else printf(“nn 请重新输入要查询两个城市 的起点城市:“);/.起点 与终点城市 不能相同 !16scanf(“%d“, printf(“nn 请输入要查询两个城市 的终点城市: 【 】“);scanf(“%d“,if(j0else printf(“nn 请重新输入要查询两个城市 的终点城市:“);/.起点 与终点城市 不能相同 !scanf(“%d“, printf(“n 您所要查询的城市是:%s -
19、 %s “,G-vexsi.name,G-vexsj.name);floyed(G);int y= display( G,i,j);/.printf(“nn 城市%s(%d)-%s(%d)的最少花费是:%d“,G-vexsi.name,i,G-vexsj.name,j,y);void leasttime(MGraph *G) int i,j;for(int m=1;mn;m+)for(int n=1;nn;n+)costmn=G-edgestimemn;printf(“该导航图的矩阵表示为:n“);for(int k=1;kn;k+)printf(“n“);for(int b=1;bn;b+)
20、printf(“%5d“,costkb);/此处需要一个图像显示函数,以供用户选择!biaotu(G);printf(“nn 请输入要查询两个城市 的起点城市编号:【 】“);17scanf(“%d“,/连用要在一起if(i0else printf(“nn 请重新输入要查询两个城市 的起点城市:“);scanf(“%d“, printf(“nn 请输入要查询两个城市 的终点城市: 【 】“);scanf(“%d“,if(j0else printf(“nn 请重新输入要查询两个城市 的终点城市:“);/.起点 与终点城市 不能相同 !scanf(“%d“, printf(“n 您所要查询的城市是
21、:%s - %s “,G-vexsi.name,G-vexsj.name);floyed(G);int y= display( G,i,j);/.printf(“nn 城市%s(%d)-%s(%d)的最短距离是:%d“,G-vexsi.name,i,G-vexsj.name,j,y);void juzhengvision(MGraph* G)/ 查看各个矩阵存储情况 以便调试int i,j;printf(“n 路径长度存储矩阵!n“);for(i=1;in;i+)printf(“ntt“);for(j=1;jn;j+)printf(“%5d“,G-edgesij);18printf(“n 旅途
22、花费存储矩阵!n“);for(i=1;in;i+)printf(“ntt“);for(j=1;jn;j+)printf(“%5d“,G-edgescostij);printf(“n 时间花费存储矩阵!n“);for(i=1;in;i+)printf(“ntt“);for(j=1;jn;j+)printf(“%5d“,G-edgestimeij);pathvision(G);void shortestdistance(MGraph *G ) int i,j;for(int m=1;mn;m+)for(int n=1;nn;n+)costmn=G-edgesmn;printf(“该导航图的矩阵表示
23、为:n“);for(int k=1;kn;k+)printf(“n“);for(int b=1;bn;b+)printf(“%5d“,costkb);/此处需要一个图像显示函数,以供用户选择!biaotu(G);printf(“nn 请输入要查询两个城市 的起点城市编号:【 】“);scanf(“%d“,/连用要在一起if(i019else printf(“nn 请重新输入要查询两个城市 的起点城市:“);/.起点 与终点城市 不能相同 !scanf(“%d“, printf(“nn 请输入要查询两个城市 的终点城市: 【 】“);scanf(“%d“,if(j0else printf(“nn
24、 请重新输入要查询两个城市 的终点城市:“);/.起点 与终点城市 不能相同 !scanf(“%d“, printf(“n 您所要查询的城市是:%s - %s n“,G-vexsi.name,G-vexsj.name);floyed(G);int y= display( G,i,j);/.printf(“nn 城市%s(%d)-%s(%d)的最短距离是:%dn“,G-vexsi.name,i,G-vexsj.name,j,y);void filesave(MGraph *G)FILE *fp;fp=fopen(“a.txt“,“w“);if(fp=fopen(“a.txt“,“wb+“)=NU
25、LL)printf(“无法打开文件!n“);for(int i=1;in;i+) fprintf(fp,“%3s“,fclose(fp);void fileoutput(MGraph *G)20void wait1()printf(“nt【十秒钟后自动返回!】 】n“); wait();wait();wait();wait();wait();wait();wait();wait();int main (void)MGraph *G,a;G=printf(“tt*nn“);wait();printf(“tt|*|nn“);wait();printf(“tt| |nn“);wait();print
26、f(“tt| 091714208 付园园【GPS 导航系统】 |nn“);wait();printf(“tt| |nn“);wait();printf(“tt| |nn“);wait();printf(“tt|*|nn“);wait();printf(“tt*n“);wait();wait();system(“cls“);printf(“tt*nn“);wait();printf(“tt|nn“);wait();printf(“tt| |nn“);wait();printf(“tt| 欢迎进入 GPS 导航系统 |nn“);wait();printf(“tt| |nn“);wait();pri
27、ntf(“tt|-|nn“);wait();printf(“tt*n“);wait();system(“cls“);char ch1;int ch2;printf(“nn |自 动 建 立 导 航 图 邻 接 矩 阵 表 示 |n“);wait();wait(); system(“cls“);CreateMGraph(G);printf(“导 航 图 的 邻 接 矩 阵 建 立 完 毕 n“);ch1=y;while(ch1=y|ch1=Y)21printf(“n“);printf(“n 图的存储和遍历 “);printf(“n *“);printf(“n * 1-更新邻接矩阵 *“);pri
28、ntf(“n * 2-深度优先遍历 *“);printf(“n * 0-返回上一界面 *“);printf(“n *“);printf(“n 请选择菜单号(0-3):“);scanf(“%d“,getchar();switch(ch2)case 1:system(“cls“);CreateMGraph(G);printf(“已建立导航图的邻接矩阵存储n“);break;case 2: ;break;case 0:ch1=n;break;default:printf(“n 输出错误!请重新输入!“); system(“cls“);printf(“tt*nn“);printf(“tt| 【欢迎进入
29、 GPS 导航系统】 |nn“);printf(“tt| 【请选择您所登录的界面】 |nn“);printf(“tt*n“);printf(“ntt 普通用户请按 1 ,管理员请按 2,退出请按 0nn“);int choice1,choice2,choice3 ;doscanf(“%d“,if(choice12|choice1*n“);printf(“t* 【查 询 最 短 路 线 (1 号键)】 *n“);printf(“t* 【查 询 最 短 时 间 (2 号键)】 *n“);printf(“t* 【查 询 最 少 花 费 (3 号键)】 *n“);printf(“t* 【退 出 系 统
30、 (0 号键) 】 *n“);printf(“t*n“);printf(“nn 请输入您所要选择的功能:n“);scanf(“%d“,switch(choice3)case 0: ;break;case 1:system(“cls“);shortestdistance(G);wait1(); break;case 2:system(“cls“);leasttime(G);wait1();break;case 3:system(“cls“);leastcost(G);wait1();break;default: printf(“输入错误!请重新输入!“);break; wait();wait()
31、;wait();while(choice3!=0);printf(“tt*nn“);printf(“tt| 欢迎进入 GPS 导航系统 |nn“);printf(“tt| 请选择您所登录的界面 |nn“);printf(“tt*n“);printf(“ntt 普通用户请按 1 ,管理员请按 2,退出请按 0nn“);break;/*接 case 1*/case 2:/*.管理员端接口*/printf(“tt_n“);printf(“tt| 欢迎进入 GPS 导航管理员端! |nn“);printf(“tt| 请输入管理员登录密码(初始密码 123) |n“);printf(“tt_n“);in
32、t password ;scanf(“%d“,if(password=123)do printf(“t*n“);printf(“t*新建(1 号键) 查看(2 号键)*n“);printf(“t*删除(3 号键) 修改(4 号键)*n“);23printf(“t* 退出(0 号键) *n“);printf(“t*n“);printf(“nn 请输入您所要选择的功能:n“);scanf(“%d“,switch(choice2)case 0:filesave(G) ; break;case 1: CreateMGraph(G); break;case 2: system(“cls“);juzhen
33、gvision(G); break;case 3:CreateMGraph(G); break;case 4:CreateMGraph(G); break;default: printf(“输入错误!请重新输入!“); break; while(choice2!=0);system(“cls“);printf(“tt*nn“);printf(“tt| 欢迎进入 GPS 导航系统 |nn“);printf(“tt| 请选择您所登录的界面 |nn“);printf(“tt*n“);printf(“ntt 普通用户请按 1 ,管理员请按 2,退出请按 0nn“);else /*密码输入错误处理机制*
34、/printf(“请重新输入密码:“);scanf(“%d“,if(password=123)system(“cls“);do /system(“cls“); /*.正式进入导航系统管理员端.*/printf(“t*n“);printf(“t*新建(1 号键) 查看(2 号键)*n“);printf(“t*删除(3 号键) 修改(4 号键)*n“);printf(“t* 退出(0 号键) *n“);printf(“t*n“);printf(“nn 请输入您所要选择的功能:n“);scanf(“%d“,switch(choice2)case 0:filesave(G); break;case 1
35、: CreateMGraph(G); break;case 2: system(“cls“);juzhengvision(G); break;24case 3:CreateMGraph(G); break;case 4:CreateMGraph(G); break;default: printf(“输入错误!请重新输入!“); break; while(choice2!=0);system(“cls“);printf(“tt*nn“);printf(“tt| 欢迎进入 GPS 导航系统 |nn“);printf(“tt| 请选择您所登录的界面 |nn“);printf(“tt*n“);printf(“ntt 普通用户请按 1 ,管理员请按 2,退出请按 0nn“);/*else 语句完*/; /*case2 完 .*/break;/*switch*/default: printf(“ nnnttt 警告: 登陆错误!nnn“);break;/*大 switch 完!*/ while(choice1=2|choice1=1);return 0;/ main 函数完!25功能测试与调试:功能测试 1滚动式进入页面:2627功能测试 2自动进行导航图矩阵存储:28功能测试 3存储信息:29功能测试 4功能测试 5:信息详细存储:30功能测试 6:图结构的构建完成: