售票處的服務系統(***)
要用到文件操作,使用CodeBlocks,建議放到同一目錄下
[問題描述]
航空客運訂票的業務活動包括:查詢航線、客票預訂和辦理退票等。試設計一個航空客運訂票系統,以使上述業務可以藉助計算機來完成。
[系統要求]
- 設民航售票處的計算機系統可以爲客戶提供下列各項服務:
- 查詢航線:根據旅客提出的終點站名輸出下列信息:航班號、飛機號、星期幾飛行,最近一天航班的日期和餘票額;
- 承辦訂票業務:根據客戶提出的要求(日期、航班號、訂票數額)查詢該航班票額情況,若尚有餘額,則爲客戶辦理訂票手續,輸出座位號;若已滿員或餘票額少於訂票額,則需要重新詢問客戶要求。若需要,可預約登記排隊等候。
- 承辦退票業務:根據客戶提供的情況(日期、航班、退票數額),爲客戶辦理退票手續,然後查詢該航班是否有人預約登記,首先詢問排在第一的客戶,若所退票額能滿足他的要求,則爲他辦理訂票手續,否則依次詢問其他排隊預約的客戶。
[測試數據]
由學生任意指定,但報告上要求寫出多批數據測試結果。
[實現提示]
每條航線應包含的信息有:終點站名、航班號、飛機號、飛行日期(星期幾)、乘員定額、餘票額、已訂票的客戶名單(包括姓名、訂票額、座位號)和預約登記的客戶名單(包括日期、姓名、所需票額)。這最後兩項顯然是一個線性表和一個隊列。爲查找方便、已訂票客戶的線性表應按客戶姓名有序,並且,爲插入和刪除方便,應以鏈表作存儲結構。由於預約人數無法預料,隊列也應以鏈表作存儲結構。整個系統需彙總各條航線的情況登錄在一張線性表上,由於航線基本不變,可採用順序存儲結構,並按航班有序或按終點站名有序。每條航線是這張表上的一個記錄,包含上述八個域,其中乘員名單域爲指向乘員名單鏈表的頭指針,預約登記客戶名單域爲分別指向隊頭和隊尾的指針。
[文件內容]
[設計思路]
- 從文件讀入航班信息
- 結構使用棧和隊列
- 鏈式儲存乘客信息
- 處理座位關係
[代碼及註釋]
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
#define MAXSIZE 111 /*最大航班數*/
#define MAXNUM 3 /*最大座位數*/
int flag=0; /*判斷結束標誌*/
//結構
typedef struct QNode{
string name; /*乘客姓名*/
string id; /*乘客身份證*/
int num; /*乘客排隊等待號*/
struct QNode *next; /*指針域*/
}QNode,*QueuePtr; /*結點類型,結點指針類型*/
typedef struct{
QueuePtr Front; /*頭指針*/
QueuePtr Real; /*尾指針*/
}LinkQueue; /*鏈隊類型*/
typedef struct people{
string name; /*乘客姓名*/
string id; /*乘客身份證*/
int seat; /*乘客座位*/
people *next; /*指針域*/
}People,*LinkList; /*結點類型,結點指針類型*/
typedef struct{
string name; /*飛機號*/
string id; /*航班號*/
string to; /*目的地*/
string date; /*日期*/
int sum; /*總座位數*/
int use; /*使用的座位數*/
int remain; /*剩餘的座位數*/
int waitnum; /*等待總數*/
LinkList L; /*購票的乘客,使用鏈表*/
LinkQueue Q; /*排隊等待的乘客,使用鏈隊*/
}Single; /*結點類型*/
typedef struct{
Single air[MAXSIZE]; /*MAXSIZE個飛機結點*/
int num; /*航班總數*/
}FLight; /*使用順序表表示航班系統*/
//子函數
void SinglePrint(FLight &F); /*打印單一航班信息*/
bool Read(FLight &F); /*從文件讀入數據並初始化*/
bool EmptyQueue(FLight &F,int index); /*判斷隊列是否爲空*/
void EnQueue(FLight &F,int index); /*進隊*/
void DeQueue(FLight &F,int index,LinkList &S);/*出隊*/
void SingleBooking(FLight &F,int index); /*單一乘客訂票*/
void Booking(FLight &F); /*訂票總操作*/
void SingleBack(FLight &F,int index); /*單一乘客退票*/
void Back(FLight &F); /*退票總操作*/
void Print(FLight &F); /*打印全部航班信息*/
void Show(FLight &F); /*打印具體航班信息*/
void Menu(FLight &F); /*操作彙總*/
//具體內容
void SinglePrint(FLight &F)
{
cout<<"輸入目的地:";
string TO;
cin>>TO;
int vis=0; /*判斷標誌*/
for(int k=1;k<=F.num;++k)
if(F.air[k].to==TO)
{
vis=1;
break;
}
if(!vis)
{
cout<<"沒有查詢到此航班"<<endl;
return;
}
cout<<" ---------------------------------------------------------------------"<<endl;
cout<<"|查詢到目的地爲"<<TO<<"的航班如下! |"<<endl;
cout<<"| 飛機號"<<" 航班號"<<" 目的地"<<" 日期"<<" 總座位數"<<" 剩餘座位數"<<" 排隊等待數 |"<<endl;
for(int k=1;k<=F.num;++k)
if(F.air[k].to==TO)
cout<<"| "<<F.air[k].name<<" "<<F.air[k].id<<" "<<F.air[k].to<<" "<<F.air[k].date<<" "
<<F.air[k].sum<<" "<<F.air[k].remain<<" "<<F.air[k].waitnum<<" |"<<endl;
cout<<" ---------------------------------------------------------------------"<<endl;
}
bool Read(FLight &F)
{
ifstream in("in.txt");
int k=1;
while(1)
{
in>>F.air[k].name>>F.air[k].id>>F.air[k].to>>F.air[k].date;
if(F.air[1].name=="")
{
cout<<"文件讀取失敗"<<endl;
cout<<"-------------------------------------"<<endl;
return false;
}
F.air[k].sum=MAXNUM;
F.air[k].use=0;
F.air[k].remain=MAXNUM;
F.air[k].waitnum=0;
F.air[k].L=new People;
F.air[k].L->next=NULL;
F.air[k].Q.Front=F.air[k].Q.Real=new QNode;
F.air[k].Q.Front->next=NULL;
/*初始化*/
if(F.air[k].name=="")break;
++k;
}
F.num=k-1; /*航班數量*/
cout<<"文件讀取成功"<<endl;
return true;
}
bool EmptyQueue(FLight &F,int index)
{
if(F.air[index].Q.Front==F.air[index].Q.Real)return true;
return false;
}
void EnQueue(FLight &F,int index)
{
cout<<"輸入登機人的姓名與身份證號(空格隔開):";
QueuePtr S=new QNode;
cin>>S->name>>S->id;
S->next=NULL;
F.air[index].waitnum++;
F.air[index].Q.Real->next=S;
F.air[index].Q.Real=S;
S->num=F.air[index].waitnum;
cout<<endl;
cout<<"恭喜您,預約成功,您的信息如下,請牢記!"<<endl;
cout<<"--------------------"<<endl;
cout<<"|飛機號:"<<F.air[index].name<<endl;
cout<<"|航班號:"<<F.air[index].id<<endl;
cout<<"|姓 名:"<<S->name<<endl;
cout<<"|身份證:"<<S->id<<endl;
cout<<"|等待號:"<<S->num<<endl;
cout<<"--------------------"<<endl;
}
void DeQueue(FLight &F,int index,LinkList &S)
{
QueuePtr T=F.air[index].Q.Front->next;
while(T)
{
T->num--;/*該乘客後面的乘客等待號減1*/
T=T->next;
}
T=F.air[index].Q.Front->next;
S->name=T->name;
S->id=T->id;
F.air[index].Q.Front->next=T->next;
if(T==F.air[index].Q.Real)
F.air[index].Q.Real=F.air[index].Q.Front;
/*如果出隊的是隊尾元素,重新賦值*/
delete T;
}
void SingleBooking(FLight &F,int index)
{
cout<<"輸入登機人的姓名與身份證號(空格隔開):";
LinkList S=new People;
S->next=NULL;
cin>>S->name>>S->id;
LinkList P=F.air[index].L;
while(P->next)P=P->next;/*找到鏈表隊尾指針*/
F.air[index].use++;
F.air[index].remain--;
P->next=S;
P=S; /*尾插法*/
S->seat=F.air[index].use;
cout<<endl;
cout<<"恭喜您,訂票成功,您的信息如下,請妥善保存!"<<endl;
cout<<"--------------------"<<endl;
cout<<"|飛機號:"<<F.air[index].name<<endl;
cout<<"|航班號:"<<F.air[index].id<<endl;
cout<<"|姓 名:"<<S->name<<endl;
cout<<"|身份證:"<<S->id<<endl;
cout<<"|座位號:"<<S->seat<<endl;
cout<<"--------------------"<<endl;
}
void Booking(FLight &F)
{
Print(F);
cout<<endl;
cout<<" <訂票業務>"<<endl<<endl;
string DATE,ID;
int SUM;
cout<<"輸入日期、航班號及訂票數(空格隔開):";
cin>>DATE>>ID>>SUM;
int index=0;
for(int i=1;i<=F.num;++i)
if(F.air[i].id==ID&&F.air[i].date==DATE)
{
index=i;
break;
}
if(!index)
{
cout<<"<<<<沒有此航班"<<endl;
return;
}
if(F.air[index].remain>=SUM)
while(SUM--)SingleBooking(F,index);
else
{
cout<<"<<<<該航班餘額票小於您的訂票額,還剩下"<<F.air[index].remain<<"張票,是否繼續購買?(y/n)";
char ch;
cin>>ch;
if(ch=='y')
{
int others=SUM-F.air[index].remain;
int k=F.air[index].remain;
while(k--)SingleBooking(F,index);
cout<<endl;
cout<<"<<<<剩下的"<<others<<"人已經自動進入預約業務"<<endl;
cout<<" <預約業務>"<<endl<<endl;
while(others--)EnQueue(F,index);
}
else return;
}
}
void SingleBack(FLight &F,int index)
{
cout<<"登機人的姓名與身份證號(空格隔開):";
string NAME,ID;
cin>>NAME>>ID;
LinkList T=F.air[index].L;
int vis=0;
while(T->next)
{
if(T->next->id==ID&&T->next->name==NAME)
{
vis=1;
LinkList p=T->next;
T->next=p->next;
F.air[index].use--;
F.air[index].remain++;
delete p;
cout<<"<<<<退票成功"<<endl;
break;
}
T=T->next;
}
QueuePtr p=F.air[index].Q.Front;
if(!vis)/*從已經購票的乘客沒有找到要退票的乘客,進入預約訂票尋找*/
{
while(p->next)
{
if(p->next->id==ID&&p->next->name==NAME)
{
vis=1;
QueuePtr t=p->next;
while(t){t->num--;t=t->next;}/*此人後面的等待號減1*/
t=p->next;
p->next=t->next;
if(t==F.air[index].Q.Real)
F.air[index].Q.Real=F.air[index].Q.Front;
delete t;
cout<<"<<<<退票成功"<<endl;
break;
}
p=p->next;
}
if(!vis)cout<<"<<<<沒有該乘客,輸入信息有誤"<<endl;
}
else
{
if(!EmptyQueue(F,index))
{
cout<<"已經有人退票!"<<endl;
cout<<"姓名爲"<<F.air[index].Q.Front->next->name;
cout<<"身份證爲"<<F.air[index].Q.Front->next->id<<"的用戶現在是否訂票?(y/n)";
char op;
cin>>op;
if(op!='y')return;
LinkList S=new People;
S->next=NULL;
DeQueue(F,index,S);
F.air[index].use++;
F.air[index].remain--;
LinkList P=F.air[index].L;
while(P->next)P=P->next;
P->next=S;
P=S;/*尾插法*/
F.air[index].waitnum--;/*總等待人數減1*/
for(int i=1;i<=MAXNUM;++i)
{
LinkList p=F.air[index].L->next;
while(p)
{
if(p->seat==i)
break;
p=p->next;
}
if(!p)
S->seat=i;
}/*爲新訂票的乘客分配座位*/
cout<<"訂票成功,您的信息如下"<<endl;
cout<<"----------------------------------"<<endl;
cout<<"姓名"<<S->name<<endl;
cout<<"身份證"<<S->id<<endl;
cout<<"航班"<<F.air[index].id<<endl;
cout<<"座位號"<<S->seat<<endl;
cout<<"----------------------------------"<<endl;
}
}
}
void Back(FLight &F)
{
Print(F);
cout<<endl;
cout<<" <退票業務>"<<endl<<endl;
string DATE,ID;
int SUM;
cout<<"輸入日期、航班號及退票數(空格隔開):";
cin>>DATE>>ID>>SUM;
int index=0;
for(int i=1;i<=F.num;++i)
if(F.air[i].id==ID&&F.air[i].date==DATE)
{
index=i;
break;
}
if(!index){cout<<"<<<<沒有此航班"<<endl;return;}
while(SUM--)SingleBack(F,index);
}
void Print(FLight &F)
{
cout<<" ---------------------------------------------------------------------"<<endl;
cout<<"| 航班總數:"<<F.num<<" |"<<endl;
cout<<"| 飛機號"<<" 航班號"<<" 目的地"<<" 日期"<<" 總座位數"<<" 剩餘座位數"<<" 排隊等待數 |"<<endl;
for(int k=1;k<=F.num;++k)
cout<<"| "<<F.air[k].name<<" "<<F.air[k].id<<" "<<F.air[k].to<<" "<<F.air[k].date<<" "
<<F.air[k].sum<<" "<<F.air[k].remain<<" "<<F.air[k].waitnum<<" |"<<endl;
cout<<" ---------------------------------------------------------------------"<<endl;
}
void Show(FLight &F)
{
for(int k=1;k<=F.num;++k)
{
cout<<"--------------------航班號:"<<F.air[k].id<<"--------------------"<<endl<<endl;
cout<<" <已訂票的乘客>"<<endl<<endl;
LinkList p=F.air[k].L->next;
while(p)
{
cout<<"|姓 名:"<<p->name<<endl;
cout<<"|身份證:"<<p->id<<endl;
cout<<"|座位號:"<<p->seat<<endl<<endl;
p=p->next;
}
cout<<" <預約排隊的乘客>"<<endl<<endl;
QueuePtr q=F.air[k].Q.Front->next;
while(q)
{
cout<<"|姓 名:"<<q->name<<endl;
cout<<"|身份證:"<<q->id<<endl;
cout<<"|座位號:"<<q->num<<endl<<endl;
q=q->next;
}
}
}
void Menu(FLight &F)
{
cout<<" -----------------------------------"<<endl;
cout<<" | 歡迎來到航空客運訂票系統 |"<<endl;
cout<<" |-----------------------------------|"<<endl;
cout<<" | 1--查詢航線 |"<<endl;
cout<<" | 2--訂票 |"<<endl;
cout<<" | 3--退票 |"<<endl;
cout<<" | 4--查詢全部航班 |"<<endl;
cout<<" | 5--查詢各航班具體情況 |"<<endl;
cout<<" | 其他--退出 |"<<endl;
cout<<" -----------------------------------"<<endl;
int op;
cout<<"輸入你的選擇:";
cin>>op;
switch(op)
{
case 1:SinglePrint(F);break;
case 2:Booking(F);break;
case 3:Back(F);break;
case 4:Print(F);break;
case 5:Show(F);break;
default :flag=1;cout<<"歡迎下次再來!"<<endl;
}
}
int main()
{
FLight F;
if(Read(F))
while(1)
{
Menu(F);
if(flag)break;
system("pause");
system("cls");
}
return 0;
}
[簡單展示]