时间:2022-07-17 09:14:08 | 栏目:C代码 | 点击:次
本文实例为大家分享了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 综合文体馆:上室内体育课的地方,是新建成的较为气派