最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

交通咨询系统

来源:动视网 责编:小OO 时间:2025-09-24 17:08:35
文档

交通咨询系统

课程设计说明书(数据结构(C语言版))班级:信管B08-1班姓名:设计题目:交通咨询系统设计时间:__2010-9-6_____至___2010-9-16____指导教师:__________________________评语:______________________________________________________________________________________________________________________________________
推荐度:
导读课程设计说明书(数据结构(C语言版))班级:信管B08-1班姓名:设计题目:交通咨询系统设计时间:__2010-9-6_____至___2010-9-16____指导教师:__________________________评语:______________________________________________________________________________________________________________________________________
课程设计说明书

(数据结构(C语言版))

班级:   信管B08-1班     姓名:           

设计题目:        交通咨询系统          

设计时间:__2010-9-6_____至___2010-9-16____ 

指导教师:______ _____   _______________ 

评    语:________________________________ 

_________________________________________

_________________________________________

_________________________________________

_________________________________________

评阅成绩:__   __评阅教师:__   ___

《数据结构(C语言版)》课程设计实验报告

开课实验室: 基础实验室一                                               2010  年9 月16 日

实验题目交通咨询系统
一.实验题目

1、问题描述:

出于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

2.、基本要求

(1)提供对城市信息进行编辑(如:添加或删除)的功能。

(2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。

(3)提供两种最优决策:最快到达和最省钱到达。全程只考虑一种交通工具。

(4)旅途中耗费的总时间应该包括中转站的等候时间。

(5)咨询以用户和计算机的对话方式进行。由拥护输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。

二.实验设备及环境

PC兼容机、Windows操作系统、Turbo C/Win tc,Vc++软件等。

三.功能模块简介和系统结构图

系统结构图:

功能模块具体简介如下:

本系统进入时需要选择您的身份:管理员或用户。

(1)管理员:

要进入管理员界面,首先需要输入用户名和密码。为本系统方便使用,用户名和密码都默认为123456。输入正确的用户名和密码后,即可进入管理员界面,若输入错误,则退回主界面。

管理员界面有5个选项:添加城市、删除城市、添加交通路线、删除交通路线、返回上一级菜单。添加城市和删除城市只需输入城市名即可删除该城市,添加交通路线需要输入起始站城市名、终点站城市名、选择交通工具、火车(飞机)班次、起始时刻、到达时刻和票价,删除交通路线需输入班次。若添加信息成功,会显示“系统信息输入成功!”,若输入选择序号错误,会显示“选择序号错误!请重新选择!”。返回上一级菜单是返回主界面。

输入的信息会分别写入city.txt,train,txt,flight,txt中,用户查询路线时会从文件中读入。

(2)用户:

用户界面有4个选项:查询最小耗费路线、查询最短时间路线、查询城市所有路线、返回上一级菜单。查询最小耗费和最短时间是一个图的最短路径问题,因此用迪杰斯特拉(Dijkstra)算法按路径长度递增的顺序逐步产生最短路径的方法。

最小耗费的编程思想如下:先设置一个二维数组,第一个下标放置城市编号,第二个下标为第一个下标城市中花费最小的终点站城市编号,数组放置的数据为所需要的花费。先判断初始城市和终点城市是否在交通路线中,再设置一个数组,将已找到的最小花费的城市放入这个数组。初始状态时,该数组只包含初始城市,然后不断的选取到该城市花费最小的路线加入数组中,直至找到终点城市。这就是迪杰斯特拉算法。最短时间的路线也是用此算法计算的。

查询城市所有路线需要输入所要查询的城市名和选择交通工具,可显示该城市中所选交通工具的所有路线。

四.系统的主要界面设计及运行说明:

该图为主界面,选择序号即可进入所需界面。进入管理员界面需经过身份验证,输入用户名和密码,本程序用户名和密码均为123456。

此图为管理员界面,这是添加交通路线的例子。

此图为删除交通路线的例子。

此图为已输入的火车路线的保存文件。第一个数字表示的是火车路线总数,城市文件和飞机路线文件同此文件类似。

此图为查询火车最小耗费路线。这是两地之间无中转站的例子。

此图为查询火车最小耗费路线时两地之间有中转站的例子。飞机路线查询同此。

此图为查询最短时间路线。此为两站中无中转站的例子。有中转站和飞机路线同最小耗费路线的图类似。

此图为查询城市所有路线。此为查找北京所有火车的例子。

程序中所用到的时刻表:

列车时刻表

车 次

出 发 地 

到 达 地

出发时间到达时间车   费

27北京

郑州

西安

郑州

 郑州

 西安

郑州

北京

13:15

21:24

05:41

13:42

21:12

05:13

13:30

21:39

  78元

  82元

82元

78元

41 北京

 郑州

 上海

 郑州

 郑州

上海

郑州

北京

7:11

15:20

00:35

09:40

15:08

00:13

09:28

17:37

  90元

  100元

  100元

90元

59 上海

广州

 广州

 上海

08:20

03:39

03:16

22:53

  182元

134 兰州

 北京

 北京

 兰州

03:52

19:24

18:56

10:28

  162元

323 广州

 昆明

 昆明

 广州

06:18

16:31

16:14

02:27

  102元

873 武汉

 昆明

 昆明

 武汉

07:13

21:42

21:17

11:46

134元

116 武汉

 长沙

 长沙

 武汉

09:36

18:54

18:32

03:48

98元

373 长沙

 广州

 广州

 长沙

13:15

00:35

00:15

11:35

116元

747兰州

武汉

武汉

兰州

17:41

15:13

14:47

12:19

210元

航班时刻表

机  号                      

出 发 地 

到 达 地

出发时间到达时间费  用  

6320北京

上海

上海

北京

16:20

18:00   

17:25

19:05

680元

201  北京

  西安

  西安

  北京

15:25

12:35

17:00

14:15

930元

2323  西安

广州

  广州

  西安

7:15

10:15

9:35

11:35

1320元

173  拉萨

  昆明

  昆明

拉萨

10:20

12:35

11:45

14:00

830元

3304  拉萨

  武汉

  武汉

拉萨

14:15

16:25

15:45

17:55

0元

4723  武汉

广州

 广州

 武汉 

7:05

11:25

8:45

13 :05

810元

五.程序的主要代码:

#include

#include

#define Dij_MAXN 33 

#define MAX_VERTEX_NUM 31 

#define MAX_STRING_NUM 10 

#define MAX_TRAFFIC_NUM 10 

typedef short int CityType; 

typedef struct TrafficNode 

 char name[MAX_STRING_NUM]; //班次 

 int StartTime,StopTime; //起止时间 

 int EndCity; //火车到达城市的编号

 int Cost; //票价 

} TrafficNodeDat; 

typedef struct VNode 

 CityType city; //城市编号

 int TrainNum,FlightNum; //标记下面Train数组和Flight数组里元素个数 

 TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次 

 TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; 

} VNodeDat; 

typedef struct PNode 

 int City; 

 int TraNo; 

} PNodeDat; 

char CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下标为该城市在本程序中的编号 

int CityNum; //城市数目 

VNodeDat AdjList[MAX_VERTEX_NUM]; //下标所在城市的线路

PNodeDat Path[MAX_VERTEX_NUM]; //存储临时最小时间路径 

PNodeDat MinPath[MAX_VERTEX_NUM]; //存储搜索到当前的最小时间路径 

int MinTime,StartTime; 

int curPath; 

int SeekCity(char *name)

{

 //查找城市

 int i;

for(i=0;i  if(strcmp(name,CityName[i])==0)

   return i;

 return -1;

}

int SaveFile()

{

 //将火车飞机交通信息写入文件

 FILE *fp;

 int i,j,total;

 if((fp=fopen("city.txt

 {printf("\\n\无法打开文件!\\n"); return -1;}

 fprintf(fp,"%d\\n",CityNum);//在city文件中输入城市总数

for(i=0;i  fprintf(fp,"%s\\n",CityName[i]);//再输入城市名

 fclose(fp);

 total=0;

 if((fp=fopen("train.txt

 {printf("\\n\无法打开文件!\\n"); return -1;}

for(i=0;i  total+=AdjList[i].TrainNum;

 fprintf(fp,"%d\\n",total);//在train文件中输入火车总数

for(i=0;i for(j=0;j  {

   fprintf(fp,"%s %s %s ",AdjList[i].Train[j].name,CityName[i], 

    CityName[AdjList[i].Train[j].EndCity]);

   //输入火车车次,始发站和终点站

   fprintf(fp,"%2d:%2d %2d:%2d %d\\n",AdjList[i].Train[j].StartTime/60, AdjList[i].Train[j].StartTime%60, 

    AdjList[i].Train[j].StopTime/60, AdjList[i].Train[j].StopTime%60, 

    AdjList[i].Train[j].Cost);//输入发车时间和到站时间和费用

  }

 fclose(fp);

 total=0;

 if((fp=fopen("flight.txt

 {printf("\\n\无法打开文件!\\n");return -1;}

for(i=0;i  total+=AdjList[i].FlightNum;

 fprintf(fp,"%d\\n",total);//在flight文件中输入飞机总数

for(i=0;i for(j=0;j  {

   fprintf(fp,"%s %s %s ",AdjList[i].Flight[j].name,CityName[i], 

    CityName[AdjList[i].Flight[j].EndCity]);

   //输入飞机航班号,始发站和终点站

   fprintf(fp,"%2d:%2d %2d:%2d %d\\n",AdjList[i].Flight[j].StartTime/60, AdjList[i].Flight[j].StartTime%60, 

    AdjList[i].Flight[j].StopTime/60, AdjList[i].Flight[j].StopTime%60, 

    AdjList[i].Flight[j].Cost);//输入起飞时间,到达时间和费用

  }

 fclose(fp);return 1;

}

int InsertCity(char *Name)

{

 //添加城市

 strcpy(CityName[CityNum],Name);

 AdjList[CityNum].city=CityNum;//设置城市编号

 AdjList[CityNum].FlightNum=0;

 AdjList[CityNum].TrainNum=0;//新增城市火车数和飞机数初始为零

 CityNum++;//城市总数加1

 return 1;

}

int DelCity(char *Name)

{

 //删除城市

 int city,i,j;

 city=SeekCity(Name);

for(i=city;i {

  strcpy(CityName[i],CityName[i+1]);

  AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum;

for(j=0;j  {

   AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost;

   AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity;

   strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name);

   AdjList[i].Flight[j].StartTime=AdjList[i+1].Flight[j].StartTime;

   AdjList[i].Flight[j].StopTime=AdjList[i+1].Flight[j].StopTime;

  }

 }

 CityNum--;return 1;

}

int InsertTrain(char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost)

{

 //添加火车路线

 int i,j;

 i=SeekCity(StartCity);j=SeekCity(EndCity);

 AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j;

 AdjList[i].Train[AdjList[i].TrainNum].StartTime=StartTime;

 AdjList[i].Train[AdjList[i].TrainNum].StopTime=EndTime;

 strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);

 AdjList[i].TrainNum++;return 1;

}

int InsertFlight(char *flight,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost)

{

 //添加飞机路线

 int i,j;

 i=SeekCity(StartCity);j=SeekCity(EndCity);

 AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j;

 AdjList[i].Flight[AdjList[i].FlightNum].StartTime=StartTime;

 AdjList[i].Flight[AdjList[i].FlightNum].StopTime=EndTime;

 strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight);

 AdjList[i].FlightNum++;

 return 1;

}

int DelPath(char *name)

{

 //删除路线

 int i,j,flag=0;

for(i=0;i {

for(j=0;j   if(strcmp(AdjList[i].Flight[j].name,name)==0)

   {flag=1;break;//找到要删除的路线,找到跳出for循环}

  if(flag)

  {

for(;j   {

    AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost;

    AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity;

    strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name);

    AdjList[i].Flight[j].StartTime=AdjList[i].Flight[j+1].StartTime;

    AdjList[i].Flight[j].StopTime=AdjList[i].Flight[j+1].StopTime;

   }

   AdjList[i].FlightNum--;break;//将要删除路线后面的路线全部向前移,并将总数减1

  }

for(j=0;j   if(strcmp(AdjList[i].Train[j].name,name)==0)

   {flag=1;break;}

  if(flag)

  {

for(;j   {

    AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost;

    AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity;

    strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name);

    AdjList[i].Train[j].StartTime=AdjList[i].Train[j+1].StartTime;

    AdjList[i].Train[j].StopTime=AdjList[i].Train[j+1].StopTime;

   }

   AdjList[i].TrainNum--;break;

  }

 }

 return 1;

}

void Dijkstra_Output(int s[30][30],int PreCity[30],int p_end,int TravelType)

{

 //输出最短路径

 int track[30];

 int i=0,j,k,min,tmp,end,cost=0;

 j=p_end;

 track[i++]=j;//下标为0中存储了终点站的城市编号,i变为1

while(PreCity[j]>=0)

 {

  cost+=s[PreCity[j]][j];//循环后cost为总费用

  j=PreCity[j];track[i++]=j;

 }

 printf("\\n\您要查找的路线为:");

 printf("\\n\*─────────────────────────────*\\n");

 printf("\车号       起始站         终点站           时间       花费\\n");

 if(!TravelType)//类型为火车

 {

  for(i--;i>0;i--)//初始时i--后i为路线中的城市数目

  {

   end=track[i-1];min=32767;

for(k=0;k if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Train[k].Cost)

    {

     min=AdjList[track[i]].Train[k].Cost;//min为路径中的最小花费

     tmp=k;//k为一条路径中花费最小的火车编号

    }

   printf("\\n\%s",AdjList[track[i]].Train[tmp].name);//输出火车班次

   printf("\%10s",CityName[track[i]]);//输出起始城市名

   printf("\%10s",CityName[track[i-1]]);//输出终点城市名

   printf("\%2d:%2d-%2d:%2d",AdjList[track[i]].Train[tmp].StartTime/60, 

    AdjList[track[i]].Train[tmp].StartTime%60, AdjList[track[i]].Train[tmp].StopTime/60, 

    AdjList[track[i]].Train[tmp].StopTime%60);//输出起止时间

   printf("\%d\\n",AdjList[track[i]].Train[tmp].Cost);//输出花费

  }

 }

 else//类型为飞机

 {

for(i--;i>0;i--)

  {

   end=track[i-1];min=32767;

for(k=0;k if(AdjList[track[i]].Flight[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost)

    {min=AdjList[track[i]].Flight[k].Cost;tmp=k;}

   printf("\\n\%s",AdjList[track[i]].Flight[tmp].name);printf("\%10s",CityName[track[i]]);

   printf("\%10s",CityName[track[i-1]]);

   printf("\%2d:%2d-%2d:%2d",AdjList[track[i]].Flight[tmp].StartTime/60, 

    AdjList[track[i]].Flight[tmp].StartTime%60, AdjList[track[i]].Flight[tmp].StopTime/60, 

    AdjList[track[i]].Flight[tmp].StopTime%60);

   printf("\%d\\n",AdjList[track[i]].Flight[tmp].Cost);

  }

 }

 printf("\\n\最终花费: %d\\n",cost);

 printf("\*─────────────────────────────*\\n");

}

void Dijkstra(int s[30][30],int p_start,int p_end,int TravelType)

{

 //迪杰斯特拉算法计算最短路径

 int PreCity[30];//数组的值为计算出的路线中下标表示的城市中的前一个城市编号

 int i,j,min,pre,pos;

 for(i=0;i PreCity[p_start]=-2;

 while(PreCity[p_end]==-1)

 {

  min=-1;

for(i=0;i   if(PreCity[i]!=-1)//i为起始站

   {

for(j=0;j if(PreCity[j]==-1&&s[i][j]>0&&(min<0||s[i][j]     {

      pre=i;pos=j;//j为起始站中花费最小的到达站的城市编号

      min=s[i][j];

     }

   }

  PreCity[pos]=pre;

 }

 Dijkstra_Output(s,PreCity,p_end,TravelType);

}

int CalcMinCost(int StartCity,int EndCity,int TravelType)

{

 //查询最小耗费路线

 int s[30][30];

 int i,j,min,end,flag1,flag2;

 flag1=0;flag2=0;

for(i=0;i for(j=0;j   s[i][j]=-1;//设空路径

 if(TravelType==0)//判断初始城市和终点城市是否在火车交通路线中

for(i=0;i for(j=0;j   {

    if(AdjList[i].Train[j].EndCity==StartCity) flag1=1;

    if(AdjList[i].Train[j].EndCity==EndCity) flag2=1;

   }

 else if(TravelType==1)//判断初始和终点城市是否在飞机交通路线中

for(i=0;i for(j=0;j   {

    if(AdjList[i].Flight[j].EndCity==StartCity) flag1=1;

    if(AdjList[i].Flight[j].EndCity==EndCity) flag2=1;

   }

 if(flag1!=1||flag2!=1)

 {printf("\\n\抱歉!没有您要查找的路线!");return 0;}

 if(TravelType==0)

 {

for(i=0;i  {

   min=32767;j=0;

while(j   {

    min=32767;end=AdjList[i].Train[j].EndCity;

while(end==AdjList[i].Train[j].EndCity&&j    {

if(AdjList[i].Train[j].Cost     j++;

    }//min为i城市中的最小花费,end为其路线终点站

    s[i][end]=min;

   }

  }

 }

 else

 {

for(i=0;i  {

   min=32767;j=0;

while(j   {

    min=32767;end=AdjList[i].Flight[j].EndCity;

while(end==AdjList[i].Flight[j].EndCity&&j    {

if(AdjList[i].Flight[j].Cost     j++;

    }

    s[i][end]=min;

   }

  }

 }

 Dijkstra(s,StartCity,EndCity,TravelType);

 return 1;

}

int SearchMinTime (CityType City,CityType EndCity,int CurTime,int curPathNo,int TravelType) 

{

 //计算出最短时间

 int i; 

 if (City==EndCity)//若到达城市为终点站

 { 

if (MinTime>CurTime-StartTime)

  { 

for (i=0;i<=curPathNo;i++)

   { 

    MinPath[i].City=Path[i].City; MinPath[i].TraNo=Path[i].TraNo; curPath=curPathNo; 

   } 

   MinTime=CurTime-StartTime; 

  } 

 } 

 else 

 { 

  curPathNo++; Path[curPathNo].City=City; 

  if (!TravelType) 

  { 

for (i=0;i   { 

if ((AdjList[City].Train[i].StartTime>=(CurTime%1440))&&

(AdjList[City].Train[i].StopTime+(CurTime/1440)*1440-StartTime    { 

     //到达车站的发车时间要比始发车的到达时间晚,同时已经经过的时间加上要做火车的时间要比最小时间还小

     //即选择发车时间在上一辆火车之后,要花费时间最少的路线

     Path[curPathNo].TraNo=i; 

     SearchMinTime(AdjList[City].Train[i].EndCity,EndCity, 

AdjList[City].Train[i].StopTime+(CurTime/1440)*1440,curPathNo,TravelType); 

    } 

if ((AdjList[City].Train[i].StartTime<(CurTime%1440))&&

(AdjList[City].Train[i].StopTime+(CurTime/1440)*1440-StartTime    { 

     //若发车时间在上一辆火车之前,则多待一天

     Path[curPathNo].TraNo=i; 

     SearchMinTime(AdjList[City].Train[i].EndCity,EndCity, 

AdjList[City].Train[i].StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); 

    } 

   } 

  } 

  else 

  { 

for (i=0;i   { 

if ((AdjList[City].Flight[i].StartTime>=CurTime)&&

(AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440-StartTime    { 

     Path[curPathNo].TraNo=i; 

     SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity, 

AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440,curPathNo,TravelType); 

    } 

if ((AdjList[City].Flight[i].StartTime(AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440-StartTime    { 

     Path[curPathNo].TraNo=i; 

     SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity, 

AdjList[City].Flight[i].StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); 

    } 

   } 

  } 

 } 

 return 1; 

int CalcMinTime(int StartCity,int EndCity,int TravelType)

{

 //查询最短时间路线

 int i;

 int hour,minute;

 MinTime=32767;curPath=0;Path[0].City=StartCity;

 if(!TravelType)

for(i=0;i  {

   Path[0].TraNo=i;StartTime=AdjList[StartCity].Train[i].StartTime;

   SearchMinTime(AdjList[StartCity].Train[i].EndCity,EndCity, 

AdjList[StartCity].Train[i].StopTime,0,TravelType);

  }

 else

for(i=0;i  {

   Path[0].TraNo=i; StartTime=AdjList[StartCity].Flight[i].StartTime;

   SearchMinTime(AdjList[StartCity].Flight[i].EndCity,EndCity, 

AdjList[StartCity].Flight[i].StopTime,0,TravelType);

  }

 if(MinTime==32767)

 {printf("\\n\抱歉!没有您要查找的路线!");return 0;}

 printf("\\n\您要查找的路线为:");

 printf("\\n\*─────────────────────────────*\\n");

 printf("\车号       起始站         终点站           时间       花费\\n");

for(i=0;i<=curPath;i++)

 {

  if(!TravelType)

  {

   printf("\\n%10s\%10s",AdjList[MinPath[i].City].Train[MinPath[i].TraNo].name, 

CityName[MinPath[i].City]);

   printf("\%10s",CityName[AdjList[MinPath[i].City].Train[MinPath[i].TraNo].EndCity]);

   printf("\%2d:%2d-%2d:%2d",AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime/60, 

    AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime%60, 

    AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime/60, 

    AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime%60);

   printf("\%d\\n",AdjList[MinPath[i].City].Train[MinPath[i].TraNo].Cost);

  }

  else

  {

   printf("\\n%10s\%10s",AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].name, 

CityName[MinPath[i].City]);

   printf("\%10s",CityName[AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].EndCity]);

   printf("\%2d:%2d-%2d:%2d",AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].StartTime/60, 

    AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].StartTime%60, 

    AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].StopTime/60, 

    AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].StopTime%60);

   printf("\%d\\n",AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].Cost);

  }

 }

 hour=MinTime/60;minute=MinTime%60;

 if(hour<0)  hour+=23;

if(minute<0)  minute+=60;

printf("\\n\最短时间: %2d:%2d\\n",hour,minute);

 printf("\*─────────────────────────────*\\n");

 return 1;

}

int InitSystem()

{

 //从文件中读信息

 FILE *fp;

 int i,j,hour,minute,num,cost;

 char stmp1[10];char stmp2[10];char stmp3[10];

 fp=fopen("city.txt

 if(!fp)

 {printf("\\n\无法打开文件!\\n");return -1;}

 fscanf(fp,"%d",&CityNum);//读入城市总数

for(i=0;i {

  fscanf(fp,"%s",&CityName[i]);

  AdjList[i].city=i;AdjList[i].TrainNum=0;AdjList[i].FlightNum=0;

 }

 fclose(fp);

 fp=fopen("train.txt

 if(!fp)

 {printf("\\n\无法打开文件!\\n");return -1;}

 fscanf(fp,"%d",&num);//读入火车总数

for(i=0;i {

  fscanf(fp,"%s",&stmp1);//车次

  fscanf(fp,"%s",&stmp2);//始发站

  fscanf(fp,"%s",&stmp3);//终点站

  j=SeekCity(stmp2);//查找始发站城市编号

  AdjList[j].Train[AdjList[j].TrainNum].EndCity=SeekCity(stmp3);

  strcpy(AdjList[j].Train[AdjList[j].TrainNum].name,stmp1);

  fscanf(fp,"%d:%d",&hour,&minute);

  AdjList[j].Train[AdjList[j].TrainNum].StartTime=hour*60+minute;

  fscanf(fp,"%d:%d",&hour,&minute);

  AdjList[j].Train[AdjList[j].TrainNum].StopTime=hour*60+minute;;

  fscanf(fp,"%d",&cost);

  AdjList[j].Train[AdjList[j].TrainNum].Cost=cost;

  AdjList[j].TrainNum++;

 }

 fclose(fp);

 fp=fopen("flight.txt

 if(!fp)

 {printf("\\n\无法打开文件!\\n");return -1;}

 fscanf(fp,"%d",&num);

for(i=0;i {

  fscanf(fp,"%s",&stmp1);//航班号

  fscanf(fp,"%s",&stmp2);//始发站

  fscanf(fp,"%s",&stmp3);//终点站

  j=SeekCity(stmp2);

  AdjList[j].Flight[AdjList[j].FlightNum].EndCity=SeekCity(stmp3);

  strcpy(AdjList[j].Flight[AdjList[j].FlightNum].name,stmp1);

  fscanf(fp,"%d:%d",&hour,&minute);

  AdjList[j].Flight[AdjList[j].FlightNum].StartTime=hour*60+minute;

  fscanf(fp,"%d:%d",&hour,&minute);

  AdjList[j].Flight[AdjList[j].FlightNum].StopTime=hour*60+minute;;

  fscanf(fp,"%d",&cost);

  AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost;

  AdjList[j].FlightNum++;

 }

 fclose(fp);

 return 1;

}

void Administrators()

{

 //管理员的界面

 char name[10];char s_city[10];char e_city[10];

 int Command,cost,flag;

 int traveltype;

 int s_hour,s_minute,e_hour,e_minute;

 char user[10],password[10];

 printf("\\n\请输入用户名:");

 scanf("%s",&user);

 printf("\\n\请输入密码:");

 scanf("%s",&password);

 if((strcmp("123456",user)!=0)||(strcmp("123456",password)!=0))

 {printf("\\n\输入信息错误!\\n");return;}

 do

 {

  printf("\\n\******这里是管理员的界面,欢迎进入******\\n");

  printf("\*━━━━━━━━━━━━━━━━━━━*\\n");

  printf("\             1.添加城市\\n");

  printf("\             2.删除城市\\n");

  printf("\             3.添加交通路线\\n");

  printf("\             4.删除交通路线\\n");

  printf("\             0.返回上一级菜单\\n");

  printf("\****************************************\\n");

  printf("\\n\请选择:");

  scanf("%d",&Command);

  switch(Command)

  {

  case 0:

   return;

  case 1://添加城市

   InitSystem();

   printf("\\n\输入城市名:");

   scanf("%s",&name);

   InsertCity(name);

   SaveFile();

   printf("\系统信息输入成功!\\n");

   break;

  case 2://删除城市

   InitSystem();

   printf("\\n\输入城市名:");

   scanf("%s",&name);

   DelCity(name);

   SaveFile();

   printf("\系统信息输入成功!\\n");

   break;

  case 3://添加交通路线

   InitSystem();

   printf("\请输入起始站城市名:");

   scanf("%s",&s_city);

   printf("\请输入终点站城市名:");

   scanf("%s",&e_city);

   printf("\请选择交通工具(火车0,飞机1):");

   scanf("%d",&traveltype);

   printf("\请输入火车/飞机班次:");

   scanf("%s",&name);

   printf("\请输入起始时刻(00:00,24小时制):");

   scanf("%2d:%2d",&s_hour,&s_minute);

   printf("\请输入到达时刻(00:00,24小时制):");

   scanf("%2d:%2d",&e_hour,&e_minute);

   printf("\请输入票价:");

   scanf("%d",&cost);

   if(traveltype)

    InsertFlight(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost);

   else

    InsertTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost);

   SaveFile();

   printf("\系统信息输入成功!\\n");

   break;

  case 4://删除交通路线

   InitSystem();

   printf("\请输入班次:");

   scanf("%s",&name);

   DelPath(name);

   SaveFile();

   printf("\系统信息输入成功!\\n");

   break;

  default:

   printf("\选择序号错误!请重新选择!\\n");

   flag=1;

  }

 }while(flag);

}

void Line(int city,int traveltype)

{

 //查找城市中的所有路线

 int i;

 printf("\\n\您要查找的路线为:");

 printf("\\n\*─────────────────────────────*\\n");

 printf("\车号       起始站         终点站           时间       花费\\n");

 if(!traveltype)//类型为火车

 {

for(i=0;i  {

   printf("\\n\%s",AdjList[city].Train[i].name);//输出火车班次

   printf("\%10s",CityName[city]);//输出起始城市名

   printf("\%10s",CityName[AdjList[city].Train[i].EndCity]);//输出终点城市名

   printf("\%2d:%2d-%2d:%2d",AdjList[city].Train[i].StartTime/60, 

    AdjList[city].Train[i].StartTime%60, 

    AdjList[city].Train[i].StopTime/60, 

    AdjList[city].Train[i].StopTime%60);//输出起止时间

   printf("\%d\\n",AdjList[city].Train[i].Cost);//输出花费

  }

 }

 else

 {

for(i=0;i  {

   printf("\\n\%s",AdjList[city].Flight[i].name);//输出火车班次

   printf("\%10s",CityName[city]);//输出起始城市名

   printf("\%10s",CityName[AdjList[city].Flight[i].EndCity]);//输出终点城市名

   printf("\%2d:%2d-%2d:%2d",AdjList[city].Flight[i].StartTime/60, 

    AdjList[city].Flight[i].StartTime%60, 

    AdjList[city].Flight[i].StopTime/60, 

    AdjList[city].Flight[i].StopTime%60);//输出起止时间

   printf("\%d\\n",AdjList[city].Flight[i].Cost);//输出花费

  }

 }

 printf("\*─────────────────────────────*\\n");

}

void User()

{

 //用户界面

 char name[10];

 int startcity,endcity;

 int Command,flag,traveltype;

 do

 {

  printf("\\n\*******这里是用户的界面,欢迎进入*******\\n");

  printf("\*━━━━━━━━━━━━━━━━━━━*\\n");

  printf("\          1.查询最小耗费路线\\n");

  printf("\          2.查询最短时间路线\\n");

  printf("\          3.查询城市所有路线\\n");

  printf("\          0.返回上一级菜单\\n");

  printf("\****************************************\\n");

  printf("\\n\请选择:");

  scanf("%d",&Command);

  switch(Command)

  {

  case 0:

   return;

  case 1://最小耗费

   InitSystem();

   printf("\\n\请输入起始城市:");

   scanf("%s",&name);

   startcity=SeekCity(name);

if(startcity<0)

   {

    printf("\输入城市名错误!\\n");

    break;

   }

   printf("\请输入终点城市:");

   scanf("%s",&name);

   endcity=SeekCity(name);

if(endcity<0)

   {

    printf("\输入城市名错误!\\n");

    break;

   }

   printf("\请选择交通工具(火车0,飞机1):");

   scanf("%d",&traveltype);

   if(traveltype!=0&&traveltype!=1)

   {

    printf("\输入错误!\\n");

    break;

   }

   CalcMinCost(startcity,endcity,traveltype);

   printf("\\n");

   break;

  case 2://最短时间

   InitSystem();

   printf("\\n\请输入起始城市:");

   scanf("%s",&name);

   startcity=SeekCity(name);

if(startcity<0)

   {

    printf("\输入城市名错误!\\n");

    break;

   }

   printf("\请输入终点城市:");

   scanf("%s",&name);

   endcity=SeekCity(name);

if(endcity<0)

   {

    printf("\输入城市名错误!\\n");

    break;

   }

   printf("\请选择交通工具(火车0,飞机1):");

   scanf("%d",&traveltype);

   if(traveltype!=0&&traveltype!=1)

   {

    printf("\输入错误!\\n");

    break;

   }

   CalcMinTime(startcity,endcity,traveltype);

   printf("\\n");

   break;

  case 3://查找城市所有路线

   InitSystem();

   printf("\\n\请输入要查找路线的城市:");

   scanf("%s",&name);

   startcity=SeekCity(name);

if(startcity<0)

   {

    printf("\输入城市名错误!\\n");

    break;

   }

   printf("\请选择交通工具(火车0,飞机1):");

   scanf("%d",&traveltype);

   if(traveltype!=0&&traveltype!=1)

   {

    printf("\输入错误!\\n");

    break;

   }

   Line(startcity,traveltype);

   printf("\\n");

   break;

  default:

   printf("\选择序号错误!请重新选择!\\n");

   flag=1;

  }

 }while(flag);

}

int main()

{

 //主界面

 int Command;

 while(1)

 {

  printf("\\n\┏****★欢迎使用交通咨询系统V1.0★****┓\\n");

  printf("\┗━━━━━━━━━━━━━━━━━━┛\\n");

  printf("\ ------------请选择您的身份------------\\n");

  printf("\ *━━━━━━━━━━━━━━━━━━*\\n");

  printf("\               1.管理员\\n");

  printf("\               2.用户\\n");

  printf("\               0.退出\\n");

  printf("\ **************************************\\n");

  printf("\\n\请选择:");

  scanf("%d",&Command);

  switch(Command)

  {

  case 0:

   return 0;

  case 1:

   Administrators();

   break;

  case 2:

   User();

   break;

  default:

   printf("\选择序号错误!请重新选择!\\n");

  }

 }

}

六.实验总结:

课程设计是对自己一个学期以来学习的良好检验,在所有课题中,我选择了交通咨询系统的课题题目。在一个星期的设计过程中,碰到过许多困难,也从书籍和网络中找过许多相关资料来完善自己的设计。但结果不是让人很满意,可能是接触时间太短,对数据结构的认识还不深刻。

通过这次课程设计,我对用迪杰斯特拉算法计算最短路径有了更深刻的认识,加强了我对数据结构的了解。我知道如果要想在C方面有成就,必须多想多练习。现在我还是缺少练习,看程序可能看得懂。而当真正的编写程序起来就遇到困难了。通过这次系统的编写,我明白了编程要细心,有耐心。有些程序看起来很多很难,但只要抽丝剥茧的慢慢分析,就能明白它是怎么运行的。其实,只要踏踏实实一步一步来,你会发觉原来编程难度也不过如此。同时,我懂得了要多思考,遇到问题或不解时不能不懂装懂,要尽量去想请清其缘由,要懂得查阅有用的资料。

我知道在这次的课程设计中自已还有许多的欠缺,在以后的日子中,我一定得更加严格要求自己,改正缺点,不断努力,不断进步。

文档

交通咨询系统

课程设计说明书(数据结构(C语言版))班级:信管B08-1班姓名:设计题目:交通咨询系统设计时间:__2010-9-6_____至___2010-9-16____指导教师:__________________________评语:______________________________________________________________________________________________________________________________________
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top