数据结构课程(航空订票系统)设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
航空客运订票系统
1、需求分析
航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。
试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
【基本要求】
(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行周日(星期几)、乘员定额、余票量、已订票的客户名单(包括姓名、订票量、
舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量);
(2)作为示意系统,全部数据可以只放在内存中;
(3)系统能实现的操作和功能如下:
a、查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机
号、星期几飞行、最近一天航班的日期和余票额;
b、承办订票业务:根据客户提出的要求(航班号、订票数额)查询该
航班票额情况,若有余票,则为客户班里订票手续,输出作为好;若
已满或者余票少于订票额,则需要重新询问客户要求。
若需要,可等
级排队侯补;
c、承办退票业务:根据客户提供的情况(航班),为客户办理退票手
续,然后查询该航班是否有人排队侯补,首先询问排在第一的客户,
若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其
他排队侯补的客户。
(4)开始已初始化3条航线(如下),可按操作提示选择“显示所有航线”查看,客户信息与新航线信息可根据测试需要自行添加,具体情况请见下面测试结果。
【选做内容】
a、输出所有航线信息;
b、管理员系统:通过密码认证后可查看所有航班的订票情况,可根据
需要增加新的航线。
2、概要设计
由于“航线”可只用一条单链表记录,故采用全局变量,减少参数的传递。
1、定义“航线”类型
ADT Lairline{
数据对象:D={ai|ai∈航线链表集,i=1,2,3……,n,n>=0}
数据关系:R1={<ai-1,ai>| ai-1,ai∈D,i=1,2,3……,n }
基本操作:
Lairline search_line() //按航班号查找航班
Lairline search_plant() //按飞机号查找航班
Lairline search_day() //按飞行日期查找航班
Lairline search_addr() //按航班终点查找航班
void more() //设计者信息
void guide() //主菜单界面
void insert_line() //插入新航班
void print_customer(airline *p) //显示航班客户信息
void admin() //进入管理员操作系统
void book() //订票系统
void waited(airline *p) //排队订票系统
void refund() //退票系统
void search() //航班查询系统
void InitLine() //初始化航线信息
void printline() //显示所有航班信息} ADT Lairline
2、主程序
void main()
{
初始化;
do{
接受命令;
处理命令(调用相应函数);
}while(“命令”!=“退出”);
}
3、调用关系
3、详细设计
1、航线,客户的存储结构
typedef struct customer{ //客户信息
char name[20]; //客户姓名
int num; //订票量
int level; //舱位等级
customer *next;
}customer,*Lcustomer;
typedef struct airline{ //航线信息
char end_addr[20]; //航线终点
char line_num[5]; //航班号
char plant_num[8]; //飞机号
int day; //飞行日期
int total; //定员
int left; //剩余票数
customer *booked; //已定客户信息
customer *wait; //排队等候订票信息
airline *next;
}airline,*Lairline;
2、链表的各种操作
Lairline search_line() //按航班号查找航班
Lairline search_plant() //按飞机号查找航班
Lairline search_day() //按飞行日期查找航班
Lairline search_addr() //按航班终点查找航班
void more() //设计者信息
void guide() //主菜单界面
void insert_line() //插入新航班
void print_customer(airline *p) //显示航班客户信息
void admin() //进入管理员操作系统
void book() //订票系统
void waited(airline *p) //排队订票系统
void refund() //退票系统
void search() //航班查询系统
void InitLine() //初始化航线信息
void printline() //显示所有航班信息
部分操作的算法或伪代码
Lairline search_line() //按航班号查找航班
{
char a[5];
airline *p;
p=L->next;
PR("请输入航班号");
SC("%s",a);
for(;p;p=p->next)
if(!strcmp(a,p->line_num)) break;
return p;
}
void insert_line() //插入新航班
{
airline *p,*q;
int flag=1;
for(;flag;)
{
q=(Lairline)malloc(sizeof(airline));
PR("请输入航班号:");
SC("%s",q->line_num);
for(p=L;p->next;p=p->next)//判断航线插入位置
if(strcmp(p->next->line_num,q->line_num)>=0)
break;
if(p->next&&strcmp(p->next->line_num,q->line_num)==
0)//航线存在的情况
{
PR("航班已存在,请重新输入\n");
continue;
}
按照提示输入新航线信息;
PR("增加航班成功,是否继续增加\n继续(1)\n返回(0)");
SC("%d",&flag);
}
}
void admin() //进入管理员操作系统
void admin() //进入管理员操作系统
{
int i,flag,tag;
char a[20];
airline *p;
设置身份验证,只有密码正确才能进入,否则返回主程序;
for(tag=1;tag;)
{
PR("请选择操作\n查询航班订票情况(1)\n增加新航班(2)\n");
SC("%d",&flag);
if(flag==1)
{
航线存在则显示航线客户信息,否则显示航线不存在;
}
else if(flag==2)
insert_line();//增加新航线
else
PR("操作错误,请按提示操作\n");
PR("请选择操作\n继续(1)\n退回主菜单(0)\n");
SC("%d",&tag);
}
guide();
}
void book() //订票系统
{
int i;
int flag=0;
airline *p;
customer *cst,*c;
PR("请输入查询航班的方式:\n");
选择航线查找方式查找航线;
if(p)
{
航线存在,输入订票信息(包括客户姓名,订票量,票等级);
if(cst->num<=p->left)
{
票数满足,将客户信息添加到已定票客户名单;
}
else
{
余票不足,询问客户是否进行排队等候,若是,则将客
户名单添加到排队订票名单;
}
}
else
PR("没有该航班\n");
guide();
}
void waited(airline *p) //排队订票系统
{
int flag;
customer *q,*q0,*h;
if(!p->wait) return;
q=(customer *)malloc(sizeof(customer));
q->level=0;
q->num=123;
strcpy(q->name,"00000");
q->next=p->wait;
h=q;
for(;p->left>0&&q->next;)
{
if(q->next->num<p->left)
{
PR("%s,您正在排队定%d张票,现有票,是否定\n是
(1)\n否(0)\n",q->next->name,q->next->num);
SC("%d",&flag);
if(flag)
{
q0=q->next;
q->next=q->next->next;
q0->next=p->booked;
p->booked=q0;
p->left=p->left-q0->num;
PR("排队订票成功\n\n");
}
}
else
q=q->next;
}
p->wait=h->next;
}
void refund() //退票系统
{
int flag;
char a[20];
airline *p;
customer *c,*c1;
根据客户提供信息先找到航班(search_line())查找客户信息所在结点,若没有则返回主程序,若找到则删除节点,并询问排队客户是否订票(waited(p));
}
void search() //航班查询系统
{
int i;
int flag=0;
airline *p;
PR("请输入查询航班的方式:\n");
PR("航班号---->1\n");
PR("飞机号---->2\n");
PR("飞行日期-->3\n");
PR("航班终点-->4\n");
SC("%d",&i);
for(;!flag;)
switch(i)
{
case 1: p=search_line();flag=1;break;
case 2: p=search_plant();flag=1;break;
case 3: p=search_day();flag=1;break;
case 4: p=search_addr();flag-=1;break;
default:PR("操作错误,请重新输入\n");break;
}
if(p)
{
PR("终点站航班号飞机号飞行周日余票量\n");
PR("%-20s%10s%10s%8d%8d\n",p->end_addr,p->line_num,p-> plant_num,p->day,p->left);
PR("是否订票(确定请按1)");
SC("%d",&i);
if(i==1)
book();
}
else
PR("没有该航班\n");
}
void InitLine() //初始化航线信息
{
初始化航线,先建立3条航线方便测试;
}
3、主程序
void main() //主函数
{
int flag=1;
more();
guide(); //操作指引界面
InitLine(); //初始化航班信息
do
{
switch(getchar())
{
case '1':printline();break;//显示所有航班
case '2':search();break; //查找航班
case '3':book();break; //订票
case '4':refund();break; //退票
case '5':admin();break; //管理员系统
case '6':more();break; //设计者信息
case '9':system("cls");guide();break;
case '0':flag=0;break;
}
}while(flag);
}
4、函数调用关系
4、调试分析
1、在编程过程中,起先使用的是局部变量,每次调用函数都需要进行参数的传递,很麻烦,而且还容易出现错误;后意识到航线的链表只有一条,很多函数都需要对其数据进行修改,故航线信息采用了全局变量,方便数据的修改,减少了参数的传递。
2、因为排队订票的客户信息列表没有设置头结点,在退票后询问排队订票客户是否订票时,出现了操作错误,在没有头结点的情况下判断等操作很麻烦,故在 wait(p) 函数里询问排队客户是否订票时,为排队订票的客户信息列表增加了头结点,方便操作。
3、在开始的时候,排队订票客户信息使用的是队列进行数据存储,但测试的时候,发现当第一名排队订票客户不满足需求时询,往后依次询问客户时,队列完全没用,而且还需进行尾节点的各项操作,故弃用队列存储结构。
4、由于本程序涉及的知识单链表的查找,插入和删除,故时间复杂度为O(n),辅助空间为O(1)。
5、经验和体会:我用vc6.0编程的,这么长的代码,让我深刻认识到断点调试的必要性;同时让我了解到动手的重要性,开始的时候,明明有满脑子的想法和算法,就是很难把想法和算法用代码实现;通过此次课程设计,我的动
手能力和算法设计能力有了明显的提高。
5、用户手册
1、本程序的运行环境为DOS操作系统,执行文件为:plantline.exe。
2、进入程序后,即显示如下用户界面:
3、请按照提示选择操作,每个后继操作均有明确提示。
4、输入操作后,请按回车确认。
6、测试结果
1、原始数据:
航班号飞机号终点站定员余票量飞行
周日已定票
客户
排队订
票客户
006 1253485 nanjing 120 120 6 0 0 004 1253478 tianjing 120 120 4 0 0
3、查找航班
1)终点站查询:shanghai
2)航班号查询:004
航班号客户姓名票数等级不足时是否排队等候003 Huang 20 2
003 Bill 25 2
003 Bin 36 2
003 Smith 60 2 是
003 Ellis 25 2
003 Kate 30 2 是
进入管理员系统,可查询航班订票情况,如下图
退票(Bill)
退票后的订票情况
7、附录(源代码)#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define PR printf
#define SC scanf
typedef struct customer{ //客户信息
char name[20]; //客户姓名
int num; //订票量
int level; //舱位等级
customer *next;
}customer,*Lcustomer;
typedef struct airline{ //航线信息
char end_addr[20]; //航线终点
char line_num[5]; //航班号
char plant_num[8]; //飞机号
int day; //飞行日期
int total; //定员
int left; //剩余票数
customer *booked; //已定客户信息
customer *wait; //排队等候订票信息
airline *next;
}airline,*Lairline;
airline *L; //将航班信息定义为全局变量,减少参数传递
Lairline search_line() //按航班号查找航班
{
char a[5];
airline *p;
p=L->next;
PR("请输入航班号");
SC("%s",a);
for(;p;p=p->next)
if(!strcmp(a,p->line_num)) break;
return p;
}
Lairline search_plant() //按飞机号查找航班{
char a[8];
airline *p;
p=L->next;
PR("请输入飞机号");
SC("%s",a);
for(;p;p=p->next)
if(!strcmp(a,p->plant_num)) break;
return p;
}
Lairline search_day() //按飞行日期查找航班{
int a;
airline *p;
p=L->next;
PR("请输入飞行日期");
SC("%d",&a);
for(;p;p=p->next)
if(a==p->day) break;
return p;
}
Lairline search_addr() //按航班终点查找航班{
char a[20];
airline *p;
p=L->next;
PR("请输入航班终点");
SC("%s",a);
for(;p;p=p->next)
if(!strcmp(a,p->end_addr)) break;
return p;
}
void more() //设计者信息
{
PR("\t=======================================\n");
PR("\t============ 制作人信息 ===============\n");
PR("\t========== 10级软件工程4班 ============\n");
PR("\t=============== 黄斌 ==================\n");
PR("\t============ 3110006385 ===============\n");
PR("\t=======================================\n");
}
void guide() //主菜单界面
{
PR(" ------------航空订票客服系统----------\n");
PR("==============================================\n") ;
PR("\t\t显示所有航线==> 1\n");
PR("\t\t查询航线信息==> 2\n");
PR("\t\t订票业务 ==> 3\n");
PR("\t\t退票业务 ==> 4\n");
PR("\t\t管理系统 ==> 5\n");
PR("\t\t更多 ==> 6\n");
PR("\t\t退出系统 ==> 0\n");
PR("==============================================\n") ;
PR("\t\t清除屏幕信息==> 9\n\n");
PR("请按上面指引操作:\t");
}
void insert_line() //插入新航班
{
airline *p,*q;
int flag=1;
for(;flag;)
{
q=(Lairline)malloc(sizeof(airline));
PR("请输入航班号:");
SC("%s",q->line_num);
for(p=L;p->next;p=p->next)
if(strcmp(p->next->line_num,q->line_num)>=0)
break;
if(p->next&&strcmp(p->next->line_num,q->line_num)==0) {
PR("航班已存在,请重新输入\n");
continue;
}
PR("请输入飞行日期:");
SC("%d",&q->day);
PR("请输入飞机号:");
SC("%s",q->plant_num);
PR("请输入终点站:");
SC("%s",q->end_addr);
q->total=120;
q->left=120;
q->booked=NULL;
q->wait=NULL;
q->next=p->next;
p->next=q;
PR("增加航班成功,是否继续增加\n继续(1)\n返回(0)");
SC("%d",&flag);
}
}
void print_customer(airline *p) //显示航班客户信息{
customer *c;
if(p->booked)
{
c=p->booked;
PR("已定票客户信息\n票数\t/\t客户姓名\n");
for(;c;c=c->next)
PR("%5d\t/\t%s\n",c->num,c->name);
PR("\n\n");
}
else
PR("暂时没有客户订票\n\n");
if(p->wait)
{
c=p->wait;
PR("排队订票客户信息\n票数\t/\t客户姓名\n");
for(;c;c=c->next)
PR("%5d\t/\t%s\n",c->num,c->name);
PR("\n\n");
}
else
PR("暂时没有客户排队订票\n\n");
}
void admin() //进入管理员操作系统
{
int i,flag,tag;
char a[20];
airline *p;
PR("请输入管理员密码:(huangbin)");
for(i=0;i<3;i++)
{
SC("%s",a);
if(strcmp(a,"huangbin"))
{
PR("\t\t======密码错误======\n\n");
i++;
}
else break;
}
if(i==3)
{ guide(); return ; }
for(tag=1;tag;)
{
PR("请选择操作\n查询航班订票情况(1)\n增加新航班(2)\n");
SC("%d",&flag);
if(flag==1)
{
p=search_line();
if(p)
print_customer(p);
else
PR("没有找到该航班\n");
}
else if(flag==2)
insert_line();
else
PR("操作错误,请按提示操作\n");
PR("请选择操作\n继续(1)\n退回主菜单(0)\n");
SC("%d",&tag);
}
guide();
}
void book() //订票系统
{
int i;
int flag=0;
airline *p;
customer *cst,*c;
PR("请输入查询航班的方式:\n");
PR("航班号--->1\n");
PR("终点站--->2\n");
PR("飞行日期->3\n");
for(;!flag;)
{
SC("%d",&i);
switch(i)
{
case 1: p=search_line();flag=1;break;
case 2: p=search_addr();flag=1;break;
case 3: p=search_day();flag=1;break;
default:PR("操作错误,请重新输入\n");break;
}
}
if(p)
{
PR("终点站航班号飞机号飞行周日余票量\n");
PR("%-20s%10s%10s%8d%8d\n",p->end_addr,p->line_num,p-> plant_num,p->day,p->left);
cst=(customer *)malloc(sizeof(customer));
PR("请输入订票数量:");
SC("%d",&cst->num);
PR("请输入舱位等级(1/2/3)");
SC("%d",&cst->level);
PR("请输入您的名字");
SC("%s",cst->name);
if(cst->num<=p->left)
{
cst->next=p->booked;
p->booked=cst;
p->left=p->left-cst->num;
PR("订票成功,座位号为%d~%d\n",p->total-p->left-cst->num+1,p->total-p->left);
}
else
{
PR("余票不足,是否排队等候?\n是(1)\n否(0)\n");
SC("%d",&flag);
if(flag)
{
if(!p->wait)
{
cst->next=p->wait;
p->wait=cst;
}
else
{
c=p->wait;
for(;c->next;c=c->next);
cst->next=c->next;
c->next=cst;
}
}
}
}
else
PR("没有该航班\n");
guide();
}
void waited(airline *p) //排队订票系统
{
int flag;
customer *q,*q0,*h;
if(!p->wait) return;
q=(customer *)malloc(sizeof(customer));
q->level=0;
q->num=123;
strcpy(q->name,"00000");
q->next=p->wait;
h=q;
for(;p->left>0&&q->next;)
{
if(q->next->num<p->left)
{
PR("%s,您正在排队定%d张票,现有票,是否定\n是(1)\n否(0)\n",q->next->name,q->next->num);
SC("%d",&flag);
if(flag)
{
q0=q->next;
q->next=q->next->next;
q0->next=p->booked;
p->booked=q0;
p->left=p->left-q0->num;
PR("排队订票成功\n\n");
}
else
q=q->next;
}
else
q=q->next;
}
p->wait=h->next;
}
void refund() //退票系统
{
int flag;
char a[20];
airline *p;
customer *c,*c1;
p=search_line();
c=p->booked;
if(!p)
{
PR("没有该航班\n\n");
guide();
return;
}
PR("请输入您的姓名");
SC("%s",a);
if(!p->booked->name)
{
PR("对不起,没有找到您的信息\n\n");
guide();
return ;
}
if(!strcmp(a,p->booked->name))
{
PR("退票信息\n姓名/终点站/票数\n%s/%s/%d\n",p->booked->name,p->end_addr,p->booked->num) ;
PR("确认要退票?()\n是(1)\n否(0)\n");
scanf("%d",&flag);
if(flag)
{
p->booked=p->booked->next;
p->left=p->left+c->num;
free(c);
PR("退票成功\n\n");
waited(p);
guide();
}
}
else
{
for(;c->next;c=c->next)
if(!strcmp(a,c->next->name))
break;
if(!c->next)
{
PR("对不起,没有找到您的信息\n\n");
guide();
return ;
}
else
{
PR("退票信息\n姓名/终点站/票数\n%s/%s/%d\n",c->next->name,p->end_addr,c->next->num);
PR("确认要退票?()\n是(1)\n否(0)\n");
scanf("%d",&flag);
if(flag)
{
c1=c->next;
c->next=c->next->next;
p->left=p->left+c1->num;
free(c1);
PR("退票成功\n\n");
waited(p);
guide();
}
}
}
}
void search() //航班查询系统
{
int i;
int flag=0;
airline *p;
PR("请输入查询航班的方式:\n");
PR("航班号---->1\n");
PR("飞机号---->2\n");
PR("飞行日期-->3\n");
PR("航班终点-->4\n");
SC("%d",&i);
for(;!flag;)
switch(i)
{
case 1: p=search_line();flag=1;break;
case 2: p=search_plant();flag=1;break;
case 3: p=search_day();flag=1;break;
case 4: p=search_addr();flag-=1;break;
default:PR("操作错误,请重新输入\n");break;
}
if(p)
{
PR("终点站航班号飞机号飞行周日余票量\n");
PR("%-20s%10s%10s%8d%8d\n",p->end_addr,p->line_num,p-> plant_num,p->day,p->left);
PR("是否订票(确定请按1)");
SC("%d",&i);
if(i==1)
book();
}
else
PR("没有该航班\n");
}
void InitLine() //初始化航线信息{
airline *p,*q;
L=(airline *)malloc(sizeof(airline));
L->booked=NULL;
L->wait=NULL;
L->next=NULL;
strcpy(L->end_addr,"00000000");
strcpy(L->line_num,"000");
strcpy(L->plant_num,"0000000");
L->day=L->left=L->total=0;
q=L;
p=(airline *)malloc(sizeof(airline));
p->booked=NULL;
p->wait=NULL;
strcpy(p->end_addr,"beijing");
strcpy(p->line_num,"003");
strcpy(p->plant_num,"2586934");
p->day=1;
p->left=120;
p->total=120;
p->next=q->next;
q->next=p;
p=(airline *)malloc(sizeof(airline));
p->booked=NULL;
p->wait=NULL;
strcpy(p->end_addr,"shanghai");
strcpy(p->line_num,"002");
strcpy(p->plant_num,"2682154");
p->day=2;
p->left=120;
p->total=120;
p->next=q->next;
q->next=p;
p=(airline *)malloc(sizeof(airline));
p->booked=NULL;
p->wait=NULL;
strcpy(p->end_addr,"guangzhou");
strcpy(p->line_num,"001");
strcpy(p->plant_num,"4558934");
p->day=3;
p->left=120;
p->total=120;
p->next=q->next;
q->next=p;
}
void printline() //显示所有航班信息
{
int flag;
airline *p;
p=L->next;
PR("终点站航班号飞机号飞行周日余票量\n");
for(;p;p=p->next)
{
PR("%-20s%10s%10s%8d%8d\n",p->end_addr,p->line_num,p->
plant_num,p->day,p->left);
}
PR("按1进入订票系统,按0返回主菜单\n");
SC("%d",&flag);
if(flag)
book();
else guide();
}
void main() //主函数
{
int flag=1;
more();
guide();
InitLine();
do
{
switch(getchar())
{
case '1':printline();break;
case '2':search();break;
case '3':book();break;
case '4':refund();break;
case '5':admin();break;
case '6':more();break;
case '9':system("cls");guide();break;
case '0':flag=0;break;
}
}while(flag);
}。