首页 > 编程语言 >校园导航系统C++

校园导航系统C++

时间:2024-05-30 21:57:37浏览次数:17  
标签:终点 cout int MAX 路径 校园 C++ file 导航系统

制作一个简单的大学城导航系统,根据用户指定的起点和终点,求出最短路径长度以及具体路径。

项目要求:

1)程序与数据相分离,地图中的所有数据都是从文件读入,而不是写在代码中

2)最短路径算法不能调用函数库

3)菜单界面可以循环显示,每次显示前先清屏

4)输入的起点和终点若不存在,能给出相应提示并允许重新输入(有可能多次输入都不存在) 5)能够显示两个地点的简介

6)能够根据起点和终点计算出正确的最短路径长度

7)能够显示出具体的最短路径(比如:中大 -> 广外->广中医)

8)如果起点与终点之间不可达,要有相应提示。 本地图中,只有鲤鱼岗不可达,如果代码中根据起点或终点直接判断是否鲤鱼岗来得出不可达的结论,则代码不达标,必须是由最短路径算法运算后来判断是否可达。   

#include <iostream>
#include <fstream>
#include <cstdlib> 
using namespace std;

const int MAX = 100;                 
int map[MAX][MAX];                 // 地点间的邻接矩阵
string name[MAX];                  //地点名称表
string intro[MAX];                 // 地点简介
int n, m;                          // 地点个数和边的个数

//打开数据文件 函数 
bool read(const char* filename) {
    ifstream file(filename);
    if (!file) {
        return false;
    }

    file >> n >> m;                     //读入地点个数和边的个数

    for (int i = 1; i <= n; ++i) {      //初始化邻接矩阵
        for (int j = 1; j <= n; ++j) {
            map[i][j] = -1;
        }
    }

    int u, v, w;
    for (int i = 0; i < m; ++i) {      //建立邻接矩阵
        file >> u >> v >> w;
        map[u][v] = w;
        map[v][u] = w;
    }

    file.ignore();                   
    for (int i = 1; i <= n; ++i) { 
        getline(file, name[i]);        //建立地点名称表
    }
                                
    for (int i = 1; i <= n; ++i) {
        getline(file, intro[i]);       //读入地点简介
    }                                  
    file.close();
    return true;
}

// 打印地点列表 函数                               
void display() {
    for (int i = 1; i <= n; ++i) {
        cout <<"      "<< i << "-" << name[i] ;
        if(i%4==0) cout<<endl<<endl; 
    }                               
}

//Dijkstra算法求最短路径 函数 
void dj(int start, int end, int& minDist, int path[]) {
	                                 //path存储起点到各个节点的最短距离 
    bool visited[MAX];               //visited记录结点是否被访问过 
    int dist[MAX];                   //dist存储起点到各个节点的最短距离
    for (int i = 1; i <= n; ++i) {       
        visited[i] = false;          //1初始化
        dist[i] = INT_MAX;          
    }
    dist[start] = 0;                
    for (int i = 1; i <= n; ++i) {
        int u = -1;
        int minDist = INT_MAX;
        for (int j = 1; j <= n; ++j) {   //2在dist中选出未被访问的最小值,赋值给 u 
            if (!visited[j] && dist[j] < minDist) {
                u = j;                 
                minDist = dist[j];
            }
        }

        if (u == -1) {
            break;
        }
        visited[u] = true;          
        for (int v = 1; v <= n; ++v) {  //3比较 ,更新dist 
            if (!visited[v] && map[u][v] != -1 && dist[u] + map[u][v] < dist[v]) {
                dist[v] = dist[u] + map[u][v];              
                path[v] = u;
            }
        }
    }
    minDist = dist[end];
}

// 输出具体路径的函数 
void Minpath(int start, int end, int path[]) {
    if (start == end) {
        cout << name[start];
        return;
    }
    Minpath(start, path[end], path); 
    cout << " -> " << name[end];
}



int main() {
    const char* filename = "map.txt";
    if (!read(filename)) {
        cout << "无法读取地图数据文件。" << endl;
        return 1;
    }
    int start, end;
    while (true) {
        system("cls");  //清屏 
        cout << "-------------------------广州大学城简易导航系统-----------------------" << endl;
        cout<<endl;
        display();
        cout<<"      0-退出"<<endl; 
        cout << "----------------------------------------------------------------------"<<endl;
        cout << "请输入起点编号:";
        cin >> start;
        if (start == 0) {
            cout << "欢迎再次使用!" << endl;
            break;
        } 
		while(start < 1 || start > n) {
            cout << "编号不存在,请重新输入"<<endl;
            cout << "请输入起点编号:";
        	cin >> start;
        }

        cout << "请输入终点编号:";
        cin >> end;
        if (end == 0) {
            cout << "欢迎再次使用!" << endl;
            break;
        } 
		while(end < 1 || end > n) {
            cout << "编号不存在,请重新输入"<<endl;
            cout << "请输入终点编号:";
        	cin >> end;
        }
       
        cout << endl;
        cout << intro[start] << endl;          //输出简介 
        cout << endl;
        cout << intro[end] << endl;
        cout << endl;
       
        int minDist, path[MAX];
        dj(start, end, minDist, path);         //计算最短路径  

        if (minDist == INT_MAX) {
            cout << name[start] << " 到 " << name[end] << "的最短路径是:无法到达。" << endl;
        } else {
            cout << name[start] << " 到 " << name[end] << "的最短距离是:" << minDist <<"m"<<endl;
            cout<<endl;
            cout << "具体路径是:";
            Minpath(start, end, path);         //输出路径 
            cout << endl;
        }
        cout << "按任意键继续...";
        cin.ignore();
        cin.get();
    }
    return 0;
}

标签:终点,cout,int,MAX,路径,校园,C++,file,导航系统
From: https://blog.csdn.net/2301_80386162/article/details/139335353

相关文章

  • 基于web校园二手书籍置换系统设计与实现
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • Linux C进阶 —— 与C++互相调用
      本文介绍C、C++函数互相引用的方法,以及各类目标文件(含.o目标文件、.a静态库、.so动态库)在互调使用中的详细编译链接方法。本文使用arm的交叉编译工具链作为编译和链接工具。1.C调用C++方法(asio为c++库)示例源码树:$tree..├──include│├──asio││├──......
  • c++结构体解决复数辐角问题
     结构体相关知识及运行代码(来自发发老师)/*ch10_structs.cc介绍:这里解释了结构体的使用方法。包括:(1)定义和初始化。(2)赋值。(3)结构体和数组一起使用。注意数据成员和函数成员的访问。(4)结构体和向量一起使用。(5)结构体和函数。*/#include<iostream>......
  • 【c++基础(五)】内存管理--new
    1.前言在C语言中,有四个内存管理函数:malloc,calloc,realloc和free但是使用起来他们却是非常的不方便:int*p1=(int*)malloc(sizeof(int)*n);int*p2=(int*)calloc(4,sizeof(int));int*p3=(int*)realloc(p2,sizeof(int)*10);同时这里也会出现一个问题,malloc不会进......
  • 【c++基础(四)】类和对象下--初始化列表等概念
    1.前言类和对象到这里基本已经接近尾声,本篇文章主要介绍一些与类和对象有关的相关细节,在后续使用类和对象中也有可能用的到。本章重点:本篇文章重点讲解初始化列表,友元,匿名对象和类中的static成员,以及类中的内部类的概念。 2.初始化列表 在谈论初始化列表之前就要再次......
  • 区间和(C++)
    题目描述】给定一个全部为零的数列,规定有两种操作,一是修改某个元素,二是求区间的连续和。【输入】输入数据第一行包含两个正整数n,m(n≤100000,m≤500000) ,以下是m 行,每行有三个正整数k,a,b (k=0 或1,a,b≤n ).k=0 时表示将a 处数字加上b ,k=1 时表示询问区间[a,b......
  • 一文搞懂C++继承、多继承、菱形继承、虚继承
    继承目录继承继承继承的访问权限子类赋值给父类赋值兼容规则“天然”的行为验证:1.其他权限继承能否支持赋值兼容规则2.是否"天然",有没有产生临时变量继承中的作用域继承的构造函数继承的拷贝构造继承的operator=继承的析构函数析构顺序析构的特殊处理继承中的static成员设计一......
  • C++结构体使用
    文章目录原文链接一、结构体基本概念二、使用及定义三、结构体数组四、结构体指针六、结构体做函数参数值传递和地址传递的区别七、结构体中const的使用场景原文链接c++中的结构体一、结构体基本概念结构体属于用户自定义的数据类型,允许用户存储不同的数据类型......
  • c++ 模板 元编程
    模板是门新语言C++元编程是一种使用模板元编程技术实现的编程方式,它允许程序员在编译期进行计算和代码生成。相比于传统的运行时编程,C++元编程可以提高程序的执行效率,减少资源开销,使得编译器能够优化代码,从而在一些对性能要求较高的场景中有着广泛的应用。   来自:https:/......
  • C++ Primer Plus(第6版):程序的创建过程
    一个C++程序是如何一步步创建的呢?一般来说主要分为三个过程:使用文本编辑器编写程序,并将其保存至文件中,这个文件就是程序的源代码。编译源代码。这是指将源代码翻译为主机使用的内部语言--机器语言,将翻译后的代码称之为目标代码(objectcode)。将目标代码与其它代码链接起来。链......