通达学院程序设计报告(2017 / 2018 学年第一学期)题目:航空客运订票系统专业计算机科学与技术学生姓名班级学号指导教师吴晓诗指导单位计算机学院计算机科学与技术系日期2017.11.21-2017.12.8航空客运订票系统一、课题内容和要求1.航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。
要求在TC或VC环境下设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
2.要求:(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括姓名、订票量)以及等候替补的客户名单(包括姓名、所需票量)。
(2)作为模拟系统,全部数据可以只存放在内存中。
(3)通过此系统可以实现如下功能:①录入功能:可以录入航班情况②查询功能:根据客户提供的终点站名进行查询,可以输出以下信息:航班号、飞机号、星期几飞行和余票量等。
也可以根据航班号,查询飞机某个航线的情况。
③订票功能:根据客户提出的要求(姓名、终点站名、订票数量)查询该航班的余票量情况。
如尚有足够的余票,则为客户办理订票手续;若已满员或余票量少于订票数量,则需要重新询问客户要求,如需要,可登记排队候补。
二、需求分析)运行环境(软、硬件环境)Window10 64位codeblocks使用语言:c++2)输入的形式和输入值的范围由航空公司输入航线情况并以单链表的形式存储在内存里面3)输出的形式描述通过客户的输入输出相应的内容4)功能描述用户通过本系统实现该航空公司的查询、订票(包括候补)、和退票功能 5)测试数据三、概要设计1)流程图示意2)抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述,参见书或ppt 及实验)一条航线包括了目的地、航班号、飞机号、飞行周日、总票数、余票量、订票人员、候补人员等信息,我们可以将航线看成一类,定义为一个类,而订票人员通用的属性是:姓名、订票张数和舱位等级,候补人员通用属性是姓名和订票张数,可以将订票人员和候补人员定义为结构体,航线定义为一个类,类包括了两个结构体。
具体定义如下:class transportNode//航线类节点{friend class transport;private:char end_place [10];//目的地char line_num [8];//航班名int plane_num[8];//航班号int fly_data;//飞行日期int total;//乘员限额int left;//余票struct booknode{public:char name[10];//乘客姓名int pnum;//票数};struct sparenode{public:char name[10];//乘客姓名int pnum;//票数int houbuNode;//记录排队等候的顾客的数量transportNode *next;3)功能模块设计(如主程序模块设计)主程序中录入航线的信息,然后进入主菜单,再实现其他的功能,类transport 中包括了除去主菜单以外的所有的功能函数class transportpublic:transport();//无参构造函数构造头节点status addmoreairline ();//记录航班信息string end_name,air_line ();//实现根据输入的目的地查询的功能status book ();//实现旅客的订票功能status delete_cus ();//实现退票功能private:transportNode *head;};void open();//进入主菜单四:详细设计#include <windows.h> //dos控制命令头文件#include <iostream> //输入输出头文件#include <iomanip> //控制格式头文件#include <conio.h> //getchar()用到#include <string> //字符串函数using namespace std; //标准命名空间#define OK 1 //函数结果状态码#define ERROR 0 //函数结果状态码#define TRUE 1 //函数结果状态码#define FALSE 0 //函数结果状态码typedef int status; //函数结果状态码static int cusnum=1; //顾客数(全局变量)static int airnum=1; //航线数(全局变量)struct customer{ //顾客结构体char name[9]; // 顾客名char line_num[8]; // 航班号int piaonum; // 座位号struct customer *next; // 下一个结点};typedef customer *Linkcustomer; //候补顾客结构体typedef struct houbuNode{ //候补顾客结构体char name[9]; //姓名char end_place[10]; //终点站int pnum; //票数struct houbuNode *next; //指针域}* houbucustomer;struct LinkQueue{houbucustomer front,rear; //队头队尾指针};struct airline{ //航线结构体char line_num[8]; // 航班号char plane_num[8]; // 飞机号char end_place[20]; // 目的的char fly_data[20]; // 飞行周日int total; // 座位总数int left; // 剩余座位Linkcustomer custom; // 订票顾客指针LinkQueue houbucus; // 候补顾客指针struct airline *next; // 下一个结点};typedef airline *Linkairline; //初始化航线链表void init_airline(Linkairline &l){l=new airline[sizeof(airline)]; //产生头结点,并始l指向此头结点if(!l){ //存储分配失败exit(0); //退出}l->next=NULL; //头结点的指针域为空}void init_customer(Linkcustomer &l){ //初始化顾客链表(同初始化航线链表) l=new customer[sizeof(customer)];if(!l){exit(0);}l->next=NULL;}//初始化候补顾客队列链表(同初始化航线链表)void init_houbucustomer(LinkQueue &Q){Q.front=Q.rear=new houbuNode[sizeof(houbuNode)];//if(!Q.front){exit(0);}Q.front->next=NULL;}status airLineEmpty(Linkairline L) //判断airline链表是否为空{if(L->next) //非空return FALSE;elsereturn TRUE;}// airline链表插入操作status insert_airline(Linkairline L,int i,char *line_num,char *plane_num,char *end_place, char *fly_data,int total,int left,Linkcustomer custom,LinkQueue houbucus){int j=0; //计数器Linkairline s,p=L; //p指向头结点while(p&&j<i-1) //寻找第i-1个结点{j++;p=p->next;}if(!p||j>i-1) //i小于1或大于表长return ERROR; //插入失败s=new airline[sizeof(airline)]; //生成新结点strcpy(s->line_num , line_num); //给新结点赋值strcpy(s->plane_num , plane_num);strcpy(s->end_place , end_place);strcpy(s->fly_data , fly_data);s->total =total;s->left =left;s->custom=custom;s->houbucus=houbucus;s->next=p->next; //新结点指向原第i个结点p->next=s; //原第i-1个结点指向新结点return OK; //插入成功}// customer链表插入操作(同airline链表插入操作)status insert_customer(Linkcustomer L,int i,char *name,char *line_num,int piaonum){ int j=0;Linkcustomer s,p=L;while(p&&j<i-1){j++;p=p->next;}if(!p||j>i-1)return ERROR;s=new customer[sizeof(customer)];strcpy(s->name , name);strcpy(s->line_num , line_num);s->piaonum=piaonum;s->next=p->next;p->next=s;return OK;}// houbucustomer入队操作void insert_houbucustomer(LinkQueue &Q,char *name,char *end_place,int pnum){ houbucustomer p;p=new houbuNode[sizeof(houbuNode)];strcpy(p->name , name);strcpy(p->end_place , end_place);p->pnum=pnum;p->next=NULL;Q.rear->next=p;Q.rear=p;}// houbucustomer出队操作status del_houbucustomer(LinkQueue &Q,houbuNode &hbnode){houbucustomer p;p=Q.front->next;strcpy(,p->name);strcpy(hbnode.end_place,p->end_place);hbnode.pnum=p->pnum;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;delete p;return OK;}//houbucustomer输出操作void print_houbucustomer(LinkQueue Q){houbucustomer p=Q.front->next;cout<<"候补顾客为:"<<endl;cout<<"姓名终点站票数"<<endl;while(p){cout<<p->name<<" "<<p->end_place<<" "<<p->pnum;p=p->next;}cout<<endl;}status print_airline(Linkairline l) // 打印航线信息{cout<<endl<<"航班号飞机号目的地飞行周日总票数余票数"<<endl;Linkairline p=l->next ;for(;p!=NULL;p=p->next ){cout<<setiosflags(ios::left)<<setw(9);cout<<p->line_num<<setw(10)<<p->plane_num<<setw(9)<<p->end_place<<setw(12)<<p->fly_data<<setw(10)<<p->total<<setw(8)<<p->left<<setw(12)< <<endl;}return OK;}status print_airline(Linkairline l,string name,int N)// 打印航线信息(print_airline重载){string info;bool flag=true;Linkairline p=l->next;for(;p!=NULL;p=p->next ){if(N==1)info=p->end_place;elseinfo=p->line_num;if(info==name){flag=false;cout<<endl<<"航班号飞机号目的地飞行周日总票数余票数"<<endl;cout<<setiosflags(ios::left)<<setw(9);//输出格式控制cout<<p->line_num<<setw(10)<<p->plane_num<<setw(9)<<p->end_place<<setw(12)<<p->fly_data<<setw(10)<<p->total<<setw(8)<<p->left<<setw(12)<<endl;break;}}if(flag){if(N==1)cout<<"对不起,没有终点站为"<<name<<"的航班"<<endl;elsecout<<"对不起,没有航班号为"<<name<<"的航班"<<endl;}return OK;}status print_customer(Linkcustomer l) // 打印顾客信息{Linkcustomer p=l->next ;for(;p!=NULL;p=p->next ){cout<<setiosflags(ios::left);//输出格式控制cout<<setw(10)<<p->name<<setw(12)<<p->line_num<<p->piaonum<<endl;}return OK;}//航班信息录入status addmoreairline(Linkairline l,Linkcustomer custom,LinkQueue houbucus){char line_num1[8],plane_num1[8],fly_data1[8],end_place1[8];int total1=100,left1=80;cout<<"请输入以下信息:"<<endl<<endl;cout<<"航班号:";cin>>line_num1;cout<<"飞机号:";cin>>plane_num1;cout<<"目的地:";cin>>end_place1;cout<<"飞行周日:";cin>>fly_data1;cout<<"总票数:";cin>>total1;cout<<"余票数:";cin>>left1;insert_airline(l,airnum,line_num1,plane_num1,end_place1,fly_data1,total1,left1,custom,houbuc us);airnum++;cout<<"添加成功!"<<endl;print_airline(l);return OK;}// 修改airline链表中的数据status modefy_airline(Linkairline l,char *line_num){Linkairline p=l->next;for(;p!=NULL;p=p->next ){if(strcmp(line_num,p->line_num )==0){p->left++;return OK;}}cout<<"没有这个航班,无法完成修改任务!"<<endl;return ERROR;}status book(Linkairline l,char *end_place,Linkcustomer c,char *name, //订票int num,LinkQueue houbu){Linkairline p=l->next; //p指向第一个结点Linkcustomer q=c->next; //q指向第一个结点for(;p!=NULL;p=p->next) //查找{if(strcmp(end_place,p->end_place )==0){if(p->left-num >=0) //剩余票数大于订票数{cout<<"订票成功!"<<endl;insert_customer(c,cusnum,name,p->line_num,num);//向顾客链表插入记录p->left-=num; //订票成功,剩余票数减少cusnum++; //顾客数加一return OK;}else //剩余票数小于订票数{char pd;cout<<"对不起,余票不足!"<<endl;cout<<"是否需要排队候补(Y/N):";cin>>pd;if(pd=='Y'||pd=='y')//需要排队候补{insert_houbucustomer(houbu,name,end_place,num);//向候补队列插入记录cout<<"候补登记成功!"<<endl;print_houbucustomer(houbu);}else{}}return 0;}}cout<<"对不起,没有终点站为"<<end_place<<"的航班!"<<endl;return ERROR;}status delete_cus(Linkcustomer h,Linkairline l,char *name,LinkQueue houbu) //退票{Linkcustomer p=h->next,pr=h; //p指向顾客链表首结点char line_num[8];houbuNode hbnode;while(p!=NULL) //循环查找退票顾客{if(strcmp(name,p->name )==0){strcpy(line_num,p->line_num );for(int i=0;i<p->piaonum;i++)//更改该航线的剩余票数modefy_airline(l,line_num);pr->next =p->next ;cout<<"顾客"<<p->name<<"退票成功!"<<endl;cusnum--; //顾客数减一if(houbu.front->next==NULL){}else{del_houbucustomer(houbu,hbnode);//候补顾客出队if(l->next->left>=hbnode.pnum)//剩余票数多于第一位的客户订的票数{//为排在第一位的客户办理订票业务book(l,hbnode.end_place,h,,hbnode.pnum,houbu);cout<<"候补顾客"<<<<"订票成功!"<<endl;}else //剩余票数少于排在第一位的客户订的票数{cout<<"票数仍然不足!";}}return OK;}pr=pr->next ;p=pr->next ;}cout<<"无此顾客,无法退票!"<<endl; //未查到顾客信息return ERROR;}void open() //打开进度条,程序信息简介{cout<<"\n\n\n\n\n\n **************欢迎使用航空订票系统************\n\n\n";const int M=25;int k;cout<<"\n 〓程序加载中>>>> ";for (k=1;k<=M;k++){cout<<"■";Sleep(100);}system("cls");cout<<endl<<"【载入完成】\a"<<endl<<endl;cout<<" 前言"<<endl<<endl;cout<<" 欢迎使用『航空订票系统』,本程序实现了以下功能:\n\n";cout<<" ①录入功能:可以录入航班情况\n\n";cout<<" ②查询功能:根据客户提供的终点站名或航班号进行查询。