C语言实现导航功能

  • 更新时间:2022-11-03 09:35:43
  • 编辑:家饮香

本文实例为大家分享了C语言实现导航功能的具体代码,供大家参考,具体内容如下

#include<stdio.h>
#include<string.h>

#define NUM 25
#define INFINITY 32767
#define False 0
#define True 1

typedef struct
{
    int number;//顶点的编号 
    const char *sight;//顶点的信息 
 } VertexType;//顶点的类型 
 
 typedef struct
 {
     VertexType vex[NUM];//存放顶点信息
     int arcs[NUM][NUM];//邻接矩阵数组
     int vexnum;//顶点个数 
 }MGraph;
 
MGraph G;
 
 /**
由传入的节点个数创建图
 **/ 
 void GreateMGraph(int v) 
 {
     G.vexnum=v;//传入节点个数 
     for(int i=1;i<G.vexnum;i++){
         G.vex[i].number=i;
     }//配置顶点编号 
     
     /**
     编辑顶点信息    
     **/ 
     G.vex[0].sight="各景点名字";
     G.vex[1].sight="大门口";
     G.vex[2].sight="行政办公楼";
     G.vex[3].sight="北区教室实训中心";
     G.vex[4].sight="一号教学楼";
     G.vex[5].sight="二号教学楼";
     G.vex[6].sight="实验楼";
     G.vex[7].sight="三号教学楼";
     G.vex[8].sight="图书馆";
     G.vex[9].sight="开水房";
     G.vex[10].sight="超市";
     G.vex[11].sight="榴馨苑";
     G.vex[12].sight="洗浴中心";
     G.vex[13].sight="骊秀苑";
     G.vex[14].sight="综合楼";
     G.vex[15].sight="游泳池";
     G.vex[16].sight="主田径场";
     G.vex[17].sight="综合文体馆";
     
     /**
     先将所有顶点之间的距离设置为INFINITY 
     **/
     for(int i=1;i<=G.vexnum;i++)
     {
         for(int j=1;j<=G.vexnum;j++)
         {
             G.arcs[i][j]=INFINITY;
         }
     }
     
     /**
     设置各顶点之间的距离 
     **/
     G.arcs[1][2]=G.arcs[2][1]=255;
     G.arcs[1][4]=G.arcs[4][1]=501;
     G.arcs[1][5]=G.arcs[5][1]=535;
     G.arcs[1][6]=G.arcs[6][1]=705;
     G.arcs[1][7]=G.arcs[7][1]=722;
     G.arcs[1][8]=G.arcs[8][1]=790;
     G.arcs[2][3]=G.arcs[3][2]=530;
     G.arcs[2][4]=G.arcs[4][2]=450;
     G.arcs[2][5]=G.arcs[5][2]=484;
     G.arcs[2][6]=G.arcs[6][2]=654;
     G.arcs[2][7]=G.arcs[7][2]=663;
     G.arcs[2][8]=G.arcs[8][2]=748;
     G.arcs[3][8]=G.arcs[8][3]=1054;
     G.arcs[3][17]=G.arcs[17][3]=713;
     G.arcs[4][5]=G.arcs[5][4]=436;
     G.arcs[4][6]=G.arcs[6][4]=158;
     G.arcs[4][7]=G.arcs[7][4]=527;
     G.arcs[4][8]=G.arcs[8][4]=534;
     G.arcs[5][6]=G.arcs[6][5]=688;
     G.arcs[5][7]=G.arcs[7][5]=561;
     G.arcs[5][8]=G.arcs[8][5]=603;
     G.arcs[6][7]=G.arcs[7][6]=428;
     G.arcs[6][8]=G.arcs[8][6]=329;
     G.arcs[6][9]=G.arcs[9][6]=547;
     G.arcs[7][8]=G.arcs[8][7]=254;
     G.arcs[8][11]=G.arcs[11][8]=421;
     G.arcs[8][17]=G.arcs[17][8]=879;
     G.arcs[9][10]=G.arcs[10][9]=178;
     G.arcs[10][11]=G.arcs[11][10]=213;
     G.arcs[10][12]=G.arcs[12][10]=114;
     G.arcs[12][13]=G.arcs[13][12]=415;
     G.arcs[13][14]=G.arcs[14][13]=104;
     G.arcs[13][16]=G.arcs[16][13]=427;
     G.arcs[13][15]=G.arcs[15][13]=576;
     G.arcs[14][17]=G.arcs[17][14]=688;
     G.arcs[15][16]=G.arcs[16][15]=213;
     G.arcs[16][17]=G.arcs[17][16]=214;
 }
 
 /**
 展示校园地图 
 **/
 void Map()
 {
  printf("\n\n\n");
  printf("  **************************河南财经政法大学*******************************");
  printf("\n\n\n");
  printf("                               ------------------------15游泳池        \n");
  printf("                               |                          |            \n");
  printf("                               |                          |            \n");
  printf("   12洗浴中心----------------13骊绣苑---------------------16主田径场   \n");
  printf("       |                       |                          |            \n");
  printf("   10超市----11榴馨苑          14综合楼                   |            \n");
  printf("    |          |                |----------------------17综合文体馆    \n");
  printf("   9开水房     |                                            |          \n");
  printf("    |          ------------8图书馆--------------------------|          \n");
  printf("    |                          |                            |          \n");
  printf("    |-------------6实验楼------|--------7三号教学楼         |          \n");
  printf("                     |         |              |             |          \n");
  printf("                     |         |              |             |          \n");
  printf("              4一号教学楼------|--------5二号教学楼         |          \n");
  printf("                               |                            |          \n");
  printf("                               |                            |          \n");
  printf("                               |---2行政楼---------------3北区         \n");
  printf("                               |                                       \n");
  printf("                               |                                       \n");
  printf("                              1大门口                                  \n"); 
}

 /**
 介绍校园各景点概况 
 **/
 void Info(int sight_num,char data[][200])
{
    if(sight_num==1)
        puts(data[1]);
    if(sight_num==2)
        puts(data[2]);
    if(sight_num==3)
        puts(data[3]);
    if(sight_num==4)
        puts(data[4]);
    if(sight_num==5)
        puts(data[5]);
    if(sight_num==6)
        puts(data[6]);
    if(sight_num==7)
        puts(data[7]);
    if(sight_num==8)
        puts(data[8]);
    if(sight_num==9)
        puts(data[9]);
    if(sight_num==10)
        puts(data[10]);
    if(sight_num==11)
        puts(data[11]);
    if(sight_num==12)
        puts(data[12]);
    if(sight_num==13)
        puts(data[13]);
    if(sight_num==14)
        puts(data[14]);
    if(sight_num==15)
        puts(data[15]);
    if(sight_num==16)
        puts(data[16]);
    if(sight_num==17)
        puts(data[17]);
    if(sight_num==18)
        puts(data[18]);
    if(sight_num==19)
        puts(data[19]);
    if(sight_num==20)
        puts(data[20]);
    if(sight_num==21)
        puts(data[21]);
    if(sight_num==22)
        puts(data[22]);
    if(sight_num==23)
        puts(data[23]);
    if(sight_num==24)
        puts(data[24]);
    if(sight_num==25)
        puts(data[25]);
}

/**
开始菜单 
**/
int Menu()
{
    int c;
    Map();
    printf("\t\t欢迎使用河南财经政法大学导航图系统\n");
    printf("\t\t 1.查询地点路径 \n");
    printf("\t\t 2.地点信息简介 \n");
    printf("\t\t 3.退出 \n");
    printf("  **************************河南财经政法大学*******************************\n");
    printf("请输入您的选择:");
    scanf("%d",&c);
    return c;
}

/**
地图的导航功能 
**/

 /**
 输出任意两点之间的最短路径 
 **/
 void guide_Dispath_two(MGraph g,int dist[],int path[],int S[],int v,int i)//v为起点,i为终点 
 {
     int apath[NUM],d=0;             //存放一条最短的路径以及顶点个数(路径中终点为首)
    int j,k;                          //k用来存放终点的前面的节点 
    
    if(S[i]==1 && i!=v)
    {
        printf("从顶点%d到顶点%d的路径长度为:%d\t路径为:",v,i,dist[i]);
        apath[d]=i;                //把终点放在数组中的首位
        k=path[i];
        
        if(k==-1)
            printf("无路径");
            
        /**
        利用循环将最短路径中的各节点存入apath数组 
        **/
        else
        {
            while(k!=v)
            {
                d++;
                apath[d]=k;
                k=path[k];
            }
        }
        d++; apath[d]=v;         //将起点添加进去
        printf("%d",apath[d]);   //输出起点
        for(j=d-1;j>=0;j--)
        {
            printf("->%d",apath[j]); //循环输出最短路径中的各节点 
        }            
    } 
 }

//以编号为v的顶点为起点,w为终点 
void guide_Dijkstra(MGraph g,int v,int w)
{
    int dist[NUM],path[NUM];
    int S[NUM];                         //S[i]=1表示顶点i在S中,S[i]=0表示顶点i在U中
    int MINdis,i,j,u;
    for(i=1;i<=g.vexnum;i++)
    {
        dist[i]=g.arcs[v][i];           //距离初始化(距顶点v的距离) 
        S[i]=0;                         //S[]置空
        if(g.arcs[v][i]<INFINITY)       //路径初始化
            path[i]=v;                  //顶点v到顶点i有边时,置顶点i的前一个顶点为顶点v 
        else
            path[i]=-1;                 //顶点v到顶点i没边时,置顶点i的前一个顶点为-1 
     }
     S[v]=1;path[v]=0;                  //源点编号v放入S中
     for(i=1;i<=g.vexnum-1;i++)          //循环直到所有顶点的最短路径都求出 
     {
         MINdis=INFINITY;                //MINdis置最大长度初值
         for(j=1;j<=g.vexnum;j++)       //选取不在S中(即U中)且具有最小最短路径长度的顶点u 
         {
             if(S[j]==0 && dist[j]<MINdis)
             {
                 u=j;
                 MINdis=dist[j];
             }
         }
             S[u]=1;                   //顶点u加入S中
             for(j=1;j<=g.vexnum;j++)  //修改不在S中(即U中)的顶点的最短路径 
             {
                 if(S[j]==0)
                     if(g.arcs[u][j]<INFINITY && dist[u]+g.arcs[u][j]<dist[j])
                     {
                         dist[j]=dist[u]+g.arcs[u][j];
                         path[j]=u;
                     }
              }  
      }
      
      guide_Dispath_two(g,dist,path,S,v,w); //输出最短路径 
 }
 /**
 将文件中的景点信息载入数组 
 **/
 void load_sight_data(char data[][200],MGraph g)
{
    FILE *fp;
    int i;
    
    if((fp=fopen("C:\\Users\\admin\\Desktop\\导航\\sight_data.txt","r"))==NULL){
        printf("File can't open");
        return;
    }

    for(i=1;i<=g.vexnum;i++)
    {
        fgets(data[i],200,fp);
    }
    fclose(fp);
}

/**
修改景点信息 
**/
void change_sight_data(char user_change_data[200],MGraph g)
{
    FILE *fin,*ftp;
    int i;
    fin=fopen("C:\\Users\\admin\\Desktop\\导航\\sight_data.txt","r");//读打开原文件 
    ftp=fopen("C:\\Users\\admin\\Desktop\\导航\\temp.txt","w");//写打开临时文件
    if(fin==NULL || ftp==NULL)
    {
        printf("打开文件失败");
        return; 
     }
     
    for(i=1;i<=g.vexnum;i++)
    {
        char change_data[200];
        fgets(change_data,200,fin);
        if(change_data[0]==user_change_data[0] && change_data[1]==user_change_data[1])
        {
            fputs(user_change_data,ftp);//而用fputs直接将user_change_data直接写入文件没有换行符,需要添加换行符 
            fprintf(ftp,"\n");
        }
        else
        {
            fputs(change_data,ftp);//在使用fgets函数得到change_data数组时换行符会被保存,此处不需要加换行符 
        }
    }
    fclose(fin);
    fclose(ftp);
    remove("C:\\Users\\admin\\Desktop\\导航\\sight_data.txt");
    rename("C:\\Users\\admin\\Desktop\\导航\\temp.txt","C:\\Users\\admin\\Desktop\\导航\\sight_data.txt");
}

/**
增添景点到文件内 
**/
void add_sight_data(char change_data[200],MGraph g)
{
    FILE *fp;
    if((fp=fopen("C:\\Users\\admin\\Desktop\\导航\\sight_data.txt","a"))==NULL){
        printf("File can't open");
        return;
    }
    fprintf(fp,"\n");
    fputs(change_data,fp);
    fprintf(fp,"\n");
    rewind(fp);
    
    fclose(fp);
 }
 
 /**
 修改密码,保存到密码文件中 
 **/
 void change_password(char password[30])
 {
     FILE *fp;
     fp=fopen("C:\\Users\\admin\\Desktop\\导航\\password_temp.txt","w");
    if(fp==NULL)
    {
        printf("打开文件失败");
        return; 
     }
     
     fputs(password,fp);
     fclose(fp);
     remove("C:\\Users\\admin\\Desktop\\导航\\password.txt");
     rename("C:\\Users\\admin\\Desktop\\导航\\password_temp.txt","C:\\Users\\admin\\Desktop\\导航\\password.txt");
  }
  
  /**
   将密码装进密码数组中 
  **/
 void load_password(char password[30])
  {
      FILE *fp;
      if((fp=fopen("C:\\Users\\admin\\Desktop\\导航\\password.txt","r"))==NULL){
        printf("File can't open");
        return;
    }
    
    fgets(password,30,fp);
    
    fclose(fp);
 } 
 
 int admin_Menu()
 {
     int c;
    printf("**************管理系统****************\n"); 
    printf("\t\t欢迎使用管理员操作系统\n");
     printf("1.修改登录密码\n");
    printf("2.添加新景点\n");
    printf("3.修改景点信息\n");
    printf("4.新建景点路径\n");
    printf("5.退出\n");
    printf("**************************************\n");
    printf("请输入您的选择:");
    scanf("%d",&c);
    return c; 
     
 }
 
int main()
{
    GreateMGraph(17);
    char sight_data[NUM][200];
    char password[30];
    int choice;
    int Menu_choice;
    int start,end;
    do
    {
        printf("欢迎使用河南财经政法大学导航系统\n");
        printf("请问您的身份是:1.管理员  2.游客  3.退出\n");
        scanf("%d",&choice);
        if(choice==2)
        {
            do
            {    
                Menu_choice=Menu();
                if(Menu_choice==1)
                {
                    printf("请输入您现在的位置:");
                    scanf("%d",&start);
                    printf("\n");
                    printf("请输入您想要到达的位置:");
                    scanf("%d",&end);
            
                    guide_Dijkstra(G,start,end); 
                }
                if(Menu_choice==2)
                {
                    int sight_num;
                    load_sight_data(sight_data,G);
                    printf("请输入您要查询的景点编号:");
                    scanf("%d",&sight_num);
                    Info(sight_num,sight_data);
                }
                if(Menu_choice==3)
                {
                    break;
                }
            
            }while(1);
        }
    
        if(choice==1)
        { 
            getchar();
            load_password(password);
            char user_input_psw[30];
            printf("请输入管理员登录密码:");
            gets(user_input_psw);
            if(strcmp(password,user_input_psw)==0)
            {
                 printf("密码正确!\n"); 
                int admin_choice;
                 do
                 {
                     admin_choice=admin_Menu();
                     
                     if(admin_choice==1)
                     {
                        getchar();
                        char user_change_psw[30];
                        printf("请输入新的密码:\n"); 
                         gets(user_change_psw);
                        change_password(user_change_psw);
                        load_password(password);
                        printf("密码修改成功!\n"); 
                     }
                     if(admin_choice==2)
                     {
                         getchar();
                         char uadd_sight_data[200];
                        printf("请输入您要添加的景点以及该景点信息:\n");
                        gets(uadd_sight_data);
                        add_sight_data(uadd_sight_data,G);
                        load_sight_data(sight_data,G);
                        G.vexnum++;
                        
                        char *p;
                        p=strtok(uadd_sight_data," ");
                        p=strtok(NULL," ");
                        G.vex[G.vexnum].number=G.vexnum;
                        G.vex[G.vexnum].sight=p;
                        
                        printf("添加成功!\n"); 
                     }
                     if(admin_choice==3)
                     {
                         getchar();
                         char user_sight_data[200];
                         printf("请输入您要修改的景点信息:\n");
                         gets(user_sight_data);
                         change_sight_data(user_sight_data,G);
                         load_sight_data(sight_data,G);
                         printf("修改成功!\n");
                     }
                     if(admin_choice==4)
                     {
                         int new_start,new_end;
                         int length;
                         printf("请输入您想要在哪两点之间添加路线:\n");
                         printf("起点:");
                        scanf("%d",&new_start);
                        printf("\n");
                        printf("终点:");
                        scanf("%d",&new_end);
                        printf("请输入两顶点之间的距离:\n");
                        scanf("%d",&length);
                        printf("\n");
                        
                        G.arcs[new_start][new_end]=G.arcs[new_end][new_start]=length;
                        printf("路线添加成功!\n"); 
                     }
                     if(admin_choice==5)
                     {
                         break;
                     }
                 }while(1);
             }
         
             if(strcmp(password,user_input_psw)!=0)
             {
                 printf("密码错误! \n"); 
              } 
         }
         
         if(choice==3)
         {
             break;
          } 
    }while(1);
    
    return 0; 
 } 

password.txt文件用来存放密码
sight_data.txt文件用来存放景点信息:

1 大门口 出入学校的必经之路
2 行政办公楼 学校最气派的建筑之一
3 北区 金工实训中心,还有几排具有历史沧桑感的教室
4 一号教学楼 主要有小教室,用来上英语课和专业课
5 二号教学楼 主要用来上专业课,五六楼有语音室
6 实验楼 学生上各种实验课的地点
7 三号教学楼 有大教室,一般安排用来上基础课
8 图书馆 学校为同学们提供学习和自习的地方,也是学校的藏书最多的地方
9 开水房 学校唯一一个为同学提供热水的地点
10 超市 学校唯一一个中型超市,在这里可以买到各种生活用品
11 榴馨苑 环境较好的学生食堂,这里因为离女生公寓较近,所以这个食堂女生较多
12 洗浴中心 环境还行就是规模太小,每天都是供不应求
13 骊秀苑 主要经营面食。我校的物美价廉的食堂,位于男生公寓区,大部分男生在此就餐
14 综合楼 历史较为悠久的一栋教学楼,旁边有学生第二俱乐部,学校的晚会都在这里举行
15 游泳池 大一学生上游泳课的地点
16 主田径场 标准的400m跑道,学生上室外体育课的地点
17 综合文体馆:上室内体育课的地方,是新建成的较为气派

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

相关教程

  • C语言扫雷游戏实例代码

    这篇文章主要为大家详细介绍了C语言代码实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    发布时间:2021-06-02

  • c语言和python之间有什么区别

    c语言和python之间有什么区别

    为网友们分享了关于python的教程,c语言和python之间的主要区别是:Python是一种面向对象的解释型语言,通过缩进来表示语句体,在Python中每一条语句结尾后没有分号;C是一种面向过程的编译型语言,通过{}来表示语句体,C语言

    发布时间:2022-06-22

  • C语言 实现归并排序算法

    C语言 实现归并排序算法

    为网友们分享了关于C语言的教程,这篇文章主要介绍了C语言 实现归并排序算法的相关资料,需要的朋友可以参考下

    发布时间:2022-06-26

  • C语言原码、反码、补码和移码知识点总结

    这篇文章主要介绍了C语言基础 原码、反码、补码和移码详解的相关资料,需要的朋友可以参考下

    发布时间:2021-06-02

  • C语言中send()函数和sendto()函数的使用方法

    给网友们整理关于C语言的教程,这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下

    发布时间:2022-06-27

  • c语言构建一个静态二叉树实现方法

    下面小编就为大家带来一篇c语言_构建一个静态二叉树实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    发布时间:2022-04-04

  • c语言中malloc、realloc与calloc 的区别以及联系

    给大家整理了关于c语言的教程,以下是对c语言中的malloc函数,realloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下

    发布时间:2022-06-23

  • C语言文件操作总结

    本篇文章给大家通过代码示例讲述了C语言文件操作的相关知识点,对此有兴趣的朋友可以参考学习下。

    发布时间:2022-04-06

  • VScode上配置 c语言环境的图文教程

    这篇文章主要介绍了配置VScode c语言环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    发布时间:2022-04-16

  • 深度剖析C语言结构体

    给大家整理一篇关于C语言的教程,今天小编就为大家分享一篇关于深度剖析C语言结构体,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    发布时间:2022-07-25

用户留言