您的位置:首页 > 其它

航空订票系统

2015-12-30 11:12 316 查看
问题及代码:

   /*

    *2015,烟台大学计算机与控制工程学院

    *作者:杨宁

    *完成日期:2015年12月28日

    */

feijipiao.h

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
/************************************
* 功能描述:定义链表
* 输入参数:无
* 输出参数:无
************************************/
typedef struct flightnode
{
char flight_num[20];
char start_time[20];
char end_time[20];
char start_place[20];
char end_place[20];
int left;
float price;
float price_discount;
int isfull;
struct flightnode *next;
}flightnode;

typedef struct passengernode
{
char name[20];
char ID_num[20];
char flight_num[20];
int order_num;
int ticket_num;
struct passengernode *next;
}passengernode;
/************************************
* 功能描述:双链表
* 输入参数:无
* 输出参数:无
************************************/
typedef struct passengerList
{
passengernode *head;
passengernode *rear;
}passengerList;

void init_flight(flightnode *&h);
void init_passengerList(passengerList *&PList);
void save_passenger(passengerList *PList);
void load_passenger(passengerList *PList);
void save_flight(flightnode *h);
void load_flight(flightnode *h);
int find_same_flight(flightnode *h,char *flight_num);
void insert_flight(flightnode *&h,char *flight_num,char *start_place,char *end_place,char *start_time,char *end_time,int left,float price,float price_discount,int isfull);
void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num);
void delete_flight(flightnode *&h,passengerList *&PList);
int delete_passenger(passengerList *&PList,flightnode *&h,char *name,char *ID_num);
void add_flight(flightnode *&h);
int flight_num_check(flightnode *h,char *flight_num);
int place_check(flightnode *h,char *start_place,char *end_place);
void check_all_flight(flightnode *h);
void flight_check(flightnode *h);
int ID_num_check(passengerList *PList,char *name,char *ID_num);
int order_num_check(passengerList *PList,int order_num);
void check_all_passenger(passengerList *PList);
void passenger_check(passengerList *PList);
void modify_flight(flightnode *&h,passengerList *&PList);
int book(flightnode *&h,passengerList *&PList);
void cancel(passengerList *&PList,flightnode *&h);

feijipiao.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include"feijipiao.h"
/************************************
* 功能描述:建立一个空链表,增加的航
班信息将航班节点插入该链表
* 输入参数:无
* 输出参数:无
************************************/
void init_flight(flightnode *&h)
{
h=(flightnode *)malloc(sizeof(flightnode));
if(h==NULL)
exit(0);
h->next=NULL;
}
/************************************
* 功能描述:建立一个带有头指针和尾指针
的空双链表
* 输入参数:无
* 输出参数:无
************************************/
void init_passengerList(passengerList *&PList)
{
PList=(passengerList *)malloc(sizeof(passengerList));
PList->head=(passengernode *)malloc(sizeof(passengernode));
PList->rear=PList->head;
PList->rear->order_num=0;
PList->head->next=NULL;
}
/************************************
* 功能描述:保存客户信息到指定的数据文件
* 输入参数:无
* 输出参数:无
************************************/
void save_passenger(passengerList *PList)
{
FILE *fp=fopen("passenger.txt","wb");
if(fp==NULL)
return;
passengernode *temp=PList->head->next;
while(temp!=NULL)
{
fwrite(temp,sizeof(passengernode),1,fp);
temp=temp->next;
};
fclose(fp);
}
/************************************
* 功能描述:从存储客户信息的文件导入
客户信息到客户链表中
* 输入参数:无
* 输出参数:无
************************************/
void load_passenger(passengerList *PList)
{
FILE *fp=fopen("passenger.txt","rb");
if(fp==NULL)
return;
passengernode *q;
int n;
while(!feof(fp))
{
q=(passengernode *)malloc(sizeof(passengernode));
n=fread(q,sizeof(passengernode),1,fp);
if(n!=1)
break;
PList->rear->next=q;
PList->rear=q;
}
PList->rear->next=NULL;
fclose(fp);
}
/************************************
* 功能描述:保存航班信息到数据文件中
* 输入参数:无
* 输出参数:无
************************************/
void save_flight(flightnode *h)
{
FILE *fp=fopen("flightList.txt","wb");
if(fp==NULL)
return;
flightnode *temp=h->next;
while(temp!=NULL)
{
fwrite(temp,sizeof(flightnode),1,fp);
temp=temp->next;
};
fclose(fp);
}
/************************************
* 功能描述:从存储航班信息的文件导入
航班信息到航班链表中
* 输入参数:无
* 输出参数:无
************************************/
void load_flight(flightnode *h)
{
flightnode *pt=h;
FILE *fp=fopen("flightList.txt","rb");
if(fp==NULL)
return;
flightnode *q;
int n;
while(!feof(fp))
{
q=(flightnode *)malloc(sizeof(flightnode));
n=fread(q,sizeof(flightnode),1,fp);
if(n!=1)
break;
pt->next=q;
pt=q;
}
pt->next=NULL;
fclose(fp);
}
/************************************
* 功能描述:在客户订票时,当客户所选航
班座已满时提供其他可选航班
* 输入参数:无
* 输出参数:航班信息
************************************/
int find_same_flight(flightnode *h,char *flight_num)
{
flightnode *t=h->next,*p=h->next;
int mark=0;
printf("%-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","是否满仓","空座数");
while(t!=NULL&&strcmp(t->flight_num,flight_num)!=0)
{
t=t->next;
}
while(p!=NULL)
{
if((strcmp(t->start_place,p->start_place)==0)&&(strcmp(t->end_place,p->end_place)==0)&&(strcmp(t->flight_num,p->flight_num)!=0))
{
printf("%-8s %-8s %-8s %-8s %-8s %-8.2f %-8.2f %-8s %-8s\n",p->flight_num,p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->price_discount,p->isfull,p->left);
mark=1;
}
p=p->next;
}
if(mark==0)
{
printf("\t\t抱歉,没有可选的航班!\n");
return 0;
}
return 1;
}
/************************************
* 功能描述:将新的航班情况插入到航线链表中
* 输入参数:无
* 输出参数:无
************************************/
void insert_flight(flightnode *&h,char *flight_num,char *start_place,char *end_place,char *start_time,char *end_time,int left,float price,float price_discount,int isfull)
{
flightnode *q;
flightnode *p=h;
q=(flightnode *)malloc(sizeof(flightnode));
strcpy(q->flight_num,flight_num);
strcpy(q->start_place,start_place);
strcpy(q->end_place,end_place);
strcpy(q->start_time,start_time);
strcpy(q->end_time,end_time);
q->left=left;
q->price=price;
q->price_discount=price_discount;
q->isfull=isfull;
q->next=p->next;
p->next=q;
p=p->next;
}
/************************************
* 功能描述:将客户订票信息插入到客户链表
* 输入参数:无
* 输出参数:无
************************************/
void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num)
{
flightnode *p=h->next;
for(;p!=NULL;p=p->next)
{
if(strcmp(p->flight_num,flight_num)==0)
{
p->left=p->left-ticket_num;
if(p->left==0)
p->isfull=1;
}
}
passengernode *q=(passengernode *)malloc(sizeof(passengernode));
strcpy(q->name,name);
strcpy(q->ID_num,ID_num);
strcpy(q->flight_num,flight_num);
q->ticket_num=ticket_num;
q->next=NULL;
PList->rear->next=q;
q->order_num=PList->rear->order_num+1;
PList->rear=q;
}
/************************************
* 功能描述:删除航班信息和航班节点
* 输入参数:无
* 输出参数:无
************************************/
void delete_flight(flightnode *&h,passengerList *&PList)
{
flightnode *p,*pr;
passengernode *q,*qr;
char flight_num[10];
int mark=1;
qr=PList->head;
q=qr->next;
pr=h;
p=pr->next;
printf("\t\t请输入你要删除的航班号:");
scanf("%s",flight_num);
while(p!=NULL)
{
if(strcmp(flight_num,p->flight_num)==0)
{
pr->next=p->next;
free(p);
printf("\t\t删除%航班成功!\n",flight_num);
mark=0;
p=NULL;
}
if(pr->next!=NULL)
{
pr=pr->next;
p=pr->next;
}
}
if(mark==1)
printf("\t\t无此航班,无法删除!\n");
else
{
while(q!=NULL)
{
if(strcmp(flight_num,q->flight_num)==0)
{
qr->next=q->next;
free(q);
q=NULL;
}
if(qr->next!=NULL)
{
qr=qr->next;
q=qr->next;
}
}
}
}
/************************************
* 功能描述:删除客户信息和客户节点
* 输入参数:无
* 输出参数:无
************************************/
int delete_passenger(passengerList *&PList,flightnode *&h,char *name,char *ID_num)
{
passengernode *p,*pr=PList->head;
flightnode *f;
p=pr->next;
while(p!=NULL)
{
if(strcmp(name,p->name)==0&&strcmp(ID_num,p->ID_num)==0)
{
for(flightnode *f=h->next;f!=NULL;f=f->next)
{
if(strcmp(p->flight_num,f->flight_num)==0)
{
f->left=f->left+p->ticket_num;
f->isfull=0;
break;
}
}
pr->next=p->next;
free(p);
printf("\t\t顾客%s,%s退票成功!\n",name,ID_num);
return 1;
}
pr=pr->next;
p=pr->next;
}
printf("\t\t无此顾客,无法退票!\n");
return 0;
}
/************************************
* 功能描述:录入航班信息并调用insert
函数插入
* 输入参数:航班信息
* 输出参数:无
************************************/
void add_flight(flightnode *&h)
{
flightnode *p=h;
char flight_num[20],start_time[20],end_time[20],start_place[20],end_place[20];
int left,isfull,mark=1;
float price,price_discount;
for(;p->next!=NULL;p=p->next){}
while(mark==1)
{
printf("\t\t请输入你要增加的航班号:");
scanf("%s",flight_num);
printf("\t\t请输入出发地:");
scanf("%s",start_place);
printf("\t\t请输入目的地:");
scanf("%s",end_place);
printf("\t\t请输入起飞时间:");
scanf("%s",start_time);
printf("\t\t请输入抵达时间:");
scanf("%s",end_time);
printf("\t\t请输入票价:");
scanf("%f",&price);
printf("\t\t折扣:");
scanf("%f",&price_discount);
printf("\t\t请输入剩余座位数:");
scanf("%d",&left);
printf("\t\t请输入是否满仓(0表示没有满仓1表示满仓):");
scanf("%d",&isfull);
insert_flight(p,flight_num,start_place,end_place,start_time,end_time,left,price,price_discount,isfull);
printf("\t\t增加航班%s成功\n",flight_num);
printf("\t\t是否继续录入航班信息(1表示继续0表示停止)\n");
printf("\t\t请输入:");
scanf("%d",&mark);
}
}
/************************************
* 功能描述:按航班号查询航班信息
* 输入参数:无
* 输出参数:航班信息
************************************/
int flight_num_check(flightnode *h,char *flight_num)
{
flightnode *p=h;
printf("%-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","是否满仓","空座数");
for(;p!=NULL;p->next)
{
if(strcmp(p->flight_num,flight_num)==0)
{
printf("%-8s %-8s %-8s %-8s %-8s %-8.2f %-8.2f %-8s %-8s\n",p->flight_num,p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->price_discount,p->isfull,p->left);
return 1;
}
}
printf("\t\t抱歉,没有航班号为%s的航班信息!\n",flight_num);
return 0;
}
/************************************
* 功能描述:按照起飞抵达城市查询航班信息
* 输入参数:无
* 输出参数:航班信息
************************************/
int place_check(flightnode *h,char *start_place,char *end_place)
{
flightnode *p=h;
int mark=0;
printf("%-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","是否满仓","空座数");
for(;p!=NULL;p=p->next)
{
if(strcmp(p->start_place,start_place)==0&&strcmp(p->end_place,end_place)==0)
{
printf("%-8s %-8s %-8s %-8s %-8s %-8.2f %-8.2f %-8s %-8s\n",p->flight_num,p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->price_discount,p->isfull,p->left);
mark=1;
}
}
if(mark==0)
{
printf("\t\t抱歉,没有从%s到%s的航班信息!\n",start_place,end_place);
return 0;
}
return 1;
}
/************************************
* 功能描述:浏览所有航班信息
* 输入参数:无
* 输出参数:航班信息
************************************/
void check_all_flight(flightnode *h)
{
flightnode *p=h;
int m=0;
printf("%-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","是否满仓","空座数");
for(;p!=NULL;p->next)
{
printf("%-8s %-8s %-8s %-8s %-8s %-8.2f %-8.2f %-8s %-8s\n",p->flight_num,p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->price_discount,p->isfull,p->left);
m=1;
}
if(m==0)
printf("\t\t航班信息为空!\n");
}
/************************************
* 功能描述:选择使用何种方式对航班信息
进行查询
* 输入参数:航班号或起飞抵达城市
* 输出参数:无
************************************/
void flight_check(flightnode *h)
{
flightnode *p=h->next;
char flight_num[20],start_place[20],end_place[20];
char a;
printf("\t\t请选择航班查询方式:\n");
printf("\t\t1表示按航班号进行查询:\n");
printf("\t\t2表示按起飞抵达城市进行查询:\n");
printf("\t\t3表示浏览全部航班信息.\n\t\t请选择输入:");
a=getch();
printf("%c\n",a);
if(a=='1')
{
printf("\t\t请输入航班号:");
scanf("%s",flight_num);
}
else if(a=='2')
{
printf("\t\t请输入起飞城市:");
scanf("%s",start_place);
printf("\t\t请输入抵达城市:");
scanf("%s",end_place);
place_check(p,start_place,end_place);
}
else if(a=='3')
check_all_flight(p);
else
return;
}
/************************************
* 功能描述:按客户姓名和证件号查询订单信息
* 输入参数:无
* 输出参数:客户订单信息
************************************/
int ID_num_check(passengerList *PList,char *name,char *ID_num)
{
passengernode *p=PList->head->next;
int mark=0;
printf("%-8s %-10s %-10s %-10s %-8s%\n","订单号","姓名","证件号","航班号","订票数量");
for(;p!=NULL;p=p->next)
{
if(strcmp(p->ID_num,ID_num)==0&&strcmp(p->name,name)==0)
{
printf("%-8d %-20d %-20s %-10s %-8d%\n",p->order_num,p->name,p->ID_num,p->flight_num,p->ticket_num);
mark=1;
}
}
if(mark==0)
{
printf("\t\t抱歉,没有%s,%s的订单信息!\n",name,ID_num);
return 0;
}
return 1;
}
/************************************
* 功能描述:按订单号查询订单信息
* 输入参数:无
* 输出参数:订单信息
************************************/
int order_num_check(passengerList *PList,int order_num)
{
passengernode *p=PList->head->next;
printf("%-8s %-10s %-10s %-10s %-8s%\n","订单号","姓名","证件号","航班号","订票数量");
for(;p!=NULL;p=p->next)
{
if(p->order_num=order_num)
{
printf("%-8d %-10d %-10s %-10s %-8d%\n",p->order_num,p->name,p->ID_num,p->flight_num,p->ticket_num);
return 1;
}
}
printf("\t\t抱歉,没有订单号%d的订单信息!\n",order_num);
return 0;
}
/************************************
* 功能描述:浏览所有订单信息
* 输入参数:无
* 输出参数:订单信息
************************************/
void check_all_passenger(passengerList *PList)
{
passengernode *p=PList->head->next;
int m=0;
printf("%-8s %-10s %-10s %-10s %-8s%\n","订单号","姓名","证件号","航班号","订票数量");
for(;p!=NULL;p=p->next)
{
printf("%-8d %-10d %-10s %-10s %-8d%\n",p->order_num,p->name,p->ID_num,p->flight_num,p->ticket_num);
m=1;
}
if(m==0)
printf("\t\t订单信息为空!\n");
}
/************************************
* 功能描述:选择用何种方式对订单信息
进行查询
* 输入参数:客户信息或订单号
* 输出参数:无
************************************/
void passenger_check(passengerList *PList)
{
char name[20],ID_num[15];
int order_num;
char a;
printf("\t\t请选择订单查询方式:\n");
printf("\t\t1表示按客户姓名和证件号进行查询:\n");
printf("\t\t2表示按订单号进行查询:\n");
printf("\t\t3表示浏览全部订单信息.\n\t\t请选择输入:");
a=getch();
printf("%c\n",a);
if(a=='1')
{
printf("\t\t请输入客户姓名:");
scanf("%s",name);
printf("\t\t请输入证件号:");
scanf("%s",ID_num);
ID_num_check(PList,name,ID_num);
}
else if(a=='2')
{
printf("\t\t请输入订单号:");
scanf("%s",order_num);
order_num_check(PList,order_num);
}
else if(a=='3')
check_all_passenger(PList);
else
return;
}
/************************************
* 功能描述:修改航班信息
* 输入参数:无
* 输出参数:无
************************************/
void modify_flight(flightnode *&h,passengerList *&PList)
{
flightnode *p=h->next;
char flight_num[20],start_time[20],end_time[20];
char a;
printf("\t\t****************航班信息修改****************\n");
printf("\t\t********************************************\n");
printf("\t\t****** 增加航班------1*******\n");
printf("\t\t****** 删除航班------2*******\n");
printf("\t\t****** 修改航班时间----3*******\n");
printf("\t\t********************************************\n");
printf("\t\t请选择");
a=getch();
if(a=='1')
add_flight(h);
else if(a=='2')
delete_flight(h,PList);
else if(a=='3')
{
printf("\t\t请输入要修改的航班的航班号:");
scanf("%s",flight_num);
if(flight_num_check(p,flight_num)==1)
{
printf("\t\t请输入修改后的起飞时间:");
scanf("%s",start_time);
printf("\t\t请输入修改后的抵达时间:");
scanf("%s",end_time);
for(;p!=NULL;p=p->next)
{
if(strcmp(flight_num,p->flight_num)==0)
{
strcpy(p->start_time,start_time);
strcpy(p->end_time,end_time);
printf("\t\t航班%s时间修改成功!\n",flight_num);
}
}
}
}
else
return;
}
/************************************
* 功能描述:订票
* 输入参数:航班信息
* 输出参数:无
************************************/
int book(flightnode *&h,passengerList *&PList)
{
char name[20];
char ID_num[20];
char flight_num[20];
char start_place[20];
char end_place[20];
int ticket_num;
int k;
flightnode *p=h->next;
printf("\t\t请输入信息:\n");
printf("\t\t请输入起飞城市:");
scanf("%s",start_place);
printf("\t\t请输入抵达城市:");
scanf("%s",end_place);
if(place_check(h,start_place,end_place)==1)
{
printf("\t\t航班号:");
scanf("%s",flight_num);
while(flight_num==NULL)
{
printf("航班号不能为空!\n");
printf("\t\t航班号:");
scanf("%s",flight_num);
}
while(p!=NULL)
{
if(strcmp(p->flight_num,flight_num)==0)
{
printf("\t\t姓名:");
scanf("%s",name);
printf("\t\证件号码:");
scanf("%s",ID_num);
printf("\t\t订票数量:");
scanf("%d",&ticket_num);
while(name==NULL)
{
printf("客户姓名不能为空!\n");
printf("\t\t姓名: ");
scanf("%s",name);
}
while(ID_num==NULL)
{
printf("客户证件号码不能为空!\n");
printf("\t\t证件号码:");
scanf("%s",ID_num);
}
if((p->left>0)&&(p->left=ticket_num))
{
insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num);
printf("\t\t你应付金额¥%6.2f\n",p->price*p->price_discount*ticket_num);
getch();
printf("\t\t恭喜您,订票成功!\n");
return 1;
}
else
{
printf("\t\t很遗憾,该航班已满!\n");
printf("\t\t如果选择其他航班请输入--1!\n\t\t不选择则输入--0\n");
printf("\t\t输入数字进行选择:\n");
scanf("%d",&k);
if(k==1)
{
printf("\t\t此航线上的其他航班有:");
if(find_same_flight(h,flight_num)==1)
{
printf("\t\t请输入您选的航班:");
scanf("%s",flight_num);
insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num);
printf("\t\t恭喜您,订票成功!\n");
return 1;
}
}
}
}
else
p=p->next;
}
if(p==NULL)
printf("\t\t对不起,您输入的航班不存在!\n");
}
return 0;
}
/************************************
* 功能描述:完成客户退票
* 输入参数:姓名和证件号
* 输出参数:无
************************************/
void cancel(passengerList *&PList,flightnode *&h)
{
char name[20],ID_num[20];
printf("\t\t请输入你的姓名:");
scanf("%s",name);
printf("\t\t请输入你的证件号:");
scanf("%s",ID_num);
delete_passenger(PList,h,name,ID_num);

}

main.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include"feijipiao.h"

int main()
{
char choice;
int t=1;
flightnode *flight;
passengerList *PList;
init_flight(flight);
init_passengerList(PList);
load_flight(flight);
load_passenger(PList);
while(t==1)
{
printf("\t**********************飞机订票系统菜单*************************\n");
printf("\t***************************************************************\n");
printf("\t***********************录入信息------1*************************\n");
printf("\t***********************订 票------2*************************\n");
printf("\t***********************退 票------3*************************\n");
printf("\t***********************查询航班------4*************************\n");
printf("\t***********************查询订单------5*************************\n");
printf("\t***********************修改航线------6*************************\n");
printf("\t***********************保存退出------0*************************\n");
printf("\t***************************************************************\n");
printf("\t请选择服务:");
choice=getch();
printf("%c\n",choice);
system("cls");
if(choice=='1')
{
add_flight(flight);
getch();
system("cls");
}
else if(choice=='2')
{
book(flight,PList);
getch();
system("cls");
}
else if(choice=='3')
{
cancel(PList,flight);
getch();
system("cls");
}
else if(choice=='4')
{
flight_check(flight);
getch();
system("cls");
}
else if(choice=='5')
{
passenger_check(PList);
getch();
system("cls");
}
else if(choice=='6')
{
modify_flight(flight,PList);
getch();
system("cls");
}
else if(choice=='0')
{
printf("\t\t再见!\n");
t=0;
}
}
save_flight(flight);
save_passenger(PList);
}



运行结果:

界面:



1.录入信息



2.订票3.退票



4.查询航班



5.查询订单



6.修改航班信息



学习心得:

学期末做了这样一个课程设计是对所学知识的回顾与运用也是对知识的整合和更深刻地理解。希望最后可以画上完美的句号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: