1、设计题目<二〉:7、3、4交通咨询系统设计P160 一、设计要求 1.问题描述 ﻩﻩ根据不同目得得旅客对交通工具有不同得要求。例如,因公出差得旅客希望在旅途中得时间尽可能得短,出门旅行得旅客希望旅费尽可能得少,而老年人则要求中转次数少。模拟一个全国城市之间得咨询交通程序,为旅客提供两种或三种最优得交通路线。 2。需求分析 二、概要设计 1.主界面设计 (图2、1“交通咨询系统”主菜单) 2。存储结构设计 本系统采用图结构类型存储抽象交通咨询系统得信息。 typedef struct TrafficNode { char name[MAX_STRING_NUM]
2、 //班次 //MAX_STRING_NUM最为10 int StartTime, StopTime; //起止时间 ﻩint EndCity; //该有向边指向得顶点在数组中得位置,即该城市编号 ﻩint Cost; //票价 } TrafficNodeDat; typedef struct VNode { ﻩCityType city; ﻩint TrainNum, FlightNum; //标记下面Train数组与Flight数组里元素个数 TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、
3、起止时间、票价与班次 ﻩTrafficNodeDat Flight[MAX_TRAFFIC_NUM]; ﻩ// int Cost; //遍历时到达该城市得耗费(时间或者费用) } VNodeDat; typedef struct PNode { ﻩint City; int TraNo; } PNodeDat; 3。系统功能设计 (1)添加城市。添加一个城市得名称 (2)删除城市。输入一个城市名称,删除该城市. (3)添加交通路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间与票价 (4) 删除交通路线。输入火车或飞机得班次删除该交通路线。 (
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 Del
5、City(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
6、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 CalcMinCo
7、st(int StartCity, int EndCity, int TravelType)//最少花费 (15)int main()//主函数 3。函数主要调用关系图 15main() 8 9 1 12 7 5 4 13 6 3 6 1 2 2 3 7 1 6 ﻩ ﻩﻩﻩ (图2、3函数主要调用关系图) 四、详细设计 1.数据类型定义 (1)全局变量得定义 typedef short int CityType;//CityType 定义短整形得变量 typedef struct TrafficNode { ﻩchar name
8、[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最为10 ﻩint StartTime, StopTime; //起止时间 ﻩint EndCity; //该有向边指向得顶点在数组中得位置,即该城市编号 int Cost; //票价 } TrafficNodeDat; typedef struct VNode { CityType city; ﻩint TrainNum, FlightNum; //标记下面Train数组与Flight数组里元素个数 ﻩTrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数
9、组成员为结构体,记录了到达城市、起止时间、票价与班次 TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; ﻩ// int Cost; //遍历时到达该城市得耗费(时间或者费用) } VNodeDat; typedef struct PNode { ﻩint City; ﻩint TraNo; } PNodeDat; 2.系统主要子程序详细设计 (1)用户工作区模块得设计 int ShowMenu() { printf("\n|******************欢迎使用交通咨询系统*******|\n”); printf(
10、\n|-----———-----—-——-1: 添加城市——-------——-——-—|”); ﻩprintf("\n|——--———-—-—-——-———2: 删除城市----——----——-—--|”); ﻩprintf(”\n|——————--—--—----——3: 添加交通路线-———--———-——|"); printf("\n|———-—--——----———-—4: 删除交通路线—-—--—--——--|”); printf("\n|-—---——---—-----—-5: 查询最小费用路线---—-———|"); printf(”\n|-----———
11、---------6: 查询最快路线-———--—————-|"); ﻩprintf(”\n|----------------—-7: 清除屏幕--—-—---———-—---|”); printf("\n|-—--—--—-------—--0: 退出-——--—--—------—————|\n”); printf("\n|***********o(∩_∩)o o(∩_∩)o **************|\n”); ﻩprintf("\n请输入您得选择:"); ﻩreturn 1; } (2)用Dijkstra算法求两段路程得最短距离 void Dijkstra_O
12、utput(int matx[Dij_MAXN][Dij_MAXN], int PreCity[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
13、 Way:”);
if (!TravelType)
{
ﻩﻩfor (i--; i>0; i--)
{
ﻩﻩ printf("\n%s:", CityName[track[i]]);
end = track[i - 1]; min = 32767;
ﻩ for (k = 0; k 14、t[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]、StopTim 15、e % 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 16、[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]、St 17、opTime % 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 i
int 18、 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 19、matx[i][j] 20、终点城市名称、乘车类型、乘车班次、起始时刻、终点时刻、与票价。
ﻩ (图2、6添加交通路线)
4.删除交通路线
输入班次号,删除交通路线
ﻩﻩ (图2、7删除交通路线)
5。查询最小费用交通路线
ﻩﻩﻩ(图2、8 查询最小费用交通路线)
6。查询最快交通路线
ﻩ (图2、9查询最快交通路线)
7。清除屏幕
8.退出
六、用户手册
使用本系统时,用户需先向程序添加城市后,在已有城市基础上添加已有城市得路线与使用各项功能。
七、调试报告
程序运行无错误,但当系统输入其她无储存内容时程序会意外中断,代码需要优化。
八、程序清单
#include 21、 ”stdafx、h”
#include 22、char FlightFile[] = ”flight、txt”;
typedef short int CityType;//CityType 定义短整形得变量
typedef struct TrafficNode
{
char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最为10
int StartTime, StopTime; //起止时间
ﻩint EndCity; //该有向边指向得顶点在数组中得位置,即该城市编号
int Cost; //票价
} TrafficNodeDat;
typedef struct V 23、Node
{
ﻩ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;
} P 24、NodeDat;
VNodeDat AdjList[MAX_VERTEX_NUM];
char CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下标为该城市在本程序中得编号
int CityNum; //城市数目
PNodeDat Path[MAX_VERTEX_NUM]; //存储临时最小时间路径
PNodeDat MinPath[MAX_VERTEX_NUM]; //存储搜索到当前得最小时间路径
int MinTime, StartTime;
int curPath;
int ShowMenu()
{
25、
printf("\n|******************欢迎使用交通咨询系统*******|\n");
printf(”\n|-—----—---—-——————1: 添加城市---————-——---—-—|");
ﻩprintf("\n|-——-—-—-—-——-—-——-2: 删除城市----———--------—|");
printf(”\n|—--——----—--—--—-—3: 添加交通路线--—-——-—-——-|");
printf("\n|—--——---—-——------4: 删除交通路线-——--------—|”);
printf("\n 26、|—-—-————------—-—-5: 查询最小费用路线——--—---|");
printf("\n|—-----—-—-——-—-———6: 查询最快路线--------—-——|");
printf("\n|——-—----—-—---———-7: 清除屏幕------—----——---|");
ﻩprintf(”\n|--—-—————-—-—-———-0: 退出----—--—--------—--—|\n");
ﻩprintf("\n|***********o(∩_∩)o o(∩_∩)o **************|\n");
ﻩprintf(”\n请输入您得 27、选择:");
return 1;
}
void CopyRight()
{
ﻩprintf("\n”);
}
int SeekCity(char *name) //寻找城市
{
ﻩint i;
for (i = 0; i〈CityNum; i++)
ﻩ{
if (strcmp(name, CityName[i]) == 0) //比较函数,若相等,则返回i值
ﻩ {
ﻩ return i;
ﻩ}
}
ﻩreturn -1;
}
//=============================================Edit Info== 28、================================================
int SaveSysInfo() //向程序输入数据
{
FILE *fp; int i, j, total;
fp = fopen(CityFile, "w"); //打开CityFile文档
fprintf(fp, "%d\n”, CityNum); //往文档中写城市得数量
ﻩfor (i = 0; i<CityNum; i++)
{
ﻩfprintf(fp, "%s\n”, CityName[i]); //往文档中写城市得名字
ﻩ}
ﻩfclose(f 29、p);//将CityFile文档关闭
ﻩtotal = 0;
fp = fopen(TrainFile, "w”);//打开TrainFile文档
ﻩfor (i = 0; i 30、发城市、终点城市
ﻩ {
ﻩ fprintf(fp, ”%s %s %s ", AdjList[i]、Train[j]、name,
ﻩCityName[i],
ﻩ CityName[AdjList[i]、Train[j]、EndCity]);
ﻩﻩ fprintf(fp, "%2d:%2d %2d:%2d %d\n”, AdjList[i]、Train[j]、StartTime / 60, //往文档中写
ﻩﻩ ﻩAdjList[i]、Train[j]、StartTime % 60,
ﻩﻩﻩ AdjList[i]、Train[j]、StopTime / 60,
ﻩ 31、 ﻩAdjList[i]、Train[j]、StopTime % 60,
ﻩ AdjList[i]、Train[j]、Cost);
ﻩ}
}
ﻩfclose(fp); total = 0;
fp = fopen(FlightFile, "w”);
for (i = 0; i 32、ightNum; 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,
33、ﻩ ﻩAdjList[i]、Flight[j]、StopTime % 60,
ﻩ ﻩAdjList[i]、Flight[j]、Cost);
ﻩﻩ}
}
ﻩfclose(fp); return 1;
}
int InsertCity(char *Name) //添加城市
{
strcpy(CityName[CityNum], Name);
ﻩAdjList[CityNum]、city = CityNum;
AdjList[CityNum]、FlightNum = 0;
AdjList[CityNum]、TrainNum = 0;
CityNum++;
ﻩr 34、eturn 1;
}
int DelCity(char *Name) //删除城市
{
int city, i, j,o=1,k=1;
ﻩcity = SeekCity(Name);
printf("%s",Name);
ﻩwhile (true)
ﻩ{
ﻩ while (CityName[k] != Name)
ﻩ {
k++;
}
ﻩﻩif (k 〉 CityNum)
ﻩ{
ﻩ o-—;
ﻩprintf("未找到此城市,请重新输入!");
ﻩﻩreturn 0;
}
ﻩ for (i = city; i < CityNum 35、— 1; i++) //???可能city就是从0开始得
ﻩ{
ﻩ strcpy(CityName[i], CityName[i + 1]);
AdjList[i]、FlightNum = AdjList[i + 1]、FlightNum;
ﻩﻩﻩAdjList[i]、TrainNum = AdjList[i + 1]、TrainNum;
ﻩﻩﻩfor (j = 0; j < AdjList[i]、FlightNum; j++) //为什么没有火车得??
ﻩﻩ {
ﻩ ﻩﻩAdjList[i]、Flight[j]、Cost = AdjList[i + 1]、Flight 36、[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;
ﻩﻩ 37、 }
ﻩﻩ}
ﻩCityNum-—;
ﻩ}
return 1;
}
int InsertTrain(char *train, char *StartCity, char *EndCity, int StartTime, int EndTime, int cost)
{
ﻩint i, j; //InsertTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost);
i = SeekCity(StartCity);
j = SeekCity(EndCity);
AdjList[i]、T 38、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++; 39、 //火车得数加1
return 1;
}
int InsertFlight(char *flight, char *StartCity, char *EndCity, int StartTime, int EndTime, int cost)
{
ﻩint i, j;
i = SeekCity(StartCity);
j = SeekCity(EndCity);
AdjList[i]、Flight[AdjList[i]、FlightNum]、Cost = cost;
ﻩAdjList[i]、Flight[AdjList[i]、FlightNum]、EndCity 40、= 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; 41、i<CityNum; i++)
{
ﻩfor (j = 0; j〈AdjList[i]、FlightNum; j++) //注意j就是从0开始得
ﻩﻩif (strcmp(AdjList[i]、Flight[j]、name, name) == 0)
ﻩﻩ{
ﻩﻩflag = 1; break;
ﻩ}
ﻩif (flag)
{
ﻩ for (; j<AdjList[i]、FlightNum — 1; j++) //把删除得航班后得每个航班向前移一位
ﻩﻩ {
ﻩ AdjList[i]、Flight[j]、Cost = AdjList[i]、Flight[ 42、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;
43、
ﻩﻩ}
ﻩAdjList[i]、FlightNum—-; break;
ﻩ}
for (j = 0; j 44、[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 45、
}
ﻩ AdjList[i]、TrainNum—-; break;
ﻩﻩ}
}
ﻩreturn 1;
}
//==============================================Check Info================================================
void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN], int PreCity[Dij_MAXN], int p_end, int TravelType)
{
ﻩint track[Dij_MAXN 46、];
ﻩ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 47、 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);
ﻩ print 48、f("%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 = t 49、rack[i — 1]; min = 32767;
ﻩﻩﻩfor (k = 0; k 50、tf("%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
#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






