📄 ticketbook.cpp
字号:
#include "iostream.h"
#include "fstream.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"
#include "DataType.h"
#include "user.h"
#include "ObjArray.h"
#include "Flight.h"
#include "Passenger.h"
#include "User.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------+
|下面是一些菜单字符串常量 |
+-----------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char *MainMenu[] = { "1. 订票\n",
"2. 退票\n",
"3. 查询\n",
"4. 航班管理\n",
"5. 用户管理\n",
"6. 用户注销\n",
"7. 退出系统\n"
}; //主菜单
char *QueryMenu[] = { "1. 航班查询\n",
"2. 客户查询\n",
"3. 返回主菜单\n"
};
char *FlightManageMenu[] = { "1. 修改航班信息\n",
"2. 新增航班\n",
"3. 取消航班\n",
"4. 返回主菜单\n"
};
char *UserManageMenu[] = { "1. 修改用户信息\n",
"2. 添加用户\n",
"3. 删除用户\n",
"4. 返回主菜单\n"
};
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------+
|下面是一些函数原型声明 |
+-----------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
bool Login(CUser &);
void ManageFlight(CUser);
void ManageUser(CUser);
void Query(CUser);
void ReadData();
void StoreData();
void Book();
void Cancel();
void QueryFlight();
void QueryPsg();
void ModifyFlight();
void AddFlight();
void DelFlight();
void ModifyUser(CUser LoginUser);
void AddUser();
void DelUser();
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+--------------------------------+
|这是三个分别存储三个类的对象的 |
|链表 |
+--------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CObjArray FlightList(FLIGHT); //航班列表
CObjArray PsgList(PASSENGER); //客户列表
CObjArray UserList(USER); //用户列表
void main()
{
ReadData();
cout<<"用户帮助:\n";
cout<<"******************************\n\n";
cout<<"进入系统需要先登录,文件中已有一个帐户,名: admin , 密码: nuaa\n";
cout<<"或者删除文件 \"User,dat\" ,再次登录系统会提示你新建一个用户\n";
cout<<"文件中已有一航班信息, 航班号: CZ14,可以用来做些测试\n\n";
cout<<"*******************************\n";
cout<<"按任意键进入系统...\n"<<flush;
getch();
system("cls");
CUser LoginUser;
int Sel = 0, state;
while(!Login(LoginUser))
{
cout<<"\n用户名或密码错误,请重新登陆!\n"<<flush;
system("pause");
system("cls");
}
cout<<"您好 "<<LoginUser.GetUserID()<<",您已登陆!\n"<<flush;
system("pause");
system("cls");
while(Sel!= 7)
{
cout<<LoginUser.GetUserID()<<" 您现在主菜单:\n";
cout<<"----------------------------------------------\n\n";
for(int i=0;i<7;i++)
cout<<"\t\t*\t"<<MainMenu[i];
cout<<"\n---------------------------------------------\n";
cout<<"输入选择( 1 ~ 7):\t";
cin>>Sel;
state=cin.rdstate();
if(state)
{
char error[81];
cin.clear();
cin.getline(error,80);
Sel=8;
}
switch(Sel)
{
case 1:
Book();
system("pause");
system("cls");
break;
case 2:
Cancel();
system("pause");
system("cls");
break;
case 3:
system("cls");
Query(LoginUser);
break;
case 4:
system("cls");
ManageFlight(LoginUser);
break;
case 5:
system("cls");
ManageUser(LoginUser);
break;
case 6:
system("cls");
while(!Login(LoginUser))
{
cout<<"用户名或密码错误,请重新登陆!\n"<<flush;
system("pause");
system("cls");
}
break;
case 7:
StoreData();
// system("cls");
cout<<"\n数据已保存至文件, 按任意键退出系统!\n"<<flush;
getch();
return;
break;
default:
;
}
cout<<flush;
system("cls");
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+--------------------------------+
|这是负责登陆的函数, 登陆失败 |
|返回false |
+--------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
bool Login(CUser &login)
{
char userID[20];
char password[20];
CBaseObj *user;
Object *p = NULL;
cout<<"\n\n\t欢迎进入民航订票系统\n登陆界面:\n";
cout<<"--------------------------------------\n\n";
cout<<"\t*\t输入用户名: ";
cin>>userID;
cout<<"\t*\t输入 密码: "<<flush;
for(int i = 0;i < 20; i++)
{
password[i] = getch();
if(password[i] == '\r')
{
password[i] = '\0';
break;
}
cout<<"*"<<flush;
}
if(p = UserList.Find(userID))
{
user = p->objPoint;
if(strcmp(password, ((CUser *)user)->GetPassword()) == 0)
{
cout<<"\n\n--------------------------------------\n";
login = *((CUser *)user);
return true;
}
}
cout<<"\n\n--------------------------------------\n";
return false;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------+
|以下这些函数很简单,不用注释 |
+-----------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void ManageFlight(CUser LoginUser)
{
int Sel = 0, state;
while(Sel!= 4)
{
cout<<LoginUser.GetUserID()<<" 您现在航班管理菜单:\n";
cout<<"----------------------------------------------\n\n";
for(int i=0;i<4;i++)
cout<<"\t\t*\t"<<FlightManageMenu[i];
cout<<"\n---------------------------------------------\n";
cout<<"输入选择( 1 ~ 4):\t";
cin>>Sel;
state=cin.rdstate();
if(state)
{
char error[81];
cin.clear();
cin.getline(error,80);
Sel=8;
}
switch(Sel)
{
case 1:
ModifyFlight();
break;
case 2:
AddFlight();
break;
case 3:
DelFlight();
break;
case 4:
break;
default:
;
}
system("pause");
cout<<flush;
system("cls");
}
}
void ManageUser(CUser LoginUser)
{
int Sel = 0, state;
while(Sel!= 4)
{
cout<<LoginUser.GetUserID()<<" 您现在用户管理菜单:\n";
cout<<"----------------------------------------------\n\n";
for(int i=0;i<4;i++)
cout<<"\t\t*\t"<<UserManageMenu[i];
cout<<"\n---------------------------------------------\n";
cout<<"输入选择( 1 ~ 4):\t";
cin>>Sel;
state=cin.rdstate();
if(state)
{
char error[81];
cin.clear();
cin.getline(error,80);
Sel=8;
}
switch(Sel)
{
case 1:
ModifyUser(LoginUser);
break;
case 2:
if(LoginUser.GetPopedom() == 0)
AddUser();
else
cout<<LoginUser.GetUserID()<<" 您不是超级用户,不能添加用户!\n";
break;
case 3:
if(LoginUser.GetPopedom() == 0)
DelUser();
else
cout<<LoginUser.GetUserID()<<" 您不是超级用户,不能删除用户!\n";
break;
case 4:
break;
default:
;
}
system("pause");
cout<<flush;
system("cls");
}
}
void Query(CUser LoginUser)
{
int Sel = 0, state;
while(Sel!= 3)
{
cout<<LoginUser.GetUserID()<<" 您现在查询菜单:\n";
cout<<"----------------------------------------------\n\n";
for(int i=0;i<3;i++)
cout<<"\t\t*\t"<<QueryMenu[i];
cout<<"\n---------------------------------------------\n";
cout<<"输入选择( 1 ~ 3):\t";
cin>>Sel;
state=cin.rdstate();
if(state)
{
char error[81];
cin.clear();
cin.getline(error,80);
Sel=8;
}
switch(Sel)
{
case 1:
QueryFlight();
break;
case 2:
QueryPsg();
break;
case 3:
break;
default:
;
}
system("pause");
cout<<flush;
system("cls");
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-------------------------------------+
|此函数负责从三个二进制文件中读取数据 |
|分别放到三个链表中 |
+-------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void ReadData()
{
fstream inFile;
CFlight *flight;
CPassenger *psg;
CUser *user;
int count;
PASS *ps;
PASS *from, *to;
inFile.open("Flight.dat", ios::in|ios::binary|ios::nocreate);
if(!inFile.fail())
{
flight = new CFlight();
inFile.read((char *)flight, sizeof(CFlight));
flight->InitPass();
from = flight->GetPass().nextStation;
to = from->nextStation;
inFile.read((char *)&count, sizeof(int));
while(!inFile.eof())
{
for(int i = 0;i < count;i++)
{
ps = new PASS;
inFile.read((char *)ps, sizeof(PASS));
from->nextStation = ps;
ps->nextStation = to;
from = ps;
}
FlightList.AddSort(flight);
flight = new CFlight;
inFile.read((char *)flight, sizeof(CFlight));
flight->InitPass();
from = flight->GetPass().nextStation;
to = from->nextStation;
inFile.read((char *)&count, sizeof(int));
}
inFile.close();
}
inFile.clear();
inFile.open("Passenger.dat", ios::in|ios::binary|ios::nocreate);
if(!inFile.fail())
{
psg = new CPassenger;
inFile.read((char *)psg, sizeof(CPassenger));
while(!inFile.eof())
{
PsgList.AddSort(psg);
psg = new CPassenger;
inFile.read((char *)psg, sizeof(CPassenger));
}
}
inFile.close();
inFile.clear();
inFile.open("User.dat", ios::in|ios::binary|ios::nocreate);
if(!inFile.fail())
{
user = new CUser;
inFile.read((char *)user, sizeof(CUser));
while(!inFile.eof())
{
UserList.AddSort(user);
user = new CUser;
inFile.read((char *)user, sizeof(CUser));
}
inFile.close();
}
else
{
user = new CUser;
char userID[20];
char password[20];
cout<<"\n\n\t本系统首次使用,请先建一个超级用户!\n";
cout<<"-------------------------------------\n";
cout<<"\t请输入用户名:";
cin>>userID;
user->SetUserID(userID);
cout<<"\t请输入密码:"<<flush;
for(int i = 0;i < 20; i++)
{
password[i] = getch();
if(password[i] == '\r')
{
password[i] = '\0';
break;
}
cout<<"*"<<flush;
}
user->SetPassword(password);
cout<<endl;
user->SetPopedom(0); //预置为超级用户
UserList.AddSort(user);
cout<<"\n-------------------------------------\n";
cout<<"\n\t创建用户成功,按任意键进入本系统!\n"<<flush;
getch();
system("cls");
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-------------------------------------+
|此函数负责向四个二进制文件中写入数据 |
|其中之一来存放途径港信息 | |
+-------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void StoreData()
{
fstream outFile;
outFile.open("Flight.dat", ios::out|ios::binary);
if(!outFile.fail())
{
Object *p;
CFlight *flight;
p = FlightList.GetHead().nextObj;
while(p)
{
flight = (CFlight *)(p->objPoint);
outFile.write((char *)flight, sizeof(CFlight));
int count = flight->GetPsCount();
outFile.write((char *)&count, sizeof(int));
//这里做了一些修改,留待测试是否可行
//这段代码是想文件写入航班的途径港信息
PASS *q = flight->GetPass().nextStation;
q = q->nextStation;
while(q->nextStation)
{
outFile.write((char *)q, sizeof(PASS));
q = q->nextStation;
}
p = p->nextObj;
}
}
outFile.close();
outFile.clear();
outFile.open("Passenger.dat", ios::out|ios::binary);
if(!outFile.fail())
{
Object *p;
p = PsgList.GetHead().nextObj;
while(p)
{
outFile.write((char *)((CPassenger *)p->objPoint), sizeof(CPassenger));
p = p->nextObj;
}
}
outFile.close();
outFile.clear();
outFile.open("User.dat", ios::out|ios::binary);
if(!outFile.fail())
{
Object *p;
p = UserList.GetHead().nextObj;
while(p)
{
outFile.write((char *)((CUser *)p->objPoint), sizeof(CUser));
p = p->nextObj;
}
}
outFile.close();
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-------------------------------------+
|此函数负责向客户的订票,要求输入航班号|
|然后要求输入客户姓名,身份证号 |
|并且自动读取系统时间,作为订票时间 |
+-------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void Book()
{
CPassenger *psg;
psg = new CPassenger;
char name[20]; //姓名
char identityCard[19]; //身份证号
tm bookTime; //订票时间
char fltNo[10]; //航班号
CBaseObj *flight;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -