C语言 数据结构——校园导游咨询系统

【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【功能要求】

(1)设计学校的校园景点不少于10个,以图中顶点表示校内各景点,存放景点名称、编号、简介等信息;以边表示路径,边长表示两个景点的距离。景点数据要求从文件中导入,以备重复使用。

(2)为来访客人提供图中任意景点相关信息的查询。

(3)为来访客人提供问路查询,即查询两个景点间的最短路径及长度。

输入数据从文件中导入初始文本数据,后缀为.txt。

界面要求有合理的中文提示,根据提示完成相关的功能要求。

存储结构图的存储。

测试数据不合规则的查询或业务数据应报错(如不存在的景点)。至少要求三组以上的测试数据,测试数据及测试结果(需要截屏)需要在报告中详细说明。

本人是个菜鸡,这篇是我做题的过程,给萌新们做些分享,若有不足或错误之处,请指正。

经过百般搜索,各种bug的折磨,终于完成啦!!!

这是我的文件:链接:https://pan.baidu.com/s/1uJC0ps32QhLZl2Dh7Bs4FA
提取码:jg1g (PS:草图有点丑,表介意)

下面是我所用到的资料及自己写的程序

首先,我参考了下面两位大佬的程序

数据结构课设——校园导游咨询(图的应用)

数据结构课设–4校园导游咨询(图的应用)

不过,这道题与上面的两道有些不同之处,题中要求我们要从文件中导入数据,于是乎,我又找了以下的教程

首先,当然是万能的小破站啦!

C语言、16.1、文件、路径、打开、关闭 

C语言、16.2、fgets、fscanf、fread

下面是菜鸟教程上的文字解释

C 文件读写  C 语言实例 – 输出当前文件执行代码  C 库函数 – fgets()   C 库函数 – fscanf()

程序中涉及到最短路径的查找,可以用Dijkstra算法和Floyd算法,由于Floyd算法更简单,所以我采用Floyd算法

下面是我用到的资料

弗洛伊德(Floyd)算法求图的最短路径  算法:最短路径之弗洛伊德(Floyd)算法

导入的文件中有邻接矩阵图、信息、地图,其中,最关键的就是邻接矩阵,这里我们参考数据结构:图的存储结构之邻接矩阵中的图 7-4-4

这是我的邻接矩阵(用65535来代表无穷大(数据结构书上有))

写矩阵之前,要打个草稿,emmmm,我的确实够草,要注意哪些地方能通,哪些地方不能通,以及长度多少,这个自己要想清楚,不然后面会出很多bug

地图右边比较整齐是我用了空白字,而信息表没用(懒的改了~))

信息表

由于打印出来会错位,所以信息表右边那些点看起来乱

在读取info.txt和map.txt时,我发现它打印出来格式会乱,貌似是空格的问题?(求大佬科普)我通过输入空白字来解决,请在括号中复制(            )

下面附上我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 250

int map()//查看地图
{
	FILE *fp;
	char buf[SIZE]={0};//初始化
	char *map;
	char errcode;
	
	
	fp = fopen("map.txt","r");//打开文件
	if(fp == NULL) 
	{
      perror("打开文件时发生错误!");//若文件不存在
      return -1;
    }
    
    do {
    	map = fgets(buf,SIZE,fp);//读取文件内容
    	if(map == NULL)//读完文件后 
		{
			if(feof(fp))
			{
				fprintf(stderr,"%s\n","文件读取结束!");
			}
			else {//若异常输出错误原因
				errcode = ferror(fp);
				fprintf(stderr,"%s\n",strerror(errcode));
			} 
			fclose(fp);//关闭文件
  	    	system("pause");
     	 	return -1;
 	   }
 	   fprintf(stderr,"%s\n",buf);//输出文件内容
 		} while(map != NULL);
	
    fclose(fp);//关闭文件
    
    system("pause");
    return 0;
}

int info()//查看景点信息
{
	char errcode;
	int i,j,k,b;
	
	printf("\n"); 
	printf("1.西七教学楼 2.107广场 3. 西六教学楼 4.北门 5.民族餐厅\n");
	printf("6.西苑1号楼 7.西苑2号楼 8.西苑3号楼 9.一食堂 10.西苑4号楼\n");
	printf("\n"); 
	printf("请选择您要查询的景点的编号:");
	
	scanf("%d",&b);
	
	printf("\n"); 
	if(b<1||b>10)
	{
		printf("不存在该景点,请输入正确的景点编号!\n");
		system("pause");
    	return 0;
	}
	
	b+=2;//因为在info.txt中第三行开始才是景点信息
	
	FILE *fp;
	char buf[SIZE]={0};
	char *site;
	char errcode1;
	
	fp = fopen("info.txt","r");//打开文件
	if(fp == NULL) //若文件不存在
	{
      perror("打开文件时发生错误!");
      return -1;
    }
    
    for(i=1;i<14;i++)
    {
    	site = fgets(buf,SIZE,fp);//读取文件内容
    	if(site == NULL) 
		{
			if(feof(fp))
			{
				fprintf(stderr,"%s\n","文件读取结束!");
			}
			else {//若异常输出错误原因
				errcode = ferror(fp);
				fprintf(stderr,"%s\n",strerror(errcode1));
			} 
			fclose(fp);//关闭文件
  	    	system("pause");
     	 	return -1;
 	   }
 	   if(i==1)
 	   {
 	   	fprintf(stderr, "%s\n",site);
		} else if(i==2) {
			fprintf(stderr, "%s\n",site);
		} else if(i==b)
 	   {
 	   		fprintf(stderr, "%s\n",site);//输出游客想要查找的景点信息
		} else if(i==13){
			fprintf(stderr, "%s\n",site);
		}
  	  
	}
	
    fclose(fp);//关闭文件
    
    system("pause");
    return 0;
    
}

int road(int p[10][10],int di[10][10])//查找最短路径及路程
{
	int i,j,k;
	int x,y,q,w;
	int z[10][10];
	
	printf("\n"); 
	printf("1.西七教学楼 2.107广场 3. 西六教学楼 4.北门 5.民族餐厅\n");
	printf("6.西苑1号楼 7.西苑2号楼 8.西苑3号楼 9.一食堂 10.西苑4号楼\n");
	printf("\n"); 
	printf("请输入您的出发地和目的地:");
	
	scanf("%d %d",&x,&y); 
	
	if(x<1||x>10||y<0||y>10) //若查看景点不存在
	{
		printf("\n");
			printf("不存在该景点,请输入正确的景点编号!\n");
		system("pause");
    	return 0;
	}
	if(x==y)//若出发地与目的地相同
	{
		printf("\n"); 
		printf("		您已经位于该地点!\n");
		printf("\n"); 	
		system("pause");
    	return 0;
	}
	
	FILE *fp;
	
	fp = fopen("jz.txt","r");//打开文件
	if(fp == NULL) //若文件不存在
	{
      perror("打开文件时发生错误!");
      return -1;
    }
     
    for(i=0;i<10;i++)//读取文件内容
    {
    	for(j=0;j<10;j++)
    	{
    		fscanf(fp,"%d",&z[i][j]);
		}
	}
	
	//用floyd算法查找最短路径
	for(i=0;i<10;i++)//初始化di和p 
	{
		for(j=0;j<10;j++) 
		{
			di[i][j]=z[i][j];
			p[i][j]=j;
		}
	}
	//floyd算法的核心部分
	//k为中间点
	for(k=0;k<10;k++)
	{
		//i为起点
		for(i=0;i<10;i++)
		{
			//j为终点
			for(j=0;j<10;j++)
			{
				if(di[i][j]>(di[i][k]+di[k][j]))//如果有更短的路径
				{
					di[i][j]=di[i][k]+di[k][j];//更新最短路径
					p[i][j]=p[i][k];//更新最短路径的中间顶点
				}
			}
		}
	}
	printf("\n"); 
	switch (x)
		{
			case 1:printf("西七教学楼 到 ");break;
			case 2:printf("107广场 到 ");break;
			case 3:printf("西六教学楼 到 ");break;
			case 4:printf("北门 到 ");break;
			case 5:printf("民族餐厅 到 ");break;
			case 6:printf("西苑1号楼 到 ");break;
			case 7:printf("西苑2号楼 到 ");break;
			case 8:printf("西苑3号楼 到 ");break;
			case 9:printf("一食堂 到 ");break;
			case 10:printf("西苑4号楼 到 ");break;
		}
	
	switch (y)
		{
			case 1:printf("西七教学楼 的路径为:");break;
			case 2:printf("107广场 的路径为:");break;
			case 3:printf("西六教学楼 的路径为:");break;
			case 4:printf("北门 的路径为:");break;
			case 5:printf("民族餐厅 的路径为:");break;
			case 6:printf("西苑1号楼 的路径为:");break;
			case 7:printf("西苑2号楼 的路径为:");break;
			case 8:printf("西苑3号楼 的路径为:");break;
			case 9:printf("一食堂 的路径为:");break;
			case 10:printf("西苑4号楼的 路径为:");break;
		}
	//打印起点	
	switch (x)
		{
			case 1:printf("西七教学楼");break;
			case 2:printf("107广场");break;
			case 3:printf("西六教学楼");break;
			case 4:printf("北门");break;
			case 5:printf("民族餐厅");break;
			case 6:printf("西苑1号楼");break;
			case 7:printf("西苑2号楼");break;
			case 8:printf("西苑3号楼");break;
			case 9:printf("一食堂");break;
			case 10:printf("西苑4号楼");break;
		}
	
	q=x-1;//因为矩阵中是从0开始 
	w=y-1;
	//求起点到终点的最短路径	
	k=p[q][w];//中间点 
	while(k != w)
	{
		k++;//因为景点读取是从1开始 
		switch (k)//打印中间点
		{
			case 1:printf("—>西七教学楼");break;
			case 2:printf("—>107广场");break;
			case 3:printf("—>西六教学楼");break;
			case 4:printf("—>北门");break;
			case 5:printf("—>民族餐厅");break;
			case 6:printf("—>西苑1号楼");break;
			case 7:printf("—>西苑2号楼");break;
			case 8:printf("—>西苑3号楼");break;
			case 9:printf("—>一食堂");break;
			case 10:printf("—>西苑4号楼");break;
		}
		k--;//因为矩阵中是从0开始 
		k = p[k][w];//中间点 
	 } 
	 switch (y)//打印终点
		{
			case 1:printf("—>西七教学楼");break;
			case 2:printf("—>107广场");break;
			case 3:printf("—>西六教学楼");break;
			case 4:printf("—>北门");break;
			case 5:printf("—>民族餐厅");break;
			case 6:printf("—>西苑1号楼");break;
			case 7:printf("—>西苑2号楼");break;
			case 8:printf("—>西苑3号楼");break;
			case 9:printf("—>一食堂");break;
			case 10:printf("—>西苑4号楼");break;
		}
	
	printf("  路程为:%dm\n",di[q][w]); //打印路程
	
    system("pause");
    return 0;


}




int main()
{
	system("color e0");//设置程序背景及字体颜色 
	
	int a,c,d=1,e=1,f;
	int p[10][10],di[10][10];
	
	printf("     ★★★★★★★★★★★★★★★★★★★★\n");
	printf("     ★欢迎使用西南科技大学校园导游咨询系统★\n");
	printf("     ★★★★★★★★★★★★★★★★★★★★\n");
	begin:
	printf("     ————————————————————\n");
	printf("     |☆☆☆☆☆      主菜单      ☆☆☆☆☆|\n");
	printf("     |	     ①查看地图                     |\n");
	printf("     |	     ②查询景点信息                 |\n");
	printf("     |	     ③查询路程信息                 |\n");
	printf("     |	     ④退出系统                     |\n");
	printf("     ————————————————————\n");
	printf("     注:请输入数字1、2、3、4进行选择\n\n");
	printf("请选择您的服务:");
	scanf("%d",&a);
	if(a==2)
	{	
		info();
		while(d)//在景点信息查询服务中循环或跳出
		{
			infob:
			printf("\n"); 
			printf("请选择您的服务:\n");
			printf("\n"); 
			printf("1.继续查询 2.退出系统 3.返回主菜单\n");
			printf("\n"); 
			printf("输入您的选择:");
			scanf("%d",&d); 
		if(d==3)
		{
			goto begin;
		} else if(d==2) {
			goto end;
		}else if(d==1){
			info();
		}else {
			printf("没有该服务,请输入正确的序号!\n");
			goto infob;
		}
		}
	}
	else if(a==3)
	{
	road(p,di);
		while(e)//在查询路程服务中循环或跳出
		{
			roadb:
			printf("\n"); 
			printf("请选择您的服务:\n");
			printf("\n"); 
			printf("1.继续查询 2.退出系统 3.返回主菜单\n");
			printf("\n"); 
			printf("输入您的选择:");
			scanf("%d",&e); 
		if(e==3)
		{
			goto begin;
		} else if(e==2){
			goto end;
		}else if(e==1){
			road(p,di);
		}else {
			printf("没有该服务,请输入正确的序号!\n");
			goto roadb;
		}
		}
	 } else if(a==1)
	 {
	 	map();
	 	mapb:
	 	printf("\n"); 
	 	printf("请选择您的服务:\n");
	 	printf("\n"); 
		printf("1.退出系统 2.返回主菜单\n");
		printf("\n"); 
		printf("输入您的选择:");
		scanf("%d",&f);
		if(f==1)
		{
			goto end;
		} else if(f==2){
			goto begin;
		} else {
			printf("没有该服务,请输入正确的序号!\n");
			goto mapb;
		}
	  } 
	else if(a==4)
	 {
	 	goto end;
	  } 
	  else
	  {
	  	printf("没有该服务,请输入正确的序号!\n");
	  	goto begin;
	  }
	
	end:
		printf("\n"); 
		printf("——*——*——*——*——*——*——*——*——\n");
		printf("	感谢您使用本系统!祝您游玩愉快!\n");
		printf("——*——*——*——*——*——*——*——*——\n");
	return 0; 
 } 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...