数据结构课程设计:17、售票处的服务系统(***)
售票处的服务系统(***)
要用到文件操作,使用CodeBlocks,建议放到同一目录下
[问题描述]
航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
[系统要求]
- 设民航售票处的计算机系统可以为客户提供下列各项服务:
- 查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
- 承办订票业务:根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需要重新询问客户要求。若需要,可预约登记排队等候。
- 承办退票业务:根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户。
[测试数据]
由学生任意指定,但报告上要求写出多批数据测试结果。
[实现提示]
每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。这最后两项显然是一个线性表和一个队列。为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预料,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。
[文件内容]
[设计思路]
- 从文件读入航班信息
- 结构使用栈和队列
- 链式储存乘客信息
- 处理座位关系
[代码及注释]
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
#define MAXSIZE 111 /*最大航班数*/
#define MAXNUM 3 /*最大座位数*/
int flag=0; /*判断结束标志*/
//结构
typedef struct QNode{string name; /*乘客姓名*/string id; /*乘客身份证*/int num; /*乘客排队等待号*/struct QNode *next; /*指针域*/
}QNode,*QueuePtr; /*结点类型,结点指针类型*/
typedef struct{QueuePtr Front; /*头指针*/QueuePtr Real; /*尾指针*/
}LinkQueue; /*链队类型*/
typedef struct people{string name; /*乘客姓名*/string id; /*乘客身份证*/int seat; /*乘客座位*/people *next; /*指针域*/
}People,*LinkList; /*结点类型,结点指针类型*/
typedef struct{string name; /*飞机号*/string id; /*航班号*/string to; /*目的地*/string date; /*日期*/int sum; /*总座位数*/int use; /*使用的座位数*/int remain; /*剩余的座位数*/int waitnum; /*等待总数*/LinkList L; /*购票的乘客,使用链表*/LinkQueue Q; /*排队等待的乘客,使用链队*/
}Single; /*结点类型*/
typedef struct{Single air[MAXSIZE]; /*MAXSIZE个飞机结点*/int num; /*航班总数*/
}FLight; /*使用顺序表表示航班系统*/
//子函数
void SinglePrint(FLight &F); /*打印单一航班信息*/
bool Read(FLight &F); /*从文件读入数据并初始化*/
bool EmptyQueue(FLight &F,int index); /*判断队列是否为空*/
void EnQueue(FLight &F,int index); /*进队*/
void DeQueue(FLight &F,int index,LinkList &S);/*出队*/
void SingleBooking(FLight &F,int index); /*单一乘客订票*/
void Booking(FLight &F); /*订票总操作*/
void SingleBack(FLight &F,int index); /*单一乘客退票*/
void Back(FLight &F); /*退票总操作*/
void Print(FLight &F); /*打印全部航班信息*/
void Show(FLight &F); /*打印具体航班信息*/
void Menu(FLight &F); /*操作汇总*/
//具体内容
void SinglePrint(FLight &F)
{cout<<"输入目的地:";string TO;cin>>TO;int vis=0; /*判断标志*/for(int k=1;k<=F.num;++k)if(F.air[k].to==TO){vis=1;break;}if(!vis){cout<<"没有查询到此航班"<<endl;return;}cout<<" ---------------------------------------------------------------------"<<endl;cout<<"|查询到目的地为"<<TO<<"的航班如下! |"<<endl;cout<<"| 飞机号"<<" 航班号"<<" 目的地"<<" 日期"<<" 总座位数"<<" 剩余座位数"<<" 排队等待数 |"<<endl;for(int k=1;k<=F.num;++k)if(F.air[k].to==TO)cout<<"| "<<F.air[k].name<<" "<<F.air[k].id<<" "<<F.air[k].to<<" "<<F.air[k].date<<" "<<F.air[k].sum<<" "<<F.air[k].remain<<" "<<F.air[k].waitnum<<" |"<<endl;cout<<" ---------------------------------------------------------------------"<<endl;
}
bool Read(FLight &F)
{ifstream in("in.txt");int k=1;while(1){in>>F.air[k].name>>F.air[k].id>>F.air[k].to>>F.air[k].date;if(F.air[1].name==""){cout<<"文件读取失败"<<endl;cout<<"-------------------------------------"<<endl;return false;}F.air[k].sum=MAXNUM;F.air[k].use=0;F.air[k].remain=MAXNUM;F.air[k].waitnum=0;F.air[k].L=new People;F.air[k].L->next=NULL;F.air[k].Q.Front=F.air[k].Q.Real=new QNode;F.air[k].Q.Front->next=NULL;/*初始化*/if(F.air[k].name=="")break;++k;}F.num=k-1; /*航班数量*/cout<<"文件读取成功"<<endl;return true;
}
bool EmptyQueue(FLight &F,int index)
{if(F.air[index].Q.Front==F.air[index].Q.Real)return true;return false;
}
void EnQueue(FLight &F,int index)
{cout<<"输入登机人的姓名与身份证号(空格隔开):";QueuePtr S=new QNode;cin>>S->name>>S->id;S->next=NULL;F.air[index].waitnum++;F.air[index].Q.Real->next=S;F.air[index].Q.Real=S;S->num=F.air[index].waitnum;cout<<endl;cout<<"恭喜您,预约成功,您的信息如下,请牢记!"<<endl;cout<<"--------------------"<<endl;cout<<"|飞机号:"<<F.air[index].name<<endl;cout<<"|航班号:"<<F.air[index].id<<endl;cout<<"|姓 名:"<<S->name<<endl;cout<<"|身份证:"<<S->id<<endl;cout<<"|等待号:"<<S->num<<endl;cout<<"--------------------"<<endl;
}
void DeQueue(FLight &F,int index,LinkList &S)
{QueuePtr T=F.air[index].Q.Front->next;while(T){T->num--;/*该乘客后面的乘客等待号减1*/T=T->next;}T=F.air[index].Q.Front->next;S->name=T->name;S->id=T->id;F.air[index].Q.Front->next=T->next;if(T==F.air[index].Q.Real)F.air[index].Q.Real=F.air[index].Q.Front;/*如果出队的是队尾元素,重新赋值*/delete T;
}
void SingleBooking(FLight &F,int index)
{cout<<"输入登机人的姓名与身份证号(空格隔开):";LinkList S=new People;S->next=NULL;cin>>S->name>>S->id;LinkList P=F.air[index].L;while(P->next)P=P->next;/*找到链表队尾指针*/F.air[index].use++;F.air[index].remain--;P->next=S;P=S; /*尾插法*/S->seat=F.air[index].use;cout<<endl;cout<<"恭喜您,订票成功,您的信息如下,请妥善保存!"<<endl;cout<<"--------------------"<<endl;cout<<"|飞机号:"<<F.air[index].name<<endl;cout<<"|航班号:"<<F.air[index].id<<endl;cout<<"|姓 名:"<<S->name<<endl;cout<<"|身份证:"<<S->id<<endl;cout<<"|座位号:"<<S->seat<<endl;cout<<"--------------------"<<endl;
}
void Booking(FLight &F)
{Print(F);cout<<endl;cout<<" <订票业务>"<<endl<<endl;string DATE,ID;int SUM;cout<<"输入日期、航班号及订票数(空格隔开):";cin>>DATE>>ID>>SUM;int index=0;for(int i=1;i<=F.num;++i)if(F.air[i].id==ID&&F.air[i].date==DATE){index=i;break;}if(!index){cout<<"<<<<没有此航班"<<endl;return;}if(F.air[index].remain>=SUM)while(SUM--)SingleBooking(F,index);else{cout<<"<<<<该航班余额票小于您的订票额,还剩下"<<F.air[index].remain<<"张票,是否继续购买?(y/n)";char ch;cin>>ch;if(ch=='y'){int others=SUM-F.air[index].remain;int k=F.air[index].remain;while(k--)SingleBooking(F,index);cout<<endl;cout<<"<<<<剩下的"<<others<<"人已经自动进入预约业务"<<endl;cout<<" <预约业务>"<<endl<<endl;while(others--)EnQueue(F,index);}else return;}
}
void SingleBack(FLight &F,int index)
{cout<<"登机人的姓名与身份证号(空格隔开):";string NAME,ID;cin>>NAME>>ID;LinkList T=F.air[index].L;int vis=0;while(T->next){if(T->next->id==ID&&T->next->name==NAME){vis=1;LinkList p=T->next;T->next=p->next;F.air[index].use--;F.air[index].remain++;delete p;cout<<"<<<<退票成功"<<endl;break;}T=T->next;}QueuePtr p=F.air[index].Q.Front;if(!vis)/*从已经购票的乘客没有找到要退票的乘客,进入预约订票寻找*/{while(p->next){if(p->next->id==ID&&p->next->name==NAME){vis=1;QueuePtr t=p->next;while(t){t->num--;t=t->next;}/*此人后面的等待号减1*/t=p->next;p->next=t->next;if(t==F.air[index].Q.Real)F.air[index].Q.Real=F.air[index].Q.Front;delete t;cout<<"<<<<退票成功"<<endl;break;}p=p->next;}if(!vis)cout<<"<<<<没有该乘客,输入信息有误"<<endl;}else{if(!EmptyQueue(F,index)){cout<<"已经有人退票!"<<endl;cout<<"姓名为"<<F.air[index].Q.Front->next->name;cout<<"身份证为"<<F.air[index].Q.Front->next->id<<"的用户现在是否订票?(y/n)";char op;cin>>op;if(op!='y')return;LinkList S=new People;S->next=NULL;DeQueue(F,index,S);F.air[index].use++;F.air[index].remain--;LinkList P=F.air[index].L;while(P->next)P=P->next;P->next=S;P=S;/*尾插法*/F.air[index].waitnum--;/*总等待人数减1*/for(int i=1;i<=MAXNUM;++i){LinkList p=F.air[index].L->next;while(p){if(p->seat==i)break;p=p->next;}if(!p)S->seat=i;}/*为新订票的乘客分配座位*/cout<<"订票成功,您的信息如下"<<endl;cout<<"----------------------------------"<<endl;cout<<"姓名"<<S->name<<endl;cout<<"身份证"<<S->id<<endl;cout<<"航班"<<F.air[index].id<<endl;cout<<"座位号"<<S->seat<<endl;cout<<"----------------------------------"<<endl;}}
}
void Back(FLight &F)
{Print(F);cout<<endl;cout<<" <退票业务>"<<endl<<endl;string DATE,ID;int SUM;cout<<"输入日期、航班号及退票数(空格隔开):";cin>>DATE>>ID>>SUM;int index=0;for(int i=1;i<=F.num;++i)if(F.air[i].id==ID&&F.air[i].date==DATE){index=i;break;}if(!index){cout<<"<<<<没有此航班"<<endl;return;}while(SUM--)SingleBack(F,index);
}
void Print(FLight &F)
{cout<<" ---------------------------------------------------------------------"<<endl;cout<<"| 航班总数:"<<F.num<<" |"<<endl;cout<<"| 飞机号"<<" 航班号"<<" 目的地"<<" 日期"<<" 总座位数"<<" 剩余座位数"<<" 排队等待数 |"<<endl;for(int k=1;k<=F.num;++k)cout<<"| "<<F.air[k].name<<" "<<F.air[k].id<<" "<<F.air[k].to<<" "<<F.air[k].date<<" "<<F.air[k].sum<<" "<<F.air[k].remain<<" "<<F.air[k].waitnum<<" |"<<endl;cout<<" ---------------------------------------------------------------------"<<endl;
}
void Show(FLight &F)
{for(int k=1;k<=F.num;++k){cout<<"--------------------航班号:"<<F.air[k].id<<"--------------------"<<endl<<endl;cout<<" <已订票的乘客>"<<endl<<endl;LinkList p=F.air[k].L->next;while(p){cout<<"|姓 名:"<<p->name<<endl;cout<<"|身份证:"<<p->id<<endl;cout<<"|座位号:"<<p->seat<<endl<<endl;p=p->next;}cout<<" <预约排队的乘客>"<<endl<<endl;QueuePtr q=F.air[k].Q.Front->next;while(q){cout<<"|姓 名:"<<q->name<<endl;cout<<"|身份证:"<<q->id<<endl;cout<<"|座位号:"<<q->num<<endl<<endl;q=q->next;}}
}
void Menu(FLight &F)
{cout<<" -----------------------------------"<<endl;cout<<" | 欢迎来到航空客运订票系统 |"<<endl;cout<<" |-----------------------------------|"<<endl;cout<<" | 1--查询航线 |"<<endl;cout<<" | 2--订票 |"<<endl;cout<<" | 3--退票 |"<<endl;cout<<" | 4--查询全部航班 |"<<endl;cout<<" | 5--查询各航班具体情况 |"<<endl;cout<<" | 其他--退出 |"<<endl;cout<<" -----------------------------------"<<endl;int op;cout<<"输入你的选择:";cin>>op;switch(op){case 1:SinglePrint(F);break;case 2:Booking(F);break;case 3:Back(F);break;case 4:Print(F);break;case 5:Show(F);break;default :flag=1;cout<<"欢迎下次再来!"<<endl;}
}
int main()
{FLight F;if(Read(F))while(1){Menu(F);if(flag)break;system("pause");system("cls");}return 0;
}
[简单展示]
数据结构课程设计:17、售票处的服务系统(***)相关推荐
- 【数据结构课程设计报告】电话号码查询系统(Java实现)
数据结构课程设计报告 电话号码查询系统 数据结构课程设计报告 一.需求分析 二.系统功能划分及设计 1.存储结构设计 2.系统的功能架构设计 3.模块设计 3.代码实现 一.需求分析 问题描述:路径规 ...
- 数据结构课程设计之火车票订票系统实现(C语言/C++版本)
课题描述 编制一个程序,火车票订票的业务活动包括:车次查询.订票.退票.用户管理等. 需求分析 用户信息包括用户姓名.身份证号.用户电话.用户所购列车号.订单号:列车信息包括:列车车站号.车票起点.车 ...
- 数据结构课程设计【航空订票系统】
/* * Copyright (c) 2017,烟台大学计算机学院 * All right reserved. * 文件名称:main.cpp * 作者:于嵩 * 完成日期:2017年12月22日 * ...
- 计算机课程设计收费管理系统,数据结构课程设计报告---收费停车场管理系统
数据结构课程设计报告---收费停车场管理系统 (20页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 XX大学计算机与电子 信息学院< ...
- 校园导游系统数据结构课程设计(附完整代码)
1 问题内容与目的要求 1.1 算法产生的背景: Floyd 算法又称为加点法.插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法.该算法名称以创始人之一.1978 年图灵奖获 ...
- 山东大学数据结构课程设计实验五(低风险出行系统)
数据结构课程设计(五)--低风险出行系统 前言 题目要点 ①生成数据 ②要给定两种最短路解法 ③创立文件 ④模拟时间流动并与用户交互 代码讲解 源代码 写在最后 前言 数据结构课程设计第五题是每一个同 ...
- java校院导游程序课程设计_数据结构课程设计之校园导游系统
数据结构课程设计之校园导游系统 放假到现在终于安下心来要搞点学习了,现在对放假前一周的数据结构课设做一个总结,快放假的时候搞数据结构课设,当时满脑子都是期末考试忙着复习,根本没啥心思去做.所以课设一共 ...
- 数据结构课程设计——机票售卖系统(C++)
引言 这学期最后的数据结构课程设计需要我们完成一个简单的小程序,我选择了一个机票售卖系统,实现了一些基本的功能:因为时间给的比较短,又赶在复习周补课,所以并没有什么突出的地方,我就在这里聊聊我的代码实 ...
- 公交换乘系统c语言,数据结构课程设计报告(公交换乘).docx
课 程 设 计 报 告 题目: 武昌地区公交查询与换乘推荐 课程名称: 数据结构课程设计 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 计算机科学与技术学院 任 务 书 设计内容 掌握图.查 ...
- 数据结构课程设计 公交系统
大家好! 这是我的第一篇文章,是将这学期的数据结构课设报告整理出来的.可能还有些小错误,还请多多指正. 数据结构课程设计<公交系统> 一.引言 (一)课题描述 (二)设计要求 二.总体设计 ...
最新文章
- SSRS 2012 交互式报表 -- 层次性文档结构图
- New ADODB.Connection ADOX.Catalog 提示user-defined type not defined
- 设计模式学习(二): 观察者模式 (C#)
- 走财运健步——青龙羊毛
- TensorFlow贡献者黄文坚:解读对比13个深度学习框架后的选择
- 【python图像处理】图像的增强(ImageEnhance类详解)
- Supervised Descent Method and its Applications to Face Alignment
- 谷歌浏览器中打开IE
- 获得Local IP Address (C++实现)
- 杠上谷歌,微软利用人工智能加码必应搜索的市场竞争力
- 微信小程序 网学习址
- 【王道计组笔记】总线(2):性能指标分析
- html发送邮jmail,[分享]一个ASP写的JMAIL邮件发送测试程序,测试空间是否可以发送邮...
- A*算法之野人传教士问题 python解法
- 量子计算基础——矩阵语言
- 前端实现打电话、发短信邮件
- 一夜狼人杀-一觉睡醒( ̄ー ̄)发现游戏结束了。。
- win10如何打开计算机端口,win10系统开启计算机端口的操作方法
- 招聘网站岗位职位标签大全(爬虫所用)
- 视频笔记:理解 channels - Kavya Joshi
热门文章
- craig gentry_为Craig投票!
- 【C语言】动态内存管理(heap)
- puppet知识简记
- 【CNN】——涨点模块SE,CBAM,CA对比
- Unity拓展——菜单栏拓展
- vue中img本地图片地址的具体使用
- 紫罗兰永恒花园rust简谱_Letter《紫罗兰永恒花园》4.5话ED 简谱
- 2022年最新的Detectron 2 (0.6) 安装流程(联想笔记本Y9000K+Anaconda+Win 11 +RTX3070)
- 王者更新后苹果手机服务器维护,苹果手机不能更新王者荣耀怎么解决
- LSDSLAM算法解析