数据结构 旅游交通查询系统实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计报告
题目:《旅游交通查询系统》
采用的方法:邻接矩阵、Dijkstra、文件操作
班级:
姓名:
指导教师:
成绩:
信息工程学院
XX年XX月XX日
目录
一、问题描述 (2)
1.1问题描述: (2)
1.2基本要求: (2)
二、需求分析 (2)
2.1 项目需求 (2)
2.2项目业务要求 (3)
三、概要设计 (3)
3.1概要设计思想 (3)
3.2所有声明的所有抽象数据类型 (3)
3.3 各层次之间的关系 (4)
四、详细设计 (5)
4.1 流程图 (5)
4.2本系统的模块 (5)
4.2各模块的设计 (6)
五、调试分析 (17)
5.1遇到的问题 (17)
5.2解决方法 (17)
5.3算法的时间复杂度 (17)
六、测试结果 (17)
七、经验和体会 (22)
八、参考文献 (23)
九、源代码 (23)
一、问题描述
1.1问题描述:
处于对不同目的的旅客对交通工具有不同的要求。

例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。

编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

1.2基本要求:
实现功能:火车信息查询、最短路径查询、火车信息编辑、读入修改信息、查看火车信息、查看城市信息。

每个功能中又有一些小功能,如火车信息查询中有:按车次查询、按出发地与目的地查询(其中又有最快、最省钱、全部选择)中转站查询、查看火车信息,火车信息编辑又包括:添加火车信息、删除火车信息、查看火车信息、保存火车信息功能。

二、需求分析
2.1 项目需求
1、设计最短路径的算法及其需要信息的存储:本设计中最短路径的算法利用迪杰斯特拉算法,存储方法利用邻接矩阵存储。

2、该程序所做的工作的是模拟旅游交通查询,为旅客提供种最优决策的交通查询。

此程序规定:
在程序中输入城市名称时,需输入15个字符以内的字母串;输入列车编号时需输入一个字符串类型;输入列车的费用时需输入一个实型数据;输入列车开始时间和到达时间时均需输入一个整型数据,在选择功能时,应输入与所选功能对应的一个整型数据。

程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少费用才能到达,输出在途中经过的城市名称;
程序的功能包括:火车信息查询、最短路径查询、火车信息编辑、读入修改信息、查看火车信息、查看城市信息,提供三种最优决策:最快到达、最省钱到达,最短路程到达。

2.2项目业务要求
模拟旅游交通查询系统,能实现现实生活中对火车以及旅客的各种需求做出相应的程序;能实现选择功能。

三、概要设计
3.1概要设计思想
本系统整体上分为存储系统、编辑列车城市信息以及求最短路径、最短时间、最小费用三部分,存储系统运用到数组和结构体。

该系统分别存储火车列次,出发点与目的地以及所需要走的路程和所需费用。

编辑列车城市信息通过利用一个大的switch case 以及if else 和while语句来实现对于火车飞机的添加,删除以及因为输入错误可以退出的不同功能的实现。

最短路径、最短时间、最小费用使用迪杰斯特拉算法编程求算得出最近、最短时间、最便宜路径。

该算法主要分为三步:1、起始点(V0)与其相邻点的权值(即当前最短路径)。

2、求出当前最短路径中的最小值即是该起始点(V0)与另一点(Vi)的最短路径。

3、V0到Vi的距离加上Vi到Vj的距离小于V0到Vj则将V0到Vi的距离加上Vi到Vj的距离记为V0到Vj当前最短路径,循环第二、三步。

如此得到V0到各点的最短路径,进而可以得到想要的一条。

3.2所有声明的所有抽象数据类型
int AddCity (char *Name);
int FindNumofCity (char *name);
int DelCity (char *Name);
int AddTrain (char *train,char *DepCity,char *DesCity,int DepTime,int EndTime,int cost,int length);
int DelPath (char *name);
void FindMinPrice_Print(int matx[34][34],int PreCity[34],int p_end);
void FindMinpathlength_Print(int matx[34][34],int PreCity[34],int p_end);
void FindMinPrice(int matx[34][34],int p_start,int p_end);
void FindMinpathlength(int matx[34][34],int p_start,int p_end);
int InitSysData ();
int SearchMinTime (NumType City,NumType DesCity,int CurTime,int curPathNo);
int CalcMinTime (int DepCity,int DesCity);
int CalcMinPrice (int DepCity,int DesCity);
int CalcMinpathlength (int DepCity,int DesCity);
int StartUI();
int SaveSysInfo();
3.3 各层次之间的关系
图3-1 各层次之间关系图
四、详细设计
4.1 流程图
图4-1 流程图4.2本系统的模块
1、主函数
2、添加城市
3、删除城市
4、添加列车
5、删除列车
6、找出最小费用路线
7、打印出最小费用路线
8、初始化系统数据(读入内存)
9、找出最快路线
10、计算最快路线耗费的时间并打印
11、找出最短路程路线
12、打印出最短路程路线
13、主界面
14、存储信息到文件
4.2各模块的设计
○1、主函数:
while (1)
{
StartUI();
scanf("%d",&Command);
switch (Command)
{
case 0:
return 0;
case 1:
InitSysData();
printf("\n请输入城市名:");
scanf("%s",&name);
SaveSysInfo();
printf("数据保存完毕!\n");
break;
case 2:
InitSysData();
printf("\n请输入城市名:");
scanf("%s",&name);
DelCity(name);
SaveSysInfo();
printf("数据保存完毕!\n");
break;
case 3:
InitSysData();
printf("起始站城市名:");
scanf("%s",&s_city);
printf("终点站城市名:");
scanf("%s",&e_city);
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);
printf("里程:");
scanf("%d",&length);
AddTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost,length); SaveSysInfo();
printf("数据保存完毕!\n");
break;
case 4:
InitSysData();
printf("输入列车车次:");
scanf("%s",&name);
SaveSysInfo();
printf("数据保存完毕!\n"); break;
case 5:
InitSysData();
printf("\n起始城市:");
scanf("%s",&name);
DepCity=FindNumofCity(name); if (DepCity<0)
{
printf("系统中无该城市数据!\n"); break;
}
printf("终点城市:");
scanf("%s",&name);
endcity=FindNumofCity(name);
if (endcity<0)
{
printf("系统中无该城市数据!\n"); break;
}
CalcMinPrice(DepCity,endcity); printf("\n");
break;
case 6:
InitSysData();
printf("\n起始城市:");
scanf("%s",&name);
DepCity=FindNumofCity(name); if (DepCity<0)
{
printf("系统中无此城市数据!\n"); break;
}
printf("终点城市:");
scanf("%s",&name);
endcity=FindNumofCity(name);
if (endcity<0)
{
printf("系统中无此城市数据!\n"); break;
}
CalcMinTime(DepCity,endcity); printf("\n");
break;
case 7:
InitSysData();
printf("\n起始城市:");
scanf("%s",&name);
DepCity=FindNumofCity(name);
if (DepCity<0)
{
printf("系统中无此城市数据!\n"); break;
}
printf("终点城市:");
scanf("%s",&name);
endcity=FindNumofCity(name);
if (endcity<0)
{ printf("系统中无此城市数据!\n"); break;
}
CalcMinpathlength(DepCity,endcity); printf("\n");
break;} }}
○2、添加城市:
//////////////////////////////////////////////添加城市////////////////////////////////////////////////////////
int AddCity (char *Name)
{
strcpy(CityName[NumofCity],Name);
CityInfo[NumofCity].city=NumofCity;
CityInfo[NumofCity].TrainNum=0;
NumofCity++;
return 1;
}
○3、添加列车:
//////////////////////////////////////////添加列车//////////////////////////////////////////////////////
int AddTrain (char *train,char *DepCity,char *DesCity,int DepTime,int EndTime,int cost,int length)
{
int i,j;
i=FindNumofCity(DepCity);
j=FindNumofCity(DesCity);
CityInfo[i].Train[CityInfo[i].TrainNum].Price=cost;
CityInfo[i].Train[CityInfo[i].TrainNum].pathlength=length;
CityInfo[i].Train[CityInfo[i].TrainNum].DesCity=j;
CityInfo[i].Train[CityInfo[i].TrainNum].DepTime=DepTime;
CityInfo[i].Train[CityInfo[i].TrainNum].ArriveTime=EndTime;
strcpy(CityInfo[i].Train[CityInfo[i].TrainNum].name,train);
CityInfo[i].TrainNum++;
return 1;
}
○4、删除交通路线:
////////////////////////////////////////删除路线////////////////////////////////////////////////////////////
int DelPath (char *name)
{
int i;
int j;
int flag=0;
for (i=0;i<NumofCity;i++)
{
for (j=0;j<CityInfo[i].TrainNum;j++)
if (strcmp(CityInfo[i].Train[j].name,name)==0)
{
flag=1;break;
}
if (flag)
{
for (;j<CityInfo[i].TrainNum-1;j++)
{
CityInfo[i].Train[j].Price=CityInfo[i].Train[j+1].Price;
CityInfo[i].Train[j].DesCity=CityInfo[i].Train[j+1].DesCity;
strcpy(CityInfo[i].Train[j].name,CityInfo[i].Train[j+1].name);
CityInfo[i].Train[j].DepTime=CityInfo[i].Train[j+1].DepTime;
CityInfo[i].Train[j].ArriveTime=CityInfo[i].Train[j+1].ArriveTime;
}
CityInfo[i].TrainNum--;break;
}
}
return 1;
}
○5、查询最小费用路线:
/////////////////////////////////////////////////计算最小费用路线////////////////////////////////////////////////////////// int CalcMinPrice (int DepCity,int DesCity)
{
int ma[34][34];
int i,j,min,end;
for (i=0;i<NumofCity;i++)
for (j=0;j<NumofCity;j++)
ma[i][j]=-1;
for (i=0;i<NumofCity;i++)
{
min=32767;j=0;
while (j<CityInfo[i].TrainNum)
{
min=32767;
end=CityInfo[i].Train[j].DesCity;
while (end==CityInfo[i].Train[j].DesCity&&j<CityInfo[i].TrainNum)
if (CityInfo[i].Train[j].Price<min)
{
min=CityInfo[i].Train[j].Price;
}
j++;
}
ma[i][end]=min;
}
}
FindMinPrice(ma,DepCity,DesCity);
return 1;
}
○6、计算最小耗时路线:
int CalcMinTime (int DepCity,int DesCity)
{
int i;
MinTime=32767;curPath=0;
TemPath[0].City=DepCity;
for (i=0;i<CityInfo[DepCity].TrainNum;i++)
{
TemPath[0].FlainNo=i;
DepTime=CityInfo[DepCity].Train[i].DepTime;
SearchMinTime(CityInfo[DepCity].Train[i].DesCity,DesCity,CityInfo[DepCity].Train[i].ArriveTime,0); }
if (MinTime==32767)
printf("\n系统中无该路线!");
return 0;
}
printf("\n旅行路线:\n");
for (i=0;i<=curPath;i++)
{
printf("%s : 请乘坐%s 次列车起止时间:",CityName[MinPath[i].City],CityInfo[MinPath[i].City].Train[MinPath[i].FlainNo].name);
}
printf("%s: 已到达目的地",CityName[DesCity]);
printf("\n旅途耗费时间: %02d:%02d",MinTime/60,MinTime%60);
return 1;
}
○7、计算最小路程路线:
注:此模块的设计与“查询最小费用路线”类似,此处省略!
○8、初始化数据
//////////////////////////////////////////////初始化数据//////////////////////////////////////////////
int InitSysData ()
{
FILE *fp;
int i,j,hour,minute,num,cost,length;
char TempString1[15];
char TempString2[15];
char TempString3[15];
fp=fopen(CityFile,"r");
if (!fp)
{
printf("\n文件打开错误!\n请先初始化系统数据!");
return -1;
}
fscanf(fp,"%d",&NumofCity);
for (i=0;i<NumofCity;i++)
{
fscanf(fp,"%s",&CityName[i]);
CityInfo[i].city=i;
CityInfo[i].TrainNum=0;
}
fclose(fp);
fp=fopen(TrainFile,"r");
if (!fp)
{
printf("\n文件打开错误\n请先初始化系统数据!");
return -1;
}
fscanf(fp,"%d",&num);
for (i=0;i<num;i++)
{
fscanf(fp,"%s",&TempString1);
fscanf(fp,"%s",&TempString2);
fscanf(fp,"%s",&TempString3);
j=FindNumofCity(TempString2);
CityInfo[j].Train[CityInfo[j].TrainNum].DesCity=FindNumofCity(TempString3); strcpy(CityInfo[j].Train[CityInfo[j].TrainNum].name,TempString1);
fscanf(fp,"%d:%d",&hour,&minute);
CityInfo[j].Train[CityInfo[j].TrainNum].DepTime=hour*60+minute;
fscanf(fp,"%d:%d",&hour,&minute);
CityInfo[j].Train[CityInfo[j].TrainNum].ArriveTime=hour*60+minute;
fscanf(fp,"%d",&cost);
CityInfo[j].Train[CityInfo[j].TrainNum].Price=cost;
fscanf(fp,"%d",&length);
CityInfo[j].Train[CityInfo[j].TrainNum].pathlength=length;
CityInfo[j].TrainNum++;
}
fclose(fp);
return 1;
}
○9、保存数据
/////////////////////////////////////////////////////保存数据/////////////////////////////////////////////////
int SaveSysInfo()
{
FILE *fp;
int i,j,total;
fp=fopen(CityFile,"w");
fprintf(fp,"%d\n",NumofCity);
for (i=0;i<NumofCity;i++)
{
fprintf(fp,"%s\n",CityName[i]);
}
fclose(fp);
total=0;
fp=fopen(TrainFile,"w");
for (i=0;i<NumofCity;i++)
{
total+=CityInfo[i].TrainNum;
}
fprintf(fp,"%d\n",total);
for (i=0;i<NumofCity;i++)
{
for (j=0;j<CityInfo[i].TrainNum;j++)
{
fprintf(fp,"%s %s %s ", CityInfo[i].Train[j].name,
CityName[i],
CityName[CityInfo[i].Train[j].DesCity]);
fprintf(fp,"%2d:%2d %2d:%2d %d ", CityInfo[i].Train[j].DepTime/60,
CityInfo[i].Train[j].DepTime%60,
CityInfo[i].Train[j].ArriveTime/60,
CityInfo[i].Train[j].ArriveTime%60,
CityInfo[i].Train[j].Price);
fprintf(fp,"%d\n",CityInfo[i].Train[j].pathlength);
}
}
fclose(fp);total=0;
return 1;
}
五、调试分析
5.1遇到的问题
首先,调试过程中遇到的问题主要是数据类型不匹配、参数没有声明、运行结果与要求不一致等问题。

5.2解决方法
前两个就是不断调试找出错误;后面的主要是查阅资料、书籍和老师指导,反复阅读实例文档。

设计思想与实现:编辑列车城市信息通过利用一个大的switch case 以及if else 和while语句来实现对于火车飞机的添加,删除以及因为输入错误可以退出的不同功能的实现。

最短路径、最短时间、最小费用使用迪杰斯特拉算法编程求算得出最近、最短时间、最便宜路径。

该算法主要分为三步:1、起始点(V0)与其相邻点的权值(即当前最短路径)。

2、求出当前最短路径中的最小值即是该起始点(V0)与另一点(Vi)的最短路径。

3、V0到Vi的距离加上Vi到Vj的距离小于V0到Vj则将V0到Vi的距离加上Vi 到Vj的距离记为V0到Vj当前最短路径,循环第二、三步。

如此得到V0到各点的最短路径,进而可以得到想要的一条。

通过反复修改、调试实现。

5.3算法的时间复杂度
Dijkstra:
时间复杂度:O(n2)
六、测试结果
1、主界面
2、添加城市模块:输入命令1 后,将提示输入城市名,而后返回主界面
3、
原有的city文件
3、删除城市:输入命令2后,提示输入城市名,而后返回主界面
添加城市后的city文件
4、添加交通路线:输入命令3,提示输入起点站和重点站,而后输入班次、出发时间、到达时间、票价,而后返回主界面
原有的train文件
添加路线后的train文件
5、删除路线:输入命令4,输入班次,而后返回主界面删除路线后的train文件
6、查询最小费用路线:输入命令5,并输入起点站和重点站
结果完全正确!!!
7、查询时间最短路线:输入命令6,并输入起点站和重点站
结果完全正确!!!
8、查询路程最短路线:输入命令7,并输入起点站和重点
结果完全正确!!!
9、输入0,程序结束,退出系统
七、经验和体会
本次课程设计,我分析和设计了旅游交通查询系统,此次设计让我对计算机和软件有了更浓厚的兴趣,让明白了以后的发展方向和奋斗目标,让我对迪杰斯特拉算法
有了更深的理解,同时也对软件的设计的各种分析和设计有了更深的理解,我觉得课程设计很接近实际,是锻炼我们动手能力的好机会,为以后的工作打下基础。

本次试验让我明白了软件设计的思想和方法,1、需求分析,分析为什么需要这个软件,这个软件要实现什么;2、概要设计,设计如何实现的软件功能,要实现结构化设计,把实现软件功能的程序模块化;3、详细设计,编写各个模块的具体实现的程序;4、上机调试,得到运行结果;5、对程序进行分析改进,重复4步骤。

我也通过本次课程设计查阅了不少资料,学到了不少知识,也学到了不少调试程序的方法,最重要的是积累了不少经验。

八、参考文献
[1]谭浩强.C语言程序设计(第四版).清华大学出版社.2010年6月第4版
[2]严蔚敏吴伟民.数据结构题集(C语言版).清华大学出版社.2009年2月第28版
[3]严蔚敏吴伟民.数据结构(C语言版).清华大学出版社.2009年2月第28版
九、源代码
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
typedef short int NumType;
typedef struct TrafficWay
{
char name[15];
int DepTime;
int ArriveTime;
int DesCity;
int Price;
int pathlength;
} TrafficWayDat;
typedef struct CityNode
{
NumType city;
int TrainNum,FlightNum;
TrafficWayDat Train[15];
TrafficWayDat Flight[15];
} CityNodeDat;
typedef struct PathNode
{
int City;
int FlainNo;
} PathNodeDat;
CityNodeDat CityInfo[33];
char CityName[33][15];
int NumofCity;
PathNodeDat TemPath[33];
PathNodeDat MinPath[33];
int MinTime,DepTime;
int curPath;
const char CityFile[] ="city.txt";
const char TrainFile[] ="train.txt";
int AddCity (char *Name)
{
strcpy(CityName[NumofCity],Name);
CityInfo[NumofCity].city=NumofCity;
CityInfo[NumofCity].TrainNum=0;
NumofCity++;
return 1;
}
int FindNumofCity (char *name)
{
int i;
for (i=0;i<NumofCity;i++)
if (strcmp(name,CityName[i])==0)
return i;
return -1;
}
int DelCity (char *Name)
{
int city,i,j;
city=FindNumofCity(Name);
for (i=city;i<NumofCity-1;i++)
{
strcpy(CityName[i],CityName[i+1]);
CityInfo[i].TrainNum=CityInfo[i+1].TrainNum;
for (j=0;j<CityInfo[i].TrainNum;j++)
{
CityInfo[i].Train[j].Price=CityInfo[i+1].Train[j].Price;
CityInfo[i].Train[j].DesCity=CityInfo[i+1].Train[j].DesCity;
strcpy(CityInfo[i].Train[j].name,CityInfo[i+1].Train[j].name);
CityInfo[i].Train[j].DepTime=CityInfo[i+1].Train[j].DepTime;
CityInfo[i].Train[j].ArriveTime=CityInfo[i+1].Train[j].ArriveTime;
}
}
NumofCity--;
return 1;
}
int AddTrain (char *train,char *DepCity,char *DesCity,int DepTime,int EndTime,int cost,int length) {
int i,j;
i=FindNumofCity(DepCity);
j=FindNumofCity(DesCity);
CityInfo[i].Train[CityInfo[i].TrainNum].Price=cost;
CityInfo[i].Train[CityInfo[i].TrainNum].pathlength=length;
CityInfo[i].Train[CityInfo[i].TrainNum].DesCity=j;
CityInfo[i].Train[CityInfo[i].TrainNum].DepTime=DepTime;
CityInfo[i].Train[CityInfo[i].TrainNum].ArriveTime=EndTime;
strcpy(CityInfo[i].Train[CityInfo[i].TrainNum].name,train);
CityInfo[i].TrainNum++;
return 1;
}
int DelPath (char *name)
{
int i;
int j;
int flag=0;
for (i=0;i<NumofCity;i++)
{
for (j=0;j<CityInfo[i].TrainNum;j++)
if (strcmp(CityInfo[i].Train[j].name,name)==0)
{
flag=1;break;
}
if (flag)
{
for (;j<CityInfo[i].TrainNum-1;j++)
{
CityInfo[i].Train[j].Price=CityInfo[i].Train[j+1].Price;
CityInfo[i].Train[j].DesCity=CityInfo[i].Train[j+1].DesCity;
strcpy(CityInfo[i].Train[j].name,CityInfo[i].Train[j+1].name);
CityInfo[i].Train[j].DepTime=CityInfo[i].Train[j+1].DepTime;
CityInfo[i].Train[j].ArriveTime=CityInfo[i].Train[j+1].ArriveTime;
}
CityInfo[i].TrainNum--;break;
}
}
return 1;
}
void FindMinPrice_Print(int matx[34][34],int PreCity[34],int p_end)
{
int track[34];
int i=0,j,k,min,tmp,end,cost=0;
j=p_end;
track[i++]=j;
while (PreCity[j]>=0)
{
cost+=matx[PreCity[j]][j];
track[i++]=j=PreCity[j];
}
printf("\n旅行路线:");
for(i--;i>0;i--)
{
printf("\n%s:",CityName[track[i]]);
end=track[i-1];min=32767;
for (k=0;k<CityInfo[track[i]].TrainNum;k++)
if (CityInfo[track[i]].Train[k].DesCity==end&&min>CityInfo[track[i]].Train[k].Price)
{
min=CityInfo[track[i]].Train[k].Price;
tmp=k;
}
printf("请乘坐%s次列车起止时间:",CityInfo[track[i]].Train[tmp].name);
printf("%02d:%02d-%02d:%02d",CityInfo[track[i]].Train[tmp].DepTime/60,CityInfo[track[i]].Train[tmp]. DepTime%60,CityInfo[track[i]].Train[tmp].ArriveTime/60,CityInfo[track[i]].Train[tmp].ArriveTime%60); }
printf("\n%s: 已到达目的地",CityName[track[0]]);
printf("\n最低价格: %d\n",cost);
}
void FindMinpathlength_Print(int matx[34][34],int PreCity[34],int p_end)
{
int track[34];
int i=0,j,k,tmp,end,length=0;
int min;
j=p_end;
track[i++]=j;
while (PreCity[j]>=0)
{
length+=matx[PreCity[j]][j];
track[i++]=j=PreCity[j];
}
printf("\n旅行路线:");
for(i--;i>0;i--)
{
printf("\n%s:",CityName[track[i]]);
end=track[i-1];min=32767;
for (k=0;k<CityInfo[track[i]].TrainNum;k++)
if (CityInfo[track[i]].Train[k].DesCity==end&&min>CityInfo[track[i]].Train[k].pathlength)
{
min=CityInfo[track[i]].Train[k].pathlength;
tmp=k;
}
printf("请乘坐%s次列车起止时间:",CityInfo[track[i]].Train[tmp].name);
printf("%02d:%02d-%02d:%02d",CityInfo[track[i]].Train[tmp].DepTime/60,CityInfo[track[i]].Train[tmp]. DepTime%60,CityInfo[track[i]].Train[tmp].ArriveTime/60,CityInfo[track[i]].Train[tmp].ArriveTime%60); }
printf("\n%s: 已到达目的地",CityName[track[0]]);
printf("\n最短路程: %d\n",length);
}
void FindMinPrice(int matx[34][34],int p_start,int p_end)
{
int PreCity[34];
int i,j,min,pre,pos;
for (i=0;i<NumofCity;i++)
{
PreCity[i]=-1;
}
PreCity[p_start]=-2;
while (PreCity[p_end]==-1)
{
min=-1;
for (i=0;i<NumofCity;i++)
if (PreCity[i]!=-1)
{
for (j=0;j<NumofCity;j++)
if (PreCity[j]==-1&&matx[i][j]>0&&(min<0||matx[i][j]<min))
{
pre=i;pos=j;min=matx[i][j];
}
}
PreCity[pos]=pre;
}
FindMinPrice_Print(matx,PreCity,p_end);
}
void FindMinpathlength(int matx[34][34],int p_start,int p_end)
{
int PreCity[34];
int i,j,min,pre,pos;
for (i=0;i<NumofCity;i++)
{
PreCity[i]=-1;
}
PreCity[p_start]=-2;
while (PreCity[p_end]==-1)
{
min=-1;
for (i=0;i<NumofCity;i++)
if (PreCity[i]!=-1)
{
for (j=0;j<NumofCity;j++)
if (PreCity[j]==-1&&matx[i][j]>0&&(min<0||matx[i][j]<min)) {
pre=i;pos=j;min=matx[i][j];
}
}
PreCity[pos]=pre;
}
FindMinpathlength_Print(matx,PreCity,p_end);
}
int InitSysData ()
{
FILE *fp;
int i,j,hour,minute,num,cost,length;
char TempString1[15];
char TempString2[15];
char TempString3[15];
fp=fopen(CityFile,"r");
if (!fp)
{
printf("\n文件打开错误!\n请先初始化系统数据!"); return -1;
}
fscanf(fp,"%d",&NumofCity);
for (i=0;i<NumofCity;i++)
{
fscanf(fp,"%s",&CityName[i]);
CityInfo[i].city=i;
CityInfo[i].TrainNum=0;
}
fclose(fp);
fp=fopen(TrainFile,"r");
if (!fp)
{
printf("\n文件打开错误\n请先初始化系统数据!");
return -1;
}
fscanf(fp,"%d",&num);
for (i=0;i<num;i++)
{
fscanf(fp,"%s",&TempString1);
fscanf(fp,"%s",&TempString2);
fscanf(fp,"%s",&TempString3);
j=FindNumofCity(TempString2);
CityInfo[j].Train[CityInfo[j].TrainNum].DesCity=FindNumofCity(TempString3); strcpy(CityInfo[j].Train[CityInfo[j].TrainNum].name,TempString1);
fscanf(fp,"%d:%d",&hour,&minute);
CityInfo[j].Train[CityInfo[j].TrainNum].DepTime=hour*60+minute;
fscanf(fp,"%d:%d",&hour,&minute);
CityInfo[j].Train[CityInfo[j].TrainNum].ArriveTime=hour*60+minute;
fscanf(fp,"%d",&cost);
CityInfo[j].Train[CityInfo[j].TrainNum].Price=cost;
fscanf(fp,"%d",&length);
CityInfo[j].Train[CityInfo[j].TrainNum].pathlength=length;
CityInfo[j].TrainNum++;
}
fclose(fp);
return 1;
}
int SearchMinTime (NumType City,NumType DesCity,int CurTime,int curPathNo) {
int i;
if (City==DesCity)
{
if (MinTime>CurTime-DepTime)
{
for (i=0;i<=curPathNo;i++)
{
MinPath[i].City=TemPath[i].City;
MinPath[i].FlainNo=TemPath[i].FlainNo;
curPath=curPathNo;
}
if(CurTime<DepTime)
MinTime=CurTime+1440-DepTime;
else
MinTime=CurTime-DepTime;
}
}
else
{
curPathNo++;
TemPath[curPathNo].City=City;
for (i=0;i<CityInfo[City].TrainNum;i++)
{
if
((CityInfo[City].Train[i].DepTime>=(CurTime%1440))&&(CityInfo[City].Train[i].ArriveTime+(CurTime/ 1440)*1440-DepTime<MinTime))
{
TemPath[curPathNo].FlainNo=i;
SearchMinTime(CityInfo[City].Train[i].DesCity,DesCity,CityInfo[City].Train[i].ArriveTime+(CurTime/14 40)*1440,curPathNo);
}
if
((CityInfo[City].Train[i].DepTime<(CurTime%1440))&&(CityInfo[City].Train[i].ArriveTime+(CurTime/1 440)*1440-DepTime<MinTime))
{
TemPath[curPathNo].FlainNo=i;
SearchMinTime(CityInfo[City].Train[i].DesCity,DesCity,CityInfo[City].Train[i].ArriveTime+(CurTime/14 40+1)*1440,curPathNo);
}
}
}
return 1;
}
int CalcMinTime (int DepCity,int DesCity)
{
int i;
MinTime=32767;curPath=0;
TemPath[0].City=DepCity;
for (i=0;i<CityInfo[DepCity].TrainNum;i++)
{
TemPath[0].FlainNo=i;
DepTime=CityInfo[DepCity].Train[i].DepTime;
SearchMinTime(CityInfo[DepCity].Train[i].DesCity,DesCity,CityInfo[DepCity].Train[i].ArriveTime,0); }
if (MinTime==32767)
{
printf("\n系统中无该路线!");
return 0;
}
printf("\n旅行路线:\n");
for (i=0;i<=curPath;i++)
{
printf("%s : 请乘坐%s 次列车起止时间:",CityName[MinPath[i].City],CityInfo[MinPath[i].City].Train[MinPath[i].FlainNo].name);
}
printf("%s: 已到达目的地",CityName[DesCity]);
printf("\n旅途耗费时间: %02d:%02d",MinTime/60,MinTime%60);
return 1;
}
int CalcMinPrice (int DepCity,int DesCity)
{
int ma[34][34];
int i,j,min,end;
for (i=0;i<NumofCity;i++)
for (j=0;j<NumofCity;j++)
ma[i][j]=-1;
for (i=0;i<NumofCity;i++)
{
min=32767;j=0;
while (j<CityInfo[i].TrainNum)
{
min=32767;
end=CityInfo[i].Train[j].DesCity;
while (end==CityInfo[i].Train[j].DesCity&&j<CityInfo[i].TrainNum)
{
if (CityInfo[i].Train[j].Price<min)
{
min=CityInfo[i].Train[j].Price;
}
j++;
}
ma[i][end]=min;
}
}
FindMinPrice(ma,DepCity,DesCity);
return 1;
}
int CalcMinpathlength (int DepCity,int DesCity)
{
int ma[34][34];
int i,j,end,min;
;
for (i=0;i<NumofCity;i++)
for (j=0;j<NumofCity;j++)
ma[i][j]=-1;
for (i=0;i<NumofCity;i++)
{
min=32767;j=0;
while (j<CityInfo[i].TrainNum)
{
min=32767;
end=CityInfo[i].Train[j].DesCity;
while (end==CityInfo[i].Train[j].DesCity&&j<CityInfo[i].TrainNum)
{
if (CityInfo[i].Train[j].pathlength<min)
{
min=CityInfo[i].Train[j].pathlength;
}
j++;
}
ma[i][end]=min;
}
}
FindMinpathlength(ma,DepCity,DesCity);
return 1;
}
int StartUI()
{
printf(" **************************************************\n");
printf(" * *\n");
printf(" * 欢迎使用旅游交通查询系统!*\n");
printf(" * *\n");
printf(" **************************************************\n");
printf(" **********************************请选择**********************************\n"); printf(" * *\n"); printf(" * 1:添加城市*\n"); printf(" * 2:删除城市*\n"); printf(" * 3:添加交通路线*\n"); printf(" * 4:删除交通路线*\n"); printf(" * 5:查询最小费用路线*\n"); printf(" * 6:查询时间最短路线*\n"); printf(" * 7:查询路程最短路线*\n"); printf(" * 0:退出系统*\n"); printf(" * Make by Michael 罗*\n"); printf(" **************************************************************************\n"); printf("请输入命令:");
return 1;
}
int SaveSysInfo()
{
FILE *fp;
int i,j,total;
fp=fopen(CityFile,"w");
fprintf(fp,"%d\n",NumofCity);
for (i=0;i<NumofCity;i++)
{
fprintf(fp,"%s\n",CityName[i]);
}
fclose(fp);
total=0;
fp=fopen(TrainFile,"w");
for (i=0;i<NumofCity;i++)
{
total+=CityInfo[i].TrainNum;
}
fprintf(fp,"%d\n",total);
for (i=0;i<NumofCity;i++)
{
for (j=0;j<CityInfo[i].TrainNum;j++)
{
fprintf(fp,"%s %s %s ", CityInfo[i].Train[j].name,
CityName[i],
CityName[CityInfo[i].Train[j].DesCity]);
fprintf(fp,"%2d:%2d %2d:%2d %d ", CityInfo[i].Train[j].DepTime/60, CityInfo[i].Train[j].DepTime%60,
CityInfo[i].Train[j].ArriveTime/60,
CityInfo[i].Train[j].ArriveTime%60,
CityInfo[i].Train[j].Price);
fprintf(fp,"%d\n",CityInfo[i].Train[j].pathlength);
}
}
fclose(fp);total=0;
return 1;
}
int main()
{
char name[15];
char s_city[15];
char e_city[15];
int Command,cost;
int DepCity,endcity;
int s_hour,s_minute,e_hour,e_minute;
int length,i,j;
while (1)
{
StartUI();
scanf("%d",&Command);
switch (Command)
{
case 0:
return 0;
case 1:
InitSysData();
printf("\n请输入城市名:");
scanf("%s",&name);
AddCity(name);
SaveSysInfo();
printf("数据保存完毕!\n");
break;
case 2:
InitSysData();
printf("\n请输入城市名:");
scanf("%s",&name);
DelCity(name);
SaveSysInfo();
printf("数据保存完毕!\n");
break;
case 3:
InitSysData();
printf("起始站城市名:");
scanf("%s",&s_city);
printf("终点站城市名:");
scanf("%s",&e_city);
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);
printf("里程:");
scanf("%d",&length);
AddTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost,length); SaveSysInfo();
printf("数据保存完毕!\n");
break;
case 4:
InitSysData();
printf("输入列车车次:");
scanf("%s",&name);
DelPath(name);
SaveSysInfo();
printf("数据保存完毕!\n"); break;
case 5:
InitSysData();
printf("\n起始城市:");
scanf("%s",&name);
DepCity=FindNumofCity(name); if (DepCity<0)
{
printf("系统中无该城市数据!\n"); break;
}
printf("终点城市:");
scanf("%s",&name);
endcity=FindNumofCity(name);
if (endcity<0)
{
printf("系统中无该城市数据!\n"); break;
}
CalcMinPrice(DepCity,endcity); printf("\n");
break;
case 6:
InitSysData();
printf("\n起始城市:");
scanf("%s",&name);
DepCity=FindNumofCity(name); if (DepCity<0)
{
printf("系统中无此城市数据!\n"); break;
}
printf("终点城市:");
scanf("%s",&name);
endcity=FindNumofCity(name);
if (endcity<0)
{
printf("系统中无此城市数据!\n"); break;
}
CalcMinTime(DepCity,endcity); printf("\n");
break;
case 7:
InitSysData();
printf("\n起始城市:");
scanf("%s",&name);
DepCity=FindNumofCity(name);
if (DepCity<0)
{
printf("系统中无此城市数据!\n"); break;
}
printf("终点城市:");
scanf("%s",&name);
endcity=FindNumofCity(name);
if (endcity<0)
{
printf("系统中无此城市数据!\n"); break;
}
CalcMinpathlength(DepCity,endcity); printf("\n");
break;
}
}
}。

相关文档
最新文档