前言

飞机订票系统是充分运用C++相关知识,并结合STL(标准模板库)实现的一个简易飞机订票程序。该项目是学完C++后的一次综合练习,旨在让读者充分理解C++相关知识。

一、功能描述

1、将人群分为两类:管理员、客户。

2、管理员首次登录系统需要注册账号,然后就可以登录账号,登陆账号之后就可以进行录入、删除、修改、查询航班信息操作。

3、客户可直接进行订票、退票、查询航班操作,但是只能查询航班的部分信息。

4、录入:管理员可以录入航班的航班号、飞机编号、出发地、目的地、起飞时间、降落时间,航班票价,票价折扣,总票数、剩余票数这些信息。

5、客户订票:输入出发地、目的地,然后检索航班信息,打印这个区间的航班,客户选择出发时间,从而匹配航班号,存入订单信息;订单号需要在原有的基础上自动加一;状态标记为已购票。

6、客户退票函数:该趟航班的剩余数加一,状态标记为已退票。

二、功能实现

1、管理员注册账号

2、管理员登录账号

3、录入航班信息

4、查询航班信息

5、修改航班信息

6、订票

7、查询订单信息

三、功能代码

1、关键技术

1、该系统采取面向对象的思想,将每个模块封装成一个类:飞机类、管理员类、客户类。

2、采取vector容器来存储数据,由于vector容器存储的类型需要相同,所以我把飞机信息、管理员信息、客户信息分别单独封装成一个类。

2、飞机类

在录入航班函数、修改航班函数、删除航班函数里面,都需要读取文件并存入文件,因为容器内的数据发生了改变。

#include<iostream>
#include<fstream>
#include"ControlFlight.h"
using namespace std;
void ControlFlight::AddFlights()//添加航班信息
{
	//获取原来文件中的数据
	ReadfromFile_Flights();

	while (true)
	{
		int flag = 1;//是否继续添加,默认为“是”
		string flight_number;//航班号
		string plane_number;//飞机编号
		string place_of_departure;	//出发地
		string destination;	//目的地
		string departure_time;	//起飞时间
		string landing_time;	//降落时间
		double flight_fare;	//航班票价
		double discounted_fares;	//票价折扣
		int total_number_of_tickets;	//总票数
		int number_of_tickets_remaining;	//剩余票数

		cout << "请输入航班号:";
		cin >> flight_number;
		cout << "请输入飞机编号:";
		cin >> plane_number;
		cout << "请输入出发地:";
		cin >> place_of_departure;
		cout << "请输入目的地:";
		cin >> destination;
		cout << "请输入起飞时间:";
		cin >> departure_time;
		cout << "请输入降落时间:";
		cin >> landing_time;
		cout << "请输入航班票价:";
		cin >> flight_fare;
		cout << "请输入票价折扣(输入数字):";
		cin >> discounted_fares;
		cout << "请输入总票数:";
		cin >> total_number_of_tickets;
		number_of_tickets_remaining = total_number_of_tickets;//剩余票数等于总票数

		Flight flight(flight_number, plane_number, place_of_departure,
			destination, departure_time, landing_time,
			flight_fare, discounted_fares, total_number_of_tickets,
			number_of_tickets_remaining);//实例化一个flight对象

		mv_Flights.push_back(flight);//存入容器

		cout << "是否继续添加航班信息?1、继续;0、退出" << endl;
		cin >> flag;
		if (flag == 0)
		{
			cout << "添加成功!" << endl;
			break;
		}
	}

	//存入文件
	WritetoFile_Flights();

	system("pause");
	system("cls");
}

void ControlFlight::DeleteFlights()//删除航班信息
{
	//获取原来文件中的数据
	ReadfromFile_Flights();

	int i = 0;
	int found = 0;//默认为没找到
	string flight_number;//航班号

	cout << "请输入需要删除的航班编号:";
	cin >> flight_number;

	for (i = 0; i < mv_Flights.size(); i++)
	{
		if (mv_Flights[i].m_Flight_Number == flight_number)
		{
			found = 1;
			mv_Flights.erase(mv_Flights.begin() + i, mv_Flights.begin() + i + 1);//删除
			cout << "删除成功!" << endl;
			break;
		}
	}

	if (found == 0)
	{
		cout << "未找到该航班!" << endl;
	}

	//存入文件
	WritetoFile_Flights();

	system("pause");
	system("cls");
}

void ControlFlight::ModifyFlights()//修改航班信息
{
	//获取原来文件中的数据
	ReadfromFile_Flights();

	int i = 0, found = 0, choice = -1;//默认为没找到
	int flag = 0;

	string flight_number;//航班号
	string plane_number;//飞机编号
	string place_of_departure;	//出发地
	string destination;	//目的地
	string departure_time;	//起飞时间
	string landing_time;	//降落时间
	double flight_fare;	//航班票价
	double discounted_fares;	//票价折扣
	int total_number_of_tickets;	//总票数
	int number_of_tickets_remaining;	//剩余票数

	cout << "请输入需要修改的航班编号:";
	cin >> flight_number;

	for (i = 0; i < mv_Flights.size(); i++)
	{
		if (mv_Flights[i].m_Flight_Number == flight_number)
		{
			found = 1;//找到了

			//打印原来的信息

			cout << "*****航班信息如下:*****" << endl;
			cout << "************************" << endl;
			cout << "航班编号:" << mv_Flights[i].m_Flight_Number << endl;
			cout << "飞机编号:" << mv_Flights[i].m_Plane_Number << endl;
			cout << "出发地:" << mv_Flights[i].m_Place_of_Departure << endl;
			cout << "目的地:" << mv_Flights[i].m_Destination << endl;
			cout << "起飞时间:" << mv_Flights[i].m_Departure_Time << endl;
			cout << "降落时间:" << mv_Flights[i].m_Landing_Time << endl;
			cout << "航班票价:" << mv_Flights[i].m_Flight_Fare << endl;
			cout << "票价折扣:" << mv_Flights[i].m_Discounted_Fares << endl;
			cout << "总票数:" << mv_Flights[i].m_Total_Number_of_Tickets << endl;
			cout << "剩余票数:" << mv_Flights[i].m_Number_of_Tickets_Remaining << endl;
			cout << "************************" << endl;

			while (true)//通过循环,实现同一个航班信息的多次修改
			{
				cout << "================================" << endl;
				cout << "=====请输入您要修改的信息:=====" << endl;
				cout << "=====0、退出               =====" << endl;
				cout << "=====1、飞机编号           =====" << endl;
				cout << "=====2、出发地             =====" << endl;
				cout << "=====3、目的地             =====" << endl;
				cout << "=====4、起飞时间           =====" << endl;
				cout << "=====5、降落时间           =====" << endl;
				cout << "=====6、航班票价           =====" << endl;
				cout << "=====7、票价折扣           =====" << endl;
				cout << "================================" << endl;
				cout << "输入:";

				cin >> choice;

				switch (choice)
				{
				case 0://退出
					flag = 1;
					break;
				case 1://飞机编号
					cout << "请输入新的飞机编号:";
					cin >> plane_number;
					mv_Flights[i].m_Plane_Number = plane_number;
					cout << "修改成功!" << endl;
					system("pause");
					break;
				case 2://出发地
					cout << "请输入新的出发地:";
					cin >> place_of_departure;
					mv_Flights[i].m_Place_of_Departure = place_of_departure;
					cout << "修改成功!" << endl;
					system("pause");
					break;
				case 3://目的地
					cout << "请输入新的目的地:";
					cin >> destination;
					mv_Flights[i].m_Destination = destination;
					cout << "修改成功!" << endl;
					system("pause");
					break;
				case 4://起飞时间
					cout << "请输入新的起飞时间:";
					cin >> departure_time;
					mv_Flights[i].m_Departure_Time = departure_time;
					cout << "修改成功!" << endl;
					system("pause");
					break;
				case 5://降落时间
					cout << "请输入新的降落时间:";
					cin >> landing_time;
					mv_Flights[i].m_Landing_Time = landing_time;
					cout << "修改成功!" << endl;
					system("pause");
					break;
				case 6://航班票价
					cout << "请输入新的航班票价:";
					cin >> flight_fare;
					mv_Flights[i].m_Flight_Fare = flight_fare;
					cout << "修改成功!" << endl;
					system("pause");
					break;
				case 7://票价折扣
					cout << "请输入新的票价折扣:";
					cin >> discounted_fares;
					mv_Flights[i].m_Discounted_Fares = discounted_fares;
					cout << "修改成功!" << endl;
					system("pause");
					break;
				default:
					cout << "输入错误,请重新输入!" << endl;
					system("pause");
					break;
				}

				if (flag == 1)
				{
					break;//退出while循环——退出修改环节
				}

			}

			break;//退出查找的循环

		}

	}

	if (found == 0)
	{
		cout << "未找到该航班!" << endl;
	}

	//存入文件
	WritetoFile_Flights();

	system("pause");
	system("cls");
}

void ControlFlight::ReferFlights()//查询航班信息——后续还要添加客户信息
{
	//获取原来文件中的数据
	ReadfromFile_Flights();

	int i = 0, found = 0, choice = -1;//默认为没找到
	int flag = 0;

	string flight_number;//航班号
	string plane_number;//飞机编号
	string place_of_departure;	//出发地
	string destination;	//目的地
	string departure_time;	//起飞时间
	string landing_time;	//降落时间
	double flight_fare;	//航班票价
	double discounted_fares;	//票价折扣
	int total_number_of_tickets;	//总票数
	int number_of_tickets_remaining;	//剩余票数

	cout << "*****航班编号信息如下:*****" << endl;
	cout << "****************************" << endl;
	for (i = 0; i < mv_Flights.size(); i++)
	{
		cout << mv_Flights[i].m_Flight_Number << endl;
	}
	cout << "****************************" << endl;

	cout << "请输入您要查询的航班编号:";
	cin >> flight_number;
	for (i = 0; i < mv_Flights.size(); i++)
	{
		if (mv_Flights[i].m_Flight_Number == flight_number)
		{
			found = 1;//找到了

			cout << "*****航班信息如下:*****" << endl;
			cout << "************************" << endl;
			cout << "航班编号:" << mv_Flights[i].m_Flight_Number << endl;
			cout << "飞机编号:" << mv_Flights[i].m_Plane_Number << endl;
			cout << "出发地:" << mv_Flights[i].m_Place_of_Departure << endl;
			cout << "目的地:" << mv_Flights[i].m_Destination << endl;
			cout << "起飞时间:" << mv_Flights[i].m_Departure_Time << endl;
			cout << "降落时间:" << mv_Flights[i].m_Landing_Time << endl;
			cout << "航班票价:" << mv_Flights[i].m_Flight_Fare << endl;
			cout << "票价折扣:" << mv_Flights[i].m_Discounted_Fares << endl;
			cout << "总票数:" << mv_Flights[i].m_Total_Number_of_Tickets << endl;
			cout << "剩余票数:" << mv_Flights[i].m_Number_of_Tickets_Remaining << endl;
			cout << "************************" << endl;

			//break;
		}
	}

	if (found == 0)
	{
		cout << "未找到该航班!" << endl;
	}

	system("pause");
	system("cls");

}

//读文件,将信息存入容器
void ControlFlight::ReadfromFile_Flights()
{
	mv_Flights.clear();//清空之前的容器

	string flight_number;//航班号
	string plane_number;//飞机编号
	string place_of_departure;	//出发地
	string destination;	//目的地
	string departure_time;	//起飞时间
	string landing_time;	//降落时间
	double flight_fare;	//航班票价
	double discounted_fares;	//票价折扣
	int total_number_of_tickets;	//总票数
	int number_of_tickets_remaining;	//剩余票数

	fstream fs;
	fs.open("flights.txt", ios::in);
	if (!fs)
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}

	while (fs >> flight_number && fs >> plane_number && fs >> place_of_departure
		&& fs >> destination && fs >> departure_time && fs >> landing_time
		&& fs >> flight_fare && fs >> discounted_fares && fs >> total_number_of_tickets
		&& fs >> number_of_tickets_remaining)
	{
		Flight flight(flight_number, plane_number, place_of_departure,
			destination, departure_time, landing_time,
			flight_fare, discounted_fares, total_number_of_tickets,
			number_of_tickets_remaining);//实例化一个flight对象

		mv_Flights.push_back(flight);//存入容器
	}

	fs.close();
}

//写入文件
void ControlFlight::WritetoFile_Flights()
{
	int i = 0;

	fstream fs;
	fs.open("flights.txt", ios::out);
	if (!fs)
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}

	for (i = 0; i < mv_Flights.size(); i++)
	{
		fs << mv_Flights[i].m_Flight_Number << " " << mv_Flights[i].m_Plane_Number << " "
			<< mv_Flights[i].m_Place_of_Departure << " " << mv_Flights[i].m_Destination
			<< " " << mv_Flights[i].m_Departure_Time << " " << mv_Flights[i].m_Landing_Time
			<< " " << mv_Flights[i].m_Flight_Fare << " " << mv_Flights[i].m_Discounted_Fares
			<< " " << mv_Flights[i].m_Total_Number_of_Tickets
			<< " " << mv_Flights[i].m_Number_of_Tickets_Remaining << endl;
	}

	fs.close();
}

2.1读文件函数

1、在该函数的开头写了一行这个代码:

mv_Flights.clear();//清空之前的容器

因为我在录入航班函数、删除航班函数、修改航班函数、查询航班函数的时候都调用了读文件函数,为了避免重复读取数据到vector容器,因此这里写了一行vector容器提供的clear函数。

2、将文件中每一行读取下来之后,实例化了一个flight对象,然后将该flight存入容器

2.2写入文件函数

以只写方式写入文件,每一行的数据之间以空格隔开

2.3删除航班函数

vector容器提供了一对向容器任意位置插入和删除元素的函数insert()与erase()。insert()函数与erase()函数中的位置参数只能由begin(),end()等函数返回的迭代器指示,不能用纯粹的数字。

mv_Flights.erase(mv_Flights.begin() + i, mv_Flights.begin() + i + 1);//删除

3、管理员类

#include<iostream>
#include<fstream>
#include"ControlFlight.h"
#include"ManagerActions.h"
#include"ClientActions.h"
#include<string>
using namespace std;
//注册账号函数
void ManagerActions::RegisterAccount()
{
	string account;//账号
	string password;//密码
	cout << "请设置您的账号名称:";
	cin >> account;
	cout << "请设置您的密码:";
	cin >> password;

	fstream fs;//创建输入输出流对象
	fs.open("managers.txt", ios::app);//以追加方式打开文件
	if (!fs)//文件打开失败
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}

	fs << account << " " << password << endl;//存入文件

	fs.close();

	cout << "添加成功!" << endl;

	system("pause");
	system("cls");
}

void ManagerActions::EnterAccount()//登录账号函数
{
	ReadfromFile_Managers();
	string account;//账号
	string password;//密码
	int found = 0, i;

	cout << "请输入您的账号:";
	cin >> account;
	cout << "请输入您的密码:";
	cin >> password;

	for (i = 0; i < mv_Managers.size(); i++)
	{
		if (account == mv_Managers[i].m_Account && password == mv_Managers[i].m_Password)
		{
			found = 1;//找到了
			break;
		}
	}

	if (found == 1)
	{
		cout << "登录成功!" << endl;
		system("pause");
		system("cls");

		AdministrateFlight();//调用管理员管理航班函数

		system("pause");
		system("cls");
		return;
	}
	else
	{
		cout << "密码或账号错误!" << endl;
		system("pause");
		system("cls");
		return;
	}
}

void ManagerActions::ReadfromFile_Managers()//读管理员信息文件函数
{
	string account;//账号
	string password;//密码

	fstream fs;
	fs.open("managers.txt", ios::in);
	if (!fs)//文件打开失败
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}

	while (fs >> account && fs >> password)
	{
		Manager manager(account, password);//将文件每一行解析为一个对象
		mv_Managers.push_back(manager);//将管理员信息存入容器
	}
	fs.close();
}

void ManagerActions::AdministrateFlight()//管理员管理航班函数
{
	int choice, flag = 0;
	ControlFlight controlflight;//实例一个航班管理类对象

	while (true)
	{
		cout << "请输入您要进行的操作:" << endl;
		cout << "0、返回上级菜单" << endl;
		cout << "1、录入航班" << endl;
		cout << "2、删除航班" << endl;
		cout << "3、修改航班" << endl;
		cout << "4、查询航班" << endl;
		cout << "输入:";

		cin >> choice;

		switch (choice)
		{
		case 0:
			flag = 1;
			break;
		case 1://添加
			controlflight.AddFlights();
			break;
		case 2://删除
			controlflight.DeleteFlights();
			break;
		case 3:
			controlflight.ModifyFlights();
			break;
		case 4://查询
			ReferInformation();

			break;
		default:
			cout << "输入错误,请重新输入!" << endl;
			break;
		}

		if (flag == 1)
		{
			break;
			return;
		}

	}
}

void ReferInformation()
{
	ControlFlight controlflight;//实例一个航班管理类对象
	ClientActions clientactions;
	int a;
	cout << "================================\n";
	cout << "=====请选择您要查询的信息:=====\n";
	cout << "=====1、航班信息           =====\n";
	cout << "=====2、订单信息           =====\n";
	cout << "输入:";
	cin >> a;

	if (a == 1)
	{
		controlflight.ReferFlights();
	}
	else if (a == 2)
	{
		clientactions.ShowOrder();
	}
}

3.1注册账号函数

管理员注册账号并设置密码,以追加方式将信息存入文件。

3.2登录账号函数

遍历容器,找到匹配项。

3.3管理员管理航班函数

通过飞机类实例化一个飞机对象,这样就可以通过这个对象调用飞机类里的各种方法。

4、客户类

#include"ClientActions.h"
#include"ControlFlight.h"
#include<fstream>
using namespace std;

int C_OrderNumber = 0;//订单号全局变量,用来追踪订单号,方便后续订单号自加
//但是在每一个函数调用完后,都需要重置为0,因为我每一个
//函数里面都调用了读文件函数,而在读文件函数里面,我重新
//计算了C_OrderNumber的值

//读订单信息文件函数
void ClientActions::ReadfromFile_Orders()
{
	mv_Orders.clear();//清空之前的数据,因为我在增删改查,每一个里面都调用了读文件函数

	int ordernumber;//订单号
	string name;//客户姓名
	string id;//证件号
	string flightnumber;//客户航班号
	string status;//状态

	fstream fs;
	fs.open("order.txt", ios::in);
	if (!fs)
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}
	//完全可以不需要下面这段代码,因为全局变量一开始就是设置的0
	////如果文件为空,则将订单号全局变量设为0
	//if (!(fs >> ordernumber >> name >> id >> flightnumber >> status))//读取失败,即为空
	//{
	//	cout << "读文件0" << endl;
	//	C_OrderNumber = 0;
	//}
	////如果文件不为空,那么每读一行,订单号全局变量也要加一
	else
	{
		while (fs >> ordernumber && fs >> name && fs >> id && fs >> flightnumber
			&& fs >> status)//读一行
		{
			Client client(ordernumber, name, id, flightnumber, status);//实例化一个client对象
			C_OrderNumber++;
			mv_Orders.push_back(client);//存入容器
		}
	}
	fs.close();
}

//存入文件
void ClientActions::WritetoFile_Orders()
{
	int i = 0;

	fstream fs;
	fs.open("order.txt", ios::out);//以只写方式开文件
	if (!fs)
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}

	for (i = 0; i < mv_Orders.size(); i++)//遍历容器,存入文件
	{
		fs << mv_Orders[i].mc_OrderNumber << " " << mv_Orders[i].mc_Name << " "
			<< mv_Orders[i].mc_ID << " " << mv_Orders[i].mc_Flight_Number << " "
			<< mv_Orders[i].mc_Status << endl;
	}

	fs.close();
}

//订票函数
void ClientActions::BookTicket()
{
	ShowFlight();//先打印一下航班的简单信息

	ControlFlight controlflight;//实例一个航班管理类对象
	controlflight.ReadfromFile_Flights();//获取文件中的航班信息
	ReadfromFile_Orders();//获取文件中的订单信息

	int ordernumber;//订单号
	string name;//客户姓名
	string id;//证件号
	string flightnumber;//客户航班号
	string status;//状态

	string place_of_departure;	//出发地
	string destination;	//目的地

	int found = 0, i = 0;//默认为没有找到
	cout << "请输入您的出发地:";
	cin >> place_of_departure;
	cout << "请输入您的目的地:";
	cin >> destination;

	for (i = 0; i < controlflight.mv_Flights.size(); i++)//遍历容器,进行航班信息匹配
	{
		if (place_of_departure == controlflight.mv_Flights[i].m_Place_of_Departure)
		{
			found = 1;//找到了

			cout << "*****航班信息如下:*****" << endl;
			cout << "************************" << endl;
			cout << "航班编号:" << controlflight.mv_Flights[i].m_Flight_Number << endl;
			cout << "飞机编号:" << controlflight.mv_Flights[i].m_Plane_Number << endl;
			cout << "出发地:" << controlflight.mv_Flights[i].m_Place_of_Departure << endl;
			cout << "目的地:" << controlflight.mv_Flights[i].m_Destination << endl;
			cout << "起飞时间:" << controlflight.mv_Flights[i].m_Departure_Time << endl;
			cout << "降落时间:" << controlflight.mv_Flights[i].m_Landing_Time << endl;
			cout << "航班票价:" << controlflight.mv_Flights[i].m_Flight_Fare << endl;
			cout << "票价折扣:" << controlflight.mv_Flights[i].m_Discounted_Fares << endl;
			cout << "总票数:" << controlflight.mv_Flights[i].m_Total_Number_of_Tickets << endl;
			cout << "剩余票数:" << controlflight.mv_Flights[i].m_Number_of_Tickets_Remaining << endl;
			cout << "************************" << endl;
		}
	}
	if (found == 0)
	{
		cout << "没有找到有关的航班" << endl;
	}
	else
	{
		cout << "请输入您要选择的航班编号:";
		cin >> flightnumber;

		//匹配航班编号
		for (int j = 0; j < controlflight.mv_Flights.size(); j++)
		{
			if (flightnumber == controlflight.mv_Flights[j].m_Flight_Number)
			{
				C_OrderNumber++;
				ordernumber = C_OrderNumber;//订单号更新
				cout << "请填写您的姓名:";
				cin >> name;
				cout << "请填写您的身份证号:";
				cin >> id;
				status = "已购票";
				Client client(ordernumber, name, id, flightnumber, status);//实例化一个客户

				controlflight.mv_Flights[j].m_Number_of_Tickets_Remaining--;

				mv_Orders.push_back(client);//存入容器

				cout << "购票成功!" << endl;

				break;
			}
		}
	}

	WritetoFile_Orders();//存入文件
	controlflight.WritetoFile_Flights();
	C_OrderNumber = 0;//重新赋值为0

	system("pause");
	system("cls");
}

//退票函数
void ClientActions::ReturnTicket()
{
	ControlFlight controlflight;//实例一个航班管理类对象
	controlflight.ReadfromFile_Flights();//获取文件中的航班信息
	ReadfromFile_Orders();//获取文件中的订单信息

	int ordernumber;//订单号
	string name;//客户姓名
	string id;//证件号
	string flightnumber;//客户航班号
	string status;//状态

	cout << "请输入您的订单号:";
	cin >> ordernumber;
	cout << "请输入您的姓名:";
	cin >> name;
	cout << "请输入您的身份证号:";
	cin >> id;
	cout << "请输入您的航班号:";
	cin >> flightnumber;

	int i = 0, found = 0;
	for (i = 0; i < mv_Orders.size(); i++)
	{
		if ((mv_Orders[i].mc_OrderNumber == ordernumber) && (mv_Orders[i].mc_Name == name)
			&& (mv_Orders[i].mc_ID == id) && (mv_Orders[i].mc_Flight_Number == flightnumber))
		{
			found = 1;//找到了

			mv_Orders[i].mc_Status = "已退票";
			cout << "退票成功!\n";
			//遍历航班信息容器,让该航班剩余票数加一
			for (int j = 0; j < controlflight.mv_Flights.size(); j++)
			{
				if (controlflight.mv_Flights[i].m_Flight_Number == flightnumber)
				{
					controlflight.mv_Flights[i].m_Number_of_Tickets_Remaining++;

					break;
				}
			}

			break;
		}
	}
	if (found == 0)
	{
		cout << "您输入信息有误" << endl;
	}



	WritetoFile_Orders();//存入文件
	controlflight.WritetoFile_Flights();
	C_OrderNumber = 0;//重新赋值为0

	system("pause");
	system("cls");
}

//显示订单信息
void ClientActions::ShowOrder()
{
	ReadfromFile_Orders();

	int i = 0;
	cout << "**********************\n";
	cout << "订单信息如下:\n";
	cout << "订单号\t姓名\t身份证号\t航班号\t状态\n";
	for (i = 0; i < mv_Orders.size(); i++)
	{
		cout << mv_Orders[i].mc_OrderNumber << "\t" << mv_Orders[i].mc_Name << "\t"
			<< mv_Orders[i].mc_ID << "\t\t" << mv_Orders[i].mc_Flight_Number << "\t"
			<< mv_Orders[i].mc_Status << endl;
	}
	cout << "**********************\n";

	C_OrderNumber = 0;//重新赋值为0

	system("pause");
	system("cls");
}

//查询订单信息
void ClientActions::ReferOrder()
{
	ReadfromFile_Orders();

	int ordernumber;//订单号
	//string name;//客户姓名
	//string id;//证件号
	//string flightnumber;//客户航班号
	//string status;//状态

	cout << "请输入您的订单号:";
	cin >> ordernumber;

	int i = 0, found = 0;
	cout << "*******************************\n";
	cout << "您的订单信息如下:\n";
	cout << "订单号\t姓名\t身份证号\t航班号\t状态\n";
	for (i = 0; i < mv_Orders.size(); i++)
	{
		if (ordernumber == mv_Orders[i].mc_OrderNumber)
		{
			found = 1;

			cout << mv_Orders[i].mc_OrderNumber << "\t" << mv_Orders[i].mc_Name << "\t"
				<< mv_Orders[i].mc_ID << "\t\t" << mv_Orders[i].mc_Flight_Number << "\t"
				<< mv_Orders[i].mc_Status << endl;

			break;
		}
	}
	if (found == 0)
	{
		cout << "未找到您的订单信息!\n";
	}
	cout << "*******************************\n";

	C_OrderNumber = 0;//重新赋值为0

	system("pause");
	system("cls");
}

//显示航班信息(出发地、目的地)
void ClientActions::ShowFlight()
{
	ControlFlight controlflight;//实例一个航班管理类对象
	controlflight.ReadfromFile_Flights();//获取航班信息
	int i = 0;

	cout << "  *****航班信息如下:*****  " << endl;
	cout << "***************************" << endl;
	cout << "*****\t出发地\t目的地\t*****" << endl;
	for (i = 0; i < controlflight.mv_Flights.size(); i++)
	{
		cout << "*****\t" << controlflight.mv_Flights[i].m_Place_of_Departure << "\t"
			<< controlflight.mv_Flights[i].m_Destination << "\t" << "*****" << endl;
	}
	cout << "***************************" << endl;
}

我定义了一个订单号全局变量:C_OrderNumber,用来追踪订单号,方便后续订单号自加,但是在每一个函数调用完后,都需要重置为0,因为我每一个函数里面都调用了读文件函数,而在读文件函数里面,我重新计算了C_OrderNumber的值。

5、主函数

#include<iostream>
#include<fstream>
#include"ManagerActions.h"
#include"ClientActions.h"
using namespace std;

void MainMenu();//打印主菜单
void ManagerChoose();//管理员选择
void ClientChoose();//客户选择
void CreateFiles();//提前创建文件

int main()
{
	CreateFiles();//提前创建文件

	while (true)
	{
		MainMenu();
		int choice;
		cin >> choice;
		switch (choice)
		{
		case 0:
			cout << "欢迎您的使用!" << endl;
			system("pause");
			exit(0);
		case 1://管理员
			ManagerChoose();//调用管理员选择函数——登录/注册
			break;
		case 2:
			ClientChoose();
			break;
		default:
			cout << "输入错误,请重新输入!" << endl;
			system("pause");
			system("cls");
			break;
		}
	}

	return 0;
}
//打印主菜单
void MainMenu()
{
	cout << "请选择您的身份:" << endl;
	cout << "0、退出系统" << endl;
	cout << "1、管理员" << endl;
	cout << "2、客户" << endl;
	cout << "输入:";
}

//提前创建文件
void CreateFiles()
{
	fstream fs;//创建输入输出流对象,创建管理员信息文件
	fs.open("managers.txt", ios::app);//以追加方式打开文件
	if (!fs)//文件打开失败
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}
	fs.close();

	fstream fs2;//创建航班信息文件
	fs2.open("flights.txt", ios::app);
	if (!fs2)
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}
	fs2.close();


	fstream fs3;//创建订单信息文件
	fs3.open("order.txt", ios::app);
	if (!fs3)
	{
		cout << "文件打开失败!" << endl;
		exit(0);
	}
	fs3.close();
}

//管理员选择
void ManagerChoose()
{
	system("cls");

	ManagerActions manageractions;//通过管理员行为类创建一个对象
	int choice;

	while (true)
	{
		//打印选项
		int flag = 0;//用来标记是否返回上级菜单
		cout << "请选择操作:" << endl;
		cout << "0、返回上级菜单" << endl;
		cout << "1、注册账号" << endl;
		cout << "2、登录账号" << endl;
		cout << "输入:" << endl;
		cin >> choice;

		switch (choice)
		{
		case 0:
			flag = 1;//返回上级菜单
			break;
		case 1://注册账号
			manageractions.RegisterAccount();//调用注册账号函数
			break;
		case 2://登录账号
			manageractions.EnterAccount();
			break;
		default:
			cout << "输入错误,请重新输入!" << endl;
			break;
		}

		if (flag == 1)
		{
			break;
		}
	}
	system("pause");
	system("cls");
	return;
}

void ClientChoose()
{
	system("cls");

	ClientActions clientactions;//通过客户行为类创建一个对象
	int choice = 0;

	while (true)
	{
		int flag = 0;//用来标记是否返回上级菜单
		//打印选项
		cout << "================================" << endl;
		cout << "=====    欢迎选择本公司    =====" << endl;
		cout << "=====请选择您要进行的操作:=====" << endl;
		cout << "=====0、返回上级菜单       =====" << endl;
		cout << "=====1、订票               =====" << endl;
		cout << "=====2、退票               =====" << endl;
		cout << "=====3、查询订单信息       =====" << endl;
		cout << "================================" << endl;
		cout << "输入:";
		cin >> choice;

		switch (choice)
		{
		case 0:
			flag = 1;//返回上级菜单
			break;
		case 1:
			clientactions.BookTicket();
			break;
		case 2:
			clientactions.ReturnTicket();
			break;
		case 3:
			clientactions.ReferOrder();
			break;
		default:
			cout << "输入错误,请重新输入!" << endl;
			break;
		}

		if (flag == 1)
		{
			break;
		}
	}

	system("pause");
	system("cls");
	return;
}

主函数打印主界面菜单,并为管理员和客户提供进入的接口。

总结

今天的分享到这里就结束了,该系统比较基础,适合C++初学者拿来练手。该系统用到了STL(标准模板库),但是比较基础,如果您想要更进一步,建议抽一点时间系统地学习一下STL。

如果需要可以在我的gitee上找到,链接如下:

https://gitee.com/flaming-bird/code-space/tree/master/c++/%E9%A3%9E%E6%9C%BA%E8%AE%A2%E7%A5%A8%E7%B3%BB%E7%BB%9F/%E9%A3%9E%E6%9C%BA%E8%AE%A2%E7%A5%A8%E7%B3%BB%E7%BB%9F

Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐