校园导航系统

校园导航系统

# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# include<math.h> 
# define INF 32767
# define MAX 14


static char N[MAX][50]={"教学主楼","田径场","足球场","综合楼","实训中心","科技大厦","信息大厅","沁芳园","小区","新食堂","澡堂","宿舍","实验楼","篮球场"};//存储建筑名字 
int L[MAX][MAX]; //保存路径长度 
int Lcopy[MAX][MAX];
int P[MAX][MAX]; //保存路径 
char D[4][3] = {"  ","||",">>","<<"};
int K[25]={0}; //表示路径 
char apart[2][6]={"修改","查询"}; 

int seek();//查找 
void floyd();//核心代码 
void View(int *);//地图 
void menu();//主菜单 
void init();//初始化 
void query(bool is);//查询 
void submenu(char *s);//子菜单 
void display(int a,int b);//显示路径 
void update(int a,int b);//更新路径 
void data(int temp,int k);//控制路径显示 

int main(){
	init();
    while(1){
    	menu();
	}
} 

void View(int *C){ 
	printf("示意图:\n        黑龙江科技大学\n");
	printf("+-----------------------------+\n");
	printf("|  +=======================+  |\n");
	printf("|  |      1.科技广场       |  |\n");
	printf("|  +--  --------------  ---+  |\n");
	printf("|  |        教学主楼       |  |\n");
	printf("|  +=======================+  |\n");
	printf("|  %d  %s         %d  %s      +----------------+\n",L[0][1],D[C[0]],L[0][2],D[C[1]]);
	printf("|  +========+     +========+     +========+    |\n");
	printf("|  |   2.   |	  |   3.   |     |   4.   |    |\n");
	printf("|  |   田   | %d  |   足   | %d  |   综   |    +-------------+\n",L[1][2],L[2][3]);
	printf("|  |   径   | %s  |   球   | %s  |   合   | %d +==========+  |\n",D[C[13]],D[C[14]],L[3][4]);
	printf("|  |   场   |     |  场  |     |   楼   | %s |5.实训中心|  |\n",D[C[15]]);
	printf("| +========+   +========+    +========+    +==========+  |\n");
	printf("|  %d  %s         %d  %s         %d  %s         %d  %s       +---+\n",L[1][5],D[C[2]],L[2][6],D[C[3]],L[3][7],D[C[4]],L[4][8],D[C[5]]);
	printf("|  +========+     +========+     +========+    +==============+  |\n");
	printf("|  |  6.    |     |  7.    |     | 8.沁   |    |              |  |\n");
	printf("|  |  科技  | %d  |  信息  | %d  |   芳   | %d |   9.小区     |  |\n",L[5][6],L[6][7],L[7][8]);
	printf("|  |  大厦  | %s  |  大厅  | %s  |   园   | %s |              |  |\n",D[C[17]],D[C[18]],D[C[19]]);
	printf("|  |        |     |        |     |        |    |              |  |\n");
	printf("|  +========+     +========+     +========+    +==============+  |\n");
	printf("|  %d  %s         %d %s    [文 化]%d %s         %d  %s           |\n",L[5][9],D[C[6]],L[6][10],D[C[7]],L[7][11],D[C[8]],L[8][11],D[C[9]]);
	printf("|  +=========+    +===+    [广 场]============================+  |\n");
	printf("|  |  10.新  | %d |11.| %d |                                  |  |\n",L[9][10],L[10][11]);
	printf("|  |  食堂   | %s | 澡| %s |          12.宿舍                 |  |\n",D[C[21]],D[C[22]]);
	printf("|  |         |    | 堂|    |                                  |  |\n");
	printf("|  +=========+    +===+    +==================================+  |\n");
	printf("|  %d  %s         %d %s           %d      %s                     |\n",L[9][12],D[C[10]],L[10][12],D[C[11]],L[11][13],D[C[12]]);
	printf("|  +===================+    +========================+  +--------+\n");
	printf("|  |                   | %d |                        |  |\n",L[12][13]);
	printf("|  |     13.实验楼     | %s |        14.篮球场       |  |\n",D[C[24]]);
	printf("|  |                   |    |                        |  |\n");                                                                  
	printf("|  +===================+    +========================+  |\n"); 
	printf("+-------------------------------------------------------+\n");
	printf("注:两建筑间的数字为距离\n"); 
    printf("\n");	
}
void menu(){
	printf("菜单\n");
	printf("+-------------------------+\n");
	printf("|     (1).查询路径        |\n");
	printf("|     (2).修改路径长度    |\n");
	printf("|     (0).退出系统        |\n");
	printf("+-------------------------+\n");
	int op;
	scanf("%d",&op);
	switch(op){
		case 1:
			submenu(apart[1]);
			break;
		case 2:
			submenu(apart[0]);
			break; 
		case 0:
			printf("欢迎再次使用!\n");
			exit(0); 
		default:
			printf("输入有误,请重新输入!\n");
	} 
}
void submenu(char *s){
	printf("+-------------------------+\n");
	printf("|    (1).输入名称%s\t    |\n",s);
	printf("|    (2).输入序号%s\t    |\n",s);
	printf("|    (0).返回上一步\t    |\n");
	printf("+-------------------------+\n");
	int op;
	int a,b; 
	scanf("%d",&op); 
	switch(op){
		case 1:
			a = seek();
			b = seek();
			if(a<0||b<0){
				printf("没有查询到该名称!\n");
			}else{
				if(strcmp(s,apart[0])==0){
					update(a,b);
				}else{
					display(a,b);
				}
			}
			break;
		case 2:
			if(strcmp(s,apart[0])==0){
				query(false);
			}else{
				query(true);
			}
			floyd(); 
			break; 
		case 0:
			break;	 
		default:
			printf("输入有误,请重新输入!\n");
			submenu(s);
	}
	menu();	 
}
void query(bool is){
    int a,b;
	printf("请输入序号:\n");
	scanf("%d%d",&a,&b);
	while(a>MAX||b>MAX||a<1||b<1){
		printf("错误输入,重新输入!\n");
		scanf("%d%d",&a,&b);
	}
	if(is){
		display(a-1,b-1);	
	}else{
		update(a-1,b-1);
	}
}
void update(int a,int b){
	printf("当前距离为 %d 米,请输入新的距离!\n",L[a][b]);
	int length;
	scanf("%d",&length);
	L[a][b]=length;L[b][a]=length;
	Lcopy[a][b]=length;Lcopy[b][a]=length;
	printf("修改成功!\n");
} 
void display(int a,int b){
	printf("%s到%s的最短路径是: %d\n\n",N[a],N[b],Lcopy[a][b]);
	printf("路径: %s",N[a]);
	int temp = a;
	int k = P[a][b];
	data(temp,k);
	while(k != b){
        printf(" -> %s", N[k]);
        temp = k;
        k = P[k][b];
        data(temp,k);
    }
	printf(" -> %s\n\n",N[b]);
	View(K);
	for(int i=0;i<25;i++){
		K[i]=0;
	}
}
void data(int temp,int k){
	if(abs(temp-k)>1){
		if(temp>k){
			K[k+1]=1;
		}else{
			K[temp+1]=1;
		}
	}else if(temp!=k){
		if(temp==1||k==1){
			K[0]=1;
		}else if(temp>k){
			K[k+12]=3;
		}else{
			K[temp+12]=2;
		}
	}
}
void init(){
	for(int i=0;i<MAX;i++){
		for(int j=0;j<MAX;j++){
			if(i==j){
				L[i][j]=0;
			}else{
				L[i][j]=INF;
			}
			P[i][j] = j;
		}
	}
	L[0][1]=L[1][0]=89;L[0][2]=L[2][0]=90;
	L[1][2]=L[2][1]=45;L[1][5]=L[5][1]=40;
	 
	L[2][3]=L[3][2]=50;L[2][6]=L[6][2]=35;
	L[3][4]=L[4][3]=70;L[3][7]=L[7][3]=20;
	
	L[4][8]=L[8][4]=30;L[8][11]=L[11][8]=40;
	 
	L[5][9]=L[9][5]=37;L[5][6]=L[6][5]=50;
	L[6][7]=L[7][6]=55;L[6][10]=L[10][6]=20;
	
	L[7][8]=L[8][7]=60;L[7][11]=L[11][7]=45;
	L[9][10]=L[10][9]=12;L[9][12]=L[12][9]=35;
	
	L[10][11]=L[11][10]=10;L[10][12]=L[12][10]=20;
	L[11][13]=L[13][11]=15;L[12][13]=L[13][12]=10;
	
	for(int i=0;i<MAX;i++){
		for(int j=0;j<MAX;j++){
			Lcopy[i][j]=L[i][j];
		}
	}
	floyd();
}
void floyd(){
	int temp;
	for(int k=0;k<MAX;k++){
		for(int i=0;i<MAX;i++){
			for(int j=0;j<MAX;j++){
				temp = Lcopy[i][k]+Lcopy[k][j];
				if(temp<Lcopy[i][j]){
					Lcopy[i][j]=temp;
					P[i][j]=P[i][k]; 
				}
			}			
		}
    }	
}
int seek(){
	int j=-1;
	char name[50];
	printf("请输入名称!\n");
	scanf("%s",name);
	for(int i=0;i<MAX;i++){
		if(strcmp(N[i],name)==0){
			j=i;
			break;
		}
	}
	return j;
}

这个代码借鉴了其他类似的校园管理系统,自己小小改动了一下。主要还是为了应付课设,用到最核心的算法是floyd算法。比较费时的就是打印这个地图了。

附上一篇讲解floyd算法的文章,写的很好。 link

最后送上我辛辛苦苦画的流程图,仅供参考。水平有限。有错误的话不要喷我。
在这里插入图片描述

实现简单的查询,各风景的查询,调用各函数,实现课程设计的目标。其中包含三个功能,一个是直接进入导航系统,利用主函数中已有的数据,进行查询:一个是进行创建数据,本程序中初始数据为农大的导航数据,如果需要也可以自己建立一个;最后一个是退出功能。设计该函数的目的是为了能够多次得应用dijkstra函数进行查询最短路径。同时该函数可以列出各景点的代号和对应的名称,这样大家只要输入代号就行了。方便进行查询。下面分别描述这些函数,建立它们函数原型。 1、主函数 函数原型:void main(void) 功 能:控制程序。 参 数:void 返 回 值:void 要 求:管理菜单命令并完成初始化。 2、菜单选择和处理函数 函数原型:int menu() 功 能:处理选择的菜单命令并接收用户选择的命令代码。 参 数:int 返 回 值:int 工作方式:返回命令代码的整数值,根据命令,调用相应函数。 要 求:只允许选择规定键,如果输入不合要求,则提醒用户重新输入。 3、建立邻接矩阵函数 函数原型:void createadj() 功 能:重新建立一个学生信息的记录。 参 数:void 返 回 值:void 工作方式:在需要的时候就可以有主菜单中调用 void createadj()函数。 要 求:必需输入信息记录,然后才能调用出search()函数进行查询。 4、dijkstra函数 函数原型:void dijkstra(intx,inty) 功 能:求两点间的最短路径 参 数:void 返 回 值:void 工作方式: 该函数被其它一些函数调用。 5、结束程序 函数原型:int Exit() 功 能:使程序正常结束运行 参 数:int 返 回 值:1 工作方式:在操作都完成后,可以调用int Exit()函数,使函数最终返回 1 运行exit(1),程序正常结束。 要 求:运行Exit()函数后可以选择是否要保存,选择y则先保存再返 回1值;如果选择n直接返回1值。详细的程序设计应从下到上,在本设计中就要先设计createadj函数;然后设计dijkstra函数;接着是search函数;menu函数;最后才是main函数。如此设计能大大提升设计速度,因为从下往上使编程时的高试过程简单许多,而做课程设计花费时间最多的就是调试过程。对于各函数的详细设计,各函数的N—S图如下: (1)Createadj函数 (2)Dijkstra函数          (3)Search函数          (4)Menu函数          (5)main函数          2.4 程序编码   把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚;编写过程中参考各种的教材和材料,使程序编写的正确性大有提高,同时也许到许多实践知识,增加了实践经验。 2.5 程序调试与测试    程序编写总是出现各种各样的错误,但是难点不是修改错误,而是找出错误。在大量的源程序中找出错误难度很大,但有了一定的方法,就能节省大量的时间,在这次课程设计中我运用的调试方法主要有2种:     一是借助调试工具。利用Turbo C中提供的程序专门调试工具Debugger程序,可以很容易找出程序中的各种语法错误。但是遇到一些逻辑错误时却又无从着手。这时我就用下面一种方法。     二是在程序中插入打印语句。猜测出大致的错误位置,选则一些主要变量,在关键部位插入打印语句,打印出这个主要变量,看其是否与理论上的一样,在多个位置插入,如果有个位置的值与理论值一样,另一个位置与理论值不一样,则错误就落在这两个位置之间,然后再多测试几个位置缩小范围,直到找出错误。  例如;我在调试main()主函数时,程序能够运行,三个选项都能选择,创建函数能够正常运行,也能正常退出,但在选第一条进入校园导航后,打印出来的列表却是空的,源程序中的初始化数据没有显示出来,我又尝试输入两个结点进行查找,发现没有输出路线,所以我猜测初始化数据没有被正常写入。但不知道为何没有被正常写入,首先怀疑是初始化时附值发生错误,查阅各种资料进行校验,发现没有错误。后来经过综合分析,发现最有可能是n值在search()函数中发生错误,于是我在search()函数中插入打印n 的语句,运行后发现输出的n为0,初始化数据中有11个结点,n应该为11,所以n 在这个地方发生错误,我又在main()主函数中打印出n 的值,n=11,是正确的。所以错误就在search()函数中,也就说是当运行case1,运行到search()函数时,n从11变为0,针对这个错误,我把变量n改为宏定义,因为n 是代表结点个数,不管在哪个函数中它的值都是一样的才对。改完后运行程序,成功! 本设计文件的注释如上,已给出详细的说明,下面仅以文件为单位说明各个函数的作用和特点,在必要的地方给予一定说明。  3.1、guide.h文件 使用条件编译。以下是头文件中语句 /********************************************* *头文件(.h) ********************************************/ #include "stdio.h" #include "conio.h" #include "alloc.h" #define n0 100 #define infi 32767 /*“无穷大*/ int adjmatrix[n0+1][n0+1];     /*邻接矩阵*/ int n=11; struct node             /*表结点*/ { char name[20];       /*下一个表结点与它们之间的距离*/ }place[12]={{"ShiDiGongYuan"},   /*表结点初始化,即写各景点名称*/    {"CangRongGongYu"},    {"YinHuiLou"},    {"TuoHuanGuanChang"},    {"DiBaShiTang"},    {"XiaoYiYuan"},    {"TuShuGuan"},    {"TiYuGuan"},    {"ZhongHuaGuanChang"},    {"ChuangXinLou"},    {"YiFuTuShuGuan"},    {"BoXueLou"}};  void createadj()          /*建立邻接表*/  void dijkstra( int x,int y)     /*dijkstra求最小生树*/  void search()            /*搜索最短路径*/  menu()               /*菜单函数*/          /********************************************* *建立邻接表 ********************************************/ void createadj()  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值