问题描述:
假定某民航有M个航次的班机,每个航次都只到达一个地方。试为该机场售票处设计一个自动订票和退票系统,要求系统具有以下功能:
(1) 订票:若该航次余票大于等于乘客订票数,则在该航次的乘客表中,插入订票乘客的信息项,并修改该航次有关数据,否则给出相应信息。
(2) 退票:若该航次当前退票数小于等于乘客原订票数,则在相应的乘客表中找到该乘客项,修改该航次及乘客表中有关数据;当某乘客由于退票使订票数为零时,则从乘客表中撤消该数据项。
要求:
(1)描述对航次表和乘客表选用的数据结构(顺序表、链表的综合应用);
(2)编程实现飞机票订票和退票系统(查询、更新、删除运算的实现)。
一、逻辑设计
编写一个模拟飞机票订票和退票系统,使该系统能够实现对航班信息的录入、浏览、查询以及订票、退票的功能。
根据题目要求,系统要处理的数据有两类:一类是乘客数据;另一类是航班数据。乘客数据是动态的,用链表存储;而航班数据是静态的,用队列存储。
乘客应包括的数据如下:
name 乘客姓名
TicketNum 购票数量
Passenger * next 下一节点指针
购买机票又要查询航班数据,航班应包括的数据如下:
StartTime 航班出发时间
EndTime 航班到达时间
MaxContain 最大载客数量
ReadyContain 当前已售票数量
PassengerNode * pHead 该航班乘客首指针
其应包含成员函数如下:
TypeFlight 构造函数
SetFlight 修改航班数据
GetDeparture 取出发时间
GetArrive 取到达时间
GetLength 获取航班时长
RemainTicket 获取余票数量
BuyTicket 成员函数:购票
CancelTicket 成员函数:退票
SearchTicket 成员函数:搜索乘客购票数量
为了实现出发与到达时间的输入输出及计算,定义了“时间”的抽象数据类型:
1、在TypeTime内部用整形数定义它的小时和分钟。
2、实现 + 、 - 运算的成员函数
3、利用重载的流函数来输出形如“hh:mm”的格式时间
#define MaxNode 100
#define charl 100
#define MaxContainf 100
int FlightAmount;
class TypeTime
{
private:
int hour;
int minute;
public:
TypeTime(int h,int m){hour=h;minute=m;}
TypeTime(){hour=0;minute=0;}
int Set(int h,int m)
{
if(h>=0&&h<24&&m>=0&&m<60){hour=h;minute=m;return 0;}
return 1;
}
TypeTime & operator + ( TypeTime & t2)
{
int flag = 0;
if (minute + t2.minute >= 60) flag = 1;
TypeTime *result = new TypeTime ((hour + t2.hour + flag) % 24, (minute + t2.minute) % 60);
return *result;
}
TypeTime & operator - ( TypeTime & t2)
{
int flag = 0;
if (minute - t2.minute <= 0) flag = -1;
TypeTime *result = new TypeTime ( hour - t2.hour + flag, minute - t2.minute - 60 * flag );
return *result;
}
friend ostream & operator << ( ostream & os, TypeTime & t )
{
os<<setfill('0')<<setw(2)<<t.hour<<":"<<setw(2)<<t.minute;
return os;
}
};
乘客数据可用一个结构来描述:
class PassengerNode
{
public:
char name[charl];
int TicketNum;
PassengerNode * pNext;
};
所有的航班数据进入一个队列,航班数据的描述如下:class TypeFlight
{
private:
TypeTime StartTime;
TypeTime EndTime;
int MaxContain;
int ReadyContain;
PassengerNode * pHead;
public:
TypeFlight()
{
pHead=new PassengerNode();
pHead->pNext=NULL;
}
void SetFlight(int h1,int m1,int h2,int m2,int MC)
{
StartTime.Set(h1,m1);
EndTime.Set(h2,m2);
MaxContain=MC;
ReadyContain=0;
}
TypeTime GetDeparture(){return StartTime;}
TypeTime GetArrive(){return EndTime;}
TypeTime GetLength(){return EndTime - StartTime;}
int RemainTicket(){return MaxContain - ReadyContain;}
int BuyTicket(char name[],int amount);
int CancelTicket(char name[],int amount);
int SearchTicket(char name[]);
};
TypeFlight Flight[MaxNode];
二、成员函数设计
int TypeFlight :: BuyTicket(char name[],int amount)
{
if(amount>this->RemainTicket()){cout<<"there is not enough ticket"<<endl;return 1;}
PassengerNode* p=new PassengerNode();
p=pHead;
while(p->pNext!=NULL)//找到尾节点
{
if(strcmp(p->name,name) == 0)
{
p->TicketNum += amount;
this->ReadyContain += amount;
return 0;
}
p=p->pNext;
}
PassengerNode* newNode=new PassengerNode();
newNode->pNext=NULL;
strcpy(newNode->name,name);
newNode->TicketNum=amount;
p=pHead;
if(pHead==NULL)
{
pHead=newNode; //新节点为链表头节点
}else
{
while(p->pNext!=NULL)//找到尾节点
p=p->pNext;
p->pNext=newNode; //在尾节点后面加入新节点
this->ReadyContain += amount;
}
return 0;
}
int TypeFlight :: CancelTicket(char name[],int amount)
{
PassengerNode* p=new PassengerNode();
PassengerNode* deleteNode=NULL;
p=pHead;
while(p->pNext!=NULL && strcmp(p->pNext->name,name) != 0) p=p->pNext;
if(p->pNext!=NULL && strcmp(p->pNext->name,name) == 0)
{
if(amount > p->pNext->TicketNum){cout<<"Excessive refund"<<endl;return 1;}
if(amount == p->pNext->TicketNum)
{
this->ReadyContain -= amount;
deleteNode=p->pNext;
p->pNext=p->pNext->pNext;
delete deleteNode;
deleteNode=NULL;
return 0;
}
p->pNext->TicketNum -= amount;
this->ReadyContain -= amount;
return 0;
}
cout<<endl<<"No such person!"<<endl;
return 1;
}
int TypeFlight :: SearchTicket(char name[])
{
PassengerNode* p=new PassengerNode();
p=pHead;
while(p->pNext!=NULL && strcmp(p->name,name) != 0) p=p->pNext;
if(strcmp(p->name,name) == 0)
{
return p->TicketNum;
}
return -1;
}
三、购票、退票、查询界面函数设计
void booking()
{
system("cls");
char name[charl];
int n1,n3,n2;
TypeTime t1,t2;
while(1){
system("cls");
cout<<"Booking\n"<<endl<<"Please enter your name\n";
scanf("%s", name);
cout<<endl<<"standby ticket:"<<endl<<endl<<"No. DEPT ARR remain"<<endl;
for(int i=0;i<FlightAmount;i++)
{
t2=Flight[i].GetArrive();
t1=Flight[i].GetDeparture();
cout<<setfill('0')<<i<<". "<<t1<<" "<<t2<<" "<<setw(3)<<Flight[i].RemainTicket()<<endl;
}
cout<<endl<<"Please enter your estimated ticket to purchase"<<endl;
scanf("%d", &n3);
if(n3>=FlightAmount||n3<0)
{
cout<<"no such ticket"<<endl;
cout<<"exit? 1.YES 0.NO"<<endl;
scanf("%d", &n1);
if(n1 == 1) break;
else continue;
}
cout<<"Please enter the quantity you require"<<endl;
scanf("%d", &n2);
if(Flight[n3].BuyTicket(name,n2)==0){cout<<endl<<"booking success!"<<endl;}
else cout<<endl<<"booking fail!"<<endl;
cout<<endl<<"exit? 1.YES 0.NO"<<endl;
scanf("%d", &n1);
if(n1 == 1) break;
else continue;
}
}
2、退票
void refunding()
{
system("cls");
char name[charl];
TypeTime t1,t2;
int n1=0,n2=-1,index[FlightAmount],a=0,n3=0;
while(1){
a=0,n1=0,n2=-1,n3=0;
system("cls");
cout<<"Refunding\n"<<endl<<"Please enter your name\n";
scanf("%s", name);
cout<<endl<<"Your tickets:"<<endl;
for(int i=0;i<FlightAmount;i++)
{
if(Flight[i].SearchTicket(name)<0) continue;
index[a++]=i;
n2=0;
t2=Flight[i].GetArrive();
t1=Flight[i].GetDeparture();
cout<<setfill('0')<<a-1<<". "<<t1<<" "<<t2<<" "<<setw(3)<<Flight[i].SearchTicket(name)<<" tickets"<<endl;
}
if(n2<0)
{
cout<<endl<<"No such person!"<<endl;
cout<<endl<<"exit? 1.YES 0.NO"<<endl;
scanf("%d", &n1);
if(n1 == 1) break;
else continue;
}
cout<<endl<<"Please enter your estimated ticket to refund"<<endl;
scanf("%d", &n3);
if(n3>=a||n3<0)
{
cout<<"no such ticket"<<endl;
cout<<"exit? 1.YES 0.NO"<<endl;
scanf("%d", &n1);
if(n1 == 1) break;
else continue;
}
n2=0;
cout<<"Please enter the quantity you require"<<endl;
scanf("%d", &n2);
if(Flight[index[n3]].CancelTicket(name,n2)==0){cout<<endl<<"refunding success!"<<endl;}
else cout<<endl<<"refunding fail!"<<endl;
cout<<endl<<"exit? 1.YES 0.NO"<<endl;
scanf("%d", &n1);
if(n1 == 1) break;
else continue;
}
}
3、查询
void searchp()
{
system("cls");
char name[charl];
TypeTime t1,t2;
int n1,n2=-1;
while(1){
system("cls");
cout<<"Order Query\n"<<endl<<"Please enter your name\n";
scanf("%s", name);
cout<<endl<<"Your tickets:"<<endl;
for(int i=0;i<FlightAmount;i++)
{
if(Flight[i].SearchTicket(name)<0) continue;
n2=0;
t2=Flight[i].GetArrive();
t1=Flight[i].GetDeparture();
cout<<setfill('0')<<t1<<" "<<t2<<" "<<setw(3)<<Flight[i].SearchTicket(name)<<" tickets"<<endl;
}
if(n2<0) cout<<"No such person"<<endl;
cout<<endl<<"exit? 1.YES 0.NO"<<endl;
scanf("%d", &n1);
if(n1 == 1) break;
}
}
四、航班的录入
void Input()
{
//初始输入输入
FILE *fp;
int i,dtht,dtmt,atht,atmt,MaxContain;
TypeTime temp1,temp2;
fp = fopen("plane.txt", "r");
fscanf(fp,"%d",&FlightAmount);
printf("%d\n", FlightAmount);
for(i = 0;i < FlightAmount;i++)
{
fscanf(fp, "%d:%d", &dtht,&dtmt);
fscanf(fp, "%d:%d", &atht,&atmt);
fscanf(fp,"%d",&MaxContain);
Flight[i].SetFlight(dtht,dtmt,atht,atmt,MaxContain);
temp1 = Flight[i].GetDeparture();
temp2 = Flight[i].GetArrive();
cout<<temp1<<" "<<temp2<<endl;
dtht=0;dtmt=0;atht=0;atmt=0;
}
fclose(fp);
}
输入格式如下:10
07:30 09:45 99
08:25 10:40 233
10:45 13:10 100
11:20 13:40 120
14:35 16:55 325
16:40 19:00 213
18:40 20:55 65
18:50 21:05 22
21:05 23:25 46
21:35 23:50 130
五、主程序设计
void newline(int n){for(int i = 1;i <= n;i++) cout<<endl;}
void space(int n){for(int i = 1;i <= n;i++)cout<<" ";}
int main()
{
int n, temp, s;
Input();
while(1)
{
system("cls");
newline(10);
space(20);
cout<<"Welcome to use the computerized reservation system"<<endl;
space(24);
printf("0.booking\n");
space(24);
printf("1.refunding\n");
space(24);
printf("2.Order Query\n");
space(24);
printf("3.exit\n");
scanf("%d", &n);
if(n == 3) break;
if(n == 0)
{
booking();
}
if(n == 1)
{
refunding();
}
if(n == 2)
{
searchp();
}
}
return 0;
}