宜春学院
数学与电脑科学学院
课程设计报告书
课程名称: 数据结构 题 目: 航空客运订票系统 学生: 学 号: 专业年级: 信息与计算科学2011级 指导老师: 开题时间:2013-6-24 结束时间:2013-7-1
目录
一、设计题目 ............................. 3 二、需求分析 ............................. 3 三、概要设计 ............................. 3
1〕抽象数据类型定义描述 .............. 3 2〕 功能模块设计〔如主程序模块设计〕 . 4 3〕模块层次调用关系图 ................ 5
四、详细设计 ............................. 5 五、调试分析 ............................. 8 六 、用户使用说明及测试结果 ............. 10
1、录入航班信息〔应该是航空公司录入的〕 .................................... 10 2、实现查询功能: ................... 10 3、订票〔余票充足〕 ................. 11 4、订票〔余票不足〕 ................. 11 5、余票不足排队 ..................... 12 6、退票 ............................. 12 7、 退出系统 ........................ 13
一、设计题目
航空客运订票的业务活动包括;查询航线、客票预订和办理退票等。试设计一个航空客 运订票
系统,以使上述业务可以借助电脑来完成。 【基本要求】
〔1〕每条航线所涉及的信息有:终点站名、航班名、飞机号、飞行周日〔星期几〕、乘员 定
额、余票量、已订票的客户名单〔包括、订票量、舱位等级1,2 或3〕以及等候替补 的客户名单〔包括、所需票量〕;
〔2〕作为示意系统,全部数据可以只放在内存中; 〔3〕系统能实现的操作和功能如下:
①查询航线:根据旅客提出的终点站名输出以下信息:航班号、飞机号、星期几飞行, 最近一天航班的日期和余票额;
②承办订票业务:根据客户提出的要求〔航班号、订票数额〕查询该航班票额情况,假设 尚有余票,则为客户办理订票手续,输出座位号;假设已满员或余票额少于订票额,则 需重新询问客户要求。假设需要,可登记排队候补; ③承办退票业务:根据客户提供的情况〔日期、航班〕,为客户办理退票手续,然后查 询该航班是否有人排队候补,首先询问排在第一的客户,假设所退票额能满足客户的要 求,则为客户办理订票手续,否则依次询问其他排队候补的客户。
二、需求分析
1〕运行环境〔软、硬件环境〕 Winxp 32位 visual C++6.0 2〕输入的形式和输入值的范围
由航空公司输入航线情况并以单链表的形式存储在内存里面 3〕输出的形式描述
通过客户的输入输出相应的内容 4〕功能描述
用户通过本系统实现该航空公司的查询、订票〔包括候补〕、和退票功能 5〕测试数据 终点站 航班 飞机号 飞行日期 成员定额 余票量 zhengzhou Iphone4s 1 Sunday 3 3 beijing Nokia 2 Tuesday 2 2 tianjin ASUS 3 Friday 4 4 三、概要设计
1〕抽象数据类型定义描述
〔对各类的成员及成员函数进行抽象描述,参见书或ppt及实验〕
一条航线包括了终点站、航班名、飞机号、飞行周日、成员定额、余票量、订票人员、候
补人员等信息,我们可以将航线看成一类,定义为一个类,而订票人员通用的属性是:、订票张数和舱位等级,候补人员通用属性是和订票张数,可以将订票人员和候补人员定义为结构体,航线定义为一个类,类包括了两个结构体。具体定义如下:
class transportNode//航线类节点 { friend class transport; private: char finish[10];//目的地 char flightname[10];//航班名 int flightnum;//航班号 int day;//飞行日期 int limitednum;//乘员限额 int remainber;//余票 struct booknode { public: char name[10];//乘客 int ticketnum;//票数 int rate;//舱位等级 }b[40]; struct sparenode { public: char name[10];//乘客 int ticketnum;//票数 int m;//记录排队等候的顾客的数量 }s[40]; transportNode *next;
}
2)功能模块设计〔如主程序模块设计〕
主程序中录入航线的信息,然后进入主菜单,再实现其他的功能,类transport 中包括了除去主菜单以外的所有的功能函数
class transport {
public: transport();//无參构造函数构造头节点 void recort();//记录航班信息 void chest();//实现根据输入的目的地查询的功能 void book();//实现旅客的订票功能 void bounce();//实现退票功能 private: transportNode *head; };
int menu();//进入主菜单
3〕模块层次调用关系图 函数入口,录入航班信息 进入主菜单项选择择 1234 1 2 3 4 没有查到 退票 订票 查询 查到 输出 输出 回主菜单 回主菜单 退出
退出 四、详细设计
实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
类和它的私有成员以及成员函数
class transportNode//航线类节点 { friend class transport; private: char finish[10];//目的地 char flightname[10];//航班名 int flightnum;//航班号 int day;//飞行日期 int limitednum;//乘员限额 int remainber;//余票
};
struct booknode {
public: char name[10];//乘客 int ticketnum;//票数 int rate;//舱位等级 }b[40];
struct sparenode {
public: char name[10];//乘客 int ticketnum;//票数 int m;//记录排队等候的顾客的数量 }s[40];
transportNode *next;
举出订票的成员函数实现:
void transport::book()//订票系统 { transport y; transportNode p; static int i=0;//静态变量存储上次订票信息 static int j=0;//静态变量存储上次排队信息 static int k=1; p.s[j].m=0; int m=0;//计数器,据此判断是否有符合目的地的票 char c; transportNode *pre; pre=head->next; char f[10]; cout<<\" ********欢送进入订票系统*******\"< if (pre==NULL) { cout<<\"抱歉!没有对应的航班号o(︶︿︶)o \"; cout<<\"回主菜单请按0,按任意键退出!\"; cin>>c; if(c=='0') return; else exit(0); } } 五、调试分析 包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。 1、调试过程中出现了很多错误,刚开始的时候,我将订票人员看作一个类、将候补人员看作一个类,将航线看作一个大类。而我将两个小类放进了大类中,想让小类当作大类的成员。 class transportNode//航线类节点 这是一个类 { friend class transport; private: char finish[10];//目的地 char flightname[10];//航班名 int flightnum;//航班号 int day;//飞行日期 int limitednum;//乘员限额 int remainber;//余票 }; class booknode 这里还有一个 { public: char name[10];//乘客 int ticketnum;//票数 int rate;//舱位等级 }; class sparenode 这里也有一个 { public: char name[10];//乘客 int ticketnum;//票数 int m;//记录排队等候的顾客的数量 }; transportNode *next; 但是总是不能成功,非常郁闷。于是我问了问老师,老师告诉我类是不能嵌套的!当时我就晕了,原来不能嵌套啊,于是我将里面的小类改成了结构体,这样,很多问题就迎刃而解了 class transportNode//航线类节点 { friend class transport; private: char finish[10];//目的地 char flightname[10];//航班名 int flightnum;//航班号 int day;//飞行日期 }; int limitednum;//乘员限额 int remainber;//余票 struct booknode { public: char name[10];//乘客 int ticketnum;//票数 int rate;//舱位等级 }b[40]; struct sparenode { public: char name[10];//乘客 int ticketnum;//票数 int m;//记录排队等候的顾客的数量 }s[40]; transportNode *next; 2、在编程的时候很容易忽略一些边界条件,导致漏洞很多,比方设计主菜单的时候有1、2、3、4等选项,但是如果用户选择了其他的就会出现 陷入死循环,我将主菜单的代码改成了: int menu() { int c; cout<<\" ****************欢送进入主菜单***********\"< 这样就不会再陷入死循环了! 时间复杂度的话,由于程序源代码中没有多重循环,所以时间复杂度都很小。总之,调试过程中还是遇到了不少问题,不过都在同学和自己的努力中解决了。 六 、用户使用说明及测试结果 详细列出每一步的操作说明。 1、录入航班信息〔应该是航空公司录入的〕 2、实现查询功能: 是客户的查询 3、订票〔余票充足〕 4、订票〔余票不足〕 5、余票不足排队 6、退票 7、退出系统 附录:程序设计源代码 #include class transportNode//航线类节点 { friend class transport; private: char finish[10];//目的地 char flightname[10];//航班名 int flightnum;//航班号 int day;//飞行日期 int limitednum;//乘员限额 int remainber;//余票 struct booknode { public: char name[10];//乘客 int ticketnum;//票数 int rate;//舱位等级 }b[40]; struct sparenode { public: char name[10];//乘客 int ticketnum;//票数 int m;//记录排队等候的顾客的数量 }s[40]; transportNode *next; }; class transport { public: transport();//无參构造函数构造头节点 void recort();//记录航班信息 void chest();//实现根据输入的目的地查询的功能 void book();//实现旅客的订票功能 void bounce();//实现退票功能 private: transportNode *head; }; transport::transport() { head=new transportNode; head->next=NULL; } void transport::chest()//实现查询功能 { char a[10];//输入的地址 int m=0;//计数器,判断是否有符合条件的航班 char q; cout<<\"请输入要查询的目的地:\"; cin>>a; transportNode *pre; pre=head->next; while (pre) { if(strcmp(a,pre->finish)==0) { m++; cout<<\"恭喜!查到了,航班信息如下:\"< void transport::book()//订票系统 { transport y; transportNode p; static int i=0;//静态变量存储上次订票信息 static int j=0;//静态变量存储上次排队信息 static int k=1; p.s[j].m=0; int m=0;//计数器,据此判断是否有符合目的地的票 char c; transportNode *pre; pre=head->next; char f[10]; cout<<\" ********欢送进入订票系统*******\"< cin>>p.s[j].name; cout<<\"请输入您需要的票数:\"; cin>>p.s[j].ticketnum; cout<<\"排队成功!如果有人退票,我们会尽快通知您!\"< void transport::bounce()//退票实现函数 { transport a; transportNode b; char c; int i=0; int x; cout<<\"欢送进入退票系统!\"; cout<<\"请输入您要退票的目的地:\"; cin>>b.finish; cout<<\"请输入您的飞行日期:\"; cin>>b.day; cout<<\"请输入您的退票张数:\"; cin>>x; while (x>=b.s[i].ticketnum&&i void transport::recort() { transportNode *t; transport(); t=new transportNode; cout<<\" 请输入航线终点:\"; cin>>t->finish; cout<<\" 请输入航班号:\"; cin>>t->flightname; cout<<\" 请输入飞机号:\"; cin>>t->flightnum; cout<<\" 请输入飞行日期:\"; cin>>t->day; cout<<\" 请输入乘客限额:\"; cin>>t->limitednum; t->remainber=t->limitednum; t->next=head->next; head->next=t; } int menu() { int c; cout<<\" ****************欢送进入主菜单***********\"< void main() { } transport a; cout<<\" *************录入航班信息***********\"< 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo6.com 版权所有 湘ICP备2023023988号-11
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务