您的当前位置:首页正文

校园导游咨询

2022-09-02 来源:易榕旅网


一、 设计目的

C语言是一种计算机程序设计语言。它具有高级语言的特点,已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。作为一个工具,重要的就是能够解决现实中的问题。该题的目的就在于巩固所学的C语言的知识,通过一个具体的实际问题的场景,用C语言编译出程序,设计出自主导游系统。C语言具有强大的功能,当我们能够将现实中的问题转换成具体的物理模型的时候,将它转化成程序语言,此时就可将现实中的具体问题用计算机的方式来解出,此时就能解决问题。做设计的目的,锻炼我们的动手能力,将具体的模型抽象化成具体的数学问题。作为程序员,需要的就是动手的能力。实际编程对我们的思维也起到锻炼的作用。

二、设计内容

校园导游咨询

地点录入,地点查询,删除,修改

三、程序功能简介

(1)开发平台

Visual C++ 6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了 Visual

C++.NET(Visual C++7.0),但它的应用有很大的局限性,只适用于Windows 2000、Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。

特色

Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且

是一个基于Windows操作系统的可视化的集成开发环境。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft的主力软件产品。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。

Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功

能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。

缺点

由于C++是由C语言发展起来的,也支持C语言的编译。6.0版本是使用最多的版本,很经典。最大的缺点是对于模版的支持比较差。现在最新补丁为SP6,推荐安装,否则易出现编译时假死状态。仅支持Windows操作系统。目前发现与windows 7兼容性不好,安装成功后可能会出现无法打开cpp文件的现象。

(2)程序功能

该程序是校园导游咨询,即普通人可以通过该程序就可以了解学校的建筑物的特点及最好的路线。

即进入程序后,先看到该界面

通过这个界面了解湖南大学东方红广场附近的标志性建筑,了解它们的用途,之后进行相应的了解,当输入1,查询景点路径的时候,输入相应的信息,即起点和终点,这样就就会出现相应的距离和系统规定的路线经过的建筑物,输入2,再输入1,则可用编号查询建筑物的信息,输入2,则可用名称来查询建筑物的信息;输入3,则输出系统规定的最好的参观路线。这样设计,既可以分模块将东西叙述清楚,并且可以让使用者能够简单方便地使用该程序

四、本人完成的主要工作

(1)场景模拟,搜集资料

将现实中的湖南大学的具体建筑的信息录入,了解具体的功能,计算相应的景点之间的距离,规划处游览的路线。本程序选取的地点是湖南大学东方红广场附近的教学建筑

(2)设计程序

<1>构想出程序设计的第一界面,尽量简单明了,达到旅游咨询器的目的。直接将湖南大学的建筑物和名称显示出来,方便查询。在下面备可以查询的选项,根据选项进行操作。

<2>设计函数ShortestPath()进行函数的最小路程的计算

void ShortestPath(int num) { int v,w,i,t; int final[NUM]; int min;

for(v=0;vfinal[v]=0;

D[v]=G.arcs[num][v].adj; for(w=0;wP[v][num]=1; P[v][v]=1; } }

D[num]=0; final[num]=1;

for(i=0;imin=Max;

for(w=0;wfinal[v]=1;

for(w=0;wif(!final[w]&&((min+G.arcs[v][w].adj)D[w]=min+G.arcs[v][w].adj; for(t=0;t<3>设计函数output()输出最小距离

void output(int sight1,int sight2) {

int a,b,c,d,q=0; a=sight2; if(a!=sight1) {

printf(\"\\n\从%s到%s的最短路径是\.vex[sight1].sight,G.vex[sight2].sight); printf(\"\(最短距离为 %dm.)\\n\\n\\

printf(\"\%s\ d=sight1;

for(c=0;cif(G.arcs[d][b].adj<20000&&P[a][b]) {

printf(\"-->%s\ q=q+1; P[a][b]=0; d=b;

if(q%8==0) printf(\"\\n\"); goto gate; } } } } }

<4>设计函数search()来执行寻找景点

void search() { int num; int i; char c;

char name[20]; do {

system(\"cls\"); c=SearchMenu(); switch (c) { case '1': system(\"cls\"); narrate();

printf(\"\\n\\n\\请输入您要查找的景点编号:\"); scanf(\"%d\for(i=0;iif(num==G.vex[i].number) {

printf(\"\\n\\n\\\您要查找景点信息如下:\"); printf(\"\\n\\n\\\%-25s\\n\\n\.vex[i].description); printf(\"\\n\\\按任意键返回...\"); getchar(); getchar(); break; } }

if(i==NUM) {

printf(\"\\n\\n\\\没有找到!\");

printf(\"\\n\\n\\\按任意键返回...\"); getchar(); getchar(); } break; case '2': narrate(); system(\"cls\");

printf(\"\\n\\n\\请输入您要查找的景点名称:\"); scanf(\"%s\for(i=0;iif(!strcmp(name,G.vex[i].sight)) {

printf(\"\\n\\n\\\您要查找景点信息如下:\"); printf(\"\\n\\n\\\%-25s\\n\\n\.vex[i].description); printf(\"\\n\\\按任意键返回...\"); getchar(); getchar(); break; } }

if(i==NUM) {

printf(\"\\n\\n\\\没有找到!\"); printf(\"\\n\\n\\\按任意键返回...\"); getchar();

getchar(); } break; }

}while(c!='e'); }

<5>设计函数HaMiTonian()来设计推荐的旅游路线

void HaMiTonian(int m) {

if(m>8) return; L: NextValue(m); if(x[m]==0) return;

if(m==7&&G.arcs[0][x[8]-1].adj!=20000) display(); else

HaMiTonian(m+1); goto L; }

五、设计方案

1、设计分析

<1>主页面的设计

主页面需要简洁明了,能够直接运用。所以先将所选择的各个景点排列好,在各自景点后面显示出各个景点的说明。在下方显示查询的方式。

<2>查询景点的路径

输入起点景点,再输入终点景点,调用最短路径函数,输入函数,

显示经过的景点,最短距离

<3>查找景点信息

1.按序号查找。从主界面按2进入查找景点信息,此时再次输入1,按照景点的序号查询景点信息

2.按景点名称查找。从主界面按2进入查找景点信息,此时再次输入2,输入景点的名称,出现景点的信息

<4>推荐的参观路线

从主界面输入3,系统会出现推荐的参观路线。

2、模块的功能及程序说明

函数ShortestPath()进行函数的最小路程的计算

void ShortestPath(int num) { int v,w,i,t; int final[NUM]; int min;

for(v=0;vfinal[v]=0;

D[v]=G.arcs[num][v].adj; for(w=0;wP[v][num]=1; P[v][v]=1; }

}

D[num]=0; final[num]=1;

for(i=0;imin=Max;

for(w=0;wfinal[v]=1;

for(w=0;wif(!final[w]&&((min+G.arcs[v][w].adj)D[w]=min+G.arcs[v][w].adj; for(t=0;t<3>函数output()输出最小距离

void output(int sight1,int sight2)

{

int a,b,c,d,q=0; a=sight2; if(a!=sight1) {

printf(\"\\n\从%s到%s的最短路径是\.vex[sight1].sight,G.vex[sight2].sight); printf(\"\(最短距离为 %dm.)\\n\\n\\ printf(\"\%s\ d=sight1;

for(c=0;cif(G.arcs[d][b].adj<20000&&P[a][b]) {

printf(\"-->%s\ q=q+1; P[a][b]=0; d=b;

if(q%8==0) printf(\"\\n\"); goto gate; } } } } }

<4>函数search()来执行寻找景点

void search() { int num; int i; char c; char name[20]; do {

system(\"cls\"); c=SearchMenu(); switch (c) { case '1': system(\"cls\"); narrate();

printf(\"\\n\\n\\请输入您要查找的景点编号:\"); scanf(\"%d\for(i=0;iif(num==G.vex[i].number) {

printf(\"\\n\\n\\\您要查找景点信息如下:\"); printf(\"\\n\\n\\\%-25s\\n\\n\.vex[i].description); printf(\"\\n\\\按任意键返回...\"); getchar();

getchar(); break; } }

if(i==NUM) {

printf(\"\\n\\n\\\没有找到!\"); printf(\"\\n\\n\\\按任意键返回...\"); getchar(); getchar(); } break; case '2': narrate(); system(\"cls\");

printf(\"\\n\\n\\请输入您要查找的景点名称:\"); scanf(\"%s\for(i=0;iif(!strcmp(name,G.vex[i].sight)) {

printf(\"\\n\\n\\\您要查找景点信息如下:\"); printf(\"\\n\\n\\\%-25s\\n\\n\.vex[i].description); printf(\"\\n\\\按任意键返回...\"); getchar(); getchar(); break;

} }

if(i==NUM) {

printf(\"\\n\\n\\\没有找到!\"); printf(\"\\n\\n\\\按任意键返回...\"); getchar(); getchar(); } break; }

}while(c!='e'); }

<5>函数HaMiTonian()来设计推荐的旅游路线

void HaMiTonian(int m) {

if(m>8) return; L: NextValue(m); if(x[m]==0) return;

if(m==7&&G.arcs[0][x[8]-1].adj!=20000) display(); else

HaMiTonian(m+1); goto L; }

<6>函数CreateUDN()用来记录各个景点的信息及相邻景点的距离

void CreateUDN(int v,int a)

{ int i,j; G.vexnum=v; G.arcnum=a;

for(i=0;iG.vex[0].sight=\"行政楼\";

G.vex[0].description=\"学校领导,办公室之地。\"; G.vex[1].sight=\"大礼堂\";

G.vex[1].description=\"业余活动,举办各种晚会。\"; G.vex[2].sight=\"岳麓书院\";

G.vex[2].description=\"千年学府景点\"; G.vex[3].sight=\"复临舍\";

G.vex[3].description=\"教室,自习室\"; G.vex[4].sight=\"图书馆\";

G.vex[4].description=\"阅览,借阅图书\"; G.vex[5].sight=\"第五食堂\"; G.vex[5].description=\"餐饮休闲\"; G.vex[6].sight=\"英语公园\";

G.vex[6].description=\"休闲,放松心情\"; G.vex[7].sight=\"中楼\";

G.vex[7].description=\"教学,自习室\"; G.vex[8].sight=\"东方红广场\"; G.vex[8].description=\"标志性建筑\";

for(i=0;iG.arcs[i][j].adj=Max;

G.arcs[0][1].adj=G.arcs[1][0].adj=12; G.arcs[0][2].adj=G.arcs[2][0].adj=6; G.arcs[0][3].adj=G.arcs[3][0].adj=5; G.arcs[1][4].adj=G.arcs[4][1].adj=11; G.arcs[2][4].adj=G.arcs[4][2].adj=2; G.arcs[3][5].adj=G.arcs[5][3].adj=4; G.arcs[5][7].adj=G.arcs[7][5].adj=9; G.arcs[4][6].adj=G.arcs[6][4].adj=2; G.arcs[4][7].adj=G.arcs[7][4].adj=14; G.arcs[6][8].adj=G.arcs[8][6].adj=7; G.arcs[7][8].adj=G.arcs[8][7].adj=3; }

3、核心算法流程图 Shortoath() narrate() Menu() main Output() Search() HaMiTonian() Searchmenu()

4、核心源程序模块

(1)char Menu() //按钮函数

{

char c;//定义参数 int flag; do{

flag=1;//赋值 system(\"cls\");

narrate();//调用主函数界面函数

printf(\"\\n\\\┏━━━━━━━━━━━━━━━┑\\n\");//输出 printf(\"\\\┃ ┃\\n\");//输出

printf(\"\\\┃ 1、查询景点路径 ┃\\n\");//输出 printf(\"\\\┃ 2、查询景点信息 ┃\\n\");//输出 printf(\"\\\┃ 3、推荐参观路线 ┃\\n\");//输出 printf(\"\\\┃ e、退出 ┃\\n\");//输出 printf(\"\\\┃ ┃\\n\");//输出

printf(\"\\\┗━━━━━━━━━━━━━━━┛\\n\");//输出 printf(\"\\\\请输入您的选择:\");//输出 scanf(\"%c\获得数字

if(c=='1'||c=='2'||c=='3'||c=='e')//判断是否满足条件 flag=0;

}while(flag);//判断是否继续函数 return c; }

(2)char SearchMenu() //查询按钮函数 {

char c;//定义形式参数 int flag; do{//循环 flag=1;

system(\"cls\");//清空系统 narrate();//调用主界面函数

printf(\"\\n\\\┏━━━━━━━━━━━━━━━┑\\n\");//输出 printf(\"\\\┃ ┃\\n\");//输出

printf(\"\\\┃ 1、按照景点编号查询 ┃\\n\");//输出 printf(\"\\\┃ 2、按照景点名称查询 ┃\\n\");//输出 printf(\"\\\┃ e、返回 ┃\\n\");//输出 printf(\"\\\┃ ┃\\n\");//输出

printf(\"\\\┗━━━━━━━━━━━━━━━┛\\n\");//输出 printf(\"\\\\请输入您的选择:\");//输出 scanf(\"%c\获得数字

if(c=='1'||c=='2'||c=='e')//判断是否满足条件 flag=0;

}while(flag);//判断是否循环 return c; }

(3)void search() //定义查询函数 { int num; int i; char c;

char name[20];//定义数字,储存景点名字 do//循环 {

system(\"cls\");

c=SearchMenu();//从按钮函数中获得数字 switch (c)//根据数字来进行操作 {

case '1': //如果数字是1 system(\"cls\");

narrate();//调用主函数界面函数

printf(\"\\n\\n\\请输入您要查找的景点编号:\");//输出 scanf(\"%d\获得数字 for(i=0;iif(num==G.vex[i].number)//当输入的数字和景点的编号相同时 {

printf(\"\\n\\n\\\您要查找景点信息如下:\");//输出

printf(\"\\n\\n\\\%-25s\\n\\n\输出 printf(\"\\n\\\按任意键返回...\");//输出 getchar();//按任意键继续 getchar();//按任意键继续 break; } }

if(i==NUM)//如果输入的数字没有和景点的序号匹配时,退出 {

printf(\"\\n\\n\\\没有找到!\");//输出 printf(\"\\n\\n\\\按任意键返回...\");//输出 getchar();//按任意键继续 getchar();//按任意键继续 } break;

case '2'://当输入的数字为2时, narrate();//调用主界面函数 system(\"cls\");//清空内存

printf(\"\\n\\n\\请输入您要查找的景点名称:\");//输出 scanf(\"%s\获得数字 for(i=0;iif(!strcmp(name,G.vex[i].sight))//如果输入的名称不等于景点的名称时,退出 {

printf(\"\\n\\n\\\您要查找景点信息如下:\");//输出

printf(\"\\n\\n\\\%-25s\\n\\n\输出 printf(\"\\n\\\按任意键返回...\");//输出 getchar();//按任意键继续 getchar();//按任意键继续 break; } }

if(i==NUM)//如果所有名称和输入不同时,退出 {

printf(\"\\n\\n\\\没有找到!\");//输出 printf(\"\\n\\n\\\按任意键返回...\");//输出 getchar(); getchar(); } break; }

}while(c!='e');//判断循环是否结束 }

(4)void CreateUDN(int v,int a)//储存函数,用来记录所有景点的信息 { int i,j; G.vexnum=v; G.arcnum=a;

for(i=0;iG.vex[0].sight=\"行政楼\";

G.vex[0].description=\"学校领导,办公室之地。\"; G.vex[1].sight=\"大礼堂\";

G.vex[1].description=\"业余活动,举办各种晚会。\"; G.vex[2].sight=\"岳麓书院\";

G.vex[2].description=\"千年学府景点\"; G.vex[3].sight=\"复临舍\";

G.vex[3].description=\"教室,自习室\"; G.vex[4].sight=\"图书馆\";

G.vex[4].description=\"阅览,借阅图书\"; G.vex[5].sight=\"第五食堂\"; G.vex[5].description=\"餐饮休闲\"; G.vex[6].sight=\"英语公园\";

G.vex[6].description=\"休闲,放松心情\"; G.vex[7].sight=\"中楼\";

G.vex[7].description=\"教学,自习室\"; G.vex[8].sight=\"东方红广场\"; G.vex[8].description=\"标志性建筑\";

for(i=0;iG.arcs[0][1].adj=G.arcs[1][0].adj=120; G.arcs[0][2].adj=G.arcs[2][0].adj=60; G.arcs[0][3].adj=G.arcs[3][0].adj=50; G.arcs[1][4].adj=G.arcs[4][1].adj=110; G.arcs[2][4].adj=G.arcs[4][2].adj=210; G.arcs[3][5].adj=G.arcs[5][3].adj=40; G.arcs[5][7].adj=G.arcs[7][5].adj=90;

G.arcs[4][6].adj=G.arcs[6][4].adj=120; G.arcs[4][7].adj=G.arcs[7][4].adj=140; G.arcs[6][8].adj=G.arcs[8][6].adj=70; G.arcs[7][8].adj=G.arcs[8][7].adj=30; }

(5)void ShortestPath(int num)//定义最短路径函数 {

int v,w,i,t; int final[NUM]; int min;

for(v=0;vfinal[v]=0; //定于初始为0

D[v]=G.arcs[num][v].adj;//调用结构体中的各个景点的距离 for(w=0;wif(D[v]<20000) //判断条件 {

P[v][num]=1; P[v][v]=1; } }

D[num]=0;//距离 final[num]=1;

for(i=0;ifor(w=0;wif(!final[w]) if(D[w]final[v]=1; for(w=0;wif(!final[w]&&((min+G.arcs[v][w].adj)D[w]=min+G.arcs[v][w].adj;//交换两景点,选择距离短的景点 for(t=0;t(6)void output(int sight1,int sight2) //输入函数 {

int a,b,c,d,q=0; a=sight2; if(a!=sight1) {

printf(\"\\n\从%s到%s的最短路径是\输出 printf(\"\(最短距离为 %dm.)\\n\\n\\输出 printf(\"\%s\输出 d=sight1;

for(c=0;cP[a][sight1]=0; for(b=0;bif(G.arcs[d][b].adj<20000&&P[a][b]) //判断是否满足最短条件 {

printf(\"-->%s\q=q+1; P[a][b]=0; d=b;

if(q%8==0) printf(\"\\n\"); goto gate;//循环 } } } } }

(7)void HaMiTonian(int m) //定义推荐景点函数 {

if(m>8) return; //如果景点大于8个,则返回 L: NextValue(m);

if(x[m]==0) //如果为0,则返回 return;

if(m==7&&G.arcs[0][x[8]-1].adj!=20000) display(); //调出输出函数 else

HaMiTonian(m+1); goto L; }

void NextValue(int k) //定义函数

{ int j;

l:x[k]=(x[k]+1)%10; //随机 if(x[k]==0) return;

if(G.arcs[x[k-1]-1][x[k]-1].adj!=20000) {

for(j=0;j5、操作方法简介

通过这个界面了解湖南大学东方红广场附近的标志性建筑,了

解它们的用途,之后进行相应的了解,当输入1,查询景点路径的时候,输入相应的信息,即起点和终点,这样就就会出现相应的距离和系统规定的路线经过的建筑物,输入2,再输入1,则可用编号查询建筑物的信息,输入2,则可用名称来查询建筑物的信息;输入3,则输出系统规定的最好的参观路线。这样设计,既可以分模块将东西叙述清楚,并且可以让使用者能够简单方便地使用该程序

6、实验结果(包括输入数据和输出结果)

启动程序是,看到的是该界面,按照界面输入。 当输入1时,则出现

如输入2,4,则出现

当从主界面输入2时,调用查询按钮函数,出现

输入1,则可以按照景点的编号查询,可以看见

例如输入2,则出现

若是输入2,按照景点的名称查询,则会出现界面,输入岳麓书院,则出现

从主界面输入3,进入系统设置好的推荐的参观路线,即

7、设计体会。

对于C语言,它是一个很方便的工具,为科学研究必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,具有诸多强大的功能,拥有简单易用的程序语言,但是必须做大量的练习,熟悉其中的函数才能掌握。在我们做题的时候,必须联系和自己的课题相关,深刻的体会其中的含义,分析具体的问题,将抽象的问题转化成数学公式,再利用程序的语言输入,这样才能利用它来解决身边实际的问题。它功能强大,如果能够熟练地掌握好,我们就可以解决今后的很多问题,所以需要多看看书,多动手,多看帮助文件。并且作为一名程序员,最重要的就是要养成动手的能力,做错了没有关系,可以多请教同学老师来解决问题。

函数在计算机中很重要,所以我们也要多掌握各种编程工具中的特定函数,这样在使用时才能够游刃自如。当然,除了要了解在本题中的

用法外,应该也多了解其他的用法。

六、参考文献

[1] 袁志祥、秦锋主编 《数据结构(c语言版)例题详解与课程设计指导》第二版

中国科学技术大学出版社出版

[2]高维春主编《C语言程序设计项目教程》人民邮电出版社 2010.05 [3]李虹主编,《C语言程序设计》 南京大学出版社 2010.02 [4]陈刚主编 《C语言程序设计》 清华大学出版社 2010.02

七、附录

1、程序中主要变量、自定义函数的功能说明; 2.源程序代码;

#include \"string.h\" #include \"stdio.h\" #include \"malloc.h\" #include \"stdlib.h\"

#define Max 20000//限制景点之间的最大距离 #define NUM 9//景点的数量

typedef struct ArcCell//定义结构体,储存各个景点之间的距离 { int adj;

}ArcCell;

typedef struct VertexType//定义结构体,储存各个景点的名称和描述 {

int number; char *sight; char *description; }VertexType;

typedef struct//定义结构体,将上述的两个结构体连起来,共同作为各个景点的属性 {

VertexType vex[NUM]; ArcCell arcs[NUM][NUM]; int vexnum,arcnum; }MGraph;

MGraph G;

int P[NUM][NUM]; //景点之间的距离,用二元数组表示双向,即行政楼到复临舍,复临舍到行政楼的距离是相同的

long int D[NUM]; //输出的景点间的距离 int x[9]={0};

void CreateUDN(int v,int a);//定义函数,用来储存各个景点的信息,名称、描述、距离等 void narrate(); //主函数界面,上面有景点信息

void ShortestPath(int num);//定义函数,用来计算几个景点之间的最短距离 void output(int sight1,int sight2);//定义函数,用来输入景点之间的最短距离

char Menu(); //按钮函数,用来输出主函数界面,上面有narrate()函数,和相应的选择按钮 void search(); //查询函数,用来查询各个景点的信息

char SearchMenu(); //查询按钮函数,可以用序号查询,也可以用景点名称查询 void HaMiTonian(int); //推荐的查询路线的函数 void NextValue(int); void display();//输出函数 void main()//主函数 {

int v0,v1; char ck;

CreateUDN(NUM,11);//调用信息函数,用来输出各个景点的信息,名称、描述、距离等 do//循环 { ck=Menu(); switch(ck) {

case '1'://当输入1时,进入景点的起点和终点的选择 system(\"cls\"); // narrate();

printf(\"\\n\\n\\\请选择起点景点(0~8):\");//输出 scanf(\"%d\获取数字

printf(\"\\\请选择终点景点(0~8):\");//输出 scanf(\"%d\获取数字

ShortestPath(v0); //调用函数,计算景点之间的最短距离 output(v0,v1); //调用函数,输出景点之间的最短距离 printf(\"\\n\\n\\\\请按任意键继续...\\n\");//输出 getchar();//按任意键

getchar();//按任意键 break;

case '2':search();//当输入2时,进入查询函数 break; case '3':

system(\"cls\");//清空系统 //narrate(); x[0]=1;

HaMiTonian(1);//调用函数,输出推荐的景点顺序 printf(\"\\n\\n\\\\请按任意键继续...\\n\"); getchar();//按任意键继续 getchar();//按任意键继续 break; };

}while(ck!='e');//循环 }

char Menu() //按钮函数 {

char c;//定义参数 int flag; do{

flag=1;//赋值 system(\"cls\");

narrate();//调用主函数界面函数

printf(\"\\n\\\┏━━━━━━━━━━━━━━━┑\\n\");//输出 printf(\"\\\┃ ┃\\n\");//输出

printf(\"\\\┃ 1、查询景点路径 ┃\\n\");//输出 printf(\"\\\┃ 2、查询景点信息 ┃\\n\");//输出 printf(\"\\\┃ 3、推荐参观路线 ┃\\n\");//输出 printf(\"\\\┃ e、退出 ┃\\n\");//输出 printf(\"\\\┃ ┃\\n\");//输出

printf(\"\\\┗━━━━━━━━━━━━━━━┛\\n\");//输出 printf(\"\\\\请输入您的选择:\");//输出 scanf(\"%c\获得数字

if(c=='1'||c=='2'||c=='3'||c=='e')//判断是否满足条件 flag=0;

}while(flag);//判断是否继续函数 return c; }

char SearchMenu() //查询按钮函数 {

char c;//定义形式参数 int flag; do{//循环 flag=1;

system(\"cls\");//清空系统 narrate();//调用主界面函数

printf(\"\\n\\\┏━━━━━━━━━━━━━━━┑\\n\");//输出 printf(\"\\\┃ ┃\\n\");//输出

printf(\"\\\┃ 1、按照景点编号查询 ┃\\n\");//输出 printf(\"\\\┃ 2、按照景点名称查询 ┃\\n\");//输出 printf(\"\\\┃ e、返回 ┃\\n\");//输出 printf(\"\\\┃ ┃\\n\");//输出

printf(\"\\\┗━━━━━━━━━━━━━━━┛\\n\");//输出 printf(\"\\\\请输入您的选择:\");//输出 scanf(\"%c\获得数字

if(c=='1'||c=='2'||c=='e')//判断是否满足条件 flag=0;

}while(flag);//判断是否循环 return c; }

void search() //定义查询函数 { int num; int i; char c;

char name[20];//定义数字,储存景点名字 do//循环 {

system(\"cls\");

c=SearchMenu();//从按钮函数中获得数字 switch (c)//根据数字来进行操作 {

case '1': //如果数字是1

system(\"cls\");

narrate();//调用主函数界面函数

printf(\"\\n\\n\\请输入您要查找的景点编号:\");//输出 scanf(\"%d\获得数字 for(i=0;iif(num==G.vex[i].number)//当输入的数字和景点的编号相同时 {

printf(\"\\n\\n\\\您要查找景点信息如下:\");//输出

printf(\"\\n\\n\\\%-25s\\n\\n\输出 printf(\"\\n\\\按任意键返回...\");//输出 getchar();//按任意键继续 getchar();//按任意键继续 break; } }

if(i==NUM)//如果输入的数字没有和景点的序号匹配时,退出 {

printf(\"\\n\\n\\\没有找到!\");//输出 printf(\"\\n\\n\\\按任意键返回...\");//输出 getchar();//按任意键继续 getchar();//按任意键继续 } break;

case '2'://当输入的数字为2时,

narrate();//调用主界面函数 system(\"cls\");//清空内存

printf(\"\\n\\n\\请输入您要查找的景点名称:\");//输出 scanf(\"%s\获得数字 for(i=0;iif(!strcmp(name,G.vex[i].sight))//如果输入的名称不等于景点的名称时,退出 {

printf(\"\\n\\n\\\您要查找景点信息如下:\");//输出

printf(\"\\n\\n\\\%-25s\\n\\n\输出 printf(\"\\n\\\按任意键返回...\");//输出 getchar();//按任意键继续 getchar();//按任意键继续 break; } }

if(i==NUM)//如果所有名称和输入不同时,退出 {

printf(\"\\n\\n\\\没有找到!\");//输出 printf(\"\\n\\n\\\按任意键返回...\");//输出 getchar(); getchar(); } break; }

}while(c!='e');//判断循环是否结束

}

void CreateUDN(int v,int a)//储存函数,用来记录所有景点的信息 { int i,j; G.vexnum=v; G.arcnum=a;

for(i=0;iG.vex[0].sight=\"行政楼\";

G.vex[0].description=\"学校领导,办公室之地。\"; G.vex[1].sight=\"大礼堂\";

G.vex[1].description=\"业余活动,举办各种晚会。\"; G.vex[2].sight=\"岳麓书院\";

G.vex[2].description=\"千年学府景点\"; G.vex[3].sight=\"复临舍\";

G.vex[3].description=\"教室,自习室\"; G.vex[4].sight=\"图书馆\";

G.vex[4].description=\"阅览,借阅图书\"; G.vex[5].sight=\"第五食堂\"; G.vex[5].description=\"餐饮休闲\"; G.vex[6].sight=\"英语公园\";

G.vex[6].description=\"休闲,放松心情\"; G.vex[7].sight=\"中楼\";

G.vex[7].description=\"教学,自习室\";

G.vex[8].sight=\"东方红广场\"; G.vex[8].description=\"标志性建筑\";

for(i=0;iG.arcs[0][1].adj=G.arcs[1][0].adj=120; G.arcs[0][2].adj=G.arcs[2][0].adj=60; G.arcs[0][3].adj=G.arcs[3][0].adj=50; G.arcs[1][4].adj=G.arcs[4][1].adj=110; G.arcs[2][4].adj=G.arcs[4][2].adj=210; G.arcs[3][5].adj=G.arcs[5][3].adj=40; G.arcs[5][7].adj=G.arcs[7][5].adj=90; G.arcs[4][6].adj=G.arcs[6][4].adj=120; G.arcs[4][7].adj=G.arcs[7][4].adj=140; G.arcs[6][8].adj=G.arcs[8][6].adj=70; G.arcs[7][8].adj=G.arcs[8][7].adj=30; }

void narrate()//定义主函数界面函数 {

int i,k=0;

printf(\"\\n\\*****************欢迎使用校园导游程序***************\\n\");//输出 printf(\"\\n\\********************湖南大学*******************\\n\");//输出

printf(\"\__________________________________________________________________\\n\");//输出

printf(\"\\景点名称\\|\景点描述\\n\");//输出

printf(\"\________________________________|_________________________________\\n\");//输出

for(i=0;iprintf(\"\ (%2d)%-10s\\\|\%-25s\\n\循环输出每个景点的序号,名称,描述 k=k+1; }

printf(\"\________________________________|_________________________________\\n\");//输出 }

void ShortestPath(int num)//定义最短路径函数 {

int v,w,i,t; int final[NUM]; int min;

for(v=0;vfinal[v]=0; //定于初始为0

D[v]=G.arcs[num][v].adj;//调用结构体中的各个景点的距离 for(w=0;wif(D[v]<20000) //判断条件 {

P[v][num]=1;

P[v][v]=1; } }

D[num]=0;//距离 final[num]=1;

for(i=0;ifor(w=0;wfinal[v]=1; for(w=0;wif(!final[w]&&((min+G.arcs[v][w].adj)D[w]=min+G.arcs[v][w].adj;//交换两景点,选择距离短的景点 for(t=0;t} }

void output(int sight1,int sight2) //输入函数 {

int a,b,c,d,q=0; a=sight2; if(a!=sight1) {

printf(\"\\n\从%s到%s的最短路径是\输出 printf(\"\(最短距离为 %dm.)\\n\\n\\输出 printf(\"\%s\输出 d=sight1;

for(c=0;cif(G.arcs[d][b].adj<20000&&P[a][b]) //判断是否满足最短条件 {

printf(\"-->%s\q=q+1; P[a][b]=0; d=b;

if(q%8==0) printf(\"\\n\"); goto gate;//循环

} } } } }

void HaMiTonian(int m) //定义推荐景点函数 {

if(m>8) return; //如果景点大于8个,则返回 L: NextValue(m);

if(x[m]==0) //如果为0,则返回 return;

if(m==7&&G.arcs[0][x[8]-1].adj!=20000) display(); //调出输出函数 else

HaMiTonian(m+1); goto L; }

void NextValue(int k) //定义函数 { int j;

l:x[k]=(x[k]+1)%10; //随机 if(x[k]==0) return;

if(G.arcs[x[k-1]-1][x[k]-1].adj!=20000) {

for(j=0;jvoid display() //定义输出函数 { int i=0;

printf(\"\\n\\n\\");//输出 for(i=0;i<8;i++) //循环输出

printf(\"%s->\输出 printf(\"出口\");//输出 printf(\"\\n\"); }

因篇幅问题不能全部显示,请点此查看更多更全内容