weixin_55046612 2022-02-14 23:15 采纳率: 100%
浏览 232
已结题

C语言——飞机订票系统设计

帮忙看看可以吗!
问题描述:实现航班信息的管理和顾客订票功能,分管理员和顾客两种角色

  • 写回答

2条回答 默认 最新

  • 关注

    区分好每个角色的功能,登陆的时候让用户选择登陆的角色,根据角色显示不同的功能。
    写了一个代码,供参考。

    img

    img

    img

    img

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    
    
    /*************************************************************************/
    /* 登陆分管理员和用户                                                    */
    /* 管理员功能:                                                          */ 
    /*            1.管理航班信息(如增加、删除、修改航班信息)               */
    /*            2.查看订票信息(如查看所有航班的售票情况、查询某次航班信息)*/
    /* 用户功能:                                                            */
    /*            1.查看所有航班信息(根据航班号、出发地、目的地等)         */
    /*            2.订票                                                     */
    /*            3.退票                                                     */
    /*************************************************************************/
    
    //机票实际上应够由航班号、日期来共同确定其唯一性,这里为了简便,不再做具体处理
    
    
    
    //定义日期结构体
    struct Date
    {
        int year;
        int month;
        int day;
    };
    
    //定义时间
    struct StTime 
    {
        int hour;
        int mint;
        int sec;
    };
    
    
    //定义购票信息结构体
    struct StTickInfo
    {
        char id[16];     //订单号(根据时间生成,或者随机生成,这里这个这个字段可以没有,实际系统中肯定是要有的)
        Date date;       //订票日期
        char hangban[16];//航班号,通过航班号,可以查询航班信息
        char guest[20];  //订票人名
        char guId[20];   //订票人身份证号
        char phone[12];  //订票人电话
    };
    
    //航班信息
    struct StHangbanInfo 
    {
        char hangban[16];//航班号
        char name[16];   //航空公司名称
        char src[16];    //出发地
        char dst[16];    //目的地
        Date date;       //航班日期
        StTime tm;       //起飞时间
        int nmbZw;       //座位数量
        int nmbUse;      //已售票数
        int price;       //票价
    };
    
    //定义全局变量,管理航班和订票信息
    struct StHangbanInfo g_allHb[100]; //保存当前所有航班信息
    int g_nmbHb=0; //实际航班数量
    
    struct StTickInfo g_allTicks[200]; //保存当前所有的订单信息
    int g_nmbTicks=0; //当前系统中实际购票数量
    
    //根据航班号查询航班信息
    struct StHangbanInfo searchById(char* id)
    {
        int i;
        struct StHangbanInfo stnull;
        memset(&stnull.hangban,0,16);
        for (i=0;i<g_nmbHb;i++)
        {
            if(strcmp(g_allHb[i].hangban,id)==0)
                return g_allHb[i];
        }
        printf("未找到航班信息\n");
        return stnull;
    }
    
    //根据时间生成订单编号
    void getId(char buf[])
    {
        time_t t;
        struct tm * lt;
        time (&t);//获取时间戳
        lt = localtime (&t);//转为时间结构
        //sprintf不安全,可以更换为sprintf_s
        sprintf(buf,"%d%02d/%02d%02d%02d%02d",lt->tm_year+1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果
    }
    
    //获取当前时间
    struct Date getCurrentDate()
    {
        Date oo;
        time_t t;
        struct tm * lt;
        time (&t);//获取时间戳
        lt = localtime (&t);//转为时间结构
        //sprintf不安全,可以更换为sprintf_s
        //sprintf(buf,"%d%02d/%02d%02d%02d%02d",lt->tm_year+1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果
        oo.year = lt->tm_year+1900;
        oo.month = lt->tm_mon;
        oo.day = lt->tm_mday;
        return oo;
    }
    
    //显示航班信息标题
    void showHbTitle()
    {
        printf("航班号  航空公司  起始地  目的地  起飞日期及时间  价格  座位数  剩余票数\n");
    }
    
    //显示单条航班信息
    void showSingleHbInfo(struct StHangbanInfo st)
    {
        printf("%s  %s  %s  %s  %d-%02d-%02d %02d:%02d  %d  %d  %d\n",st.hangban,st.name,st.src,st.dst,
            st.date.year,st.date.month,st.date.day,st.tm.hour,st.tm.mint,st.price,st.nmbZw,st.nmbZw-st.nmbUse);
    }
    
    //查询航班-管理员和用户通用
    void search()
    {
        int opt,i;
        char ch;
        char id[16]={0};
        char start[16]={0},end[16]={0};
        struct StHangbanInfo hb;
        int nmb=0;
        system("cls");
        if(g_nmbHb==0)
        {
            printf("目前暂无航班信息,请先添加航班\n");
            system("pause");
            return;
        }
        while (1)
        {
            system("cls");
            printf("1.根据航班号查询\n");
            printf("2.根据出发地、目的地查询\n");
            while(1)
            {
                scanf("%d",&opt);
                if(opt ==1 || opt ==2) break;
            }
            fflush(stdin); //清空输入缓存
            switch(opt)
            {
            case 1:
                printf("请输入航班号:");
                scanf("%s",id);
                hb = searchById(id);
                if(strlen(hb.hangban) > 0)
                {
                    showHbTitle();
                    showSingleHbInfo(hb);
                }
                break;
            case 2:
                printf("请输入起始地、目的地:");
                scanf("%s %s",start,end);
                showHbTitle();
                for (i=0;i<g_nmbHb;i++)
                {
                    if(strcmp(g_allHb[i].src,start)==0 && strcmp(g_allHb[i].dst,end)==0)
                        showSingleHbInfo(g_allHb[i]);
                }
                break;
            }
            printf("是否继续查询(Y/N)?");
            fflush(stdin);
            ch = getchar();
            if(ch=='N' || ch=='n')
                break;
        }
    
    }
    
    
    //----------------管理员功能------------------//
    //新增航班
    void addHangban()
    {
        struct StHangbanInfo st;
        system("cls");
        fflush(stdin);
        printf("请输入航班号:");
        scanf("%s",st.hangban);
        printf("请输入航班公司名称:");
        scanf("%s",st.name);
        printf("请输入起始地:");
        scanf("%s",st.src);
        printf("请输入目的地:");
        scanf("%s",st.dst);
        printf("请输入起飞日期(YYYY-M-D):");
        scanf("%d-%d-%d",&st.date.year,&st.date.month,&st.date.day);
        printf("请输入起飞时间(H:M):");
        scanf("%d:%d",&st.tm.hour,&st.tm.mint);
        printf("请输入票价:"); //这里不再区分头等舱和经济舱
        scanf("%d",&st.price);
        printf("请输入座位数量:");
        scanf("%d",&st.nmbZw);
        st.nmbUse = 0;
        g_allHb[g_nmbHb++] = st; //保存数据
        printf("添加航班成功\n");
        system("pause");
    }
    
    
    //从订单信息中删除某航班的所有订票信息
    void delSpecHb(char* id)
    {
        int i,j;
        for (i=0;i<g_nmbTicks;i++)
        {
            if(strcmp(g_allTicks[i].hangban,id)==0)
            {
                for(j=i;j<g_nmbTicks-1;j++)
                {
                    g_allTicks[j] = g_allTicks[j-1];
                }
                g_nmbTicks--;
                i--; //i回退一下,for循环i++后,仍指向该删除元素的位置,并开始判断
            }
        }
    }
    
    
    //删除航班(航班也需要从订票信息中删除)
    void delHb()
    {
        int i;
        char id[16]={0};
        fflush(stdin);
        system("cls");
        printf("请输入要删除的航班号:");
        scanf("%s",id);
        for (i=0;i<g_nmbHb;i++)
        {
            if (strcmp(id,g_allHb[i].hangban)==0)
            {
                //从订票信息中删除该航班的所有订票信息(退费、短信通知等功能这里就不写了)
                delSpecHb(g_allHb[i].hangban);
                printf("删除成功\n");
                g_nmbHb--;
                system("pause");
                return ;
            }
        }
        printf("未找到该航班号\n");
        system("pause");
    }
    
    
    //管理员功能入口
    void deal_manager()
    {
        int opt;
        while(1)
        {
            system("cls");
            printf("1.查询航班\n");
            printf("2.添加航班\n");
            printf("3.删除航班\n");
            printf("4.退出\n");
            printf("请选择:");
            scanf("%d",&opt);
            switch(opt)
            {
            case 1:
                search();
                break;
            case 2:
                addHangban();
                break;
            case 3:
                delHb();
                break;
            case 4:
                return;
            }
        }
    }
    
    
    //----------------客户功能------------------//
    //购票
    void gouPiao()
    {
        struct StTickInfo tk;
        int i,flag=0;
    
        system("cls");
        fflush(stdin);
        printf("请输入航班号:");
        while(1)
        {
            scanf("%s",tk.hangban);
            //这里最好对航班进行处理,比如查看航班是否存在,票是否已经售完
            for (i=0;i<g_nmbHb;i++)
            {
                if (strcmp(g_allHb[i].hangban,tk.hangban)==0 )
                {
                    if( g_allHb[i].nmbZw-g_allHb[i].nmbUse == 0)
                        flag = 1;
                    break;
                }
            }
            if(i==g_nmbHb)
            {
                printf("未找到该航班,请重新输入航班号:");
            }else
            {
                if(flag==1)
                    printf("该航班机票已售罄,请选择其他航班:\n");
                else
                {
                    g_allHb[i].nmbUse+=1; //将该航班的已售票数+1
                    break;
                }
            }
    
        }
    
        printf("请输入订票人姓名"); 
        scanf("%s",tk.guest);
        printf("请输入订票人身份证号:");
        scanf("%s",tk.guId);
        printf("请输入订票人手机号:");
        scanf("%s",tk.phone);
        //生成订单号
        getId(tk.id);
        //填充购票时间
        tk.date = getCurrentDate();
        //保存
        g_allTicks[g_nmbTicks++] = tk;
        printf("购票成功\n");
        system("pause");
    }
    //退票(通过身份证退票,限定一人只能买一张票)
    void tuiPiao()
    {
        char buf[16];
        int i,j;
        fflush(stdin);
        printf("请输入退票人的身份证号:");
        scanf("%s",buf);
        for (i=0;i<g_nmbTicks;i++)
        {
            if(strcmp(g_allTicks[i].guId,buf)==0)
            {
                //修改该航班的已售票数
                for (j=0;j<g_nmbHb;j++)
                {
                    if(strcmp(g_allHb[j].hangban,g_allTicks[i].hangban)==0)
                    {
                        g_allHb[j].nmbUse-=1;
                        break;
                    }
                }
                //删除该订票信息
                for (j=i;j<g_nmbTicks-1;j++)
                {
                    g_allTicks[j] = g_allTicks[j+1];
                }
                g_nmbTicks--;
                printf("退票成功\n");
                break;
            }
        }
        if(i==g_nmbTicks)
            printf("没有此人的购票信息\n");
        system("pause");
    }
    //客户功能入口
    void deal_customer()
    {
        int opt;
        while(1)
        {
            system("cls");
            printf("1.查询航班\n");
            printf("2.购票\n");
            printf("3.退票\n");
            printf("4.退出\n");
            printf("请选择:");
            scanf("%d",&opt);
            switch(opt)
            {
            case 1:
                search();
                break;
            case 2:
                gouPiao();
                break;
            case 3:
                tuiPiao();
                break;
            case 4:
                return;
            }
        }
    }
    
    
    
    
    int main(void)
    {
        int opt;
        while(1)
        {
            system("cls");
            printf("----------订票管理系统-----------------|\n");
            printf("|         1.管理员登陆                 |\n");
            printf("|         2.客户登陆                   |\n");
            printf("|         9.退出系统                   |\n");
            printf("---------------------------------------|\n");
            printf("请选择:");
            scanf("%d",&opt);
            switch(opt)
            {
            case 1:
                deal_manager();
                break;
            case 2:
                deal_customer();
                break;
            case 9:
                return 0;
            }
        }
    
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 已采纳回答 2月15日
  • 修改了问题 2月15日
  • 修改了问题 2月14日
  • 展开全部

悬赏问题

  • ¥15 请问各位,如何在Jetson nano主控板的Ubuntu系统中安装PyQt5
  • ¥15 MAC安装佳能LBP2900驱动的网盘提取码
  • ¥400 微信停车小程序谁懂的来
  • ¥15 ATAC测序到底用什么peak文件做Diffbind差异分析
  • ¥15 安装ubantu过程中第一个vfat 文件挂载失败
  • ¥20 GZ::CTF如何兼容一些靶机?
  • ¥15 etcd集群部署问题
  • ¥20 谁可以帮我一下问一下各位
  • ¥15 为何重叠加权后love图的SMD与svyCreateTableOne函数绘制基线表的不一致
  • ¥150 求 《小魔指》街机游戏机整合模拟软件