课程名称数据结构课程设计Word文件下载.docx

上传人:b****6 文档编号:18996092 上传时间:2023-01-02 格式:DOCX 页数:24 大小:806.94KB
下载 相关 举报
课程名称数据结构课程设计Word文件下载.docx_第1页
第1页 / 共24页
课程名称数据结构课程设计Word文件下载.docx_第2页
第2页 / 共24页
课程名称数据结构课程设计Word文件下载.docx_第3页
第3页 / 共24页
课程名称数据结构课程设计Word文件下载.docx_第4页
第4页 / 共24页
课程名称数据结构课程设计Word文件下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

课程名称数据结构课程设计Word文件下载.docx

《课程名称数据结构课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《课程名称数据结构课程设计Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。

课程名称数据结构课程设计Word文件下载.docx

3按终点站查询;

4按日期查询;

每种查询方式中,查询后输出如下信息:

航班号,航班机型,起飞机场,降落机场,日期(星期几),起飞时间,降落时间,飞行时长,价格,余票量。

(3)承办订票业务:

根据客户提出的要求(航班号,订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;

若已满员或余票少于订票额,则需重新询问客户要求。

若需要,可登记排队候补。

(4)承办退票业务:

根据客户提出的情况(日期,航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。

2.设计

2.1设计思想

(1)数据结构设计。

存储结构设计:

由题目所给定要求,该题需要用到链式存储结构来完成飞机信息的存取,而其后的waitingclient中需要的是按序访问,所以最好是以队列存储等候者信息完成先入先出比较。

存储结构如下:

classflight

{

private:

flightNode*head;

stringkey;

};

classflightNode

friendclassflight;

public:

flightNode();

stringflightnum;

//航班号

stringflightmodel;

//机型

stringstart;

//起点

stringend;

//终点

stringdate;

//日期

intprice[3];

//价格

intmaxnum[3];

//三种等级舱座位数

intremaining[3];

//余留的各等级舱座位数

intfirstclass[MAXFIRSTCLASS];

intbussinessclass[MAXBUSSINESSCLASS];

inteconomy[MAXECONOMY];

intdeparture[2];

intarrival[2];

voidprintout();

voidprintspace();

voidtimecheck();

//飞行时长函数。

intflighttime[2];

//飞行时长

flightNode*next;

orderclient*head1;

waitingclient*front;

waitingclient*rear;

classorderclient

stringname;

intlevel;

intseat;

orderclient*next;

friendclassflightNode;

classwaitingclient

waitingclient*next;

逻辑结构设计:

该题所要求的是通过链式存储结构而存储的,所以该题的逻辑结构应是线性结构。

(2)算法设计。

算法思想:

该题是航空订票系统,有航班信息,有航班中乘客的信息,其中的存入,删除都可以通过链表中的指针从头结点开始移动来遍历,所以定义了三组结构体,第一组的flight可视为整个航空系统,其中有flightNode的指针,第二组的flightNode是航班信息,其中有orderclient和waitingclient指针,第三组的waitingclient、orderclient分别代表等候列表与乘客列表。

在该系统中,可分为存入航班信息、订票与退票三个模块,之间由于是对内存的改变所以所以没有接口,存入即访问flight遍历flightNode结点,在最后插入新的结点,并将航班内容存入,删除时即删除该结点,在航班信息输入时,还调用了一个timecheck函数,用来计算飞行时长。

订票时,先通过访问flightNode中的flightnum来确定所选航班,再通过访问flightNode中对应等级舱的余票,若大于零则进行插入操作,将内容存orderclient中,若等于零则存入链式队列waitingclient中进行排队操作,退票时,当该flightNode结点存有同name的人,将其orderclient中的信息删除,并访问waitingclient查找最先相同等级要求的顾客并插入到该orderclient中。

主函数流程图如下:

2.2设计表示

函数的调用关系图如下:

(3)详细设计

//航班信息的录入函数。

(备注:

管理员密码为123456,仅可在构造函数中更改。

voidflight:

:

record()

{

flightNode*t,*h;

t=newflightNode;

cout<

<

"

录入航班信息:

(航班号航班机型起点终点飞行日期起飞时间降落时间座位及价格)"

endl;

cin>

>

t->

flightnum;

flightmodel;

start;

end;

date;

departure[0];

departure[1];

arrival[0];

arrival[1];

maxnum[0]>

price[0]>

maxnum[1]>

price[1]>

maxnum[2]>

price[2];

t->

remaining[0]=t->

maxnum[0];

remaining[1]=t->

maxnum[1];

remaining[2]=t->

maxnum[2];

for(inti=0;

i<

i++)t->

firstclass[i]=0;

for(i=0;

bussinessclass[i]=0;

economy[i]=0;

timecheck();

h=head;

while(h->

next)

h=h->

next;

next=h->

h->

next=t;

信息录入成功。

endl<

exit;

}

//飞行时长计算函数。

voidflightNode:

timecheck()

if((arrival[1]-departure[1])>

=0)

{

flighttime[1]=(arrival[1]-departure[1]);

flighttime[0]=(arrival[0]-departure[0]);

else

{

flighttime[1]=(arrival[1]-departure[1])+60;

flighttime[0]=(arrival[0]-departure[0])-1;

if(flighttime[0]<

0)

flighttime[0]=flighttime[0]+24;

}

//航班订票函数。

reserve()

stringa;

请输入航班号"

a;

flightNode*curr;

curr=head->

while(航班结点不为空)

if(找到该航班)

{inti;

cout<

请输入要选舱位等级(头等舱请输入1,公务舱请输入2,

经济舱请输入3."

loop:

i;

if(i>

3||i<

1)

{

cout<

无该等级舱位,请重新输入:

;

gotoloop;

}

orderclient*t;

t=neworderclient;

请输入姓名:

cin>

name;

if(该等级舱余票不为0)

t->

level=i;

购票成功。

航班号"

curr->

flightnum<

姓名:

座位号为"

switch(t->

level)//找到空位,并标志为有人,输出座位号。

{

case1:

cout<

头等舱"

for(头等舱找到空座);

座位号存入。

该座位号标记为1

该等级余票量减1.

break;

case2:

公务舱"

for(商务舱找到空座));

case3:

经济舱"

for(经济找到空座));

}

orderclient*a;

a=curr->

head1;

while(找到已订票者链尾);

a->

t->

next=NULL;

seat<

号"

curr->

printspace();

//航班输出界面。

printout();

//航班信息输出。

return;

else

该舱位已满,是否进入候补(Y/N)?

charq;

q;

if(q=='

Y'

||q=='

y'

waitingclient*p;

p=newwaitingclient;

p->

name=t->

if(等候队列为空)

{

插入队列第一个。

队头队尾皆指向该等候者。

}

else

找到队尾,并该等候者信息。

waitingclient*u;

//判断等候列表中同等级舱位的等候者。

u=curr->

front;

intm=0;

while(u)

{

if(u->

level==i)m++;

u=u->

cout<

您前面等候者有"

m-1<

人"

return;

elsereturn;

else

飞机结点指针后移。

if(飞机结点为空)

抱歉!

没有对应的航班!

航空订票信息流程图如下:

//航空退票系统。

refund()

while(curr)

if(找到航班)

{

stringb;

cin>

b;

orderclient*s;

s=curr->

while(等候者存在)

if(找到名字)

cout<

确认退订?

(Y/N)"

charq;

cin>

if(q=='

{

cout<

退票成功。

orderclient*p;

p=s->

waitingclient*m,*n;

m=curr->

//从等候队列中选顾客。

if(队列非空)

n=curr->

front->

if(curr->

level==p->

level)

//队列第一个

人就满足购票条件。

{

cout<

等候者"

name<

票成功。

信息输入。

输出更改后航班信息。

return;

}

else

while(n&

&

n!

=curr->

rear)//访问waitingclient

可购票人。

{

if(n->

//队列末尾排除。

{

cout<

n->

信息输入。

return;

}

else

指针后移。

}

}

level)//队列末尾判断。

cout<

rear->

购票成功。

return;

}

switch(p->

level)//如果等待中无满足要求者,将

座位腾出。

case1:

头等舱该座位号标记为0,头等舱余票量

加1.

break;

case2:

商务舱该座位号标记为0,商务余票量

case3:

经济舱该座位号标记为0,经济舱余票量

s->

next=p->

free(p);

}

else等候者指针后移。

if(s->

next==NULL)

查无此人"

else飞机结点指针后移。

if(curr==NULL)

查无此航班"

 

航空退票信息流程图如下:

主要问题:

该程序设计之中,第一个问题就是代码太长,编写量大,第二个就是指针的关系,有时由于代码太长判断条件太多而遗漏指针的后移或初始化等。

解决方法:

首先,对这个系统先进行框架分析,留下大概的设计步骤,再在头文件中首先声明函数体,再一步步定义,而指针问题,则根据循环中的{}来判断指针循环的范围并小心检查,多调试,而由于编程中复合语句会有后移的区分,所以检查时在两等行的大括号下分析处理。

设计编码回顾分析:

这题是一次不小的考验,由于使用C++的数据结构,起初在定义各个类的指针交互上有些模糊,不过现在已经学习到了很多,受益匪浅。

在编码过程中,我深刻的体会到一个程序的编写需要一个清晰的思路,否则就是在原地打转,此次在订票和退票操作上耗时较大,需要判断的条件较多,很容易出现指针未后移的问题,不过,在花费了许多时间之后得到的产物还是比较满意的,有不小的成就感,并且巩固了一些相关的专业知识。

算法的时间、空间复杂度分析:

在该系统中,一共存在着4种函数类型,第一个是添加飞机信息,由于其中包含的第一个是查询位子是否为空,和define的座位最大数有关,为常数,其次是飞机结点指针的后移,所以时间复杂度是O(n),空间复杂度因仅与飞机结点大小有关所以是O

(1),第二个是查询,时间复杂仅与飞机结点数有关,所以为O

(1),无空间利用,所以空间复杂度为O

(1),第三个是订票,主要时间耗在找飞机结点上与其中的订单者指针的后移,所以时间复杂度为O(n*m),空间复杂度为O(m).第四个是退票,时间复杂度在飞机结点后移与订单者后移,所以为O(n*m),空间复杂度为O

(1)。

4.用户手册

备注:

(航空订票.cpp,flightdetail.cpp,flightdetail.h三个文件应放在一起,特别是头文件flightdetail.h不能丢,在VC上运行时应先打开主函数文件航空订票.cpp,然后再打开flightdetail.cpp文件方能正确运行,然后进入系统进行功能测试及错误检测)

进入该飞机订票系统后,主菜单上会出现两种身份的选择,键盘输入1是以管理员身份进入,进入前需要拥有管理员密码,输入错误则返回主菜单,进入后,可以键入1来添加航班信息,输入2来删除航班信息,输入3来查看现有航班信息,输入4返回主菜单,输入5则退出该系统,而在主菜单中输入2则是以顾客身份登录系统,拥有的主要功能有,输入1返回上级主菜单,输入2是按航班号查询,输入3是按航线起点查询,输入4是按航线终点查询,输入5是按照航线日期查询,输入6是订票,7是退票,而8则是所有航班的信息显示,9则是退出该航空订票系统。

在整个系统中,如果输入的功能选项不存在,都会返回该层界面进行重新输入。

5.测试数据及测试结果

5.1测试数据

航班号航班机型起点终点日期起飞时间降落时间等级座位及价格

GT3724321北京昆明2012.12.2515301850145678

KB1234123重庆武汉2012.12.2614351920123456

ZA64345533上海天津2012.12.2812351650974466

Checkin

GT3724YLQ1(头等舱)

GT3724qwe1(头等舱)

Checkout

GT3724YLQ

GT3724asd(错误信息)

5.2测试结果

1.以管理员身份登陆的功能测试

(1)主菜单

(2)管理员选项界面

(3)录入信息界面

(4)信息录入完毕后显示

(5)删除其中某航班后信息显示

(6)返回主菜单

2.以顾客身份登陆的功能测试

(1)顾客选项界面

(2)按航班号查询

测试1:

错误的航班号查询。

(3)按航线起点查询

(4)按航线终点查询

(5)按航线日期查询

T

(6)订票并显示更改信息

(7)进入排队并显示第几顺位

(8)退订,如果有等候者则让其购票

测试2:

错误的退票名字。

顾客asd不存在。

(9)退订,无该顾客

(10)所有航班显示

(11)退出系统

6.参考文献

1.严蔚敏《数据结构》(C语言版)清华大学出版社出版日期:

199704月

页数:

334

2.BruceEckel《C++编程思想》北京机械工业出版社出版日期:

2002.9月

3.任文,孔庆彦《c语言课程设计》机械工业出版社出版日期:

2009.7月

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1