悬赏一个实验设计
航空客运订票系统【问题描述】:包括:查询航线、客票预定、和办理退票等。【基本要求】:(1)每条航线所涉及的信息有:终点站名,航班号,飞机号,飞行日期(星期几),乘员定额,余票量,已订票的客户名单(包括姓名,订票量,航位等级 1,2,或3)以及等候的客户名单(包括姓名,所需票量);
(2)作为示意系统,全部数据可以只存放在内存中;
(3)系统能实现的操作功能如下:
①查询航线:根据旅客提出的终点站名输出下列信息:航班号,飞机号,飞行日期,最近一天的航班的日期和余票量;
②承办订票业务:根据客户提出的要(航班号、订票数额)查询改航班票额情况,如果还有余票,则为客户办理订票手续,输出座位号,如果满员或者余票额少于订票额,则重新询问客户要求,如果客户需要,可登记排队作为候补;
③承办退票业务:根据客户提供的情况(日期,航班)为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一位的客户,如果的退票额能满足他的需求,则为他办理订票手续,否则一次询问其他排队候补的客户。
【测试数据】:自行制定。
【实现提示】:两个客户名单可以分别由线性表和队列实现,为了方便查找,已订票客户的线性表应该按照客户姓名的有序,并且,为了方便插入和删除应该以链表作为存储结构。由于预约人数无法估计,队列也应该以链表作为存储结构。这个系统需要汇总各条航线的情况登记在一张线性表上,由于航线基本不变,可以采用顺序存储结构,别按照航班有序或者按照终点站有序。每条航线是这张表上的一个记录,包含上述八个域。其中乘员名单域为指向乘员名单链表的头指针,等货替补的客户名单域为分别指向队头和队尾的指针。
要求C/C++实现,注释尽量多一些便于理解,友好的用户界面,提示用户需要输入的信息, 将测试数据一并提交。
这种程序也就是烦点,其实一点都不难。如果LZ实在是有困难,拿个20元RMB,就有人可以帮你写好代码了。 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*已订票者*/
typedef struct Orderman
{
char name;
int ordernum;/*订票量*/
int grade;
struct Orderman *next;
}LinkList;
/*等待订票者*/
typedef struct Waiter
{
char name;
int neednum;/*需求量*/
struct Waiter *next;
}LQNode,*Queueptr;/*结点和结点指针类型*/
typedef struct WQueue
{
Queueptr front;
Queueptr rear;
}LinkQueue;
/*航线信息*/
typedef struct Airline
{
char lname;/*终点站名*/
char airnum;/*航班号*/
char planenum;/*飞机号*/
char day;/*星期几*/
int passnum;/*乘员定额*/
int surnum;/*余票量*/
LinkList *order;
LinkQueue wait;
}LineInfo;
LineInfo *begin;/*全局变量*/
void Display(LineInfo *infomt)
{
printf("%s\t%3s\t%5s\t%5s\t%8d\t%d\n",infomt->lname,infomt->airnum,infomt->planenum,infomt->day,infomt->passnum,infomt->surnum);
}
void AirLineInfo()/*浏览全部航线信息*/
{
LineInfo *infomt;
int i=0;
infomt=begin;
printf("终点站\t航班号\t飞机号\t飞行周日 乘员定额 余票量\n");
for(;i<10;i++,infomt++)
Display(infomt);
printf("\n");
}
void SearchOneLine()/*查询某一航班信息*/
{
LineInfo *infomt;
int i=0,j=0;
char name;
infomt=begin;
printf("请输入终点站名:");
scanf("%s",name);
for(;i<10;i++,infomt++)
if(0==strcmp(name,infomt->lname))/*按终点站名查询航班*/
{
j++;
if(1==j) printf("终点站\t航班号\t飞机号\t飞行周日 乘员定额 余票量\n");
Display(infomt);
}
if(!j) printf("对不起,没有飞往%s的航班\n",name);
}
LineInfo *FindAirnum()/*根据输入的航班号查询并以指针形式返回*/
{ LineInfo *infomt;
int i=0;
char number;
infomt=begin;
printf("请输入航班号:");
scanf("%s",number);
for(;i<10;infomt++,i++)
if(!strcmp(number,infomt->airnum))
return infomt;
printf("对不起,没有该航班!\n");
return NULL;
}
void PutOrder() /*输出订票客户的名单信息*/
{ LinkList *p;
LineInfo *infomt;
infomt=FindAirnum();/*根据航班号得到*/
p=infomt->order;
if(p!=NULL)
{
printf("客户姓名 订票数额 舱位等级\n");
for(;p!=NULL;p=p->next)
printf("%s\t\t%d\t%d\n",p->name,p->ordernum,p->grade);
}
else printf("该航线暂时没有客户订票!\n");
}
void PutWaiter()/*输出等候订票客户的名单信息*/
{ Queueptr p;
LineInfo *infomt;
infomt=FindAirnum();
p=infomt->wait.front;
if(p!=NULL)
{
printf("客户姓名 预订票数\n");
for(;p!=NULL;p=p->next)
printf("%s\t\t%d\n",p->name,p->neednum);
}
else printf("该航线暂时没有客户等票!\n");
}
LinkList *InsertLink(LinkList *head,int amount,char name[],int grade)/*增加订票乘员名单域的客户信息*/
{ LinkList *p,*newbase;
p=head;
newbase=(LinkList*)malloc(sizeof(LinkList));
if(!newbase)
{
printf("\nNo enough memory\n");
return NULL;
}
strcpy(newbase->name,name);
newbase->ordernum=amount;
newbase->grade=grade;
newbase->next=NULL;
if(head==NULL)/*若原无订票客户信息*/
{
head=newbase;
newbase->next=NULL;
}
else
{
for(;p->next!=NULL;p=p->next);
p->next=newbase;
}
return head;
}
LinkQueue AddQueue(LinkQueue q,char name[],int amount)/*增加排队等候的客户名单域*/
{ Queueptr newbase;
newbase=(Queueptr)malloc(sizeof(Queueptr));
strcpy(newbase->name,name);
newbase->neednum=amount;
newbase->next=NULL;
if(q.front==NULL)/*若原排队等候客户名单域为空*/
q.front=newbase;
else
q.rear->next=newbase;
q.rear=newbase;/*队列尾指针位于新加入的结点*/
return q;
}
void Order()/*订票业务*/
{ LineInfo *infomt;
int amount,grade;
char name,select1,select2;
infomt=begin;
infomt=FindAirnum();
while(NULL==infomt)/*根据客户提供的航班号进行查询,若为空询问是否需要查询其他航班*/
{
printf("请问您是否需要查询别的航班?需要请按Y,不需要请按N:");
fflush(stdin);
scanf("%c",&select1);
if(select1=='Y'||select1=='y')
infomt=FindAirnum();
else return;
}
printf("请输入您订票的数量:");
scanf("%d",&amount);
if(amount>infomt->passnum)/*客户订票额超过乘员定额*/
{ char choose1,choose2;
printf("对不起,您的订票数量已经超过乘员定额!\n按Y:查询到达同一目的地的其他航班,按N:退出:");
fflush(stdin);
scanf("%c",&choose1);
if(choose1=='Y'||choose1=='y')
{
SearchOneLine();
printf("请问是否选择其他航班,按Y:是,按N:否");
fflush(stdin);
scanf("%c",&choose2);
if(choose2=='Y'||choose2=='y')
{
infomt=FindAirnum();
printf("请输入您订票的数量:");
scanf("%d",&amount);
}
else return;
}
else return;
}
if(amount<=infomt->surnum)/*客户订票额未超过余票量,订票成功并等记信息*/
{
int i;
printf("请输入您的姓名(订票客户):");
scanf("%s",name);
printf("请输入您购买的机票舱位等级(等级1,2或3):");
scanf("%d",&grade);
while(grade>3)/*舱位等级1,2,或3,输入错误需重新输入*/
{
printf("舱位等级只有1,2或3,请重新输入:");
scanf("%d",&grade);
}
infomt->order=InsertLink(infomt->order,amount,name,grade);/*在订票乘员名单域中添加客户信息*/
for(i=0;i<amount;i++)/*依次输出该订票客户的座位号*/
printf("%s的座位号是:%d\n",name,infomt->passnum-infomt->surnum+i+1);
infomt->surnum-=amount;/*该航线的余票量应减掉该客户的订票量*/
printf("订票成功,祝您旅途愉快!\n");
}
else /*若满员或余票不足,询问客户是否需要查询其他航班或排队等候*/
{
printf("余票不足,按Y:排队等候,按C:查询到达同一目的地的其他航班,按N:退出:");
fflush(stdin);
scanf("%c",&select2);
if(select2=='Y'||select2=='y')
{ printf("请输入您的姓名(等候订票客户):");
scanf("%s",name);
infomt->wait=AddQueue(infomt->wait,name,amount);/*在排队等候乘员名单域中添加客户信息*/
printf("等候登记成功!余票足够时会自动为您订票\n");
}
else if(select2=='C'||select2=='c')
{
char choose3;
SearchOneLine();
printf("请问是否选择其他航班,按Y:是,按N:否:");
fflush(stdin);
scanf("%c",&choose3);
if(choose3=='Y'||choose3=='y')
Order();/*d递归调用*/
else return;
}
else printf("欢迎您再次订购!\n");
}
}
void RefundTicket()/*退票业务*/
{
LineInfo *infomt;
LQNode *t,*q,*f,*r;
LinkList *p1,*p2,*head;
int grade,num;
char refundname;
if(!(infomt=FindAirnum())) return;/*调用查询函数,根据客户提供的航班号进行搜索*/
head=infomt->order;
p1=head;
printf("请输入您的姓名(退票客户):");
scanf("%s",refundname);
for(;p1!=NULL;p1=p1->next)/*根据客户提供的姓名到订票客户名单域进行查询*/
{
if(0==strcmp(refundname,p1->name))
break;
p2=p1;
}
if(!p1)
{
printf("对不起,您没有订过票!\n");/*若未订过票,退出订票业务*/
return;
}
else/*查询成功,删除订票客户名单中该订票者的信息*/
{
printf("您的订票量为:%d\n",p1->ordernum);
printf("请输入您的退票数量:");
scanf("%d",&num);
while(num>p1->ordernum)/*退票数量超出订票数量*/
{
printf("退票数量超出订票数量,请重新输入:");
scanf("%d",&num);
}
if(p1==head)
{ grade=p1->grade;
if(p1->ordernum==num)/*退所有的票*/
{
head=p1->next;
free(p1);
}
else
{
if(num<p1->ordernum)/*退部分票*/
head->ordernum-=num;
}
}
else
{
if(p1->ordernum==num)/*退所有的票*/
{
p2->next=p1->next;
free(p1);
}
else
{
if(num<p1->ordernum)
p1->ordernum-=num;
}
}
infomt->surnum+=num;/*余票增加*/
printf("退票成功!欢迎您再次订票\n");
}
infomt->order=head;/*重新将航线名单域指向订票单链表的头指针 */
if(infomt->wait.front==NULL)
return;
f=(infomt->wait).front;
r=(infomt->wait).rear;
t=f;/*t为满点条件的等候名单域*/
if(infomt->wait.front->neednum<=infomt->surnum)/*头结点的等候者满足订票条件*/
{
int i;
infomt->wait.front=t->next;/*头结点出队列*/
printf("%s订票成功!\n",t->name);
for(i=0;i<t->neednum;i++)/*输出座位号*/
printf("%s的座位号是:%d\n",t->name,(infomt->surnum)-i);
infomt->surnum-=t->neednum;
infomt->order=InsertLink(infomt->order,t->neednum,t->name,grade);/*插入到订票客户名单链表中*/
free(t);
return;
}
else printf("余票不足,%s",t->name);
for(q=t,t=t->next;t!=NULL;q=t,t=t->next)
{
if((infomt->surnum)>=(t->neednum)&&t!=NULL)/*若头结点的等候者不满足订票条件*/
{
int i;
q->next=t->next;/*t结点出队列*/
printf("\n\t%s订票成功!\n",t->name);
for(i=0;i<t->neednum;i++)
printf("%s的座位号是:%d\n",t->name,(infomt->surnum)-i);
infomt->surnum-=t->neednum;
infomt->order=InsertLink(infomt->order,t->neednum,t->name,grade);
free(t);
return;
}
else printf(",%s",t->name);
}
printf("都无法成功订票\n");
}
int Menu()/*主函数*/
{
char s;
int c;
printf("-------------------------------------------------------------------------------- "
"----------------------- 欢迎使用航空客运订票系统 ----------------------"
" * * * * * * * * * * \n"
" 1.浏览全部航线信息 \n"
" 2.查询航线信息 \n"
" 3.浏览订票客户信息 \n"
" 4.浏览等候订票客户信息 \n"
" 5.办理订票业务 \n"
" 6.办理退票业务 \n"
" 7.退出系统 \n"
" 计科6班3114006065郑湘平 \n"
"-------------------------------------------------------------------------------- ");
do{
printf(" 请选择并按回车键结束:");
scanf("%s",s);
c=atoi(s);
}while(c<0||c>7);
return c;
}
void main()
{
LineInfo air={{"北京","1","B1530","日",5,5},{"上海","2","S1112","一",5,5},{"香港","3","H1026","二",5,5},
{"广州","4","G1011","三",5,5},{"深圳","5","S2140","四",5,5},{"北京","6","B3054","五",10,10},
{"上海","7","S4839","六",10,10},{"香港","8","H2964","日",10,10},
{"广州","9","G3945","日",10,10},{"深圳","10","S7421","一",10,10}};/*初始化航线信息*/
begin=air;
for(;;)
{
switch(Menu()){
case 1:AirLineInfo();break;
case 2:SearchOneLine();break;
case 3:PutOrder();break;
case 4:PutWaiter();break;
case 5:Order();break;
case 6:RefundTicket();break;
case 7:exit(0);
}
}
}
页:
[1]