Advertisement

数据结构课程设计:航班订票系统的设计与实现

阅读量:

摘要:
该航班订票系统主要功能包括录入信息、查询信息、订购机票、退订机票、修改信息和订单查询。系统采用结构化数据存储,使用C语言实现,结合链表和结构体组织数据。系统功能模块清晰,界面友好,用户可通过菜单方式选择功能。系统设计遵循“需求收集-设计-编码-测试-确认”原则,确保功能完整性和用户体验。参考文献包括《数据结构》和《数据结构(C语言版)》,为系统设计提供了理论支持。

目录

1 系统功能及要求

2 系统功能框架

3 详细设计

3.1 录入航班信息模块

3.2 客户订票模块

3.3 客户退票模块

3.4 航班查询模块

3.5 订单查询模块

3.6 航班修改模块

参考文献


1 系统功能及要求

录入相关信息。该系统支持录入航班相关信息,并将其存储在一个数据文件中。同时,支持录入客户资料,包括姓名、证件号、订票数量及航班信息,每个订单都有唯一编号。

(2)查询信息。首先,用户可以查询某条航线的详细信息:输入航班号后,系统会显示航班的起飞和降落时间、起飞和抵达的城市、舱位信息以及票价折扣情况,同时还会告知该航班是否已满载;此外,用户还可以根据起飞或抵达的城市,查询相关航班的机位信息。其次,用户可以查询订单情况:通过输入订单号、客户姓名或证件号等信息,可以采用多种途径检索到相应的订单记录。

预订机票服务。支持订票操作,订票信息可查询至系统数据库中(若航班信息或无票可用,可推荐相应备选航班)。

(4)退订机票。可退票并且退票后修改相关数据文件。

可支持对航班信息进行增删改操作,当航班信息发生变更时,系统会自动更新相关航班数据文件。

2 系统功能框架

系统功能主要包含六大功能模块,具体来说,包括查询航班、查询订单以及修改航班信息,每个功能又细分为三个小模块。

3 详细设计

3.1 录入航班信息模块

复制代码
 typedef struct flightnode{

    
 char flight_num[10];
    
 char start_time[10];
    
 char end_time[10];
    
 char start_place[20];
    
 char end_place[20]
    
 int left;
    
 float price;
    
 float price_discount;
    
 int isFull;
    
 struct flightnode *next;
    
 }flightnode;
    
 void init_flight(flightnode*&h)
    
 {
    
 h=(flightnode *)malloc(sizeof(flightnode));
    
 if(h==NULL) exit(0);
    
 h->next=NULL;
    
 }
    
 void save_flight(flightnode*h)
    
 {
    
 FILE*fp=fopen("flightList.dat","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.dat","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);
    
 }
    
 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 add_flight(flightnode*&h)
    
 {
    
 flightnode *p=h;
    
 char
    
 flight_num[10],start_time[10],end_time[10],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,e
    
 nd_time,left,price,price_discount,isFull);
    
 printf("\t\t 增加航班成功!\n",flight_num);
    
 printf("\t\t 是否继续录入航班信息(1 表示继续录入;0 表示停止录
    
 入).\n");
    
 printf("\t\t 请输入:");
    
 scanf("%d",&mark);
    
 }
    
 }

实现界面:

3.2 客户订票模块

复制代码
 typedef struct passengernode{

    
 char name[20];
    
 char ID_num[20];
    
 char flight_num[10];
    
 int order_num;
    
 int ticket_num;
    
 struct passengernode *next;
    
 }passengernode;
    
 typedef struct passengerList
    
 {
    
 passengernode *head;
    
 passengernode *rear;
    
 }passengerList;
    
 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.dat","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.dat","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 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;
    
 }
    
 char name[20];
    
 char ID_num[20];
    
 char flight_num[10];
    
 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\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);
    
 }
    
 while(ticket_num==0){
    
 printf("客户订票数量不能为空!\n");
    
 printf("\ t 订票数量:");
    
 scanf("%d",&ticket_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;
    
 }

实现界面:

3.3 客户退票模块

复制代码
 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);
    
 }
    
 int
    
 delete_passenger(passengerList*&PList,flightnode*&h,char*name,char*ID
    
 _num)
    
 {
    
 passengernode *p,*pr=PList->head;
    
 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;
    
 }

实现界面:

3.4 航班查询模块

复制代码
 int flight_num_check(flightnode*h,char*flight_num)

    
 {
    
 	flightnode*p=h;
    
 	printf("%-8s%-12s%-12s%-10s%-10s%-8s%-6s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","是否满仓","空座数");
    
 	for(;p!=NULL;p=p->next)
    
 	{
    
 		if(strcmp(p->flight_num,flight_num)==0)
    
 		{		printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-6.2f%-10d%-8d\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 抱歉,没有航班号为a%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%-12s%-12s%-10s%-10s%-8s%-6s%-10s%-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%-12s%-12s%-10s%-10s%-8.2f%-6.2f%-10d%-8d\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%-12s%-12s%-10s%-10s%-8s%-6s%-10s%-8s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","是否满仓","空座数");
    
 	for(;p!=NULL;p=p->next)
    
 	{
    
 	printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-6.2f%-10d%-8d\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[10],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);
    
 		flight_num_check(p,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;}

实现界面:

3.5 订单查询模块

复制代码
 int ID_name_check(passengerList*PList,char*name,char*ID_num)

    
 {
    
 	passengernode*p=PList->head->next;
    
 	int mark=0;
    
 	printf("%-8s%-20s%-20s%-10s%-8s\n","订单号","姓名","证件号","航班号","订票数量");
    
 	for(;p!=NULL;p=p->next)
    
 	{
    
 		if(strcmp(p->ID_num,ID_num)==0&&strcmp(p->name,name)==0)
    
 		{		printf("%-8d%-20s%-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%-20s%-20s%-10s%-8s%\n","订单号","姓名","证件号","航班号","订票数量");
    
 	for(;p!=NULL;p=p->next)
    
 	{
    
 		if(p->order_num==order_num)
    
 		{		printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num,p->flight_num,p->ticket_num);
    
 			return 1;
    
 		}
    
 	}
    
 	printf("\t\t抱歉,没有订单号为a%d的订单信息!\n",order_num); 
    
 	return 0;
    
 }
    
 void check_all_passenger(passengerList *PList)
    
 {
    
 	passengernode*p=PList->head->next;
    
 	int m=0;
    
 	printf("%-8s%-20s%-20s%-10s%-8s%\n","订单号","姓名","证件号","航班号","订票数量");
    
 	for(;p!=NULL;p=p->next)
    
 	{
    
 	printf("%-8d%-20s%-20s%-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_name_check(PList,name,ID_num);
    
 	}
    
 	else if(a=='2'){
    
 		printf("\t\t 请输入订单号:");
    
 		scanf("%d",&order_num);
    
 		order_num_check(PList,order_num);}
    
 	else if(a=='3')
    
 		check_all_passenger(PList);
    
 	else
    
 		return;
    
 }

实现界面:

3.6 航班修改模块

复制代码
 void modify_flight(flightnode *&h,passengerList *&PList)

    
 {
    
 	flightnode*p=h->next;
    
 	char flight_num[10],start_time[10],end_time[10];
    
 	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();
    
 	printf("%c\n",a);
    
 	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 航班时间修改成功!\n",flight_num);
    
 				}
    
 		}
    
 	}
    
 	else
    
 		return;
    
 }
    
 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 删除y%s 航班成功!\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;
    
 			}
    
 		}
    
 	}
    
 }

实现界面:

参考文献

李云清、杨庆红著. 数据结构(C语言版). 北京,人民邮电出版社,2004

[2]严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版.1997.

项目资源:获取“航班订票系统的设计与实现源码”请访问:

全部评论 (0)

还没有任何评论哟~