飞机订票系统设计开发.docx
《飞机订票系统设计开发.docx》由会员分享,可在线阅读,更多相关《飞机订票系统设计开发.docx(17页珍藏版)》请在冰豆网上搜索。
![飞机订票系统设计开发.docx](https://file1.bdocx.com/fileroot1/2023-1/4/ed91e6c8-fca2-42be-bbe6-8f68a2487332/ed91e6c8-fca2-42be-bbe6-8f68a24873321.gif)
飞机订票系统设计开发
C++课程设计实践报告
设计题目:
飞机订票系统设计开发
姓名
专业班级:
学号:
指导老师:
目录
一.设计要求………………………………2
二.设计思想………………………………2
三.程序代码………………………………2
四.调试过程………………………………15
五.运行结果………………………………18
六.心得体会………………………………27
一.设计要求:
1.订票业务:
有新客户订票时,先输入客户的姓名和航班号,查询该航线的订票情况,若有余票,则为客户办理订票手续,分配给客户一个座位号,然后将新客户的信息添加到文件“customer.dat”,并修改文件“airline.dat”中该航线的订票数和余票数。
每个客户信息包姓名,座位号,航班号3项。
2.退票业务:
根据输入的姓名和航班号,找出相应的客户信息,从“customer.dat”中找出客户信息并删除。
同时修改文件“airline.dat”中相应航线的订票数和余票数。
3.查询客户信息:
输入客户姓名,从文件中调出相关信息并输出。
4.查询全部信息:
调出文件“customer.dat”、“airline.dat”并将其信息全部输出。
5.退出系统。
二.设计思想
为了方便编写程序,我采用了比较简单的方法,从main主函数中指向5个函数,并且全部定义为void型,可以指向任意类型的数据,提高兼容性。
用switch选择语句来指向调用函数,再对5个调用函数进行定义。
这样函数之间彼此循环构成了一个完整的函数。
三.程序代码
#include
#include
#include
usingnamespacestd;
structflight
{intfligh;
intnum;
charplace[10];
intdticket;
intyticket;
}fl[10]={{101,01,"北京",1,99},
{102,02,"上海",1,99},
{103,03,"广州",1,99}};
structcustomer
{charname[10];
intseat;
intnum;
}cu[300]={{"张三",01,101},{"李四",01,102},{"王麻子",01,103}};//定义结构体
intcnum=3;//定义客户编号
voidlist();
voiddingpiao();
voidtuipiao();
voidchaxun();
voidchaxun();
voidchaxunquanbu();
voidcaidan1();//函数声明
voidcaidan2();
voidchushi();
voidmain()
{cout<<"欢迎使用航空订票系统2012末日版——版权所有,盗版必究~"<caidan2();
}//主函数
voidcaidan1()
{inti;
cout<<"*************航空订票系统v2012*************"<cout<<"*** ***"<cout<<"***1.订票业务2.退票业务***"<cout<<"***3.查询客户信息4.查询全部信息***"<cout<<"***5.退出系统***"<cout<<"******"<cout<<"***如果是第一次使用本系统,请载入初始信息~谢谢~***"<cout<<"*********************************************************"<ifstreaminfile1("airline.dat");
ifstreaminfile2("customer.dat");
for(i=0;i<3;i++){infile1>>fl[i].fligh>>fl[i].num>>fl[i].place>>fl[i].dticket>>fl[i].yticket;}
for(i=0;i<300;i++){infile2>>cu[i].name>>cu[i].num>>cu[i].seat>>cnum;}
infile1.close();infile2.close();//读取数据
cout<<"请输入业务代码:
";
list();
}//菜单1
voidcaidan2()
{intt;
cout<<"第一次启动本软件请输入1,否则请输入2:
";cin>>t;
if(t==1)chushi();elsecaidan1();}//菜单2
voidchushi()
{inti;
ofstreamoutfile("airline.dat");
ofstreamfile("customer.dat");
for(i=0;i<3;i++)
{outfile<<<<<file<outfile.close();file.close();
cout<<"初始化已完毕!
"<caidan1();
}//存储数据
voidlist()
{inta;
cin>>a;cout<switch(a)
{case1:
dingpiao();break;
case2:
tuipiao();break;
case3:
chaxun();break;
case4:
chaxunquanbu();break;
case5:
;break;
default:
{cout<<"输入错误,请重新输入正确的代码:
";list();}//输入代码
}
}
voiddingpiao()///////////////////////////////////////////////////////////订票
{charname[10];
intnum,i,t,j,k,temp;
intx;
cout<<"请输入你的姓名和想订的航班号:
"<cout<<"姓名:
";cin>>name;
cout<cout<<"航班号:
";cin>>num;
for(i=0;i<300;i++)
if(strcmp(name,cu[i].name)==0)
{cout<<"您已经定过航班,要返回主菜单吗?
(1.返回/2.退出)";
cin>>t;switch(t)
{case1:
caidan1();break;
default:
break;}
}
for(i=0;i<300;i++)
if(name!
=cu[i].name)
for(j=0;j<10;j++)
if(fl[j].fligh==num)temp=j;
if(fl[temp].yticket<=100){cout<<"此航班还有余票,要订票吗?
(1.是/2.否)";
cin>>x;
switch(x)
{case1:
{for(k=0;k<3;k++)
if(fl[k].fligh==num)
{
fl[k].dticket=fl[k].dticket+1;fl[k].yticket=fl[k].yticket-1;cnum=cnum+1;
strcpy(cu[cnum].name,name);cu[cnum].num=num;
cu[cnum].seat=fl[k].dticket;
ofstreamoutfile1("airline.dat");
for(j=0;j<3;j++)
outfile1<ofstreamoutfile2("customer.dat",ios:
:
app);
outfile2<cout<<"订票成功!
"<<<"客户信息:
"<"<"<outfile1.close();outfile2.close();
cout<<"1.返回主菜单2.退出:
";cin>>temp;
if(temp==1)caidan1();else;
}};break;
default:
caidan1();break;}}elsecout<<"此航班票已经售完,请订其他航班次的票~";
}///////////////////////////////////////////////////////////////////////////////////////////////////////订票
voidtuipiao()/////////////////////////////////////////////////////////////////////////////////////////退票
{charname[10];
inti,temp,t,num,a,j;
structtmp;
cout<<"请输入您的姓名和航班号:
"<cout<<"姓名:
";cin>>name;cout<<"航班号:
";cin>>num;cout<for(i=0;i<300;i++)
{if(strcmp(cu[i].name,name)==0)
{a=0;cout<<"确定退订吗?
(1.是2.否):
";cin>>temp;
if(temp==1)
{ofstreamoutfile1("airline.dat");
ofstreamoutfile2("customer.dat");
for(j=0;j<=i;j++)
outfile2<for(t=0;t<3;t++)
{if(fl[t].fligh==num){fl[t].dticket=fl[t].dticket-1;fl[t].yticket=fl[t].yticket+1;}}
for(t=0;t<3;t++)
outfile1<}
}
elsea!
=0;}
if(a!
=0)cout<<"没有你的信息,请查证后再操作!
";
cout<<"返回主菜单?
1.是2.否:
";cin>>temp;
if(temp==1)caidan1();}
////////////////////////////////////////////////////////////////////退票
voidchaxun()
{charname[10];
inttemp,i,a;
cout<<"请输入你的姓名:
";cin>>name;
for(i=0;i<300;i++)
if(strcmp(cu[i].name,name)==0){temp=i;a=0;}
cout<<"*****乘客信息*****"<"<<<"航班号:
"<"<if(a!
=0)cout<<"没有你的信息,请查证后再操作!
"<cout<<"返回主菜单?
1.是2.否";cin>>temp;
if(temp==1)caidan1();
}//查询客户信息
voidchaxunquanbu()
{inti,temp;
cout<<"乘客信息:
"<for(i=0;i<300;i++)
{if(cnum==i)temp=i;}
for(i=0;icout<<"姓名:
"<"<"<"<
cout<"<for(i=0;i<3;i++)
cout<<"航班号:
"<"<"<"<"<cout<<"返回主菜单?
1.是2.否";cin>>temp;
if(temp==1)caidan1();}//查询全部信息
四.调试过程
由于学的知识不是很多,也不是很熟练,在最开始的时候老是范一些小错误,而且很多语法错误,比如忘了写分号啊,把分号写成逗号啦。
而且忘了写全{}就会出现很多个错误,在一个庞大的程序里面找这些错误再一一改正,很可能还是不能运行,但是多加一个}就很可能全部错误都搞定!
调试的时候很多地方都是牵一发而动全身,特别是修改的时候,修改一个变量就得把其他部分的都改掉,不然就会一直出现错误。
还经常忘了定义变量就用,不过看英文提示面前能看懂,也能找到相应的错误。
在把语法小错误解决之后就剩下运行了,但是运行的情况不容乐观,很多地方呢不是我想要的结果。
比如在最开始要初始化程序,就是把预先输入好的几个客户信息存档,这个工作必须在进入程序时就得进行,不然文件里面没有内容。
但是在每次返回主菜单的时候又不能初始化,那样的话就存不进去了。
所以我想出了用两个菜单函数caidan1(),caidan2的办法。
Caidan1()是每次返回菜单时用的函数,只是负责到主界面和读取数据,而caidan2()就可以进行初始化,最开始进入程序是选择是否第一次进入,也就是选择是进入caidan1()还是caidan2().
程序如下:
这样就能分开初始化和正常的进入主菜单了。
在退票的时候,由于需要在一个循环里面一直的判断并且存储,如果判断出输入的名字在文件中没有的话就输出“没有你的信息,请查证后再操作!
”,但是随着每一次循环如果找不到信息就得输出一次,这样就会不停地输出那句话。
我想了很久才想出来用一个中间变量a来解决,如果名字像匹配就让a=0,不匹配就让a=1,这样就能避免一直的循环,直接在后面判断a的值就能知道判断的结果,然后做出相应的结果,运行的时候终于解决了这个问题,让我感叹我真的还是有点小聪明的~
在其他的几个函数里面我也遭遇到了同样的问题,就是在判断的时候屏幕上一直不停地输出信息,我采取了同样的方法解决了问题。
同样用定义中间变量值的办法。
修改后的程序如下:
还有就是存储问题了。
在开始的时候我一直按照书上的直接用输出流对象来存储到文件里面,后来打开文件,里面确实有数据,但是在调出数据,也就是在查询客户信息的时候,尽管我输入的是已经存在的客户姓名,但是系统却找不到客户信息。
我研究了好久无果,在学校问了老师之后才知道,我存储的时候数据间没有间隔,在读取的时候就不能分别数据了,应该在存储的时候在每个数据间加入一个空格符号,来分开每一个数据。
这样终于搞定了,系统能正常识别数据了。
主要的问题就是以上部分,当然还有一些问题没有一一罗列出来,在chaxun()和chaxunquanbu()函数里面遇到的问题较少,因为只需要把调出的数据一一输出即可。
五.运行结果
1、首先进入系统提示是否是第一次进入,如果是第一次就进行初始化,讲预先的几个乘客信息存档。
否则直接进入主菜单:
第一次进入,初始化!
并且进入主菜单:
提示输入业务代码,如果输入的不是以上业务代码则提示输入错误:
2、进行第一个功能选项:
订票业务:
如果已经存在此客户的信息则会出现下面情况:
则提示已经定过航班,问是否进入主菜单。
如果输入的客户在档案里面没有则进行正常订票:
输出客户信息,并且安排一个座位号,提示是否返回主菜单。
3、下面为第二个功能选项:
查询客户信息
输入客户姓名,就会自动输出客户的相关信息。
如果没有客户信息则输出一下内容:
并且提示是否进入到主菜单。
4、查询全部信息:
包括所有客户信息和所有航班的信息。
自动将客户编号,便于知道客户的总人数,并且在订票的时候已经修改航班信息,使得订票数和余票数吻合。
5、第4项功能:
退票业务:
输入客户姓名和航班,将其信息删除。
并提示是否返回主菜单。
为了验证是否删除了客户信息,可以进行查询客户信息业务和查询全部信息业务:
显示没有刚刚已经退订客户的信息。
显示出没有刚刚已退订客户的信息,并且航班的信息随之调整,订票数和余票数自动修改为正确值。
5、退出系统:
退出:
退出~。
六.心得体会
本次程序设计用时两个星期左右,工作量很饱满,而且所用的知识很多,但是我们平常在课堂上所学的知识很有限,这就需要我大量的自学书本和课外的其他书籍上的知识。
为了让程序容易使人看懂,我用到的知识点不是非常多,大都是一些基本知识,我能熟练地运用这些知识编程也算一个很大的成功了。
毕竟很多知识没有学,能用基本知识就尽量用的基本知识。
C++设计实践是对之前学过的知识的加深和巩固,之前学得较浅,实践的机会不多,这次实践让我对C++程序有了更加深入的了解,心理也由原来的不喜欢到喜欢,感觉很有意思也很有用,可也设计一些有用的或者是自己喜欢的程序。
最令我收益的是写程序的过程和调试修改的过程,因为之前我们就学了几章,没有把知识学习全面,因此编写起来是有难度的,在预先想好程序结构后,就开是卡看书,一个函数一个函数来编写,不懂的地方就上网搜或是请教一下同学和老师,当终于把程序写出来的时候,内心里又有一种说不出来的激动,我感觉这很符合大学的教育观念,是对个人自主学习能力的一个锻炼。
在接下来就是调试,虽然出了很多的错误,虽然自己也被搞的焦头烂额,但我还是很兴奋,我感觉自己就像是个侦探,一点点找线索,找到问题,再解决,每次成功都带给自己一次激动。
现在程序终于能较好的运行出来了,当然,还存在一些瑕疵,但通过这近两周的实践学习,我收获的不仅仅是这一个程序,我的自学能力,以及寻找问题解决问题的能力也得到了很好的锻炼。
参考文献:
《C++程序设计》谭浩强版清华大学出版社
2013年9月17日星期二