课程设计:飞机航班信息查询系统

题目名称

一、实验内容

【问题描述】

对飞机航班信息进行排序和查询。航班信息包括:航班号,起点,终点,航班日期(周一到周日,分别用1,2...7数字表示),起飞时间,到达时间,机型,票价。

    以线性表作为存储结构,实现以下基本功能。(1)输入航班信息,(2)对航班信息按航班号进行基数排序,(3)用二分查找对排序后的航班信息安航班号查找并输出查询结果,(3)实现多条件组合查询,例如,查询周三12:00以前济南起飞的航班,或查询济南到上海票价低于1000的航班

【数据格式】     

航班号

起点

终点

航班日期

起飞时间

到达时间

机型

票价

MU5572

济南

上海

1,3,5

10:00

11:30

空客320

720

SC1181

济南

上海

1,2,4,6

07:05

10:05

波音737

1060

ZH9114

北京

深圳

1,2,3,4,5,6,7

07:30

11:10

波音737

1120

 ...

请自己补充其他航班信息(10条以上),注意数据多样性,能满足查询要求    

二、数据结构设计

航班信息结构体

struct Flight

{

    string flight_num;  //航班号

    string strat_point; //起点

    string end_point;   //终点

    string flight_date; //航班日期

    string fly_time;    //起飞时间

    string arrive_time; //到达时间

    string air_modle;   //机型

    int ticket_price;   //票价

    int flight_order;   //航班号后四位数字

};

类的定义:

用类方便管理、数组操作。flight数组存储所有航班信息

class All

{

public:

    All();                                        //构造函数

    ~All();                                       //析构函数

    bool IsEmpty();                               //判断数组是否为空

    void InsertFlight();                          //插入航班模块

    void ShowAll();                               //输出所有航班信息

    void ShowOne(int index);                      //利用下标输出单个航班信息

    void ShowOne(Flight copyFlight);              //用结构体输出单个航班信息

    void FileInsertFlight(Flight New_node);       //将航班加入数组内

    void OpenFile();                              //打开文件,从文件中读取

    void CardinalSort();                          //按航班号基数排序

    void GetFlightNum(int index);                 //求航班号的后四位数字

    void BinarySearch();                          //对航班号二分查找

    void MultiConditionQuery();                   //查询模块

    void DeleteFlight();                          //用航班号方式删除航班信息

    bool FindSameFlightNum(string Insert_flight); //判断是否存在与参数相同的航班号



private:

    int num;        //航班信息数量

    Flight *flight; //航班信息存储数组

};

三、算法设计

算法思想描述和实现

在程序开始,创建All类对象test,调用test.OpenFlie()从文件中读取航班信息并存到test的flight之中。

接下来输出提示信息,通过用户输入来选择要进行的操作。

插入函数InsertFlight()描述:

用户输入航班信息,属于完毕后,程序进行判断,如果航班信息输入合法,并且文件中不存在其相同航班号的信息,则存入数组同时写进文件。

查询函数MultiConditionQuery()描述:

我所用的多条件查询方法为:将flight数组复制一份为copy_flight,对每次查询都是对数组copy_flight查询,并且查询返回值再赋值给copy_flight,通过while循环进行多次查询。每次查询输入一个条件,copy_flight的值就变化一次,最后其值就是我们查询到的信息。

删除航班函数DeleteFlight()描述:

通过匹配用户输入的航班号,找到该航班信息的下标,然后在数组中删除该航班信息,最后把航班信息重新写入到文件之中。

航班号基数排序函数CardinalSort()描述:

这里先计算出所有航班信息航班号的后四位数字,然后通过该数字的大小对航班信息进行基数排序。

航班号二分查找函数BinarySearch()描述:

该函数也是提取出航班号的后四位,通过后四位数字来进行航班号的二 分查找。

输出所有航班信息函数ShowAll()描述:

遍历flight数组,输出结构体数组中的数据。

对于查询功能,每一项都有一个查询函数。这些函数结构大体相似。

其中:

Flight *StartPointSearch(Flight *CopyFlight, int &size, string condition); //通过起点查找符合条件的航班信息

Flight *EndPointSearch(Flight *CopyFlight, int &size, string condition);   //通过终点查找符合条件的航班信息

这两个函数支持模糊搜索,通过string字符串的find函数,把参数当做子字符串,例如输出 ‘济’,可以查询到济南、济宁这些结果。即支持简单地模糊搜索。

Flight *DateSearch(Flight *CopyFlight, int &size, string condition);       //通过日期查找符合条件的航班信息

该函数中,把参数当做子字符串,在数组中的flight_date进行寻找,如果找到则符合匹配条件。

Flight *FlyTimeSearch(Flight *CopyFlight, int &size, string condition);    //通过起飞时间查找符合条件的航班信息

Flight *ArriveTimeSearch(Flight *CopyFlight, int &size, string condition); //通过到到达时间查找符合条件的航班信息

这两个函数中,把condition的格式为xx:xx,在这里截取参数的0-1位和3-4位在进行拼接,组成纯数字型字符串,再把该字符串转换成int型数据。数组中的时间也进行同样处理,之后进行整形数据的比较,从而筛选符合条件的数据。

Flight *PriceSearch(Flight *CopyFlight, int &size, int condition);         //通过价格查找符合条件的航班信息

该函数纯粹的进行整型数值比较,符合条件则返回。

    

五、实验过程中出现的问题及解决方

在用户的使用过程中,难免会遇到输入出错的情况,所以我对程序的完备性做了很多工作。

首先是选择操作的错误,我把选择操作的select换成了char字符,从而避免属于非数字而异常终止程序。

其次,在查询或插入航班信息的时候,航班号、航班日期、起飞时间、到达时间都有可能出错。

对于航班号,我限制输入为6位,后四位必须为数字。通过判断位数是否为6位和后四位是否为数字来进行判断是否正确。

bool TestFlightNum(string test) //检验航班号是否输入正确模块

{

    if (test.length() != 6)

    {

        cout << "输入有误,请检查您的输入是否正确" << endl;

        return false;

    }

    string temp_num = test.substr(3, 4);

    // string temp_alpha = test.substr(0, 2);



    if (!isNum(temp_num))

    {

        cout << "输入有误,请检查您的输入是否正确" << endl;

        return false;

    }

    return true;

}

对于航班日期,插入时,string偶数位必须为数字,偶数位必须为”,”字符,否则认为输入错误。这里用for循序来判断。

bool TestInputDate(string date)

{

    if (date.length() == 0 || date.length() / 2 == 0)

    {

        cout << "日期输入有误,请检查您的输入是否正确" << endl;

        return false;

    }

    string single;

    string dou;

    for (int i = 0; i < date.length(); i = i + 2)

    {

        single = date.substr(i, 1);

        if (!TestDate(single))

            return false;

    }

    for (int i = 1; i < date.length(); i = i + 2)

    {

        single = date.substr(i, 1);

        if (single != ",")

            return false;

    }

    return true;

}

对于到达时间和起飞时间,判断是否正确的条件为:string的第1、2、4、5位必须为数字,且时位不大于24,分位不大于60。第3位必须为”:”。但如果是模糊搜索,只输入了两个数字,则只对这两个数字进行判断。

bool TestLegality(string test) //检验时间是否输入正确

{

    if (test.length() == 5)

    {

        string temp = test.substr(0, 2) + test.substr(3, 2);

        if (!isNum(temp))

        {

            cout << "输入有误,请检查您的输入是否正确" << endl;

            return false;

        }

        int trans = stoi(temp);

        if (trans > 2359)

        {

            cout << "输入的时间不正确,请检查您的输入是否正确" << endl;

            return false;

        }

        trans = trans % 100;

        if (trans > 59)

        {

            cout << "输入的时间不正确,请检查您的输入是否正确" << endl;

            return false;

        }

        cout << "格式输入有误,请检查您的输入是否正确" << endl;

        return false;

    }

    else if (test.length() == 2)

    {

        if (!isNum(test))

        {

            cout << "输入有误,请检查您的输入是否正确" << endl;

            return false;

        }

        int trans = stoi(test);

        if (trans > 23)

        {

            cout << "输入的时间不正确,请检查您的输入是否正确" << endl;

            return false;

        }

    }

    return true;

}

对于价格,输入的时候为string类型,在函数内判断其是否为数字,不是则输入错误。

bool TestPrice(string test)

{

    if (!isNum(test))

    {

        cout << "输入错误,请检查价格是否输入正确" << endl;

        return false;

    }

    int int_price = stoi(test);

    if (int_price > 0)

    {

        return true;

    }

    cout << "输入错误,请检查价格是否输入正确" << endl;

    return false;

}

通过这些函数,避免了查询或者插入时数据的输入错误而引起的程序输出异常或程序崩溃。

同时,在一开始的文件读取时,判断文件是否为空,避免了文件读取的报错。

完整代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int n = 100;
struct Flight
{
    string flight_num;  //航班号
    string strat_point; //起点
    string end_point;   //终点
    string flight_date; //航班日期
    string fly_time;    //起飞时间
    string arrive_time; //到达时间
    string air_modle;   //机型
    int ticket_price;   //票价
    int flight_order;   //航班号后四位数字
};

class All
{
public:
    All();                                        //构造函数
    ~All();                                       //析构函数
    bool IsEmpty();                               //判断数组是否为空
    void InsertFlight();                          //插入航班模块
    void ShowAll();                               //输出所有航班信息
    void ShowOne(int index);                      //利用下标输出单个航班信息
    void ShowOne(Flight copyFlight);              //用结构体输出单个航班信息
    void FileInsertFlight(Flight New_node);       //将航班加入数组内
    void OpenFile();                              //打开文件,从文件中读取
    void CardinalSort();                          //按航班号基数排序
    void GetFlightNum(int index);                 //求航班号的后四位数字
    void BinarySearch();                          //对航班号二分查找
    void MultiConditionQuery();                   //查询模块
    void DeleteFlight();                          //用航班号方式删除航班信息
    bool FindSameFlightNum(string Insert_flight); //判断是否存在与参数相同的航班号

private:
    int num;        //航班信息数量
    Flight *flight; //航班信息存储数组
};

All::All() //构造函数
{
    num = 0;
    flight = new Flight[n];
}
All::~All()
{
    delete[] flight;
}
//函数声明-----------------------------------------------------------------
Flight *StartPointSearch(Flight *CopyFlight, int &size, string condition); //通过起点查找符合条件的航班信息
Flight *EndPointSearch(Flight *CopyFlight, int &size, string condition);   //通过终点查找符合条件的航班信息
Flight *DateSearch(Flight *CopyFlight, int &size, string condition);       //通过日期查找符合条件的航班信息
Flight *FlyTimeSearch(Flight *CopyFlight, int &size, string condition);    //通过起飞时间查找符合条件的航班信息4
Flight *FlyTimeSearchTwo(Flight *CopyFlight, int &size, string condition);
Flight *ArriveTimeSearch(Flight *CopyFlight, int &size, string condition); //通过到到达时间查找符合条件的航班信息
Flight *ArriveTimeSearchTwo(Flight *CopyFlight, int &size, string condition);
Flight *PriceSearch(Flight *CopyFlight, int &size, int condition); //通过价格查找符合条件的航班信息
bool TestLegality(string test);
bool TestDate(string date);
bool isNum(string str);
bool TestFlightNum(string test);
bool TestPrice(string test);
bool TestInputDate(string date);

void All::GetFlightNum(int index) //求航班号的后四位数字
{
    string temp = flight[index].flight_num.substr(2, 4);
    flight[index].flight_order = stoi(temp);
}

bool All::IsEmpty() //判断数组是否为空
{
    if (num == 0)
        return true;
    else
        return false;
}

void All::InsertFlight() //插入航班模块
{
    Flight New_node;
    string str_price;
    cout << "请输入要插入的数据:" << endl;
    cout << "航班号	  起点	  终点	  航班日期	 起飞时间	 到达时间 	机型	  票价" << endl;
    cin >> New_node.flight_num;
    cin >> New_node.strat_point;
    cin >> New_node.end_point;
    cin >> New_node.flight_date;
    cin >> New_node.fly_time;
    cin >> New_node.arrive_time;
    cin >> New_node.air_modle;
    cin >> str_price;
    if (!FindSameFlightNum(New_node.flight_num))
    {
        cout << "该航班航已存在,插入失败" << endl;
        return;
    }
    if (!TestPrice(str_price))
    {
        return;
    }
    else
    {
        New_node.ticket_price = stoi(str_price);
    }
    if (TestFlightNum(New_node.flight_num) && TestLegality(New_node.fly_time) && TestLegality(New_node.arrive_time) && TestInputDate(New_node.flight_date))
    {
        flight[num] = New_node;
        GetFlightNum(num);
        num++;
        ofstream outfile;
        outfile.open("flight_input.txt", ios::app);
        if (IsEmpty())
        {
            outfile << New_node.flight_num << " " << New_node.strat_point << " " << New_node.end_point << " " << New_node.flight_date << " " << New_node.fly_time << " " << New_node.arrive_time << " " << New_node.air_modle << " " << New_node.ticket_price << "\n";
        }
        else
        {
            outfile << "\n"
                    << New_node.flight_num << " " << New_node.strat_point << " " << New_node.end_point << " " << New_node.flight_date << " " << New_node.fly_time << " " << New_node.arrive_time << " " << New_node.air_modle << " " << New_node.ticket_price;
        }
        outfile.close();
        cout << endl
             << "插入成功!" << endl;
        ShowAll();
    }
}

bool All::FindSameFlightNum(string Insert_flight)
{
    for (int i = 0; i < num; i++)
    {
        if (flight[i].flight_num == Insert_flight)
        {
            return false;
        }
    }
    return true;
}

void All::FileInsertFlight(Flight New_node) //将航班加入数组内
{
    flight[num] = New_node;
    num++;
}

void All::ShowAll() //输出所有航班信息
{
    if (IsEmpty())
    {
        cout << "没有数据存在" << endl;
        return;
    }
    int temp = 0;
    cout << "航班号    起点      终点      航班日期           起飞时间       到达时间         机型           票价" << endl
         << endl;

    while (temp != num)
    {
        cout << left << setw(10) << flight[temp].flight_num;
        cout << left << setw(10) << flight[temp].strat_point;
        cout << left << setw(10) << flight[temp].end_point;
        cout << left << setw(20) << flight[temp].flight_date;
        cout << left << setw(15) << flight[temp].fly_time;
        cout << left << setw(15) << flight[temp].arrive_time;
        cout << left << setw(12) << flight[temp].air_modle;
        cout << right << setw(8) << flight[temp].ticket_price << endl;
        temp++;
    }
    //printf("%-9s%-10s-->  %-11s%-12s%-6s%-9s%-9s%-8d\n", node->flight_num, node->strat_point, node->end_point, node->flight_date, node->fly_time,node->arrive_time, node->air_modle, node->ticket_price);
}

void All::ShowOne(int index) //利用下标输出单个航班信息
{

    cout << left << setw(10) << flight[index].flight_num;
    cout << left << setw(10) << flight[index].strat_point;
    cout << left << setw(10) << flight[index].end_point;
    cout << left << setw(20) << flight[index].flight_date;
    cout << left << setw(15) << flight[index].fly_time;
    cout << left << setw(15) << flight[index].arrive_time;
    cout << left << setw(12) << flight[index].air_modle;
    cout << right << setw(8) << flight[index].ticket_price << endl;
}

void All::ShowOne(Flight copyFlight) //用结构体输出单个航班信息
{

    cout << left << setw(10) << copyFlight.flight_num;
    cout << left << setw(10) << copyFlight.strat_point;
    cout << left << setw(10) << copyFlight.end_point;
    cout << left << setw(20) << copyFlight.flight_date;
    cout << left << setw(15) << copyFlight.fly_time;
    cout << left << setw(15) << copyFlight.arrive_time;
    cout << left << setw(12) << copyFlight.air_modle;
    cout << right << setw(8) << copyFlight.ticket_price << endl;
}

void All::OpenFile() //打开文件,从文件中读取
{
    ifstream infile;
    infile.open("flight_input.txt", ios::binary);
    if (!infile) //文件没打开
    {
        cout << "                  信息错误!"; //提示用户
        return;
    }

    while (1) //读取文件内容,对应结构体各元素
    {

        Flight new_node;
        infile >> new_node.flight_num >> new_node.strat_point >> new_node.end_point >> new_node.flight_date >> new_node.fly_time >> new_node.arrive_time >> new_node.air_modle >> new_node.ticket_price;
        flight[num] = new_node;
        if (new_node.flight_num.empty())
        {
            return;
        }
        GetFlightNum(num);
        num++;
        if (infile.eof())
        {
            break;
        } //到文件尾
    }
    infile.close();
}

void All::CardinalSort() //航班号进行基数排序
{
    if (IsEmpty())
    {
        cout << "没有数据存在" << endl;
        return;
    }
    Flight *tmp = new Flight[num];
    int *count = new int[10]; //计数器
    int i, j, k;
    int radix = 1;
    for (i = 1; i <= 4; i++) //进行d次排序
    {
        for (j = 0; j < 10; j++)
            count[j] = 0; //每次分配前清空计数器
        for (j = 0; j < num; j++)
        {
            k = (flight[j].flight_order / radix) % 10; //统计每个桶中的记录数
            count[k]++;
        }
        for (j = 1; j < 10; j++)
            count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
        for (j = num - 1; j >= 0; j--)          //将所有桶中记录依次收集到tmp中
        {
            k = (flight[j].flight_order / radix) % 10;
            tmp[count[k] - 1] = flight[j];
            count[k]--;
        }
        for (j = 0; j < num; j++) //将临时数组的内容复制到data中
            flight[j] = tmp[j];
        radix = radix * 10;
    }
    cout << endl
         << "排序完成,现数据如下:" << endl;
    ShowAll();
    delete[] tmp;
    delete[] count;
}

void All::BinarySearch() //航班号进行二分查找
{
    if (IsEmpty())
    {
        cout << "没有数据存在" << endl;
        return;
    }
    string in_data;
    cout << "请输入要查询的航班号:";
    cin >> in_data;
    if (!TestFlightNum(in_data))
    {
        cout << "输入航班号格式错误" << endl;
        return;
    }
    in_data = in_data.substr(2, 4);
    int target = stoi(in_data);
    int left = 0, right = num - 1;
    while (left <= right)
    {
        int mid = (right + left) / 2;
        if (flight[mid].flight_order == target)
        {
            // return mid;
            cout << "该航班信息为:" << endl
                 << endl;
            cout << "航班号    起点      终点      航班日期           起飞时间       到达时间         机型           票价" << endl
                 << endl;
            ShowOne(mid);
            return;
        }
        else if (flight[mid].flight_order < target)
        {
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
    cout << "查无此航班飞机,请确认是否输入正确" << endl;
    return;
}

void All::MultiConditionQuery() //查询模块
{
    if (IsEmpty())
    {
        cout << "系统文件为空,退出查询" << endl;
        return;
    }
    cout << "1、起点   2、终点    3、日期   4、起飞时间    5、到达时间    6、票价" << endl;
    cout << "请输入您要查询的条件(输入 0 默认退出):";
    int size = num, int_price, z = 0; //z计数,判断是不是第一次输入0
    char select;
    bool err = false;
    string string_state;
    Flight *CopyFlight;
    CopyFlight = new Flight[num];
    memmove(CopyFlight, flight, sizeof(Flight) * num);

    cin >> select;
    do
    {
        switch (select)
        {
        case '0':
            break;
        case '1':
            cout << "请输入起点城市:";
            cin >> string_state;
            CopyFlight = StartPointSearch(CopyFlight, size, string_state);
            break;
        case '2':
            cout << "请输入终点城市:";
            cin >> string_state;
            CopyFlight = EndPointSearch(CopyFlight, size, string_state);
            break;
        case '3':
            cout << "请输入要查询周几的机票:";
            cin >> string_state;
            if (!TestDate(string_state))
            {
                err = true;
                break;
            }
            CopyFlight = DateSearch(CopyFlight, size, string_state);
            break;
        case '4':
            cout << "请输入要查询几点之前的机票:";
            cin >> string_state;
            if (!TestLegality(string_state))
            {
                err = true;
                break;
            }
            if (string_state.length() == 5)
            {
                CopyFlight = FlyTimeSearch(CopyFlight, size, string_state);
            }
            else
            {
                CopyFlight = FlyTimeSearchTwo(CopyFlight, size, string_state);
            }
            break;
        case '5':
            cout << "请输入要查询几点之前到达的机票:";
            cin >> string_state;
            if (!TestLegality(string_state))
            {
                err = true;
                break;
            }
            if (string_state.length() == 5)
            {
                CopyFlight = ArriveTimeSearch(CopyFlight, size, string_state);
            }
            else
            {
                CopyFlight = ArriveTimeSearchTwo(CopyFlight, size, string_state);
            }
            break;
        case '6':
            cout << "请输入要查询的票价的上限:";
            cin >> string_state;
            if (!TestPrice(string_state))
            {
                err = true;
                break;
            }
            int_price = stoi(string_state);
            CopyFlight = PriceSearch(CopyFlight, size, int_price);
            break;
        default:
            cout << "输入条件有误,请重新输入:";
            err = true;
        }
        z++;
        if (CopyFlight == NULL)
        {
            cout << "未查询到符合条件的航班信息" << endl;
            return;
        }
        if (err)
        {
            cout << "             输入有误,退出查询" << endl;
            return;
        }
        if (select != '0')
        {
            cout << "如果还要增加新的条件,请输入对应数字,条件输入完毕请按0 (请输入): ";
        }
        else
        {
            break;
        }
    } while (cin >> select);
    if (CopyFlight == NULL)
    {
        cout << "未查询到符合条件的航班信息" << endl;
        return;
    }
    // if (select != 0 && select != 1 && select != 2 && select != 3 && select != 4 && select != 5 && select != 6)
    //     return;
    if (z == 1 && select == 0)
    {
        cout << "退出成功" << endl;
        return;
    }
    cout << endl
         << "航班号    起点      终点      航班日期           起飞时间       到达时间         机型           票价" << endl
         << endl;
    for (int i = 0; i < size; i++)
    {
        ShowOne(CopyFlight[i]);
    }
}

void All::DeleteFlight() //删除航班
{
    if (IsEmpty())
    {
        cout << "没有数据存在,无法进行删除" << endl;
        return;
    }
    string para;
    cout << "输入你要删除的航班号:";
    cin >> para;
    int index = -1;
    for (int i = 0; i < num; i++)
    {
        if (flight[i].flight_num == para)
        {
            index = i;
            break;
        }
    }
    if (index == -1)
    {
        cout << "查无此航班,请确认是否输入正确" << endl;
        return;
    }

    for (int i = index; i < num - 1; i++)
    {
        flight[index] = flight[index + 1];
    }
    num--;

    ofstream outfile;
    outfile.open("flight_input.txt");
    for (int i = 0; i < num - 1; i++)
    {
        outfile << flight[i].flight_num << " " << flight[i].strat_point << " " << flight[i].end_point << " " << flight[i].flight_date << " " << flight[i].fly_time << " " << flight[i].arrive_time << " " << flight[i].air_modle << " " << flight[i].ticket_price << "\n";
    }
    outfile << flight[num - 1].flight_num << " " << flight[num - 1].strat_point << " " << flight[num - 1].end_point << " " << flight[num - 1].flight_date << " " << flight[num - 1].fly_time << " " << flight[num - 1].arrive_time << " " << flight[num - 1].air_modle << " " << flight[num - 1].ticket_price;

    outfile.close();
    cout << "删除成功!" << endl;
}

Flight *StartPointSearch(Flight *CopyFlight, int &size, string condition) //起点查询模块
{
    int *index_array = new int[size];
    // memmove(tempFlight,CopyFlight,sizeof(Flight)*num);
    int z = 0;
    for (int i = 0; i < size; i++)
    {
        if (CopyFlight[i].strat_point == condition || CopyFlight[i].strat_point.find(condition) != string::npos)
        {
            index_array[z] = i;
            z++;
        }
    }
    if (z == 0)
    {
        return NULL;
    }
    Flight *tempFlight = new Flight[z];
    for (int i = 0; i < z; i++)
    {
        tempFlight[i] = CopyFlight[index_array[i]];
    }
    size = z;
    delete[] index_array;
    return tempFlight;
}

Flight *EndPointSearch(Flight *CopyFlight, int &size, string condition) //终点查询模块
{
    int *index_array = new int[size];
    int z = 0;
    for (int i = 0; i < size; i++)
    {
        if (CopyFlight[i].end_point == condition || CopyFlight[i].end_point.find(condition) != string::npos)
        {
            index_array[z] = i;
            z++;
        }
    }
    if (z == 0)
    {
        return NULL;
    }
    Flight *tempFlight = new Flight[z];
    for (int i = 0; i < z; i++)
    {
        tempFlight[i] = CopyFlight[index_array[i]];
    }
    size = z;
    delete[] index_array;
    return tempFlight;
}

Flight *DateSearch(Flight *CopyFlight, int &size, string condition) //日期查询模块
{
    int *index_array = new int[size];
    int z = 0;
    for (int i = 0; i < size; i++)
    {
        if (CopyFlight[i].flight_date.find(condition) != string::npos)
        {
            index_array[z] = i;
            z++;
        }
    }
    if (z == 0)
    {
        return NULL;
    }
    Flight *tempFlight = new Flight[z];
    for (int i = 0; i < z; i++)
    {
        tempFlight[i] = CopyFlight[index_array[i]];
    }
    size = z;
    delete[] index_array;
    return tempFlight;
}

Flight *FlyTimeSearch(Flight *CopyFlight, int &size, string condition) //起飞时间查询模块
{
    int *index_array = new int[size];
    condition = condition.substr(0, 2) + condition.substr(3, 2);
    int top = stoi(condition);
    int z = 0;
    for (int i = 0; i < size; i++)
    {
        string temp = CopyFlight[i].fly_time.substr(0, 2) + CopyFlight[i].fly_time.substr(3, 2);
        int current_time = stoi(temp);
        if (current_time <= top)
        {
            index_array[z] = i;
            z++;
        }
    }
    if (z == 0)
    {
        return NULL;
    }
    Flight *tempFlight = new Flight[z];
    for (int i = 0; i < z; i++)
    {
        tempFlight[i] = CopyFlight[index_array[i]];
    }
    size = z;
    delete[] index_array;
    return tempFlight;
}

Flight *FlyTimeSearchTwo(Flight *CopyFlight, int &size, string condition) //起飞时间查询模块
{
    int *index_array = new int[size];
    int top = stoi(condition);
    int z = 0;
    for (int i = 0; i < size; i++)
    {
        string temp = CopyFlight[i].fly_time.substr(0, 2);
        int current_time = stoi(temp);
        if (current_time <= top)
        {
            index_array[z] = i;
            z++;
        }
    }
    if (z == 0)
    {
        return NULL;
    }
    Flight *tempFlight = new Flight[z];
    for (int i = 0; i < z; i++)
    {
        tempFlight[i] = CopyFlight[index_array[i]];
    }
    size = z;
    delete[] index_array;
    return tempFlight;
}

Flight *ArriveTimeSearch(Flight *CopyFlight, int &size, string condition) //到达时间查询模块
{
    int *index_array = new int[size];
    condition = condition.substr(0, 2) + condition.substr(3, 2);
    int top = stoi(condition);
    int z = 0;
    for (int i = 0; i < size; i++)
    {
        string temp = CopyFlight[i].arrive_time.substr(0, 2) + CopyFlight[i].arrive_time.substr(3, 2);
        int current_time = stoi(temp);
        if (current_time <= top)
        {
            index_array[z] = i;
            z++;
        }
    }
    if (z == 0)
    {
        return NULL;
    }
    Flight *tempFlight = new Flight[z];
    for (int i = 0; i < z; i++)
    {
        tempFlight[i] = CopyFlight[index_array[i]];
    }
    size = z;
    delete[] index_array;
    return tempFlight;
}

Flight *ArriveTimeSearchTwo(Flight *CopyFlight, int &size, string condition) //到达时间查询模块
{
    int *index_array = new int[size];
    int top = stoi(condition);
    int z = 0;
    for (int i = 0; i < size; i++)
    {
        string temp = CopyFlight[i].arrive_time.substr(0, 2);
        int current_time = stoi(temp);
        if (current_time <= top)
        {
            index_array[z] = i;
            z++;
        }
    }
    if (z == 0)
    {
        return NULL;
    }
    Flight *tempFlight = new Flight[z];
    for (int i = 0; i < z; i++)
    {
        tempFlight[i] = CopyFlight[index_array[i]];
    }
    size = z;
    delete[] index_array;
    return tempFlight;
}

Flight *PriceSearch(Flight *CopyFlight, int &size, int condition) //价格查询模块
{
    int *index_array = new int[size];
    int z = 0;
    for (int i = 0; i < size; i++)
    {
        if (CopyFlight[i].ticket_price <= condition)
        {
            index_array[z] = i;
            z++;
        }
    }
    if (z == 0)
    {
        return NULL;
    }
    Flight *tempFlight = new Flight[z];
    for (int i = 0; i < z; i++)
    {
        tempFlight[i] = CopyFlight[index_array[i]];
    }
    size = z;
    delete[] index_array;
    return tempFlight;
}

bool TestLegality(string test) //检验时间是否输入正确
{
    if (test.length() == 5)
    {
        string temp = test.substr(0, 2) + test.substr(3, 2);
        if (!isNum(temp))
        {
            cout << "输入有误,请检查您的输入是否正确" << endl;
            return false;
        }
        int trans = stoi(temp);
        if (trans > 2359)
        {
            cout << "输入的时间不正确,请检查您的输入是否正确" << endl;
            return false;
        }
        trans = trans % 100;
        if (trans > 59)
        {
            cout << "输入的时间不正确,请检查您的输入是否正确" << endl;
            return false;
        }
        cout << "格式输入有误,请检查您的输入是否正确" << endl;
        return false;
    }
    else if (test.length() == 2)
    {
        if (!isNum(test))
        {
            cout << "输入有误,请检查您的输入是否正确" << endl;
            return false;
        }
        int trans = stoi(test);
        if (trans > 23)
        {
            cout << "输入的时间不正确,请检查您的输入是否正确" << endl;
            return false;
        }
    }
    return true;
}

bool TestInputDate(string date)
{
    if (date.length() == 0 || date.length() / 2 == 0)
    {
        cout << "日期输入有误,请检查您的输入是否正确" << endl;
        return false;
    }
    // bool judge = true;
    // string temp_num = test.substr(3, 4);
    string single;
    string dou;
    for (int i = 0; i < date.length(); i = i + 2)
    {
        single = date.substr(i, 1);
        if (!TestDate(single))
            return false;
    }
    for (int i = 1; i < date.length(); i = i + 2)
    {
        single = date.substr(i, 1);
        if (single != ",")
            return false;
    }
    return true;
}

bool TestDate(string date) //检验日期是否输入正确
{
    if (date != "1" && date != "2" && date != "3" && date != "4" && date != "5" && date != "6" && date != "7")
    {
        cout << "日期输入有误,请检查您的输入是否正确" << endl;
        return false;
    }
    return true;
}

bool isNum(string str) //检验字符串是否为数字函数
{
    stringstream sin(str);
    double d;
    char c;
    if (!(sin >> d))
    {
        return false;
    }
    if (sin >> c)
    {
        return false;
    }
    return true;
}

bool TestFlightNum(string test) //检验航班号是否输入正确模块
{
    if (test.length() != 6)
    {
        cout << "输入有误,请检查您的输入是否正确" << endl;
        return false;
    }
    string temp_num = test.substr(3, 4);
    // string temp_alpha = test.substr(0, 2);

    if (!isNum(temp_num))
    {
        cout << "输入有误,请检查您的输入是否正确" << endl;
        return false;
    }
    return true;
}

bool TestPrice(string test)
{
    if (!isNum(test))
    {
        cout << "输入错误,请检查价格是否输入正确" << endl;
        return false;
    }
    int int_price = stoi(test);
    if (int_price > 0)
    {
        return true;
    }
    cout << "输入错误,请检查价格是否输入正确" << endl;
    return false;
}

void admin_welcome() //前端输出显示模块
{
    cout << "-------------------------------------\n";
    cout << "$         请输入操作项目 :          $\n";
    cout << "$          1:航 班 查 询             $\n";
    cout << "$          2:增 加 航 班             $\n";
    cout << "$          3:删 除 航 班             $\n";
    cout << "$          4:按航班号排序            $\n";
    cout << "$          5:对航班进行二分查找      $\n";
    cout << "$          6:查看所有航班            $\n";
    cout << "$          7:退出                    $\n";
    cout << "-------------------------------------\n";
}
int main()
{
    // string s = "Mu123";
    // transform(s.begin(), s.end(), s.begin(), ::tolower);
    // cout << s << endl;4
    All test;
    char option;
    bool judge = true;
    test.OpenFile();
    do
    {
        admin_welcome();
        if (judge == false)
        {
            cout << "     输入错误,请重新输入" << endl
                 << endl;
        }
        judge = true;

        cout << "请输入您要进行的操作:";
        cin >> option;
        switch (option)
        {
        case '1':
            test.MultiConditionQuery();
            break;
        case '2':
            test.InsertFlight();
            break;
        case '3':
            test.DeleteFlight();
            break;
        case '4':
            test.CardinalSort();
            break;
        case '5':
            test.BinarySearch();
            break;
        case '6':
            test.ShowAll();
        case '7':
            break;
        default:
            system("cls");
            judge = false;
            continue;
            break;
        }
        if (option == '7')
        {
            break;
        }
        cout << endl
             << endl
             << "按回车继续........" << endl;
        getchar();
        getchar();
        system("cls");
    } while (option != '7');
    cout << "感谢您的使用!" << endl;
}

你可能感兴趣的:(c++)