C/C++ 编程代写
当前位置:以往案例 > >校园导游模拟程序的设计
2019-03-22

程序设计实训:校园导游模拟程序的设计

1) 问题描述:

设计一个校园导游程序,为来访的客人提供住处查询服务。

选取苦干(多于10个)个有代表性的景点抽象成一个无向带权图,以图中顶点表示校内景点,边上的权值表示两景点间的距离。

2) 具体功能要求:

按菜单项管理的主界面

菜单项及功能要求如下

1) 学校景点介绍:由一个子函数实现,输出学校全部景点的信息,包括景点编号、名称及简介。

2) 查看浏览路线:根据用户输入的起始景点编号,求出从该景点到其他景点的最短路径线路及距离,要求用DIJKSTRA算法完成。

3) 查询景点间最短路径:两个景点间的最短路径,要求用FLOYD算法完成。

4) 景点信息查询:根据用户输入的编号,输出其相关信息。

5) 更改基本信息:新增景点,删除边,重建图等。

6) 查询景点间可行路径:显示所有符合长度限制(如路径长度不大于5)的所有路径。(可选做)

7) 打印图

8) 退出

本附录中为程序运行时的效果说明。

实训报告格式及要求:

封面:

程序设计实训报告

(分组成员名单(姓名学号) 和分工)

内容:

一、 题目

校园导游程序 (3)

3) 问题描述:

设计一个校园导游程序,为来访的客人提供住处查询服务。

选取苦干(多于10个)个有代表性的景点抽象成一个无向带权图,以图中顶点表示校内景点,边上的权值表示两景点间的距离。

4) 具体功能要求:

按菜单项管理的主界面

菜单项及功能要求如下

9) 学校景点介绍:由一个子函数实现,输出学校全部景点的信息,包括景点编号、名称及简介。

10) 查看浏览路线:根据用户输入的起始景点编号,求出从该景点到其他景点的最短路径线路及距离,要求用DIJKSTRA算法完成。

11) 查询景点间最短路径:两个景点间的最短路径,要求用FLOYD算法完成。

12) 景点信息查询:根据用户输入的编号,输出其相关信息。

13) 更改基本信息:新增景点,删除边,重建图等。

14) 查询景点间可行路径:显示所有符合长度限制(如路径长度不大于5)的所有路径。(可选做)

15) 打印图

16) 退出

二、 需求分析

学校旅游成最近热门的话题,比如“清华大学”旅游,等等,让更多的同学,老师或者外校人员来本校访问,可以很容易的在学校参观等,为了让大家不会迷路,可以更轻松自如的对学校进行参观,故设计此小型学校导航系统。

三、 概要设计(存储结构设计,自定义函数介绍,系统框架图)

在查询景点间最短路径时运用了迪杰斯特算法,查询景点间所有路径则是运用了佛罗算法来实现的。定义了一个结构体作为一个存储信息的无向图。

typedef struct //景点信息存储

Status ViewInfo(int cost[MAXSIZE][MAXSIZE]) //景点路径长度

void floyed()/*floyed算法求两个景点的最短路径*/

void display(int i,int j)/* 打印两个景点的路径及最短距离 */

void DFS(int k,int v1,int t,int cost[MAXSIZE][MAXSIZE])

{//k为当前景点编号,v1为终点编号,t为当前已经找到的以k为终点的路径上景点的个数

Status Allpath(int cost[MAXSIZE][MAXSIZE],int v0,int v1) //两点间的所有路径

Status ShowAll(Graph p[MAXSIZE]) //显示所有信息

Status IntroduceView(Graph p[MAXSIZE]) //查询景点信息

Status DeleteView(Graph p[MAXSIZE],int cost[MAXSIZE][MAXSIZE])//删除景点,n为现有景点的个数

Status UpdateUiew(Graph p[MAXSIZE]) //更新景点信息

Status UpdatePath(int cost[MAXSIZE][MAXSIZE]) //更新道路

void main()

{/*主函数*/

四、 详细设计及测试结论(算法的设计,测试遇到的问题,原因及解决办法)

用到了迪杰斯特算法和佛罗算法对路径最短进行优化,其中还加入了深度优先算法。

遇到的问题:总是报错,可是又很难找到出错的地方。这是对整个结构和思路的不清晰,最后多处因为一些很小的细节,比如符号,还有函数变量等等。。

五、 总结

附录:程序详细清单及测试图例。

/*

问题描述:

设计一个校园导游程序,为来访的客人提供住处查询服务。

选取苦干(多于10个)个有代表性的景点抽象成一个无向带权图,以图中顶点表示校内景点,边上的权值表示两景点间的距离。

2)具体功能要求:

按菜单项管理的主界面

菜单项及功能要求如下

1)学校景点介绍:由一个子函数实现,输出学校全部景点的信息,包括景点编号、名称及简介。

2)查看浏览路线:根据用户输入的起始景点编号,求出从该景点到其他景点的最短路径线路及距离,要求用DIJKSTRA算法完成。

3)查询景点间最短路径:两个景点间的最短路径,要求用FLOYD算法完成。

4)景点信息查询:根据用户输入的编号,输出其相关信息。

5)更改基本信息:新增景点,删除边,重建图等。

6)查询景点间可行路径:显示所有符合长度限制(如路径长度不大于5)的所有路径。(可选做)

7)打印图

8)退出

*/

/*包含头文件*/

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

/*定义符号常量*/

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define MAXSIZE 50

#define INT_MAX 1000000

typedef int Status;

int cost[MAXSIZE][MAXSIZE];/* 边的值*/

int shortest[MAXSIZE][MAXSIZE];/* 两点间的最短距离*/

int path[MAXSIZE][MAXSIZE];/* 经过的景点*/

int T[MAXSIZE];

int n;

bool Visit[MAXSIZE];//访问标志数组

/*自定义函数原型说明*/

void introduce();

int shortestdistance();

void floyed();

void display(int i,int j);

typedef struct //景点信息存储

{

int  num;//景点编号

char name[40];//景点名称

char info[100];//景点信息

}Graph;

Status ViewInfo(int cost[MAXSIZE][MAXSIZE]) //景点路径长度

{

int i,j;

for(i=0;i<=MAXSIZE;i++) //给各景点之间的路径赋上最大值

{

for(j=0;j<=MAXSIZE;j++)

{

if(i==j)

cost[i][j]=0;

else

cost[i][j]=INT_MAX;


}

}

cost[1][2]=cost[2][1]=250;

cost[2][3]=cost[3][2]=160;

cost[2][4]=cost[4][2]=200;

cost[3][4]=cost[4][3]=110;

cost[1][4]=cost[4][1]=400;

cost[2][5]=cost[5][2]=300;

cost[5][10]=cost[10][5]=100;

cost[5][6]=cost[6][5]=260;

cost[6][7]=cost[7][6]=100;

cost[7][8]=cost[8][7]=360;

cost[7][9]=cost[9][7]=270;

cost[8][9]=cost[9][8]=450;

return OK;

}

void floyed()/*floyed算法求两个景点的最短路径*/

{

int i,j,k;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

{

shortest[i][j]=cost[i][j];

path[i][j]=0; //初始化

}

for(k=1;k<=n;k++)

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(shortest[i][j]>shortest[i][k]+shortest[k][j])


{/*path[][]记录从ij的最短路径上点j的前驱景点的序号*/

shortest[i][j]=shortest[i][k]+shortest[k][j];

path[i][j]=k;

path[j][i]=k;

}

}/*floyed*/

void display(int i,int j)/* 打印两个景点的路径及最短距离 */

{

int a,b;

a=i;

b=j;

printf("您要查询的两景点间最短路径是:\n\n");

if(shortest[i][j]!=INT_MAX)

{

if(i

{

printf("%d",b);

while(path[i][j]!=0)//i,j之间有最短路径时

{/* ij的路径上所有经过的景点按逆序打印出来*/

printf("<–%d",path[i][j]);

if(i

j=path[i][j];

else

i=path[j][i];

}

printf("<–%d",a);

printf("\n\n");

printf("(%d->%d)最短距离是:%d\n\n",a,b,shortest[a][b]);

}

else

{

printf("%d",a);

while(path[i][j]!=0)

{/* ij的路径上所有经过的景点按顺序打印出来*/

printf("–>%d",path[i][j]);

if(i

j=path[i][j];

else

i=path[j][i];

}

printf("–>%d",b);

printf("\n\n");

printf("(%d–>%d)最短距离是:%5d\n\n",a,b,shortest[a][b]);

}

}

else

printf("输入错误!不存在此路!\n\n");

printf("\n");

}/*display*/

int shortestdistance()

{/*要查找的两景点的最短距离*/

int i,j;

printf("请输入要查询的两个景点的编号并用','间隔):");

scanf("%d,%d",&i,&j);

if(i>n||i<=0||j>n||j<0)

{

printf("输入信息错误!\n\n");

printf(" 请输入要查询的两个景点的编号并用','间隔):\n");

scanf("%d,%d",&i,&j);

}

else

{

floyed();   /*floyed算法求两个景点的最短路径*/

display(i,j);   /* 打印两个景点的路径及最短距离 */

}

return 1;

}/*shortestdistance*/


在线提交订单