课程名称数据结构课程设计.docx
《课程名称数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《课程名称数据结构课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
![课程名称数据结构课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/2/e0dbc3c0-0555-4159-b63f-e8b3e4af4183/e0dbc3c0-0555-4159-b63f-e8b3e4af41831.gif)
课程名称数据结构课程设计
课程名称数据结构课程设计
教师姓名李桂玲
本科生姓名张玉彬
本科生学号20111004302
本科生专业网络工程二班
所在院系计算机学院
类别:
本科生论文
日期:
2012年12月28日
独立工作成果声明
本人声明所呈交的《数据结构课程设计》报告,是我个人在导师指导下进行的程序编制工作及取得的成果。
尽我所知,除文中已经标明的引用内容,和已经标明的他人工作外,本报告未包含任何抄袭自他人的工作成果。
对本报告的工作做出贡献的个人,均已在文中以明确方式标明。
本人完全意识到本声明的法律结果由本人承担。
报告作者签名:
日期:
年月日
航空管理系统
1.需求分析:
1
2.设计2
2.1设计思想2
2.2设计表示5
3.调试分析:
16
4.用户手册17
5.测试数据及测试结果18
5.1测试数据18
5.2测试结果18
6.参考文献26
航空订票系统
1.需求分析:
试设计一个航空订票系统,基本要求如下:
每条航班所涉及的信息有:
航班号,航班机型,起飞机场,降落机场,日期(星期几),起飞时间,降落时间,飞行时长,价格,乘员定额,余票量,订定票的客户名单(包括姓名,订票量,舱位等级(头等舱、公务舱、经济仓)以及等候替补的客户名单(包括姓名、所需数量)。
采用链式存储结构。
系统能实现的操作和功能如下:
(1)航班信息管理。
1 航空信息录入;
2 航班信息删除;
3 航班信息显示;
(2)查询航线,按以下几种方式查询:
1按航班号查询;
2按起点站查询;
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();//飞行时长函数。
private:
intflighttime[2];//飞行时长
flightNode*next;
orderclient*head1;
waitingclient*front;
waitingclient*rear;
};
classorderclient
{
friendclassflight;
stringname;
intlevel;
intseat;
orderclient*next;
friendclassflightNode;
};
classwaitingclient
{
friendclassflight;
stringname;
intlevel;
waitingclient*next;
friendclassflightNode;
};
逻辑结构设计:
该题所要求的是通过链式存储结构而存储的,所以该题的逻辑结构应是线性结构。
(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<<"录入航班信息:
(航班号航班机型起点终点飞行日期起飞时间降落时间座位及价格)"<cin>>t->flightnum;
cin>>t->flightmodel;
cin>>t->start;
cin>>t->end;
cin>>t->date;
cin>>t->departure[0];
cin>>t->departure[1];
cin>>t->arrival[0];
cin>>t->arrival[1];
cin>>t->maxnum[0]>>t->price[0]>>t->maxnum[1]>>t->price[1]>>t->maxnum[2]>>t->price[2];
t->remaining[0]=t->maxnum[0];
t->remaining[1]=t->maxnum[1];
t->remaining[2]=t->maxnum[2];
for(inti=0;imaxnum[0];i++)t->firstclass[i]=0;
for(i=0;imaxnum[1];i++)t->bussinessclass[i]=0;
for(i=0;imaxnum[2];i++)t->economy[i]=0;
t->timecheck();
h=head;
while(h->next)
h=h->next;
t->next=h->next;
h->next=t;
cout<<"信息录入成功。
"<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;
}
//航班订票函数。
voidflight:
:
reserve()
{
stringa;
cout<<"请输入航班号"<cin>>a;
flightNode*curr;
curr=head->next;
while(航班结点不为空)
{
if(找到该航班)
{inti;
cout<<"请输入要选舱位等级(头等舱请输入1,公务舱请输入2,
经济舱请输入3."<loop:
cin>>i;
if(i>3||i<1)
{
cout<<"无该等级舱位,请重新输入:
";
gotoloop;
}
orderclient*t;
t=neworderclient;
cout<<"请输入姓名:
"<cin>>t->name;
if(该等级舱余票不为0)
{
t->level=i;
cout<<"购票成功。
"<cout<<"航班号"<flightnum<<"姓名:
"<name;
cout<<"座位号为";
switch(t->level)//找到空位,并标志为有人,输出座位号。
{
case1:
cout<<"头等舱";
for(头等舱找到空座);
座位号存入。
该座位号标记为1
该等级余票量减1.
break;
case2:
cout<<"公务舱";
for(商务舱找到空座));
座位号存入。
该座位号标记为1
该等级余票量减1.
break;
case3:
cout<<"经济舱";
for(经济找到空座));
座位号存入。
该座位号标记为1
该等级余票量减1.
break;
}
orderclient*a;
a=curr->head1;
while(找到已订票者链尾);
a->next=t;
t->next=NULL;
cout<seat<<"号"<curr->printspace();//航班输出界面。
curr->printout();//航班信息输出。
return;
}
else
{
cout<<"该舱位已满,是否进入候补(Y/N)?
"<charq;
cin>>q;
if(q=='Y'||q=='y')
{
waitingclient*p;
p=newwaitingclient;
p->name=t->name;
p->level=i;
if(等候队列为空)
{
插入队列第一个。
队头队尾皆指向该等候者。
}
else
{
找到队尾,并该等候者信息。
}
waitingclient*u;
//判断等候列表中同等级舱位的等候者。
u=curr->front;
intm=0;
while(u)
{
if(u->level==i)m++;
u=u->next;
}
cout<<"您前面等候者有"<return;
}
elsereturn;
}
}
else
{
飞机结点指针后移。
}
}
if(飞机结点为空)
cout<<"抱歉!
没有对应的航班!
"<}
航空订票信息流程图如下:
//航空退票系统。
voidflight:
:
refund()
{
cout<<"请输入航班号"<stringa;
cin>>a;
flightNode*curr;
curr=head->next;
while(curr)
{
if(找到航班)
{
cout<<"请输入姓名:
"<stringb;
cin>>b;
orderclient*s;
s=curr->head1;
while(等候者存在)
{
if(找到名字)
{
cout<<"确认退订?
(Y/N)";
charq;
cin>>q;
if(q=='Y'||q=='y')
{
cout<<"退票成功。
"<orderclient*p;
p=s->next;
waitingclient*m,*n;
m=curr->front;
//从等候队列中选顾客。
if(队列非空)
{
n=curr->front->next;
if(curr->front->level==p->level)
//队列第一个
人就满足购票条件。
{
cout<<"等候者"<front->name<<"购
票成功。
"<信息输入。
输出更改后航班信息。
return;
}
else
{
while(n&&n!
=curr->rear)//访问waitingclient
可购票人。
{
if(n->level==p->level)
//队列末尾排除。
{
cout<<"等候者"<name<<"购
票成功。
"<信息输入。
输出更改后航班信息。
return;
}
else
{
指针后移。
}
}
if(n->level==p->level)//队列末尾判断。
{
cout<<"等候者"<rear->name<<"
购票成功。
"<信息输入。
输出更改后航班信息。
return;
}
}
}
switch(p->level)//如果等待中无满足要求者,将
座位腾出。
{
case1:
头等舱该座位号标记为0,头等舱余票量
加1.
break;
case2:
商务舱该座位号标记为0,商务余票量
加1.
break;
case3:
经济舱该座位号标记为0,经济舱余票量
加1.
break;
}
s->next=p->next;
free(p);
信息输入。
输出更改后航班信息。
}
return;
}
else等候者指针后移。
}
if(s->next==NULL)
{
cout<<"查无此人"<return;
}
}
else飞机结点指针后移。
}
if(curr==NULL)
cout<<"查无此航班"<}
航空退票信息流程图如下:
3.调试分析:
主要问题:
该程序设计之中,第一个问题就是代码太长,编写量大,第二个就是指针的关系,有时由于代码太长判断条件太多而遗漏指针的后移或初始化等。
解决方法:
首先,对这个系统先进行框架分析,留下大概的设计步骤,再在头文件中首先声明函数体,再一步步定义,而指针问题,则根据循环中的{}来判断指针循环的范围并小心检查,多调试,而由于编程中复合语句会有后移的区分,所以检查时在两等行的大括号下分析处理。
设计编码回顾分析:
这题是一次不小的考验,由于使用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月