《数据结构课程设计交通咨询系统设计说明.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计交通咨询系统设计说明.doc(38页珍藏版)》请在课桌文档上搜索。
1、 . . . 设计题目:7.3.4交通咨询系统设计P160一、设计要求1问题描述根据不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅行的旅客希望旅费尽可能的少,而老年人则要求中转次数少。模拟一个全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。2需求分析二、概要设计1主界面设计图2.1交通咨询系统主菜单2存储结构设计本系统采用图结构类型存储抽象交通咨询系统的信息。typedef struct TrafficNodechar nameMAX_STRING_NUM; /班次 /MAX_STRING_NUM最为10int StartTime
2、, StopTime; /起止时间 int EndCity; /该有向边指向的顶点在数组中的位置,即该城市编号 int Cost; /票价 TrafficNodeDat;typedef struct VNodeCityType city;int TrainNum, FlightNum; /标记下面Train数组和Flight数组里元素个数 TrafficNodeDat TrainMAX_TRAFFIC_NUM; /数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDat FlightMAX_TRAFFIC_NUM;/ int Cost; /遍历时到达该城市的耗费时间
3、或者费用 VNodeDat;typedef struct PNodeint City;int TraNo; PNodeDat;3系统功能设计1添加城市。添加一个城市的名称2删除城市。输入一个城市名称,删除该城市。3添加交通路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间和票价4 删除交通路线。输入火车或飞机的班次删除该交通路线。5查询最小费用路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间查询最小费用路线。三、模块设计1模块设计无向网操作模块工作区模块主程序模块图2.2 模块调用示意图2系统子程序及功能设计1int ShowMenu/主菜单2void Cop
4、yRight3int SeekCity /寻找城市4int InsertCity /添加城市5int SaveSysInfo /向程序输入数据6int DelCity /删除城市7int InsertTrain/添加火车路线8int InsertFlight/添加飞机航线9int DelPath/删除路线10void Dijkstra11int InitSysData/存储数据12int SearchMinTime/查询最短时间13int CalcMinTime /显示最短时间14int CalcMinCost/最少花费15int main/主函数3函数主要调用关系图15main8911275
5、4136361223716图2.3函数主要调用关系图四、详细设计1数据类型定义1全局变量的定义typedef short int CityType;/CityType 定义短整形的变量 typedef struct TrafficNodechar nameMAX_STRING_NUM; /班次 /MAX_STRING_NUM最为10int StartTime, StopTime; /起止时间 int EndCity; /该有向边指向的顶点在数组中的位置,即该城市编号 int Cost; /票价 TrafficNodeDat;typedef struct VNodeCityType city;i
6、nt TrainNum, FlightNum; /标记下面Train数组和Flight数组里元素个数 TrafficNodeDat TrainMAX_TRAFFIC_NUM; /数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDat FlightMAX_TRAFFIC_NUM;/ int Cost; /遍历时到达该城市的耗费时间或者费用 VNodeDat;typedef struct PNodeint City;int TraNo; PNodeDat;2系统主要子程序详细设计1用户工作区模块的设计int ShowMenu printf;printf;printf;
7、printf;printf; printf;printf;printf;printf;printfn|*oo oo *|n;printf;return 1;2用Dijkstra算法求两段路程的最短距离void Dijkstra_Outputint trackDij_MAXN;int i = 0, j, k, min, tmp, end, cost = 0;j = p_end; tracki+ = j;while = 0cost += matxPreCityjj;tracki+ = j = PreCityj;printf;if for 0; i-printf;end = tracki - 1;
8、min = 32767;for k = 0; kif AdjListtracki.Traink.Costmin = AdjListtracki.Traink.Cost;tmp = k;printf;printf;elsefor 0; i-printf;end = tracki - 1; min = 32767;for k = 0; kif AdjListtracki.Flightk.Costmin = AdjListtracki.Flightk.Cost;tmp = k;printf;printf;printf;printf;void Dijkstraint PreCityDij_MAXN;
9、/PreCityi=-1,never used; /PreCity0,the precity of City i int i, j, min, pre, pos;for i = 0; iPreCityi = -1;PreCityp_start = -2;while min = -1;for i = 0; iif for j = 0; jif 0 & min0 | matxijpre = i; pos = j; min = matxij;PreCitypos = pre;Dijkstra_Output;五、测试分析1. 添加城市在主菜单下,用户输入1,添加城市名称。图2.4添加城市2删除城市在主
10、菜单下,用户输入2,删除已添加城市名称。图2.5删除城市3添加交通路线在主菜单下,用户输入3,已添加城市名称。添加起始城市、终点城市名称、乘车类型、乘车班次、起始时刻、终点时刻、和票价。图2.6添加交通路线4删除交通路线输入班次号,删除交通路线图2.7删除交通路线5查询最小费用交通路线图2.8 查询最小费用交通路线6查询最快交通路线图2.9查询最快交通路线7清除屏幕8退出六、用户手册使用本系统时,用户需先向程序添加城市后,在已有城市基础上添加已有城市的路线和使用各项功能。七、调试报告程序运行无错误,但当系统输入其他无储存容时程序会意外中断,代码需要优化。八、程序清单#include stdaf
11、x.h#include #include #include #define ERR 0 #define OK 1 #define Dij_MAXN 100 #define MAX_VERTEX_NUM 100#define MAX_STRING_NUM 100 #define MAX_TRAFFIC_NUM 100 const char CityFile = city.txt;const char TrainFile = train.txt;const char FlightFile = flight.txt;typedef short int CityType;/CityType 定义短整形
12、的变量 typedef struct TrafficNodechar nameMAX_STRING_NUM; /班次 /MAX_STRING_NUM最为10int StartTime, StopTime; /起止时间 int EndCity; /该有向边指向的顶点在数组中的位置,即该城市编号 int Cost; /票价 TrafficNodeDat;typedef struct VNodeCityType city;int TrainNum, FlightNum; /标记下面Train数组和Flight数组里元素个数 TrafficNodeDat TrainMAX_TRAFFIC_NUM; /
13、数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDat FlightMAX_TRAFFIC_NUM;/ int Cost; /遍历时到达该城市的耗费时间或者费用 VNodeDat;typedef struct PNodeint City;int TraNo; PNodeDat;VNodeDat AdjListMAX_VERTEX_NUM; char CityNameMAX_VERTEX_NUMMAX_STRING_NUM; /城市名,采用第一下标为该城市在本程序中的编号 int CityNum; /城市数目 PNodeDat PathMAX_VERTEX_NUM;
14、 /存储临时最小时间路径 PNodeDat MinPathMAX_VERTEX_NUM; /存储搜索到当前的最小时间路径 int MinTime, StartTime;int curPath;int ShowMenu printf;printf;printf;printf;printf; printf;printf;printf;printf;printfn|*oo oo *|n;printf;return 1;void CopyRightprintf;int SeekCity /寻找城市int i;for i = 0; iif strcmp = 0 /比较函数,若相等,则返回i值return
15、 i;return -1;/=Edit Info= int SaveSysInfo /向程序输入数据FILE *fp; int i, j, total;fp = fopen; /打开CityFile文档fprintf; /往文档中写城市的数量for i = 0; ifprintf; /往文档中写城市的名字fclose;/将CityFile文档关闭total = 0;fp = fopen;/打开TrainFile文档 for i = 0; i /计算列车班次的数量total += AdjListi.TrainNum;fprintf; /往文档中写列车班次的数量for i = 0; i /for
16、j = 0; j /往文档中写列车的车次、始发城市、终点城市fprintf;fprintf;fclose; total = 0;fp = fopen;for i = 0; itotal += AdjListi.FlightNum;fprintf;for i = 0; ifor j = 0; jfprintf;fprintf;fclose; return 1;int InsertCity /添加城市strcpy;AdjListCityNum.city = CityNum;AdjListCityNum.FlightNum = 0;AdjListCityNum.TrainNum = 0;CityNu
17、m+;return 1;int DelCity /删除城市int city, i, j,o=1,k=1;city = SeekCity;printf;while while k+;if CityNumo-;printf;return 0;for i = city; i /?可能city是从0开始的strcpy;AdjListi.FlightNum = AdjListi + 1.FlightNum;AdjListi.TrainNum = AdjListi + 1.TrainNum;for j = 0; j /为什么没有火车的?AdjListi.Flightj.Cost = AdjListi +
18、1.Flightj.Cost;AdjListi.Flightj.EndCity = AdjListi + 1.Flightj.EndCity;strcpy;AdjListi.Flightj.StartTime = AdjListi + 1.Flightj.StartTime;AdjListi.Flightj.StopTime = AdjListi + 1.Flightj.StopTime;CityNum-;return 1;int InsertTrainint i, j; /InsertTrain;i = SeekCity;j = SeekCity;AdjListi.TrainAdjListi
19、.TrainNum.Cost = cost;AdjListi.TrainAdjListi.TrainNum.EndCity = j;AdjListi.TrainAdjListi.TrainNum.StartTime = StartTime;AdjListi.TrainAdjListi.TrainNum.StopTime = EndTime;strcpy;AdjListi.TrainNum+; /火车的数加1return 1;int InsertFlightint i, j; i = SeekCity;j = SeekCity;AdjListi.FlightAdjListi.FlightNum.
20、Cost = cost;AdjListi.FlightAdjListi.FlightNum.EndCity = j;AdjListi.FlightAdjListi.FlightNum.StartTime = StartTime;AdjListi.FlightAdjListi.FlightNum.StopTime = EndTime;strcpy;AdjListi.FlightNum+;return 1;int DelPathint i, j, flag = 0;for i = 0; ifor j = 0; j /注意j是从0开始的if strcmp = 0flag = 1; break;if
21、for ; j /把删除的航班后的每个航班向前移一位AdjListi.Flightj.Cost = AdjListi.Flightj + 1.Cost;AdjListi.Flightj.EndCity = AdjListi.Flightj + 1.EndCity;strcpy;AdjListi.Flightj.StartTime = AdjListi.Flightj + 1.StartTime;AdjListi.Flightj.StopTime = AdjListi.Flightj + 1.StopTime;AdjListi.FlightNum-; break;for j = 0; jif s
22、trcmp = 0flag = 1; break;if for ; j /把删除的列车后的每个列车车次都前移一位AdjListi.Trainj.Cost = AdjListi.Trainj + 1.Cost;AdjListi.Trainj.EndCity = AdjListi.Trainj + 1.EndCity;strcpy;AdjListi.Trainj.StartTime = AdjListi.Trainj + 1.StartTime;AdjListi.Trainj.StopTime = AdjListi.Trainj + 1.StopTime;AdjListi.TrainNum-; b
23、reak;return 1;/=Check Info= void Dijkstra_Outputint trackDij_MAXN;int i = 0, j, k, min, tmp, end, cost = 0;j = p_end; tracki+ = j;while = 0cost += matxPreCityjj;tracki+ = j = PreCityj;printf;if for 0; i-printf;end = tracki - 1; min = 32767;for k = 0; kif AdjListtracki.Traink.Costmin = AdjListtracki.Traink.Cost;tmp = k;printf;printf;elsefor 0; i-printf;end = tracki - 1; min = 32767;for k = 0; kif AdjListtracki.Flightk.Costmin = AdjListtracki.Flightk.Cost;tmp = k;printf;printf;printfn%s:
链接地址:https://www.desk33.com/p-27130.html