Advertisement

数据结构课程设计 - 航空客运订票系统

阅读量:

航空客运订票系统(于大一数据结构课设书写)

设计内容、目的与要求:

系统是一个航班订票管理系统,旨在为用户和管理员提供便捷的操作界面用户可以查询航班信息、订票退票,而管理员可以航班信息和乘客信息。通过文件读取和存数据,实现了基本增删改查。

数据结构设计:
1. 航班信息:包括起飞城市、抵达城市、航班号、机型、乘员定额、起飞时(星期几)、价格等。
2. 乘客信息:包括姓名、订票量、座位等级等。
3. 订单信息:关联航班信息和乘客信息,记录订票详情。

功能设计
用户功能模块:
1. 用户登录和注册:用户可以通过输入账号和密码进行登录。也可以注册账号,系统会将注册信息保存到文件中。
2. 查询航班:根据航班编号或起飞城市、抵达城市等条件查询航班信息。
3. 订票业务:乘客选择航班并输入订票信息,系统处理并生成订单,并保存客户信息。
4. 退票业务:乘客选择订单进行退票操作,系统更新航班空位信息,删除客户信息。
管理员功能模块:

1. 管理员登录,不可以进行注册,内部账号,登录成功后可以进行系统操作。

2. 打印所有航班信息:依次打印所有航班信息。

3. 查看乘客信息:根据输入的航班号和航班飞行日期,输入正确的情况下会打印该航班的各个舱位的订票客户信息。

4. 添加新的航班: 管理员可以添加航班,系统将航班新保存到结构体数组即内存中。

目的:
深入理解数据结构的概念及其在解决实际问题中的应用。
提高编程能力,培养系统设计和实现的能力。
锻炼团队协作和项目管理的能力。

要求:

系统能够正确、稳定地运行,满足基本功能需求。
数据结构设计合理,能够高效存储和检索信息。
代码清晰、可读性强,易于维护和扩展。

设计过程、步骤

  1. 概要设计

  2. 系统界面设计

身份选择界面:提供用户和管理员身份选择,用户可以选择登录为普通用户或管理员也可以选择退出程序。

用户登录/注册界面:提供用户登录注册操作,用户可以账号和密码进行,也可以选择注册新账号。

用户功能界面:提供用户查询班、订票、退票等操作,可以选择相应进行操作。

管理员登录界面:提供管理员操作,管理员可以账号和密码进行登录。

管理员功能界面:提供管理员查看航班信息、查看乘客、添加航班等操作,管理员可以选择应功能进行操作

总结

该系统通过模块化设计了用户和管理员的不同功能需求。用户方便地查询航班信息、进行订票和退票操作,而管理员高效地管理班信息和查看客户信息。系统文件存储数据,数据的持久和安全性得到保障。清晰的界面和流程设计,用户和管理员可以轻松地进行操作。

1. 存储结构设计及其数据存储

本系统主要采用结构体数组来存储各个航班的信息。航班结构体内设有多个元素,包括航班的基本信息以及指向该航班订票客户链表的指针,和排队客户的队列。

航班信息

航班信息存储在 D://filght.txt 中,程序启动时读取并加载到内存中。

用户信息

用户信息存储在文件 D://user.txt 中,用户注册时更新文件内容。

管理员信息

管理员信息存在文件 D://manager.txt 中,用于管理员登录验证。

2. 系统流程设计

系统启动:程序启动时,从文件中读取航班信息,存储在内存中供后续操作使用。显示身份选择界面,用户可以登录为普通用户或者管理员,也可以选择退出程序。

用户操作流程:用户可以选择登录或注册新账号。登录成功后,进入用户功能界面;注册成功后,提示成功并返回登录界面。用户功能界面显示用户功能菜单,可以选择查询航班、订票、退票或返回上一菜单。用户选择某一功能后,系统执行对应的操作,并返回到功能菜单。

管理员操作流程:管理员输入账号和密码登录。登录后,进入管理员界面,管理员功能界面 - 显示功能菜单,管理员可以选择查看航信息、查看乘客信息、添加航或返回上一级。管理员选择相应功能后,系统执行的操作,并返回菜单。

系统退出:用户或管理员选择后,系统打印感谢信息并结束程序。

系统各个子功能均已封装为函数,增加程序可读性,方便管理。

详细设计报告

1. 项目概况

本项目是一个基于C++的航班订票系统,旨在管理航班信息、处理客户订票、退票和候补请求,提供用户管理员的交互界面,实现航班信息的、客户登录注册、订票和退票等功能。

2. 系统结构

系统的主要组件包括:

1. CNode 结构:表示订票客户的节点。

2. HCNode 结构体:表示候补客户的节点。

3. airline 类:表示航班和管理航班订的主要功能。

4. 主程序:处理用户和管理员的互,提供登录、、查询、订和退票等功能。

3.1. 订票客户结构体(CNode)

struct CNode {

name; // 姓名

int number; // 订票量

int grade; // 座位等级

CNode* next; // 指向下一个客户的指针

CNode(string n, int num, int g) : name(n), number(num), grade(g), next(nullptr) {}

};

复制代码
\- **name**: 客户姓名

\- **number**: 订票数量

\- **grade**: 座位等级(经济舱、公务舱、头等舱)

\- **next**: 指向一个客户的指

3.2. 候补客户结构体(HCNode)

struct HCNode {

string name; // 姓名

int number; // 票量

int grade; // 座位等级

HCNode(string n, int num, int g) : name(n), number(num), grade(g) {}

};

\- **name**: 候补客户姓名

\- **number**: 候补订票数量

\- **grade**: 座位等级

3.3. 航班类(airline)

class airline {

:

// 航班信息

string head_station; // 起点站名

string end_station; // 终点站名

string air_num; // 航班号

string air_kind; // 机型 string day; // 飞行日期

// 票价

double price1; // 经济舱票价

double price2; // 公务舱票价

double price3; // 头等舱票价

// 座位定额

int people_quotal1; // 经济舱定额

int people_quotal2; // 公务舱定额

int people_quotal3; // 头等舱定额

// 余票量

int ticket1; // 经济舱余票

int ticket2; // 公务舱余票

int ticket3; // 头等舱余票

// 订票客户链表头指针

CNode* peo1; 经济舱订票客户

CNode* peo2; 公务舱订票客户

CNode* peo3; // 头等舱订票客户 // 候补客户队列

queue<HCNode> que1; // 经济舱候补客户

queue<HCNode> que2; // 公务舱候补客户

queue<HC> que3; // 头等舱候补客户

// 析构函数

~airline() clearList(peo1);

clearList(peo2);

clearList(peo3);

}

// 订票

bool orderTicket(const string& name, const int& num, const int& grade);

// 候补

void wait(const string& name, const int& num, const int& grade);

// 退票

bool cancelTicket(const string& name, const int& grade);

// 打印乘客

void print_passenger(void);

private:

// 打印客户信息

void print(CNode*& peo);

// 检查候补队列,并为满足条件的客户订票

void checkWaitList(queue<HCNode>& que, CNode*& peo, int& ticket, int grade);

// 添加客户到链

void addCustomer(CNode*& head, string name, int num, int grade);

// 删除客户出链表

bool deleteCustomer(CNode*& head, string name, int& ticket);

// 清理链表

void clearList(CNode*& head);

};

- public成员:

- head_station: 起点站名

- end_station: 终点站名

- air_num: 航班号

- air_kind: 机型

- day: 飞行日期

- price1, price2, price3: 经济舱、公舱、头等舱票价

- **people_quotal1, people_quotal2, people_quotal3: 各舱乘员定额

ticket1, ticket2, ticket3: 各舱余票量

- peo1, peo2, peo3: 各舱订票客户链表头指针

- que1, que2, que3: 各舱候补客户队列

- public方法:

- orderTicket: 订票

- wait: 候补

- cancelTicket 退票

- print_passenger: 打印乘客信息

- private方法:

- print: 打印客户

- checkWait: 检查候补队列,并为满足条件的客户票

- addCustomer: 添加客户链表

-deleteCustomer**: 删除客户出表

- clearList: 清理链表

4. 功能设计

4.1. 航班信息管理

- 添加航班:可以添加新的航班信息,包括起点站、终点站、航班号、机型、飞行日期、票价和座位定额等。

- 打印航班信息:打印所有航班的详细信息供管理员查看。

4.2. 订票功能

- 订票:客户可以选择航班并订购一定数量的票。如果余票不足,则询问客户是否加入候补队列。

- 候补:如果客户加入候补队列,当有票时,系统会自动处理候补客户的票请求。

4.3. 退票功能

- 退票:客户可以退票,退票后系统会检查候补队列,如果有符合条件的候补客户,自动为其订票。

4.4. 打印乘客信息

- 打印乘客信息:打印指定航班各舱位的订票客户信息,供管理员查看。

4.5. 用户与管理员的交互

- 用户登录与注册:用户可以通过登录或注册进入系统进行操作。

- 管理员登录:管理员可以登录,管理航班信息和查看乘客信息。

5. 关键代码实现细节

5.1. 订票功能实现及

5.2. 候补功能实现

bool order(void) /订票业务/

{

cout << "请输入您要订购的航班号:";

string id; cin >> id;

cout << "请输入您的出行日期:";

string day; cin >> day;

for (int i = 0; i < air.size(); i++)

{

if (air[i].air_num == id && air[i].day == day)

{

cout << "请输入您的姓名:";

string name; cin >> name;

cout << "请输入您要订购的舱位等级 (1.经济舱 2.公务舱 3.头等舱) :";

int grade; cin >> grade;

while (grade != 1 && grade != 2 && grade != 3)

{

cout << "对不起,没有该选项,请您重新选择:";

cin >> grade;

}

cout << "请输入您要订购的票数:";

int num; cin >> num;

if (air[i].orderTicket(name, num, grade))

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

else

{

system("cls");

cout << "--------------------------------------------" << endl;

cout << "---对不起,余票不足,请问您是否需要候补?---" << endl;

cout << "--------------------------------------------" << endl;

cout << "--- 1.Yes 2.No ---" << endl;

cout << "--------------------------------------------" << endl;

cout << "请输入您的选择:";

int chose; cin >> chose;

while (chose != 1 && chose != 2 )

{

cout << "对不起,无此选项,请您重新输入:";

cin >> chose;

}

if (chose == 1)

{

air[i].wait(name, num, grade);

cout << "候补成功!" << endl;

}

else

break;

}

system("pause");

return true;

}//if

}//for

return false;

}

注:orderTicket为订票函数,wait为候补函数,均为类class内部公共函数。

- 根据座位等级判断余票是否足,若足够则直接订票,若不足则询问客户是否加入候队列。

5.3.退票功能实现

void return_tkt(void) /退票业务/

{

cout << "请输入您要退订的航班号:";

string num; cin >> num;

cout << "请输入您要退订航班的日期 (星期几) :";

string day; cin >> day;

for (int i = 0; i < air.size(); i++)

{

//找到要退订的航班

if (air[i].air_num == num && air[i].day == day)

{

cout << "请输入您的姓名:";

string name; cin >> name;

cout << "请输入您的舱位等级(1.经济舱 2.公务舱 3.头等舱):";

int grade; cin >> grade;

while (grade != 1 && grade != 2 && grade != 3)

{

cout << "对不起,没有该选项,请您重新选择:";

cin >> grade;

}

if (air[i].cancelTicket(name, grade))

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

else

cout << "对不起,未找到您的客户信息!" << endl;

system("pause");

return;

}

}

//未找到要退订的航班

cout << "对不起,无此航班!" << endl;

system("pause");

return;

}

注:cancelTicket为退票函数,为class类内部公用函数。

5.4 打印乘客信息实现

void view_passenger(void)/查看乘客信息/

{

cout << "请输入您要查询的航班号:";

string id; cin >> id;

cout << "请输入您要查询航班的日期:";

string day; cin >> day;

for (int i = 0; i < air.size(); i++)

{

if (id == air[i].air_num && day == air[i].day)

{

air[i].print_passenger();

return;

}

}

cout << "对不起,没有此航班信息!" << endl;

}

注:print_passenger为打印该航班的客户信息函数,为类class内部公用函数。

源代码:

笔者大一年级时水平有限,并未对文件进行规范的管理,只编写了两个文件

注:读者使用该代码时,应自行创建三个txt文件,用于存放相关信息,在主函数里将文件路径替换即可。同时需要了解txt文件的格式要求,大一使用的这三个文件已经丢掉了,读者可以根据我主函数内的读取文件逻辑进行推测文件的格式。

#include "FileName"

复制代码
 #include <iostream>

    
 #include <string>
    
 #include <vector>
    
 #include <unordered_map>
    
 #include <algorithm>
    
 #include <fstream>
    
 #include <queue>
    
 #include <stack>
    
 #include <iomanip>
    
 using namespace std;
    
  
    
 struct CNode
    
 {/*客户*/
    
 	string name; /*姓名*/
    
 	int number; /*订票量*/
    
 	int grade; /*座位等级*/
    
 	CNode* next;
    
 	CNode(string n, int num, int g) : name(n), number(num), grade(g), next(nullptr) {}
    
 };
    
  
    
 struct HCNode
    
 {/*候补客户*/
    
 	string name;
    
 	int number;
    
 	int grade;
    
 	HCNode(string n, int num, int g) : name(n), number(num), grade(g) {}
    
 };
    
  
    
 class airline
    
 {/*航班信息*/
    
 public:
    
 	string head_station; /*起点站名*/
    
 	string end_station; /*终点站名*/
    
 	string air_num; /*航班号*/
    
 	string air_kind; /*机型*/
    
 	string day; /*飞行日期 星期几*/
    
  
    
 	double price1; /*经济舱票价*/
    
 	double price2; /*公务舱票价*/
    
 	double price3; /*头等舱票价*/
    
 	int people_quotal1; /*经济舱乘员定额*/
    
 	int people_quotal2; /*公务舱乘员定额*/
    
 	int people_quotal3; /*头等舱成员定额*/
    
 	int ticket1; /*经济舱余票量*/
    
 	int ticket2; /*公务舱余票量*/
    
 	int ticket3; /*头等舱余票量*/
    
  
    
 	CNode* peo1; /*经济舱订票客户*/
    
 	CNode* peo2; /*公务舱订票客户*/
    
 	CNode* peo3; /*头等舱订票客户*/
    
 	queue<HCNode>que1; /*经济舱候补客户*/
    
 	queue<HCNode>que2; /*公务舱候补客户*/
    
 	queue<HCNode>que3; /*头等舱候补客户*/
    
  
    
 	//构造函数(初始化成员变量)
    
 	airline() : peo3(nullptr), peo1(nullptr), peo2(nullptr), head_station(""), end_station(""), air_num(""), air_kind(""), day(""),
    
 		price1(1000), price3(4000), price2(2000), people_quotal1(80), people_quotal2(80), people_quotal3(40), ticket1(80), ticket2(80),
    
 		ticket3(40) {}
    
  
    
 	//析构函数(清空堆区内存)
    
 	~airline()
    
 	{
    
 		clearList(peo1);
    
 		clearList(peo2);
    
 	}
    
 	//订票
    
 	bool orderTicket(const string& name, const int& num, const int& grade)
    
 	{
    
 		if (grade == 1 && ticket1 >= num) {
    
 			addCustomer(peo1, name, num, grade);
    
 			ticket1 -= num;
    
 			return true;
    
 		}
    
 		else if (grade == 2 && ticket2 >= num) {
    
 			addCustomer(peo2, name, num, grade);
    
 			ticket2 -= num;
    
 			return true;
    
 		}
    
 		else if (grade == 3 && ticket3 >= num) {
    
 			addCustomer(peo3, name, num, grade);
    
 			ticket3 -= num;
    
 			return true;
    
 		}
    
 		return false; // 余票不足
    
 	}
    
 	//候补
    
 	void wait(const string& name, const int& num, const int& grade)
    
 	{
    
 		HCNode temp(name, num, grade);
    
 		if (grade == 1)
    
 			que1.push(temp);
    
 		else if (grade == 2)
    
 			que2.push(temp);
    
 		else
    
 			que3.push(temp);
    
 	}
    
 	//退票
    
 	bool cancelTicket(const string& name, const int& grade)
    
 	{
    
 		bool deleted = false;
    
 		if (grade == 1) {
    
 			deleted = deleteCustomer(peo1, name, ticket1);
    
 			if (deleted) checkWaitList(que1, peo1, ticket1, grade);
    
 		}
    
 		else if (grade == 2) {
    
 			deleted = deleteCustomer(peo2, name, ticket2);
    
 			if (deleted) checkWaitList(que2, peo2, ticket2, grade);
    
 		}
    
 		else {
    
 			deleted = deleteCustomer(peo3, name, ticket3);
    
 			if (deleted) checkWaitList(que3, peo3, ticket3, grade);
    
 		}
    
 		return deleted;
    
 	}
    
 	//打印乘客信息
    
 	void print_passenger(void)
    
 	{
    
 		cout << "----------   经济舱   ----------" << endl;
    
 		print(peo1);
    
 		cout << endl;
    
 		cout << "----------   公务舱   ----------" << endl;
    
 		print(peo2);
    
 		cout << endl;
    
 		cout << "----------   头等舱   ----------" << endl;
    
 		print(peo3);
    
 		cout << endl;
    
 	}
    
 private:
    
 	//打印客户信息
    
 	void print(CNode*& peo)
    
 	{
    
 		CNode* current = peo;
    
 		while (current != nullptr)
    
 		{
    
 			cout << current->name << "  " << current->grade << "  " << current->number << endl;
    
 			current = current->next;
    
 		}
    
 	}
    
 	//检查候补队列,并为满足条件的客户订票 ---------------------------------- 并未满足题目要求,感觉题目不是特别恰当
    
 	void checkWaitList(queue<HCNode>& que, CNode*& peo, int& ticket, int grade)
    
 	{
    
 		while (!que.empty() && ticket > 0)
    
 		{
    
 			const HCNode& temp = que.front();
    
 			if (temp.number <= ticket)
    
 			{
    
 				addCustomer(peo, temp.name, temp.number, grade);
    
 				ticket -= temp.number;
    
 				que.pop(); // 从候补队列中移除已订票的客户
    
 			}
    
 			else
    
 			{
    
 				break; // 余票不足,无法满足当前候补客户
    
 			}
    
 		}
    
 	}
    
 	// 添加客户到链表
    
 	void addCustomer(CNode*& head, string name, int num, int grade) 
    
 	{
    
 		CNode* temp = new CNode(name, num, grade);
    
 		if (head == nullptr) 
    
 		{
    
 			head = temp;
    
 		}
    
 		else 
    
 		{
    
 			CNode* current = head;
    
 			while (current->next != nullptr)
    
 				current = current->next;
    
 			current->next = temp;
    
 		}
    
 	}
    
 	//删除客户出链表
    
 	bool deleteCustomer(CNode*& head, string name, int& ticket)
    
 	{
    
 		if (head == nullptr)
    
 			return false;
    
 		//删除元素位于链表头部
    
 		if (head->name == name)
    
 		{
    
 			CNode* temp = head;
    
 			ticket += temp->number;
    
 			head = head->next;
    
 			delete temp;
    
 			return true;
    
 		}
    
 		//不位于头部
    
 		CNode* current = head;
    
 		while (current->next != nullptr)
    
 		{
    
 			if (current->next->name == name) {
    
 				CNode* temp = current->next;
    
 				ticket += temp->number;
    
 				current->next = temp->next;
    
 				delete temp;
    
 				return true;
    
 			}
    
 			current = current->next;
    
 		}
    
 		return false;
    
 	}
    
 	// 清理链表
    
 	void clearList(CNode*& head) 
    
 	{
    
 		CNode* current = head;
    
 		while (current != nullptr) {
    
 			CNode* next = current->next;
    
 			delete current;
    
 			current = next;
    
 		}
    
 		head = nullptr;
    
 	}
    
 };
    
 vector<airline>air;
    
  
    
 istream& operator>>(istream& is, airline& p)/*重载>>运算符函数*/
    
 {
    
 	is >> p.head_station >> p.end_station >> p.air_num >> p.air_kind >> p.day >> p.price1
    
 		>> p.price2 >> p.people_quotal1 >> p.people_quotal2 >> p.ticket1 >> p.ticket2;
    
 	return is;
    
 }
    
  
    
 ostream& operator<<(ostream& is, airline& p)/*重载<<运算符函数*/
    
 {
    
 	is <<' '<< p.head_station <<' '<< p.end_station <<' '<< p.air_num <<' '<< p.air_kind
    
 		<<' '<< p.day <<' '<< p.price1 <<' '<< p.price2 <<' '<< p.people_quotal1 <<' '<<
    
 		p.people_quotal2 <<' '<< p.ticket1 <<' '<< p.ticket2;
    
 	return is;
    
 }
    
  
    
 void print_table(int flag)/*打印表格*/
    
 {
    
 	if (flag == 1)//航班表头
    
 	{
    
 		cout << left;
    
 		cout << setw(10) << "起点"
    
 			<< setw(10) << "终点"
    
 			<< setw(8) << "航班号"
    
 			<< setw(6) << "机型"
    
 			<< setw(5) << "时间"
    
 			<< setw(12) << "经济舱票价"
    
 			<< setw(12) << "公务舱票价"
    
 			<< setw(12) << "头等舱票价"
    
 			<< setw(12) << "经济舱余票"
    
 			<< setw(12) << "公务舱余票"
    
 			<< setw(12) << "头等舱余票"
    
 			<< endl;
    
 	}
    
 	else//客户表头
    
 	{
    
  
    
 	}
    
 }
    
  
    
 void printQ(void)/*选择身份*/
    
 {
    
 	cout << "                 航空客运订票系统                " << endl;
    
 	cout << "-------------------------------------------------" << endl;
    
 	cout << "---   1.用户         2.管理员         0.退出  ---" << endl;
    
 	cout << "-------------------------------------------------" << endl;
    
 }
    
  
    
 void printD(int flag)/*打印登录页面*/
    
 {
    
 	if (flag == 1)//用户页面
    
 	{
    
 		cout << "                  用户登录页面                   " << endl;
    
 		cout << "-------------------------------------------------" << endl;
    
 		cout << "---   1.登录       2.注册       0.返回上一级  ---" << endl;
    
 		cout << "-------------------------------------------------" << endl;
    
 	}
    
 	else//管理员页面
    
 	{
    
 		cout << "                 管理员登录页面                  " << endl;
    
 		cout << "-------------------------------------------------" << endl;
    
 		cout << "-------   1.登录            0.返回上一级  -------" << endl;
    
 		cout << "-------------------------------------------------" << endl;
    
 	}
    
 }
    
  
    
 void print_use(int flag)/*打印用户或管理员页面*/
    
 {
    
 	if (flag == 1)//用户
    
 	{
    
 		cout << "                   用户页面                      " << endl;
    
 		cout << "-------------------------------------------------" << endl;
    
 		cout << "---------------     1.查询航线     --------------" << endl;
    
 		cout << "---------------     2.订票业务     --------------" << endl;
    
 		cout << "---------------     3.退票业务     --------------" << endl;
    
 		cout << "---------------     0.返回上一级   --------------" << endl;
    
 		cout << "-------------------------------------------------" << endl;
    
 	}
    
 	else//管理员
    
 	{
    
 		cout << "                  管理员页面                     " << endl;
    
 		cout << "-------------------------------------------------" << endl;
    
 		cout << "-----------     1.打印所有航班信息     ----------" << endl;
    
 		cout << "-----------     2.查看乘客信息         ----------" << endl;
    
 		cout << "-----------     3.添加新的航班         ----------" << endl;
    
 		cout << "-----------     0.返回上一级           ----------" << endl;
    
 		cout << "-------------------------------------------------" << endl;
    
 	}
    
 }
    
  
    
 bool login(string str)/*登录操作*/
    
 {
    
 	cout << "请输入您的账号:";
    
 	string acc; cin >> acc;
    
 	cout << "请输入您的密码:";
    
 	string bcc; cin >> bcc;
    
  
    
 	string result;//输入的账号密码
    
 	result += acc; result += ' '; result += bcc;
    
  
    
 	ifstream input;
    
 	input.open(str);
    
 	bool flag = false;
    
 	if (input.is_open())
    
 	{
    
 		string line;
    
 		while (getline(input, line))
    
 		{
    
 			if (result == line)
    
 			{
    
 				flag = true;
    
 				break;
    
 			}
    
 		}
    
 		input.close();
    
 	}else
    
 	{
    
 		cout << "打开文件失败!";
    
 		return false;
    
 	}
    
 	return flag;
    
 }
    
  
    
 bool enroll(void)/*注册操作*/
    
 {
    
 	cout << "请输入您的新账号:";
    
 	string acc; cin >> acc;
    
 	cout << "请输入您的新密码:";
    
 	string bcc; cin >> bcc;
    
  
    
 	string result;//输入的数据
    
 	result += acc; result += ' '; result += bcc;
    
 	ofstream output;
    
 	output.open("D://user.tet", ios::app);
    
 	if (output.is_open())
    
 	{
    
 		output << endl << result;
    
 		output.close();
    
 		return true;
    
 	}
    
 	else
    
 	{
    
 		return false;
    
 	}
    
 }
    
 void Query(void)/*查询航班*/
    
 {
    
 	system("cls");
    
 	cout << "                请选择您的查询方式               " << endl;
    
 	cout << "-------------------------------------------------" << endl;
    
 	cout << "---  1.起始终点                     2.航班号  ---" << endl;
    
 	cout << "---                0.返回上一级               ---" << endl;
    
 	cout << "-------------------------------------------------" << endl;
    
 	cout << "请输入您的选择:";
    
 	char chose; cin >> chose;
    
 	while (chose != '1' && chose != '2' && chose != '0')
    
 	{
    
 		cout << "对不起,无该选项,请您重新选择:";
    
 		cin >> chose;
    
 	}
    
 	switch (chose)
    
 	{
    
 	case '1':
    
 	{
    
 		cout << "请输入您要查询航班的起点:";
    
 		string q; cin >> q;//起点
    
 		cout << "请输入您要查询航班的终点:";
    
 		string z; cin >> z;//终点
    
 		bool flag = true;//判断是否有该航班
    
 		print_table(1);
    
 		for (int i = 0; i < air.size(); i++)
    
 		{
    
 			if (air[i].head_station == q && air[i].end_station == z)
    
 			{
    
 				flag = false;
    
 				cout << setw(10) << air[i].head_station << setw(10) << air[i].end_station << setw(8) << air[i].air_num
    
 					<< setw(6) << air[i].air_kind << setw(5) << air[i].day << setw(12) << air[i].price1 << setw(12) <<
    
 					air[i].price2 << setw(12) << air[i].price3 << setw(12) << air[i].ticket1 << setw(12) << air[i].ticket2
    
 					<< setw(12) << air[i].ticket3 << endl;
    
 			}
    
 		}
    
 		if (flag == true)
    
 			cout << "对不起,未找到您要查询的航班!" << endl;
    
 		break;
    
 	}//case
    
 	case '2':
    
 	{
    
 		cout << "请输入您要查询的航班号:";
    
 		string id; cin >> id;
    
 		bool flag = true;
    
 		print_table(1);
    
 		for (int i = 0; i < air.size(); i++)
    
 		{
    
 			if (air[i].air_num == id)
    
 			{
    
 				flag = false;
    
 				cout << setw(10) << air[i].head_station << setw(10) << air[i].end_station << setw(8) << air[i].air_num
    
 					<< setw(6) << air[i].air_kind << setw(5) << air[i].day << setw(12) << air[i].price1 << setw(12) <<
    
 					air[i].price2 << setw(12) << air[i].price3 << setw(12) << air[i].ticket1 << setw(12) << air[i].ticket2
    
 					<< setw(12) << air[i].ticket3 << endl;
    
 			}
    
 		}
    
 		if (flag == true)
    
 			cout << "对不起,未找到您要查询的航班!" << endl;
    
 		break;
    
 	}//case
    
 	case '0':
    
 		return;
    
 	}//switch
    
 	system("pause");
    
 }
    
  
    
 bool order(void) /*订票业务*/
    
 {
    
 	cout << "请输入您要订购的航班号:";
    
 	string id; cin >> id;
    
 	cout << "请输入您的出行日期:";
    
 	string day; cin >> day;
    
 	for (int i = 0; i < air.size(); i++)
    
 	{
    
 		if (air[i].air_num == id && air[i].day == day)
    
 		{
    
 			cout << "请输入您的姓名:";
    
 			string name; cin >> name;
    
 			cout << "请输入您要订购的舱位等级 (1.经济舱 2.公务舱 3.头等舱) :";
    
 			int grade; cin >> grade;
    
 			while (grade != 1 && grade != 2 && grade != 3)
    
 			{
    
 				cout << "对不起,没有该选项,请您重新选择:";
    
 				cin >> grade;
    
 			}
    
 			cout << "请输入您要订购的票数:";
    
 			int num; cin >> num;
    
 			if (air[i].orderTicket(name, num, grade))
    
 				cout << "订购成功!" << endl;
    
 			else
    
 			{
    
 				system("cls");
    
 				cout << "--------------------------------------------" << endl;
    
 				cout << "---对不起,余票不足,请问您是否需要候补?---" << endl;
    
 				cout << "--------------------------------------------" << endl;
    
 				cout << "---   1.Yes                       2.No   ---" << endl;
    
 				cout << "--------------------------------------------" << endl;
    
 				cout << "请输入您的选择:";
    
 				int chose; cin >> chose;
    
 				while (chose != 1 && chose != 2 )
    
 				{
    
 					cout << "对不起,无此选项,请您重新输入:";
    
 					cin >> chose;
    
 				}
    
 				if (chose == 1)
    
 				{
    
 					air[i].wait(name, num, grade);
    
 					cout << "候补成功!" << endl;
    
 				}
    
 				else
    
 					break;
    
 			}
    
 			system("pause");
    
 			return true;
    
 		}//if
    
 	}//for
    
 	return false;
    
 }
    
  
    
 void return_tkt(void) /*退票业务*/
    
 {
    
 	cout << "请输入您要退订的航班号:";
    
 	string num; cin >> num;
    
 	cout << "请输入您要退订航班的日期 (星期几) :";
    
 	string day; cin >> day;
    
 	for (int i = 0; i < air.size(); i++)
    
 	{
    
 		//找到要退订的航班
    
 		if (air[i].air_num == num && air[i].day == day)
    
 		{
    
 			cout << "请输入您的姓名:";
    
 			string name; cin >> name;
    
 			cout << "请输入您的舱位等级(1.经济舱 2.公务舱 3.头等舱):";
    
 			int grade; cin >> grade;
    
 			while (grade != 1 && grade != 2 && grade != 3)
    
 			{
    
 				cout << "对不起,没有该选项,请您重新选择:";
    
 				cin >> grade;
    
 			}
    
 			if (air[i].cancelTicket(name, grade))
    
 				cout << "退票成功!" << endl;
    
 			else
    
 				cout << "对不起,未找到您的客户信息!" << endl;
    
 			system("pause");
    
 			return;
    
 		}
    
 	}
    
 	//未找到要退订的航班
    
 	cout << "对不起,无此航班!" << endl;
    
 	system("pause");
    
 	return;
    
 }
    
  
    
 void print_all(void)/*打印所有航班*/
    
 {
    
 	for (int i = 0; i < air.size(); i++)
    
 	{
    
 		cout << air[i] << endl;
    
 	}
    
 }
    
  
    
 void view_passenger(void)/*查看乘客信息*/
    
 {
    
 	cout << "请输入您要查询的航班号:";
    
 	string id; cin >> id;
    
 	cout << "请输入您要查询航班的日期:";
    
 	string day; cin >> day;
    
 	for (int i = 0; i < air.size(); i++)
    
 	{
    
 		if (id == air[i].air_num && day == air[i].day)
    
 		{
    
 			air[i].print_passenger();
    
 			return;
    
 		}
    
 	}
    
 	cout << "对不起,没有此航班信息!" << endl;
    
 }
    
  
    
 void add_air(void)/*添加航班信息*/
    
 {
    
 	cout << "请输入您要添加的航班号:";
    
 	string id; cin >> id;
    
 	cout << "请输入您要添加的机型:";
    
 	string kind; cin >> kind;
    
 	cout << "请输入航班的起点:";
    
 	string q; cin >> q;
    
 	cout << "请输入航班的终点:";
    
 	string z; cin >> z;
    
 	cout << "请您输入飞行日期:";
    
 	string day; cin >> day;
    
 	airline temp;
    
 	temp.air_num = id; temp.air_kind = kind; temp.head_station = q; temp.end_station = z; temp.day = day;
    
 	air.push_back(temp);
    
 	cout << "添加航班成功!" << endl;
    
 }
    
    
    
    

main.c

复制代码
 #include "FileName.h"

    
  
    
 int main()
    
 {
    
 	/*创建航班数组*/
    
 	ifstream input;
    
 	input.open("D://filght.txt");
    
 	if (input.is_open())
    
 	{
    
 		airline temp;
    
 		while (input >> temp)
    
 		{
    
 			air.push_back(temp);
    
 		}
    
 		input.close();
    
 	}
    
 	else//打开文件失败,跳出
    
 	{
    
 		cout << "打开文件失败!" << endl;
    
 		return 0;
    
 	}
    
 	/*身份选择*/
    
 	while (1)
    
 	{
    
 		system("cls");
    
 		printQ();
    
 		cout << "请选择您的身份:";
    
 		char ch; cin >> ch;
    
 		while (ch != '1' && ch != '2' && ch != '0')
    
 		{
    
 			cout << "对不起,无此选项,请您重新选择:";
    
 			cin >> ch;
    
 		}
    
 		if (ch == '0')
    
 		{
    
 			cout << "退出成功!" << endl;
    
 			break;
    
 		}
    
 		else if (ch == '1')//用户页面
    
 		{
    
 			//登录和注册操作
    
 			while (1)
    
 			{
    
 				system("cls");
    
 				printD(1);
    
 				cout << "请输入您的选择:";
    
 				char chose;
    
 				cin >> chose;
    
 				//登录操作
    
 				if (chose == '0')
    
 				{
    
 					break;
    
 				}
    
 				else if (chose == '1')
    
 				{
    
 					int tag = 0;
    
 					if (login("D://user.txt"))
    
 					{
    
 						cout << "登录成功!" << endl;
    
 						system("pause");
    
 						/*用户页面 执行查询、订票、退票功能*/
    
 						while (1)
    
 						{
    
 							system("cls");
    
 							print_use(1);
    
 							cout << "请输入您的选择:";
    
 							cin >> chose;
    
 							switch (chose)
    
 							{
    
 							case '1'://查询航班
    
 								Query();
    
 								break;
    
 							case '2'://订票
    
 								order();
    
 								break;
    
 							case '3'://退票
    
 								return_tkt();
    
 								break;
    
 							case '0'://返回上一级
    
 								tag = 1;
    
 								break;
    
 							default:
    
 								cout << "对不起,无此选项!" << endl;
    
 								system("pause");
    
 								break;
    
 							}//switch
    
 							if (tag == 1)
    
 								break;
    
 						}//while
    
 					}
    
 					else
    
 					{
    
 						cout << "对不起,您输入的账号或密码不正确!" << endl;
    
 						system("pause");
    
 					}
    
 				}
    
 				//注册操作
    
 				else if (chose == '2')
    
 				{
    
 					if (enroll())
    
 					{
    
 						cout << "注册成功!" << endl;
    
 					}
    
 					else
    
 					{
    
 						cout << "注册失败!" << endl;
    
 					}
    
 					system("pause");
    
 				}
    
 				//非法输入
    
 				else
    
 				{
    
 					cout << "选择有误!" << endl;
    
 					system("pause");
    
 				}
    
 			}//while
    
 		}//if
    
 		else/*管理员身份*/
    
 		{
    
 			while (1)
    
 			{
    
 				system("cls");
    
 				printD(2);
    
 				cout << "请输入您的选择:";
    
 				char chose; cin >> chose;
    
 				if (chose == '0')
    
 				{
    
 					break;
    
 				}
    
 				else if (chose == '1')
    
 				{
    
 					if (login("D://manager.txt"))
    
 					{
    
 						int tag = 0;
    
 						while (1)
    
 						{
    
 							system("cls");
    
 							print_use(2);
    
 							cout << "请输入您的选择:";
    
 							cin >> chose;
    
 							switch (chose)
    
 							{
    
 							case '1'://打印所有航班信息
    
 								print_all();
    
 								break;
    
 							case '2'://查看乘客信息
    
 								view_passenger();
    
 								break;
    
 							case '3'://添加航班
    
 								add_air();
    
 								break;
    
 							case '0'://退出
    
 								tag = 1;
    
 								break;
    
 							default:
    
 								cout << "对不起,无此选项!" << endl;
    
 								system("pause");
    
 								break;
    
 							}//switch
    
 							if (tag == 1)
    
 								break;
    
 							system("pause");
    
 						}//while
    
 					}
    
 					else {
    
 						cout << "对不起,您的账号或密码有误!" << endl;
    
 						system("pause");
    
 					}
    
 				}
    
 				else {
    
 					cout << "对不起,无此选项!";
    
 					system("pause");
    
 				}
    
 			}//while
    
 		}
    
 	}
    
 	endd:
    
 	cout << "感谢您使用本订票系统,祝您生活愉快!" << endl;
    
 	return 0;
    
 }
    
    
    
    

结果与分析

系统运行主界面如图1所示。各子功能测试运行结果如下。

1. 航班数组的建立

程序运行初期,会从D://filght.txt文件中将初始航班信息读出到内存中(航班air数组),以供后续程序的使用和修改。

2. 用户登录

用户登录页面,用户输入的账号和密码,系统会拿去与D://user.txt文件内存放的数据匹配,匹配成功则登录成功,否则登录失败,如图2所示,此时可以去注册账号。

3. 用户注册

用户注册页面,用户可以输入新的账号和密码,如图3所示,输入后系统会将账号和密码存入D://user.txt文件中,以便后续的登录操作

4. 用户查询航班

户可以通过起止点查询航班,也可以通过航班号和日期来查询航班,本例取第二种查询方法,如图5所示。

5. 用户订票

用户订票页面,系统提醒用户输入基本信息,为用户进行订票操作,如图6所示,如果余票不足的话,则询问用户是否进行候补,如图7所示。

6. 用户退票

用户退票页面,系统提示用户输入航班号和飞行日期,系统找到该航班后提示用户输入个人信息,为用户进行退票,如图8所示,退票成功后,检查候补队列,自动为符合条件的候补客户订票。

7. 管理员登录

管理员输入正确账号和密码以后,可以进行管理员功能操作,如图9所示。

8. 管理员打印所有航班信息

打印内存中存有的所有航班信息,如图10所示。

9. 管理员查看某航班客户信息

10. 管理员添加航班

设计体会:

没写之前可能看了题目会觉得非常简单,单个函数的书写都非常容易,但在实际的编码实现过程中,需要考虑整体的代码逻辑,统一管理这些变量和函数,感觉稍微有一些难度。通过这次课程设计,我深刻了解队员之间的交流、讨论,以及对问题的分析,分割和对任务的分配,书写函数或者任务的需求的重要性,在日后的学习和生活中我会着重培养这方面能力。

改进和建议:

1.在系统的实现过程中,我们只是用两个文件,来存放这些程序,显得非常臃肿,在日后的编码中我们可以尝试分多个文件来书写,更有利于程序的管理和导航。2.编码过程中我们没有使用统一的命名约定,导致一下变量并不是特别清晰,显得代码凌乱。3.虽然我们制作了一些可视化界面,但是我认为还是不太符合我对程序可视化的预期,为此我正在学习c++中的easyx库,想为程序做一些可以用鼠标点击图形化的界面,由于时间原因,并未实现,未来我会完善我们的程序。4.程序结束后用户的订票或者排队信息以及管理员添加的航班,系统未能将其写入外存,因为每个航班都有订票的客户和排队的客户,如果为每个航班都创建两个文件,需要太多的文件需要管理,觉得太麻烦了就没有实现此功能,然后我思考了能不能用数据库的知识来解决?目前正在学习数据库相关知识,寻求解决方案,未来我会更加完善我们的系统!

结束语:笔者水平有限,文章有不妥之处,恳请读者予以谅解。

全部评论 (0)

还没有任何评论哟~