校园导游咨询系统(Dijkstra算法,图形化界面)

校园导游咨询系统

前言

	最近布置了数据结构的作业,
	终于把代码敲出来了,总而言之还是挺满意的,
	受到了一些文章的启发,所以想把这些记录下来
	所以特别感谢[图形化界面](https://blog.csdn.net/weixin_44044411/article/details/104276757?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160719106219726891124613%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160719106219726891124613&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-2-104276757.first_rank_v2_pc_rank_v29&utm_term=C%E8%AF%AD%E8%A8%80%E5%B0%86%E8%BE%93%E5%85%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BE%9D%E6%AC%A1%E6%89%AB%E6%8F%8F%E5%88%B0%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E9%87%8C%E9%9D%A2&spm=1018.2118.3001.4449)
	这篇文章

课设要求

(1) 采用Dijkstra算法提供任意两个场所间的最短路径,(这里因为距离并未结合实际,所以我就没输出了)并能输出最短路径长度及路径(以场所名称表示);
(2) 以图中顶点表示校内各场所,存放场所名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息;
(3) 结点数可改变(可增加或删除场所);
(4) 初始图至少包括10各场所;
(5) 设计简单菜单能进行操作选择。

准备工作

easyx的下载链接如下:(本文使用的版本是2020最新版)
https://www.easyx.cn/downloads/
注:使用easyx需要注意它兼容的编译器(下载的帮助文件会写),不同的easyx兼容的编译器不同,但总是和visual C++6兼容(和字符编码有关),本文以visual C++6编译器为例书写代码。
我下载的时候有界面帮你直接安装了

编程

感觉最好的办法还是结合实际代码,所以直接上代码,几乎每一段我都上了注释。当然因为是初学,所以很多代码可能会有冗余,会有更好的写法,勿喷

效果图:
舍友帮我画的背景图
这张是我舍友帮我画的背景图
上代码,推荐还是用cpp保存

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<graphics.h>
#include<conio.h>
#include<Windows.h>
#define max 10000
#define _CRT_SECURE_NO_WARNINGS 1 //解决sscanf不安全
using namespace std;

IMAGE BJ;//背景图片
int r2[3][4] = {
    {
   900,30,990,70},{
   900,120,990,160} ,{
   900,210,990,310} };//增加地点,减少地点,鼠标坐标显示的 矩阵位置
int r[50][2];//地图上所有地点坐标的矩阵

typedef struct ArcCell 
{
   
    int adj;  //权值 两点之间的距离
    int* info; //两点之间其他信息,本代码没用
}ArcCell;//途中两个地点之间的信息
typedef struct vexs 
{
   
    char name[40];//地点的名字
    int x, y;//顶点坐标
};//地点信息
typedef struct MGraph 
{
   
    vexs vexs[20];         //顶点矩阵
    ArcCell arcs[20][20];    //边
    int vexnum, arcnum;  //图的当前顶点数和弧数
}MGraph;//地图的基本信息

int button_judge(int x, int y,MGraph G)
{
   
    for (int i = 0; i < G.vexnum; i++) 
    {
   
        if (x > r[i][0] - 40 && x < r[i][0] + 40 && y > r[i][1] - 40 && y < r[i][1] + 40)return i+1;
    }
    return 0;
}//判断鼠标是否在地图中地点的位置
int button_judge1(int x, int y)
{
   
    if (x > r2[0][0] && x < r2[0][2] && y > r2[0][1] && y < r2[0][3])return 1;
    if (x > r2[1][0] && x < r2[1][2] && y > r2[1][1] && y < r2[1][3])return 2;
    return 0;
} //判断鼠标是否在增加或者删除地点的窗口处
int LocateVex(MGraph G, char v[40]) {
   
    for (int i = 0; i < G.vexnum; i++) {
   
        if (strcmp(G.vexs[i].name,v)==0) {
   
            return i;
            break;
        }
    }
} //判断地图上的地点在图(指数据结构中的图)中的位置

void CreateUDN(MGraph& G) {
   
    G.vexnum = 10;
    G.arcnum = 17;//图中的地点,几个地点之间相通的路的个数
    strcpy_s(G.vexs[0].name, "沁园");
    G.vexs[0].x = 100; G.vexs[0].y = 700;
    strcpy_s(G.vexs[1].name, "食堂");
    G.vexs[1].x = 250; G.vexs[1].y = 600;
    strcpy_s(G.vexs[2].name, "文德楼");
    G.vexs[2].x = 800; G.vexs[2].y = 650;
    strcpy_s(G.vexs[3].name, "逸夫楼");
    G.vexs[3].x = 50; G.vexs[3].y = 400;
    strcpy_s(G.vexs[4].name, "操场");
    G.vexs[4].x = 300; G.vexs[4].y = 500;
    strcpy_s(G.vexs[5].name, "计软楼");
    G.vexs[5].x = 250; G.vexs[5].y = 70;
    strcpy_s(G.vexs[6].name, "长望楼");
    G.vexs[6].x = 250; G.vexs[6].y = 250;
    strcpy_s(G.vexs[7].name, "北辰楼");
    G.vexs[7].x = 650; G.vexs[7].y = 50;
    strcpy_s(G.vexs[8].name, "藕舫楼");
    G.vexs[8].x = 700; G.vexs[8].y = 150;
    strcpy_s(G.vexs[9].name, "明德楼");
    G.vexs[9].x = 670; G.vexs[9].y = 250;//我设置的固定地点
    for (int i = 0; i < G.vexnum; i++) 
    {
   
        for (int j = 0; j < G.vexnum; j++) 
        {
   
            G.arcs[i][j].adj = max;
            G.arcs[i][j].info = NULL;
        }
    }//赋初值为max  这样固定都不能走,再设置能走的
    for (int k = 0; k < G.arcnum; k++) //设置能走的几个点
    {
   
        char v1[40], v2[40];
        if (k == 0) {
   
            strcpy_s(v1, "沁园");
            strcpy_s(v2, "逸夫楼");
        }
        if (k == 1) {
   
            strcpy_s(v1, "沁园");
            strcpy_s(v2, "食堂");
        }
        if (k == 2) {
   
            strcpy_s(v1, "食堂");
            strcpy_s(v2, "文德楼");
        }
        if (k == 3) {
   
            strcpy_s(v1, "沁园");
            strcpy_s(v2, "操场");
        }
        if (k == 4) {
   
            strcpy_s(v1, "食堂");
            strcpy_s(v2, "操场");
        }
        if (k == 5) {
   
            strcpy_s(v1, "逸夫楼");
            strcpy_s(v2, "操场");
        }
        if (k == 6) {
   
            strcpy_s(v1, "计软楼");
            strcpy_s(v2, "逸夫楼");
        }
        if (k == 7) {
   
            strcpy_s(v1, "长望楼");
            strcpy_s(v2, "逸夫楼");
        }
        if (k == 8) {
   
            strcpy_s(v1, "计软楼");
            strcpy_s(v2, 
  • 8
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值