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="综合文体馆";
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("无路径");
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 综合文体馆:上室内体育课的地方,是新建成的较为气派
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341