C ++面向对象课程设计
民航订票
院系:计算机科学技术学院 班级:网络工程15-2 组长:孙传奇
组员:高婷、宋旭、郭宇 指导教师:王双立
2016年06月系14日统
目录
1概述 ................................................................................................................. 1
1.1研究背景及意义 .................................................................................... 1 1.2任务概述 ................................................................................................ 1 2需求分析 ........................................................................................................... 2
2.1客户功能 ................................................................................................ 2 2.2管理员功能 ............................................................................................ 2 2.3操作方法 ................................................................................................ 2 3总体设计 ........................................................................................................... 5
3.1功能结构图 ............................................................................................ 5
3.2模块分析 ................................................................................................ 5
3.2.1添加航线 ..................................................................................... 5 3.2.2查询航班 ..................................................................................... 5 3.2.3预订订票 ..................................................................................... 6 3.2.4退机票 ......................................................................................... 6 3.3数据结构设计 ........................................................................................ 6 (一)、本系统要用到的库函数:............................................................. 6 (二)、航空类的定义................................................................................. 6 (三)菜单类的定义................................................................................... 8 (四)、接口设计......................................................................................... 8 4详细设计 ........................................................................................................... 9
4.1 算法设计说明 ...................................................................................... 9 4.2函数实现模块 ...................................................................................... 10
4.2.1 主控函数main() . ...................................................................... 10 4.2.2客户订票void book() 函数 ...................................................... 10 4.2.3客户退票void back() 函数 . ...................................................... 11 4.2.4客户查询void query() 函数 . .................................................... 12 4.2.5管理员航班信息录入模块 ....................................................... 13 4.2.6文件写入void writetofile()函数 ............................................... 14 4.2.7控制台的调用system() . ............................................................ 14 5程序调试与测试 ............................................................................................. 15
5.1颜色选择 .............................................................................................. 15 5.2利用递归调用实现返回上级菜单或者主菜单 .................................. 15 5.3倒计时退出界面 .................................................................................. 15
5.4管理员权限限定 .................................................................................. 16 5.5后台管理界面 ...................................................................................... 16 6总结 ......................................................................................................... 17 7程序清单 ................................................................................................. 18
1概述
本文采用C++作为前台开发工具,VC6.0作为程序代码的实现,旨在实现对现有飞机订票系统中遇到的各种情况进行良好的改进,是作为嵌入式系统应用于机场的良好软件。
1.1研究背景及意义
随着时代的进步,社会分工的不断细化,各个行业的联系不断密切,人们出行越来越多,出行的方式也是百花齐放。作为空中的重要交通工具,飞机航空系统也在不断得到优化,其中重要的一项就是飞机航空订票系统。因此好的订票系统关系着人们的日常出行方便与否,设计并编制出符合人们需要的航空订票系统是一项繁重而艰巨的任务,需要我们认真去完成。
1.2任务概述
假定民航机场有n 个航班,每个航班有一个航班号、确定的航线(出发地、目的地)、确定的飞行时间和飞机票总数,旅客数。该系统需实现下列服务:
1. 航班信息录入功能; 2. 航班信息浏览功能
3. 查询航线(出发地、目的地查询)
4. 承办订票和退票业务
2需求分析
2.1客户功能
1、航线查询功能:
根据输入的起止城市信息查询航班,并显示其详细信息(起飞时间、到达时间、航班号、余票量)。
2、客票预订功能:
根据输入的航班号和数量预订机票,办理手续并进行信息核对。
2.2管理员功能
1、添加功能:
添加一个航班的信息,包括航班号、行程、起飞时间、到达时间、机型、全价、座位总数 。
2、将航班信息写入文件。
2.3操作方法
民航订票系统的主界面如下所示:
*------中国民航欢迎您!------*
================================= --------* 1、客户 *--------
--------* 2、管理员 *-------- --------* 3、退出程序运行 *-------- == ===============================
(1)、选择1进入普通用户菜单:
*------您好,欢迎使用本系统办理订票业务------*
= ================================= --------* 1、承办订票业务 *-------- --------* 2、承办退票业务 *-------- --------* 3、查询航班 *-------- --------* 4、退出程序的运行 *-------- == ================================
选择1进入订票模块:
请输入您要订购的航班号 n23dt 请输入您要订购的机票数量 2 订票成功!
选2进入退票模块: 请输入日期: 航班: 退票成功!
选择3进入航班查询信息模块: 请输入起始地点 北京 请输入目的地点 南京
出发地点 目的地点 起飞时间 航班号余票 北京 南京 05:43 Bn23dt 100
查找已完成 按任意键返回菜单
(2)、选择2进入管理员菜单:
*------后台管理系统------*
================================= --------* 1、录入航班信息 *-------- --------* 2、将数据写入文件 *-------- --------* 3、退出程序的运行 *-------- == ===============================
请输入对应操作序号进行相应操作:
选择1录入航班信息
请输入您要添加的航班种数: 请输入您要添加的航班信息: 出发地点: 南京 目的地点: 北京 起飞时间: 时:5 分:43
航班号: Bn23dt 星期几:四
您输入的信息是:
种数出发地点 目的地点 起飞时间 航班号 星期几余票 3 南京 北京 05:43 Bn23dt 四100
选择2将信息写入文件. 选择3退出菜单.
3总体设计
3.1功能结构图
根据需求分析,该系统的功能结构图如下所示:
图3-1系统结构示意图
3.2模块分析
3.2.1添加航线
系统将提示用户输入新添加的航班的信息,插入在链表中。
3.2.2查询航班
首先由用户输入要查找的起始地点,然后系统用查找函数查找,然后系统就调用输出函数,输出所查找的航班资料。
3.2.3预订订票
由用户输入航班号和订票数目,系统判断能满足用户需求则输出“订票成功”信息
3.2.4退机票
首先由用户输入要退的航班,然后调用删除函数,删除该航班的已订状态。
3.3数据结构设计
(一)、本系统要用到的库函数:
#include
#include #include
#include
(二)、航空类的定义
class Plane
{
public:
char start_place[40];//起点 char name[40];//终点站名 char number[10];//航班号
char week[7];//星期几飞行 char day[40];//日期 int left;//余票额
int n;//与数组flag 一起确定客户订票状态
public:
int flag[20];//订票状态数组,-1为预订票,1为已定票,0为初始化状态 Plane()//构造函数
{ name[0]='\0';
number[0]='\0'; week[0]='\0'; day[0]='\0'; left=M;
n=0;//数组从0开始计数
for(int i=0;i
void init()//初始化每种飞机票 { cout
cin>>start_place;
cout>name;
cout>number;
cout>week;
cout
cin>>day; }
~Plane(){};//析构函数
char *get_start_place() {return start_place; }//起点
char *getname()
{return name; }//获得终点站名 char *getnumber()
{return number; }//获得航班号 char *getweek()
{return week; }//获得星期几飞行 char *getday()
{return day; }//获得日期 int getleft()
{return left; }//获得余票额 int getn()
{return n; }//获得旅客数目 void inleft(int n)
{left=left+n; }//余票额增加函数 void deleft(int n)
{left=left-n; }//余票额减少函数 void people_in()
{n++;}};//旅客数目增加函数
(三)菜单类的定义
菜单类父类 class menu
{
public :
int ch;//返回选择序号
int me_nu()
{}//用于打印菜单,父类的菜单空实现
};
子菜单类(继承于父类菜单menu ) class logo_menu:public menu {};//主界面菜单
class admin_menu:public menu {};//管理员菜单
class client_menu:public menu {};//客户端菜单
(四)、接口设计
表2.1:函数列表
4详细设计
4.1 算法设计说明
文件“航空售票管理系统v-1.0.cpp ”中 主函数流程图——main()
图4-1主控模块算法流程图
4.2函数实现模块
4.2.1 主控函数main()
调用控制台,设置窗口颜色
system(“color 9e” );//控制台调用
接着要求用户选择用户类型,按1为普通用户,按2位管理员,3退出, 进入相应菜单后,同样选择对应序号,进行相应操作,进入管理员模式要输入密码进行验证。
4.2.2客户订票void book() 函数
调用此函数实现客户订票预订票数功能。
此函数会首先要求用户所要订购的航班号和预订票数
cout
cin>>number;
cout
cin>>n;
之后用一个for 循环实现信息匹配,
for(int i=0;i
用num 不为零标记匹配成功的状态 当信息匹配后再判断票数是否足够:
if(n0)
票数足够久则订票,
cout
pl[i].people_in(); //旅客增加
pl[i].flag[pl[i].getn()]=1; //状态改为已订票
不满足则返回上级菜单,重新确定订票信息,不满足的状态用num 为零进
行标记;
num==0;
如果用户确实是要订票但余票不够,则询问用户是否进行预约,确定后将所需票数改为预约状态,用-1标记。
cout>ch; switch(ch) {
case 1://确定预约
pl[i].people_in();
pl[i].flag[pl[i].getn()]=-1;//预约,用-1标记,表示预约状态 break;
case 2://不预约,退出 break;
default://容错处理
cout
最后在函数结尾再调用自身实现返回上级菜单功能,
book();//di递归调用
4.2.3客户退票void back() 函数
首先会要求客户输入要退订的票的日期和航班,
cout>day;
cout>number;
然后程序进行信息匹配
if(strcmp(day,pl[i].getday())==0&&strcmp(number,pl[i].getnumber())==0)
匹配成功则退票成功,同时系统票数增加
pl[i].inleft(n);//该种飞机票增加,即已退票,接着查询客户的订票状态,
//用户是否有预订票,若有,则为用户确定订购此票。
if(pl[i].flag[j]==-1)//客户是否为预定状态 {
cout>nu;
if(nu
cout
cout
for(int k=0;k
cout>sitnumber;
}
cout
} } else
cout
若在用户退票的过程中没有匹配到航班,则显示没有此票,清屏并用递归调用返回到上级菜单。
4.2.4客户查询void query() 函数
这个模块查询是按航线的起止点进行查询。
首先会要求用户输入要查询起止点,然后系统在所有的数据中进行匹配,
for(i=0;i
if(strcmp(name,pl[i].getname())==0&&strcmp(start_place,pl[i].get_start_place())==0)
当信息匹配时,就会输出对应航班信息:
cout
cout
break;
4.2.5管理员航班信息录入模块
想要进入管理员后台管理界面,必须输入管理员密码,保证信息的安全性
cout>y; //读取密码
if(strcmp(y,f)==0)//密码匹配就允许进入管理系统
进入系统后按1 进行信息的录入工作,按 2 进行信息写入文件的操作,按3退出管理系统。
退出采用延时3秒倒计时退出方式
Sleep(1000)//循环三次,即为3秒倒计时
4.2.5.1类成员void init()函数
进行航班信息的录入工作
cout
cin>>start_place;
cout>name;
cout
cin>>number;
cout>week;
cout>day;
4.2.5.2 void input() 函数
进入模块,系统要求管理员输入需要录入的机票的种类数,之后调用写入函数进行写入
for(int i=0;i
4.2.6文件写入void writetofile()函数 定义输出文件流对象
ofstream ofs("民航信息系统.dat",ios_base::in);
之后将各个对应信息写入文件
4.2.7控制台的调用system() 程序中用到的控制台命令:
s ystem(“cls”);//清屏
用清屏实现窗口界面的切换工作
s ystem(“color 9e”);//窗口颜色设置
5程序调试与测试
5.1颜色选择
经过之前的调试与搭配最终选择了使用蓝底黄字。
5.2利用递归调用实现返回上级菜单或者主菜单
因为考虑到用户的体验,程序设计最终要考虑到用户,所以设计之初就考虑到当完成一项操作后返回上级菜单或者主菜单以便于用户接着进行操作
5.3倒计时退出界面
利用延时函数Sleep(); 实现暂停工作,最终实现倒计时退出
5.4管理员权限限定
进入管理员需要密码,否则没有权限
5.5后台管理界面
6总结
该程序有许多模块组成,模块之间又存在各种包含或调用关系,如果用c 语言来实现,虽然程序并不长,后期的调试和修改恐怕也会让人非常头疼,而c++中类的定义和使用使得各种模块相对更加独立,功能分担也更加鲜明,程序容易读,也容易调试和修改。此外,实际动手做一做,才发现c++这门语言有很多细节是当初复习笔试是没有注意到的,对c++的掌握程度和运用能力与编程前有了很大的提高。
在编程过程中,格式出错最多的是对类的成员函数进行定义时,常常忘记限定作用域,导致函数无法调用;而内容上出错最多的则是与指针有关的内容,以后编程时还应努力改正。
还有好多功能没有完善,比如说管理员删除航线,管理员浏览全部的航线,还有用户查询航线时可根据航线,起止点,时间等信息进行查询。
但是值得一提的是利用了递归调用实现返回上级菜单,主菜单的功能,提升了用户的体验。这一点作为程序的主编写者还是比较自豪,满意的。
当然,程序还有好多的不足需要修正,毋庸置疑,程序还存在好多没有发现的bug 有待修正。
7程序清单
#include
#include
#include
#include
using namespace std;
#define M 5//每种飞机票的总数目
#define N 20//飞机票的种类
#define frame_high 5
#define frame_width 5
class Plane
{
public:
char start_place[40];//起点
char name[40];//终点站名 char number[10];//航班号 char week[7];//星期几飞行 char day[40];//日期 int left;//余票额 int n;//与数组flag 一起确定客户订票状态
public:
int flag[20];//订票状态数组,-1为预订票,1为已定票,0为初始化状态
Plane()//构造函数 { name[0]='\0'; number[0]='\0'; week[0]='\0'; day[0]='\0'; left=M; n=0;//数组从0开始计数 for(int i=0;i
cout>start_place; cout>name; cout>number; cout>week; cout
cin>>day;
}
~Plane(){};//析构函数
char *get_start_place() {return start_place;}//起点
char *getname()
{ return name;}//获得终点站名
char *getnumber()
{return number;}//获得航班号
char *getweek()
{return week;}//获得星期几飞行
char *getday()
{return day;}//获得日期
int getleft()
{return left;}//获得余票额
int getn()
{return n;}//获得旅客数目
void inleft(int n)
{left=left+n;}//余票额增加函数
void deleft(int n)
{left=left-n;}//余票额减少函数
void people_in()
{n++;}//旅客数目增加函数
};
class menu
{
public :
int ch;
int me_nu(){}
class logo_menu:public menu
{
public:
int me_nu()
{
cout
}; cout>ch; system("cls"); return ch; }
class admin_menu:public menu
{
public:
int me_nu()
{
cout
}; cout>ch; system("cls"); return ch;
class client_menu:public menu
{
public:
int me_nu()
cout
cin>>ch;
system("cls");
return ch;
}
};
Plane pl[N];
void init();
void input();//初始化函数
void query();//查询函数
void book();//订票函数
void back();//退票函数
void writetofile();
int main()
{
char f[]="2016sgs";
system("color 9e");
logo_menu l; while(1) { int choice_logo; choice_logo=l.me_nu(); switch(choice_logo) { case 1: int choice_client; client_menu c; choice_client=c.me_nu(); switch(choice_client) {
case 1:
cout
cout
break;
case 2:
cout
back(); break; case 3: cout=1;i--) { cout=1;i--) { cout
char y[40]; cout>y; //读取密码 if(strcmp(y,f)==0) { system("cls"); int choice_admin; admin_menu a; choice_admin=a.me_nu(); switch(choice_admin) { case 1: input(); break; case 2: writetofile(); break; case 3: { for(int i=3;i>=1;i--) { cout=1;i--)
cout=1;i--) { cout
for(int i=3;i>=1;i--) { cout
Sleep(1000);
system("cls");
}
}
return 0;
}
void input()
{ int count;
cout
cin>>count;
for(int i=0;i
{
pl[i].init();
} cout
Sleep(2000);
system("cls");
int choice_admin;
admin_menu a;
choice_admin=a.me_nu();
switch(choice_admin) { case 1: input(); break; case 2: writetofile(); break; case 3: { for(int i=3;i>=1;i--) { cout
default:
cout
}
}
void query()
{
int i,num=0;
char start_place[40];
char name[40];
cout>start_place; cout
cin>>name;
for(i=0;i
if(strcmp(name,pl[i].getname())==0&&strcmp(start_place,pl[i].get_start_place())==0)
{
num=1;
cout
cout
cout
break;
}
if(num==0)
{
cout
getchar(); getchar(); system("cls"); int choice_client; client_menu c; choice_client=c.me_nu(); switch(choice_client) { case 1: cout
case 4: { for(int i=3;i>=1;i--) { cout=1;i--) { cout
Sleep(1000); } system("cls");
}
query();
}
}
void book()
{
char number[10];
int n,sitnumber,nu,ch,num=0;
cout
cin>>number; cout>n; for(int i=0;i0) { cout
pl[i].people_in(); pl[i].flag[pl[i].getn()]=1; for(i=0;i>sitnumber; }
}
else
{
cout
cin>>nu; if(nu>sitnumber; } pl[i].deleft(nu); pl[i].people_in(); pl[i].flag[pl[i].getn()]=1; } else { cout>ch; switch(ch) { case 1: pl[i].people_in(); pl[i].flag[pl[i].getn()]=-1; break; case 2:
default: cout
getchar();
system("cls");
int choice_client;
client_menu c;
choice_client=c.me_nu();
switch(choice_client)
{ case 1: cout=1;i--) { cout
cout=1;i--) { cout
Sleep(1000); } system("cls");
}
book();
}
}
void back()
{
int n,nu,sitnumber,num=0;//航班号, 日期, 退票数目, 订票数目, 座位号, 标志量 char number[10],day[40];
cout
cin>>day; cout
cin>>number;
for(int i=0;i
if(strcmp(day,pl[i].getday())==0&&strcmp(number,pl[i].getnumber())==0)//日期
与航班是否满足
{ num++;//日期与航班满足 cout>n; cout
if(nu>sitnumber; } cout
}
if(num==0)
{
cout
getchar(); getchar(); system("cls");
int choice_client;
client_menu c;
choice_client=c.me_nu();
switch(choice_client)
{
case 1:
cout
cout
cout
back();
break;
case 3:
cout
break;
case 4: { for(int i=3;i>=1;i--) { cout
Sleep(1000);
}
system("cls");
cout
return ; } break; default: cout=1;i--) { cout
Sleep(1000);
}
}
} back();
}
void writetofile()
{
ofstream ofs("民航信息系统.dat",ios_base::in);
int i; for(i=0;i
ofs
ofs
ofs
ofs
ofs
}
ofs.close();
cout
for( i=3;i>=1;i--) { cout
Sleep(1000);
}
system("cls");
}