C++课程设计:航空客运订票系统

本文介绍了一款基于C++的航空客运订票系统的设计与实现。系统支持多级用户管理,包括乘客查询航班、订票、退票等功能,以及管理员查看航班信息、修改票价等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

航空客运订票系统
 

选题背景

方案论证

过程论述

运行结果

完整代码

 

选题背景

①背景: 现在人们更多的使用飞机作为出行交通工具,因此机票票务市场也在快速发展。国内外航空事业在飞速发展,各航空公司对票务管理的要求也在不断的提高,对航空的信息管理系统提出了更高的要求。

②应达到的技术要求: 为实现航空管理员和乘客的不同需要,技术上应实行多级用户。管理员能够查看所有航班信息,乘客名单以及修改航班票价等;乘客用户能够查询航班信息,购买机票以及退票等操作。
为实现上述功能,需要完成文本文件的基本编辑:增、删、改、查,创建多文件适应不同需要,同时为了在内存中创建对应对象,需要良好的面向对象的知识。

③指导思想: 为航空管理员和乘客提高良好的管理系统。

 

方案论证(设计理念)

** 设计理念:**   基于C++程序设计基础,实现了多级用户管理。乘客用户可以查询航班,根据旅客提出的终点站名输出信息;根据提供的航班号进行购票,可选择购票数,若有余票,则为用户办理订票;若无余票或余票不满足用户需求,可询问旅客是否登记排队候补。乘客可退票,若有旅客在次航班候补,可按顺序为满足订票数的乘客购票。 航空公司管理员可查看所有航班信息和乘客名单,并且可以修改航班票价。

实现方案:
  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分支选择调用不同的函数,到达不同的界面,实现各种功能。如图所示;
在这里插入图片描述

 

运行结果

图1 乘客登录
            图1 乘客登录

在这里插入图片描述
            图2 乘客用户界面

在这里插入图片描述
            图3 乘客查询航班

在这里插入图片描述
            图4 乘客订票(余票足)

在这里插入图片描述
            图5乘客订票(余票不足)

在这里插入图片描述
            图6 乘客退票

在这里插入图片描述
            图7 管理员登录

在这里插入图片描述
            图8 管理员操作界面

在这里插入图片描述
            图9 管理员查看所有航班信息

在这里插入图片描述
            图10 管理员查看乘客名单

在这里插入图片描述
            图11 管理员修改票价

 

完整代码

#include<iostream>
#include<fstream>
#include<stdio.h>
#include<cstring>
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.youkuaiyun.com/download/qq_33966112/11095091

### C++开发航空客运订票系统的方法 #### 功能模块设计 航空客运订票系统的主要功能模块包括航班信息管理、乘客信息管理和预订处理。这些模块共同协作来完成整个订票流程。 - **航班信息管理**:负责存储和检索有关各个航班的数据,如出发地、目的地、起飞时间等[^2]。 - **乘客信息管理**:维护旅客个人信息及其联系方式,以便于后续服务和支持。 - **预订处理**:提供接口让用户查询可用座位并提交订单;同时更新数据库中的剩余座位数量和其他相关信息。 #### 数据结构定义 为了有效地表示上述三个核心组件,在程序内部可以采用类(class)的形式来进行抽象建模: ```cpp class Flight { private: string flightNumber; string departureCity; string arrivalCity; DateTime departureTime; // 自定义日期时间类或使用第三方库 public: void setFlightDetails(const string& num, const string& depCity, const string& arrCity, const DateTime& time); }; class Passenger { private: string name; int age; string phoneNumber; public: void setPassengerInfo(const string& n, int a, const string& phone); }; ``` 对于更复杂的业务逻辑,则可以通过继承机制扩展基本的功能类,从而创建特定类型的实体对象(例如商务舱/经济舱)。此外还可以引入模板技术提高代码重用率以及增强灵活性。 #### 用户交互界面构建 考虑到用户体验的重要性,除了后台数据操作外还需要搭建友好的前端页面供客户浏览选择心仪班次及填写个人资料。这里推荐利用图形化工具包Qt框架下的Widgets控件集快速组装所需部件,并通过信号槽连接方式实现事件驱动编程模式简化控制流走向的设计难度。 ```cpp #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.resize(800, 600); window.setWindowTitle("Airline Reservation System"); window.show(); return app.exec(); } ``` 以上仅展示了部分基础概念和技术要点,实际项目可能涉及更多细节考量比如异常捕获、并发访问同步等问题都需要深入研究解决办法以确保最终产品的稳定性和可靠性。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值