航空订票系统

任务: 航空客运定票的业务活动包括:查询航线、客票预定和办理退票等。试设计一 个航空客运定票系统,以使上述业务可以借助计算机来完成。

功能要求:

1) 录入:可以录入航班情况

2) 查询:可以查询某个航线的情况(如输入航班号,查询起降时间,起飞抵达城 市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞 机航班情况;

3) 订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果 该航班已经无票,可以提供相关可选择航班;

4) 退票: 可退票,退票后修改相关数据文件;

5) 客户资料:有姓名,证件号,订票数量及航班情况,订单要有编号;

6) 修改航班信息:当航班信息改变可以修改航班数据文件。

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

typedef struct CNode {
    char name[20];//姓名
    int num;//订票数 
    char ID[20];//身份证
    char day[20];
    int dengji;//舱等级
    CNode* next;
} CNode, * CList;//乘客节点

typedef struct hangban {
    char hbID[20];//航班编号 
    char qidian[20];//起点站名
    char zhongdian[20];//终点站名
    char time1[20];//起飞时间
    char time12[20];//起飞时间
    char time2[20];//到达时间
    char time22[20];//到达时间
    int price;//价格
    int account;//折扣率
    int maxnum;//总票数
    int less;//总余票量
    hangban* next;
    CList cusLinkList;//乘员名单域,指向乘员名单链表的头指针
  
} hangban, hangbanNode, * Phangban;//航班节点

int menu();// 菜单界面函数
void initFlight(); //初始化航班链表
int initCusLinkList(CList& cusLinkList);//初始化订票乘客链表 

void dingpiaoFace();//  订票界面
void dingpiao();// 订票函数 
CList addlink(CList& head, int need, char name[], char id[]);
//将订票成功的乘客节点加入到已订票链表 
void sousuoflight(hangban* pflight);//由起点终点搜索航班 
void find(hangban* pflight);//根据自己输入的航班标号查询是否存在并返回节点 
void pricusInfo();//输出已经订票的函数 
void fightinfo(hangban* p);//输出对应节点信息 
hangban* find(); // 输入编号返回对应信息 


void tuipiaoFace(); //退票界面 
void printfall(hangban* pflight);//打印全部航班信息
void tuipiao();// 退票
void sousuoFace();// 搜索界面
void elseswitch(hangban* pflight);

void charushanchuFace(); //插入和删除 
int zengjiaFlight();//增加航班 
int shanchuFlight();// 删除航班
int Create(Phangban flight1);//将航班信息插入到链表中 
int duibiFlight(hangban* flight, char flightCodeID[]);
// 对比插入航班标号,防止标号重复 






hangban* pFlight;//全局节点变量
hangban* p;
//初始输入的航班信息 
hangban flight1[5] = {
{"MU5103","上海虹桥","北京","7","00","9","20",1063,94,20,2},
{"CA1590","上海虹桥","北京","8","55","11","15",864,75,20,0},
{"FM9307","上海虹桥","广州","10","30","12","50",608,48,20,5},
{"HO1241","上海浦东","青岛","19","50","21","20",418,56,20,11},
{"3U8964","上海浦东","成都","15","45","19","05",922,57,20,1},
};


void initFlight()// 初始化航班链表
{
    pFlight = (hangban*)malloc(sizeof(hangban));
    if (pFlight == NULL) exit(0);
    pFlight->next = NULL;
}

int Create(Phangban flight1)// 将已有航班信息插入链表 
{
    hangban* p = pFlight, * q;
    for (int i = 0; i < 5; i++) {
        q = (hangban*)malloc(sizeof(hangban));
        if (q == NULL)
            return 0;
        strcpy(q->hbID, flight1[i].hbID);
        strcpy(q->qidian, flight1[i].qidian);//利用链表把每个信息录入 
        strcpy(q->zhongdian, flight1[i].zhongdian);
        strcpy(q->time1, flight1[i].time1);
        strcpy(q->time12, flight1[i].time12);
        strcpy(q->time2, flight1[i].time2);
        strcpy(q->time22, flight1[i].time22);
        q->price= flight1[i].price;
        q->account=flight1[i].account;
        q->maxnum = flight1[i].maxnum;
        q->less = flight1[i].less;
        initCusLinkList(q->cusLinkList); //初始化已经订票乘客链表
        q->next = p->next;
        p->next = q;
    }
    return 1;
}

int initCusLinkList(CList& cusLinkList)//初始化已订票乘客指针链表 
{
    CList q = cusLinkList;
    cusLinkList = (CNode*)malloc(sizeof(CNode));
    cusLinkList->next = NULL;
    return 0;
}


//第一个
void printfall(hangban* pflight)//打印全部航班信息
{
    hangban* p;
    p = pflight->next;

    printf("航班编号   起点         终点     起飞时间    到达时间    价格       折扣率    总票数    总余票数 \n");

    while (p != NULL)
    {
        printf("%6s     %4s     %2s     %2s:%2s       %2s:%2s     %6d     %5d       %3d       %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
        p = p->next;
    }
    printf("\n\n");
}



//第二个
void sousuoFace() //搜索界面
{
    int a2;
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");


    printf("                            搜索航班\n");
    printf("***********************************************************\n");
    printf("                            1.根据起飞抵达城市搜索航班            \n");
    printf("                            2.根据航班号搜索航班            \n");
    printf("                            3.返回上一级          \n");
    printf("***********************************************************\n");
    printf("                            请输入您的选择:");
    scanf("%d", &a2);
    switch (a2)
    {
    case 1:
        sousuoflight(pFlight);//输入起点和终点搜索航班 
        system("PAUSE");
        sousuoFace();
        break;
    case 2:
        find(pFlight);//输入航班号搜索航班 
        system("PAUSE");
        sousuoFace();
        break;
    case 3:
        menu();
        break;
    default:
        sousuoFace();
    }
}

void sousuoflight(hangban* pflight) //有起点和终点搜索对应航班 
{
    hangban* p;
    p = pflight->next;
    char qidian[10];
    char zhongdian[10];
    int flag = 0;
    printf("请输入起点站名:");
    scanf("%s", qidian);
    printf("请输入终点站名:");
    scanf("%s", zhongdian);


    printf("航班编号   起点         终点     起飞时间    到达时间    价格       折扣率    总票数    总余票数 \n");
    while (p != NULL)
    {
        if ((strcmp(qidian, p->qidian) == 0) && (strcmp(zhongdian, p->zhongdian) == 0))
            //	对比输入的起点和终点,推荐航班 
        {
            flag = 1;
            printf("%6s     %4s     %2s     %2s:%2s       %2s:%2s     %6d     %5d       %3d       %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
        }
        p = p->next;
    }
    printf("\n\n");
    if (flag == 0)
        printf("不存在该航班! \n");
}


void find(hangban* pflight)//根据自己输入的航班标号查询是否存在并返回节点 
{
    hangban* p;
    p = pflight->next;
    char number[10];
    int i = 0;
    printf("请输入航班编号: ");
    scanf("%s", number);
    printf("航班编号   起点         终点     起飞时间    到达时间    价格       折扣率    总票数    总余票数 \n");
    while (p != NULL)
    {
        if ((strcmp(number, p->hbID) == 0))
            //	对比输入的起点和终点,推荐航班 
        {
            i = 1;
            printf("%6s     %4s     %2s     %2s:%2s       %2s:%2s     %6d     %5d       %3d       %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
        }
        p = p->next;
    }
    printf("\n\n");
    if (i == 0)
        printf("不存在该航班! \n");
}
//第三个
void dingpiaoFace() //订票界面
{
    int a3;
    printf("\n");
    printf("\n");
    printf("                            订票\n");
    printf("***********************************************************\n");
    printf("                            1.订票                         \n");
    printf("                            2.由起点和终点搜索航班           \n");
    printf("                            3.搜索所有航班                     \n");
    printf("                            4.通过航班编号查询客户       \n");
    printf("                            5.返回上一级                  \n");
    printf("***********************************************************\n");
    printf("                            请输入你要办理的业务:");
    scanf("%d", &a3);
    switch (a3)
    {
    case 1://订票
        dingpiao();
        system("PAUSE");
        dingpiaoFace();
        break;
    case 2://输入起点和终点查询
        sousuoflight(pFlight);
        system("PAUSE");
        dingpiaoFace();
        break;
    case 3:
        printfall(pFlight);
        system("PAUSE");
        dingpiaoFace();
        break;
    case 4:  //查到客户的姓名和订票量
        pricusInfo();
        system("PAUSE");
        dingpiaoFace();
        break;
    case 5:
        menu();
        break;
    default:
        dingpiaoFace();
    }
}


hangban* find()//根据自己输入的航班号查询是否存在并返回节点 
{
    char number[10];
    int i = 0;
    printf("请输入航班编号: ");
    scanf("%s", number);
    hangban* p = pFlight->next; //头结点的下一个节点开始遍历
    while (p != NULL)
    {
        if (!strcmp(number, p->hbID))
            return p;
        p = p->next;
    }
    return NULL;
}

void pricusInfo()//输出订购该航班乘客的姓名,票数,等级 
{
    CList p;
    hangban* info;
    info = find();//由输入的航班编号查询航班是否存在,并将节点复制给info 
    if (info == NULL)
    {
        printf("没有这个航班\n");
        return;
    }
    //头结点的下一个节点开始遍历
    p = info->cusLinkList->next;
    if (p != NULL)
    {
        printf("客户姓名   订票数额  \n");
        while (p)
        {
            printf("%s\t\t%d\n", p->name,1);
            p = p->next;
        }
    }
    else
        printf("该航班没有客户信息!!\n");
}



void dingpiao() // 订票函数 
{
    struct hangban* info;
    int need, grade;
    int num;//剩余的p数目
    char name[20];
    char id[20];
    info = find();//输入想订的航班,看是否还有空位置,并返回复制节点 
    if (info == NULL)
    {
        printf("不存在该航班!\n");
        dingpiaoFace();
    }
    printf("请输入您想要定得票数:");
    scanf("%d", &need);
    if (need <= 0)
    {
        scanf("%d", &need);
    }
    num = info->less;
    if (need <= num) //订票数小于剩余数 
    {
       
        if (need == 1)
        {
            printf("请输入您的姓名:");
            scanf("%s", name);
            printf("请输入您的身份证号码:");
            scanf("%s", id);
            CList head = info->cusLinkList;
            addlink(head, need, name, id);//订票成功,插入成员名单链表
            printf("姓名      证件号              订票数   航班号  座位号\n");
            printf("%s      %s  %d        %s   %d\n",  name,id,need, info, info->maxnum - info->less  + 1);
            info->less--;
            printf("\n订票成功!\n");
        }
        else if (need > 1)
        {
            int i;
            
            for (i =0; i <need; i++)
            {
                printf("请输入您的姓名:");
                scanf("%s", name);
                printf("请输入您的身份证号码:");
                scanf("%s", id);
                CList head = info->cusLinkList;
                addlink(head, need, name, id);//订票成功,插入成员名单链表
                printf("姓名      证件号              订票数   航班号  座位号\n");
                printf("%s      %s  %d        %s   %d\n", name, id, 1, info, info->maxnum - info->less+1 );
                info->less--;
            }
           
            printf("\n订票成功!\n");
        }

    }
    else
    {
        char r;
        

        printf("票不足,以下为该航班乘客信息\n");
        info->less = 0;
        fightinfo(info);//输出该航班的订票信息 
        printf("是否查看其他航班信息?Y/N\n");
        scanf("%s", &r);
        
        if (r == 'Y' || r == 'y') //改变计划,重新选择航班
        {
    
            elseswitch(pFlight);
 
        }
        else if (r == 'N' || r == 'n')
        {
            dingpiaoFace();
        }
    }

}

//name, id, need, info, info->maxnum - info->less + 1
CList addlink(CList& head, int need, char name[], char id[])
//插入到已经订票客户链表 
{
    CList new1;//创建一个新节点 
    new1 = (CNode*)malloc(sizeof(CNode));
    if (new1 == NULL)
    {
        printf("\n内存不足\n");
        return NULL;
    }
    strcpy(new1->name, name);
    strcpy(new1->ID, id);
    new1->num = need;
    new1->next = head->next;//头插入法加入成员名单域
    head->next = new1;
    return head;
}
void fightinfo(hangban* p)//输出p节点的航班信息 
{
    printf("航班编号   起点         终点     起飞时间    到达时间    价格       折扣率    总票数    总余票数 \n");
    printf("%6s     %4s     %2s     %2s:%2s       %2s:%2s     %6d     %5d       %3d       %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);

    printf("\n\n");

}




void elseswitch(hangban* pflight)//打印全部航班信息
{
    char a;
    hangban* p;
    p = pflight->next;

    printf("航班编号   起点         终点     起飞时间    到达时间    价格       折扣率    总票数    总余票数 \n");

    while (p != NULL)
    {
        printf("%6s     %4s     %2s     %2s:%2s       %2s:%2s     %6d     %5d       %3d       %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
        p = p->next;
    }
    printf("\n\n");
    printf("是否返回订票界面?");
    scanf("%s", &a);
    if (a == 'Y' || a == 'y') //改变计划,重新选择航班
    {
        dingpiaoFace();
    }
}


//第四个

void tuipiaoFace()//退票模块界面
{
    int a3;
    printf("\n");
    printf("\n");
    printf("                            退票\n");
    printf("***********************************************************\n");
    printf("                            1.办理退票            \n");
    printf("                            2.返回上一级          \n");
    printf("***********************************************************\n");
    printf("                            请输入你要办理的业务:");
    scanf("%d", &a3);

    switch (a3)
    {
    case 1:
        tuipiao();
        system("PAUSE");
        tuipiaoFace();
        break;
    case 2:
        menu();
        break;
    default:
        tuipiaoFace();
    }
}

void tuipiao() //退票功能 
{
    struct hangban* info;
    CNode* p1, * p2, * head;//p1为遍历指针,p2指向p1的前驱
    char name[20];//客户姓名
    char id[20];//客户身份证
    info = find();//复制节点信息给info,find函数根据航班编号返回该航班节点的指针
    while (info == NULL)
    {
        printf("没有这个航班, 请重新输入\n");
        tuipiao();
    }
    head = info->cusLinkList;//head为该航班的的乘员名单域的头指针
    p1 = head->next;    //带头结点的指针,head->next 开始遍历
    printf("请输入你的姓名: ");
    scanf("%s", name);
    printf("请输入你的身份证号码: ");
    scanf("%s", id);
    p2 = head;//根据客户姓名搜索客户是否订票
    while (p1 != NULL)
    {//对比姓名和身份证 
        if ((strcmp(name, p1->name) == 0) && (strcmp(id, p1->ID) == 0)) break;
        p2 = p1;
        p1 = p1->next;
    }
    if (p1 == NULL)
    {
        printf("对不起,你没有订过票或姓名和身份证不对应\n");
        return;
    }
    else
    {//退票成功
        //从乘客名单域中移除该节点

        p2->next = p1->next;
        //加回该航班的剩余票
        info->less ++;
        printf("%s  成功退票!\n", p1->name);
        free(p1);
    }
}




void charushanchuFace()//插入删除节点函数 
{
    int a2;
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");

    printf("                            插入与删除\n");
    printf("***********************************************************\n");
    printf("                            1.增加航班              \n");
    printf("                            2.删除航班              \n");
    printf("                            3.返回上一级            \n");
    printf("***********************************************************\n");
    printf("                            请输入你要办理的业务:");
    scanf("%d", &a2);
    switch (a2)
    {
    case 1:
        zengjiaFlight();//增加航班节点函数 
        charushanchuFace();
        break;
    case 2:
        if (1 == shanchuFlight())//删除航班节点函数 
        {
            printf("删除成功\n");
        }
        else
        {
            printf("没有这个航班,删除失败!\n");
        };
        charushanchuFace();
    case 3:
        menu();
        break;
    default:
        charushanchuFace();
    }
}

int zengjiaFlight()//增加航班函数 
{
    hangbanNode* q;//定义q为新增加的航班结点的指针的形参
    hangban* p = pFlight;
    int y = 1;
    while (y != 0)
    {
        q = (hangbanNode*)malloc(sizeof(hangbanNode));
        if (q == NULL)
            return 0;
        printf("\t\t请依次输入以下内容\n");
        printf("\t\t请输入航班编号\n");
        scanf("%s", q->hbID);
        int t = duibiFlight(pFlight, q->hbID);//判断添加的航班编号是否已经存在 
        if (t == 0)
        {
            printf("该航班编号已经存在,请重新输入航班编号\n");
            continue;
        }
        char hbID[20];//航班编号 
        char qidian[20];//起点站名
        char zhongdian[20];//终点站名
        char time1[20];//起飞时间
        char time12[20];//起飞时间
        char time2[20];//到达时间
        char time22[20];//到达时间
        char price[20];//价格
        char account[20];//折扣率
        int maxnum;//总票数
        int less;//总余票量
        printf("\t\t请输入起点站名\n");
        scanf("%s", q->qidian);
        printf("\t\t请输入终点站名\n");
        scanf("%s", q->zhongdian);
       
        printf("\t\t请输入起飞时间\n");
        scanf("%s", &q->time1);
        printf(":");
        scanf("%s", &q->time12);
        printf("\t\t请输入到达时间\n");
        scanf("%s", &q->time2);
        printf(":");
        scanf("%s", &q->time22);
        printf("\t\t请输入j价格\n");
        scanf("%d", &q->price);
        printf("\t\t请输入折扣率\n");
        scanf("%d", &q->account);
        printf("\t\t请输入乘客定额\n");
        scanf("%d", &q->maxnum);
        q->less = q->maxnum;
        initCusLinkList(q->cusLinkList);//初始化

        q->next = p->next;
        p->next = q;

        printf("\t\t是否继续录入航班信息(任意数字继续,0表示停止)。\n");
        printf("\t\t请输入:");
        scanf("%d", &y);
    }
    return 0;
}

int shanchuFlight()// 删除航班函数 
{
    char ID[20];
    printf("请输入航班ID\n");
    scanf("%s", ID);
    Phangban pre = pFlight;
    Phangban p = pre->next;
    while (p != NULL) {
        if (!strcmp(ID, p->hbID)) {
            pre->next = p->next;
            free(p);
            return 1;
        }
        pre = p;
        p = p->next;
    }
    return 0;

}

int duibiFlight(hangban* flight, char ID[])
//对比航班的编号,防止增加航班时,出现重复 
{
    hangban* p = flight;
    while (p != NULL)
    {
        if (!strcmp(ID, p->hbID))
        {
            return 0;//航班ID重复
        }
        p = p->next;
    }
    //ID不重复
    return 1;

}





int main()
{
    initFlight();//初始化航班链表 
    Create(flight1);//将航标信息插入链表 
    menu();    //菜单
    return 0;
}

int menu()//菜单界面函数 
{
    int i;
    do {
        {
            system("color 9e");//用 system(“color 0A”); 其中color后面的0是背景色代号,A是前景色代号
            printf("\n");
            printf("\n");
            printf("                            航空订票系统\n");
            printf("***********************************************************\n");
            printf("                            1.  查询航班             \n");
            printf("                            2.  搜索航班             \n");
            printf("                            3.  订票                 \n");
            printf("                            4.  退票                 \n");
            printf("                            5.  录入与删除           \n");
            printf("***********************************************************\n");
            printf("                           输入需要办理的业务:");
            scanf("%d", &i);
        }
        switch (i)
        {
        case 1:
            printfall(pFlight);//打印全部航班信息 
            system("PAUSE");//system(“PAUSE”)可以实现冻结屏幕,便于观察程序的执行结果;
            menu();
            break;
        case 2:
            sousuoFace();// 搜索界面 
            system("PAUSE");
            menu();
            break;
        case 3:
            dingpiaoFace();//订票界面 
            system("PAUSE");
            menu();
            break;
        case 4:
            tuipiaoFace();//退票界面 
            system("PAUSE");
            menu();
            break;
        case 5:
            charushanchuFace();//插入和删除新节点 
            system("PAUSE");
            menu();
            break;
        default:
            menu();//返回主菜单 
        }
    } while (0);
    return 0;
}

以上代码如有问题,欢迎评论或者私我解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值