www.pudn.com > Flight_Book.rar > 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"<>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"<>userID;
cout<<"\t*\t输入 密码: "<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<>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<>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<>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<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请输入密码:"<SetPassword(password);
cout<SetPopedom(0); //预置为超级用户
UserList.AddSort(user);
cout<<"\n-------------------------------------\n";
cout<<"\n\t创建用户成功,按任意键进入本系统!\n"<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;
Object *p;
char sel;
do{
cout<<"请输入要预订的航班:";
cin>>fltNo;
if(!(p = FlightList.Find(fltNo)))
{
cout<<"输入的航班不存在!\n";
cout<<"要继续订票吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}
else
{
flight = p->objPoint;
if(((CFlight *)flight)->GetCount() >= ((CFlight *)flight)->GetPeopleNum())
{
cout<<"该航班座位已满!\n";
cout<<"要继续订票吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}
else
break;
}
}while(1);
((CFlight *)flight)->Show();
cout<<"要预订此航班吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
{
((CFlight *)flight)->GetCount()++; //占用座位数加一
cout<<"请输入客户姓名:";
cin>>name;
cout<<"请输入客户身份证号:";
cin>>identityCard;
_getsystime(&bookTime);
bookTime.tm_year += 1900;
bookTime.tm_mon += 1;
psg->SetFltNo(fltNo);
psg->SetIdentity(identityCard);
psg->SetName(name);
psg->SetSeatNo(((CFlight *)flight)->GetCount());
psg->SetBookTime(bookTime);
PsgList.AddSort(psg);
cout<<"已成功预订!\n"<>iCard;
if(!(p = PsgList.Find(iCard)))
{
cout<<"该客户没有预订!\n";
cout<<"要继续退票吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}
else
break;
}while(1);
psg = p->objPoint;
((CPassenger *)psg)->Show();
cout<<"真的要退票吗?(y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
{
strcpy(fltNo,((CPassenger *)psg)->GetFltNo());
flight = FlightList.Find(fltNo)->objPoint;
((CFlight *)flight)->GetCount()--;
PsgList.Delete(iCard);
cout<<"已成功退票!\n"<>sel;
if(sel == '1')
{
cout<<"请输入航班号:";
cin>>fltNo;
if(!FlightList.Find(fltNo))
{
cout<<"输入的航班不存在!\n";
cout<<"要继续查询吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}
else
{
flight = FlightList.Find(fltNo)->objPoint;
((CFlight *)flight)->Show();
}
} //if(sel == '1')结束
if(sel == '2')
{
Object *p = FlightList.GetHead().nextObj;
cout<<"请输入起始地:";
cin>>from;
cout<<"请输入到达地:";
cin>>to;
while(p)
{
PASS *ps1 = ((CFlight *)(p->objPoint))->GetPass().nextStation;
while(ps1->nextStation)
{
if(strcmp(ps1->stationName, from) == 0)
break;
ps1 = ps1->nextStation;
}
PASS *ps2;
if(ps1->nextStation)
{
ps2 = ps1->nextStation;
while(ps2)
{
if(strcmp(to, ps2->stationName) == 0)
break;
ps2 = ps2->nextStation;
}
if(ps2)
{
bfind = true;
((CFlight *)(p->objPoint))->Show();
cout<<"航班的信息如下:\n";
((CFlight *)(p->objPoint))->ShowPass();
}
cout<<"按任意键继续查找下一个信息...\n"<nextObj;
} //while(p)结束
if(bfind)
cout<<"查找结束!\n";
else
cout<<"查找结束,未找到任何信息!\n";
} //if(sel == '2')结束
cout<<"要继续查询吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}while(1);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------------+
|要求输入客户身份证号,获得客户的订票信息 |
+-----------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void QueryPsg()
{
char iCard[19];
Object *p;
CBaseObj *psg;
char sel;
do{
cout<<"请输入乘客的身份证号:\n";
cin>>iCard;
if(p = PsgList.Find(iCard))
{
psg = p->objPoint;
((CPassenger *)psg)->Show();
cout<<"要继续查询吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}
else
{
cout<<"该客户没有任何预订!\n";
cout<<"要继续查询吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}
}while(1);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------------+
|修改某一个航班的信息 |
+-----------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void FlightModify(CFlight *flight);
void ModifyFlight()
{
char fltNo[10];
CBaseObj *flight;
Object *p;
char sel;
do{
cout<<"请输入要修改的航班号:";
cin>>fltNo;
p = FlightList.Find(fltNo);
if(!p)
cout<<"要修改的航班不存在!\n";
else
{
flight = p->objPoint;
((CFlight *)flight)->Show();
FlightModify((CFlight *)flight);
}
cout<<"要继续修改其他航班吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}while(1);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------------+
|选择修改某一个航班的哪部分信息 |
+-----------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void FlightModify(CFlight *flight)
{
char from[20]; //起飞港
char to[20]; //到达港
tm start; //起飞时间
tm arrive; //到达时间
int peopleNum; //乘客限额
char station[20];
char sel;
do{
cout<<"要修改那部分信息?\n";
cout<<"1. 起始港及起飞时间 2. 到达港及到达时间\n";
cout<<"3. 乘客限额 4. 添加途径港 5. 删除途径港\n";
cout<<"请选择(1 ~ 5):";
cin>>sel;
switch(sel)
{
case '1':
cout<<"输入新的起始港:";
cin>>from;
cout<<"输入新的起飞时间(hh mm):";
cin>>start.tm_hour>>start.tm_min;
flight->SetFrom(from);
flight->SetStart(start);
break;
case '2':
cout<<"输入新的到达港:";
cin>>to;
cout<<"输入新的到达时间(hh mm):";
cin>>arrive.tm_hour>>arrive.tm_min;
flight->SetTo(to);
flight->SetArrive(arrive);
break;
case '3':
cout<<"输入新的乘客限额:";
cin>>peopleNum;
flight->SetPeopleNo(peopleNum);
break;
case '4':
flight->SetPass();
break;
case '5':
cout<<"输入要删除的航空港(起始,到达港除外):";
cin>>station;
if(!(flight->DelPass(station)))
cout<<"输入信息错误!\n";
break;
}
cout<<"要继续修改其他信息吗?(Y / N):";
cin>>sel;
if(sel == 'y' || sel == 'Y')
continue;
if(sel == 'n' || sel == 'N')
return;
}while(1);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------------+
|添加一个航班 |
+-----------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void AddFlight()
{
CFlight *flight;
flight = new CFlight();
char fltNo[10] = ""; //航班号
char from[20] = ""; //起飞港
char to[20] = ""; //到达港
tm start; //起飞时间
tm arrive; //到达时间
int peopleNum; //乘客限额
cout<<"请输入航班号:";
cin>>fltNo;
cout<<"请输入起飞港:";
cin>>from;
cout<<"请输入起飞时间(hh mm):";
cin>>start.tm_hour>>start.tm_min;
cout<<"请输入到达港:";
cin>>to;
cout<<"请输入到达时间(hh mm):";
cin>>arrive.tm_hour>>arrive.tm_min;
cout<<"请输入乘客限额:";
cin>>peopleNum;
flight->InitPass();
flight->SetFltNo(fltNo);
flight->SetFrom(from);
flight->SetStart(start);
flight->SetTo(to);
flight->SetArrive(arrive);
flight->SetPeopleNo(peopleNum);
// flight->InitPass();
FlightList.AddSort(flight);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------------+
|删除一个航班 |
+-----------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void DelFlight()
{
char fltNo[10];
cout<<"请输入要删除的航班号:";
cin>>fltNo;
if(!FlightList.Delete(fltNo))
cout<<"输入的航班不存在!\n";
else
cout<<"已成功取消航班!\n";
cout<>userID;
p = UserList.Find(userID);
if(!p)
cout<<"要修改的用户不存在!\n"<objPoint;
cout<<"该用户信息如下:\n";
((CUser *)user)->Show();
cout<<"要修改那一部分?\n";
cout<<"1. 用户名 2. 密码 3. 用户权限\n";
cin>>sel;
switch(sel)
{
case '1':
cout<<"请输入新用户名:";
cin>>userID;
((CUser *)user)->SetUserID(userID);
break;
case '2':
cout<<"请输入新密码:"<SetPassword(password);
break;
case '3':
cout<<"请输入新权限(0 :超级用户 1: 普通用户):";
cin>>popedom;
((CUser *)user)->SetPopedom(popedom);
break;
}
}
}
else
{
cout<objPoint;
cout<<"要修改那一部分?\n";
cout<<"1. 用户名 2. 密码\n";
cin>>sel;
switch(sel)
{
case '1':
cout<<"请输入新用户名:";
cin>>userID;
((CUser *)user)->SetUserID(userID);
LoginUser.SetUserID(userID);
break;
case '2':
cout<<"请输入新密码:"<SetPassword(password);
LoginUser.SetPassword(password);
break;
}
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------------+
|添加一个航班,只有超级用户有此权限 |
+-----------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void AddUser()
{
CUser *user;
user = new CUser;
char userID[20];
char password[20];
int popedom, i;
cout<<"请输入新用户名:";
cin>>userID;
user->SetUserID(userID);
cout<<"请输入新密码:"<SetPassword(password);
cout<>popedom;
user->SetPopedom(popedom);
UserList.AddSort(user);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------------+
|删除某个用户,只有超级用户有此权限 |
+-----------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void DelUser()
{
char userID[20];
cout<<"请输入要删除的用户名:";
cin>>userID;
if(!UserList.Delete(userID))
cout<<"输入的用户不存在!\n";
else
cout<<"已成功删除用户!\n";
cout<