收藏 分销(赏)

实验报告C语言数据结构全国交通模拟咨询.doc

上传人:二*** 文档编号:4576819 上传时间:2024-09-30 格式:DOC 页数:33 大小:686KB
下载 相关 举报
实验报告C语言数据结构全国交通模拟咨询.doc_第1页
第1页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、浙江工商大学计算机与信息工程学院数据结构实验大作业报告专 业: 物流1001 班 级: 1001 学 号: 1012600118 姓 名: 金渐 指导教师: 庄毅 2011年12月8日一、问题描述处于对不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。(2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。(3)提供

2、两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具。(4)旅途中耗费的总时间应该包括中转站的等候时间。 (5)咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。【测试数据】二、系统设计系统框图:模块说明:本系统共分15个模块1、 主函数2、添加城市3、 查找城市并返回序号4、 删除城市5、 添加列车6、 添加航班7、 删除列车或航班8、 找出最小费用路线9、 打印出最小费用路线10、 初始化系统数据(读入内存)11、 找出最快路线12、

3、 计算最快路线耗费的时间并打印13、 计算最小费用路线14、 主界面15、 存储信息到文件16、 退出下面是系统总流程图:下面是各模块示意图:三、系统测试1、主界面2、 添加城市模块:输入命令 1 后,将提示输入城市名,而后返回主界面3、删除城市:输入命令2后,提示输入城市名,而后返回主界面4、添加交通路线:输入命令3,提示输入起点站和重点站,并提示选择火车或飞机,而后输入班次、出发时间、到达时间、票价,而后返回主界面原train文件:添加路线后:5、删除路线:输入命令4,输入班次,而后返回主界面原train文件:删除后ttrain文件:6、查询最小费用路线:输入命令5,并输入起点站和重点站,

4、然后选择交通工具结果正确!7、查询时间最短路线:输入命令6,并输入起点站和重点站,然后选择交通工具四、小结从小学家里买了电脑起,我对计算机就相当感兴趣,有事没事就喜欢捣鼓捣鼓。六年级的时候,我的第一台台式电脑就这样被我折腾坏了。高中,我迷上了硬件,一放假就泡论坛,研究攒机。大学,我买了一台真正的属于自己的智能手机魅族M8。买时已经上市超过两年的M8使用的是被微软抛弃的windows CE系统。系统的落后导致了应用程序的匮乏,虽然日常应用勉强可以应付,但是看着android丰富有趣的app不免让人心痒。于是在大一的寒假里我第一次萌生了学习编程的念头。现在,经过了C语言和数据结构的学习之后,编写一

5、个相对大型的程序的机会终于来了,我也憋足了劲想要写出一个优秀的程序,并且选择了一个具有实际价值的模型全国交通咨询系统。第一天,我花了周六10个小时的时间写出了寻找相邻城市旅行时间最短的一个函数,然而这只是系统其中的一个简单的功能。至此,我也就做好了在编写过程中遇到相当大困难的准备。但是,后来的一个星期里,虽然利用了所有的课外时间来思考文件的存储格式以及所有城市间的转车、最低费用、最短时间函数,事情却依然毫无进展。由于期末临近,时间紧迫,我只好求助于网上的资料。查阅之后发现求图的最短路径使用的是我还未学会的迪杰斯特拉算法。在认真研究之后,终于将迪杰斯特拉算法加到了自己的程序之中,完成了最最关键的

6、功能。两个星期后的今天,终于完成了系统的全部功能以及测试。这一次的编程经验,我最大的体会是:代码的编写、调试并不是最困难的部分。最困难的部分在于如何构思出一个巧妙的软件框架、统一的数据输入输出格式以形成一个完整的体系。包括各种全局变量的设定、模块的划分都是需要很长的时间去考虑完善的。五、附录cpp : Defines the entry point for the console application./#include stdafx.h#include #include #include /结构体定义/typedef short int NumType; typedef struct Tr

7、afficWay /交通工具信息 记录了班次 起止时间 目的地 价格 char name15; /班次 int DepTime;int ArriveTime; /起止时间,以分钟为单位int DesCity; /目的地的编号int Price; /票价 TrafficWayDat; typedef struct CityNode /城市信息 只记录序号 通过的火车 飞机数 以及所有火车 飞机的结构体 NumType city; /城市的序号int TrainNum,FlightNum; /标记火车列次和飞机航班数TrafficWayDat Train15; /数组成员为结构体,记录了到达城市、

8、起止时间、票价和班次 TrafficWayDat Flight15; CityNodeDat; /节点数据类型typedef struct PathNode /存储路径 的 路点 int City; int FlainNo; /此地应乘的火车或飞机航班的次号 PathNodeDat; /变量定义/CityNodeDat CityInfo33; /System Info ,记录城市信息char CityName3315; /用来记录城市名,第一下标为该城市编号 int NumofCity; /城市数目 PathNodeDat TemPath33; /存储临时路径 PathNodeDat MinP

9、ath33; /存储目前为止的最小路径 int MinTime/*目前最小时间*/,DepTime/*出发时间*/; int curPath; const char CityFile =city.txt; const char TrainFile =train.txt; const char FlightFile =flight.txt;/添加城市/int AddCity (char *Name) /添加城市 strcpy(CityNameNumofCity,Name); CityInfoNumofCity.city/*int类型*/=NumofCity; CityInfoNumofCity.

10、FlightNum=0; CityInfoNumofCity.TrainNum=0; NumofCity+; /始终在最后一个空位置return 1; /查找城市并返回序号/int FindNumofCity (char *name) /查找城市并返回城市序号 若无 返回-1 int i; for (i=0;iNumofCity;i+) if (strcmp(name,CityNamei)=0) return i; return -1; /删除城市/int DelCity (char *Name) int city,i,j; city=FindNumofCity(Name); /得到城市序号f

11、or (i=city;iNumofCity-1;i+) strcpy(CityNamei,CityNamei+1); /后一个城市序号覆盖要删除的城市序号CityInfoi.FlightNum=CityInfoi+1.FlightNum; /后一个城市的航班数覆盖要删除的城市的航班数CityInfoi.TrainNum=CityInfoi+1.TrainNum; /后一个城市的火车数覆盖要删除的城市的火车数for (j=0;jCityInfoi.FlightNum;j+) CityInfoi.Flightj.Price=CityInfoi+1.Flightj.Price; CityInfoi.

12、Flightj.DesCity=CityInfoi+1.Flightj.DesCity; strcpy(CityInfoi.Flightj.name,CityInfoi+1.Flightj.name); CityInfoi.Flightj.DepTime=CityInfoi+1.Flightj.DepTime; CityInfoi.Flightj.ArriveTime=CityInfoi+1.Flightj.ArriveTime; /覆盖航班信息 NumofCity-;/城市数减少1return 1; /添加列车/int AddTrain (char *train,char *DepCity,

13、char *DesCity,int DepTime,int EndTime,int cost) /添加列车 int i,j; i=FindNumofCity(DepCity);/起始城市序号 j=FindNumofCity(DesCity); /终点城市序号CityInfoi.TrainCityInfoi.TrainNum.Price=cost; CityInfoi.TrainCityInfoi.TrainNum.DesCity=j; CityInfoi.TrainCityInfoi.TrainNum.DepTime=DepTime; CityInfoi.TrainCityInfoi.Trai

14、nNum.ArriveTime=EndTime; strcpy(CityInfoi.TrainCityInfoi.TrainNum.name,train); CityInfoi.TrainNum+;/复制各类信息后,列车数+1 return 1; /添加航班/int AddFlight(char *flight,char *DepCity,char *DesCity,int DepTime,int EndTime,int cost) /添加航班 int i,j; i=FindNumofCity(DepCity); j=FindNumofCity(DesCity); CityInfoi.Flig

15、htCityInfoi.FlightNum.Price=cost; CityInfoi.FlightCityInfoi.FlightNum.DesCity=j; CityInfoi.FlightCityInfoi.FlightNum.DepTime=DepTime; CityInfoi.FlightCityInfoi.FlightNum.ArriveTime=EndTime; strcpy(CityInfoi.TrainCityInfoi.FlightNum.name,flight); CityInfoi.FlightNum+; return 1; /删除列车或航班/int DelPath (

16、char *name) /删除路径 int i;int j;int flag=0; for (i=0;iNumofCity;i+) for (j=0;jCityInfoi.FlightNum;j+) if (strcmp(CityInfoi.Flightj.name,name)=0) /找到该航班 flag=1;break; /跳出for if (flag) /找到了航班 for (;jCityInfoi.FlightNum-1;j+) CityInfoi.Flightj.Price=CityInfoi.Flightj+1.Price; CityInfoi.Flightj.DesCity=Ci

17、tyInfoi.Flightj+1.DesCity; strcpy(CityInfoi.Flightj.name,CityInfoi.Flightj+1.name); CityInfoi.Flightj.DepTime=CityInfoi.Flightj+1.DepTime; CityInfoi.Flightj.ArriveTime=CityInfoi.Flightj+1.ArriveTime; /用后面的覆盖CityInfoi.FlightNum-;break; /航班数-1 跳出大for for (j=0;jCityInfoi.TrainNum;j+) if (strcmp(CityInf

18、oi.Trainj.name,name)=0) /找到该列车车次 flag=1;break; if (flag) for (;j=0) cost+=matxPreCityjj; tracki+=j=PreCityj; printf(n旅行路线:); if (!ByTorByP) for(i-;i0;i-) printf(n%s:,CityNametracki); end=tracki-1;min=32767; for (k=0;kCityInfotracki.Traink.Price) min=CityInfotracki.Traink.Price; tmp=k; printf(请乘坐%s次列

19、车 起止时间: ,CityInfotracki.Traintmp.name); printf(%02d:%02d-%02d:%02d,CityInfotracki.Traintmp.DepTime/60,CityInfotracki.Traintmp.DepTime%60,CityInfotracki.Traintmp.ArriveTime/60,CityInfotracki.Traintmp.ArriveTime%60); else for(i-;i0;i-) printf(n%s:,CityNametracki); end=tracki-1;min=32767; for (k=0;kCit

20、yInfotracki.Flightk.Price) min=CityInfotracki.Flightk.Price; tmp=k; printf(请乘坐%s次航班 起止时间: ,CityInfotracki.Flighttmp.name); printf(%02d:%02d-%02d:%02d,CityInfotracki.Flighttmp.DepTime/60,CityInfotracki.Flighttmp.DepTime%60,CityInfotracki.Flighttmp.ArriveTime/60,CityInfotracki.Flighttmp.ArriveTime%60)

21、; printf(n%s: 已到达目的地,CityNametrack0); printf(n最低价格 : %dn,cost); /找出最小费用路线/void FindMinPrice(int matx3434,int p_start,int p_end,int ByTorByP) int PreCity34; int i,j,min,pre,pos; for (i=0;iNumofCity;i+) PreCityi=-1; PreCityp_start=-2; while (PreCityp_end=-1) min=-1; for (i=0;iNumofCity;i+) if (PreCity

22、i!=-1) for (j=0;j0&(min0|matxijmin) pre=i;pos=j;min=matxij; PreCitypos=pre; FindMinPrice_Print(matx,PreCity,p_end,ByTorByP); /初始化系统,读入内存/int InitSysData () /初始化系统数据,将数据读入内存 FILE *fp;int i,j,hour,minute,num,cost; char TempString115; char TempString215; char TempString315; fp=fopen(CityFile,r); if (!f

23、p) printf(n文件打开错误!n请先初始化系统数据!); return -1; fscanf(fp,%d,&NumofCity); /读入城市数for (i=0;iNumofCity;i+) /将城市全部读入内存 fscanf(fp,%s,&CityNamei); CityInfoi.city=i; CityInfoi.TrainNum=0; /初始化列车数为0CityInfoi.FlightNum=0; /初始化航班数为0 fclose(fp); fp=fopen(TrainFile,r); if (!fp) printf(n文件打开错误n请先初始化系统数据!); return -1;

24、 fscanf(fp,%d,&num); /读入列车数for (i=0;inum;i+) fscanf(fp,%s,&TempString1);/车次fscanf(fp,%s,&TempString2); /起点fscanf(fp,%s,&TempString3); /终点j=FindNumofCity(TempString2);/j等于起点的序号 CityInfoj.TrainCityInfoj.TrainNum.DesCity=FindNumofCity(TempString3); /把该列车的终点序号赋给经过起点的火车strcpy(CityInfoj.TrainCityInfoj.Tra

25、inNum.name,TempString1); /车次赋值给该列车fscanf(fp,%d:%d,&hour,&minute); /读取出发时间CityInfoj.TrainCityInfoj.TrainNum.DepTime=hour*60+minute; /出发时间赋值给starttimefscanf(fp,%d:%d,&hour,&minute); /读取到达时间CityInfoj.TrainCityInfoj.TrainNum.ArriveTime=hour*60+minute; /赋值fscanf(fp,%d,&cost); /读取价格CityInfoj.TrainCityInfo

26、j.TrainNum.Price=cost; /赋值CityInfoj.TrainNum+; fclose(fp); fp=fopen(FlightFile,r); if (!fp) printf(n文件打开错误!n请先初始化系统数据!); return -1; fscanf(fp,%d,&num); for (i=0;iCurTime-DepTime) /目前为止的最小时间若大于current时间 / if2for (i=0;i=curPathNo;i+) / for1MinPathi.City=TemPathi.City; MinPathi.FlainNo=TemPathi.FlainNo

27、; curPath=curPathNo; / for1 /则目前最为止最小路径改为current路径,即将cuurrent路径赋值给minpathif(CurTimeDepTime)MinTime=CurTime+1440-DepTime;elseMinTime=CurTime-DepTime;/current时间赋值给最短时间 / if2 / if1else /没到终点 / 最大的elsecurPathNo+; /经过的站点数TemPathcurPathNo.City=City; /记录现在到达的站点的所有名字if (!ByTorByP) /没到终点,若是火车 / 最大的else下的iffo

28、r (i=0;i=(CurTime%1440)&(CityInfoCity.Traini.ArriveTime+(CurTime/1440)*1440-DepTimeMinTime) /若此列车出发时间大于等于现在的时间也就是可以坐上 / 最大的else下的if下的for的if1/且(此列车的到站时间+已经花去的时间)-出发的时间小于TemPathcurPathNo.FlainNo=i;/记录在此地应乘的经过这里的第i列火车 /目前为止的最小时间(若已经大于了,那就没有计算的必要了)SearchMinTime(CityInfoCity.Traini.DesCity/*(后来调用)现在到达城市可

29、以去的城市*/,DesCity,CityInfoCity.Traini.ArriveTime+(CurTime/1440)*1440,curPathNo,ByTorByP); /再次搜索 if (CityInfoCity.Traini.DepTime(CurTime%1440)&(CityInfoCity.Traini.ArriveTime+(CurTime/1440)*1440-DepTimeMinTime) /坐不上该车,所以要等一天TemPathcurPathNo.FlainNo=i; /记录在此地应乘的经过这里的第i列火车SearchMinTime(CityInfoCity.Train

30、i.DesCity,DesCity,CityInfoCity.Traini.ArriveTime+(CurTime/1440+1/*等一天*/)*1440,curPathNo,ByTorByP); else /没到终点,不是火车是飞机 for (i=0;i=CurTime)&(CityInfoCity.Flighti.ArriveTime+(CurTime/1440)*1440-DepTimeMinTime) TemPathcurPathNo.FlainNo=i; SearchMinTime(CityInfoCity.Flighti.DesCity,DesCity,CityInfoCity.F

31、lighti.ArriveTime+(CurTime/1440)*1440,curPathNo,ByTorByP); if (CityInfoCity.Flighti.DepTimeCurTime)&(CityInfoCity.Flighti.ArriveTime+(CurTime/1440)*1440-DepTimeMinTime) TemPathcurPathNo.FlainNo=i; SearchMinTime(CityInfoCity.Flighti.DesCity,DesCity,CityInfoCity.Flighti.ArriveTime+(CurTime/1440+1)*144

32、0,curPathNo,ByTorByP); return 1; /计算最小时间/int CalcMinTime (int DepCity,int DesCity,int ByTorByP) /计算最小时间,调用 searchmintime int i; MinTime=32767;curPath=0; TemPath0.City=DepCity; /第一站是起点if (!ByTorByP)/ 若是火车 for (i=0;iCityInfoDepCity.TrainNum;i+) /循环搜索起点的火车 TemPath0.FlainNo=i;/记录在起点该坐得火车 DepTime=CityInfoDepCity.Traini.DepTime; /记录了开始时间SearchMinTime(CityInfoDepCity.Traini.DesCity,DesCity,CityInfoDepCity.Traini.ArriveTime,0,ByTorByP);

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服