题目:
2.航班订票系统
*问题描述:通过此系统可以实现如下功能:
(1)录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定);
(2)查询:可以查询某个航线的情况(如输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
可以输入起飞抵达城市,查询飞机航班情况;
(3)订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;
(4)退票: 可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号;
(5)修改航班信息:当航班信息改变可以修改航班数据文件。
*要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<iostream>
#define MAXSIZE 100
int airnum=0;
int airc=0;
struct air //航班信息
{
char air_num[50];//航班号
char begin_name[50];//起飞地点
char end_name[50];//降落地点
int fare;//票价
char time[100]; //飞行时间
int y_p;//订购票数
char discount[50];//折扣
int sit;//座位数
int standby_ticket;//余票
struct air *next1; //指针
};
typedef struct customer //客户信息
{
char name [20]; // 姓名
char num[20]; // 证件号
char airno[20];//航班号
char begin_time[20]; //起飞时间
int book_t;//订票数
struct customer *next2;
};
int menu_select() //主菜单页面
{
printf("\n\t机票管理订购系统\n");
printf("----------------------\n");
printf("\t1 录入航班信息\n");
printf("\t2 查询航班信息\n");
printf("\t3 订票\n");
printf("\t4 录入客户信息\n");
printf("\t5 修改航班信息\n");
printf("\t6 航班信息\n");
printf("\t7 客户信息\n");
printf("\t8 退出系统\n");
printf("----------------------\n");
int c=0;
while ( (c<1) || (c>8) )
{
printf("请选择1-8:");
scanf("%d",&c);
}
return c;
}
struct air *creat_air(struct air *h) //录入航班信息 尾插法
{
struct air *q=h;
while(q->next1 != NULL) // 循环将 q 指向 链尾
q = q->next1;
int b=1;
while(b==1)
{
struct air *p=(struct air*)malloc(sizeof(struct air)); //申请空间,//循环创建结点
if(p==NULL)
{
printf("申请内存失败!");
exit(0);
}
system("cls"); //清屏
printf("\t输入以下信息\t:\n");
printf("航班号\n");
scanf("%s",&p->air_num);
printf("起飞地点\n");
scanf("%s",&p->begin_name);
printf("降落地点\n");
scanf("%s",&p->end_name);
printf("票价\n");
scanf("%d",&p->fare);
printf("飞行时间\n");
scanf("%s",&p->time);
printf("余票\n");
scanf("%d",&p->standby_ticket);
printf("折扣\n");
scanf("%s",&p->discount);
printf("座位数\n");
scanf("%d",&p->sit);
p->next1=NULL;
q->next1=p; //让P这数据 插入链尾
q=p;
airnum = airnum + 1;
printf("\t已输入%d个航班\n",airnum);
printf("\t**************************\n");
printf("\t是否要输入下一条航线记录\n\t==>\t1.继续录入\n\t==>\t2.退出操作\n");
printf("\t**************************\n");
printf("请选择:");
scanf("%d",&b);
getchar();
}
return (h); //返回头指针
}
void find(struct air *pl) //查询航班信息
{
int flag=0;
char end_name1[50]; //目的地
char num[50]; //航班号
int select;
printf("\t\t查找航班信息\n");
printf("\t**************************\n");
printf("\t==>1.通过目的地查询\t==\n");
printf("\t==>2.通过航班号查询\t==\n");
printf("\t**************************\n");
printf("\t请选择:");
scanf("%d",&select);
system("cls"); //清屏
if(select==1) //目的地查询
{
printf("请输入目的地:");
scanf("%s",&end_name1);
for(int i=0;i<airnum;i++)
{
pl=pl->next1;
if(strcmp(end_name1,pl->end_name) == 0) //两个字符串相等
{
flag=1;
printf("航班号\t起点站\t终点站\t飞行时间\t票价\t折扣\t余票\t座位数\t");
printf("\n");
printf("%-6s\t",pl->air_num);
printf("%-6s\t",pl->begin_name);
printf("%-6s\t",pl->end_name);
printf("%-8s\t",pl->time);
printf("%-6d\t",pl->fare);
printf("%-6s\t",pl->discount);
printf("%-6d\t",pl->standby_ticket);
printf("%-6d\t",pl->sit);
printf("\n");
}
}
}
if(select==2) //航班号查询
{
printf("请输入航班号:");
scanf("%s",&num);
for(int j=0;j<airnum;j++)
{
pl=pl->next1;
if( strcmp(num,pl->air_num)==0 ) //两个字符串相等
{
flag=1;
printf("航班号\t起点站\t终点站\t飞行时间\t票价\t折扣\t余票\t座位数\t");
printf("\n");
printf("%-6s\t",pl->air_num);
printf("%-6s\t",pl->begin_name);
printf("%-6s\t",pl->end_name);
printf("%-8s\t",pl->time);
printf("%-6d\t",pl->fare);
printf("%-6s\t",pl->discount);
printf("%-6d\t",pl->standby_ticket);
printf("%-6d\t",pl->sit);
printf("\n");
}
}
}
if(flag==0)
printf("无航班\n");
}
void book_air(struct air *p) //订票
{
struct air *p2;
int flag1=0;
int t;
char ename[50]; // 目的地,订购航班号,订票数量
char a[50]; //证件号
printf("请输入您的信息\n");
printf("\n");
printf("请输入您需要订购机票的目的地\n");
scanf("%s",&ename);
p2=p->next1;
while(p2 != NULL)
{
if(strcmp(ename,p2->end_name) == 0)
{
printf("您要订购机票的信息如下:\n");
printf("航班号\t起点站\t终点站\t飞行时间\t票价\t折扣\t余票\t座位数\t");
printf("\n");
printf("%-6s\t",p2->air_num);
printf("%-6s\t",p2->begin_name);
printf("%-6s\t",p2->end_name);
printf("%-8s\t",p2->time);
printf("%-6d\t",p2->fare);
printf("%-6s\t",p2->discount);
printf("%-6d\t",p2->standby_ticket);
printf("%-6d\t",p2->sit);
printf("\n");
flag1=1;
}
if(flag1==1)
{
printf("请输入您的证件号:");
scanf("%s",&a);
printf("请输入订票数量");
scanf("%d",&t);
if(t <= p2->standby_ticket)
{
printf("订票成功!!!!\n");
p2->standby_ticket=p2->standby_ticket-t; //运算余票数量
break;
}
else
{
printf("票不足!\n");
break;
}
}
p2=p2->next1;
}
if(flag1==0)
printf("无航班信息!\n");
}
struct customer *creat_c(struct customer * h1) //录入客户信息 尾插法
{
struct customer *q1=h1;
while(q1->next2 != NULL) // 循环将 q 指向 链尾
q1 = q1->next2;
int b=1;
while(b==1)
{
struct customer *p1=(struct customer*)malloc(sizeof(struct customer)); //申请空间,//循环创建结点
if(p1==NULL)
{
printf("申请内存失败");
exit(0);
}
system("cls"); //清屏
printf("\t输入以下信息\t:\n");
printf("航班号\n");
scanf("%s",&p1->airno);
printf("起飞时间\n");
scanf("%s",&p1->begin_time);
printf("姓名\n");
scanf("%s",&p1->name);
printf("证件号\n");
scanf("%s",&p1->num);
printf("票价\n");
scanf("%d",&p1->book_t);
p1->next2=NULL;
q1->next2=p1; //让P这数据 插入链尾
q1=p1;
printf("\t已输入%d个顾客\n\n",++airc);
printf("\t**************************\n");
printf("\t是否要输入下一条记录\n\t==>\t1.继续录入\n\t==>\t2.退出操作\n");
printf("\t**************************\n");
printf("请选择:");
scanf("%d",&b);
getchar();
}
return(h1); //返回头指针
}
void change(struct air *pl) //修改信息
{
int b,flag=0;
char airnum1[50];
system("cls"); //清屏
printf("请输入您要修改信息的航班号\n");
getchar();
scanf("%s",&airnum1);
pl=pl->next1;
while(pl != NULL)
{
if(strcmp(airnum1,pl->air_num)==0)//如果相等
{
flag=1;
printf("请输入修改的航班信息\n\n");
printf("航班号:");
scanf("%s",&pl->air_num);
printf("起点站:");
scanf("%s",&pl->begin_name);
printf("终点站:");
scanf("%s",&pl->end_name);
printf("飞行时间:");
scanf("%s",&pl->time);
printf("余票:");
scanf("%d",&pl->standby_ticket);
printf("座位数:");
scanf("%d",&pl->sit);
printf("票价:");
scanf("%d",&pl->fare);
getchar();
printf("修改成功!\n");
break;
}
pl=pl->next1;
}
if(flag==0)
printf("查找不到航班号!\n");
}
void printf(struct air *pl)// 航班信息
{
struct air *t;
t=pl->next1;
printf("航班号\t起点站\t终点站\t飞行时间\t票价\t折扣\t余票\t座位数\t");
printf("\n");
while(t!=0)
{
printf("%-6s\t",t->air_num);
printf("%-6s\t",t->begin_name);
printf("%-6s\t",t->end_name);
printf("%-8s\t",t->time);
printf("%-6d\t",t->fare);
printf("%-6s\t",t->discount);
printf("%-6d\t",t->standby_ticket);
printf("%-6d\t",t->sit);
printf("\n");
t=t->next1;
}
}
void printf_c(struct customer *c)//客户信息显示
{
struct customer *a;
a = c->next2;
printf("姓名\t证件号\t航班号\t登机时间\t票价");
while(a!=NULL)
{
printf("\n");
printf("%3s\t",a->name);
printf("%3s\t",a->num);
printf("%3s\t",a->airno);
printf("%5s\t",a->begin_time);
printf("%9d",a->book_t);
a=a->next2;
}
printf("\n");
}
int main()
{
struct air *pl;
pl=(struct air *)malloc(sizeof(struct air)); //申请空间
if(pl==NULL)
{
printf("内存分配失败!");
exit(0);
}
pl->next1=NULL; //初始化
struct customer *pl1;
pl1=(struct customer *)malloc(sizeof(struct customer)); //申请空间
if(pl1==NULL)
{
printf("内存分配失败!");
exit(0);
}
pl1->next2 =NULL; //初始化
while(1)
{
switch(menu_select())
{
case 1:pl=creat_air(pl);continue; //录入航班信息
case 2:find(pl); continue;//查找航班信息
case 3:book_air(pl);continue; //订购航班
case 4:pl1=creat_c(pl1);continue; //录入客户信息
case 5:change(pl); continue;//修改航班信息
case 6:printf(pl); continue;//显示航班信息
case 7:printf_c(pl1);continue;//客户信息
case 8:printf("\n\t感谢使用\n");exit(0);//退出系统
}
}
return 0;
}