C++—航班查询系统

/********************************************
设计并实现一个航班信息查询和检索系统。
要求:对飞机航班信息进行排序和查找,可按照航班号、起点站、到达站、起飞时间和到达时间等信息进行查询。
航班信息表的样式如下:
            航班号	起点站	终点站     班期	      起飞时间	  到达时间    机型	票价
            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为航班编号。
**********************************************/
#include <iostream>
#include <malloc.h>
#include<ctime>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef struct        //定义航班信息结构体类型
{
    char  number[10];      //航班号
    char staddress[10];    //起始站
    char arraddress[10];   //终点站
    char DATE[10];         //班期
    char stime[10];        //起飞时间
    char atime[10];        //到达时间
    char TYPE[4];          //机型
    int value;             //票价
} Data_type;

typedef struct node  //定义存储航班信息结构体链表
{
    Data_type *info;
    struct node *next;
} Node_list;

Node_list *L;  //定义存储链表
Data_type *E;  //定义航班信息结构体
/*
用于存储链表的初始化
*/
bool init_N(Node_list **L)
{
    (*L)=(Node_list *)malloc(sizeof(Node_list));
    if( (*L)!=NULL )
    {
        (*L)->next=NULL;
        return true;
    }
    else
    {
        cout<<"malloc failed!\n";
        return false;
    }
}

/*
航班信息结构体的初始化
*/
bool init_D(Data_type **E)
{
    (*E)=(Data_type *)malloc(sizeof(Data_type));
    if((*E)!=NULL)
        return true;
    else
    {
        cout<<"malloc failed!\n";
        return false;
    }
}

/*
插入链表存储
*/
bool save_insert(Node_list *L,Data_type *E)
{
    Node_list *new_node;  //定义一个链表节点
    init_N(&new_node);    //初始化链表
    new_node->info=E;     //给节点元素赋值
    while(L->next != NULL)
        L=L->next;
    L->next=new_node;     //将其插入到链表中
    return true;
}

/*
根据航班号排序
*/
void Bubsort_number(Node_list *L)
{
    Node_list *p,*q;
    Data_type *tmp;
    for(p=L->next; p != NULL; p=p->next)
        for(q=p->next; q != NULL; q=q->next )
        {
            if(strcmp(p->info->number,q->info->number) > 0)
            {
                tmp=p->info;
                p->info=q->info;
                q->info=tmp;
            }
        }
}

/*
根据起飞时间排序(用于按航班日期查询显示函数)
*/
void Bubsort_statime(Node_list *L)
{
    Node_list *p,*q;
    Data_type *tmp;
    for(p=L->next; p != NULL; p=p->next)
        for(q=p->next; q != NULL; q=q->next )
        {
            if(strcmp(p->info->stime,q->info->stime) > 0)
            {
                tmp=p->info;
                p->info=q->info;
                q->info=tmp;
            }
        }
}

void show_one(Node_list *L)  //封转打印函数,固定打印格式
{
    printf("%-9s%-10s-->  %-11s%-12s%-6s%-9s%-9s%-8d\n",  L->info->number,L->info->staddress,L->info->arraddress,L->info->DATE,L->info->TYPE,L->info->stime,L->info->atime,L->info->value);
}

/*
显示当前链表的所有信息
*/
void show_info(Node_list *L)
{
    cout<<"航班号    起点站        终点站       班期    机型   起飞时间  到达时间  票价\n";
    while(L->next != NULL)
    {
        L=L->next;
        show_one(L);
    }
}

/*
根据航班号进行查找,并显示:
从链表第一个节点进行查找,如果表中节点的number等于用户输入,则输出此航班信息;否则,继续查找下一个节点,直到链表结束。
*/
void inquire_by_number(Node_list *L, char num[] )
{
    L=L->next;
    int flag=0;
    while(L != NULL)
    {
        if(strcmp(num,L->info->number) == 0)
        {
            show_one(L);
            flag=1;
            break;
        }
        L=L->next;
    }
    if( flag == 0)
        cout<<"对不起!没有此航班!\n";
}

/*
根据起飞地点查找,并显示:
从链表第一个节点进行查找,如果表中节点的staddress等于用户输入,则输出此航班信息;否则,继续查找下一个节点,直到链表结束。
*/
void inquire_by_staddress(Node_list *L,char s[])
{
    int flag=0;
    L=L->next;
    while(L != NULL)
    {
        if(strcmp(s,L->info->staddress) == 0)
        {
            show_one(L);
            flag=1;
        }
        L=L->next;
    }
    if(flag == 0)
        cout<<"对不起!没有此航班!\n";
}

/*
根据降落地点查找,并显示:
从链表第一个节点进行查找,如果表中节点的arraddress等于用户输入,则输出此航班信息;否则,继续查找下一个节点,直到链表结束。
*/
void inquire_by_araddress(Node_list *L,char a[])
{
    int flag=0;
    L=L->next;
    while(L != NULL)
    {
        if(strcmp(a,L->info->arraddress) ==0)
        {
            show_one(L);
            flag=1;
        }
        L=L->next;
    }
    if( flag == 0 )
        cout<<"对不起!没有此航班!\n";
}

/*
根据航班日期查找,并显示:
从链表第一个节点进行查找,如果表中节点的DATE等于用户输入,则输出此航班信息;否则,继续查找下一个节点,直到链表结束。
*/
void inquire_by_data(Node_list *L,char d[])
{
    Node_list *N;
    init_N(&N);
    L=L->next;
    int flag = 0;
    while(L != NULL)
    {
        if(strcmp(d,L->info->DATE) == 0)
        {
            show_one(L);
            flag=1;
        }
        L=L->next;
    }
    if(flag == 0)
        cout<<"对不起!没有此航班!\n";
}

/*
根据起飞时间查找,并显示:
从链表第一个节点进行查找,如果表中节点的stime等于用户输入,则输出此航班信息;否则,继续查找下一个节点,直到链表结束。
*/
void inquire_by_stime(Node_list *L,char sd[])
{
    Node_list *N;
    init_N(&N);
    L=L->next;
    int flag = 0;
    while(L != NULL)
    {
        if(strcmp(sd,L->info->stime) == 0)
        {
            show_one(L);
            flag=1;
        }
        L=L->next;
    }
    if(flag == 0)
        cout<<"对不起!没有此航班!\n";
}

/*
根据到达时间查找,并显示:
从链表第一个节点进行查找,如果表中节点的atime等于用户输入,则输出此航班信息;否则,继续查找下一个节点,直到链表结束。
*/
void inquire_by_atime(Node_list *L,char ad[])
{
    Node_list *N;
    init_N(&N);
    L=L->next;
    int flag = 0;
    while(L != NULL)
    {
        if(strcmp(ad,L->info->atime) == 0)
        {
            save_insert(N,L->info);
            flag=1;
        }
        L=L->next;
    }
    if(flag == 0)
        cout<<"对不起!没有此航班!\n";
}

/*
删除所选航班号
*/
void delete_by(Node_list *L,char d[])
{
    Node_list *p,*q;
    p=q=L;
    while(p!=NULL)
    {
        if(strcmp(d,p->info->number)==0)
        {
            if(L==p)
                L=p->next;
            else
                q->next=p->next;
            free(p);
            break;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
    if(p==NULL)
        printf("\n\t  查无此航班    \n");
}

void inseart_by(Node_list *L)
{
    E=(Data_type *)malloc(sizeof(Data_type));
    cout<<"按照航班号、起点站、终点站、班期、起飞时间、到达时间、机型、票价,输入航班信息"<<endl;
    cin>>E->number>>E->arraddress>>E->staddress>>E->DATE>>E->stime>>E->atime>>E->TYPE>>E->value;
    save_insert(L,E);
}

/*
文件导入链表
*/
void open_file()
{
    FILE *fp;//文件指针
    fp=fopen("flight_input.txt","r");
    E=(Data_type *)malloc(sizeof(Data_type));
    while(8 ==fscanf(fp,"%s %s %s %s %s %s %s %d",&E->number,E->staddress,E->arraddress,E->DATE,E->TYPE,E->stime,E->atime,&E->value))//读取文件内容,对应结构体各元素
    {
        save_insert(L,E);//将其放入链表存储
        E=(Data_type *)malloc(sizeof(Data_type));//开辟结构体指针
    }
}

/*
欢迎界面
*/
void user_welcome()
{
    cout<<"*************************************\n";
    cout<<"$      航班信息查询和检索系统       $\n";
    cout<<"-------------------------------------\n";
    cout<<"$         请选择查询方式 :          $\n";
    cout<<"$          A:所 有 航 班            $\n";
    cout<<"$          B: 航  班  号            $\n";
    cout<<"$          C: 起  点  站            $\n";
    cout<<"$          D: 终  点  站            $\n";
    cout<<"$          E:  班   期              $\n";
    cout<<"$          F:起 飞 时 间            $\n";
    cout<<"$          G:到 达 时 间            $\n";
    cout<<"$          H:退 出 系 统            $\n";
    cout<<"-------------------------------------\n";
}


/*
业务员登录系统界面
*/
void admin_welcome()
{
    cout<<"-------------------------------------\n";
    cout<<"$         请输入操作项目 :         $\n";
    cout<<"$          1:插 入 航 班            $\n";
    cout<<"$          2:删 除 航 班            $\n";
    cout<<"$        3:按航班号排序             $\n";
    cout<<"$        4:按起飞时间排序           $\n";
    cout<<"$         5:管理员退出              $\n";
    user_welcome();
}
int define;
/*
选择管理员或者用户登录
*/
void admin_or_user()
{
    int ch;
    cout<<"-------------------------------------\n";
    cout<<"$         请选择登录方式:          $\n";
    cout<<"$          1.业务员登录             $\n";
    cout<<"$          2. 用户登录              $\n";
    cout<<"-------------------------------------\n";
    cout<<"请输入您的选择:";
    cin>>ch;
    switch (ch)
    {
    case 1:
    {
        admin_welcome();
        define=1;
        break;
    }
    case 2:
    {
        define=0;
        user_welcome();
        break;
    }
    default:
        cout<<"没有此选择!"<<endl;
    }
}

void s_welcome()
{
    cout<<"\n\n\n\t\t\t即将进入航班信息查询系统!";                     //准备开始
    double start;
    for (int i = 3; i >= 0; i--)
    {
        //clock()是C/C++中的计时函数,以毫秒为单位,除以CLOCKS_PER_SEC转化为秒
        start = (double)clock() / CLOCKS_PER_SEC;                 //得到程序目前为止运行的时间
        while ((double)clock() / CLOCKS_PER_SEC - start <= 1);    //现在已运行时间-开始时的时间即时间差,表示经过1秒之后
        if (i > 0)
        {
            system("cls");                                        //系统中的函数,表示清屏
            cout<<"\n\n\n\t\t\t\t进入倒计时:"<<i<<endl;            //倒计时
        }
        else
        {
            system("cls");                                        //系统中的函数,表示清屏
            admin_or_user();                                            //进入欢迎界面
        }

    }
}

/*
选择函数
*/
void hello_choose()
{
    char choice;   //读取用户选择
    char number[10];
    char num[10];
    char s_addr[10];
    char a_addr[10];
    char  date[10];
    char s_time[10];
    char a_time[10];
    cout<<"请输入您的选择: ";
    while(cin>>choice)
    {
        if('A' == choice)
        {
            show_info(L);//浏览所有航班信息
            cout<<"请输入您的选择: ";
            continue;
        }
        if('B' == choice)
        {
            cout<<"请输入航班号:";
            cin>>num;
            inquire_by_number(L,num);//根据航班号查找
            cout<<"请输入您的选择: ";
            continue;
        }
        if('C' == choice)
        {
            cout<<"请输入起飞地点:";
            cin>>s_addr;
            inquire_by_staddress(L,s_addr);//根据起飞地点查找
            cout<<"请输入您的选择: ";
            continue;
        }
        if('D' == choice)
        {
            cout<<"请输入到达地点:";
            cin>>a_addr;
            inquire_by_araddress(L,a_addr);//根据降落地点查找并显示
            cout<<"请输入您的选择: ";
            continue;
        }
        if('E' == choice)
        {
            cout<<"请输入航班日期:";
            cin>>date;
            inquire_by_data(L,date);//根据航班日期浏览,并根据起飞时间排序
            cout<<"请输入您的选择: ";
            continue;
        }
        if('F' == choice)
        {
            cout<<"请输入起飞时间:";
            cin>>date;
            inquire_by_stime(L,date);//根据航班日期浏览,并根据起飞时间排序
            cout<<"请输入您的选择: ";
            continue;
        }
        if('G' == choice)
        {
            cout<<"请输入到达时间:";
            cin>>date;
            inquire_by_atime(L,date);//根据航班日期浏览,并根据起飞时间排序
            cout<<"请输入您的选择: ";
            continue;
        }
        if('H' == choice)
        {
            cout<<"再见!!\n";
            exit(1);//退出系统
        }
        if('1' == choice)
        {
            inseart_by(L);
            cout<<"请输入您的选择: ";
            continue;
        }
        if('2' == choice)
        {
            cout<<"输入所要删除的航班号:";
            cin>>number;
            delete_by(L,number);
            cout<<"请输入您的选择: ";
            continue;
        }
        if('3' == choice)
        {
            cout<<"输出按航班号排序后的航班:"<<endl;
            Bubsort_number(L);
            show_info(L);//浏览所有航班信息
            cout<<"请输入您的选择: ";
            continue;
        }
        if('4' == choice)
        {
            cout<<"输出按起飞时间排序后的航班:"<<endl;
            Bubsort_statime(L);
            show_info(L);//浏览所有航班信息
            cout<<"请输入您的选择: ";
            continue;
        }
        if('5'==choice)
        {
            admin_or_user();
            cout<<"请输入您的选择: ";
            continue;
        }
        else
        {
            //输入错误提示并返回 欢迎界面
            cout<<"没有此选择.\n";
            if(define)
                admin_welcome();
            else
                user_welcome();
            cout<<"请输入您的选择: \n";
        }
    }
}

/*
main函数
*/
int main()
{
    init_N(&L);    //初始化链表
    open_file();   //打开文件
    Bubsort_number(L);//航班号排序
    s_welcome();     //进入欢迎界面
    hello_choose();      //进入选择界面
    return 0;
}

资源:

运行结果:




1.问题描述 该设计要求对飞机航班信息进行排序和查找。可按航班的航班号、起点站、终点站、起飞时间以及到达时间等信息进行查询。 2.扩展功能: ①能够在起点站与终点站相同的航班信息中筛选出票价最低及飞行时间最短的航班,并显示; ②能够不断添加新的航班信息; ③能够检验输入时间的合法性。 3.任务要求 对于本设计,可采用基数排序法对一组具有结构特点的飞机航班号进行排序,利用二分查找法对排好序的航班记录按航班号实现快速查找,按其他次关键字的查找可采用最简单的顺序查找方法进行,因此他们用得较少。 每个航班记录包括八项,分别是:航班号、起点站、终点站、班期、起飞时间、到达时间、飞机型号以及票价等,假设航班信息表(8条记录) 航班号 起点站 终点站 班期 起飞时间 到达时间 机型 票价 CA1544 合肥 北京 1.2.4.5 1055 1240 733 960 MU5341 上海 广州 每日 1420 1615 M90 1280 CZ3869 重庆 深圳 2.4.6 0855 1035 733 1010 MU3682 桂林 南京 2.3.4.6.7 2050 2215 M90 1380 HU1836 上海 北京 每日 0940 1120 738 1250 CZ3528 成都 厦门 1.3.4.5.7 1510 1650 CRJ 1060 MU4594 昆明 西安 1.3.5.6 1015 1140 328 1160 SC7425 青岛 海口 1.3.6 1920 2120 DH4 1630 其中航班号一项的格式为: K0 K1 K2 K3 K4 K5 C Z 3 8 6 9 其中K0和K1的输入值是航空公司的别称,用两个大写字母标示,后4位为航班号,这种航班号关键字可分成两段,即字母和数字。其余七项输入内容因为不涉及本设计的核心,因此除了票价为数值型外,均定义为字符串即可。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值