校园导航系统
# 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
最后送上我辛辛苦苦画的流程图,仅供参考。水平有限。有错误的话不要喷我。