航班資訊查詢和檢索系統-資料結構課程設計
問題及程式碼:
設計並實現一個航班資訊查詢和檢索系統。要求:對飛機航班資訊進行排序和查詢,可按照航班號、起點站、到達站、起飛時間和到達時間等資訊進行查詢。航班資訊表的樣式如下:
航班號 |
起點站 |
終點站 |
班期 |
起飛時間 |
到達時間 |
機型 |
票價 |
CA1544 |
合肥 |
北京 |
1.2.4.5 |
10:55 |
12:40 |
733 |
960 |
MU5341 |
上海 |
廣州 |
每日 |
14:20 |
16:15 |
M90 |
1280 |
CZ3869 |
重慶 |
深圳 |
2.4.6 |
08:55 |
10:35 |
733 |
1010 |
其中航班號一項的格式為:前兩個大寫字母表示航空公司的名稱,後4位為航班編號,例如:CA1544,CA表示航空公司的名稱,1544為航班編號。
/*
*版權所有:Copyright (c)2015,煙臺大學計算機與控制工程學院
*All rights reserved.
*
*檔名稱:Flight.cpp
*檔案標識:無
*內容摘要:該程式碼用於獲取滿足字尾要求的第一個檔案
*其他說明:無
*當前版本:V1.0
*作 者:單昕昕
*完成日期:2016年6月22日
*
*修改記錄:
*修改日期:無。
*版本號:
*修改人:單昕昕
*修改內容:
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <fstream>//操作檔案必寫
#include <cstdlib>
using namespace std;
const int MAXN=10000;
const int p=23;
const string NULLKEY="NULLKEY";//定義空關鍵字值
const string DELKEY="DELKEY";//定義被刪關鍵字值
string x[MAXN];//輸入時的航班號
int hashlen=0;//雜湊表長度
ifstream infile("read.txt",ios::in);
typedef struct
{
string departure;//起點站
string terminal;//終點站
string schedule;//班期
string start;//起飛時間
string arrival;//到達時間
string type;//機型
double price;//票價
} Info;//說明資訊型別
typedef struct
{
string number;//航班號
Info data;//說明資訊
int cnt;//探查次數
} Hash;//雜湊表型別
Hash ha[MAXN];//定義一個雜湊表
int Work();//功能選擇表單
int GetNum(string k);//取出航班號中的數值部分
int Search(string key);//在雜湊表中查詢航班號
int Delete(string str);//刪除指定的航班資訊
void Insert1(string key);//自動插入航班資訊
void Insert2(string key);//手動插入航班資訊
void Create1();//檔案自動讀取
void Create2();//鍵盤手動輸入
void Number(string key);//查詢航班號
void Departure(string key);//查詢起點站
void Terminal(string key);//查詢到達站
void Start(string key);//查詢起飛時間
void Arrival(string key);//查詢到達時間
void FileOutput(int adr);//航班資訊存入檔案
void Output(int adr);//航班資訊在螢幕上顯示
void Input(int adr);//手動輸入航班資訊
/*
*函式名稱:Work
*功能描述:航班資訊查詢和檢索系統的選擇功能選單
*輸入引數:無
*輸出引數:無
*返回值:無
*其他說明:無
*/
int Work()
{
while(1)
{
cout<<endl;//表單格式
cout<<"\t"<<"\t"<<"\t"<<"*********歡迎使用航班資訊查詢和檢索系統*********"<<endl;
cout<<"\t"<<"\t"<<"\t"<<"\t"<<"①讀入資料"<<"\t"<<"②刪除資料"<<"\n";
cout<<"\t"<<"\t"<<"\t"<<"\t"<<"③航班號"<<"\t"<<"④起點站"<<"\n";
cout<<"\t"<<"\t"<<"\t"<<"\t"<<"⑤到達站"<<"\t"<<"⑥起飛時間"<<"\n";
cout<<"\t"<<"\t"<<"\t"<<"\t"<<"⑦到達時間"<<"\t"<<"⑧退出系統"<<"\n";
cout<<"\t"<<"\t"<<"\t"<<"************************************************"<<endl;
cout<<endl;
cout<<"請選擇將要使用的功能(序號):";
int t;//序號
string temp;//航班號
cin>>t;
switch (t)
{
case 1://①讀入資料
{
cout<<"請選擇讀取方式(1:自動讀取/2:手動錄入):";
int choose;//選擇讀取方式
cin>>choose;
if(choose==1)
Create1();//1:自動讀取
else if(choose==2)
Create2();//2:手動錄入
else
cout<<"序號錯誤!請查證後重新輸入!"<<endl;
cout<<"資訊錄入成功!"<<endl;
break;
}
case 2://②刪除資料
{
cout<<"請輸入要刪除的航班號及其所有資訊:";
string str;
cin>>str;
Delete(str);
cout<<"刪除成功!"<<endl;
break;
}
case 3://③航班號
{
cout<<"請輸入航班號:";
cin>>temp;
Number(temp);
break;
break;
}
case 4://④起點站
{
cout<<"請輸入起點站:";
cin>>temp;
Departure(temp);
break;
}
case 5://⑤到達站
{
cout<<"請輸入終點站:";
cin>>temp;
Terminal(temp);
break;
}
case 6://⑥起飛時間
{
cout<<"請輸入起飛時間:";
cin>>temp;
Start(temp);
break;
}
case 7://⑦到達時間
{
cout<<"請輸入到達時間:";
cin>>temp;
Arrival(temp);
break;
}
case 8://⑧退出系統
{
cout<<"程式結束!處理完畢,請開啟檔案檢視結果!"<<endl;
return 0;
break;
}
default://輸入的序號不在1~8之間的範圍內
{
cout<<"序號錯誤!請查證後重新輸入!"<<endl;
break;
}
}
}
return 0;
}
/*
*函式名稱:GetNum
*功能描述:取出航班號的數值部分
*輸入引數:k-航班號
*輸出引數:無
*返回值:getnum-返回航班編號
*其他說明:無
*/
int GetNum(string k)
{
int getnum=0,temp=1000;
getnum=(int(k[0])*10000000+int(k[1])*100000);
for(int i=2; k[i]!='\0'; ++i)//略掉表示航空公司的名稱的前兩個大寫字母
{
getnum+=(int(k[i]-'0')*temp);
temp/=10;
}
return getnum;//返回航班編號
}
/*
*函式名稱:Search
*功能描述:在雜湊表中查詢航班號
*輸入引數:key-航班號
*輸出引數:無
*返回值:0/-1-表示是/否查詢成功
*其他說明:無
*/
int Search(string key)
{
int i,adr;
int k=GetNum(key);
adr=k%p;
while(ha[adr].number!=NULLKEY&&ha[adr].number!=key)
{
++i;
adr=(adr+1)%MAXN;//採用線性探查法找下一個地址
}
if(ha[adr].number==key)
return adr;//查詢成功
else
return -1;//查詢失敗
}
/*
*函式名稱:Delete
*功能描述:在雜湊表中刪除指定的航班資訊
*輸入引數:key-航班號
*輸出引數:hashlen-雜湊表元素個數,ha[adr].number-標記是否被刪除
*返回值:0/-1-表示是/否查詢成功
*其他說明:無
*/
int Delete(string key)
{
int adr;
adr=Search(key);//在雜湊表中找到該關鍵字
if(adr!=-1)
{
ha[adr].number=DELKEY;
--hashlen;//雜湊表元素個數減一
return 1;
}
else//在雜湊表中未找到該關鍵字
return 0;
}
/*
*函式名稱:Insert1
*功能描述:在雜湊表中自動插入航班資訊
*輸入引數:key-航班號
*輸出引數:hashlen-雜湊表元素個數,ha[adr].number-關鍵字,ha[adr].cnt-探查次數
*返回值:無
*其他說明:無
*/
void Insert1(string key)
{
int i,adr;
int k=GetNum(key);//取出數值部分
adr=k%p;
if(ha[adr].number==NULLKEY||ha[adr].number==DELKEY)
{
ha[adr].number=key;//直接放入雜湊表中
ha[adr].cnt=1;
infile>>ha[adr].data.departure>>ha[adr].data.terminal>>ha[adr].data.schedule;
infile>>ha[adr].data.start>>ha[adr].data.arrival>>ha[adr].data.type>>ha[adr].data.price;
}
else//發生衝突時採用線性探查法解決衝突
{
i=1;//元素i為插入時發生衝突的次數
while(ha[adr].number!=NULLKEY&&ha[adr].number!=DELKEY)
{
adr=(adr+1)%p;
++i;
}
ha[adr].number=key;
ha[adr].cnt=i;
infile>>ha[adr].data.departure>>ha[adr].data.terminal>>ha[adr].data.schedule;
infile>>ha[adr].data.start>>ha[adr].data.arrival>>ha[adr].data.type>>ha[adr].data.price;
}
++hashlen;//雜湊表的元素個數加一
}
/*
*函式名稱:Insert2
*功能描述:在雜湊表中由檔案手動插入航班資訊
*輸入引數:key-航班號
*輸出引數:hashlen-雜湊表元素個數,ha[adr].number-關鍵字,ha[adr].cnt-探查次數
*返回值:無
*其他說明:無
*/
void Insert2(string key)
{
int i,adr;
int k=GetNum(key);
adr=k%p;
if(ha[adr].number==NULLKEY||ha[adr].number==DELKEY)
{
ha[adr].number=key;
ha[adr].cnt=1;
Input(adr);//手動輸入剩下資訊
}
else
{
i=1;
while(ha[adr].number!=NULLKEY&&ha[adr].number!=DELKEY)
{
adr=(adr+1)%p;
++i;
}
ha[adr].number=key;
ha[adr].cnt=i;
Input(adr);//手動輸入剩下資訊
}
++hashlen;
}
/*
*函式名稱:Create1
*功能描述:在雜湊表中自動插入航班關鍵字資訊
*輸入引數:key-航班號
*輸出引數:ha[adr].number-關鍵字全部初始化為NULLKEY,ha[adr].cnt-探查次數全部初始化為0
*返回值:無
*其他說明:無
*/
void Create1()
{
int i;
for(i=0; i<MAXN; ++i)//初始化
{
ha[i].number=NULLKEY;
ha[i].cnt=0;
}
cout<<"航班資訊讀取中…請稍後…"<<endl;//提示資訊
for(i=0;; ++i)
{
if(!infile)//測試檔案開啟操作是否成功
{
cerr<<"open error!"<<endl;
exit(1); //開啟不成功,則提示後退出
}
infile>>x[i];//從檔案中讀取
string s=x[i];
if(s=="00")
break;//讀入00時結束讀取
else
Insert1(x[i]);//將關鍵字插入雜湊表
}
infile.close();//讀入完畢一定要關閉檔案
}
/*
*函式名稱:Create2
*功能描述:在雜湊表中手動插入航班關鍵字資訊
*輸入引數:key-航班號
*輸出引數:ha[adr].number-關鍵字全部初始化為NULLKEY,ha[adr].cnt-探查次數全部初始化為0
*返回值:無
*其他說明:無
*/
void Create2()
{
int i;
for(i=0; i<MAXN; ++i)
{
ha[i].number=NULLKEY;
ha[i].cnt=0;
}
cout<<"請輸入航班資訊(輸入00時錄入結束)"<<endl;
for(i=0;; ++i)
{
cin>>x[i];//從鍵盤手動輸入關鍵字
string s=x[i];
if(s=="00") break;
else Insert2(x[i]);
}
}
/*
*函式名稱:Number
*功能描述:在雜湊表中查詢航班號
*輸入引數:key-航班號
*輸出引數:ha[adr].number-航班號,ha[adr].data.departure-起點站,ha[adr].data.terminal-到達站,ha[adr].data.schedule-班期,
ha[adr].data.start-起飛時間,ha[adr].data.arrival-到達時間,ha[adr].data.type-機型,ha[adr].data.price-票價
*返回值:無
*其他說明:無
*/
void Number(string key)
{
int i,adr;
int k=GetNum(key);
adr=k%p;
while(ha[adr].number!=NULLKEY&&ha[adr].number!=key)//雜湊查詢
{
++i;
adr=(adr+1)%MAXN;
}
if(ha[adr].number==key&&ha[adr].number!=DELKEY)
{
Output(adr);//在螢幕上顯示
FileOutput(adr);//存入檔案
}
else
cout<<"對不起,查無此航班!"<<endl;
}
/*
*函式名稱:Departure
*功能描述:在雜湊表中查詢起點站
*輸入引數:key-起點站
*輸出引數:ha[adr].number-航班號,ha[adr].data.departure-起點站,ha[adr].data.terminal-到達站,ha[adr].data.schedule-班期,
ha[adr].data.start-起飛時間,ha[adr].data.arrival-到達時間,ha[adr].data.type-機型,ha[adr].data.price-票價
*返回值:無
*其他說明:無
*/
void Departure(string key)//起點站
{
int i,flag=0;
for(i=0; i<MAXN; ++i)//順序查詢
{
if(flag) break;
else if(ha[i].data.departure==key)
{
Output(i);
FileOutput(i);
flag=1;//標記是否查詢到相關資訊
}
}
if(!flag)
cout<<"對不起,查無此航班!"<<endl;
}
/*
*函式名稱:Terminal
*功能描述:在雜湊表中查詢終點站
*輸入引數:key-終點站
*輸出引數:ha[adr].number-航班號,ha[adr].data.departure-起點站,ha[adr].data.terminal-到達站,ha[adr].data.schedule-班期,
ha[adr].data.start-起飛時間,ha[adr].data.arrival-到達時間,ha[adr].data.type-機型,ha[adr].data.price-票價
*返回值:無
*其他說明:無
*/
void Terminal(string key)//終點站
{
int i,flag=0;
for(i=0; i<MAXN; ++i)
{
if(flag)
break;
else if(ha[i].data.terminal==key)
{
Output(i);
FileOutput(i);
flag=1;
}
}
if(!flag)
cout<<"對不起,查無此航班!"<<endl;
}
/*
*函式名稱:Start
*功能描述:在雜湊表中查詢起飛時間
*輸入引數:key-起飛時間
*輸出引數:ha[adr].number-航班號,ha[adr].data.departure-起點站,ha[adr].data.terminal-到達站,ha[adr].data.schedule-班期,
ha[adr].data.start-起飛時間,ha[adr].data.arrival-到達時間,ha[adr].data.type-機型,ha[adr].data.price-票價
*返回值:無
*其他說明:無
*/
void Start(string key)
{
int i,flag=0;
for(i=0; i<MAXN; ++i)
{
if(flag) break;
else if(ha[i].data.start==key)
{
Output(i);
FileOutput(i);
flag=1;
}
}
if(!flag)
cout<<"對不起,查無此航班!"<<endl;
}
/*
*函式名稱:Arrival
*功能描述:在雜湊表中查詢到達時間
*輸入引數:key-到達時間
*輸出引數:ha[adr].number-航班號,ha[adr].data.departure-起點站,ha[adr].data.terminal-到達站,ha[adr].data.schedule-班期,
ha[adr].data.start-起飛時間,ha[adr].data.arrival-到達時間,ha[adr].data.type-機型,ha[adr].data.price-票價
*返回值:無
*其他說明:無
*/
void Arrival(string key)
{
int i,flag=0;
for(i=0; i<MAXN; ++i)
{
if(flag) break;
else if(ha[i].data.arrival==key)
{
Output(i);
FileOutput(i);
flag=1;
}
}
if(!flag)
cout<<"對不起,查無此航班!"<<endl;
}
/*
*函式名稱:FileOutput
*功能描述:航班資訊存入檔案
*輸入引數:雜湊表中的位置
*輸出引數:ha[adr].number-航班號,ha[adr].data.departure-起點站,ha[adr].data.terminal-到達站,ha[adr].data.schedule-班期,
ha[adr].data.start-起飛時間,ha[adr].data.arrival-到達時間,ha[adr].data.type-機型,ha[adr].data.price-票價
*返回值:無
*其他說明:無
*/
void FileOutput(int adr)
{
ofstream outfile("search.dat",ios::app);//追加方式寫入檔案
if(!outfile)//測試檔案開啟操作是否成功
{
cerr<<"open error!"<<endl;
exit(1);//開啟不成功,則提示後退出
}
outfile<<"航班號"<<"\t"<<"起點站"<<"\t"<<"到達站"<<"\t"<<"班期"<<"\t"<<"\t"<<"起飛時間"<<"\t";
outfile<<"到達時間"<<"\t"<<"機型"<<"\t"<<"票價"<<"\n";
outfile<<ha[adr].number<<"\t"<<ha[adr].data.departure<<"\t"<<ha[adr].data.terminal<<"\t"<<ha[adr].data.schedule<<"\t"<<"\t";
outfile<<ha[adr].data.start<<"\t"<<"\t"<<ha[adr].data.arrival<<"\t"<<"\t"<<ha[adr].data.type<<"\t"<<ha[adr].data.price<<"\n";
outfile.close();//關閉檔案。用完了必須關閉,否則會丟失資料
}
/*
*函式名稱:Output
*功能描述:航班資訊在螢幕上顯示
*輸入引數:雜湊表中的位置
*輸出引數:ha[adr].number-航班號,ha[adr].data.departure-起點站,ha[adr].data.terminal-到達站,ha[adr].data.schedule-班期,
ha[adr].data.start-起飛時間,ha[adr].data.arrival-到達時間,ha[adr].data.type-機型,ha[adr].data.price-票價
*返回值:無
*其他說明:無
*/
void Output(int adr)
{
cout<<"航班號"<<"\t"<<"起點站"<<"\t"<<"到達站"<<"\t"<<"班期"<<"\t"<<"\t"<<"起飛時間"<<"\t";
cout<<"到達時間"<<"\t"<<"機型"<<"\t"<<"票價"<<"\n";
cout<<ha[adr].number<<"\t"<<ha[adr].data.departure<<"\t"<<ha[adr].data.terminal<<"\t"<<ha[adr].data.schedule<<"\t"<<"\t";
cout<<ha[adr].data.start<<"\t"<<"\t"<<ha[adr].data.arrival<<"\t"<<"\t"<<ha[adr].data.type<<"\t"<<ha[adr].data.price<<"\n";
}
/*
*函式名稱:Input
*功能描述:手動輸入航班資訊
*輸入引數:雜湊表中的位置
*輸出引數:ha[adr].number-航班號,ha[adr].data.departure-起點站,ha[adr].data.terminal-到達站,ha[adr].data.schedule-班期,
ha[adr].data.start-起飛時間,ha[adr].data.arrival-到達時間,ha[adr].data.type-機型,ha[adr].data.price-票價
*返回值:無
*其他說明:無
*/
void Input(int adr)
{
cin>>ha[adr].data.departure>>ha[adr].data.terminal>>ha[adr].data.schedule;
cin>>ha[adr].data.start>>ha[adr].data.arrival>>ha[adr].data.type>>ha[adr].data.price;
}
int main()
{
Work();
return 0;
}
執行結果:
程式碼設計簡述:
(詳見程式碼註釋)
根據航班號使用雜湊表儲存,關鍵字是被轉成數值的航班號;
航班號使用線性探查法解決衝突;其他查詢使用順序查詢。
相關文章
- 資料結構課程設計——學生資訊管理系統資料結構
- 資料結構課程設計-宿舍管理系統資料結構
- 資料結構 課程設計 員工管理系統(C語言)資料結構C語言
- 學生資訊管理系統課程設計
- Elasticsearch 查詢結果分組統計,聚合檢索(group by stats)Elasticsearch
- 03_查詢和檢索
- 資料庫課程設計-宿舍管理系統資料庫
- 資料結構課程設計報告——暢通工程資料結構
- EI 和 SCI 檢索號查詢
- join方法應用之—查詢航班資訊
- 讀資料工程之道:設計和構建健壯的資料系統25查詢
- 競拍系統設計和核心資料結構資料結構
- 大一課程設計:基於資料庫的學生資訊系統資料庫
- C++課程設計:學生資訊管理系統C++
- 資料庫課程設計—超市零售資訊管理系統(Python實現)資料庫Python
- 統計資訊查詢檢視|全方位認識 sys 系統庫
- 微課sql最佳化(8)、統計資訊收集(6)-統計資訊查詢SQL
- OCP課程19:SQL之使用子查詢檢索資料SQL
- 20145216《資訊保安系統設計基礎》課程總結
- 資料庫課設(校友錄資訊管理系統)資料庫
- 資料庫課程設計資料庫
- Oracle檢視查詢慢之統計資訊收集Oracle
- OCP課程23:管理Ⅰ之資料庫體系結構資料庫
- 資料結構-單連結串列查詢按序號查詢資料結構
- 【資料結構】折半查詢(二分查詢)資料結構
- 23.資料結構 查詢資料結構
- Sqlserver資料庫郵件的體系結構及常用的查詢檢視SQLServer資料庫
- 作業系統課程設計感受作業系統
- SQL Server之查詢檢索操作SQLServer
- 雲脈紙質文件管理系統:多重檢索輕鬆查詢文件
- 【web】資料庫應用系統設計體系結構Web資料庫
- 重學資料結構(八、查詢)資料結構
- 資料結構之三大查詢資料結構
- 查詢系統關鍵資訊
- 綜合資訊查詢系統IISS
- 課程設計-車牌檢測
- 20145227鄢曼君 《資訊保安系統設計基礎》課程總結
- 20145302張薇 《資訊保安系統設計基礎》課程總結