航空系统.docx
《航空系统.docx》由会员分享,可在线阅读,更多相关《航空系统.docx(43页珍藏版)》请在冰豆网上搜索。
航空系统
1需求分析
此次课程设计的题目是航空售票处服务系统。
此次课程设计的任务如下:
(1)录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
(2)查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
(3)可以输入起飞抵达城市,查询飞机航班情况;
(4)订票:
(订票情况可以存在一个数据文件中,结构自己设定)
可以订票,如果该航班已经无票,可以提供相关可选择航班;
(5)退票:
可退票,退票后修改相关数据文件;
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
(6)修改航班信息:
当航班信息改变可以修改航班数据文件。
此课程设计的思想是利用链表和队列来实现与处理票务的相关问题。
本系统的设计师在WindowsSever2008中文版操作系统环境下,使用VisualC++6.0中文版开发成功的。
本系统使用的开发环境和工具介绍如下:
1.1WindowsSever2008
WindowsServer2008是专为强化下一代网络、应用程序和Web服务的功能而设计,是有史以来最先进的WindowsServer操作系统。
拥有WindowsServer2008,您即可在企业中开发、提供和管理丰富的用户体验及应用程序,提供高度安全的网络基础架构,提高和增加技术效率与价值。
WindowsServer2008虽是建立在WindowsServer先前版本的成功与优势上,不过,WindowsServer2008已针对基本操作系统进行改善,以提供更具价值的新功能及更进一步的改进。
新的Web工具、虚拟化技术、安全性的强化以及管理公用程序,不仅可帮助您节省时间、降低成本,并可为IT基础架构提供稳固的基础。
1.1.1稳定性
更坚实、更可靠的机器
根基更稳固!
您的服务器从此勇往直前。
WindowsServer2008服务器
突破性创新功能,令它拥有坚实的双腿,即使承担海量任务,一样
轻松自如。
拥有一台运转更快、安全性更高、宕机时间更短的服务器,它不仅能改变
您和您的部门,还有整个公司。
只需您一声令下,便可顺利展开一天的
工作。
全新服务器核心安装选项:
一颗强劲的心
全新简化的服务器核心选项,能让您只安装自己需要的服务与功能。
更少的维护、更少的补丁意味着更少系统中断运行。
更少内核的攻击面,增强系统对黑客入侵、恶意攻击和宕机的防护能力。
故障转移集群:
让您的业务全天候运行
令高可用性服务器集群的配置、管理与移植变得简单,可自动转移工作
指令,协助确保程序和服务7x24小时全天候正常运转。
新型验证向导自动进行服务器集群的测试和执行。
WindowsPowerShell:
持续不断的正常运行
全新和强大的命令行Shell和脚本语言,帮助实现系统管理管理任务的
自动化。
快速进行跨多个服务器之间的执行交换,减少宕机。
全面兼容现有脚本。
1.1.2可管理性
更新、加速、改进、准备就绪
变化随时出现,您的服务器应该足够灵活和创新,以便能迅速管理
动态更新,最大限度地减少因更新、执行新程序和升级带来的系统中断。
即使这样便捷,当然您还是得自己亲自动手去取咖啡。
WindowsPowerShell:
快速的、自动化的管理
全新和强大的命令行shell和基于任务的脚本语言,帮助实现系统管理任务的自动化。
祝您在不中断系统的情况下,解决跨多个服务器的管理问题。
正常运行时间最大化。
全面兼容当前脚本。
1.1.3安全性
保护自身以及您数据的安全
在自我防护方面,WindowsServer2008接受过严格训练,全新安全特性
积极保护您的数据,帮助您公司的业务与名誉免遭侵害。
此刻您会忍不住
同情那些企图攻击IT24-7并因此困在其中的攻击者。
网络访问保护(NAP):
网络安全保护神
在变化随时出现的世界里,网络访问保护(NAP)“先发制人”的保护
手段将那些不符合您安全策略的电脑拒之门外。
只读域控制器(RODC):
分支机构安全守卫者
专为分支机构和边缘站点设计的全新域控制器。
提供快速单向认证,只接受本地用户认证,保护服务器内关键信息免遭黑客侵害。
服务器核心安装选项:
更少漏洞,更少宕机
最小化内核攻击面,增强核心安全性,免受攻击困扰。
1.1.4webIIS7.0
更令人兴奋的、更高安全性和高可靠性的网络体验:
正在载入
以网站为动力的企业最怕发生宕机。
因为客户都是来感受其高速、安全和
有价值的网上体验。
WindowsServer2008的创新技术将帮助您传递出具有
风格、智能和自动的高效性。
InternetInformationServices(IIS)7.0:
专门为您的业务环境打造的
网络服务器
自动隔离区域、应用程序和基础架构,防止系统崩溃和宕机的发生。
只安装您所需要的组件,最小化网络受击面,降低系统中断的风险。
迅速发现问题,改善管理特性,在其成为问题之前轻松全面了解、诊断并
解决所有出现症结。
1.2VisualC++
VisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
VisualC++它大概可以分成三个主要的部分:
1.DeveloperStudio,这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“MicrosoftVisualC++”,所以很多人理所当然的认为,那就是VisualC++了。
其实不然,虽然DeveloperStudio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。
我们也知道,DeveloperStudio并不是专门用于VC的,它也同样用于VB,VJ,VID等VisualStudio家族的其他同胞兄弟。
所以不要把DeveloperStudio当成VisualC++,它充其量只是VisualC++的一个壳子而已。
这一点请切记!
2.MFC。
从理论上来讲,MFC也不是专用于VisualC++,BorlandC++,C++Builder和SymantecC++同样可以处理MFC。
同时,用VisualC++编写代码也并不意味着一定要用MFC,只要愿意,用VisualC++来编写SDK程序,或者使用STL,ATL,一样没有限制。
不过,VisualC++本来就是为MFC打造的,VisualC++中的许多特征和语言扩展也是为MFC而设计的,所以用VisualC++而不用MFC就等于抛弃了VisualC++中很大的一部分功能。
但是,VisualC++也不等于MFC。
3.PlatformSDK。
这才是VisualC++和整个VisualStudio的精华和灵魂,虽然我们很少能直接接触到它。
大致说来,PlatformSDK是以MicrosoftC/C++编译器为核心(不是VisualC++,看清楚了),配合MASM,辅以其他一些工具和文档资料。
上面说到DeveloperStudio没有编译程序的功能,那么这项工作是由谁来完成的呢?
是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成VisualStudio的基石。
2概要设计
2.1总体功能结构设计
1.航空售票处服务系统业务活动包括:
添加航班信息,查询航班信息,修改航班信息,删除航班信息,订票业务,退票业务,保存,退出等,以上述业务可以借助计算机来完成。
2.每条航线所涉及的信息有:
航班号,航班起点站,航班终点站,航班起飞时间日期,航班飞行时间,航班票数,航班剩余票数。
3.作为示意系统,全部数据可以只放在内存中,但保存数据使用文件存储。
4.系统能实现的操作和功能如下:
1询航线:
根据旅客提出的终点站名输出下列信息:
航班号、起飞起点和重点,航班,订票数,等待订票客户和剩余票额。
2航线信息的处理:
包括添加,查询,修改,删除航线信息。
3承办订票业务:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续。
若已满员或余票额少于订票额,则需重新询问客户要求。
若需要,可登记排队候补;
4承办退票业务:
根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所剩票额能满足他的要求.则为他办理订票手续,否则依次询问其它排队候补的客户。
5.两个客户名单可分别由线性表和队列实现。
为查找方便.已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。
由于预约人数无法预计,队列也应以链表作存储结构。
整个系统需汇总各条航线约情况登录在一张线性表上,由于航线基本不变采用顺序存储结构,并按航班有序或按终点站名有序。
6.保存当前操作:
将所有数据写入文件中。
使下次登录时候可以使用此次操作的信息。
为以后接入数据库留接口。
7.密码验证部分:
为以后接入数据库使用密码验证留接口。
图2.1系统功能结构图
2.2主要实现的方法和原理。
此课程设计主要使用的是链表的相关操作,如创建,插入,删除等。
在设计订票等待相关函数的时候用了队列的先进先出的思想来设计等待函数。
先申请等待的客户在有余票的时候优先得到订票权。
3详细设计和实现
3.1添加航班信息模块
图3.1添加航班信息功能模块图
此模块通过链表的创建和插入的原理,把输入的相关数据储存在链表中。
函数如下:
//..................添加航班信息函数...................
voidNewAirsysinfo(vector*vec_Air)//输入新的航班信息
{
Airsysinfo*pA;
charyes='n';
cout<<"您确定要录入新的航班信息吗?
(y/n):
";
cin>>yes;
if(yes=='n'||yes=='N')return;
cout<stringnum,start,end,time,flytime;
intcount;
/****************开始录入航班信息*****************/
cout<<"请输入新航班的编号:
";
cin>>num;
cout<cout<<"请输入新航班的的起点站:
";
cin>>start;
cout<cout<<"请输入新航班的的终点站:
";
cin>>end;
cout<<"请输入新航班的的起飞时间:
";
cin>>time;
cout<cout<<"请输入新航班的的总飞行时间:
";
cin>>flytime;
cout<<"请输入新航班的的总票数:
";
cin>>count;
cout<//申请新航班内存空间
pA=newAirsysinfo();
pA->SetNum(num);//新航班编号
pA->SetStart(start);//新航班起点站
pA->SetEnd(end);//新航班终点站
pA->SetTime(time);//新航班起飞日期
pA->SetFlyTime(flytime);//新航班总飞行时间(小时)
pA->SetCount(count);//新航班总票数
pA->SetLeftCount(count);//新航班剩余票数
vec_Air->push_back(pA);
cout<cout<<"\t录入新航班信息成功,请查看!
"<cout<<"\t按任意键返回主界面!
";
cin.get();
cin.get();
/****************结束录入航班信息*****************/
}
3.2查询航班信息模块
图3.2查询航班信息功能模块图
通过链表的顺序遍历来查找相关节点
函数如下:
//................................查询航班信息函数.....................................
voidFindAirsysinfo(vectorvec_Air)//查询航班信息
{
system("cls");
cout<charchoice='p';
while(choice!
='y')
{
system("cls");
cout<cout<<"\t\t1按航班编号查询"<<"\t\t2.按起点站查询"<cout<<"\t\t3.按终点站查询"<<"\t\t4.按起飞时间(日期)"<cout<<"\t\t5.按飞行总时间查询"<<"\t0.返回主界面"<cout<<"\t\t请选择(0-5):
";
cin>>choice;
switch(choice)
{
case'1':
//按航班编号查询
{
stringnum;
cout<<"\t请输入要查询的航班编号:
";
cin>>num;
for(inti=0;i{
if(vec_Air[i]->GetNum()==num)//是否有相应的航班编号
{
vec_Air[i]->PrintInfo();//打印输出相应航班的所有信息
break;
}
}
if(i==vec_Air.size())
{//如果找到所有记录最后还没有找到要找的航班编号,则表示没有此航班
cout<<"\t对不起,没有找到该编号的航班信息!
";
}
cin.get();
cin.get();
break;
}
case'2':
//按起点站查询
{
intflag=0;
stringstart;
cout<<"\t请输入要查询起点站:
";
cin>>start;
for(inti=0;i{
if(vec_Air[i]->GetStart()==start)
{
vec_Air[i]->PrintInfo();
flag=1;//说明起码找到一条相应的记录
}
}
if(flag==0)//没有此航班记录
{
cout<<"\t对不起,没有找到该起飞站航班信息!
";
}
cin.get();
cin.get();
break;
}
case'3':
//按终点站查询
{
intflag=0;
stringend;
cout<<"\t请输入要查询航班终点站:
";
cin>>end;
for(inti=0;i{
if(vec_Air[i]->GetEnd()==end)
{
vec_Air[i]->PrintInfo();//打印输出航班信息
flag=1;//说明起码找到一条相应的记录
}
}
if(flag==0)
{
cout<<"\t对不起,没有找到该终点站航班信息!
";
}
cin.get();
cin.get();
break;
}
case'4':
//按起飞时间(日期)
{
intflag=0;
stringtime;
cout<<"\t请输入要查询航班起飞日期:
";
cin>>time;
for(inti=0;i{
if(vec_Air[i]->GetTime()==time)
{
vec_Air[i]->PrintInfo();
flag=1;
}
}
if(flag==0)
{
cout<<"\t对不起,没有找到该起飞日期的航班信息!
";
cin.get();
cin.get();
break;
}
cin.get();
cin.get();
break;
}
case'5':
//按飞行总时间查询
{
intflag=0;
stringflytime;
cout<<"\t请输入要查询航班的飞行总时间:
";
cin>>flytime;
for(inti=0;i{
if(vec_Air[i]->GetFlyTime()==flytime)
{
vec_Air[i]->PrintInfo();
flag=1;
}
}
if(flag==0)
{
cout<<"\t对不起,没有找到该终点站航班信息!
";
}
cin.get();
cin.get();
break;
}
case'0':
//返回
{
cout<cout<<"\t确定要返回主界面吗?
(y/n):
";
cin>>choice;
break;
}
}
}
}
3.3订票函数模块
图3.3订票功能模块图
输入节点相关数据,如航班数等,首先查找是否已经余票为零。
若为零,则询问时候进入等候队列。
若不为零则继续添加订票信息,进入订票队列。
函数部分如下:
//..........................订票函数部分........................................
voidBookAirsysinfo(vector*vec_Air)//订票
{
vector:
:
iteratorv_Iter;//当作指针用
system("cls");//清屏
cout<stringnum;//航班号
cout<<"\t请输入要订票的航班号:
";
cin>>num;
for(v_Iter=vec_Air->begin();v_Iter!
=vec_Air->end();v_Iter++)
{
if((*v_Iter)->GetNum()==num)//找到相应的航班号
{
(*v_Iter)->PrintInfo();//输出航班信息
break;
}
}
if(v_Iter==vec_Air->end())//如果找到记录最后还没有找到此航班的记录
{
cout<<"\t对不起,暂时没有此航班号!
";
cin.get();
cin.get();
return;
}
if((*v_Iter)->m_wPerson.size()!
=0)//是否有客户在等候订票
{
for(inti=0;i<(*v_Iter)->m_wPerson.size();i++)
{
//如果第一个客户所订票数小于此航班所剩余的票数,则询问此客户是否要订票
if((*v_Iter)->m_wPerson[0].m_nWant<(*v_Iter)->GetLeftCount())
{
cout<<"\t请先核对并满足排队等候本航班的客户!
"<//计算剩余票数
intleft=(*v_Iter)->GetLeftCount()-(*v_Iter)->m_wPerson[0].m_nWant;
charmeet;//满足要求
cout<<"\t可以满足等候本航班的客户的订票数,是否要订票?
(y/n):
";
cin>>meet;
if(meet=='y')//满足此客户的订票需求
{
vector:
:
iteratorIter_person;//声明一个客户类型的指针
Iter_person=(*v_Iter)->m_wPerson.begin();//指向等候队列首地址
(*v_Iter)->SetLeftCount(left);
cout<<"\t已经为等候本航班的客户订票!
请通知该客户!
"<BuyerPerson;
Person.m_strID=(*v_Iter)->m_wPerson[0].m_strID;
Person.m_strName=(*v_Iter)->m_wPerson[0].m_strName;
Person.m_nWant=(*v_Iter)->m_wPerson[0].m_nWant;
//把已满足的客户放入已订得票的客户记录
(*v_Iter)->m_haveBook.push_back(Person);
//删除第一个已经满足订票的客户
(*v_Iter)->m_wPer