河北大学本部导航系统(c语言实现)


代码下载链接最底下也有源码。

一、功能:

本程序使用c语言,实现了河北大学本部的校园导航系统。具体功能有:

  1. 河北大学本部景点以及路径的表示。
  2. 登录程序,区分游客和管理员以提供不同的功能,实现密码的文件读取。
  3. 为游人提供任意景点相关信息查询。
  4. 游人提供任意景点的问路查询,即任意两个景点之间的最短路径。
  5. 为管理员提供图的编辑功能:增删景点;增删道路;修改已有信息等。

本程序使用的地图


二、结构:

开启管理员需要有“mima.txt”文件。

1.景点信息:

用邻接矩阵存储。

typedef struct Node *List;//节点

struct Node{

    char name[25];//名字

    char jianjie[120];//简介

    int x,y;

};

List L[100];//地点

int LX[100][100];//路径

int n;//个数

2.登陆函数:

    实现登录功能,退出返回0,游客返回1,管理员返回2。

    int denglu();

3.欢迎函数:

    根据id,输出对应欢迎信息。

    void huanying();

4.录入函数:

    录入所有节点和边的信息。

    void luru();

5.菜单函数:

    根据id输出对应菜单。

    void caidan();

 

6.查找函数:

       提供序号和名称的查找,输出找到的景点,根据x提供不同的功能1全部功能,其他不提供列出全部景点功能。返回-2退出,-1错误,其他数字都为查找到的序号。

    int chazhao(int x);

 

7.查询函数:

    循环调用具有全部功能的查找函数实现查询。

    void chaxun();

8.导航函数:

    用Floyd算法,求出所有顶点间最短路径,再通过查找函数得到需要查找的两个顶点。

    void daohang();

9.修改函数:

    修改、增删景点、边,以及重置所有信息。管理员专用。

    void xiugai();

10.清屏功能

    system("CLS");


三、代码:

ps:一定记着再同一目录下放置mima.txt文件,才能开始管理员。

      本部去的少,不太了解,想帮忙写简介的可以私信或者我,谢谢。

#include<stdio.h>
#include<math.h>
//在同一目录下放置“mima.txt"文件,内容为123456789,开始管理员
typedef struct Node *List;//节点
struct Node{
    char name[25];//名字
    char jianjie[120];//简介
    int x,y;
};
int id=0;//身份
List L[100];//地点
int LX[100][100];//路径
int n;//个数
int denglu()
{
    int i;
    FILE *f;
        printf("\n-=欢迎进入校园导航管理系统=-\n\n");
    while(i)
    {
        printf("1.游客\t2.管理员\n0.退出\n");
        printf("请选择:");
        scanf("%d",&i);
        switch(i)
        {
        case 0:
            return 0;
        case 1:
            return 1;
        case 2:
            if ((f = fopen("mima.txt", "r")) == NULL)
            {
                printf("文件错误,请返回选择游客登陆。");
                break;
            }
            char x[21],y[21];
            fgets(x,20,f);
            printf("请输入密码:");
            scanf("%s",y);
            if(!strcmp(x,y))
            {
                return 2;
            }
            printf("密码错误。\n");
            break;
        default:
            i=1;
            printf("无效输入,请重新选择。\n");
        }
    }
}
void huanying()
{
    if(id==0)
        exit(0);
    else if(id==1)
        printf("欢迎游客登录\n");
    else if(id==2)
        printf("欢迎管理员登录\n");
}
void caidan()
{
    printf("\n\n--------=校园导航菜单=---------\n\n");
    printf("1.查询功能\n");
    printf("2.导航功能\n");
    if(id==2)
    {
        printf("3.编辑功能\n");
    }
    printf("9.清屏功能\n");
    printf("0.退出功能\n");
    printf("请选择功能:");
}
void luru()
{
    List l;
    int i,j;
    for(i=0;i<100;i++)
    {
        l=(List)malloc(sizeof(struct Node));
        L[i]=l;
    }
    n=31;
    strcpy(L[0]->name,"校医院");
    strcpy(L[0]->jianjie,"无");
    strcpy(L[1]->name,"生科院");
    strcpy(L[1]->jianjie,"无");
    strcpy(L[2]->name,"建工学院");
    strcpy(L[2]->jianjie,"无");
    strcpy(L[3]->name,"理化中心");
    strcpy(L[3]->jianjie,"无");
    strcpy(L[4]->name,"逸夫楼");
    strcpy(L[4]->jianjie,"无");
    strcpy(L[5]->name,"宿舍梅园6号");
    strcpy(L[5]->jianjie,"无");
    strcpy(L[6]->name,"宿舍梅园3、4、5号");
    strcpy(L[6]->jianjie,"无");
    strcpy(L[7]->name,"宿舍梅园2号");
    strcpy(L[7]->jianjie,"无");
    strcpy(L[8]->name,"北院餐厅");
    strcpy(L[8]->jianjie,"无");
    strcpy(L[9]->name,"篮球场,网球场");
    strcpy(L[9]->jianjie,"无");
    strcpy(L[10]->name,"操场");
    strcpy(L[10]->jianjie,"无");
    strcpy(L[11]->name,"学生宿舍梅园1号");
    strcpy(L[11]->jianjie,"无");
    strcpy(L[12]->name,"化学学院");
    strcpy(L[12]->jianjie,"无");
    strcpy(L[13]->name,"电信学院");
    strcpy(L[13]->jianjie,"无");
    strcpy(L[14]->name,"物理学院");
    strcpy(L[14]->jianjie,"无");
    strcpy(L[15]->name,"竟学楼");
    strcpy(L[15]->jianjie,"无");
    strcpy(L[16]->name,"南2门口");
    strcpy(L[16]->jianjie,"无");
    strcpy(L[17]->name,"南1门口");
    strcpy(L[17]->jianjie,"无");
    strcpy(L[18]->name,"北1门口");
    strcpy(L[18]->jianjie,"无");
    strcpy(L[19]->name,"北2门口");
    strcpy(L[19]->jianjie,"无");
    strcpy(L[20]->name,"文苑楼");
    strcpy(L[20]->jianjie,"无");
    strcpy(L[21]->name,"南院餐厅");
    strcpy(L[21]->jianjie,"无");
    strcpy(L[22]->name,"第八教学楼");
    strcpy(L[22]->jianjie,"无");
    strcpy(L[23]->name,"第七教学楼");
    strcpy(L[23]->jianjie,"无");
    strcpy(L[24]->name,"综合教学楼");
    strcpy(L[24]->jianjie,"无");
    strcpy(L[25]->name,"图书馆");
    strcpy(L[25]->jianjie,"无");
    strcpy(L[26]->name,"多功能馆");
    strcpy(L[26]->jianjie,"无");
    strcpy(L[27]->name,"第九教学楼");
    strcpy(L[27]->jianjie,"无");
    strcpy(L[28]->name,"主楼");
    strcpy(L[28]->jianjie,"无");
    strcpy(L[29]->name,"毓秀园");
    strcpy(L[29]->jianjie,"无");
    strcpy(L[30]->name,"国际交流学院");
    strcpy(L[30]->jianjie,"无");
    for(i=0;i<100;i++)
    {
        for(j=0;j<100;j++)
        {
            LX[i][j]=108000000;
        }
    }
    LX[0][1]=LX[1][0]=82;
    LX[1][2]=LX[2][1]=111;
    LX[1][4]=LX[4][1]=92;
    LX[2][3]=LX[3][2]=80;
    LX[2][8]=LX[8][2]=84;
    LX[2][12]=LX[12][2]=91;
    LX[3][4]=LX[4][3]=105;
    LX[4][12]=LX[12][4]=178;
    LX[4][16]=LX[16][4]=93;
    LX[5][6]=LX[6][5]=92;
    LX[5][9]=LX[9][5]=49;
    LX[5][8]=LX[8][5]=44;
    LX[6][7]=LX[7][6]=20;
    LX[6][9]=LX[9][6]=20;
    LX[7][10]=LX[10][7]=10;
    LX[7][11]=LX[11][7]=134;
    LX[8][9]=LX[9][8]=25;
    LX[8][12]=LX[12][8]=114;
    LX[8][13]=LX[13][8]=102;
    LX[9][10]=LX[10][9]=5;
    LX[9][13]=LX[13][9]=15;
    LX[10][11]=LX[11][10]=10;
    LX[10][13]=LX[13][10]=70;
    LX[12][13]=LX[13][12]=108;
    LX[12][14]=LX[14][12]=57;
    LX[13][15]=LX[15][13]=115;
    LX[14][15]=LX[15][14]=53;
    LX[14][16]=LX[16][14]=179;
    LX[14][17]=LX[17][14]=59;
    LX[15][17]=LX[17][15]=56;
    LX[16][17]=LX[17][16]=202;
    LX[16][18]=LX[18][16]=37;
    LX[17][19]=LX[19][17]=39;
    LX[18][19]=LX[19][18]=210;
    LX[18][20]=LX[20][18]=60;
    LX[18][25]=LX[25][18]=134;
    LX[19][25]=LX[25][19]=77;
    LX[19][26]=LX[26][19]=96;
    LX[19][28]=LX[28][19]=114;
    LX[20][21]=LX[21][20]=93;
    LX[20][22]=LX[22][20]=44;
    LX[21][22]=LX[22][21]=75;
    LX[21][23]=LX[23][21]=150;
    LX[21][24]=LX[24][21]=110;
    LX[22][24]=LX[24][22]=42;
    LX[22][27]=LX[27][22]=87;
    LX[23][24]=LX[24][23]=144;
    LX[24][27]=LX[27][24]=73;
    LX[24][30]=LX[30][24]=169;
    LX[25][27]=LX[27][25]=78;
    LX[26][28]=LX[28][26]=91;
    LX[27][28]=LX[28][27]=190;
    LX[27][29]=LX[29][27]=20;
    LX[27][30]=LX[30][27]=167;
    LX[28][29]=LX[29][28]=20;
    LX[29][30]=LX[30][29]=139;
}
void chaxun()//查询,大功能
{
    int c=1;
    printf("\n\n---------=查询功能=----------\n");
    while(c!=-2)
    {
        c=chazhao(1);
    }
}
int chazhao(int x)//查找,子功能,退出-2,其他-1,返回找到的序号。
{
    int c=1;
    int i,j;
    char s[25];
    printf("\n1.序号查询\n2.名称查询\n");
    if(x==1)
        printf("3.所有景点\n");
    printf("0.退出\n");
    printf("请选择查询方式:");
    scanf("%d",&c);
    switch(c)
    {
        case 0:
            return -2;
            break;
        case 1:
            printf("请输入序号:");
            scanf("%d",&c);
            if(c>=n||c<0)
            {
                printf("序号为%d的景点不存在\n",c);
                return -1;
            }
            printf("\n序号\t\t   名称\t\t简介\n");
            printf("%02d\t%17s\t%s\n",c,L[c]->name,L[c]->jianjie);
            printf("相邻景点序号:");
            for(i=0;i<n;i++)
            {
                if(i!=c&&LX[c][i]<100000)
                {
                    printf(" %02d ",i);
                }
            }
            printf("\n");
            return c;
        case 2:
            c=-1;
            printf("请输入名称:");
            scanf("%s",s);
            for(i=0;i<n;i++)
            {
                if(strcmp(L[i]->name,s)==0)
                {
                    c=i;
                    break;
                }
            }
            if(c==-1)
            {
                printf("名称为“%s”的景点不存在\n",s);
                return -1;
            }
            printf("\n序号\t\t   名称\t\t简介\n");
            printf("%02d\t%17s\t%s\n",c,L[c]->name,L[c]->jianjie);
            printf("相邻景点序号:");
            for(i=0;i<n;i++)
            {
                if(i!=c&&LX[c][i]<100000)
                {
                    printf(" %02d ",i);
                }
            }
            printf("\n");
            return c;
            break;
        case 3:
            if(x==1)
            {
                printf("\n序号\t\t   名称\t\t简介\n");
                for(c=0;c<n;c++)
                {
                    printf("%02d\t%17s\t%s",c,L[c]->name,L[c]->jianjie);
                    printf("\t\t\t相邻景点序号:");
                    for(i=0;i<n;i++)
                    {
                        if(i!=c&&LX[c][i]<100000)
                        {
                            printf(" %02d ",i);
                        }
                    }
                    printf("\n");
                }
                return 1;
                break;
            }
        default:
            printf("无效选择。\n");
            if(x==1)
                return 1;
            return -1;
        }
}
void daohang()
{
    printf("\n\n---------=导航功能=----------\n\n");
    int c=1,i,j,k,tmp,path[n+5][n+5],dist[n+5][n+5];
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            dist[i][j]=LX[i][j];
            path[i][j]=j;
        }
    }
    for(k=0;k<n;k++)
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                tmp=dist[i][k]+dist[k][j];
                if(dist[i][j]>tmp)
                {
                    dist[i][j]=tmp;
                    path[i][j]=k;
                }
            }
        }
    }
    while(c)
    {
        printf("\n1.开始导航:\n0.退出\n");
        printf("请选择功能:");
        scanf("%d",&c);
        switch(c)
        {
            case 0:
            break;
            case 1:
                printf("\n第一个节点:");
                i=chazhao(0);
                if(i<0)
                    break;
                printf("\n第二个节点:");
                j=chazhao(0);
                if(j<0)
                    break;
                if(i==j)
                {
                    printf("只缘身在此山中,你已经在要到的景点了。");
                    break;
                }
                printf("(%02d):[%s]到(%02d):[%s]的最短路径长度为:%d\n",
                       i,L[i]->name,j,L[j]->name,dist[i][j]);
                if(dist[i][j]>100000)
                {
                    printf("\n这么远去那里是要西天取经?\n");
                    break;
                }
                c=i;i=j;j=c;
                printf("路径为: %02d ",j);
                if(path[i][j]==j)
                    printf(" %02d \n",i);
                else
                {
                    k=j;
                    while(path[i][k]!=k)
                    {
                        k=path[i][k];
                        printf(" %02d ",k);
                    }
                    printf(" %02d \n",i);
                }
                c=1;
                break;
            default:
                printf("无效选择。\n");
                break;
        }
    }
}
void xiugai()
{
    int c=1,i,j;
    char s[25];
    printf("\n\n---------=修改功能=----------\n\n");
    while(c)
    {
        printf("\n修改功能:\n1.增删景点\n2.增删道路\n3.修改景点信息\n4.重置信息\n0.退出\n");
        printf("请选择功能:");
        scanf("%d",&c);
        switch(c)
        {
            case 1:
                while(c)
                {
                    printf("\n增删景点:\n");
                    printf("1.增加景点\n2.删除景点\n0.退出\n");
                    scanf("%d",&c);
                    switch(c)
                    {
                        case 0:
                            break;
                        case 1:
                            printf("\n请输入要创建景点名:");
                            scanf("%s",s);
                            c=-1;
                            for(i=0;i<n;i++)
                            {
                                if(strcmp(L[i]->name,s)==0)
                                {
                                    c=i;
                                    break;
                                }
                            }
                            if(c!=-1)
                            {
                                printf("“%d”号景点与该景点名重复\n",c);
                                break;
                            }
                            List l=(List)malloc(sizeof(struct Node));
                            strcpy(l->name,s);
                            printf("请输入简介:");
                            scanf("%s",l->jianjie);
                            printf("\n序号\t\t   名称\t\t简介\n");
                            printf("\n%02d\t%17s\t%s",n,l->name,l->jianjie);
                            printf("\n输入1确定创建该景点:");
                            scanf("%d",&i);
                            if(i==1)
                            {
                                L[n]=l;
                                n++;
                                printf("景点已创建\n");
                            }
                            else
                                free(l);
                            c=1;
                            break;
                        case 2:
                            printf("\n查询景点:");
                            c=chazhao(0);
                            if(c<0)
                                break;
                            printf("输入1确定删除('%02d')景点:",c);
                            scanf("%d",&i);
                            if(i==1)
                            {
                                n--;
                                for(i=c;i<=n;i++)
                                {
                                    L[i]=L[i+1];
                                    for(j=0;j<=n;j++)
                                    {
                                        LX[i][j]=LX[i+1][j];
                                    }
                                }
                                for(i=0;i<=n;i++)
                                    for(j=c;j<=n;j++)
                                    {
                                        LX[i][j]=LX[i][j+1];
                                    }
                            }
                            c=1;
                            break;
                        default:
                            printf("无效选择。\n");
                            break;
                    }
                }
                c=1;
                break;
            case 2:
                while(c)
                {
                    printf("\n增删道路:\n");
                    printf("1.增加、修改道路\n2.删除道路\n0.退出\n");
                    scanf("%d",&c);
                    switch(c)
                    {
                        case 0:
                            break;
                        case 1:
                            printf("第一个节点:");
                            i=chazhao(0);
                            if(i<0)
                                break;
                            printf("第二个节点:");
                            j=chazhao(0);
                            if(j<0)
                                break;
                            if(i==j)
                            {
                                printf("不能改变景点到自己的距离\n");
                                break;
                            }
                            printf("\n输入距离:");
                            scanf("%d",&c);
                            if(c<0||c>100000)
                            {
                                printf("道路长度有误(过长|过短)\n");
                                c=1;
                                break;
                            }
                            LX[i][j]==c;
                            printf("道路已创建。(过长的道路不认为生效)\n");
                            c=1;
                            break;
                        case 2:
                            printf("\n第一个节点:");
                            i=chazhao(0);
                            if(i<0)
                                break;
                            printf("\n第二个节点:");
                            j=chazhao(0);
                            if(j<0)
                                break;
                            if(i==j)
                            {
                                printf("不能改变景点到自己的距离\n");
                                break;
                            }
                            if(LX[i][j]>10000)
                            {
                                printf("两景点之间已经%d米了\n",LX[i][j]);
                                break;
                            }
                            printf("输入1确定删除从%02d->%02d的道路%d米:",i,j,LX[i][j]);
                            scanf("%d",&c);
                            if(c==1)
                            {
                                LX[i][j]=LX[j][i]=108000000;
                                printf("%02d->%02d现在距离%d米\n",i,j,LX[i][j]);
                            }
                            c=1;
                            break;
                        default:
                            printf("无效选择。\n");
                            break;
                    }
                }
                c=1;
                break;
            case 3:
                j=1;
                while(j)
                {
                    printf("\n修改信息:\n");
                    printf("\n查询景点:");
                    c=chazhao(0);
                    if(c==-2)
                        break;
                    if(c==-1)
                        continue;
                    printf("1.修改名称\n2.修改简介\n0.退出\n");
                    scanf("%d",&j);
                    switch(j)
                    {
                        case 0:
                            break;
                        case 1:
                            printf("输入新名称:");
                            scanf("%s",s);
                            j=-1;
                            for(i=0;i<n;i++)
                            {
                                if(strcmp(L[i]->name,s)==0)
                                {
                                    j=i;
                                    break;
                                }
                            }
                            if(j!=-1)
                            {
                                printf("“%d”号景点与该景点名重复\n",j);
                                break;
                            }
                            printf("输入1确定修改('%02d')[%s]景点:",c,L[c]->name);
                            scanf("%d",&i);
                            if(i==1)
                            {
                                strcpy(L[c]->name,s);
                                printf("('%02d')[%s]景点名已修改",c,L[c]->name);
                            }
                            j=1;
                            break;
                        case 2:
                            printf("输入新简介:");
                            scanf("%s",L[c]->jianjie);
                            printf("('%02d')[%s]景点简介:“%s”已修改",c,L[c]->name,L[c]->jianjie);
                            j=1;
                            break;
                        default:
                            printf("无效选择。\n");
                            j=1;
                            break;
                    }
                }
                c=1;
                break;
            case 4:
                luru();
                printf("已重置\n");
                c=1;
                break;
            default:
                printf("无效选择。\n");
                break;
        }
    }
}
int main()
{
    id=denglu();//登录返回1游客,2管理员。
    huanying();//欢迎语句。
    luru();
    int x;
    while(x)
    {
        caidan();
        scanf("%d",&x);
        switch(x)
        {
            case 0:
                printf("再次输入0确定退出,否则返回。\n输入:");
                scanf("%d",&x);
                break;
            case 1:
                chaxun();
                break;
            case 2:
                daohang();
                break;
            case 3:
                if(id==1)
                {
                    printf("%d是无效功能。\n",x);
                    break;
                }
                xiugai();
                break;
            case 9:
                system("CLS");
                break;
            default:
                printf("%d是无效功能。\n",x);
                break;
        }
    }
	return 0;
}


  • 7
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值