相信很多粉丝看过看过我的主页,有一个航空订票系统:
数据结构航空订票系统(附源码)
但是最近后台收到很多粉丝的要求,在上一个航空订票系统中要加上管理员的功能块,于是对上面那个课设进行了改进,新的功能流程如下:(航班信息由管理员添加和删除、顾客可以实现购票与退票,订票分为经济舱和商务舱)
新增管理员模块的功能如下,采用单链表、队列实现(航班信息改为由管理员添加):
管理员模块的功能:
A:管理员密码验证
B:查询所有航班信息
C:根据航班ID查询客户信息(包括身份证号码)
D:增加航班(航班的各个信息输入要合法,不合法的重新输入)
E:删除航班,根据ID进行删除,ID不存在则删除失败。
F:返回上一级菜单
//管理员的操作,包括管理员的验证,包括查看航班、增加航班、删除航班和查看订票的客户信息,能查到身份证号码。
航空订票系统V2.0的功能需求如下:
【基本需求】
(1)每条航线所设计的信息有:航班ID、起点站名、终点站名、飞机号、飞行周日(星期几)、成员定额、总余票量、经济仓余票量、商务舱余票量、已订票的客户名单、经济舱候补客户名单、商务舱候补客户名单。其中,经济舱候补客户名单和商务舱候补客户名单中的包括以下几个域:姓名、身份证、所需票量、预定票的等级;
(2)作为示意系统,数据放在内存中;
(3)系统能实现的操作和功能如下:
查看所有航班信息:
查询模块:输入起点站和终点站进行搜索
订票模块的功能:
A:输入航班ID进行订票,当航班ID不存在或者不合法时要求重新输入航班ID,然后输入订票数量和等级,数量和等级要合法,订票数目要大于0,等级输入1代表经济舱,输入其他数据商务舱。不合法则重新输入,再判断对应等级的票是否足够 ,足够则继续输入客户信息(姓名和身份证),然后订票成功。当对应等级的票数不足时,询问是否改变订票计划,同意改变计划则重新输入航班ID进行相应的订票操作。不同意改变计划则继续询问是否排队等候,不同意排队等候则询问是否需要推荐相同航线的其他航班,询问操作时,输入Y或者y表示同意,输入N,n或者其它数据表示不同意。
B:根据起点和终点查询航班
C:查询所有航班的相关信息
D::查询航班的订票情况,输入航班ID,当航班ID不存在或者不合法时要求重新输入航班ID,根据ID查询航班,显示出已订票的客户的姓名、订票数目和仓位等级,为了保密,不能显示客户的身份证。
E:返回上一级菜单
退票模块的功能:
A:先输入航班ID,然后输入姓名和身份证号码进行验证,验证成功则办理退票手续。然后查询该航班是否有人排队候补,如果有,而且票数够了,则首先询问排在第一的客户,是否需要订票,是则为他办理订票手续,否则出队,依次询问其他排队候补的客户。若刚刚退票的是经济舱,则询问经济舱排队的客户;若是商务舱,则询问商务舱排队的客户。
B:返回上一级菜单
C:退出系统
管理员模块的功能:
A:管理员密码验证
B:查询所有航班信息
C:根据航班ID查询客户信息(包括身份证号码)
D:增加航班(航班的各个信息输入要合法,不合法的重新输入)
E:删除航班,根据ID进行删除,ID不存在则删除失败。
F:返回上一级菜单
运行效果主页面截图:
运行环境(Dev C++ 或者 code blocks),测试数据如下:
运行后,首先需要管理员登录,来添加航班信息:
然后管理员添加航班:
管理员查看航班信息:
普通用户输入起点站 和终点站 名称,查询 航班信息:
普通客户科根据 经济舱 和 商务舱 两种情况订票:
查询订票模块:根据航班ID查询谁订票和订了几张票还有舱位等级:
退票操作:
管理员删除航班信息:
退出系统:
所用类型定义:
完整代码请访问:
腾讯文档腾讯文档-在线文档https://docs.qq.com/doc/p/71239d69a76f56cf1521717ae6b22c27cf876f10
typedef int Status;
//航班日期枚举类,星期一到星期天
enum Week {
Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7
};
//乘客节点
typedef struct CustomerNode {
char name[10];//客户姓名
int clientTickets;//客户订票量
char identification[20];//客户身份证号码
int rank;//舱位等级
CustomerNode *next;
} CustomerNode, *CusLinkList;
//候补队列中的节点
typedef struct WaitPassenger {
char name[10];//姓名
char identification[20]; //身份证
int preTickets;//预定的票量
struct WaitPassenger *next;
} WaitQNode, *PWait;
//候补队列
typedef struct Queue {
PWait front;//等候替补客户名单域的头指针
PWait rear;//等候替补客户名单域的尾指针
} LinkQueue;
//封装乘客的姓名和订票量和身份证
//用于候补客户出队时把关键字返回
typedef struct NameAndNumAndID {
char name[10];//姓名
char identification[20]; //身份证号码
int num;//订票量
} NameAndNumAndID;
//航班节点
typedef struct Flight {
char startPoint[20];//起点站名
char destination[20];//终点站名
char flightCodeID[20];//航班ID(相当于主键)
char planeNum[20];//飞机号
char day[20];//飞行日期(星期几)
int totalTickets;//乘员定额(总票数)
int left;//总余票量
int leftEconomicTicket; //经济票剩余量
int leftBusinessTicket; //商务票剩余量
Flight *next;
CusLinkList cusLinkList;//乘员名单域,指向乘员名单链表的头指针
LinkQueue waitQueue1;//经济舱候补,等候替补的客户名单域,指向一个队列
LinkQueue waitQueue2;//商务舱候补,等候替补的客户名单域,指向一个队列
} Flight, FlightNode, *PFlight;
航班链表采用全局变量:pFlight,指向航班链表的头指针文章来源:https://www.toymoban.com/news/detail-775763.html
pflight1,一个数组,存有留个基本航班,一个个入pFlight 航班链表中。文章来源地址https://www.toymoban.com/news/detail-775763.html
/
*入队,增加排队等候的客户名单域
*@paramq带头结点的链队列
*@paramname
*@paramamount
*@return
*/
LinkQueueAppendqueue(LinkQueue&q,charname[],intamount,charidentification[]){
PWaitnew1;
new1=(PWait)malloc(sizeof(WaitQNode));
strcpy(new1->name,name);
strcpy(new1->identification,identification);
new1->preTickets=amount;
new1->next=NULL;
q.rear->next=new1;
q.rear=new1;
returnq;
}
/
*退票功能模块
*/
voidReturnTicket(){
structFlight*info;
intrank;
//p1为遍历指针,p2为辅助指针,指向p1的前驱
CustomerNode*p1,*p2,*head;
//客户姓名
charcusname[10];
//客户身份证
charidentification[20];
system("cls");
//info指针,find函数根据航班ID返回该航班节点的指针
intloop;
loop:
{
info=find();
};
if(info==NULL){
printf("没有这个航班,请重新输入\n");
gotoloop;
}
//head为该航班的的乘员名单域的头指针
head=info->cusLinkList;
//带头结点的指针,head->next开始遍历
p1=head->next;
printf("请输入你的姓名:");
scanf("%s",cusname);
printf("请输入你的身份证号码:");
scanf("%s",identification);
//根据客户姓名搜索客户是否订票
p2=head;
while(p1!=NULL){
if((strcmp(cusname,p1->name)==0)&&(strcmp(identification,p1->identification)==0))break;
p2=p1;
p1=p1->next;
}
if(p1==NULL){
printf("对不起,你没有订过票或姓名和身份证不对应\n");
return;
}else{//退票成功
//从乘客名单域中移除该节点
rank=p1->rank;
p2->next=p1->next;
//加回该航班的剩余票
info->left+=p1->clientTickets;
if(rank==1){
info->leftEconomicTicket+=p1->clientTickets;
}else{
info->leftBusinessTicket+=p1->clientTickets;
}
printf("%s成功退票!\n",p1->name);
free(p1);
}
LinkQueuequeue1=info->waitQueue1;
LinkQueuequeue2=info->waitQueue2;
NameAndNumAndIDnameAndNumAndID={0,0};
if(rank==1){//有经济舱退票,询问经济舱排队的客户
for(;queue1.front->next!=NULL&&queue1.front->next->preTickets<=info->leftEconomicTicket;){
//从候补客户队列中,出队客户的姓名和订票量用NameAndNumAndID返回
QueueDelete(info->waitQueue1,nameAndNumAndID);
inty;
printf("有经济舱票剩余,尊敬的%s:\n",nameAndNumAndID.name);
printf("是否确认订票(1确认订票,其他数字拒绝订票\n");
scanf("%d",&y);
/
*订票界面
*属于订票模块
*/
voidBookticketFace(){
inta3;
intloop3;
loop3:
{
system("cls");
printf("\n");
printf("\n");
printf("WelcomeTo订票模块\n");
printf("-----------------------------------------------\n");
printf("|1.客户订票|\n");
printf("|2.根据起点和终点搜索航班|\n");
printf("|3.查询所有航班|\n");
printf("|4.通过航班ID查询订票客户名单|\n");
printf("|5.返回上一级菜单|\n");
printf("------------------------------------------------\n");
printf("请输入您的选择:");
scanf("%d",&a3);
}
switch(a3){
case1:
//订票
BookTickets();
system("PAUSE");
BookticketFace();
break;
case2:
//输入起点和终点查询
SearchFlight();
system("PAUSE");
BookticketFace();
break;
case3:
PrintFilghtlist(pFlight);
BookticketFace();
break;
case4:
//为了保密,只能查到客户的姓名和订票量,查不到身份证
PriCusInfo();
system("PAUSE");
BookticketFace();
break;
case5:
MenuSelect();
break;
default:
gotoloop3;
}
}
到了这里,关于C语言版数据结构-课程设计-航空客运订票系统 V2.0 附源码(增加管理员功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!