《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)交通咨詢系統(tǒng)設(shè)計(jì).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)交通咨詢系統(tǒng)設(shè)計(jì).doc(36頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
設(shè)計(jì)題目<二>:7.3.4交通咨詢系統(tǒng)設(shè)計(jì)P160
一、設(shè)計(jì)要求
1.問題描述
根據(jù)不同目的的旅客對(duì)交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的時(shí)間盡可能的短,出門旅行的旅客希望旅費(fèi)盡可能的少,而老年人則要求中轉(zhuǎn)次數(shù)少。模擬一個(gè)全國城市之間的咨詢交通程序,為旅客提供兩種或三種最優(yōu)的交通路線。
2.需求分析
二、概要設(shè)計(jì)
1.主界面設(shè)計(jì)
(圖2.1“交通咨詢系統(tǒng)”主菜單)
2.存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)
本系統(tǒng)采用圖結(jié)構(gòu)類型存儲(chǔ)抽象交通咨詢系統(tǒng)的信息。
typedef struct TrafficNode
{
char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最為10
int StartTime, StopTime; //起止時(shí)間
int EndCity; //該有向邊指向的頂點(diǎn)在數(shù)組中的位置,即該城市編號(hào)
int Cost; //票價(jià)
} TrafficNodeDat;
typedef struct VNode
{
CityType city;
int TrainNum, FlightNum; //標(biāo)記下面Train數(shù)組和Flight數(shù)組里元素個(gè)數(shù)
TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //數(shù)組成員為結(jié)構(gòu)體,記錄了到達(dá)城市、起止時(shí)間、票價(jià)和班次
TrafficNodeDat Flight[MAX_TRAFFIC_NUM];
// int Cost; //遍歷時(shí)到達(dá)該城市的耗費(fèi)(時(shí)間或者費(fèi)用)
} VNodeDat;
typedef struct PNode
{
int City;
int TraNo;
} PNodeDat;
3.系統(tǒng)功能設(shè)計(jì)
(1)添加城市。添加一個(gè)城市的名稱
(2)刪除城市。輸入一個(gè)城市名稱,刪除該城市。
(3)添加交通路線。輸入起始城市、終點(diǎn)城市、航班或火車、車次、起始時(shí)間、終點(diǎn)時(shí)間和票價(jià)
(4) 刪除交通路線。輸入火車或飛機(jī)的班次刪除該交通路線。
(5)查詢最小費(fèi)用路線。輸入起始城市、終點(diǎn)城市、航班或火車、車次、起始時(shí)間、終點(diǎn)時(shí)間查詢最小費(fèi)用路線。
三、模塊設(shè)計(jì)
1.模塊設(shè)計(jì)
無向網(wǎng)操作模塊
工作區(qū)模塊
主程序模塊
(圖2.2 模塊調(diào)用示意圖)
2.系統(tǒng)子程序及功能設(shè)計(jì)
(1)int ShowMenu()//主菜單
(2)void CopyRight()
(3)int SeekCity(char *name) //尋找城市
(4)int InsertCity(char *Name) //添加城市
(5)int SaveSysInfo() //向程序輸入數(shù)據(jù)
(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)//添加飛機(jī)航線
(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()//存儲(chǔ)數(shù)據(jù)
(12)int SearchMinTime(CityType City, CityType EndCity, int CurTime, int curPathNo, int TravelType)//查詢最短時(shí)間
(13)int CalcMinTime(int StartCity, int EndCity, int TravelType) //顯示最短時(shí)間
(14)int CalcMinCost(int StartCity, int EndCity, int TravelType)//最少花費(fèi)
(15)int main()//主函數(shù)
3.函數(shù)主要調(diào)用關(guān)系圖
15main()
8
9
1
12
7
5
4
13
6
3
6
1
2
2
3
7
1
6
(圖2.3函數(shù)主要調(diào)用關(guān)系圖)
四、詳細(xì)設(shè)計(jì)
1.?dāng)?shù)據(jù)類型定義
(1)全局變量的定義
typedef short int CityType;//CityType 定義短整形的變量
typedef struct TrafficNode
{
char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最為10
int StartTime, StopTime; //起止時(shí)間
int EndCity; //該有向邊指向的頂點(diǎn)在數(shù)組中的位置,即該城市編號(hào)
int Cost; //票價(jià)
} TrafficNodeDat;
typedef struct VNode
{
CityType city;
int TrainNum, FlightNum; //標(biāo)記下面Train數(shù)組和Flight數(shù)組里元素個(gè)數(shù)
TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //數(shù)組成員為結(jié)構(gòu)體,記錄了到達(dá)城市、起止時(shí)間、票價(jià)和班次
TrafficNodeDat Flight[MAX_TRAFFIC_NUM];
// int Cost; //遍歷時(shí)到達(dá)該城市的耗費(fèi)(時(shí)間或者費(fèi)用)
} VNodeDat;
typedef struct PNode
{
int City;
int TraNo;
} PNodeDat;
2.系統(tǒng)主要子程序詳細(xì)設(shè)計(jì)
(1)用戶工作區(qū)模塊的設(shè)計(jì)
int ShowMenu()
{
printf("\n|******************歡迎使用交通咨詢系統(tǒng)*******|\n");
printf("\n|------------------1: 添加城市----------------|");
printf("\n|------------------2: 刪除城市----------------|");
printf("\n|------------------3: 添加交通路線------------|");
printf("\n|------------------4: 刪除交通路線------------|");
printf("\n|------------------5: 查詢最小費(fèi)用路線--------|");
printf("\n|------------------6: 查詢最快路線------------|");
printf("\n|------------------7: 清除屏幕----------------|");
printf("\n|------------------0: 退出--------------------|\n");
printf("\n|***********o(∩_∩)o o(∩_∩)o **************|\n");
printf("\n請(qǐng)輸入你的選擇:");
return 1;
}
(2)用Dijkstra算法求兩段路程的最短距離
void Dijkstra_Output(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 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]].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; kAdjList[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 i
int i, j, min, pre, pos;
for (i = 0; i0 && (min<0 || matx[i][j]
#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 定義短整形的變量
typedef struct TrafficNode
{
char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最為10
int StartTime, StopTime; //起止時(shí)間
int EndCity; //該有向邊指向的頂點(diǎn)在數(shù)組中的位置,即該城市編號(hào)
int Cost; //票價(jià)
} TrafficNodeDat;
typedef struct VNode
{
CityType city;
int TrainNum, FlightNum; //標(biāo)記下面Train數(shù)組和Flight數(shù)組里元素個(gè)數(shù)
TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //數(shù)組成員為結(jié)構(gòu)體,記錄了到達(dá)城市、起止時(shí)間、票價(jià)和班次
TrafficNodeDat Flight[MAX_TRAFFIC_NUM];
// int Cost; //遍歷時(shí)到達(dá)該城市的耗費(fèi)(時(shí)間或者費(fèi)用)
} VNodeDat;
typedef struct PNode
{
int City;
int TraNo;
} PNodeDat;
VNodeDat AdjList[MAX_VERTEX_NUM];
char CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下標(biāo)為該城市在本程序中的編號(hào)
int CityNum; //城市數(shù)目
PNodeDat Path[MAX_VERTEX_NUM]; //存儲(chǔ)臨時(shí)最小時(shí)間路徑
PNodeDat MinPath[MAX_VERTEX_NUM]; //存儲(chǔ)搜索到當(dāng)前的最小時(shí)間路徑
int MinTime, StartTime;
int curPath;
int ShowMenu()
{
printf("\n|******************歡迎使用交通咨詢系統(tǒng)*******|\n");
printf("\n|------------------1: 添加城市----------------|");
printf("\n|------------------2: 刪除城市----------------|");
printf("\n|------------------3: 添加交通路線------------|");
printf("\n|------------------4: 刪除交通路線------------|");
printf("\n|------------------5: 查詢最小費(fèi)用路線--------|");
printf("\n|------------------6: 查詢最快路線------------|");
printf("\n|------------------7: 清除屏幕----------------|");
printf("\n|------------------0: 退出--------------------|\n");
printf("\n|***********o(∩_∩)o o(∩_∩)o **************|\n");
printf("\n請(qǐng)輸入你的選擇:");
return 1;
}
void CopyRight()
{
printf("\n");
}
int SeekCity(char *name) //尋找城市
{
int i;
for (i = 0; i CityNum)
{
o--;
printf("未找到此城市,請(qǐng)重新輸入!");
return 0;
}
for (i = city; i < CityNum - 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[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; //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].Train[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++; //火車的數(shù)加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 = 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= 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; kAdjList[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; kAdjList[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 i
int i, j, min, pre, pos;
for (i = 0; i0 && (min<0 || matx[i][j]CurTime - StartTime)
{
for (i = 0; i <= curPathNo; i++)
{
MinPath[i].City = 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= (CurTime % 1440)) && (AdjList[City].Train[i].StopTime + (CurTime / 1440) * 1440 - StartTime= CurTime) && (AdjList[City].Flight[i].StopTime + (CurTime / 1440) * 1440 - StartTime
下載提示(請(qǐng)認(rèn)真閱讀)
- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
文檔包含非法信息?點(diǎn)此舉報(bào)后獲取現(xiàn)金獎(jiǎng)勵(lì)!
下載文檔到電腦,查找使用更方便
9.9
積分
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
-
數(shù)據(jù)結(jié)構(gòu)
課程設(shè)計(jì)
交通
咨詢
系統(tǒng)
設(shè)計(jì)
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學(xué)習(xí)交流,未經(jīng)上傳用戶書面授權(quán),請(qǐng)勿作他用。
鏈接地址:http://m.jqnhouse.com/p-6670479.html