航空客运订票系统
选题背景
方案论证
过程论述
运行结果
完整代码
①背景: 现在人们更多的使用飞机作为出行交通工具,因此机票票务市场也在快速发展。国内外航空事业在飞速发展,各航空公司对票务管理的要求也在不断的提高,对航空的信息管理系统提出了更高的要求。
②应达到的技术要求: 为实现航空管理员和乘客的不同需要,技术上应实行多级用户。管理员能够查看所有航班信息,乘客名单以及修改航班票价等;乘客用户能够查询航班信息,购买机票以及退票等操作。
为实现上述功能,需要完成文本文件的基本编辑:增、删、改、查,创建多文件适应不同需要,同时为了在内存中创建对应对象,需要良好的面向对象的知识。
③指导思想: 为航空管理员和乘客提高良好的管理系统。
实现方案:
C++ MVC模式:win32控制台为界面(view)、文本文件提供数据(model)、面向对象中类、实例及链表。应用运行环境为visual studio 2010。
这个方案的特点:
1.win32控制台界面简洁、用户交互良好,同时可以让程序制作者更专注于逻辑代码的编辑和落实上。虽然UI略显简陋,但是用户提示足够详细,界面上的不足完全可以由技术和逻辑弥补。
2.使用文本文件可直接打开获取、修改、保存数据,直观性好。
3.使用面向对象的方法设计程序,以管理员和乘客为基本点出发,结构和层次更清晰。同时先将文本文件的数据读取到内存中,作为链式储存,容易插入、删除数据,再与用户进行交互,避免了重复打开文件,多次操作文件带来的效率低下的问题。同时也利用了操作内存速度远比操作文件速度要快的特点,提升了程序性能。
1.建立对象:
实现多级用户管理。乘客用户可以查询航班,根据旅客提出的终点站名输出信息;票或余票不满足用户需求,可询问旅客是否登记排队候补。乘客可退票,若有旅客在次航班候补,可按顺序为满足订票数的乘客购票。航空公司管理员可查看所有航班信息和乘客名单,并且可以修改航班票价。
定义结构Client,表示乘客,具有next指针指向下一结点,可以实现链式结构。
具有next指针指向下一结点,可以实现链式结构。定义类对象airline,表示航班:
具有next指针指向下一结点,可以实现链式结构。具有终点站名、航班号、飞机号、飞行日、乘员定额、余票量、已订票的客户名单文件名以及等候替补的客户名单文件名等私有数据成员,保证了数据的安全性。以及一系列的友元函数,可以完成对航班的访问,来实现特定的功能。
2.通过文本文件读取、存放数据
将文本文件的数据读取到内存中,作为链式储存,容易插入、删除数据,再与用户进行交互,避免了重复打开文件,多次操作文件带来的效率低下的问题。同时也利用了操作内存速度远比操作文件速度要快的特点,提升了程序性能。
本实验设计了一个航班信息的文本文件,以及每条航班线对应有一个乘客名单文件和排队候补旅客名单文件,这两份名单文件名在该航班信息中存放。
程序运行时,将航班信息文本文件读取到内存中,每次数据有修改时,对文本文件进行数据修改。
以下是文本内容:
3.基本功能的实现(以下简单介绍几个较为重要的函数)
本次实验对登录界面进行简化,实际中较为复杂,乘客登录只需输入姓名,管理员登录输入管理员密码(666666)。根据不同的登录方式将进入不同的用户界面。
查询功能:
乘客根据终点站名查询航班,通过链表顺序查找,匹配终点站名,并判断是否找到,若找到则打印航班信息。
订票功能:
系统根据乘客提供的航班号链式顺序查找该航班,若找到,则询问购票数。
然后分为两个分支:一是余票量满足购票数,则购票成功,改用户列入乘客名单
二是余票不足,则继续询问,是否登记排队候补
退票功能:
分为两个部分,一是退票,二是若有用户排队候补次航班,则根据需求票数和排队顺序为候补乘客购票。
在该航班的乘客名单中根据姓名查找,若找到则询问退票数量。
首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户
修改票价功能:
管理员通过输入航班号,找到该航班进行票价修改
4.完善用户界面系统
通过main函数完成,switch分支选择调用不同的函数,到达不同的界面,实现各种功能。如图所示;
#include
#include
#include
#include
using namespace std;
struct client
{ /*客户*/
char name[20]; /*姓名*/
int ordering_number; /*订票量*/
int grade; /*舱位等级*/
client *next;
};
class airline
{ /*航班信息*/
private:
char end_station[20]; /*终点站名*/
char air_num[10]; /*航班号*/
char plane_num[10]; /*飞机号*/
char day[7]; /*飞行日(星期几)*/
int people_quota; /*乘员定额*/
double price; /*票价*/
int more_ticket; /*余票量*/
char passenger_list[50]; /*乘客名单*/
char waiting_list[50]; /*等候替补的客户名单*/
static int number; /*航班总数*/
public:
void print()
{/*打印航班信息*/
cout<<" 终点站名:"<<end_station<<" \t 航班号:"<<air_num<<"\t 飞机号:"<<plane_num
<<"\n 时间:"<<day<<"\t\t 乘员定额:"<<people_quota<<"\n 票价:"<<price<<"\t\t 余票量:"<<more_ticket<<"\n\n";
}
friend airline* get_airline(); /*读取文件中的航班信息*/
friend void client_list();
friend void put_airline(airline*);
friend void print_airline();
friend void search();
friend void booking();
friend void refund();
friend client* get_passenger(airline);
friend client* get_wait(airline);
friend void put_passenger(airline,client*);
friend void put_wait(airline,client*);
friend void re_price();
};
int airline::number=0;
char Name[20]=""; /*用于用户登录的姓名*/
airline *L; /*全局变量,航线指针*/
void app_client(client *c,client *q)
{/*增加乘客*/
client *p=c;
while(p->next) p=p->next;
p->next=q;
q->next=NULL;
}
int login()
{/*登录*/
int f;
char password[20],*p="666666"; /*管理员密码*/
cout<<"*************************登录*****************************\n\n";
cout<<" 1.乘客登录 2.管理员登录\n 请选择用户身份:";
fflush(stdin); /*刷新输入流缓冲区*/
while(f=int(getchar())-48)
{
if(f==1)
{
cout<<" 姓名:";
cin>>Name;
cout<<"\n\t\t登录成功!!\n\n**********************************************************\n\n";
return 1;
}
else if(f==2)
{
cout<<"\n 输入管理员密码(提示6个6):";
fflush(stdin);
while(cin>>password)
{
if(!strcmp(password,p))
{
cout<<"\n\t\t登录成功!!\n\n**********************************************************\n\n";
return 2;
}
else cout<<"\n密码错误!! 请重新输入\n\n 输入管理员密码:";
}
}
else cout<<"输入错误!! 请重新输入\n 请选择用户身份: ";
}
}
void search()
{/*查询操作*/
char s[20];
int i=0;
cout<<"*************************查询*****************************\n\n\t\t终点站名:";
cin>>s;
while(i<L->number&&strcmp(s,L[i].end_station)) i++; /*按链表顺序匹配终点站名*/
if(i<L->number)
L[i].print();
else cout<<"\n无此航班信息!\n\n";
cout<<"**********************************************************\n\n";
}
void refund()
{/*退票操作*/
char s[20];
int i=0,n;
cout<<"*************************退票*****************************\n\n\t\t航班号:";
cin>>s;
while(i<L->number&&strcmp(s,L[i].air_num)) i++; /*按航班号匹配*/
if(i<L->number)
{/*找到此航班*/
client *c1=get_passenger(L[i]),*c2=get_wait(L[i]),*p=c1,*q,*r;
/*获得次航班的乘客和候补乘客链表*/
while(p->next&&strcmp(Name,p->next->name)) p=p->next; /*姓名查找*/
if(p->next)
{/*找到该用户姓名*/
cout<<"您在"<<L[i].air_num<<"航班(终点站:"<<L[i].end_station<<")订了"
<<p->next->ordering_number<<"张票\n请输入退票数量:";
do
{/*输入退票数*/
cin>>n;
if(n>0&&n<=p->next->ordering_number) break;
else cout<<"\n输入错误!!请重新输入:";
}while(1);
if(n==p->next->ordering_number)
{/*全部退票*/
r=p->next;
q=r->next;
p->next=q;
delete r;
}
else if(n<p->next->ordering_number) p->next->ordering_number-=n; /*退部分票*/
L[i].more_ticket+=n; /*余票增加*/
int f=1;
while(L[i].more_ticket&&f)
{/*有余票且未访问完所有候补乘客*/
p=c2;
while(p->next&&L[i].more_ticket<p->next->ordering_number) p=p->next;
if(p->next)
{/*找到需求票数满足的*/
L[i].more_ticket-=p->next->ordering_number;
r=p->next;
q=r->next;
p->next=q;
app_client(c1,r);
}
else f=0; /*访问完*/
}
put_passenger(L[i],c1); /*刷新乘客名单*/
put_wait(L[i],c2);
}
else cout<<"\n退票错误!! 您没有在此航班订票\n";
}
else cout<<"\n无此航班信息!\n\n";
cout<<"\n 退票完成!\n";
cout<<"**********************************************************\n\n";
put_airline(L);
}
void booking()
{/*订票操作*/
char s[20];
int i=0,n,y,g;
cout<<"*************************订票*****************************\n\n\t\t航班号:";
cin>>s;
while(i<L->number&&strcmp(s,L[i].air_num)) i++;
if(i<L->number)
{/*找到该航班*/
L[i].print();
client *c1=get_passenger(L[i]);
client *c2=get_wait(L[i]);
cout<<" 舱位等级(1:头等舱,2:普通舱,3:经济舱):";cin>>g;
cout<<" 购买票数:";
do
{/*合理输入购买票数*/
cin>>n;
if(n<=L[i].people_quota) break;
else
cout<<"错误!!不能超过最大乘员数("<<L[i].people_quota<<"),重新输入:";
}while(1);
if(L[i].more_ticket)
{/*有余票*/
if(n<=L[i].more_ticket)
{/*余票足够*/
client *p=new client;
strcpy_s(p->name,Name);
p->ordering_number=n;
L[i].more_ticket-=n;
p->grade=g;
app_client(c1,p);
cout<<"\n 购票完成!\n";
}
else if (n>L[i].more_ticket)
{/*余票小于购买数*/
int x;
client *p1=new client,*p2=new client;
/*询问用户*/
cout<<"\n\n(1:只买"<<L[i].more_ticket<<"张 2:买"<<L[i].more_ticket<<"张,"
<<n-L[i].more_ticket<<"张等候 3:不买)\n 余票不足"<<n<<"张,是否继续购买?:";
cin>>x;
switch(x)
{
case 1:
strcpy_s(p1->name,Name);
p1->ordering_number=L[i].more_ticket;
L[i].more_ticket=0;
p1->grade=g;
app_client(c1,p1);
cout<<"\n 购票完成!\n";
break;
case 2:
strcpy_s(p1->name,Name);
p1->ordering_number=L[i].more_ticket;
p1->grade=g;
app_client(c1,p1);
strcpy_s(p2->name,Name);
p2->ordering_number=n-L[i].more_ticket;
L[i].more_ticket=0;
p2->grade=g;
app_client(c2,p2);
cout<<"\n 购票完成!\n";
break;
}
}
}
else
{/*无余票*/
cout<<"\n 无余票! 是否排队等候票?(1:是 0:否)";cin>>y;
if(y)
{/*进入等候名单*/
client *p=new client;
strcpy_s(p->name,Name);
p->ordering_number=n;
p->grade=g;
app_client(c2,p);
}
}
put_passenger(L[i],c1); /*刷新乘客名单*/
put_wait(L[i],c2);
}
else cout<<"\n无此航班信息!\n\n";
cout<<"\n**********************************************************\n\n";
put_airline(L);
}
void put_wait(airline l,client *c)
{/*输出等候替补名单*/
fstream f;
client *p=c->next;
f.open(l.waiting_list,ios::out|ios::trunc);
while(p)
{
f<<p->name<<" "<<p->ordering_number<<" "<<p->grade<<'\n';
p=p->next;
}
f.close();
}
client* get_passenger(airline l)
{/*读取某航班乘客信息*/
fstream f;int i=0;
client *c=new client,*p=new client,*q=c;
f.open(l.passenger_list,ios::in);
while(f>>p->name>>p->ordering_number>>p->grade)
{
q->next=p;
p=new client;
q=q->next;
}
q->next=NULL;
f.close();
return c;
}
void put_passenger(airline l,client *c)
{/*输出乘客信息到文件*/
fstream f;
client *p=c->next;
f.open(l.passenger_list,ios::out|ios::trunc);
while(p)
{
f<<p->name<<" "<<p->ordering_number<<" "<<p->grade<<'\n';
p=p->next;
}
f.close();
}
client* get_wait(airline l)
{/*读取某航班等候替补名单*/
fstream f;int i=0;
client *c=new client,*p=new client,*q=c;
f.open(l.waiting_list,ios::in);
while(f>>p->name>>p->ordering_number>>p->grade)
{
q->next=p;
p=new client;
q=q->next;
}
q->next=NULL;
f.close();
return c;
}
airline* get_airline()
{/*读取文件中的航班信息*/
fstream f;int i=0;
airline *line=new airline [100];
f.open("航班信息.txt",ios::in);
while(f>>line[i].end_station>>line[i].air_num>>line[i].plane_num>>
line[i].day>>line[i].people_quota>>line[i].price>>line[i].more_ticket
>>line[i].passenger_list>>line[i].waiting_list)
i++;
line->number=i;
f.close();
return line;
}
void put_airline(airline *L)
{/*输出修改后的航班信息*/
fstream f;int i;
f.open("航班信息.txt",ios::out);
for(i=0;i<L->number;i++) f<<L[i].end_station<<" "<<L[i].air_num<<" "
<<L[i].plane_num<<" "<<L[i].day<<" "<<L[i].people_quota<<" "<<
L[i].price<<" "<<L[i].more_ticket<<" "<<L[i].passenger_list<<" "<<L[i].waiting_list<<'\n';
f.close();
}
void print_airline()
{/*打印所有航班信息(管理员操作)*/
L=get_airline();
int i=0;
cout<<"*************************航班信息*************************\n\n";
for(int i=0;i<L->number;i++)
L[i].print();
cout<<"\n**********************************************************\n\n";
}
void client_list()
{/*查看某航班乘客名单(管理员操作)*/
int i=0;char s[20],*g;
cout<<"*************************乘客名单*************************\n\n\t\t航班号:";
cin>>s;
while(i<L->number&&strcmp(s,L[i].air_num)) i++;
if(i<L->number)
{
client c;
fstream f;
f.open(L[i].passenger_list,ios::in);
cout<<"\n 已购票乘客名单:\n";
while(f>>c.name>>c.ordering_number>>c.grade)
{
switch(c.grade)
{
case 1:g="头等舱";break;
case 2:g="普通舱";break;
case 3:g="经济舱";
}
cout<<"\t姓名:"<<c.name<<"\t舱位等级:"<<g<<"\t购票数:"<<c.ordering_number<<endl;
}
f.close();
f.open(L[i].waiting_list,ios::in);
cout<<"\n 候补订票乘客名单:\n";
while(f>>c.name>>c.ordering_number>>c.grade)
{
switch(c.grade)
{
case 1:g="头等舱";break;
case 2:g="普通舱";break;
case 3:g="经济舱";
}
cout<<"\t姓名:"<<c.name<<"\t舱位等级:"<<g<<"\t预订票数:"<<c.ordering_number<<endl;
}
f.close();
}
else cout<<"\n无此航班信息!\n\n";
cout<<"\n**********************************************************\n\n";
}
void re_price()
{/*修改某航班票价(管理员操作)*/
int i=0,p;char s[20];
cout<<"*************************修改票价*************************\n\n\t\t航班号:";
cin>>s;
while(i<L->number&&strcmp(s,L[i].air_num)) i++;
if(i<L->number)
{
cout<<" 终点站名:"<<L[i].end_station<<"\t 飞机号:"<<L[i].plane_num
<<"\n\n\t 原票价:"<<L[i].price<<"\n\t 新票价:";
cin>>p;
L[i].price=p;
cout<<"\n 修改票价完成\n";
}
else cout<<"\n无此航班信息!\n\n";
put_airline(L);
cout<<"\n**********************************************************\n\n";
}
int form1()
{/*乘客用户界面*/
int s;
cout<<"*************************用户界面*************************\n\n";
cout<<" 1.查询航班\t 2.订票\t 3.退票 0.退出登录\n\n\t\t选择操作:";
fflush(stdin);
while(s=int(getchar())-48)
{
if(s>=0&&s<=3)
{
cout<<"\n**********************************************************\n\n";
return s;
}
else cout<<"\t输入错误!! \n\t请重新选择操作:";
}
}
int form2()
{/*管理员界面*/
int s;
cout<<"***********************管理员界面*************************\n\n";
cout<<" 1.航班信息\t 2.乘客名单\t 3.修改票价 0.退出登录\n\n\t\t选择操作:";
fflush(stdin);
while(s=int(getchar())-48)
{
if(s>=0&&s<=3)
{
cout<<"\n**********************************************************\n\n";
return s;
}
else cout<<"\t输入错误!! \n\t请重新选择操作:";
}
}
int main()
{
L=get_airline();
do
{
int f=1;
switch(login())
{
case 1:/*乘客界面*/
system("pause");
system("cls");
do
{
switch(form1())
{
case 1:/*调用查询函数*/
system("cls");
search();
system("pause");
system("cls");
break;
case 2:/*订票*/
system("cls");
booking();
system("pause");
system("cls");
break;
case 3:/*退票*/
system("cls");
refund();
system("pause");
system("cls");
break;
case 0:/*退出登录,返回上一层*/
f=0;
system("cls");
}
}while(f);
break;
case 2:/*管理员界面*/
system("pause");
system("cls");
do
{
switch(form2())
{
case 1:/*查看所有航班信息*/
system("cls");
print_airline();
system("pause");
system("cls");
break;
case 2:/*查看乘客名单*/
system("cls");
client_list();
system("pause");
system("cls");
break;
case 3:/*修改票价*/
system("cls");
re_price();
system("pause");
system("cls");
break;
case 0:/*退出登录,返回上一层*/
f=0;
system("cls");
}
}while(f);
}
}while(1);
}
注: 需要在工程项目中Debug文件夹中加入以下文本文件
其中:北京 001 KN9500 星期一 150 2000 18 001a.txt 001b.txt
对应:终点站 航班号 飞机号 星期 总票数 票价 余票数 已购票文件名 候补订票文件名
工程文件打包下载地址:
https://download.csdn.net/download/qq_33966112/11095091