航班資訊查詢和檢索系統-資料結構課程設計

kewlgrl發表於2016-07-10

問題及程式碼:

設計並實現一個航班資訊查詢和檢索系統。要求:對飛機航班資訊進行排序和查詢,可按照航班號、起點站、到達站、起飛時間和到達時間等資訊進行查詢。航班資訊表的樣式如下:

航班號

起點站

終點站

班期

起飛時間

到達時間

機型

票價

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位為航班編號,例如:CA1544CA表示航空公司的名稱,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;
}

執行結果:



程式碼設計簡述:
(詳見程式碼註釋)
根據航班號使用雜湊表儲存,關鍵字是被轉成數值的航班號;
航班號使用線性探查法解決衝突;其他查詢使用順序查詢。


相關文章