> 文档中心 > 航空客运订票系统的设计与实现

航空客运订票系统的设计与实现

1 设计要求
1.1 问题描述
实现航空系统客运订票的主要业务活动。例如,浏览和查询航班信息、机票预订和办理退票等。
1.2 需求分析
(1)航班管理。每条航班所涉及的信息有:目的地、航班号、航班日期、航班时间、乘员定额、余票量。
(2)客户管理。有关订票的客户信息(包括姓名、订票量、舱位等级(1,2和3)以及等候替补的客户名单(包括姓名、所需票量)。
(3)系统实现的主要操作和功能:
 查询航班。根据旅客提出的终点站名输出下列信息:航班号、飞行日期、余票额。
 承办订票业务。根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满或者余票少于订票额,则需要重新询问客户需求;若需要,可等待排队候补。
 承办退票业务。根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所有退票额能满足该客户的要求,则为其办理订票手续,否则依次询问其他排队候补的客户。
2 概要设计
航空客运订票系统由航班管理系统、乘客订票系统、乘客退票系统、乘客管理系统、退出系统组成。
航班管理系统,主要完成添加航班、查看航班、查询航班、删除航班、返回主菜单功能。
乘客订票系统,主要完成乘客购票功能。
乘客退票系统,主要完成乘客退票和将满足要求的候补乘客变成航班乘客。
乘客管理系统,主要完成输出航班乘客信息、输出候补乘客信息、返回主菜单功能。
退出系统,退出航空客运订票系统。

下面为全部代码

#include#include   //用到system("cls)清屏 system("pause")暂停#include#includeusing namespace std;struct Cu {string name; //乘客名字int amount[3];//各个仓票数string number;//  手机号     string sfz; //身份证Cu *next;};struct  F {string zd; //航班终点string number;//航班号码string data;//航班日期string time;//航班时间int rs;//航班总载客人数int ws[3];//航班各个等级仓位人数int jg[3];//航班各个等级仓位价格Cu *have;//航班乘客链Cu *nohave;//候补乘客链F *next;};void shanchu(F *&f) {    //删除航班system("cls");  //清屏cout << "请输入想删除的航班号:";string s;cin >> s;  //获取输入字符串,存输入的航班号 F *p = f;  //指向航班头结点F *pre = f->next;  //指向首结点for (; pre != NULL && pre->number != s; p = pre, pre = p->next); //找到目标航班结点和前一个结点if (pre != NULL) {Cu *t = pre->have;  //指向航班乘客链if (t != NULL) {for (Cu *tre = t->next; tre != NULL; t = tre, tre = t->next)delete t;delete t;   //删除航班乘客链所有结点}t = pre->nohave;    //指向航班候补乘客链if (t != NULL) {for (Cu *tre = t->next; tre != NULL; t = tre, tre = t->next)delete t;delete t;    //删除候补乘客链所有结点}p->next = pre->next;delete pre;   //删除该航班结点cout << "航班号为" << s << "的航班已被删除!" << endl;system("pause");//暂停}}void chaxun(F *f) {    //查询航班while (1) {system("cls"); // 清屏cout << "1.按目的地查询" << endl    //查询航班界面<< "2.按航班号查询" << endl<< "3.按日期查询" << endl<< "4.返回" << endl<< "请输入数字:";int k;cin >> k;    //存输入的数,用于switchswitch (k) {case 1: {system("cls"); // 清屏cout << "请输入目的地:";string s;cin >> s;    //输入字符串,存取航班目的地int i = 0;   //存取符合条件的航班数F *p = f;    //指向航班头结点cout << "目的地 航班号  日期  时间  头等舱座位数 普通舱座位数 经济舱座位数 头等舱价格 普通舱价格 经济舱价格" << endl;while (p != NULL) {if (p->zd == s) {cout << setw(6) << p->zd << setw(7) << p->number << setw(6) << p->data<< setw(6) << p->time << setw(12) << p->ws[0] << setw(13) << p->ws[1]<< setw(12) << p->ws[2] << setw(12) << p->jg[0] << setw(12) << p->jg[1]<< setw(10) << p->jg[2] << endl;   //输入符合条件的航班详细信息i++;  //有符合条件的航班,则总数加1}p = p->next; //移动到下一结点}printf("总共有%d条航班到达此地点\n", i);if (i == 0) {system("cls"); // 清屏cout << "没有到该地点的航班" << endl;}system("pause");//暂停break;}case 2: {system("cls"); // 清屏cout << "请输入航班号:";string s;cin >> s;     //获取输入的航班号int i = 0;    //存放符合条件的航班数F *p = f;     //指向航班cout << "目的地 航班号  日期  时间  头等舱座位数 普通舱座位数 经济舱座位数 头等舱价格 普通舱价格 经济舱价格" << endl;while (p != NULL) {if (p->number == s) {cout << setw(6) << p->zd << setw(7) << p->number << setw(6) << p->data<< setw(6) << p->time << setw(12) << p->ws[0] << setw(13) << p->ws[1]<< setw(12) << p->ws[2] << setw(12) << p->jg[0] << setw(12) << p->jg[1]<< setw(10) << p->jg[2] << endl;   //输出符合条件的航班的详细信息i++;  //符合条件,则符合航班总数加1}p = p->next;  //指向下一结点}if (i == 0) {system("cls"); // 清屏cout << "没有找到该航班" << endl;}system("pause");//暂停break;}case 3: {system("cls"); // 清屏cout << "请输入日期(例如:10-20):";string s;cin >> s;   //获取输入的字符串,存放输入的日期int i = 0;  //符合条件的航班总数F *p = f;   //指向航班的头结点cout << "目的地 航班号  日期  时间  头等舱座位数 普通舱座位数 经济舱座位数 头等舱价格 普通舱价格 经济舱价格" << endl;while (p != NULL) {if (p->data == s) {cout << setw(6) << p->zd << setw(7) << p->number << setw(6) << p->data<< setw(6) << p->time << setw(12) << p->ws[0] << setw(13) << p->ws[1]<< setw(12) << p->ws[2] << setw(12) << p->jg[0] << setw(12) << p->jg[1]<< setw(10) << p->jg[2] << endl;    //输出符合条件的航班的详细信息i++;   //符合条件的航班总数加一}p = p->next;  //移动到下一结点}printf("今天总共有%d航班\n", i);if (i == 0) {system("cls"); // 清屏cout << "今天没有航班" << endl;}system("pause");//暂停break;}case 4:break;default:system("cls"); // 清屏cout << "你输入的数字不对!!!!!" << endl;system("pause");//暂停break;}if (k == 4)break;}}void chakan(F *f) {      //查看航班int n = 0; //存飞机航班总数F *p = f;  //指航班头结点p = p->next;     //移动到航班首结点system("cls"); // 清屏cout << "目的地 航班号  日期  时间  头等舱座位数 普通舱座位数 经济舱座位数 头等舱价格 普通舱价格 经济舱价格" << endl;while (p != NULL) {n++;  //查询到航班,则航班总数加1cout << setw(6) << p->zd << setw(7) << p->number << setw(6) << p->data<< setw(6) << p->time << setw(12) << p->ws[0] << setw(13) << p->ws[1]<< setw(12) << p->ws[2] << setw(12) << p->jg[0] << setw(12) << p->jg[1]<< setw(10) << p->jg[2] << endl;   //输出航班信息p = p->next;  //移动到下一个结点}if (n == 0) {system("cls"); // 清屏cout << "目前没有任何航班!!!!!" << endl;}elseprintf("目前有%d趟航班\n", n);system("pause");//暂停}void create(F *&f) {   //增加航班while (1) {system("cls"); // 清屏cout << "填写添加的航班的详细信息" << endl;F *p = new F;  //创建新的飞机结点cout << "请输入终点:";cin >> p->zd;cout << "请输入航班号(例如:CX1234):";cin >> p->number;cout << "请输入航班日期(例如:10-13):";cin >> p->data;cout << "请输入航班时间(例如:15:30):";cin >> p->time;cout << "请输入位置总数:";cin >> p->rs;cout << "请输入头等舱座位数:";cin >> p->ws[0];cout << "请输入普通舱座位数:";cin >> p->ws[1];cout << "请输入经济舱座位数:";cin >> p->ws[2];cout << "请输入头等舱价格:";cin >> p->jg[0];cout << "请输入普通舱价格:";cin >> p->jg[1];cout << "请输入经济舱价格:";cin >> p->jg[2];   //输入详细的航班信息p->have = p->nohave = NULL;  //航班乘客链和候补乘客链置空if (((p->ws[0] + p->ws[1] + p->ws[2]) != p->rs) || p->jg[0] <= p->jg[1] || p->jg[0] <= p->jg[2] || p->jg[1] <= p->jg[2]) {cout << "航班信息输入有误!!!!!" << endl<< "位置总数要等于头等舱、普通舱、经济舱位置之和!!!!!"<< "经济舱价格>普通舱价格>经济舱函数!!!!!"<< "航班添加失败!!!!!" << endl;}  //如果信息输入不符合条件,则添加失败else {cout << "航班添加成功!" << endl;p->next = f->next;f->next = p;   //采用头插法,插入新的飞机结点}system("pause");//暂停system("cls"); // 清屏cout << "是否继续录入航班,Y表示继续,N表示退出!" << endl<< "请输入:";char a;cin >> a;   //获取输入的字符,是Y则继续添加航班if (a != 'Y')break;}}void hangban(F *&f) {      //航班管理系统while (1) {system("cls"); // 清屏cout << "1.添加航班" << endl;      //航班管理系统主界面cout << "2.查看航班" << endl;cout << "3.查询航班" << endl;cout << "4.删除航班" << endl;cout << "5.返回主菜单" << endl;cout << "请输入你想使用的功能:";int k;cin >> k;   //获取输入的数,用于switchswitch (k) {case 1:create(f);    //调用create(F *&f),添加航班break;case 2:chakan(f);    //调用chankan(F *f),查看航班break;case 3:chaxun(f);    //调用chaxun(F *f),查询航班break;case 4:shanchu(f);   //调用shanchu(F *&f),删除航班break;case 5:break;default:system("cls"); // 清屏cout << "你输入的数字不对!!!!!" << endl;system("pause");//暂停break;}if (k == 5)break;}}int  Length(Cu *p) {    //求航班候补链结点长度int n = 0;while (p != NULL) {n++;p = p->next;}return n;}void dingpiao(F *&f) {   //乘客订票系统while (1) {system("cls"); // 清屏F *p = f->next;if (p == NULL) {cout << "目前暂无任何航班!!!!" << endl;system("pause");//暂停return;}else {cout << "请输入航班日期(例:10-20):";string s;cin >> s;  //存放输入的日期cout << "请输入目的地:";string s1;cin >> s1; //存放输入的目的地cout << "请输入航班号(例:CX1234):";string s2;cin >> s2; //存放输入的航班号for (; p != NULL; p = p->next) {if (p->data == s && p->zd == s1 && p->number == s2)break;}    //在航班中找有没有符合条件的航班if (p == NULL) {   //如果是空指针,说明没有cout << "你输入的信息有误,请重新输入!!!!" << endl;system("pause");//暂停}else {//有该航班,开始订票system("cls"); // 清屏cout << "下面请输入详细的订票信息" << endl;Cu *t = new Cu;  //创建新的乘客结点cout << "请输入你的名字:";cin >> t->name;cout << "请输入你想买的头等舱票数:";cin >> t->amount[0];cout << "请输入你想买的普通舱票数:";cin >> t->amount[1];cout << "请输入你想买的经济舱票数:";cin >> t->amount[2];cout << "请输入你的手机号:";cin >> t->number;cout << "请输入你的身份证:";cin >> t->sfz;   //输入详细的乘客信息if (t->amount[0] <= p->ws[0] && t->amount[1] <= p->ws[1] && t->amount[2] <= p->ws[2]){t->next = p->have;p->have = t;    // 订票小于等于航班剩余的票数, 则将该结点采用头插法,插入到航班乘客链p->ws[0] -= t->amount[0];p->ws[1] -= t->amount[1];p->ws[2] -= t->amount[2];  ///航班票数减去乘客订购的票数int n = t->amount[0] * p->jg[0] + t->amount[1] * p->jg[1] + t->amount[2] * p->jg[2];cout << "恭喜你购票成功!" << endl<< "你总共花了" << n << "元" << endl;system("pause");//暂停}else {cout << "票数不足,";cout << "您是否想成为候补人员,Y代表是,N代表否,请输入:";char n;cin >> n;  //存放输入的字符,是否想成为候补乘客if (n == 'Y') {Cu *t1 = p->nohave;   //指向头结点int l = Length(p->nohave); //求出候补乘客链的长度if (l == 0) {    //l==0,代表候补乘客链没有结点p->nohave = t;  //直接将该结点变成首结点t->next = NULL;  //下一结点置空cout << "你已候补成功!" << endl;system("pause");//暂停}else {for (l = l - 1; l > 0; l--)t1 = t1->next;   //移动的到尾结点t1->next = t;t->next = NULL;  //采用尾插法,将该结点插入到候补乘客链cout << "你已经候补成功!" << endl;system("pause");//暂停}}}return;}}}}void houbu(F *&f, string s) {system("cls"); // 清屏cout << "是否要将候补乘客中满足票数的变为航班乘客,Y表示是,N表示否,请输入:";char c;cin >> c; //存放输入的字符,判断要不要把符合条件的候补乘客变成航班乘客if (c == 'Y') {F *p = f;for (; p != NULL && p->number != s; p = p->next);int n = 0;   //存放变成航班乘客的人数while (1) {bool b = false;  //用于判断有没有人符合条件Cu *t = p->nohave;  //指向航班候补乘客链的首结点for (; t != NULL; t = t->next) {if (t->amount[0] <= p->ws[0] && t->amount[1] <= p->ws[1] && t->amount[2] <= p->ws[2]) {if (t == p->nohave) {p->nohave = t->next; //如果他是首结点,则将该结点的下一个结点变成航班乘客链的首结点t->next = p->have;p->have = t;  //采用头插法将该结点插入到航班乘客链p->ws[0] -= t->amount[0];p->ws[1] -= t->amount[1];p->ws[2] -= t->amount[2];   //航班票数减去乘客订购的票数b = true;   //代表有候补乘客变成航班乘客break;}else{  //不是候补乘客链的首结点Cu *tre = p->nohave;for (; tre->next != t && tre != NULL; tre = tre->next);  //找到该结点的前一个结点tre->next = t->next;  //将该结点从候补乘客链删除t->next = p->have;p->have = t;      //采用头插法将该结点插入到航班乘客链中p->ws[0] -= t->amount[0];p->ws[1] -= t->amount[1];p->ws[2] -= t->amount[2];  //航班票数减去乘客订购的票数b = true;//代表有人从候补乘客变成航班乘客break;}}}if (b == false)   //没有人从候补乘客变成航班乘客,则跳出循环break;}cout << "已将满足条件的候补乘客变为航班乘客!" << endl;system("pause");//暂停return;}elsereturn;}void tuipiao(F *&f) {while (1) {system("cls"); // 清屏cout << "请输入你的航班号:";string s;cin >> s;     //存放输入的航班号F *p = f;    //指向航班的头结点for (; p != NULL; p = p->next) {if (p->number == s)break;}     //找是否有该航班if (p == NULL) {   //如果为空,说明没有该航班,重新输入航班信息cout << "没有找到该航班" << endl<< "请重新输入!" << endl;system("pause");//暂停}else {   //有符合条件的航班,则开始退票cout << "请输入你的名字:";string s1;cin >> s1;    //存放输入的名字Cu *t = p->have;  //指向航班乘客链 for (; t != NULL; t = t->next) {if (t->name == s1)break;}    //查找航班上是否有该乘客if (t == NULL) {    //为空,说明没有该乘客cout << s << "航班上没有该乘客" << endl<< "请重新输入!!!!" << endl;system("pause");//暂停}else {    //有该乘客,则开始退票if (p->have == t) {p->have = t->next;   //如果找到的结点是首结点,则将首结点变成该结点的下一个结点cout << "退票成功!" << endl;p->ws[0] += t->amount[0];p->ws[1] += t->amount[1];p->ws[2] += t->amount[2];  //航班票数加上乘客订票数system("pause");//暂停delete t;   //删除该结点houbu(f, s);}else {   //如果不是首结点Cu *tre = p->have;   //指向首结点for (; tre->next != t && tre != NULL; tre = tre->next);  //找到该乘客的前一个结点tre->next = t->next;   //删除该结点cout << "退票成功!" << endl;p->ws[0] += t->amount[0];p->ws[1] += t->amount[1];p->ws[2] += t->amount[2];  // 航班票数加上乘客订的票数delete t;      //释放结点空间system("pause");//暂停houbu(f, s);}return;}}}}void xinxi1(F *&f) {F *p = f;   //指向航班的头结点while (1) {system("cls"); // 清屏cout << "请输入航班号(例:CX1234):";string s;cin >> s;     //存放输入的航班号for (; p != NULL; p = p->next) {if (p->number == s)break;}    //查找有没有符合条件的航班if (p == NULL) {   //为空,代表没有符合条件的cout << "没有该航班,请重新输入!" << endl;system("pause");//暂停}else {    //有符合条件的航班int n = 0; //存放航班乘客总数cout << "乘客名字 头等舱票数 普通舱票数 经济舱票数手机号身份证" << endl;Cu *t = p->have;  //指向航班乘客链的首结点for (; t != NULL; t = t->next) {n++;  //总数加1cout << setw(8) << t->name << setw(10) << t->amount[0] << setw(10) << t->amount[1]<< setw(10) << t->amount[2] << setw(16) << t->number << setw(20) << t->sfz << endl;}      //输出乘客的详细信息if (n != 0)  //乘客总数不为0cout << "总共有" << n << "个人乘坐" << s << "航班" << endl;else {system("cls"); // 清屏cout << "没有人乘坐该航班!" << endl;}system("pause");//暂停return;}}}void xinxi2(F *&f) {F *p = f;while (1) {system("cls"); // 清屏cout << "请输入航班号(例:CX1234):";string s;cin >> s; //存放输入的航班号for (; p != NULL; p = p->next) {if (p->number == s)break;}   //查找有没有符合条件的航班if (p == NULL) {  //为空,说明没有符合条件的航班cout << "没有该航班,请重新输入!" << endl;system("pause");//暂停}else {   //有符合条件的航班int n = 0;   //存放候补乘客总数cout << "乘客名字 头等舱票数 普通舱票数 经济舱票数手机号身份证" << endl;Cu *t = p->nohave; //指向候补乘客链的首结点for (; t != NULL; t = t->next) {n++;   //候补乘客总数加一cout << setw(8) << t->name << setw(10) << t->amount[0] << setw(10) << t->amount[1]<< setw(10) << t->amount[2] << setw(16) << t->number << setw(20) << t->sfz << endl;}  //输出详细的乘客if (n != 0)  //总数不为0cout << "总共有" << n << "个人候补" << endl;else {system("cls"); // 清屏cout << "没有人候补该航班!" << endl;}system("pause");//暂停return;}}}void guanli(F *&f) {while (1) {system("cls"); // 清屏cout << "1.航班乘客信息" << endl;   //乘客管理系统界面cout << "2.候补乘客信息" << endl;cout << "3.返回主菜单" << endl;cout << "请输入你想使用的功能:";int k;cin >> k; //存放输入的数字,用于switchswitch (k) {case 1:system("cls"); // 清屏xinxi1(f);     //调用xinxi1(F *f),输出航班乘客信息break;case 2:system("cls"); // 清屏xinxi2(f);      //调用xinxi2(F *f),输出候补乘客信息break;case 3:system("cls"); // 清屏break;default:system("cls"); // 清屏cout << "你输入的数字不对!!!!!" << endl;system("pause");//暂停break;}if (k == 3)   //输入为3,则返回主系统break;}}int main() {F *f = new F;//创建飞机头结点f->have = f->nohave = NULL;//将飞机头结点的航班乘客链和候补乘客链置空f->next = NULL; // 飞机头结点的下一结点置空while (1) {system("cls");//清屏cout << "**********航空订票系统**********" << endl;    //主系统界面cout << "**1.航班管理系统**" << endl;cout << "**2.乘客订票系统**" << endl;cout << "**3.乘客退票系统**" << endl;cout << "**4.乘客管理系统**" << endl;cout << "**5.退出系统    **" << endl;cout << "********************************" << endl;cout << "请输入你想使用的功能:";int k = 0;cin >> k;//获取输入的数,用于switchswitch (k) {case 1:system("cls"); // 清屏hangban(f);   //调用hangban(F *&f)函数,进入航班管理系统break;case 2:system("cls"); // 清屏dingpiao(f);   //调用dingpiao(F * &f)函数,进入乘客订票系统break;case 3:system("cls");// 清屏tuipiao(f);//调用tuipiao(F *&f)函数,进入乘客退票系统break;case 4:system("cls");// 清屏guanli(f);//调用guanli(F *&f)函数,进入乘客管理系统break;case 5:system("cls");// 清屏cout << "欢迎下次使用!" << endl;system("pause");//暂停exit(1);   //退出程序default:system("cls");// 清屏cout << "你输入的数字不对!!!!!" << endl;system("pause"); //暂停break;}}}

ChineseCigarette