急 ~~帮忙优化下飞机订票系统
3、设计内容:(1)录入:
可以录入航班情况。每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行周日(星期几飞行)、乘员定额、余票量、已订票的客户名单以及等候替补的客户名单。
(2)查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
可以输入起飞抵达城市,查询飞机航班情况;
(3)订票:
可以订票,如果该航班已经无票,可以提供相关可选择航班;
(4)退票: 可退票,退票后修改相关数据;
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
(5)修改航班信息:
当航班信息改变可以修改航班数据文件。
飞行周日(星期几飞行),飞机座位号,已订票的客户名单以及等候替补的客户名单。这些功能要如何实现
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define P_S &(p->number),p->time_go,p->time_to,p->place_go,p->place_to,&(p->price),&(p->discount),&(p->seat_total),&(p->seat_odd)
#define P_P p->number,p->time_go,p->time_to,p->place_go,p->place_to,p->price,p->discount,p->seat_total,p->seat_odd
#define C_S p->name,&(p->numb_id),&(p->amount_t),&(p->numb_p)
struct plane_inf{
int number;
char time_go[16];
char time_to[16];
char place_go[20];
char place_to[20];
int price;
float discount;
int seat_total;
int seat_odd;
struct plane_inf * next;
};/*航班信息*/
struct cust_inf{
char name[20];
int numb_id;
int amount_t;
int numb_p;
int numb_ord;
struct cust_inf * next;
};/*顾客信息*/
typedef struct plane_inf p_inf;
typedef struct cust_inf c_inf;
void luru();
void xiugai();
void chaxun();
void dingpiao();
void tuipiao();
int xg_hb(int number,int amount_t,p_inf * p);
p_inf * read_p();
c_inf * read_c();
void write_p(p_inf *);
void write_c(c_inf *);
void free_p(p_inf *);
void free_c(c_inf *);
void main()
{
int choice;
int i=0;
do
{
printf("**************航空订票系统**************\n\n");
printf(" 录入航班信息*********1\n\n");
printf(" 修改航班信息*********2\n\n");
printf(" 查询航班信息*********3\n\n");
printf(" 顾客订票*************4\n\n");
printf(" 顾客退票*************5\n\n");
printf(" 退出*****************0\n\n");
printf("****************************************\n");
printf(" 请选择");
scanf("%d",&choice);
system("cls");
switch(choice)
{
case 0:
exit(0);
case 1:
luru();
break;
case 2:
xiugai();
break;
case 3:
chaxun();
break;
case 4:
dingpiao();
break;
case 5:
tuipiao();
break;
default:
printf("您的输入有误,请重新选择:\n\n");
}
}while(choice!=0);
}
// 实现航班信息录入功能
void luru()
{
char choice;
p_inf * p;
FILE * fp;
if((fp=fopen("d:\\plane.dat","ab"))==NULL)
{
fp=fopen("d:\\plane.dat","wb");
}
else
;
do
{
printf("请输入要录入的航班信息,各项内容之间以空格键或Tab键分开\n\n");
printf("航班号,起飞时间,抵达时间,始发地,目的地,票价,折扣情况,座位总数,剩余座位数\n");
p=(p_inf *)malloc(sizeof(p_inf));
p->discount=10.0;
p->next=NULL;
fflush(stdin);
scanf("%d%s%s%s%s%d%f%d%d",P_S);
fwrite(p,sizeof(p_inf),1,fp);
printf("********************************************************************************");
printf("继续录入请输入Y,否则返回上一级菜单\n");
fflush(stdin);
choice=getch();
system("cls"); //清屏
}while(choice=='Y');
fclose(fp);
}
// 实现航班信息的修改
void xiugai()
{
int number;
p_inf *p, *head;
head=read_p();
printf("请输入需要修改的航班号:");
scanf("%d",&number);
p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("\n请输入要修改后的航班信息,各项内容之间以空格键或Tab键分开\n\n");
printf("航班号,起飞时间,抵达时间,始发地,目的地,票价,折扣情况,座位总数,剩余座位数\n");
scanf("%d%s%s%s%s%d%f%d%d",P_S);
break;
}
p=p->next;
}
system("cls"); //清屏
printf("********************************************************************************");
if(p!=NULL)
{
write_p(head);
printf("您已成功修改%d号航班\n",p->number);
}
else
{
printf("对不起,该航班不存在\n");
}
printf("********************************************************************************");
free_p(head); //释放该链表
printf("单击任意键退出");
getch();
system("cls"); //清屏
}
// 实现航班信息查询功能
void chaxun()
{
int choice, number;
char place_go[20], place_to[20];
p_inf *head=NULL, *p;
void cx_hbh(p_inf * p, int number);
void cx_sfd(p_inf * p, char * place_go, char * place_to);
head=read_p(); //航班信息链表的初始化
if(head==NULL)
{
printf("\n******单击任意键退出******\n");
getch();
system("cls"); //清屏
return;
}
p=head;
do
{
printf("返回主菜单********0\n\n");
printf("航班号查询********1\n\n");
printf("始发地查询********2\n\n");
printf("请输入查询方式:");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("\n请输入要查询的航班号:");
scanf("%d",&number);
system("cls"); //清屏
cx_hbh(head,number);
break;
case 2:
printf("请输入要查询的始发地与目的地,中间以空格键或Tab键隔开\n");
scanf("%s%s",place_go,place_to);
system("cls"); //清屏
cx_sfd(head, place_go, place_to);
break;
}
}while(choice!=0);
system("cls"); //清屏
free_p(head); //释放该链表
}
// 实现订票功能
void dingpiao()
{
long length=0;
p_inf * head_p=NULL;
c_inf *p, *p1, *head_c;
char choice;
FILE * fp; // fp是顾客信息文件指针
head_p=read_p(); //读取航班信息文件并初始化链表
if(head_p==NULL)
{
system("cls");
return;
}
head_c=read_c(); //读取顾客信息文件并初始化链表
p1=head_c;
/*打开顾客信息文件*/
if((fp=fopen("d:\\customer.dat","ab"))==NULL)
{
fp=fopen("d:\\customer.dat","wb");
}
else
{
if(p1!=NULL)
{
while(p1!=NULL) //找出最后一个结点
{
p1=p1->next;
length++;
}
}
}
do
{
system("cls");
printf("请输入订票者信息,各项内容之间以空格键或Tab键分开\n\n");
printf("姓名,证件号,数量,航班号\n");
p=(c_inf *)malloc(sizeof(c_inf));
fflush(stdin);
scanf("%s%d%d%d",C_S);
p->numb_ord=length+1;
if(xg_hb(p->numb_p,p->amount_t,head_p))//调用xg_hb函数,实现对航班信息链表的修改
{
length++;
system("cls");
printf("********************************************************************************");
printf("提示:您已成功订票\n订单号是:%d",p->numb_ord);
printf("\n********************************************************************************");
fwrite(p,sizeof(c_inf),1,fp);
}
else
{
free(p);
}
printf("\n继续订票请输入Y,否则返回上一级菜单\n");
fflush(stdin);
choice=getch();
}while(choice=='Y');
fclose(fp);
write_p(head_p); //将修改后的航班信息链表写入到航班信息文件中
system("cls");
free_p(head_p);
free_c(head_c);
}
// 实现退票功能
void tuipiao()
{
char name[20];
int numb_ord, numb_id;
p_inf *head_p, *p_p;
c_inf *head_c, *p_c, *p1_c=NULL;
head_p=read_p();
head_c=read_c();
p_p=head_p;
p_c=head_c;
if(p_c==NULL)
{
printf("单击任意键退出");
getch();
system("cls"); //清屏
return;
}
printf("请输入客户姓名:\n");
scanf("%s",name);
printf("请输入证件号:\n");
scanf("%d",&numb_id);
printf("请输入订单号:\n");
scanf("%d",&numb_ord);
while(p_c!=NULL)
{
if(strcmp(name, p_c->name)==0&&numb_ord==p_c->numb_ord&&p_c->numb_id==numb_id) //判断是否存在这样顾客,如果有,则做出相应处理
{
break;
}
p1_c=p_c;
p_c=p_c->next;
}
if(p_c==NULL)
{
printf("该顾客信息不存在,单击任意键退出");
getch();
}
else // 将链表信息重新写到文件中
{
while(p_p!=NULL)
{
if(p_p->number==p_c->numb_p)
{
break;
}
p_p=p_p->next;
}
p_p->seat_odd=p_p->seat_odd+p_c->amount_t; //相关航班信息票数恢复
//删除退票顾客信息结点
if(p1_c==NULL)
{
head_c=NULL;
free(p_c);
}
else
{
p1_c->next=p_c->next;
free(p_c);
}
write_p(head_p);
write_c(head_c);
printf("退票成功,单击任意键退出");
getch();
}
free_p(head_p);
free_c(head_c);
system("cls");
}
// 查找待修改结点,判断是否符合条件
int xg_hb(int number, int amount_t, p_inf * p)
{
/* 寻找待修改结点 */
while(p!=NULL)
{
if(p->number==number)
{
break;
}
p=p->next;
}
if(p==NULL)
{
printf("\n********************************************************************************");
printf("对不起,该航班不存在,不能订票\n");
printf("\n********************************************************************************");
return 0;
}
else
{
if(p->seat_odd-amount_t<0)
{
printf("\n********************************************************************************");
printf("对不起,该航班只剩%d张票\n",p->seat_odd);
printf("********************************************************************************\n");
return 0;
}
else
{
p->seat_odd=p->seat_odd-amount_t;
return 1;
}
}
}
/*
** 以下两个函数功能实现以航班号查询
** 或以始发地及目的地查询
*/
// 实现以航班号查询
void cx_hbh(p_inf * p, int number)
{
while(p!=NULL) //执行条件:未到尾结点
{
if(p->number==number)
{
break;
}
p=p->next;
}
printf("********************************************************************************");
printf("符合要求的航班信息如下所示:\n");
printf("********************************************************************************");
if(p==NULL)
{
printf("\a对不起该航班信息不存在\n");
}
else
{
printf("航班号 起飞时间 抵达时间 始发地 目的地 票价 折扣情况 座位总数 剩余座位数\n");
printf("\n%d %s %s %s %s %d %f %d %d\n",P_P);
}
printf("********************************************************************************");
}
// 实现以始发地及目的地查询
void cx_sfd(p_inf * p, char * place_go, char * place_to)
{
int count=0;
printf("\n符合要求的航班信息如下所示:\n");
printf("********************************************************************************");
while(p!=NULL) //执行条件:未到尾结点
{
if(strcmp(place_go,p->place_go)==0&&strcmp(place_to,p->place_to)==0)
{
printf("\n航班号 起飞时间 抵达时间 始发地 目的地 票价 折扣情况 座位总数 剩余座位数\n");
printf("%d %s %s %s %s %d %f %d %d\n\n",P_P);
printf("********************************************************************************");
count++;
}
else
;
p=p->next;
}
if(count==0)
{
printf("\n\a对不起,没有符合您要求的航班\n\n");
}
else
{
printf("共有%d个航班符合您的要求\n",count);
}
printf("********************************************************************************");
}
/*
** 以下四个函数功能为实现航班信息及顾客信息在链表与文件之间的转换
*/
// 功能:实现将航班信息文件以链表实现
p_inf * read_p()
{
p_inf *p1, *p2, *p3, *head=NULL;
FILE *fp;
/*打开航班信息文件*/
if((fp=fopen("d:\\plane.dat","rb"))==NULL)
{
printf("航班信息不存在\n");
printf("单击任意键退出\n");
getch();
return NULL;
}
else
;
/* 初始化航班信息链表 */
do
{
p1=(p_inf *)malloc(sizeof(p_inf));
if(head==NULL)
{
p1->next=NULL;
head=p1;
p2=p1; //p2永远指向最后一个结点
}
else
{
p1->next=NULL;
p2->next=p1;
p3=p2; //p3指向最后一个结点的前一个结点
p2=p1; //p2永远指向最后一个结点
}
}while(fread(p1,sizeof(p_inf),1,fp));
free(p2);
if(head==p1)
{
head=NULL;
}
else
p3->next=NULL;
fclose(fp);
return(head);
}
// 功能:实现将顾客信息文件以链表实现
c_inf * read_c()
{
c_inf *p1, *p2, *p3, *head=NULL;
FILE *fp;
/*打开顾客信息文件*/
if((fp=fopen("d:\\customer.dat","rb"))==NULL)
{
printf("顾客信息不存在\n");
printf("单击任意键退出\n");
getch();
return NULL;
}
else
;
/* 初始化顾客信息链表 */
do
{
p1=(c_inf *)malloc(sizeof(c_inf));
if(head==NULL)
{
p1->next=NULL;
head=p1;
p2=p1; //p2永远指向最后一个结点
}
else
{
p1->next=NULL;
p2->next=p1;
p3=p2; //p3指向最后一个结点的前一个结点
p2=p1; //p2永远指向最后一个结点
}
}while(fread(p1,sizeof(c_inf),1,fp));
free(p2);
if(head==p1)
{
head=NULL;
}
else
p3->next=NULL;
fclose(fp);
return(head);
}
/* 该函数功能即为将航班信息链表写入到航班信息文件中 */
void write_p(p_inf *p)
{
FILE * fp;
/*打开航班信息文件*/
if((fp=fopen("d:\\plane.dat","wb"))==NULL)
{
printf("不能打开航班信息文件");
exit(1);
}
else
{
while(p!=NULL)
{
fwrite(p,sizeof(p_inf),1,fp);
p=p->next;
}
}
fclose(fp);
}
/* 该函数功能即为将顾客信息链表写入到顾客信息文件中 */
void write_c(c_inf *p)
{
FILE * fp;
/*打开顾客信息文件*/
if((fp=fopen("d:\\customer.dat","wb"))==NULL)
{
printf("不能打开航班信息文件");
exit(1);
}
else
{
while(p!=NULL)
{
fwrite(p,sizeof(c_inf),1,fp);
p=p->next;
}
}
fclose(fp);
}
//释放航班信息链表
void free_p(p_inf *p)
{
p_inf *p1;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}
//释放顾客信息链表
void free_c(c_inf *p)
{
c_inf *p1;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}