资源描述
成绩评定
教师签名
嘉应学院 计算机学院
实验报告
课程名称:
数据结构课程设计
开课学期:
2017-2018学年第2学期
班 级:
1503
指导老师:
钟治初
实验题目:
航空客运订票系统
学 号:
姓 名:
上机时间:
1. 需求分析
(1) 航空管理。每条航班所涉及的信息有:终点站名、航班号、飞机型号、飞行周日(星期几)、乘员定额、余票量。
(2) 客户管理。有关订票的客户信息(包括姓名、订票量、航位等级(1,2和3))以及等候替补的客户名单(包括姓名、所需票量)。
(3) 系统实现的主要操作和功能。系统实现的主要操作和功能如下:
①查询航班。根据旅客提出的终点站名输入下列信息:航班号、飞机型号、飞机日期、余票额。
②承办订票业务。根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满或者余票少于订票额,则需要重新询问客户要求;若需要,可等待排队后补。
③承办退票业务。根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先查询排在第一的客户,若所退票额能满足该客户的要求,则为其办理订票手续,否则询问其他排队候补的客户。
2. 概要设计
1) 本系统设计了一个含有多个菜单项的主控菜单,系统主控菜单运行界面
2) 存储结构设计
本系统主要采用链表结构类型存储航班信息和订票的乘客信息。航班信息链表结点由10个分量构成,乘客信息链表由5个分量构成。
3) 系统功能设计
本系统分为以下5个功能模块。
(1) 航班管理。航班管理子模块可完成添加新的航班,按终点站点名查询航班,浏览所有航班。
(2) 订票办理。在添加了航班的基础上可办理订票业务。乘客根据所需航班输入终点站名和订票量订票。如果订票量超过余票量,则会提示是否成为候补乘客;如果订票成功,则会要求输入订票乘客的姓名及所订票的舱位等级。
(3) 退票办理。已办理订票业务的乘客可根据所订票的航班和乘客姓名办理退票业务。、
(4) 乘客管理。可以查看已经订票的乘客信息和候补乘客的信息。
(5) 退出系统。退出整个航空客运订票系统。
3. 模块设计
1)模块设计
本程序包括主程序模块、菜单选择模块和队列操作模块。
主程序模块 -> 菜单选择模块 -> 队列操作模块
2) 系统子程序及功能设计
本系统共设置14个函数,其中包括主函数。个函数名及功能说明如下。
(1)char Continue( ) //询问是否继续的函数
(2)void ErrorMess( ) //操作出错函数
(3-1)int Find_Line1( ) //航班核对函数
(3-2)int Find_Line2( ) //按航班号查询函数
(4) void Line_search( ) //按目录地查询航班函数
(5) void Line_Add( ) //航班添加函数
(6) int Empty_Flight( ) //航班是否为空函数
(7) int Line_See( ) //航班查看函数
(8) void LinemanageMenu( ) //航班管理菜单
(9) void bookingMenu( ) //订票办理函数
(10) void Display_Reserve( ) //订票乘客信息
(11) void Display_Replace( ) //候补乘客信息
(12) void RefundticketMenu( ) //退票办理函数
(13) void CustomermagMenu( ) //乘客管理子菜单函数
(14) void main( ) //主程序画面函数
4.详细设计
1) 数据类型定义
(1)乘客信息的结构体定义
(2)航班信息的结构体定义
(3)全局变量定义
2) 系统主要子程序详细设计
(1)主程序模块设计
主函数。设定用户操作界面以及界面的颜色和大小,调用菜单子模块函数。
(2)航班管理模块子菜单界面函数
(3)航班管理的主要工作函数
(4) 订票办理函数,用于办理订票业务
5.测试分析
1) 航班管理菜单
在主菜单下,用户输入1并按下回车键,运行。该子模块可以实现添加新航班,按终点站名查找航班的信息,浏览查看所有航班信息这三项航班管理操作。
2) 订票业务办理
在进行了航班添加之后,即航班不为空时,在主菜单下输入2并回车办理订票业务,在界面提示下输入订票的相关航班信息和订票客户信息。运行。如果需要订票数超过余票量,则可选择等待成为候补乘客或选择放弃订票。
3) 退票业务办理
办理订票业务之后,可以办理对应的退票业务。在主菜单下输入3并按下回车键办理订票业务,在界面提示下输入匹配的退票航班信息和订票客户姓名即可退票成功,运行。
4) 乘客管理子菜单
办理了订票业务之后,系统可以管理办理了订票业务的乘客信息。在主菜单下输入4并按下回车键进入乘客管理菜单界面,运行。在此子功能模块下可以进行查看订票和候补乘客的信息。
6.退出
在主菜单下输入5并按下回车键,即退出“航空客运订票系统”。
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define MAX 60
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct Customer
{
char Name[8];
int Amount;
char Rank;
int IDinfor;
struct Customer *Next;
}Customer;
typedef struct Flight
{
char Des_Name[10];
char Flight_No[6];
char Plane_No[6];
int Week_Day;
int Customer_Amount;
int Free_Amount;
int Price[3];
Customer *CustName;
Customer *ReplName;
struct Flight *Next;
}Flight,*PFlight;
//全局变量
int Customer_Count = 0;
Flight *Head = NULL;
Flight *p2;
Customer *Custp1[MAX];
Customer *Replp1[MAX];
int IsEmpty = 1;
int IsReplace = 1;
Customer *prior;
int shouldsave = 0;
//1.询问是否继续的函数
char Continue()
{
char answer;
while(1)
{
printf("\n\t 您是否想继续(Y/N)?");
scanf("%s",&answer);
system("cls");
if(answer == 'y' || answer == 'Y')
return 'y';
else if(answer == 'n' || answer == 'N')
return 'n';
else printf("\n\t输入有误,请重新输入!");
}
}
//2.操作出错函数
void ErrorMess()
{
printf("\n\t 对不起,您的操作有误!"); getch();
}
//3-1.核对航班函数
int Find_Line1(PFlight L, char *key)
{
int flag = 0;
Flight *p1;
p1=L;
if(p1 == p2) return flag;
while(p1 != p2 && p1 != NULL)
{
if(strcmp(p1 -> Flight_No,key) == 0)
{
flag=1;
break;
}
p1=p1->Next;
}
return flag;
}
//3-2.按航班号查询函数
int Find_Line2(PFlight L, char *key, PFlight *pp, int *Flight_No)
{
int flag=0;
Flight *p1;
p1=L;
while(p1!=NULL)
{
if(strcmp(p1->Flight_No,key)==0)
{
flag=1;
*pp=p1;
break;
}
p1=p1->Next;
if(p1!=NULL) Flight_No++;
}
return flag;
}
//4. 按目录地查询航班函数
void Line_search()
{
char Desname[50];
Flight *p1=Head;
if(Head==NULL)
{
printf("\n\t没有到达您想要的终点站的航班!"); getch();
return;
}
printf("\n\t请输入终点站名:");
scanf("%s",Desname);
printf("\n\t您所查询的航班的信息:\n");
printf("\n_________________________________________________ \n");
while(p1!=NULL)
{
if(strcmp(p1->Des_Name,Desname)==0)
{
printf("目的地 航班号 飞机型号 星期 座位号 头等舱价格 普通舱价格 经济舱价格\n");
printf("\n%-9s%-8s%-8s%-7d%-8d%-10d%-12d%-8d",p1->Des_Name,
p1->Flight_No,p1->Plane_No,p1->Week_Day,p1->Customer_Amount,
p1->Price[0],p1->Price[1],p1->Price[2]);
}
p1=p1->Next;
}
printf("\n__________________________________________________ \n");
Continue();
}
//5. 航班添加函数
void Line_Add()
{
PFlight p,*p1;
p1=&Head;
while(1)
{
if(Head==NULL)
{
*p1=(PFlight)malloc(sizeof(Flight));
(*p1)->Next=NULL;
p2=Head;
}
else
{
p1=&p;
*p1=(PFlight)malloc(sizeof(Flight));
p2->Next=*p1;
p2=*p1;
}
printf("\n\t添加新的航班!\n");
printf("\n\t请输入终点站名:");
scanf("%s",&p2->Des_Name);
while(1)
{
printf("\n\t请输入唯一的航班号:");
scanf("%s",&p2->Flight_No);
if(Find_Line1(Head,p2->Flight_No))
printf("\n\t航班号已经存在!\n");
else break;
}
printf("\n\t请输入航班号:");
scanf("%s",&p2->Plane_No);
while(1)
{
printf("\n\t请输入航班日期(请输入1-7):");
scanf("%d",&p2->Week_Day);
if(p2->Week_Day<1 || p2->Week_Day>7)
printf("\n\t输入日期有误,请重新输入!\n");
else break;
}
printf("\n\t请输入座位数量:");
scanf("%d",&p2->Customer_Amount);
printf("\n\t请输入头等舱的价钱:");
scanf("%d",&p2->Price[0]);
printf("\n\t请输入二等舱的价钱:");
scanf("%d",&p2->Price[1]);
printf("\n\t请输入三等舱的价钱:");
scanf("%d",&p2->Price[2]);
p2->Free_Amount=p2->Customer_Amount;
p2->CustName=NULL;
p2->ReplName=NULL;
shouldsave=1;
if(Continue()=='n')
{
p2->Next=NULL;
return;
}
}
}
//6. 判断航班是否为空函数
int Empty_Flight()
{
if(Head == NULL)
{
system("cls");
printf("\n\t对不起,航班不存在,按任意键返回!"); getch();
return 1;
}
else return 0;
}
//7.航班查看函数
int Line_See()
{
Flight *p1;
system("cls");
p1=Head;
if(Empty_Flight()) return 0;
printf("\n\n\t 航班信息:\n");
printf("\n______________________________________________________________\n");
printf("目的地 航班号 飞机型号 星期 座位数 头等舱价格 普通舱价格 经济舱价格\n");
while(p1 != NULL)
{
printf("\n%-9s%-8s%-8s%-7d%-8d%-10d%-12d%-8d",p1->Des_Name,
p1->Flight_No,p1->Plane_No,p1->Week_Day,p1->Customer_Amount,
p1->Price[0],p1->Price[1],p1->Price[2]);p1=p1->Next;
}
printf("\n______________________________________________________________\n");
printf("\n\t按任意键返回!\n"); getch();
}
//8.航班管理菜单
void LinemanageMenu()
{
char c;
system("cls");
while(1)
{
printf("\n\t\t航班管理菜单:\n");
printf("\n______________________________________________________________\n");
printf("\t 1. 添加新的航班\n");
printf("\t 2. 查询航班 \n");
printf("\t 3. 查看航班 \n");
printf("\t 4. 返回主菜单 \n");
printf("\n\n______________________________________________________________\n");
printf("\t请选择您想要的服务:");
scanf("%s",&c);
switch(c)
{
case '1': Line_Add(); break;
case '2': Line_search(); break;
case '3': Line_See(); break;
case '4': return;
default: ErrorMess();
}
}
}
//9.订票办理函数
void bookingMenu()
{
int Ticket_Count,IDinfor,i,flag=0;
int Flight_No=0;
Flight *p1;
Customer *c1;
Customer *c2;
char answer[7];
char temp,c;
int tag=0;
int IsRepl=0;
if(Empty_Flight()) return;
while(1)
{
printf("\n\t现在您可以订票!");
flag=0;
tag=0;
printf("\n\t请输入航班号:");
scanf("%s",&answer);
if(Find_Line2(Head,answer,&p1,&Flight_No))
{
while(1)
{
printf("\n\t请输入您想要订购的数量:");
scanf("%d",&Ticket_Count);
if(Ticket_Count==0)
{
printf("\n\t请再次输入飞机型号:\n");
getch();
}
else break;
}
if(p1->Free_Amount >= Ticket_Count)
{
Customer_Count++;
flag=1;
IsRepl=1;
if(p1->CustName==NULL)
{
Custp1[Flight_No]=c1=(Customer*)malloc(sizeof(Customer));
p1->CustName=Custp1[Flight_No];
}
else
{
c1=(Customer*)malloc(sizeof(Customer));
Custp1[Flight_No]->Next=c1;
Custp1[Flight_No]=c1;
}
IsEmpty=0;
Custp1[Flight_No]->Amount=Ticket_Count;
IDinfor = p1->Customer_Amount-p1->Free_Amount+1;
Custp1[Flight_No]->IDinfor = IDinfor;
p1->Free_Amount -= Ticket_Count;
printf("\n\t请输入您的姓名:");
scanf("%s",&Custp1[Flight_No]->Name);
while(1)
{
printf("\n\t请输入舱位等级:");
scanf("%s",&Custp1[Flight_No]->Rank);
if(!(Custp1[Flight_No]->Rank >= '1' && Custp1[Flight_No]->Rank <= '3'))
{
printf("\n\t输入有误,请重新输入!");
getch();
}
else
break;
}
printf("\n\t请输入您的ID信息:");
scanf("%d",&Custp1[Flight_No]->IDinfor);
if(Ticket_Count<10)
printf("\n\t");
else
printf("\n\t");
printf("\n\t恭喜您订票成功!\n");
for(i=1;i<=Ticket_Count; i++)
{
printf("\n\t您所预定的座位号是%d",IDinfor++);
if(i%10==0)
printf("\n\t");
}
printf("\n");
}
else if(p1->Free_Amount==0)
{
printf("\n\t对不起,票已售完!\n");
IsRepl=0;
}
else
{
printf("\n\t对不起,当前没有多余的票!\n");
IsRepl=0;
}
if(!IsRepl)
{
printf("\n\t您是否想成为候补乘客(Y/N)?:");
scanf("%s",&temp);
if(temp=='y' || temp=='Y')
{
if(p1->ReplName==NULL)
{
c2=(Customer*)malloc(sizeof(Customer));
Replp1[Flight_No]=c2;
p1->ReplName = Replp1[Flight_No];
}
else
{
c2=(Customer*)malloc(sizeof(Customer));
Replp1[Flight_No]->Next = c2;
Replp1[Flight_No] =c2;
}
IsReplace=0;
tag=1;
Replp1[Flight_No]->Amount = Ticket_Count;
printf("\n\t请输入您的姓名:");
scanf("%s",&Replp1[Flight_No]->Name);
Replp1[Flight_No]->IDinfor = IDinfor;
Replp1[Flight_No]->Amount = Ticket_Count;
while(1)
{
printf("\n\t请输入舱位等级:");
scanf("%s",&Replp1[Flight_No]->Rank);
printf("\n\t请输入您的ID信息:");
scanf("%d",Replp1[Flight_No]->IDinfor);
if(!(Replp1[Flight_No]->Rank >='1' && Replp1[Flight_No]->Rank <= '3'))
{
printf("\n\t输入有误,请重新输入.");
getch();
}
else break;
}
printf("\n\t没有剩余座位!\n");
shouldsave=1;
}
}
}
else
printf("\n\t对不起, 航班不存在!\n");
if(flag)
Custp1[Flight_No]->Next=NULL;
if(tag)
{
Replp1[Flight_No]->Next=NULL;
printf("\n\t您已经成功排入候补订票队列中!\n");
}
printf("\n\t是否退出菜单?:(y/n)");
scanf("%s",&c);
if(c=='y') return;
}
}
//10.订票乘客信息
void Display_Reserver()
{
Flight *p1;
Customer *c1;
system("cls");
p1=Head;
if(Empty_Flight()) return;
printf("\n\t订票乘客信息");
if(IsEmpty)
{
printf("\n\t对不起,没有订票乘客信息!\n"); getch();
return;
}
printf("\n______________________________________________________________\n");
printf("Name Flight_No Plane_No Tic_Amount Des_Name Rank_No ID\n");
while(p1 != NULL)
{
if(p1->CustName != NULL)
{
c1 = p1->CustName;
while(c1 != NULL)
{
printf("\n%-8s%-10s%-9s%-11d%-9s%-9c%-9d",c1->Name,
p1->Flight_No,p1->Plane_No,c1->Amount,p1->Des_Name,c1->Rank,c1->IDinfor);
if(p1->Free_Amount >= 1)
printf("\n\n\t还有多余的票!\n");
else printf("\n\n\t票已售完!\n");
c1=c1->Next;
}
}
p1=p1->Next;
printf("\n______________________________________________________________\n");
}
printf("\n\t按任意键返回!"); getch();
return;
}
//11.候补乘客信息
void Display_Replace()
{
Flight *p1;
Customer *c1;
system("cls");
p1=Head;
if(Empty_Flight()) return;
printf("\n\t候补乘客信息!");
if(IsReplace)
{
printf("\n\t对不起,没有候补乘客!\n"); getch();
return;
}
printf("\n______________________________________________________________\n");
printf("姓名 航班号 飞机型号 订票数 目的地 舱位等级 顾客号\n");
while(p1 != NULL)
{
if(p1->ReplName != NULL)
{
c1=p1->ReplName;
while(c1 != NULL)
{
printf("\n%-8s%-10s%-9s%-11d%-9s%-9c%-9d",c1->Name,
p1->Flight_No,p1->Plane_No,c1->Amount,p1->Des_Name,c1->Rank,c1->IDinfor);
if(p1->Free_Amount >= 1)
printf("\n\n\t还有多余的票!\n");
else printf("\n\n\t票已售完!\n");
c1=c1->Next;
}
}
p1=p1->Next;
}
printf("\n\n______________________________________________________________\n");
printf("\n\t按任意键返回!"); getch();
return;
}
//12.退票办理函数
void RefundticketMenu()
{
int Flight_No=0,flag=0;
Flight *p1;
Customer *c2,*c4;
Customer *c3,*c5;
char answer[7],name[7];
int tag=0;
int IDinfor;
if(Empty_Flight()) return;
printf("\n\t现在开始进行退票手续");
if(IsEmpty)
{
printf("\n\t对不起,乘客不存在!"); getch();
return;
}
while(1)
{
flag = 0; tag=0; Flight_No=0;
printf("\n\t请输入航班:"); scanf("%s",&answer);
if(Find_Line2(Head,answer,&p1,&Flight_No))
{
c2=p1->CustName;
printf("\n\t请输入您的姓名:");
scanf("%s",&name);
if(c2==NULL)
{
printf("\n\t对不起,乘客不存在!");
if(Continue() == 'n') return;
}
else
while(c2 != NULL)
{
if(strcmp(c2->Name,name) == 0)
{
if(c2==p1->CustName)
{
prior=p1->CustName;
IDinfor=c2->IDinfor;
flag=1; break;
}
}
else if(c2->Next != NULL)
{
if(strcmp(c2->Next->Name,name)==0)
{
tag=1;
prior=c2;
IDinfor=c2->Next->IDinfor;
flag=1; break;
}
}
c2 = c2->Next;
shouldsave = 1;
}
if(!flag)
printf("\n\t对不起,乘客不存在!\n");
}
else printf("\n\t对不起,乘客不存在!\n");
if(flag)
{
if(prior == p1->CustName && !tag)
{
if(prior->Next == NULL)
{
p1->Free_Amount += prior->Next->Amount;
p1->CustName = NULL;
}
else
{
p1->Free_Amount += prior->Next->Amount;
p1->CustName = prior->Next;
}
}
else
{
p1->Free_Amount += prior->Next->Amount;
prior->Next =
展开阅读全文