当前位置:文档之家› 大数据结构课程设计交通咨询系统设计

大数据结构课程设计交通咨询系统设计

设计题目<二>:7.3.4交通咨询系统设计P160一、设计要求1.问题描述根据不同目的的旅客对交通工具有不同的要求。

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

模拟一个全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。

2.需求分析二、概要设计1.主界面设计(图2.1“交通咨询系统”主菜单)2.存储结构设计本系统采用图结构类型存储抽象交通咨询系统的信息。

typedef struct TrafficNode{char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最为10int 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];// int Cost; //遍历时到达该城市的耗费(时间或者费用)} VNodeDat;typedef struct PNode{int City;int TraNo;} PNodeDat;3.系统功能设计(1)添加城市。

添加一个城市的名称(2)删除城市。

输入一个城市名称,删除该城市。

(3)添加交通路线。

输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间和票价(4)删除交通路线。

输入火车或飞机的班次删除该交通路线。

(5)查询最小费用路线。

输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间查询最小费用路线。

三、模块设计1.模块设计(图2.2 模块调用示意图)2.系统子程序及功能设计(1)int ShowMenu()//主菜单(2)void CopyRight()(3)int SeekCity(char *name) //寻找城市(4)int InsertCity(char *Name) //添加城市(5)int SaveSysInfo() //向程序输入数据(6)int DelCity(char *Name) //删除城市(7)int InsertTrain(char *train, char *StartCity, char *EndCity, int StartTime, int EndTime, int cost)//添加火车路线(8)int InsertFlight(char *flight, char *StartCity, char *EndCity, int StartTime, int EndTime, int cost)//添加飞机航线(9)int DelPath(char *name)//删除路线(10)void Dijkstra(int matx[Dij_MAXN][Dij_MAXN], int p_start, int p_end, int TravelType)(11)int InitSysData()//存储数据(12)int SearchMinTime(CityType City, CityType EndCity, int CurTime, int curPathNo, int TravelType)//查询最短时间(13)int CalcMinTime(int StartCity, int EndCity, int TravelType) //显示最短时间(14)int CalcMinCost(int StartCity, int EndCity, int TravelType)//最少花费(15)int main()//主函数3.函数主要调用关系图(图2.3函数主要调用关系图)四、详细设计1.数据类型定义(1)全局变量的定义typedef short int CityType;//CityType 定义短整形的变量typedef struct TrafficNode{char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最为10int 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];// int Cost; //遍历时到达该城市的耗费(时间或者费用)} VNodeDat;typedef struct PNode{int City;int TraNo;} PNodeDat;2.系统主要子程序详细设计(1)用户工作区模块的设计int ShowMenu(){printf("\n|******************欢迎使用交通咨询系统*******|\n");printf("\n|------------------1: 添加城市----------------|");printf("\n|------------------2: 删除城市----------------|");printf("\n|------------------3: 添加交通路线------------|");printf("\n|------------------4: 删除交通路线------------|");printf("\n|------------------5: 查询最小费用路线--------|");printf("\n|------------------6: 查询最快路线------------|");printf("\n|------------------7: 清除屏幕----------------|");printf("\n|------------------0: 退出--------------------|\n");printf("\n|***********o(∩_∩)o o(∩_∩)o **************|\n");printf("\n请输入你的选择:");return 1;}(2)用Dijkstra算法求两段路程的最短距离void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN], intPreCity[Dij_MAXN], int p_end, int TravelType){int track[Dij_MAXN];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("\nTrack Way:");if (!TravelType){for (i--; i>0; i--){printf("\n%s:", CityName[track[i]]);end = track[i - 1]; min = 32767;for (k = 0; k<AdjList[track[i]].TrainNum; k++)if (AdjList[track[i]].Train[k].EndCity ==end&&min>AdjList[track[i]].Train[k].Cost){min = AdjList[track[i]].Train[k].Cost;tmp = k;}printf("%s", AdjList[track[i]].Train[tmp].name);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);}}else{for (i--; i>0; i--){printf("\n%s:", CityName[track[i]]);end = track[i - 1]; min = 32767;for (k = 0; k<AdjList[track[i]].FlightNum; k++)if (AdjList[track[i]].Train[k].EndCity ==end&&min>AdjList[track[i]].Flight[k].Cost){min = AdjList[track[i]].Flight[k].Cost;tmp = k;}printf("%s", AdjList[track[i]].Flight[tmp].name);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("\n%s: DESTINATION!", CityName[track[0]]);printf("\nMin Cost : %d\n", cost);}void Dijkstra(int matx[Dij_MAXN][Dij_MAXN], int p_start, int p_end, int TravelType){int PreCity[Dij_MAXN]; //PreCity[i]==-1,never used;//PreCity>0,the precity of City iint i, j, min, pre, pos;for (i = 0; i<CityNum; i++){PreCity[i] = -1;}PreCity[p_start] = -2;while (PreCity[p_end] == -1){min = -1;for (i = 0; i<CityNum; i++)if (PreCity[i] != -1){for (j = 0; j<CityNum; 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;}Dijkstra_Output(matx, PreCity, p_end, TravelType);}五、测试分析1. 添加城市在主菜单下,用户输入1,添加城市名称。

相关主题