• 实习五 航空订票系统


    一、需求分析

    1.问题描述:

     试设计一个航空订票系统,基本要求如下:

    每条航班所涉及的信息有:航班号,航班机型,起飞机场,降落机场,日期(星期几),起飞时间,降落时间,飞行时长,各等级的价格、乘员定额、余票量,订定票的客户名单(包括姓名,订票量,舱位等级(头等舱、公务舱、经济舱))以及等候替补的客户名单(包括姓名、所需数量)。采用链式存储结构。

    2.基本要求:                        

    (1)航班信息管理。

    (2)查询航线,按以下几种方式查询:

    ① 按航班号查询;

    ② 按起点站查询;

    ③ 按终点站查询;

    ④ 按日期查询;

    每种查询方式中,查询后输出如下信息:航班号,航班机型,起飞机场,降落机场,日期(星期几),起飞时间,降落时间,飞行时长,价格,余票量。

    (3)承办订票业务:根据客户提出的要求(航班号,订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,并输出座位号;若已满员或余票少于订票额,则需重新询问客户要求。若需要,可登记排队候补。

    (4)承办退票业务:根据客户提出的情况(日期,航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。

    https://wenku.baidu.com/view/c91fa69f6bdc5022aaea998fcc22bcd127ff4245
    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #define MaxStackSize 100      //票数
    typedef int Datetype;
    typedef struct pnode        //链式等票队列结点
    {
        char name[20];
        int np;
        struct pnode *next;
    }LPNode;
    typedef struct              //链式队列结点指针
    {
        LPNode *front;
        LPNode *rear;
        int count;
    }LPQueue;
    
    typedef struct
    {
        char name[20];
        int number;
        int biaoji;
    }Ticketmessage;//机票信息结构体
    typedef struct
    {
        Datetype fnumber;  //航班号
        int plane;   //航班机型
        char sairport[20];//起飞机场
        char eairport[20];//降落机场
        int day;//日期(星期几)
        int stime;//起飞时间
        int etime;//降落时间
        int ltime;//飞行时间
        int jpshu;//机票数
        int tdjps;//头等舱机票数
        int swjps;//商务舱机票数
        int jjjps;//经济舱机票数
        int tdjia;
        int swjia;
        int jjjia;
    
        Ticketmessage ticket[MaxStackSize];//机票数组
        LPQueue Q;
    }Airmessage;                //航班信息结构体
    typedef struct qnode        //链式航班队列结点
    {
        Airmessage Air;
        struct qnode *next;
    }LQNode;
    
    
    int menu();//函数声明
    int menu1();
    int menu2();
    
    
    
    void ListInitiate(LQNode **head)//航班链表的初始化
    {
        *head=(LQNode *)malloc(sizeof(LQNode));
        (*head)->next=NULL;
    }
    void JListInitiate(LQNode *q)//机票座位及标记初始化
    {
        int i;
        for(i=0;i<q->Air.jpshu;i++)
        {
            q->Air.ticket[i].number=i+1;//座位编号
            q->Air.ticket[i].biaoji=0; //表示机票该座位未被预订
        }
        q->Air.Q.rear=NULL;           //初始化队列
        q->Air.Q.front=NULL;
        q->Air.Q.count=0;
    }
    
    
    int message(LQNode *head)//存储航班信息的线性表
    {
        int i,n;
        LQNode *q,*p;
        p=head;
        printf("\t\t输入航班数:");
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            printf("\t\t输入的第%d航班信息:",i+1);
            q=(LQNode *)malloc(sizeof(LQNode));
            printf("\n\t\t1.航班号,2.航班机型,3.起飞机场,4.降落机场,5.日期(星期几):\n\t\t");
            scanf("%d %d %s %s %d",&q->Air.fnumber,&q->Air.plane,q->Air.sairport,q->Air.eairport,&q->Air.day);//MaxStackSize
            printf("\t\t6起飞时间,7降落时间,8头等舱机票数,9商务舱机票数,10经济舱机票数\n\t\t");
            scanf("%d %d %d %d %d",&q->Air.stime,&q->Air.etime,&q->Air.tdjps,&q->Air.swjps,&q->Air.jjjps);
            printf("\t\t11头等舱价格,12商务舱价格,13经济舱价格\n\t\t");
            scanf("%d %d %d",&q->Air.tdjia,&q->Air.swjia,&q->Air.jjjia);
    
            q->Air.jpshu=q->Air.tdjps+q->Air.swjps+q->Air.jjjps;
            q->Air.ltime=q->Air.etime-q->Air.stime;
            p->next=q;
            p=q;
            p->next=NULL;
            JListInitiate(q);
            //HPrintf(p);
        }
        menu1(head);
        return 0;
    }
    int Dlmessage(LQNode *head)//删除航班信息
    {
        int k=1;
        LQNode *p,*s;
        int xnumber;
        printf("\n\t\t请输入航班号:");
        scanf("%d",&xnumber);
        p=head;
        while(p->next!=NULL&&p->next->next!=NULL)
        {
            if(xnumber==p->next->Air.fnumber)
            {
                s=p->next;
                p->next=p->next->next;
                free(s);
                k=0;
            }
            p=p->next;
        }
        if(p->next!=NULL&&xnumber==p->next->Air.fnumber)
        {
            s=p->next;
            p->next=NULL;
            free(s);
            k=0;
        }
        if(k)printf("\t\t无此航班!请重试!!\n");
        menu1(head);
        return 0;
    }
    int Ismessage(LQNode *head)//链表后插入航班信息
    {
        LQNode *p,*q;
        p=head;
        q=(LQNode *)malloc(sizeof(LQNode));
        printf("\n\t\t请依次输入下列航班信息");
        printf("\n\t\t1.航班号,2.航班机型,3.起飞机场,4.降落机场,5.日期(星期几):");
        scanf("%d %d %s %s %d",&q->Air.fnumber,&q->Air.plane,q->Air.sairport,q->Air.eairport,&q->Air.day);//MaxStackSize
        printf("\t\t6.起飞时间,7.降落时间,8头等舱机票数,9商务舱机票数,10经济舱机票数:");
        scanf("%d %d %d %d %d",&q->Air.stime,&q->Air.etime,&q->Air.tdjps,&q->Air.swjps,&q->Air.jjjps);
    
        printf("\t\t11头等舱价格,12商务舱价格,13经济舱价格\n\t\t");
        scanf("%d %d %d",&q->Air.tdjia,&q->Air.swjia,&q->Air.jjjia);
    
        q->Air.jpshu=q->Air.tdjps+q->Air.swjps+q->Air.jjjps;
        q->Air.ltime=q->Air.etime-q->Air.stime;
        q->next=NULL;
        while(p->next!=NULL)p=p->next;
        p->next=q;
        JListInitiate(q);//机票座位及标记初始化函数
        menu1(head);
        return 0;
    }
    int Chmessage(LQNode *head)//链表中修改航班信息
    {
        int xnumber;
        int k;
        //int x;
        //char ax[20];
        LQNode *p,*q;
        p=head;
        printf("\t\t请输入要修改信息的航班号:");
        scanf("%d",&xnumber);
    
            while(p->next!=NULL)
        {
            if(p->next->Air.fnumber==xnumber)
            {
                HPrintf(p->next);
                break;
            }
            else p=p->next;
        }
        printf("\t\t请输入要修改信息前的序号:");
        scanf("%d",&k);
        switch(k)
        {
            case 1:{printf("\t\t请输入修改后的航班号:");scanf("%d",&p->next->Air.fnumber);break;}
            case 2:{printf("\t\t请输入修改后的航班机型:");scanf("%d",&p->next->Air.plane);break;}
            case 3:{printf("\t\t请输入修改后的起飞机场:");scanf("%s",p->next->Air.sairport);break;}
            case 4:{printf("\t\t请输入修改后的降落机场:");scanf("%s",p->next->Air.eairport);break;}
            case 5:{printf("\t\t请输入修改后的日期(星期):");scanf("%d",&p->next->Air.day);break;}
            case 6:{printf("\t\t请输入修改后的起飞时间:");scanf("%d",&p->next->Air.stime);break;}
            case 7:{printf("\t\t请输入修改后的降落时间:");scanf("%d",&p->next->Air.etime);break;}
            case 8:{printf("\t\t请输入修改后的头等舱机票数:");scanf("%d",&p->next->Air.tdjps);break;}
            case 9:{printf("\t\t请输入修改后的商务舱机票数:");scanf("%d",&p->next->Air.swjps);break;}
            case 10:{printf("\t\t请输入修改后的经济舱机票数:");scanf("%d",&p->next->Air.jjjps);break;}
        }
        if(k==6||k==7)p->next->Air.ltime=p->next->Air.etime-p->next->Air.stime;
        if(k==8||k==9||k==10)p->next->Air.jpshu=p->next->Air.tdjps+p->next->Air.swjps+p->next->Air.jjjps;
        menu1(head);
        return 0;
    }
    int Semessage(LQNode *head)//航班查询
    {
        LQNode *p;
        p=head;
        while(p->next!=NULL)
        {
            HPrintf(p->next);
            p=p->next;
        }
        menu1(head);
        return 0;
    }
    int Qumessage(LQNode *head)
    {
        LPNode *q;
        LQNode *p;
        p=head;
        int xnumber;
        printf("\t\t请输入航班号查询:");
        scanf("%d",&xnumber);
        while(p->next!=NULL&&p->next->Air.fnumber!=xnumber)p=p->next;
        if(p->next->Air.Q.front!=NULL)
        printf("\t\t排队等票人姓名及票数:");
        else printf("\t\t无排队等票的人!!!");
        q=p->next->Air.Q.front;
        while(q!=NULL)
        {
            printf("%s: %d ",q->name,q->np);//
            q=q->next;
        }
        menu3(head);
        return 0;
    }
    int Cxmessage(LQNode *head)
    {
        int i=0;
        int xnumber;
        LQNode *p;
        p=head;
        printf("\t\t请输入航班号查询:");
        scanf("%d",&xnumber);
        while(p->next!=NULL&&p->next->Air.fnumber!=xnumber)p=p->next;
        printf("\t\t订票人姓名及座位号如下:");
        while(i<p->next->Air.jpshu)
        {
            if(p->next->Air.ticket[i].biaoji==1)
            printf("%s:%d  ",p->next->Air.ticket[i].name,i+1);
            i++;
        }
        //printf("\n");
        menu3(head);
        return 0;
    }
    int QueueAppend(LQNode *p,char xname[],int x) //入队列等票函数
     {
         // printf("\n\n%s",name);
        //LQNode *p;航班
         LPNode *d;  // printf("\n\n%s",xname);//机票
        d=(LPNode *)malloc(sizeof(LPNode));
        //printf("\n\n%s",name);
        //strncpy(d->dticket->name,name,sizeof(d->dticket->name));//d->dticket->name[sizeof(d->dticket->name)-1]='\0';printf("\n\n%s",name);//*******************************************
        //memcpy(d->dticket->name,xname,3);
        strcpy(d->name,xname);
        d->np=x;
                                   //////////////////////////////////////////////////////////////////////////
        //d->dticket->name=name;
                                                   // printf("\n\n%s %s",d->name,xname);
        d->next=NULL;
        p->next->Air.Q.count++;
                                                   // printf("\n\n%d",p->next->Air.Q.count);
       // while(p->next!=NULL&&p->Air.fnumber!=number)p=p->next;
        if(p->next->Air.Q.front==NULL)p->next->Air.Q.front=d;//可行
        if(p->next->Air.Q.rear!=NULL)p->next->Air.Q.rear->next=d;
        p->next->Air.Q.rear=d;
                                                  //printf("\n\n%s",p->next->Air.Q.front->name);
        //free(d);
        return 0;
     }
    int Dingpiao(LQNode *head)
    {
        int i,j,k,m,n;
        int number;
        int xnp;
        //Ticketmessage *tx;
        char xname[20];
        LQNode *p;
        p=head;
        //tx=NULL;
        printf("\t\t请输入航班号:");
        scanf("%d",&number);
        while(p->next!=NULL&&p->next->Air.fnumber!=number)p=p->next;
        if(p->next==NULL)
        {
            printf("\t\t无此航班号!请重新输入\n");
            Dingpiao(head);
        }
        else
        {
            printf("\t\t请输入姓名(拼音)和票数:");
            scanf("%s %d",xname,&xnp);
            i=0;
            j=0;
            while(i<p->next->Air.jpshu)//MaxStackSize
            {
                if(p->next->Air.ticket[i].biaoji==0)j++;//机票是否都售完
            //printf("%d\n",p->Air.ticket[i].biaoji);
                i++;
            }//数余票
    
    
            /*i=0;
            while(i<p->next->Air.jpshu&&p->next->Air.ticket[i].biaoji==1)i++;
                //printf("\n\n%s %s",p->next->Air.ticket[i].name,xname);
                if(strcmp(p->next->Air.ticket[i].name,xname)==0)
                {
                    printf("\n\t\t实名制订票,你已定过票!!!\n");
                    menu(head);
                    return 0;
                       int i,j;
    
                }*/
    
            if(j==0)//MaxStackSize
            {
                printf("\t\t该航班无余票,请耐心等待!\n");
                QueueAppend(p,xname,xnp);//printf("\t该航班无余票,请耐心等待!\n");
            }
            else if(j>=xnp)
            {
                //j-=xnp;
                for(m=0;m<xnp;m++)
                {
                    printf("\t\t你有下列座位号可选:");
                    for(i=0;i<p->next->Air.jpshu;i++)
                    if(p->next->Air.ticket[i].biaoji==0) printf("%d ",i+1);
                    printf("\n\t\t座位号1~%d头等舱 %d~%d公务舱 %d~%d经济舱",p->next->Air.tdjps,p->next->Air.tdjps+1,p->next->Air.swjps+p->next->Air.tdjps,p->next->Air.jpshu-p->next->Air.jjjps+1,p->next->Air.jpshu);
                    printf("\n\t\t你选择座位号:");
                    scanf("%d",&k);
                    strcpy(p->next->Air.ticket[k-1].name,xname);
                    p->next->Air.ticket[k-1].biaoji=1;
                }
    
            /*for(i=0;i<MaxStackSize;i++)    //剔除被选中的座位号
                if(p->Air.ticket[i].number==k)
                {
                    p->Air.ticket[i].biaoji==1;
                    p->Air.ticket[i].name==name;
                }*/
            }
            else
            {
                printf("\t\t余票不足!输入1先定部分机票,输入0则等票!:");
                scanf("%d",&n);
                if(n)BfDingpiao(p,xname,xnp-j);
                else QueueAppend(p,xname,xnp);           //入队列等待
            }
        }
        //printf("\n");
        menu3(head);
        return 0;
    }
     int BfDingpiao(LQNode *p,char a[],int j)//j为等待订票数
     {
        int i=0;
        printf("\t\t你的座位号为:");
        while(i<p->next->Air.jpshu)
        {
            if(p->next->Air.ticket[i].biaoji==0)
            {
                printf("%d ",i+1);
                p->next->Air.ticket[i].biaoji=1;
                strcpy(p->next->Air.ticket[i].name,a);
            }
        i++;
        }
        QueueAppend(p,a,j);
        return 0;
     }
     int QueueGet(LQNode *p)    //出队列订票
     {
        int i,k,j,m,n;
        LPNode *q,*r;
        n=0; //判断是否需要向队列依次询问订票
        j=0;
        p=p->next;
    
         q=p->Air.Q.front;
         for(i=0;i<p->Air.jpshu;i++)//MaxStackSize
        if(p->Air.ticket[i].biaoji==0)j++;
        while(q!=NULL&&n==0)//还有机票
        {
            printf("\t\t姓名(拼音) 预订票数:%s %d\n",q->name,q->np);
            if(j>=q->np)
            {
               // printf("\n\n%d",j);
               // printf("\n\n%d",q->np);
                p->Air.Q.count--;
                for(m=0;m<q->np;m++)
                {
                    printf("\t\t你有下列座位号可选:");
                    for(i=0;i<p->Air.jpshu;i++)
                    if(p->Air.ticket[i].biaoji==0) printf("%d ",i+1);
                    printf("\n\t\t座位号1~%d头等舱 %d~%d公务舱 %d~%d经济舱",p->Air.tdjps,p->Air.tdjps+1,p->Air.swjps+p->Air.tdjps,p->Air.jpshu-p->Air.jjjps+1,p->Air.jpshu);
                    printf("\n\t\t你选择座位号:");
                    scanf("%d",&k);
                    strcpy(p->Air.ticket[k-1].name,q->name);
                    p->Air.ticket[k-1].biaoji=1;
                }
                if(q==p->Air.Q.front)p->Air.Q.front=p->Air.Q.front->next;//出队列第一个结点
                else //出队列
                {
                    r=p->Air.Q.front;
                    while(r->next !=NULL&& strcmp(p->Air.ticket[k-1].name,r->next->name)!=0)r=r->next;
                    r->next=r->next->next;
                }
                if(j==q->np)n=1;//不用再出队列
                else {n=0;j-=q->np;q=q->next;}//还要出队列
               // printf("\n\n%d",j);
            }
            else
            {
                printf("\t\t余票不足!输入1先定部分机票,输入0则等票!:");
                scanf("%d",&n);
                if(n)
                {
                    i=0;
                    printf("\t\t你的座位号为:");
                    while(i<p->Air.jpshu)
                    {
                       if(p->Air.ticket[i].biaoji==0)
                        {
                         printf("%d ",i+1);
                         p->Air.ticket[i].biaoji=1;
                         strcpy(p->Air.ticket[i].name,q->name);
                        }
                        i++;
                    }
                    printf("\n");
                    q->np-=j;
                }
                else q=q->next;      //n==0在队列中等待,并向后询问
            }
            //if(n==1&&)q=q->next;     //还有余票
        }
        return 0;
     }
    
    
    
    
    int Tuipiao(LQNode *head)
    {
        int i,j,n,m;
        j=0;
        int number;
        char name[20];
        LQNode *p;//航班
        p=head;
        printf("\t\t请输入航班号:");
        scanf("%d",&number);
        while(p->next!=NULL&&p->next->Air.fnumber!=number)p=p->next;
        printf("\t\t请输入姓名(拼音):");
        scanf("%s",name);
        for(i=0;i<p->next->Air.jpshu;i++)//MaxStackSize
        if(strcmp(p->next->Air.ticket[i].name,name)==0)j++;
        if(j>1)
        {
            printf("\t\t你订了%d张机票,其座位号分别为:",j);
            for(i=0;i<p->next->Air.jpshu;i++)//MaxStackSize
            if(strcmp(p->next->Air.ticket[i].name,name)==0)
            printf("%d ",i+1);
            printf("\n\t\t请输入退票数:");
            scanf("%d",&n);
            printf("\t\t请输入退票的座位号:");
            for(i=0;i<n;i++)
            {
                scanf("%d",&m);
                p->next->Air.ticket[m-1].biaoji=0;
             }
        }
        else if(j==1)
        {
            printf("\t\t请输入退票的座位号:");
            scanf("%d",&m);
            p->next->Air.ticket[m-1].biaoji=0;
        }
        //printf("\n\n%s %s",p->Air.ticket[i].name,name);
        //printf("%d",strcmp(p->next->Air.ticket[i].name,name));
    
           //printf("%d\n",p->next->Air.Q.count);
        //printf("\n\n%s",p->next->Air.Q.front->name);
    
    
    
        if(p->next->Air.Q.count!=0)QueueGet(p);//调用出队列函数(已确定航班)
    
        menu(head);
        return 0;
    }
    
    int HPrintf(LQNode *p)
    {
        int i,j;
        i=0;
        j=0;
        while(i<p->Air.jpshu)//MaxStackSize
        {
            if(p->Air.ticket[i].biaoji==0)j++;//机票是否都售完
            //printf("%d\n",p->Air.ticket[i].biaoji);
            i++;
        }
        printf("\t\t1.航班号,2.航班机型,3.起飞机场,4.降落机场,5.日期");
        printf("\n\t\t");
        printf("%d ",p->Air.fnumber);
        printf("%d ",p->Air.plane);
        printf("%s ",p->Air.sairport);
        printf("%s ",p->Air.eairport);
        printf("%d\n",p->Air.day);
        printf("\t\t6.起飞时间,7.降落时间,8余票量,飞行时长");
        printf("\n\t\t");
        printf("%d ",p->Air.stime);
        printf("%d ",p->Air.etime);
        printf("%d ",j);
        printf("%d\n",p->Air.ltime);
        printf("\t\t11头等舱价格,12商务舱价格,13经济舱价格");
        printf("\n\t\t");
        printf("%d ",p->Air.tdjia);
        printf("%d ",p->Air.swjia);
        printf("%d\n",p->Air.jjjia);
            //scanf("%d %d %d",&q->Air.tdjia,&q->Air.swjia,&q->Air.jjjia);
    
        //printf("($%d $%d $%d)\n",DJ1,DJ2,DJ3);
    }
    int HbSearch(LQNode *head)//航班
    {
        LQNode *p;
        int xnumber;
    
        printf("\n\t\t请输入航班号:");
        scanf("%d",&xnumber);
        p=head;
        while(p!=NULL)
        {
            if(xnumber==p->Air.fnumber)HPrintf(p);
            p=p->next;
        }
        menu2(head);
        return 0;
    }
    
    int SaSearch(LQNode *head)//起点
    {
        LQNode *p;
        char xsa[20];
        p=head;
        printf("\t\t请输入起点站:");
        scanf("%s",xsa);
        while(p!=NULL)
        {
            if(strcmp(xsa,p->Air.sairport)==0)HPrintf(p);
            p=p->next;
        }
        menu2(head);
        return 0;
    }
    int EaSearch(LQNode *head)//终点
    {
        LQNode *p;
        char xea[20];
        p=head;
        printf("\t\t:请输入终点站");
        scanf("%s",xea);
        while(p!=NULL)
        {
            if(strcmp(xea,p->Air.eairport)==0)HPrintf(p);
            p=p->next;
        }
        menu2(head);
        return 0;
    }
    int TmSearch(LQNode *head)//日期
    {
        LQNode *p;
        int xday;
        p=head;
        printf("\t\t请输入日期(星期):");
        scanf("%d",xday);
        while(p!=NULL)
        {
            if(p->Air.day==xday)HPrintf(p);
            p=p->next;
        }
        menu2(head);
        return 0;
    }
    
    int menu1(LQNode *head)
    {
        int yw;
        printf("\n\t\t           1.载入航班\n");
        printf("\t\t           2.删除航班\n");
        printf("\t\t           3.插入航班\n");
        printf("\t\t           4.查询航班\n");
        printf("\t\t           5.修改航班\n");
        printf("\t\t           0.返回\n");
        printf("\t\t请选择输入航班信息前的序号(0 1 2 3 4 5):");
        scanf("%d",&yw);
        while((yw<0||yw>5))//输入不合法
        {
            printf("\t\t********暂无此项业务,请重新输入:");
            scanf("%d",&yw);
        }
        switch(yw)
        {
            case 1:  message(head);break;
            case 2:  Dlmessage(head);break;
            case 3: Ismessage(head);break;
            case 4: Semessage(head);break;
            case 5: Chmessage(head);break;
            case 0: menu(head);break;
        }
        return 0;
    }
    int menu2(LQNode *head)
    {
        int yw;
        printf("\n\t\t           1.按航班号查询      \n");
        printf("\t\t           2.按起点站查询      \n");
        printf("\t\t           3.按终点站查询      \n");
        printf("\t\t           4.按日期查询        \n");
        printf("\t\t           0.返回              \n");
        printf("\t\t请选择输入航班信息前的序号(0 1 2 3 4):");
        scanf("%d",&yw);
        while((yw<0||yw>4))//输入不合法
        {
            printf("\t\t********暂无此项业务,请重新输入:");
            scanf("%d",&yw);
        }
        switch(yw)
        {
            case 1:  HbSearch(head);break;
            case 2:  SaSearch(head);break;
            case 3:  EaSearch(head);break;
            case 4:  TmSearch(head);break;
            case 0:  menu(head);break;
        }
        return 0;
    }
    int menu3(LQNode *head)
    {
        int yw;
        printf("\n\t\t           1.办理订票业务      \n");
        printf("\t\t           2.排队等票信息      \n");
        printf("\t\t           3.查询订票信息      \n");
        printf("\t\t           0.返回              \n");
        printf("\t\t请选择输入业务前的序号(0 1 2 3):");
        scanf("%d",&yw);
        while((yw<0||yw>3))//输入不合法
        {
            printf("\t\t********暂无此项业务,请重新输入:");
            scanf("%d",&yw);
        }
        switch(yw)
        {
            case 1:  Dingpiao(head);break;
            case 2:  Qumessage(head);break;
            case 3:  Cxmessage(head);break;
            case 0:  menu(head);break;
        }
        return 0;
    
    }
    
    
    
    
    
    int menu(LQNode *head)
    {
        int yw;
        printf("\n\t\t********###航空订票系统#####********\n");
        printf("\t\t***********               **********\n");
        printf("\t\t########## 1.航班信息管理  #########\n");
        printf("\t\t########## 2.航线查询业务  #########\n");
        printf("\t\t########## 3.承办订票业务  #########\n");
        printf("\t\t########## 4.承办退票业务  #########\n");
        printf("\t\t########## 0.退出系统      #########\n");
        printf("\t\t***********               **********\n");
        printf("\t\t********请选择输入业务前的序号: ");
        scanf("%d",&yw);
        while((yw<0||yw>4))
        {                      //输入不合法
            printf("\t\t********暂无此项业务,请重新输入:");
            scanf("%d",&yw);
        }
        switch(yw)
        {
            case 1:  menu1(head);break;
            case 2:  menu2(head);break;
            case 3:  menu3(head);break;
            case 4:  Tuipiao(head);break;
            case 0: return 0;
        }
        return 0;
    }
    int main()
    {
        LQNode *head;
    
        ListInitiate(&head);
    
        menu(head);
        return 0;
    }

                                                               3.航空订票系统

    一、需求分析

    1.问题描述:

     试设计一个航空订票系统,基本要求如下:

    每条航班所涉及的信息有:航班号,航班机型,起飞机场,降落机场,日期(星期几),起飞时间,降落时间,飞行时长,各等级的价格、乘员定额、余票量,订定票的客户名单(包括姓名,订票量,舱位等级(头等舱、公务舱、经济舱))以及等候替补的客户名单(包括姓名、所需数量)。采用链式存储结构。

    2.基本要求:                        

    (1)航班信息管理。

    (2)查询航线,按以下几种方式查询:

    ① 按航班号查询;

    ② 按起点站查询;

    ③ 按终点站查询;

    ④ 按日期查询;

    每种查询方式中,查询后输出如下信息:航班号,航班机型,起飞机场,降落机场,日期(星期几),起飞时间,降落时间,飞行时长,价格,余票量。

    (3)承办订票业务:根据客户提出的要求(航班号,订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,并输出座位号;若已满员或余票少于订票额,则需重新询问客户要求。若需要,可登记排队候补。

    (4)承办退票业务:根据客户提出的情况(日期,航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。

                           

    二、设计

          1. 设计思想

            (1)存储结构

              以线性表模拟航班,用链表实现;

    以足够大的数组模拟航班的机票,用顺序结构实现;

    以队列模拟等候预定机票,用链表实现。

            (2)主要算法基本思想

              该航空订票系统没有很难的算法,其基本框架均由链式线性表,顺序数组和链式队列的基本操作组成。

    1.链式线性表的初始化,创建,插入,修改,删除,查找

    2.顺序数组保存座位号的初始化,元素的删除,插入。

    3.链式队列的出队列操作和入队列操作。

            各功能之间的相互衔接将在详细算法中介绍。

        2. 设计表示

            (1)函数调用关系图

              main→ListInitiate→menu1→message→Dlmessage→Ismessage

             →Chmessage→Semessage       

    main→menu2→HbSearch→SaSearch→EaSearch→TmSearch →HPrintf       main→menu3→Dingpiao→Qumessage→Cxmessage

                   

    (2)函数接口规格说明

            int menu(LQNode *head)  //以head为头指针的航班线性表的主菜单

            int menu1(LQNode *head) //以head为头指针的航班线性表的航班信息管理菜单

            int menu2(LQNode *head) //以head为头指针的航班线性表的航线查新菜单

           int menu3(LQNode *head) //以head为头指针的航班线性表的订票业务菜单

           int message(LQNode *head)//存储航班信息的线性表

          int Dlmessage(LQNode *head)//删除航班信息

          int Ismessage(LQNode *head)//链表后插入航班信息

    int Chmessage(LQNode *head)//链表中修改航班信息

    int Semessage(LQNode *head)//航班查询

    int HbSearch(LQNode *head)//航班

    int SaSearch(LQNode *head)//起点

    int EaSearch(LQNode *head)//终点

    int TmSearch(LQNode *head)//日期

    int Dingpiao(LQNode *head)//订票业务

    int Qumessage(LQNode *head)//排队等票

    int Cxmessage(LQNode *head)//查询订票信息

    3. 详细设计(主要函数)

    #define MaxStackSize 100      //最大的票数

    typedef int Datetype;

    typedef struct pnode        //链式等票队列结点

    {

        char name[20];

        int np;

        struct pnode *next;

    }LPNode;

    typedef struct              //链式队列结点指针

    {

        LPNode *front;

        LPNode *rear;

        int count;

    }LPQueue;

    typedef struct

    {

        char name[20];

        int number;

        int biaoji;

    }Ticketmessage;//机票信息结构体

    typedef struct

    {

        Datetype fnumber;  //航班号

        int plane;   //航班机型

        char sairport[20];//起飞机场

        char eairport[20];//降落机场

        int day;//日期(星期几)

        int stime;//起飞时间

        int etime;//降落时间

        int ltime;//飞行时间

        int jpshu;//机票数

        int tdjps;//头等舱机票数

        int swjps;//商务舱机票数

        int jjjps;//经济舱机票数

        int tdjia;//头等舱价格

        int swjia;//商务舱价格

        int jjjia;//经济舱价格

        Ticketmessage ticket[MaxStackSize];//机票数组

        LPQueue Q;  //等票队列

    }Airmessage;                //航班信息结构体

    typedef struct qnode        //链式航班队列结点

    {

        Airmessage Air;

        struct qnode *next;

    }LQNode;  

    【1】int Dingpiao(LQNode *head)//直接订票函数

    1.根据航班号判断订票的航班

    判断是否存在此航班

    2.1若不存在,从新输入调用函数本身Dingpiao(head);

    2.2有该航班

           请输入姓名(拼音)和票数

              判断机票是否都售完(数余票数)       

       3.1该航班无余票(票数为0),请耐心等待QueueAppend(p,xname,xnp);

       3.2输出可选座位号

    3.3余票不足!输入1先定部分机票,输入0则等票!

    4.4若输入1,则调用部分订票函数BfDingpiao(p,xname,xnp-j)  

    4.5若输入0,则调用入队列等待函数QueueAppend(p,xname,xnp);        

    【2】int QueueGet(LQNode *p)    //出队列订票

        n=0; //判断是否需要向队列依次询问订票

      函数被调用,则还有机票

      输出队首等待订票人姓名和票数 

      1.1如票足够,则输出票的座位号给用户选择

        选完之后,将座位号对应的票标记为已售。

      1.2若有票但比等票人定的票少

      2.1余票不足!输入1先定部分机票,输入0则等票!:

    3.1若输入1,则调用部分订票函数BfDingpiao(p,xname,xnp-j) ,并修改订票人的订票数。 

    3.2若输入0,则该等票者继续等票,向队列后面询问;

             直至队尾或没有票为止。

    【3】int Tuipiao(LQNode *head)

    退票函数,可根据用户的选择退一张或多张票,还可选择退票的座位号。

    {

      int i,j,n,m;

      j=0;

      int number;

      char name[20];

      LQNode *p;//航班

      p=head;

      printf("\t\t请输入航班号:");

        scanf("%d",&number);

        while(p->next!=NULL&&p->next->Air.fnumber!=number)p=p->next;

        printf("\t\t请输入姓名(拼音):");

        scanf("%s",name);

        for(i=0;i<p->next->Air.jpshu;i++)//MaxStackSize

        if(strcmp(p->next->Air.ticket[i].name,name)==0)j++;

        if(j>1)

        {

            printf("\t\t你订了%d张机票,其座位号分别为:",j);

            for(i=0;i<p->next->Air.jpshu;i++)//MaxStackSize

            if(strcmp(p->next->Air.ticket[i].name,name)==0)

            printf("%d ",i+1);

                printf("\n\t\t请输入退票数:");

                scanf("%d",&n);

            printf("\t\t请输入退票的座位号:");

            for(i=0;i<n;i++)

            {

                scanf("%d",&m);

                p->next->Air.ticket[m-1].biaoji=0;

             }

        }

        else if(j==1)

        {

            printf("\t\t请输入退票的座位号:");

            scanf("%d",&m);

            p->next->Air.ticket[m-1].biaoji=0;

        }

      if(p->next->Air.Q.count!=0)QueueGet(p);//调用出队列函数(已确定航班)

        menu(head);

      return 0;

    }

    三、调试分析

          1.调试过程中遇到的主要问题是如何解决的;

      (1)使用链表时,和其他很多同学一样,容易将带头结点的链表和不带头结点的链表混淆,造成内存不可读或写的错误,经过对课程的回顾,及老师在课堂上的提醒注意,我终于改好了bug。

      (2)第一次给老师检查时,只是初步实现了题目要求的功能,进过老师的在三指导,程序越来越健壮和功能齐全,而且也更符合客观的情况。

    2.对设计和编码的回顾讨论和分析;

    总的来说,这个程序写的有点复杂,随着老师要求的不断完善,需要更多的添加和修改。好在老师立足于我写的代码,帮助我想办法完善程序,给我更好的完善程序的idea,说以此程序写的挺顺利,就只是其中变量多次多处被用到,要全局的改好程序需要了些许时间。

    3.时间和空间复杂度的分析;

    【1】int message(LQNode *head)//存储航班信息的线性表

    时间O(1),空间O(n*n)

    【2】int Dlmessage(LQNode *head)//删除航班信息

    时间O(n),  空间O(1)

    【3】int Ismessage(LQNode *head)//链表后插入航班信息

    时间O(1),空间O(n)

    【4】int Chmessage(LQNode *head)//链表中修改航班信息

       时间O(n),  空间O(1)

    【5】int Semessage(LQNode *head)//航班查询

        时间O(n),  空间O(1)

    【6】int HbSearch(LQNode *head)//航班

        时间O(n),  空间O(1)

    【7】int SaSearch(LQNode *head)//起点

        时间O(n),  空间O(1)

    【8】int EaSearch(LQNode *head)//终点

        时间O(n),  空间O(1)

    【9】int TmSearch(LQNode *head)//日期

        时间O(n),  空间O(1)

    【10】int Dingpiao(LQNode *head)//订票业务

        时间O(1),  空间O(1)

    【11】int Qumessage(LQNode *head)//排队等票

        时间O(1),  空间O(1)

    【12】int Cxmessage(LQNode *head)//查询订票信息

        时间O(1),  空间O(1)

    4.改进设想;

           程序能实现很多的功能,也有改进空间

    【1】:更符合实际的函数添加

           【2】:更简洁的代码

    5.经验和体会等。

    多动手编程,才能熟练灵活的掌握C语言基础知识,才能更好的理解掌握数据结构的精髓。从而避免基础语法错误,让代码变得更简洁高效。如此才能准确高效的解决问题。在今后的编程过程中要更注重代码的熟练掌握,多的温习代码思想,多的动手编程。还要多留心观察生活,体验生活,让自己的更加的具有实际可用性。

    四、用户手册(即使用说明)

       完全按照提示输入。若出现不可预料的错误,请重新来过。

    五、运行结果

    运行环境:codeblocks

    运行后的界面(主菜单)

    测试数据:5

     **输入不符合要求时,程序非正常结束

    ****在输入完后,核对输入是否要求,如若不然提示暂无此业务,重新输入

    (已改正)测试数据:1

    测试数据:2

    测试数据:依次输入2       1        4

    载入,删除和查询功能正常

    经测试插入和修改功能也正常。

      测试数据:依次输入0       2        1

    航班号1已被删除,看程序是否会非正常终止

    经测试程序仍正常进行,其他查询方式也都正确

    测试数据:依次输入0       3        1        2

    查看订票功能:

    选择座位号时,非法多输入数据4

    发现程序订票功能多循环一次,程序仍正常运行

    经验证系统的订票,退票功能均可正常运行,出现非法输入时,也能继续正常运行,程序有一定的健壮性。

    只是当需要整形输入航班号时,若输入英文字母,则会死循环。

    暂不知如何避免(只能加以提醒注意)

    六、源程序清单

    https://wenku.baidu.com/view/c91fa69f6bdc5022aaea998fcc22bcd127ff4245

  • 相关阅读:
    C#将List<T>转化为DataTable
    SqlServer常用内置函数
    C#索引器
    验证Textbox的字符长度
    WM消息对应的Message消息中的Lparam和WParam
    对窗体操作的WM消息
    DllImport使用
    C#获取当前路径的七种方法
    注册ActiveX控件
    [转]VS2010中水晶报表安装应用及实例
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3006020.html
Copyright © 2020-2023  润新知