设计题目<二>:交通咨询系统设计P160 一、设计要求 1 .问题描述根据不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅行的旅客希望旅费尽可能的少,而老年人则要求中转次数少。
模拟一个全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。
2.需求分析二、概要设计1.主界面设计(图“交通咨询系统”主菜单)2.存储结构设计本系统采用图结构类型存储抽象交通咨询系统的信息typedef struct TrafficNodetmp = k;}printf("%s", AdjList[track[i]].Train[tmp].name);pri ntf("%2d:%2d-%2d:%2d",AdjList[track[i]].Trai n[tmp].StartTime / 60,AdjList[track[i]].Train[tmp].StartTime % 60,AdjList[track[i]].Trai n[tmp].StopTime / 60,AdjList[track[i]].Trai n[tmp].StopTime % 60);else{for (i--; i>0; i--) um;[k++)ghar name[MAX_STRlNG_NUM];jajnN{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]; 添加城市在主菜单下,用户输入 1,添加城市名称(图添加城市)2.删除城市在主菜单下,用户输入2,删除已添加城市名称(图删除城市)3.添加交通路线在主菜单下,用户输入3,已添加城市名称。
添加起始城市、终点城市名称、乘车类型、乘车班次、起始时刻、终点时刻、和票价。
(图添加交通路线)4.删除交通路线输入班次号,删除交通路线(图删除交通路线)5.查询最小费用交通路线(图查询最小费用交通路线)6.查询最快交通路线(图查询最快交通路线)7.清除屏幕 8退出六、用户手册使用本系统时,用户需先向程序添加城市后,在已有城市基础上添加已有城市的路线和使用各项功能。
七、调试报告程序运行无错误,但当系统输入其他无储存内容时程序会意外中断,代码需要优化。
八、程序清单#include "" #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[] = "";const char TrainFile[] = "";const char FlightFile[] = "" typedef short int CityType;rainNum;}fprintf(fp, "%d\n", total); rainNum; j++) rain[j].name,CityName[i],CityName[AdjList[i].Train[j].EndCity]); fprintf(fp, "%2d:%2d %2d:%2d %d\n",AdjList[i].Train[j].StartTime / 60, rain[j].StartTime % 60,AdjList[i].Train[j].StopTime / 60,AdjList[i].Train[j].StopTime % 60,AdjList[i].Train[j].Cost);}}fclose(fp); total = 0;fp = fopen(FlightFile, "w");for (i = 0; i<CityNum; i++)total += AdjList[i].FlightNum;}fprintf(fp, "%d\n", total);for (i = 0; i<CityNum; i++){for (j = 0; j<AdjList[i].FlightNum; 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) ity = CityNum;AdjList[CityNum].FlightNum = 0;AdjList[CityNum].TrainNum = 0;CityNum++;return 1;}int DelCity(char *Name) lightNum = AdjList[i + 1].FlightNum;AdjList[i].TrainNum = AdjList[i + 1].TrainNum;for (j = 0; j < AdjList[i].FlightNum; j++)light[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; rain[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++; light[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].Train[AdjList[i].FlightNum].name,flight);AdjList[i].FlightNum++;return 1;}int DelPath(char *name){int i, j, flag = 0;for (i = 0; i<CityNum; i++){for (j = 0; j<AdjList[i].FlightNum;j++) light[j].name, name) == 0)flag = 1; break;}if (flag){for (; j<AdjList[i].FlightNum - 1; j++) light[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;for (j = 0; j<AdjList[i].TrainNum; j++) if(strcmp(AdjList[i].Train[j].name, name) == 0){flag = 1; break;}if (flag){for (; j<AdjList[i].TrainNum - 1; j++) rain[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;}rainNum; 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]; .\n");return -1;}fscanf(fp, "%d", &CityNum);for (i = 0; i<CityNum; i++){fscanf(fp, "%s", &CityName[i]);AdjList[i].city = i;AdjList[i].TrainNum = 0;AdjList[i].FlightNum = 0;}fclose(fp);fp = fopen(TrainFile, "r");if (!fp)printf("\nError:Cannot Open Train File...\n");return -1;}fscanf(fp, "%d", &num);for (i = 0; i<num; i++){fscanf(fp, "%s", &stmp1);rain[AdjList[j].TrainNum].EndCity = SeekCity(stmp3);rain[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(FlightFile, "r");if (!fp){printf("\nError:Cannot Open Flight File...\n");return -1;}fscanf(fp, "%d", &num);for (i = 0; i<num; i++){fscanf(fp, "%s", &stmp1);light[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;}int SearchMinTime(CityType City, CityType EndCity, int intCurTime, curPathNo, int TravelType){ ity = 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<AdjList[City].TrainNum; i++) if((AdjList[City].Train[i].StartTime >= (CurTime % 1440)) && (AdjList[City].Train[i].StopTime + (CurTime / 1440) * 1440 - StartTime<MinTime)){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<MinTime)){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<AdjList[City].FlightNum; i++){if ((AdjList[City].Flight[i].StartTime >=CurTime) && (AdjList[City].Flight[i].StopTime + (CurTime / 1440) * 1440 - StartTime<MinTime)){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<CurTime)&&(AdjList[City].Flight[i].StopTime + (CurTime / 1440) * 1440 - StartTime<MinTime)){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;MinTime = 32767; curPath = 0;Path[0].City = StartCity;if (!TravelType){for (i = 0; i<AdjList[StartCity].TrainNum; 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<AdjList[StartCity].FlightNum; 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("\nNo access to that destination!");return 0;}rain[MinPath[0].TraNo].StartTime;light[MinPath[0].TraNo].StartTime;printf("\nPath:\n");for (i = 0; i <= curPath; i++){if (!TravelType)printf("%s : %s", CityName[MinPath[i].City], AdjList[MinPath[i].City].Train[MinPath[i].TraNo].name);elseprintf("%s : %s", CityName[MinPath[i].City], AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].name);printf(" %2d:%2d-%2d:%2d\n",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("%s: DESTINATION!", CityName[EndCity]);printf("\nTime Cost: %2d:%2d", MinTime / 60, MinTime %60);return 1;}int CalcMinCost(int StartCity, int EndCity, int TravelType) { int ma[Dij_MAXN][Dij_MAXN];int i, j, min, end;for (i = 0; i<CityNum; i++)for (j = 0; j<CityNum; j++)ma[i][j] = -1;if (TravelType == 0){for (i = 0; i<CityNum; i++){min = 32767; j = 0;while (j<AdjList[i].TrainNum){min = 32767;end = AdjList[i].Train[j].EndCity;while (end ==AdjList[i].Train[j].EndCity&&j<AdjList[i].TrainNum){if (AdjList[i].Train[j].Cost<min){min = AdjList[i].Train[j].Cost;}j++;}ma[i][end] = min;}}}else{for (i = 0; i<CityNum; i++){min = 32767; j = 0;while (j<AdjList[i].FlightNum){min = 32767;end = AdjList[i].Flight[j].EndCity;while (end ==AdjList[i].Flight[j].EndCity&&j<AdjList[i].FlightNum){if (AdjList[i].Flight[j].Cost<min){min = AdjList[i].Flight[j].Cost;}j++;}ma[i][end] = min;}}}Dijkstra(ma, StartCity, EndCity, TravelType);OU&UJ 茎一 Tu 」n a)(L)①壬M a)4n £L U —①匚 noil —①a)4n £L U I S 匚n Ollis 4£ 0)d A 4a)>e」4.Mopu①・A 4O 七2S 4£CopyRight();// 版权信息ShowMenu(); // 主菜单scanf("%d", &Command);// 输入选择switch (Command) // 对菜单的内容进行选择{case 0: // 退出return 0;case 1: // 添加城市InitSysData(); // 读出文档中已存的信息printf("\n 输入城市名 :");scanf("%s", &name); // 输入城市名InsertCity(name); // 将城市插入到数组中SaveSysInfo(); // 把城市的信息写入文档中printf("System Info Save OK!\n");break;case 2: // 删除城市InitSysData(); // 读出文档中已有的信息printf("\n 输入城市名 :");scanf("%s", &name);DelCity(name); // 将城市删除SaveSysInfo(); // 将处理过的信息写入文档中printf("System Info Save OK!\n");break;case 3: // 添加路线InitSysData();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);}SaveSysInfo();printf("System Info Save OK!\n");break;case 4: // 删除路线InitSysData();printf(" 输入班次 :");scanf("%s", &name);DelPath(name); // 将路线进行删除SaveSysInfo();printf("System Info Save OK!\n");break;case 5: // 最小耗费InitSysData();printf("\n 起始城市 :");scanf("%s", &name);startcity = SeekCity(name);if (startcity<0){printf("Error City Name:No such city!\n");break;}printf(" 终点城市 :");scanf("%s", &name);endcity = SeekCity(name);if (endcity<0)printf("Error City Name:No such city!\n");break;}printf(" 类型(列车 0,航班 1) :");scanf("%d", &traveltype);if (traveltype != 0 && traveltype != 1){printf("Error Input!");break;}CalcMinCost(startcity, endcity, traveltype);计算//最少的花费printf("\n");break;case 6: // 最短时间路线InitSysData();printf("\n 起始城市 :");scanf("%s", &name);startcity = SeekCity(name);if (startcity<0){printf("Error City Name:No such city!\n");break;}printf(" 终点城市 :");scanf("%s", &name);endcity = SeekCity(name);if (endcity<0){printf("Error City Name:No such city!\n");break;}printf(" 类型(列车 0,航班 1) :");scanf("%d", &traveltype);if (traveltype != 0 && traveltype != 1){printf("Error Input!");break;}CalcMinTime(startcity, endcity, traveltype);计算//最少的时间printf("\n");break;case 7:system("cls");// 清除屏幕}}。