C语言课程设计之旅游景点咨询系统

2023-12-19 00:50

本文主要是介绍C语言课程设计之旅游景点咨询系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C语言课程设计之旅游景点咨询系统

1.问题描述:创建一个至少有15个点的有向网表示的某个旅游景点的导游图。顶点代表景点,类型为字符串(例如,泰山导游图:“天地广场门”,“十八盘”,“冯玉祥墓”,“桃花峪门”,“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。建立一个游客咨询系统。
2.基本要求
(1)创建图的存储结构。
(2)输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道);
(3)输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;如果两者无路径可通,就得出“两景点不可达的信息”。
(4)按照题意要求独立进行设计,设计结束后按要求写出设计报告。

一、代码块:

#include<bits/stdc++.h>
/*#include<iostream>
#include<fstream>
#include<algorithm>
#include<stack>*/
using namespace std;
const int MAXVEX=50;
const int INF=0x3fffffff;
//s表示索道 w表示步行typedef struct{//边的结构int wei;//权值char way;//到达方式
}EdgeType;typedef struct{string vexs[MAXVEX];//顶点信息,string类型EdgeType arc[MAXVEX][MAXVEX];//边的信息int numVertexes,numEdges;//顶点数和边数
}MGraph;void CreateMGraph(MGraph *G)
{FILE *fp;fp=fopen("read.txt","r");int i,j,k,w;cout<<"请输入顶点数和边数"<<endl;//cin>>G->numVertexes>>G->numEdges;fscanf(fp,"%d %d",&G->numVertexes,&G->numEdges);cout<<"请输入"<<G->numVertexes<<"个景点名"<<endl;char temp[MAXVEX];for(i=0;i<G->numVertexes;++i){fscanf(fp,"%s",temp);//cin>>G->vexs[i];G->vexs[i]=temp;}//初始化邻接矩阵for(i=0;i<G->numVertexes;++i)for(j=0;j<G->numVertexes;++j)G->arc[i][j].wei=INF;cout<<"请输入"<<G->numEdges<<"条边,包括起点下标、终点下标、路程(KM)和到达方式(s表示索道 w表示步行)"<<endl;for(k=0;k<G->numEdges;++k){char ch;fscanf(fp,"%d %d %d %c",&i,&j,&w,&ch);//cin>>i>>j>>w>>ch;G->arc[i][j].wei=w;G->arc[i][j].way=ch;}cout<<endl<<"*******邻接矩阵建立完成,各景点对应的编号如下*******"<<endl<<endl;for(i=0;i<G->numVertexes;++i){cout<<"编号"<<i<<" "<<G->vexs[i]<<endl;}
}int solution[MAXVEX];//记录路线
bool vis[MAXVEX];//标记数组
int flag;//通路标记void print(MGraph G,int len)//参数为路径上的第几个点
{flag=1;int sum=0;cout<<G.vexs[solution[1]];for(int i=2;i<=len;++i){//第一个点已经打印,打印剩下的点if(G.arc[solution[i-1]][solution[i]].way=='s') cout<<" -> "<<"(索道)"<<G.vexs[solution[i]];else cout<<" -> "<<"(步行)"<<G.vexs[solution[i]];sum+=G.arc[solution[i-1]][solution[i]].wei;}cout<<endl<<"该路径总路程为"<<sum<<"KM"<<endl;cout<<endl;
}void dfs(MGraph G,int k,int loc,int e)//k为第几步,loc为当前的位置,e为目标
{solution[k]=loc;//当前顶点加入路线vis[loc]=1;//标记置为1if(loc==e) print(G,k);elsefor(int i=0;i<G.numVertexes;++i){if(vis[i]==0&&G.arc[loc][i].wei<INF) dfs(G,k+1,i,e);}vis[loc]=0;//取消标记
}void slove_allpath(MGraph G,int s,int e)//查找所有可行路径
{flag=0;//有无路径标记memset(vis,0,sizeof(vis));dfs(G,1,s,e);//从第一步起点开始if(!flag) cout<<"无可行路径!"<<endl;
}int P[MAXVEX][MAXVEX];//用于存储最短路径下标的数组
int D[MAXVEX][MAXVEX];//用于存储到各点最短路径的权值之和void ShortestPath_Dijkstra(MGraph G,int v0)//最短路求解
{int v,w,k,Min;int Final[MAXVEX];//标记,=1表示求得顶点V0至Vw的最短路径for(v=0;v<G.numVertexes;v++){//初始化数据Final[v]=0;//全部顶点初始化为未知最短路径状态D[v0][v]=G.arc[v0][v].wei;//将与V0有连线的顶点加上权值P[v0][v]=v0;//初始化路径数组pre顶点均为起始点V0}D[v0][v0]=0;//v0至v0路径为0Final[v0]=1;//v0至v0不需要求路径for(v=1;v<G.numVertexes;v++){Min=INF;//初始化最小值为INFfor(w=0;w<G.numVertexes;w++){if(!Final[w]&&D[v0][w]<Min){k=w;Min=D[v0][w];//w顶点离v0顶点更近}}Final[k]=1;//将目前找到的最近的顶点位置置为1for(w=0;w<G.numVertexes;++w){//修正当前最短路径及距离//如果经过v顶点的路径比现在这条路径的长度短的话if(!Final[w]&&(Min+G.arc[k][w].wei<D[v0][w])){D[v0][w]=Min+G.arc[k][w].wei;//修改当前路径长度P[v0][w]=k;}}}
}stack<int> xiang;//辅助栈void slove_ShortestPath(MGraph G,int s,int e)//查找最短路径
{int tempe=e;if(D[s][e]==INF) cout<<"无可行路径!"<<endl;else{//有最短路径int temp=D[s][e];xiang.push(e);//终点先进栈while(P[s][e]!=s)//根据P数组倒着找{//只要不到起点xiang.push(P[s][e]);e=P[s][e];}//cout<<"由"<<G.vexs[s]<<"到"<<G.vexs[tempe]<<"的最短路径为:"<<endl;cout<<G.vexs[s];int pre=s;while(!xiang.empty()){int top=xiang.top();if(G.arc[pre][top].way=='s') cout<<" -> "<<"(索道)"<<G.vexs[top];else cout<<" -> "<<"(步行)"<<G.vexs[top];pre=top;xiang.pop();}cout<<endl<<"该路径总路程为"<<temp<<"KM"<<endl;}cout<<endl;
}int main()
{MGraph G;CreateMGraph(&G);for(int i=0;i<G.numVertexes;++i) ShortestPath_Dijkstra(G,i);/*for(int i=0;i<G.numVertexes;++i){for(int j=0;j<G.numVertexes;++j)cout<<P[i][j]<<' ';cout<<endl;}cout<<endl;for(int i=0;i<G.numVertexes;++i){for(int j=0;j<G.numVertexes;++j)cout<<D[i][j]<<' ';cout<<endl;}*/cout<<"请输入需要查找的路径(对应的起点和终点下标),输入-1结束查找"<<endl;int s,e;while(cin>>s>>e&&(s+e)>=0){if(s==e){cout<<"您已在该景点"<<endl;continue;}cout<<"*******由"<<G.vexs[s]<<"到"<<G.vexs[e]<<"可行的路径有:*******"<<endl;slove_allpath(G,s,e);//查找所有可行路径cout<<"*******由"<<G.vexs[s]<<"到"<<G.vexs[e]<<"的最短路径为:*******"<<endl;slove_ShortestPath(G,s,e);//查找最短路径}cout<<"********************查 找 结 束********************"<<endl;return 0;
}

二、运行:
1.读入景点信息文件:
在这里插入图片描述
2.查找:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这篇关于C语言课程设计之旅游景点咨询系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/510375

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.