数据结构校园导游系统(C语言)

Meet-sw 发布于 2018/06/04 22:56
阅读 384
收藏 1

做一个校园导游系统,先做用户部分,之后再做管理员部分,那么运行之后再管理员处进行的修改,用户那部分会有变化吗?(用户那部分的地图使用printf打印出来的,景点简介也差不多)

具体代码(未完成,void AddPlace()这部分还不能运行)

#include "string.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define Max 20000
#define NUM 9
typedef struct ArcCell
{
 int adj;
}ArcCell;
typedef struct VertexType
{
 int number;
 char *sight;
 char *description;
}VertexType;
 
typedef struct
{
 VertexType vex[NUM];
 ArcCell arcs[NUM][NUM];
 int vexnum,arcnum;
}MGraph;
 
MGraph G;
int P[NUM][NUM];
long int D[NUM];
int   x[9]={0};
void CreateUDN(int v,int a);
void narrate();
void ShortestPath(int num);
void output(int sight1,int sight2);
char Menu();
void search();
char SearchMenu();
void   HaMiTonian(int);
void   NextValue(int);  
void   display();
int  display_1();
int map();
int denglu();
void AddPlace();
void main()
{
 printf("欢迎使用某某大学的景点导游系统");
 printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
 printf("\t\t\t┃   0.进入管理员更改界面       ┃\n");
 printf("\t\t\t┃                              ┃\n");
 printf("\t\t\t┃   1.进入游客使用界面         ┃\n");
 printf("\t\t\t┃                              ┃\n");
 printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
 printf("请输入你的选择:");
 int v0,v1;
 char ck;
 int y;
  scanf("%d",&y);
 switch(y)
 {
 case 0: denglu();
       break;
 case 1: CreateUDN(NUM,11);
 do
 {
  ck=Menu();
  switch(ck)
  {
  case '1':
   printf("\n\n\t\t\t请选择起点景点(0~8):");
   scanf("%d",&v0);
   printf("\t\t\t请选择终点景点(0~8):");
   scanf("%d",&v1);
   ShortestPath(v0);
   output(v0,v1);  
   printf("\n\n\t\t\t\t请按任意键继续...\n");
   getchar();
   getchar();
   break;
  case '2':search();
   break;
  case '3':
   system("cls");
   //narrate();
   x[0]=1;
   HaMiTonian(1);
   printf("\n\n\t\t\t\t请按任意键继续...\n");
   getchar();
   getchar();
   break;
    case '4':
   system("cls");
   printf("\n\n\t\t景点地图:\n");
   map();
     break;
  }
 }while(ck!='e');
 }
}

char Menu()
{
 char c;
 int flag;
 do{
  flag=1;
  system("cls");
  narrate();
  printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
  printf("\t\t\t┃                              ┃\n");
  printf("\t\t\t┃      1、查询景点路径         ┃\n");
  printf("\t\t\t┃      2、查询景点信息         ┃\n");
  printf("\t\t\t┃      3、推荐参观路线         ┃\n");
  printf("\t\t\t┃      4、查询景点地图         ┃\n");
  printf("\t\t\t┃      e、退出                 ┃\n");
  printf("\t\t\t┃                              ┃\n");
  printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
  printf("\t\t\t输入您的选择:");
  scanf("%c",&c);
  if(c=='1'||c=='2'||c=='3'||c=='4'||c=='e')
   flag=0;
 }while(flag);
 return c;
}
 
char SearchMenu()
{
 char c;
 int flag;
 do{
  flag=1;
  system("cls");
  narrate();
  printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
  printf("\t\t\t┃                              ┃\n");
  printf("\t\t\t┃      1、按照景点编号查询     ┃\n");
  printf("\t\t\t┃                              ┃\n");
  printf("\t\t\t┃      e、返回                 ┃\n");
  printf("\t\t\t┃                              ┃\n");
  printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
  printf("\t\t\t\t请输入您的选择:");
  scanf("%c",&c);
  if(c=='1'||c=='e')
   flag=0;
 }while(flag);
 return c;
}
void search()
{
 int num;
 int i;
 char c;
 
 do
 {
  system("cls");
  c=SearchMenu();
  switch (c)
  {
  case '1':
   system("cls");
   narrate();
   printf("\n\n\t\t请输入您要查找的景点编号:");
   scanf("%d",&num);
   for(i=0;i<NUM;i++)
   {
    if(num==G.vex[i].number)
    {
     printf("\n\n\t\t\t您要查找景点信息如下:");
     printf("n\n\t\t\t%-25snn",G.vex[i].description);
     printf("n\t\t\t按任意键返回...");
     getchar();
     getchar();
     break;
    }
   }
   if(i==NUM)
   {
    printf("n\n\t\t\t没有找到!");
    printf("n\n\t\t\t按任意键返回...");
    getchar();
    getchar();
   }
 
   break;
 
 
 
  }
 }while(c!='e');
}
void CreateUDN(int v,int a)
{
 int i,j;
 G.vexnum=v;
 G.arcnum=a;
 for(i=0;i<G.vexnum;++i) G.vex[i].number=i;
 G.vex[0].sight="行政楼";
 G.vex[0].description="学校领导,办公室之地。";
 G.vex[1].sight="大礼堂";
 G.vex[1].description="业余活动,举办各种晚会。";
 G.vex[2].sight="教学楼";
 G.vex[2].description="教室,自习室";
 G.vex[3].sight="体育馆";
 G.vex[3].description="教室,自习室";
 G.vex[4].sight="图书馆";
 G.vex[4].description="阅览,借阅图书";
 G.vex[5].sight="食堂";
 G.vex[5].description="餐饮休闲";
 G.vex[6].sight="学生公寓";
 G.vex[6].description="休闲,放松心情";
 G.vex[7].sight="游泳馆";
 G.vex[7].description="餐饮休闲";
 G.vex[8].sight="美术馆";
 G.vex[8].description="休息";
 
 
  for(i=0;i<G.vexnum;++i)
  for(j=0;j<G.vexnum;++j)
  G.arcs[i][j].adj=Max;
  G.arcs[0][1].adj=G.arcs[1][0].adj=12;
  G.arcs[0][2].adj=G.arcs[2][0].adj=6;
  G.arcs[0][3].adj=G.arcs[3][0].adj=5;
  G.arcs[1][4].adj=G.arcs[4][1].adj=11;
  G.arcs[2][4].adj=G.arcs[4][2].adj=2;
  G.arcs[3][5].adj=G.arcs[5][3].adj=4;
  G.arcs[5][7].adj=G.arcs[7][5].adj=9;
  G.arcs[4][6].adj=G.arcs[6][4].adj=2;
  G.arcs[4][7].adj=G.arcs[7][4].adj=14;
  G.arcs[6][8].adj=G.arcs[8][6].adj=7;
  G.arcs[7][8].adj=G.arcs[8][7].adj=3;
}
 
int map()
{
    printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
    printf("\t\t┃                                                        ┏━━━━━━━┓          ┃\n");
    printf("\t\t┃                                                  ━━━┫1.大礼堂      ┣━        ┃\n");
    printf("\t\t┃                                                        ┗━━━━━━━┛          ┃\n");
    printf("\t\t┃                                                                                    ┃\n");
    printf("\t\t┃              ┏━━━━━┓                                                       ┃\n");
    printf("\t\t┃              ┃  4.      ┃       ┏━━━━┓                                     ┃\n");
    printf("\t\t┃              ┃ 图书馆   ┃       ┃2. 教   ┃                                     ┃\n");
    printf("\t\t┃              ┗━━━━━┛       ┃   学   ┃                                     ┃\n");
    printf("\t\t┃                                   ┃   楼  ┃                                     ┃\n");
    printf("\t\t┃                                  ┃        ┃      ┏━━━━━━┓           ┃\n");
    printf("\t\t┃ ┏━━━━━━━━━┓           ┗━━━━┛         ┃  0.        ┃           ┃\n");
    printf("\t\t┃ ┃    6.学生公寓    ┃                              ┃ 行政楼     ┃           ┃\n");
    printf("\t\t┃ ┃━━━━━━━━━┃                                  ┗━━━━━━┛   ┏━━┓┃\n");
    printf("\t\t┃ ┃   一号楼         ┃                                               ┃ 学 ┃┃\n");
    printf("\t\t┃ ┃                  ┃                                  ┏━━━━━━┓   ┃ 校 ┃┃\n");
    printf("\t\t┃ ┃━━━━━━━━━┃                                  ┃ 3.体育馆   ┃   ┃ 出 ┃┃\n");
    printf("\t\t┃ ┃   二号楼         ┃                                  ┗━━━━━━┛   ┃ 口 ┃┃\n");
    printf("\t\t┃ ┃                  ┃                                                     ┃    ┃┃\n");
    printf("\t\t┃ ┃━━━━━━━━━┃                                                     ┃    ┃┃\n");
    printf("\t\t┃ ┃   三号楼         ┃                                   ┏━━━━━━┓  ┗━━┛┃\n");
    printf("\t\t┃ ┃                  ┃                                   ┃  5.  食堂  ┃          ┃\n");
    printf("\t\t┃ ┃━━━━━━━━━┃                                   ┗━━━━━━┛          ┃\n");
    printf("\t\t┃ ┃   四号楼         ┃                                                             ┃\n");
    printf("\t\t┃ ┃                  ┃                                                             ┃\n");
    printf("\t\t┃ ┃━━━━━━━━━┃                                                             ┃\n");
    printf("\t\t┃ ┃   五号楼         ┃                                                             ┃\n");
    printf("\t\t┃ ┗━━━━━━━━━┛                                    ┏━━━━━━┓         ┃\n");
    printf("\t\t┃                                                           ┃            ┃         ┃\n");
    printf("\t\t┃                                                           ┃7.游泳馆    ┃         ┃\n");
    printf("\t\t┃                                                           ┃            ┃         ┃\n");
    printf("\t\t┃                                                           ┗━━━━━━┛         ┃\n");
    printf("\t\t┃                                                                                    ┃\n");
    printf("\t\t┃                                                                                    ┃\n");
    printf("\t\t┃     ┏━━━━━━━━━┓                                                         ┃\n");
    printf("\t\t┃     ┃   8.美术馆       ┃                                                         ┃\n");
    printf("\t\t┃     ┃                  ┃                                                         ┃\n");
    printf("\t\t┃     ┗━━━━━━━━━┛                                                         ┃\n");
    printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
       system("pause");
       system("cls");
   return 1;
}
void narrate()
{
 int i,k=0;
 printf("\n\t\t\t\t*****************欢迎使用校园导游程序***************\n");
 printf("\n\t\t\t\t***********************某某大学*********************\n");
 
 
 
 printf("\t\t景点名称\t\t|\t景点描述\n");
 printf("\t________________________________|_________________________________\n");
 for(i=0;i<NUM;i++)
 {
  printf("\t (%2d)%-10s\t\t\t|\t%-25s\n",i,G.vex[i].sight,G.vex[i].description);
  k=k+1;
 }
 printf("\t________________________________|_________________________________\n");
}
void ShortestPath(int num)
{
 int v,w,i,t;
 int final[NUM];
 int min;
 for(v=0;v<NUM;v++)
 {
  final[v]=0;
  D[v]=G.arcs[num][v].adj;
  for(w=0;w<NUM;w++)
   P[v][w]=0;
  if(D[v]<20000)
  {
   P[v][num]=1;
   P[v][v]=1;
  }
 }
 
 D[num]=0;
 final[num]=1;    
     
 for(i=0;i<NUM;++i)  
 {
  min=Max;  
  for(w=0;w<NUM;++w)
   if(!final[w])  
    if(D[w]<min)
    {
     v=w;
     min=D[w];
    }
    final[v]=1;
    for(w=0;w<NUM;++w)
     if(!final[w]&&((min+G.arcs[v][w].adj)<D[w]))
     {
      D[w]=min+G.arcs[v][w].adj;
      for(t=0;t<NUM;t++)
       P[w][t]=P[v][t];
      P[w][w]=1;
     }
 }
}
 
 
 
void output(int sight1,int sight2)  
{
 int a,b,c,d,q=0;
 a=sight2;  
 if(a!=sight1)  
 {
  printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);
  printf("\t(最短距离为 %dm.)\n\n\t",D[a]);
  printf("\t%s",G.vex[sight1].sight);
  d=sight1;    
  for(c=0;c<NUM;++c)
  {
gate:;      
     P[a][sight1]=0;
     for(b=0;b<NUM;b++)
     {
      if(G.arcs[d][b].adj<20000&&P[a][b])
      {
       printf("-->%s",G.vex[b].sight);
       q=q+1;  
       P[a][b]=0;
       d=b;  
       if(q%8==0) printf("n");
       goto gate;
      }
     }
  }
 }
 
}
void HaMiTonian(int m)
{
 if(m>8)   return;
L: NextValue(m);
   if(x[m]==0)
    return;
   if(m==7&&G.arcs[0][x[8]-1].adj!=20000)
    display();
   else
    HaMiTonian(m+1);
   goto   L;
}
void NextValue(int k)
{
 int j;
l:x[k]=(x[k]+1)%10;
  if(x[k]==0)
   return;
  if(G.arcs[x[k-1]-1][x[k]-1].adj!=20000)
  {
   for(j=0;j<k;j++)
    if(x[j]==x[k])
     goto l;
    return;    
  }
  else
   goto l;    
}
void display()
{
 int i=0;
 printf("\n\n\t");
 for(i=0;i<8;i++)
  printf("%s->",G.vex[x[i]-1].sight);
 printf("出口");
 printf("\n");
}
int display_1()//管理员界面
{
    int command;
    int i;
    printf("----------------------------------------\n");
    printf("----------------------------------------\n");
    printf("||                    管理员系统说明:本系统可实现如下功能:                   ||\n");
    printf("||                           0 返  回  主  菜  单                             ||\n");
    printf("||                           2 录  入  路  径                                 ||\n");
    printf("||                           3 添  加  景点                                 ||\n");              
    printf("||                           4 删  除  路  径                                 ||\n");
    printf("||                           5 修  改  路  径                                 ||\n");
    printf("||                           6 显  示  路  径                                 ||\n");
    printf("||                           7 查 询 两 点 间 最 短 路径                      ||\n");
    printf("||                                                                            ||\n");
    printf("----------------------------------------\n");
    printf("----------------------------------------\n");
    printf("请选择您要进行的操作...");
    scanf("%d",&command);
    for(i=0;i<350;i++)
    {
    if(command<0||command>7)
    {
      printf("    输入错误!!!\n");
      printf("    请重新输入:\n");
      scanf("%d",&command);

    }
    else
        switch(command)
    {
        case 3:  AddPlace(); break;
    }
        
    }
 return command;
}

int denglu()
{
    int zh,mm;
    printf("请输入管理员账号:");    
        printf("请输入管理员密码:");
        scanf("%d",&zh);
        scanf("%d",&mm);
        if(zh==0&&mm==0)
        display_1();
        else  printf("账号密码错误!你还有两次机会!");
         scanf("%d",&zh);
        scanf("%d",&mm);
        if(zh==0&&mm==0)
        display_1();
        else
            printf("账号密码错误!你还有一次机会!");
         scanf("%d",&zh);
        scanf("%d",&mm);
        if(zh==0&&mm==0)
        display_1();
        else
            printf("账号密码错误!你没有机会了!请退出\n");
        exit(0);
        return 0;
}

 void AddPlace()
 {          //增加景点函数
  int i,j,k;
  char c='y';
  while(c=='y')
  {
  system("cls");
  printf("\n\t\t\t输入要添加的景点编号:");
  scanf("%d",&i);
  if(i>G.vexnum)
  {
  i-=1;
  printf("n\n\t\t\t\t输入要添加的景点名称:");
  G.vex[i].sight=(char *)malloc(50);
  flushall();
  gets(G.vex[i].sight);
  printf("\n\n\t\t\t输入节点的简介:\n");
  G.vex[i].description=(char *)malloc(1000);
  flushall();
  gets(G.vex[i].description);
  printf("\n\n\t\t\t\t\输入他的权值:\n");
  scanf("%d",&k);
  G.arcs[i][j]=G.arcs[j][i]=k;
  printf("\n\n\t\t\t\增加成功!\n");
  printf("n\n\t\t\t按任意键继续....");
  getch();
  }
  else
  {
printf("\n\t\t\t\t您输入的景点编号已经存在!\n");
printf("n\n\t\t\t按任意键继续....");
  c= getchar();
  getchar();
  }
  system("cls");
 }

 

加载中
0
tcxu
tcxu

1.   游泳馆的功能,不是“餐饮休闲”,故要改成
G.vex[7].sight="游泳馆";
G.vex[7].description="健身休闲";
2.   管理员无论是 添加景点、删除或修改路径,都要改动基本数据,改动 MGraph 中的属性,如邻接矩阵, arcs[][]。改动之后,用户再选项获得的结果,当然可能会有所变化。所以,管理员一旦变更数据,就必须做到MGraph中的属性值即刻更新。
3.  如果程序初始化,由管理员手工录入数据,太费时间。建议,将数据预先写入一个文档之中,程序起始的第一步,就是读入数据。每次关闭程序之前,都要将现有数据存(写)入文档,以备下次使用。

返回顶部
顶部