1、 《面向对象程序设计》课程设计报告 题目: 民航订票系统 班级: 学号: 姓名: 指导老师: 时间: 15-16周 / 2015年12月7日至2015年12月18日 成绩等级: 1 一、 需求分析 设计一个民航订票系统,实现如下功能: (1)录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定); (2)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况; (3)订票:(订票情况可以存
2、在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关提示信息; (4)退票: 可退票,退票后修改相关数据文件; (5)客户资料:有姓名,证件号,订票数量及航班情况,订单要有编号; (6)修改航班信息:当航班信息改变可以修改航班数据文件。 二、对每个类的说明,包括数据成员、成员函数的含义与功能 本程序中所用到的数据类型有:int ,chat,结构,指针 数据结构有链表,其中链表的数据域是结构。结构等数据的定义如下: typedef struct Customer //已定票乘客信息 { char Name[7];
3、 //姓名 int Amount; //定票数 char Rank; //舱位等级 int Seat_No; //座位号 struct Customer *Next; }Customer; typedef struct Replace //替补乘客信息 { char Name[7]; //姓名 int Amount; //定票数 char Rank; //舱位等级
4、 char Seat_No; //座位号 struct Replace *Next; }Replace,*PReplace; typedef struct Flight //航线信息 { char Des_Name[10]; //终点站名 char Flight_No[6]; //航班号 char Plane_No[6]; //飞机号 char Week_Day; //飞行周日 int Customer_Amount
5、 //乘员定额 int Free_Amount; //剩余票数 float Price[3]; //舱位等级的价格 Replace *ReplName; //该航班的候补乘客名单 Customer *CustName; //该航班的已定票乘客名单 struct Flight *Next; //指示下一航线结点 }Flight,*PFlight; int Customer_Count=0; //所有航线的定票乘客总数 Fligh
6、t *Head; //航线头指针 Flight *p2; //航线结点指针 Customer *Custp1[MAX]; //各条航线乘客结点指针 Replace *Replp1[MAX]; //各条航线候补结点指针 int IsEmpty=1; //是否有定票乘客 int IsReplace=1; //是否有候补乘客 Customer *prior; //满足要求的定票乘客的前结点,以作删除操作
7、三、系统框架图 密码登陆界面 开始 航线管理 订票系统 退票办理 乘客管理 系统离开 航线增设 航线查看 航线修改 返回主菜单 订票 乘客 信息 候补乘客 信息 返回主菜单 是否确认离开 四、调试分析 在调试过程中,由于没有做出界面而是在DOS环境下实现的,所以要想得到比较友好的DOS界面必须耐心地调整.。在密码登陆时,输入密码出现实心黑圆点也是通过循环语句多次慢慢调试出的。在分析实现时,首先想到的是用链表来存放记录,但每个记录包括的许多信息最好是存放在结构中,故选取以结构为链表信息域的数据结构来实现。 改进之处:1>用可视化做出
8、界面,让程序实现起来更加好看。 2>用文件实现数据信息的存取,本题中可以通过改动来增加此项功能。 3>退票时,若乘客定的是多票,则出现询问其退几张票。 五、用户手册 编绎连接得到EXE文件,运行程序,出现如下密码登陆界面(以lyh为密码) 输入lyh, 按下回车 接着出现 选取1,按下回车 选取1,按下回车 按提示输入并按回车,最后出现如下界面: 按Y或y继续录入航班信息,输入N或n退回。 输入Y继续输入一些信息..(;输入的航班号若不唯一则出现提示信息,并要求重新输入) 输入N,回车,返回航线管理子菜单 输入2,回车查看航线信息 按下任意
9、键返回航线管理子菜单 输入3对航线进个修改;输入4返回主菜单, 输入2,回车,进入订票办理界面如下: 若输入的航班号有误,则出现如下提示界面: 按下Y,继续 按提示一步步输入,直到输入完毕,出现如下界面 由于本人比较懒,所以没有在订票人所定票数为所有时显示”包机” 0.0 输入y,继续定票,输入N返回主菜单 若余票不足,则出现如下界面: 输入N出现是否退出“订票办理”的提示信息,输入Y出现: 按提示,输入信息,直至出下如下界面: 输入Y继续订票,输入N返回主菜单界面 输入4,查看乘客信息,界面如下: 输入1,回车 按下任意键,返回乘客管理
10、子菜单
输入2,回车,查看候补乘客信息:
按下任意键返回乘客管理子菜单
输入3返回主菜单
输入3,回车,进入退票办理界面
按提示一步步输入
(本系统只有“一退全光”的效果 >-<)
按下任意键返回主菜单
输入5,回车
输入N返回主菜单,输入Y退出航空订票管理系统
汪:1>凡提示输入Y或N时不分大小写
2>在主菜单及子菜单界面时,若输入的菜单项不存在,则出现(以主界面为例)
按下任意键返回主菜单界面,可以继续输入菜单项
六、附录
11
#include
11、e
12、ct Customer *Next; }Customer; typedef struct Replace //替补乘客信息 { char Name[7]; //姓名 int Amount; //定票数 char Rank; //舱位等级 char Seat_No; //座位号 struct Replace *Next; }Replace,*PReplace; typedef struct Flight //
13、航线信息 { char Des_Name[10]; //终点站名 char Flight_No[6]; //航班号 char Plane_No[6]; //飞机号 char Week_Day; //飞行周日 int Customer_Amount; //乘员定额 int Free_Amount; //剩余票数 float Price[3]; //舱位等级的价格 Replace *ReplName;
14、 //该航班的候补乘客名单 Customer *CustName; //该航班的已定票乘客名单 struct Flight *Next; //指示下一航线结点 }Flight,*PFlight; int Customer_Count=0; //所有航线的定票乘客总数 Flight *Head; //航线头指针 Flight *p2; //航线结点指针 Customer *Custp1[MAX]; //各条航线乘客结点指针
15、Replace *Replp1[MAX]; //各条航线候补结点指针 int IsEmpty=1; //是否有定票乘客 int IsReplace=1; //是否有候补乘客 Customer *prior; //满足要求的定票乘客的前结点,以作删除操作 //-------密码登入窗口函数---------- int Code_Verify() { char b[10]; char c[10]="lyh";//已经进行简单加密 char a;
16、 int i=0,j,k=1,x; // system("cls"); // cout<<"\n\n\n\n\n\n\n\n\n\t\t\t请输入系统密码:"; while(1) { system("cls"); cout<<"\n\n\n\n\n\n\n\n\n\t\t\t请输入系统密码:"; for(j=0;j
17、a; if(int(a)==8) { i-=2; system("cls"); cout<<"\n\n\n\n\n\n\n\n\n\t\t\t请输入系统密码:"; for(j=0;j
18、lse
{
if(k==3)
{
while (!kbhit())
{
system("cls");
for(x=0;x<100000000;x++);
cout<<"\n\n\n\n\n\n\n\n\t\t 你无权使用本系统,任意键退出系统..."< 19、1;
}
cout<<"\n\t\t 密码错误,你还有"<<3-k<<"次机会.请按任意键,重新输入."< 20、
for(i=1;i<=strlen(line)/2;)
{
system("cls");
for(j=0;j<9;j++) //改变行坐标
cout< 21、f(k==4)
i++;
cout< 22、for(j=0;j<10;j++)
cout< 23、
//---------------菜单模板函数---------------
char ModelMenu(char *s[],int Itemcount)
{
int i;
char answer;
system("cls");
cout<<"\n\n";
cout<<"\t\t\t┌──────────────┐"< 24、 │"< 25、
cout<<"\t\t\t 请输入菜单项前的操作代码:";
cin>>answer;
return answer;
}
//---------------主菜单函数---------------
char MainMenu()
{
char *MenuItem[]={"│ 航空客运订票系统菜单 │","│ │[1]. 航 线 管 理 │ │",\
"│ │[2]. 订 票 办 理 │ │","│ │[3]. 退 票 办 理 │ │","│ │[4]. 乘 客 管 理 │ │",\
"│ │[5]. 系 统 26、离 开 │ │"};
return ModelMenu(MenuItem,6);
}
//---------------是否继续函数---------------
char Continue()
{
int i;
char answer;
while(1)
{
cout<<"\t\t ";
for(i=0;i<15;i++)
cout<<"─";
cout<<"\n\t\t\t 是否继续(Y/N)?";
cin>>answer;
if(answer=='y'||ans 27、wer=='Y')
return 'y';
else if(answer=='n'||answer=='N')
return 'n';
else
cout<<"\t\t\t 输入错误,请重新输入!"< 28、退出-----------------
int ExitSystem()
{
char answer;
cout<<"\n\t\t\t 你确定是否真要离开系统吗(Y/N)?";
cin>>answer;
if(answer=='y'||answer=='Y')
return 1;
else
return 0;
}
//--------------操作提示函数-------------
void prefix(char *Item)
{
int i;
system("cls");
cout<<"\n\n\t\t 29、\t 当前操作:"< 30、2) //首航线不作比较
return flag;
while(p1!=p2&&p1!=NULL) //本航班号不纳入比较范围,否则会一直提示航线不唯一
{
if(strcmp(p1->Flight_No,key)==0)
{
flag=1;
break;
}
p1=p1->Next;//指向下一航班结点
}
return flag;
}
int Find_Line(PFlight L,char *key,PFlight &p2,int &Flight_No)//引 31、用调用
{
int flag=0; //该标志位0表示未找到相关信息,反之即找到
Flight *p1;
p1=L; //赋航线首结点
while(p1!=NULL)
{
if(strcmp(p1->Flight_No,key)==0)//不包括当前航线
{
flag=1;
p2=p1;
break;
}
p1=p1->Next; //指向下一航班结点
if(p1!=NULL) //遇结束符 32、不作统计范围
Flight_No++;
}
return flag;
}
//-----------------航线添加函数-------------
void Line_Add()
{
Flight *p1; //建立临时航线结点
while(1)
{
if(Head==NULL)//航线为空
{
p1=p2=new Flight; //建立首个航线
Head=p2;
}
else
{
p1=new Flight; //建立航 33、线结点
p2->Next=p1; //前一航线结点指向当前航班结点
p2=p1; //保留当前航班结点地址
}
prefix("航线增设");
cout<<"\t\t\t 请输入终点站名:";
cin>>p2->Des_Name;
while(1) //数据合法性检验
{
cout<<"\n\t\t\t 请输入航班号(唯一):";
cin>>p2->Flight_No;
if(Find_Line 34、Head,p2->Flight_No)) //存在航班号
cout<<"\n\t\t\t 输入的航班号不唯一!"< 35、2->Week_Day>'7')
{
cout<<"\n\t\t 数据输入错误,按任意键继续输入."< 36、请输入普通舱票价:";
cin>>p2->Price[1];
cout<<"\n\t\t\t 请输入经济舱票价:";
cin>>p2->Price[2];
p2->Free_Amount=p2->Customer_Amount; //剩余票数与乘员定额相同
p2->CustName=NULL; //该航线定票乘客头指针为空
p2->ReplName=NULL; //初始候补名单为空
if(Continue()=='n')
{
37、 p2->Next=NULL; //航线的下一结点为空
return;
}
}
}
//------------航线是否为空函数-------------
int Empty_Flight()
{
if(Head==NULL)
{
system("cls");
cout<<"\n\n\n\n\n\n\n\n\t\t 对不起,没有相关航线。按任意键返回..."< 38、
}
//------------航线查看函数-----------------
void Line_See()
{
int Day;
Flight *p1;
p1=Head;
char *Week_Day[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
if(Empty_Flight()) //航班线为空
return;
prefix("航班查看");
cout<<" ┌────┬───┬───┬────┬────┬────┬────────┐"< 39、 │ │ │ │ │ │ │ 票 价 │"< 40、//数字转换相应星期数
cout<<" │"< 41、>Price[1]<<"│"< 42、r *MenuItem[]={"│ 航空客运航线管理子菜单 │","│ │[1]. 航 线 增 设 │ │",\
"│ │[2]. 航 线 查 看 │ │","│ │[3]. 航 线 修 改 │ │","│ │[4]. 返 回 主 菜 单 │ │"};
while(1)
switch(ModelMenu(MenuItem,5))
{
case '1':{Line_Add();break;}
case '2':{Line_See();break;}
case '3':{return 43、}
default:{ErrorMess();}
}
}
//---------------订票办理函数---------------
void Sub2Menu()
{
int Ticket_Count,Seat_No,i,flag=0;
int Flight_No=0; //记录满足条件的航线的定票结点
Flight *p1; //记下满足条件的航线结点地址
Customer *p2; //临时性定票乘员结点
Replace *p3; //临时性候补乘员结点
44、 char answer[7]; //用户输入的航班数据
char temp;
int tag=0; //候补乘客标志位
int Amount;
int IsRepl=0; //是否执行候补操作标志位
if(Empty_Flight()) //航班线为空
return;
while(1)
{
prefix("订票办理");
flag=0; //标志位清零以重新作出判断
Flight_No=0;
tag=0;
cou 45、t<<"\n\t\t\t 请输入航班号:";
cin>>answer;
if(Find_Line(Head,answer,p1,Flight_No)) //调用航线查找函数,若存在则进行以下操作
{
while(1) //数据合法性检验
{
cout<<"\n\t\t\t 请输入定票数:";
cin>>Ticket_Count;
if(Ticket_Count==0)
{
46、 cout<<"\n\t\t\t请输入大于零的数,按任意键继续输入."< 47、
IsRepl=1; //定票量满足,无需进入候补操作
Amount=p1->Free_Amount; //记录剩余票数
if(p1->CustName==NULL) //首个定票乘客,并记录相关属性
{
Custp1[Flight_No]=p2=new Customer; //建立该航线的首位乘客结点
p1->CustName=Custp1[ 48、Flight_No];
}
else //建立该航线的后续乘客结点
{
p2=new Customer;
Custp1[Flight_No]->Next=p2;
Custp1[Flight_No]=p2;
}
IsEmpty=0; //定票乘员不为空
Custp1[Fligh 49、t_No]->Amount=Ticket_Count; //订票数
Seat_No=p1->Customer_Amount-p1->Free_Amount+1; //算出座位号
Custp1[Flight_No]->Seat_No=Seat_No; //赋座位号
p1->Free_Amount-=Ticket_Count; //减去定票数
cout<<"\n\t\t\t 请输入你的姓名:";
cin 50、>>Custp1[Flight_No]->Name;
while(1) //数据合法性检验
{
cout<<"\n\t\t\t 请输入舱位等级(1-3):";
cin>>Custp1[Flight_No]->Rank;
if(!(Custp1[Flight_No]->Rank>='1'&&Custp1[Flight_No]->Rank<='3'))
{






