(飞机订票系统)
一、需求分析
1、本程序中,输入为字符串小写大写字符和整形;
2、以字符串输出;
3、本订票系统要能够实现航班情况的录入功能、航班的查询功能、订票功能、退票功能以及管理本系统的功能,具体为:
(1)录入功能
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
(2)查询功能
可以查询某个航线的情况(如,航班号,查询起降时间,起飞抵达城市,航班票价,确定航班是否满仓);
(3)订票功能
可以订票,如果该航班不存在,则订票失败;
(4)退票功能
可以退票并且记录乘客的相关信息以及退票信息;如客户资料:有姓名,证件号,订票航班情况,订单要有编号。
4、测试数据:订票正确输入航班号‘f2009’订票人姓名‘yangyating’ID‘0841919204’管理员正确密码“5566”错误密码“1234”
二、概要设计
1、程序包含以下模块:
每个模块的算法设计说明如下:
(1)录入模块:
查找单链表的链尾,在链尾插入一个“航班信息”的新结点。
(2)查询模块:
提供两种查方式:按航号和按航线查询,1代表按航号查询,2代表按航线查询。0则表示退出查询。
顺着单链表查找,如果与航班号(航线)一致,输出相关信息,否则,查询不成功。
(3)订票模块:
查找乘客要订的航班号,判断此航班是否有空位,有则输入乘客有关信息,订票成功,否则失败。
(4)退票模块:
输入要退票的乘客姓名以及证件号码,查找乘客资料的链表中是否有这位乘客,有则删去此结点,并在空位加上1,无则退票失败。
(5)修改模块:
输入密码,确认是否有权限对航班信息进行修改,有则在航班信息链表中查找要修改的结点,进行修改,否则不能修改。
图
主函数流程图
三、详细设计
1、航班的信息类型:为了便于查找和修改,航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、起飞达到的时间、空座和目的的、票价以及限座七个数据项:
航班号
起飞时间
达到时间
目的地
限座
空座
票价
单链表如下:
每个结点包括数据域和指针域:
数据域
指针域
C语言描述如下:
typedef struct flightnode{
char air_num[10]; /*航班号*/
char start_time[15]; /*起飞时间*/
char end_time[15]; /*到达时间*/
char end_place[30]; /*目的地*/
int total; /*限座*/
int left; /*空座*/
int price; /*票价*/
struct flightnode *next; /*指向个结点*/
}flightnode;
基本操作:
int CreatFlight(flightnode **l); //生成航班信息链表
int InsertFlight(flightnode **p,char *air_num,char *start_time,char *end_place,int total,int left,int price); //插入航班信息的结点
flightnode *modefy_airline(flightnode *l,char *air_num); //修改航班信息的函数
int BookTicket(flightnode*a,char *air_num,passengernode *c,char *name,char *ID_num); //订票函数
int CancelTicket(passengernode *c,flightnode*l,char *name,char *ID_num); //退票函数
int SearchFlight(flightnode*head); //查询航班信息函数
2、乘客信息类型:为了便于插入、删除和修改,其采用单链表存储结构,每个数据元素包括姓名、证件号码、航班号和座位号四个数据项:
旅客姓名
证件号码
航班号
座位号
每个结点包括数据域和指针域:
数据域
指针域
C语言描述如下:
typedef struct passengernode{ /*定义乘客资料结点*/
char name[20];
char ID_num[20];
char air_num[20];
int seat_num;
struct passengernode *next;
}passengernode;
基本操作:
int CreatPassenger(passengernode **l); //生成乘客资料链表
int InsertPassenger(passengernode **p,char *name,char *ID_num,char *air_num,int seat_num);
//插入乘客资料的结点
3、主函数和其他函数的伪码算法
void main() //主函数
{
while ()
{ printf(/*主菜单界面*/)
switch(ch=getchar())
{case’1’:BookTicket;break;
case’2’:CanclelTicket;break;
case’3’:if(){SearchFlight;}
else if(){SearchPassenger;};break;
case’4’:exit;break;}}}
flightnode *head_flight()
{ //生成航班头结点
}
passengernode *head_passengernode()
{ //生成乘客资料头结点
}
int CreatFlight(flightnode **l) //生成航班信息链表
{ //初始化航班信息
InsertFlight() //插入航班信息
}// CreatFlight
int CreatPassenger(passengernode **l) //生成乘客资料链表
{ //初始化乘客资料
InsertPassenger() //插入乘客资料
}// CreatPassenger
int InsertFlight() //插入航班信息新结点
{ //定义指针,动态分配,复制信息流,赋值,next返回指针,循环
//航班信息链的尾插
} //InsertFlight
int InsertPassenger()//插入乘客资料新结点
{ //定义指针,动态分配,复制信息流,赋值,next返回指针,循环
//乘客信息链的尾插
} //InsertPassenger
flightnode *modefy_airline(flightnode *l,char *air_num) {} //修改航班信息
int BookTicket() //订票
{ …
InsertPassenger()
}// BookTicket
int CancelTicket() //退票
{ …
l=modefy_airline(l,air_num);
}//CancelTicket
int SearchFlight(flightnode *head) //查询航班
{ //输出航班信息
}// SearchFlight
int SearchPassenger(passengernode *head) //查询乘客
{ //输出乘客信息
}// SearchPassenger
四、调试分析
1、调试结果:
(1) 系统主菜单界面:
(2)进入订票的界面:
(3)查询信息的界面:
选择1,查询航班信息的界面:
选择2,输入密码,查询乘客的信息的界面:
新增乘客,查询乘客信息:
密码错误时:
(4)进入退票的界面:
名字或者证件错误时:
2、时间复杂度分析:
本程序运行所耗费的时间主要在于循环语句,for和while语句,其时间复杂度应该为O(n)。
3、模块设计和调试时存在问题的思考:
原先在信息查询中没有乘客与管理人员的区别,乘客与管理人员都可以看到相同的信息,航班信息和乘客资料,后来,在浏览乘客资料时要求输入管理人员的密码,以确保乘客资料的安全性。
4、算法的改进设想:
本程序还存在很多缺点,不能完全的实现老师要求的各种功能,特别是在查询功能方面,此程序应该增加一些查询的方式的设计,如可以按照起飞抵达地点查询航班情况。
还有票价折扣和航班已无票,提供相关可选航班,订单须有编号的功能没有设计到。
五、用户手册
1、本程序运行环境是windows操作系统,执行文件是5.exe。
2、进行演示程序后,即显示用户界面:
3、进入“订票系统Book Ticket”的命令后,即提示输入航班号、订票人姓名、ID号,结束符为“回车符”,该命令执行后输出“已成功订票”“航班号和座位号”的信息。
4、进入“退票系统Cancel Ticket”的命令后,即提示输入订票人姓名和ID号,结束符为“回车符”,该命令执行后输出“已成功取消”或者输入错误信息则会输出“无此顾客”的信息。
5、进入“查看信息”的命令后,即进入“查看航班信息”和“查看乘客信息”,进入“查看航班信息”则会输出所有的航班信息分别为航班号、起止时间、起止地点、票价、总座、空座。进入“查看乘客信息”则提示输入管理员密码,输入密码之后,即会输出所有订票的乘客信息,分别为姓名、ID、航班号、座位号。
6、选择EXIT推出飞机订票系统。
六、测试结果
1、订票:
①输入:f2009、yangyating、0841919204
输出:Successful for Booking ticket.
Your flight: f2009
Your seat number: 46
②输入:f2005、Sujuan、0841919205
输出:Successful for Booking ticket.
Your flight: f2005
Your seat number: 22
③输入:f2222、sujuan、0841919107
输出:Sorry,there isn’t the plane,please check the airline number!
2、查询信息:
(1) 查询航班信息:输出:
Flight
Start_time
Arrival_place
Price
Total
Left_seat
f2008
08:00-08:30
Changsha-lasa
4000
100
23
f2009
09:00-12:00
Changsha-Beijing
1000
100
55
f2010
12:00-13:00
Changsha-deguo
7000
150
76
f2011
16:30-19:00
Changsha-Shanghai
500
100
25
f2012
17:00-20:55
Changsha-Sanya
900
65
40
f2013
21:00-23:45
Changsha-Guangdong
399
100
35
(2) 查询乘客信息:
①输入:5566
输出:
Name
ID
Flight
Seat_number
Sujuan
0841919205
f 2005
22
Donghui
0841919206
f 2006
2
W73
0841919207
f 2007
9
yangyating
0841919204
f 2009
46
②输入:1234
输出:sorry,the key is wrong
3、退票:
①输入:A、0841919205
输出:Successful for canceling ticket.
②输入:yangyating、0841919204
输出:Successful for canceling ticket.
③输入:sujuan、0841919107
输出:Sorry,there isn’t the customer!
再查看乘客信息:
输入:5566
输出:
Name
ID
Flight
Seat_number
Donghui
0841919206
f 2006
2
W73
0841919207
f 2007
9
七、附录
本系统源程序如下:
#include
//标准输入、输出头文件
#include //包含字符串函数处理头文件
#include //定义字符串
#include
#define OK 1
#define ERROR 0
typedef struct flightnode{ //定义航班信息结点
char air_num[10]; //航班号
char start_time[15]; //起飞时间
char end_time[15]; //到达时间
char end_place[30]; //目的地
int total; //限座
int left; //空座
int price; //票价
struct flightnode *next; //指向个结点
}flightnode;
typedef struct passengernode{ //定义乘客资料结点
char name[20]; //姓名
char ID_num[20]; //证件号码
char air_num[20]; //航班号
int seat_num; //座位号
struct passengernode *next; //指向个结点
}passengernode;
flightnode *head_flight(); //生成航班信息的头结点
passengernode *head_passenger(); //生成乘客资料的头结点
int CreatFlight(flightnode **l); //生成航班信息链表
int CreatPassenger(passengernode **l); //生成乘客资料链表
int InsertFlight(flightnode **p,char *air_num,char *start_time,char *end_place,int total,int left,int price); //插入航班信息的结点
int InsertPassenger(passengernode **p,char *name,char *ID_num,char *air_num,int seat_num); //插入乘客资料的结点
flightnode *modefy_airline(flightnode *l,char *air_num); //修改航班信息的函数
int BookTicket(flightnode*a,char *air_num,passengernode *c,char *name,char *ID_num); //订票函数
int CancelTicket(passengernode *c,flightnode*l,char *name,char *ID_num); //退票函数
int SearchFlight(flightnode*head); //查询航班信息函数
int SearchPassenger(passengernode *head); //查询乘客信息函数
void main() //主函数
{
int p=2; //p=1时进入主菜单,p=0时退出系统
passengernode *cus=head_passenger();
flightnode *air=head_flight();
char name[20],air_num[20],ID_num[30],mima[20],ch;
char t[20]="5566"; //管理员密码
system("cls");
CreatFlight(&air);
CreatPassenger(&cus);
while(p==2) //主菜单界面
{
printf("\n welcome to the airline system!\n\n please choose the serves below and press the number:\n\n");
printf(" ================================================================\n\n");
printf(" 1 -> Book Ticket \n");
printf(" 2 -> Cancel Ticket \n");
printf(" 3 -> Search Information \n");
printf(" 4 -> Exit \n\n");
printf(" ================================================================\n");
switch(ch=getchar()){
case '1':{printf("\n *-------------Booking Ticket-------------*\n"); //进入订票功能
printf("Please input a airline number and press enter for OK:");
scanf("%s",air_num);
printf("Please input your name and press enter for OK:");
scanf("%s",name);
printf("Please input your ID number and press enter for OK:");
scanf("%s",ID_num);
BookTicket(air,air_num,cus,name,ID_num);getch();}
;break;
case '2':{printf(" *-----------------------Canceling Ticket--------------------*\n"); //进入退票功能
printf("Please input the cancel name for booking ticket:");
scanf("%s",name);
printf("Please input the ID for booking ticket:");
scanf("%s",ID_num);
CancelTicket(cus,air,name,ID_num);
};break;
case '3':{printf("*---------------Search Information---------------------*\n"); //进入信息查询功能
printf(" 1 -> flight information \n" );
printf(" 2 -> passenger information\n ");
printf(" other -> exit \n");
printf("*------------------------------------------------------*\n");
if((ch=getch())=='1') //航班信息查询
{printf("*------------------ flight information -----------------*\n");
SearchFlight(air);}
else if(ch=='2'){ //乘客资料查询
printf("\n please input the key:");scanf("%s",mima); //输入管理员密码
if(strcmp(mima,t)==0){printf("\n*---------------passenger information ---------------*\n\n");
SearchPassenger(cus);}
else printf("sorry,the key is wrong");getch();}}break;
case '4':{getch();p=0; //退出系统
}break;
}
}}
flightnode *head_flight() //生成航班信息的头结点
{
flightnode *a;
a=(flightnode *)malloc(sizeof(flightnode)); //动态分配空间给flightnode指针并付给a
if(a==NULL)
a->next=NULL;
return a;
}
passengernode *head_passenger() //生成乘客资料头结点
{
passengernode *c;
c=(passengernode*)malloc(sizeof(passengernode));//分配
if(c==NULL)
c->next=NULL;
return c;
}
int CreatFlight(flightnode **l) //生成航班信息链表(用单链表存储)
{
flightnode *p=*l; //
int i=0;
char *air_num[6]={"f2008","f2009","f2010","f2011","f2012","f2013"};
char *start_time[6]={" 08:00-08:30","09:00-12:30"," 12:00-13:00"," 16:30-19:00","17:00-20:55","21:00-23:45"};
char *end_place[6]={"Changsha-lasa","Changsha-Beijing","Changsha-deguo","Changsha-Shanghai","Changsha-Sanya",
"Changsha-Guangdong",}; //初始化航班信息
int total[6]={100,100,150,100,65,100};
int price[6]={4000,1000,7000,500,900,399};
int left[6]={23,55,76,25,40,35};
for(i=0;i<6;i++)
InsertFlight(&p,air_num[i],start_time[i],end_place[i],total[i],left[i],price[i]); //插入航班信息
return OK;
}
int CreatPassenger(passengernode **l) //生成乘客资料链表(用单链表存储)
{
passengernode *p=*l;
int i=0;
char *name[3]={"Sujuan","Donghui","W73"};
char *ID_num[3]={"0841919205","0841919206","0841919207"}; //初始化乘客资料
char *air_num[3]={"f2005","f2006","f2007"};
int seat_num[3]={22,2,9};
for(i=0;i<3;i++)
InsertPassenger(&p,name[i],ID_num[i],air_num[i],seat_num[i]); //插入乘客资料
return OK;
}int InsertFlight(flightnode **p,char *air_num,char *start_time,char *end_place,int total,int left,int price) //插入航班信息新结点
{flightnode *q;
q=(flightnode*)malloc(sizeof(flightnode));
strcpy(q->air_num,air_num); //复制信息流
strcpy(q->start_time,start_time);
strcpy(q->end_place,end_place);q->total=total;
q->left=left;
q->price=price;
q->next=NULL;
(*p)->next=q;//next返回指针
(*p)=(*p)->next; //(循环) 航班信息链的尾插法
return OK;
}
int InsertPassenger(passengernode **p,char *name,char *ID_num,char *air_num,int seat_num) //插入乘客资料新结点
{passengernode *q;
q=(passengernode*)malloc(sizeof(passengernode));
strcpy(q->name,name);
strcpy(q->ID_num,ID_num);
strcpy(q->air_num,air_num);
q->seat_num=seat_num;
q->next=NULL;
(*p)->next=q;
(*p)=(*p)->next; //乘客资料链表的尾插法
return OK;
}
flightnode *modefy_airline(flightnode *l,char *air_num) //修改航班信息
{
flightnode *p;
p=l->next;
for(;p!=NULL;p=p->next)
{
if(strcmp(air_num,p->air_num)==0)//比较字符串,相等时值为0
{
p->left++;
return l;
}
//printf("NO the airline!");
return 0;
}}
int BookTicket(flightnode *a,char *air_num,passengernode *c,char *name,char *ID_num) //订票
{flightnode *p=a;
passengernode *q=c->next;
p=a->next;
for(;q->next!=NULL;q=q->next);
for(;p!=NULL;p=p->next)
{if(strcmp(p->air_num,air_num)==0){ //比较字符串
if(p->left>0)
{printf(" \nSuccessful for Booking ticket.\n\n Your flight: %s\n Your seat number : %d ",p->air_num,(p->total-p->left+1));printf("\n *-----------------------------------------*");
InsertPassenger(&q,name,ID_num,air_num,p->total-p->left+1);
p->left--; return OK;}
else
{printf("seat is full");return 0;}
}/*if(strcmp)*/ }
printf("Sorry,there isn't the plane,please check the airline number!");printf("\n *-----------------------------------------*");
}
int CancelTicket(passengernode *c,flightnode *l,char *name,char *ID_num) //退票
{
passengernode *p,*pr;
char air_num[20];
pr=c;
p=pr->next;
while(p!=NULL)
{
if(strcmp(p->name,name)==0&&strcmp(p->ID_num,ID_num)==0)
{
strcpy(air_num,p->air_num);
l=modefy_airline(l,air_num);
pr->next=p->next;
p=pr->next;
printf("successful for canceling ticket.");
printf("\n *-----------------------------------------------------------------*");
return OK;
}
pr=pr->next;
p=pr->next;
}
printf("Sorry,there isn't the customer!");
printf("\n *--------------------------------------------------------*");
return ERROR;
}
int SearchFlight(flightnode *head) //查询航班
{flightnode *p=head->next;
printf(" Flight Start_time Arrival_place Price Total Left_seat\n\n");
for(;p!=NULL;p=p->next)
{
printf(" %s %-10s %-9s %-7d%-6d %-6d\n",p->air_num,p->start_time,p->end_place,p->price,p->total,p->left);printf("\n");
}printf(" *----------------------------------------------------------*\n\n");
return OK;
}
int SearchPassenger(passengernode *head) //查询乘客
{struct passengernode *q=head->next;
printf(" Name ID Flight Seat_number\n\n");
for(;q!=NULL;q=q->next)
{
printf("%-12s %-8s %-5s %d\n",q->name,q->ID_num,q->air_num,q->seat_num);printf("\n");
}
printf("\n *----------------------------------------------------------*");
return OK;}
�
NO
输入N:判断N是否在0~4之间
YES
�
根据N调用模块函数
显示功能选项
订票
修改
退票
查看航班信息
录入航班信息
飞机订票系统
D3
D2
D1
h