航空客运订票系统的设计与实现
发布时间
阅读量:
阅读量
1 设计要求
1.1 问题描述
实现航空系统客运订票的主要业务活动。例如,浏览和查询航班信息、机票预订和办理退票等。
1.2 需求分析
(1)航班管理。每条航班所涉及的信息有:目的地、航班号、航班日期、航班时间、乘员定额、余票量。
(2)客户管理。有关订票的客户信息(包括姓名、订票量、舱位等级(1,2和3)以及等候替补的客户名单(包括姓名、所需票量)。
(3)系统实现的主要操作和功能:
查询航班。根据旅客提出的终点站名输出下列信息:航班号、飞行日期、余票额。
承办订票业务。根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满或者余票少于订票额,则需要重新询问客户需求;若需要,可等待排队候补。
承办退票业务。根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所有退票额能满足该客户的要求,则为其办理订票手续,否则依次询问其他排队候补的客户。
2 概要设计
航空客运订票系统由航班管理系统、乘客订票系统、乘客退票系统、乘客管理系统、退出系统组成。
航班管理系统,主要完成添加航班、查看航班、查询航班、删除航班、返回主菜单功能。
乘客订票系统,主要完成乘客购票功能。
乘客退票系统,主要完成乘客退票和将满足要求的候补乘客变成航班乘客。
乘客管理系统,主要完成输出航班乘客信息、输出候补乘客信息、返回主菜单功能。
退出系统,退出航空客运订票系统。
下面为全部代码
#include<iostream>
#include<windows.h> //用到system("cls)清屏 system("pause")暂停
#include<iomanip>
#include<cstdlib>
using 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; //存输入的数,用于switch
switch (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++; //查询到航班,则航班总数加1
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; //输出航班信息
p = p->next; //移动到下一个结点
}
if (n == 0) {
system("cls"); // 清屏
cout << "目前没有任何航班!!!!!" << endl;
}
else
printf("目前有%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; //获取输入的数,用于switch
switch (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;
}
else
return;
}
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++; //总数加1
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) //乘客总数不为0
cout << "总共有" << 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) //总数不为0
cout << "总共有" << 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; //存放输入的数字,用于switch
switch (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; //获取输入的数,用于switch
switch (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;
}
}
}
全部评论 (0)
还没有任何评论哟~
