数据结构课程设计 - 航空客运订票系统
航空客运订票系统(于大一数据结构课设书写)
设计内容、目的与要求:
系统是一个航班订票管理系统,旨在为用户和管理员提供便捷的操作界面用户可以查询航班信息、订票退票,而管理员可以航班信息和乘客信息。通过文件读取和存数据,实现了基本增删改查。
数据结构设计:
1. 航班信息:包括起飞城市、抵达城市、航班号、机型、乘员定额、起飞时(星期几)、价格等。
2. 乘客信息:包括姓名、订票量、座位等级等。
3. 订单信息:关联航班信息和乘客信息,记录订票详情。
功能设计
用户功能模块:
1. 用户登录和注册:用户可以通过输入账号和密码进行登录。也可以注册账号,系统会将注册信息保存到文件中。
2. 查询航班:根据航班编号或起飞城市、抵达城市等条件查询航班信息。
3. 订票业务:乘客选择航班并输入订票信息,系统处理并生成订单,并保存客户信息。
4. 退票业务:乘客选择订单进行退票操作,系统更新航班空位信息,删除客户信息。
管理员功能模块:
1. 管理员登录,不可以进行注册,内部账号,登录成功后可以进行系统操作。
2. 打印所有航班信息:依次打印所有航班信息。
3. 查看乘客信息:根据输入的航班号和航班飞行日期,输入正确的情况下会打印该航班的各个舱位的订票客户信息。
4. 添加新的航班: 管理员可以添加航班,系统将航班新保存到结构体数组即内存中。
目的:
深入理解数据结构的概念及其在解决实际问题中的应用。
提高编程能力,培养系统设计和实现的能力。
锻炼团队协作和项目管理的能力。
要求:
系统能够正确、稳定地运行,满足基本功能需求。
数据结构设计合理,能够高效存储和检索信息。
代码清晰、可读性强,易于维护和扩展。
设计过程、步骤
-
概要设计
-
系统界面设计
身份选择界面:提供用户和管理员身份选择,用户可以选择登录为普通用户或管理员也可以选择退出程序。
用户登录/注册界面:提供用户登录注册操作,用户可以账号和密码进行,也可以选择注册新账号。
用户功能界面:提供用户查询班、订票、退票等操作,可以选择相应进行操作。
管理员登录界面:提供管理员操作,管理员可以账号和密码进行登录。
管理员功能界面:提供管理员查看航班信息、查看乘客、添加航班等操作,管理员可以选择应功能进行操作
总结
该系统通过模块化设计了用户和管理员的不同功能需求。用户方便地查询航班信息、进行订票和退票操作,而管理员高效地管理班信息和查看客户信息。系统文件存储数据,数据的持久和安全性得到保障。清晰的界面和流程设计,用户和管理员可以轻松地进行操作。
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.程序结束后用户的订票或者排队信息以及管理员添加的航班,系统未能将其写入外存,因为每个航班都有订票的客户和排队的客户,如果为每个航班都创建两个文件,需要太多的文件需要管理,觉得太麻烦了就没有实现此功能,然后我思考了能不能用数据库的知识来解决?目前正在学习数据库相关知识,寻求解决方案,未来我会更加完善我们的系统!
结束语:笔者水平有限,文章有不妥之处,恳请读者予以谅解。

