数据结构课程设计-校园导游系统-带注释

来源:互联网 发布:原生js写轮播图 编辑:程序博客网 时间:2024/04/28 18:23

一、        课程设计的目的

 

本实习突出了数据结构加操作的程序设计观点,希望达到熟悉各种存储机构结构的特性,以及如何应用树和图机构解决具体问题的目的。

 

二、        课程设计内容

 

设 计 目 的 :

了解数据结构,熟悉图的应用,并利用迪杰斯特拉算法求得2点之间的最短路径。

设计技术参数

            1)设计你的学校的校园平面图,所含景点不小于10个。以图中的顶点表示学校的各个景点,存放景点名称,代号,简介等信息;以边表示路径,存放路径,存放路径的长度等相关信息。

2)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的最短的简单路径。

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

 

 

/*********************************************************
*设计题目:校园导游咨询系统
*设计人:  中南林业科技大学  杨海波  http://haibo.shishuo.com
*制导老师:杨卫民,陈超云
*时间:    2005年7月20日
*********************************************************/

/* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */
#include "stdio.h"
#include "math.h"
#include "graphics.h"
#include "conio.h"   /*gotoxy*/
#include "bios.h"

/**********************************************************/
/* 定义符号常量                                           */

#define   NULL     0
#define   num  20
#define   maxdist 10000

/**********************************************************/
/* 定义数据结构*/
typedef  struct{
char   data[num];
double    edges[num][num];
}graph;

/**********************************************************/
/* 定义全局变量                                           */
int  x[num],y[num];
char a[num],ab[num][num];

/**********************************************************/
/*自定义函数原型说明           */
void showmsg(char msg[]);  /*逐步显示文字*/
void dijkstra(graph g,int n,int i,int d[num],int p[num]);
void opdijk(int v1,int v0,int n,int d[],int p[]);
void info_welcome();

/**********************************************************/
/*功能:逐步显示文字                                      */
void showmsg(char msg[]) {
 int i=0;
   while (msg[i]!=’/0’){
  printf("%c",msg[i]);
  i++;
  delay(30000);
   }
}

/**********************************************************/
/*功能:用迪杰思特拉算法求图的最短路径                    */
void dijkstra(graph g,int n,int i,int d[num],int p[num]){
int s[num];
double mindist,dist;
int j,k,u,w;
for(j=0;j<n;j++)
  {d[j]=g.edges[i][j];
   s[j]=0;
   if((d[j]<maxdist)&&(d[j]!=0))
      p[j]=i;        /*可到达的路径*/
     else
      p[j]=-1;        /*设空路径*/
  }
s[i]=1;
for(j=0;j<n-1;j++)
{mindist=maxdist;
  u=i;
  for(k=0;k<n;k++)
  if((s[k]==0)&&(d[k]<mindist))
   {u=k;
    mindist=d[k];
   }
   s[u]=1;
   for(k=0;k<n;k++)
   {if(s[k]==0)
      {dist=d[u]+g.edges[u][k];
        if(dist<d[k])
          {d[k]=dist;
           p[k]=u;
          }
   }
   }
  }
}
/**********************************************************/
/*功能:打印出图的最短路径                                */
void opdijk(int v1,int v0,int n,int d[],int p[]){
 int i,i_1,j,k,pre;
 int point_x,point_y;
 for(i=0;i<n;i++)
  if(i!=v0&&i==v1){
   gotoxy(5,24);
   printf("%c",a[i]);
   point_x=x[i];
   point_y=y[i];
   pre=p[i];
   while(pre!=-1){
    setcolor(RED);
    /**********************************/
    /**闪烁终点的颜色                 */
    for (i_1=0;i_1<10 ;i_1++ )
    {
    setcolor(GREEN);
    circle(x[pre]*30,y[pre]*30,3);
    delay(90000);
    setcolor(RED);
    circle(x[pre]*30,y[pre]*30,3);
    delay(90000);
    setcolor(GREEN);
    line(point_x*30,point_y*30,x[pre]*30,y[pre]*30);
    delay(90000);
    setcolor(RED);
    line(point_x*30,point_y*30,x[pre]*30,y[pre]*30);
    delay(90000);
    }
    /**********************************/
    point_x=x[pre];
    point_y=y[pre];
    printf("-->%c",a[pre]);/****************************/
    pre=p[pre];
   }
  if(d[i]==maxdist)
   /*line(point_x*30,point_y*30,x[v0]*30,y[v0]*30);*/
   printf("-->%c",a[v0]);
   /*printf("/tshortestway:%5f",d[i]);*/
  }
}
/******************************************************/
/*功能:打印出程序的帮助和欢迎信息                   */
void info_welcome(){
 int i,j;
 char *Msg[]=
    {
    "Welcome to CSFU!    ",
 "                        ",
 "ADDRESS:Central South   ",
 "Forestry University     ",
 "Changsha,Hunan,China    ",
 "                        ",
    "TEL:+86-731-5623172     ",
    "",
    "",
    "        [HELP]          ",
    "Find OUT THE SHORTEST  ",
 "PATH:F or f            ",
 "",
    "EXIT:Q or q            ",
    NULL,
 };
/*显示操作键说明                                        */
  i=0;
  textcolor(WHITE);
  delay(90000);
  while(Msg[i]!=NULL)
  {
  gotoxy(56,3+i);
  printf(Msg[i]);
  i++;
  }
  printf("/n/n/n");
  textcolor(GREEN);
  gotoxy(5,18);
  i=0;
  showmsg("Welcome to use school_wizard.");
  gotoxy(5,20);
  showmsg("You can choose ’F’ or ’Q’:");
}
/***************************************************/
/*功能:                                          */
main(){
graph g;
int i,j,k,n,m,i_1,i_2,i_3;
int driver,mode;
int  road_x,road_y;
char nu,b,i_str,m_str;
int d[num],p[num],sd[num][num],sp[num][num];
FILE *map_f,*road_f;
clrscr();
/*初始化变量 g.edges[][]*/
 for (i_1=0;i_1<num;i_1++){
  for (i_2=0;i_2<num;i_2++){
   g.edges[i_1][i_2]=maxdist;
  }
 }
/*********************************************************/
/*读取文件 map.dat(园地图的景点)&&描绘校园地图的路径   */
 if ((map_f=fopen("map.dat","r"))==0){
  printf("Can not open the file of map.dat./n");
  exit(1);
 }
    fscanf(map_f,"%d",&n);
    for(i=0;i<n;i++){
  fscanf(map_f,"%d",&nu);
  fscanf(map_f,"%d",&nu);
  fscanf(map_f,"%d",&nu);
  fscanf(map_f,"%c",&a[i]);
  fscanf(map_f,"%d",&x[i]);
  fscanf(map_f,"%d",&y[i]);
    }
 fclose(map_f);
/*********************************************************/
/*在屏幕上描绘校园地图的景点                              */
loop: driver=VGA,mode=VGAHI;
  initgraph(&driver,&mode,"");
  setbkcolor(BLUE);

 for(i=0;i<n;i++){
  setfillstyle(1,62);
  circle(x[i]*30,y[i]*30,3);
  floodfill(x[i]*30,y[i]*30,WHITE);
  gotoxy(x[i]*4+2,y[i]*2);
  printf("%c",a[i]);
  /*printf("a[%d]=%c/nx[%d]=%d/ty[%d]=%d/n",i,a[i],i,x[i],i,y[i]); /*调试校园地图的景点*/
 }
 setcolor(BROWN);
 rectangle(3,3,n*30+100,(n-2)*30);
 rectangle(n*30+100,3,getmaxx()-3,(n-2)*30);
 /*printf("n=%d/n",n);
/*********************************************************/
/*调用其他函数                                           */
info_welcome();
/***********************************************************/
/*读取文件 road.dat(园地图的路径)                       */
for(i=0;i<n;i++)
for(j=0;j<n;j++)
   g.edges[i][j]=maxdist;
 if ((road_f=fopen("road.dat","r"))==0){
  printf("Can not open the file of road.dat./n");
  exit(1);
 }
 fscanf(road_f,"%c",&b);
    for(i=0;i<n;i++){
  /*printf("/n%c",b);*/
   if (b==’@’){
      fscanf(road_f,"%c",&b);
     /*printf("/n%c",b);*/
     ab[i][0]=b;
     for (i_1=0;i_1<n;i_1++){
      if (b==a[i_1]){
       /*road_x=x[i_1];
       road_y=y[i_1];*/
       break;
       /*printf("/n1 %c,%d,%d",a[i_1],road_x,road_y);*/
      }
      if (b==’@’){
          break;
         }
     }
     for (i_2=0;i_2<num;i_2++){
      fscanf(road_f,"%c",&b);
      for (i_3=0;i_3<n;i_3++){
       if (b==a[i_3]){
        ab[i][i_2+1]=b;
        setcolor(WHITE);
        line(x[i_1]*30,y[i_1]*30,x[i_3]*30,y[i_3]*30);
        /**********************************************************/
        g.edges[i_1][i_3]=hypot((double)(x[i_1]-x[i_3]),(double)(y[i_1]-y[i_3]));

        /**********************************************************/
        /*printf("/n2 %d,%d %c,%d,%d",road_x,road_y,a[i_3],x[i_3],y[i_3]);*/
       }
       if (b==’@’){
       break;
       }
      }
      if (b==’@’){
          break;
         }
    }
   } else {
    for (i_2=0;i_2<num;i_2++){
     if (b==’@’){
      break;
     }
    }
   }
 }
 fclose(road_f);
/*********************************************************/
/*clrscr();*/
/*
 for (i_1=0;i_1<num;i_1++){
  printf("/n");
  for (i_2=0;i_2<num;i_2++){
   printf("%3f ",g.edges[i_1][i_2]);
  }
 }
*/
/*
 for (i_1=0;i_1<num;i_1++){
  printf("/t");
  printf("%d,%d ",x[i_1],y[i_1]);
 }
*/
/*********************************************************/
/*循环等待用户输入                                       */
do{
switch(toupper(getchar())) {
case’Q’:exit(0);
case’F’:{
 getchar();
 gotoxy(100,n);
/*
 for (i_1=0;i_1<n;i_1++){
  printf("a[%d]=%c/n",i_1,a[i_1]);
 }
*/
 gotoxy(5,21);
 showmsg("Where are you NOW?:");
 /*scanf("%d",&m);*/
 scanf("%c",&m_str);
 getchar();
 for (i_1=0;i_1<n;i_1++){
 if (toupper(m_str)==a[i_1]){
  m=i_1;
 }
 }
 /**********************************/
 /**闪烁源点的颜色                 */
 for (i_1=0;i_1<10 ;i_1++ )
 {
   setcolor(GREEN);
   circle(x[m]*30,y[m]*30,3);
   delay(90000);
   setcolor(RED);
   circle(x[m]*30,y[m]*30,3);
   delay(90000);
 }
 /*********************************/
 gotoxy(5,22);
 showmsg("Where are you GO?:");
 /*scanf("%d",&i);*/
 scanf("%c",&i_str);
 getchar();
 for (i_1=0;i_1<n;i_1++){
 if (toupper(i_str)==a[i_1]){
  i=i_1;
 }
 }
 /**********************************/
 /**闪烁终点的颜色                 */
 for (i_1=0;i_1<10 ;i_1++ )
 {
   setcolor(GREEN);
   circle(x[i]*30,y[i]*30,3);
   delay(90000);
   setcolor(RED);
   circle(x[i]*30,y[i]*30,3);
   delay(90000);
 }
 /*********************************/
 gotoxy(5,23);
 printf("The shortest path FROM %c TO %c is :",a[i],a[m]);
 dijkstra(g,n,i,d,p);
 opdijk(m,i,n,d,p);
 printf("/n/n/n");
 system("pause");
 clrscr();
 goto loop;
 break;
}
}
;
  }while(1);
}

 附件:

文件名:  map.dat (用TAB键隔开)
11
A 10 6
B 8 4
C 5 1
D 5 3
E 5 5
F 5 6
G 5 7
H 4 6
I 2 4
J 1 4
K 1 8

 

map.dat文件数据

map.dat文件的解释

11

A   10  6

B   8   4

C   5   1

D   5   3

E   5   5

F   5   6

G   5   7

H   4   6

I   2   4

J   1   4

K   1   8

总共有多少个景点

A    X坐标    Y坐标

B    X坐标    Y坐标

C    X坐标    Y坐标

D    X坐标    Y坐标

E    X坐标    Y坐标

F    X坐标    Y坐标

G    X坐标    Y坐标

H    X坐标    Y坐标

I    X坐标    Y坐标

J    X坐标    Y坐标

K    X坐标    Y坐标

文件名:road.dat

@AEBFG
@BCDEA
@CDB
@DCEB
@EDIHFAB
@FEHGA
@GFHKA
@HIKGFE
@IJHDC
@JKI
@KJGH

附件下载

原创粉丝点击