C语言航班订票管理系统设计报告.docx
《C语言航班订票管理系统设计报告.docx》由会员分享,可在线阅读,更多相关《C语言航班订票管理系统设计报告.docx(27页珍藏版)》请在冰豆网上搜索。
C语言航班订票管理系统设计报告
设计任务书
编写一个飞机订票系统的程序,使该系统能够实现对航班信息的录入、浏览、排序、查询以及订票、退票的功能。
小组任务分配:
小组负责人:
负责总体设计(包括总体设计流程图、模块函数原型接口设计);
负责订票函数模块、退票函数模块编写。
组员:
负责文件的输入、文件读取、文件输出函数模块的编写。
组员:
负责查询、修改、删除函数模块的编写。
1、需求分析………………………………………………4
2、功能描述………………………………………………4
3、总体设计………………………………………………6
4、调试分析………………………………………………7
5、测试结果………………………………………………7
6、用户使用说明………………………………………12
7、课程设计心得……………………………………………12
8、附录(源代码)…………………………………………13
需求分析:
用数组或链表数据结构完成一个航班信息管理系统,此系统的具体功能要求如下:
(1)航班信息录入功能
1)用户从键盘输入每次航班的信息:
航班号、起始站、终点站、起飞时间、机票数、票价。
2)可添加一个或多个航班信息到当前编辑的数据中。
3)可修改一个或多个航班信息。
4)可删除一个或多个航班信息。
(2)文件保存功能
1)航班信息每一机场存为一个数据文件,数据文件可在程序中打开、编辑和重新保存。
2)用户输入航班信息可随时保存数据文件。
(3)文件打开功能
1)程序只能对当前打开的数据文件进行编辑。
(4)查询功能
1)浏览所有航班信息;
2)按航班号查询航班信息;
3)按终点站查询航班信息;
4)按航线查询航班信息;
(5)报表输出功能
1)按航班编号输出一个航空公司的航班信息:
航班号、起始站、终点站、起飞时间、机票数、票价,到屏幕和文件。
注:
以上功能以菜单形式供用户使用,并有一定的容错功能。
一,功能描述
模块基本介绍:
1.用户输入模块
在此模块中,用户将根据菜单提示结合自己的需求输入一个0~7的值,来实现一定的功能。
2.航班信息录入模块
此模块可以让用户从键盘输入每个航班的信息:
航班号、起始站、终点站、起飞时间、机票数、票价。
用户可插入一个或多个航班信息到当前编辑的数据中。
用户可删除一个或多个航班信息。
3.文件保存功能模块
用户在确定以录入的信息无误之后,可以将航班信息存为一个数据文件。
用户输入的航班信息可随时保存数据文件。
4.文件打开功能模块
用户可以用此模块将数据文件在程序中打开、编辑,程序只能对当前打开的数据文件进行编辑。
5.查询功能模块
在此模块里,用户可实现以下操作:
1.浏览所有航班信息;2按航班号查询航班信息;3.按终点站查询航班信息;4.按航线查询航班信息;
6.报表输出功能模块
在此模块中,用户可以浏览所有航班的信息,或者可以按航班编号输出一个航空公司航班信息:
航班号、起始站、终点站、起飞时间、机票数、票价,到屏幕和文件。
模块图
三、调试分析
调试是整个程序编写过程中十分重要也是很困难的一部分,在这个过程中用了不少的时间进行程序的调试,在调试过程中遇到的相关问题如下:
一、语法错误
1、语句的最后忘记了加上“;”,使程序发生错误。
2、把“<<”与“>>”写反,以及字符与字符串的操作问题,这些是比较简单的错误,很容易分辨出来,并改正之。
3、函数的返回值问题,也是比较容易找出并解决的问题。
二、逻辑错误
1、文件的写入与读出,刚开始对文件的操作不太明白,一致不能很好的操作文件,其中最大的问题是对已存在的文件读取问题,通过“浏览航班信息”将数据从文件中读取,可是在使用过程中总是出现读出错误,出现乱码。
2、内存的分配问题,这也是困惑了我好久的问题。
对于我们初学者来说对内存的分配和释放问题是比较抽象和模糊的难题,本来使用链表的方式存储数据,然而待到排序时出现了交换数据困难的问题,以及分配空间繁琐释放空间不及时的问题,造成空间浪费使得程序运行效率低的问题。
因此最后采用了顺序存储记录的方式,这样就能改变前述问题。
整个调试过程中主要是这么几个问题,其余的是一些小问题,很容易的就调试出来了。
四、测试结果
1、主界面
2、输入航班信息
3、浏览航班信息
4、修改航班信息
5、查找航班信息
6、删除航班信息
7、订票
8、退票
9、退出程序
五、用户使用说明
用户运行程序后进入系统主界面,在主界面用户可以打开或者新建数据文件。
用户新建或者打开文件要符合操作系统的要求,如果用户打开不存在的文件,那么系统将提示错误,并对其进行相关操作。
系统默认sun.dat及ru.dat文件储存信息。
本系统同时只能对一个数据文件进行相关操作,不能同时打开多个数据文件,其类似于单用户操作系统。
当用户指定当前文件后可对其进行显示,输入,删除,修改等相关功能。
用户在操作过程中可随时对当前文件进行保存到文件操作,以防止修改的数据丢失。
操作完当前文件后,用户可以关闭该文件,在不退出本系统的前提下另行打开或者新建数据文件对其进行相关操作。
六、课程设计心得
对于C++初学者来说,这一抽象的编程语言的确有些晦涩难懂,尤其是其中的一些细节部分,在上机实验时稍有不慎就会出错。
好在C++实践编程给我们提供了一个很好的运用所学知识来提高自己编程能力的机会,编程过程中需要的是细心和耐心,另外,完备和熟络的基础知识也很重要。
一个较为复杂的程序通常需要串联多种语句、定义多个变量,这样就很容易出现问题,包括一些语法错误和运行错误,所以调试很重要,每当出现的结果和预想的不一样或是效果不是很好时就需要调试了。
调试过程是一个完善程序的过程,也是一个提升自己编程能力的过程,在不断的检查与修改中,自己的编程能力才会不断提升,只有这样,最终的程序才会趋于简单、正确,避免冗长、复杂。
对于这次编程实践,我总结了以下心得:
1、不懂的部分多与小组成员交流,上网查资料;
2、把复杂程序按照功能进行分解,分解成一个个模块,一个模块一个功能,避免大程序;
3、多写注释,当遇到错误时可以方便的找出问题所在;
4、要记得判断可能出现运行异常的地方。
总之,实践是检验真知的唯一方法,它带给我们的将是付出后成功的喜悦以及宝贵的经验。
七、附录
源代码:
#include
#include
#include
usingnamespacestd;
#defineN1000
structair
{
intnum;
charstart[20];
charover[20];
chartime[10];
intcount;
charcost[20];
}s[N];
inti;
intm=0;
#definePRINT"%-d%12s%12s%13s%12d%12s%\n",s[i].num,s[i].start,s[i].over,s[i].time,s[i].count,s[i].cost
voidmenu();//主界面菜单
voidfanhui();//返回上一级
voidfn1();//管理员操作
voidfn2();//客户操作
voidinput();//输入信息
voidprint();//输出信息
voidsave();//保存信息
voidread();//读取信息
voidsearch();//查找信息
voidshanchu();//删除信息
voiddingpiao();//订票信息
voidtuipiao();//退票信息
voidxiugai();//修改信息
voidmain()
{
intj;
cout<<"★***订票系统***★"<cout<<"****************************************************************************"<do
{
cout<<"1.输入航班信息2.浏览航班信息"<<<"O(∩_∩)O3.修改航班信息4.查找航班信息"<<<"(^_^)5.删除航班信息6.订票"<<<"7.退票0.退出"<cout<<"****************************************************************************"<cout<<"请在0-7中选择+Enter结束:
"<cin>>j;
if(j<0||j>7)j=0;
switch(j)
{
case1:
input();
break;
case2:
print();
break;
case3:
xiugai();
break;
case4:
search();
break;
case5:
shanchu();
break;
case6:
dingpiao();
break;
case7:
tuipiao();
break;
case0:
;
break;
}
}while(j!
=0);
cout<<"(^_^)/~~"<"<}
voidinput()
{
inty;
cout<<"请依次输入航班信息:
"<cout<<"*****************************************************************************"<for(i=0;i{
cout<<"请输入航班号:
"<cin>>s[i].num;
cout<<"请输入起始站:
"<cin>>s[i].start;
cout<<"请输入终点站:
"<cin>>s[i].over;
cout<<"请输入时间:
"<cin>>s[i].time;
cout<<"请输入机票数:
"<cin>>s[i].count;
cout<<"请输入票价:
"<cin>>s[i].cost;
m++;
cout<<"第"<"<<'\n'<<"按1继续,按0结束";
cin>>y;
if(y==0)
{
save();
print();
break;
}
}
}
voidsave()
{
FILE*fp,*fp1;
if((fp=fopen("sun.dat","wb"))==NULL)//打开文件并判断是否出错
{
cout<<"创建文件失败!
"<getchar();
return;
}
if((fp1=fopen("ru.dat","wb"))==NULL)
{
cout<<"创建文件失败!
"<getchar();
return;
}
for(i=0;iif(fwrite(&s[i],sizeof(structair),1,fp)==0)//向文件写入数据,并判断是否出错
cout<<"向文件输入数据失败!
"<fprintf(fp1,"%d",m);
fclose(fp);
fclose(fp1);
}
voidread()
{
FILE*fp,*fp1;
if((fp=fopen("sun.dat","rb"))==NULL)
{
cout<<"出错,请检查文件是否存在,按任意键返回菜单";
getchar();
}
if((fp1=fopen("ru.dat","rb"))==NULL)
{
cout<<"创建文件失败!
"<getchar();
return;
}
fscanf(fp1,"%d",&m);
fclose(fp1);
for(i=0;i{
fread(&s[i],sizeof(air),1,fp);//从文件中读取信息
}
fclose(fp);
}
voidprint()
{
charw[10];
read();
cout<<"航班号起始站终点站时间机票数票价"<for(i=0;i{
printf(PRINT);
}
cout<<"请按任意键+Enter结束返回上层菜单:
"<cin>>w;
}
voidsearch()
{
charname1[20];
charname2[20];
charii[10];
intn,no;
do
{
cout<<"请选择查找方式:
"<cout<<"1.按航班号查找"<<<"2.按终点站查找"<<<"3.按航线查找"<<<"0.返回"<cout<<"请在0-3中选择:
"<<<"按其他键+Enter结束返回主菜单:
"<cin>>n;
if(n==0)
break;
switch(n)
{
case1:
cout<<"请输入航班号:
"<cin>>no;
break;
case2:
cout<<"请输入终点站名称:
"<cin>>name2;
break;
case3:
cout<<"请输入起始站名称:
"<cin>>name1;
cout<<"请输入终点站名称:
"<cin>>name2;
break;
}
read();
for(i=0;i{
if(strcmp(s[i].over,name1)==0||strcmp(s[i].over,name2)==0)
{
cout<"<cout<<"航班号起始站终点站时间机票数票价"<printf(PRINT);
break;
}
if(s[i].num==no)//按航班号判断输出条件
{
cout<"<cout<<"航班号起始站终点站时间机票数票价"<printf(PRINT);
break;
}
}
no=0;//将航班号赋值为
cout<<"查找完毕:
"<<<"是否继续查找?
请键入yes或no以回车键结束"<cin>>ii;
}while(strcmp(ii,"yes")==0);
}
voidshanchu()
{
charname1[20];
charname2[20];
charii[10];
intno,n;
do
{
cout<<"请选择删除方式+Enter结束:
"<cout<<"*1.按航班号删除"<<<"*2.按航线删除"<<<"*0.返回"<cout<<"请在0-2中选择+Enter结束:
"<cin>>n;
if(n==0)
break;
switch(n)
{
case1:
cout<<"请输入航班号:
"<cin>>no;
read();
break;
case2:
cout<<"请输入起始站名称:
"<cin>>name1;
cout<<"请输入终点站名称:
"<cin>>name2;
read();
break;
}
for(i=0;i{
if(s[i].num==no||strcmp(s[i].start,name1)==0&&strcmp(s[i].over,name2)==0)//判断输入信息是否存在
{
s[i]=s[m-1];
m--;
}
}
cout<<"查找完毕"<cout<<"是否继续删除"<cout<<"请键入yes或no+Enter结束"<cin>>ii;
save();
if(!
strcmp(ii,"yes"))
cout<<"请按任意键+Enter结束返回上层菜单:
"<break;
}while(n!
=1&&n!
=2&&n!
=3&&n!
=4&&n!
=0);
}
voiddingpiao()
{
intn;
chara[10];
do
{
search();
cout<<"请输入您要订的机票数+Enter结束:
"<cin>>n;
if(n<0)
{
cout<<"请输入有效的机票数!
"<break;
}
if(s[i].count<=0&&n>=0)//判断是否出错
{
cout<<"对不起,此次航班已无余票。
"<break;
}
if(s[i].count!
=0&&s[i].count>=n)//判断是否出错
{
s[i].count=s[i].count-n;
save();
cout<<"订票成功!
"<break;
}
if(s[i].count0)//判断是否出错
{
cout<<"请输入有效的机票数!
"<break;
}
cout<<"是否继续?
请输入yes或no+Enter结束:
"<cin>>a;
}while(!
strcmp(a,"yes"));
}
voidtuipiao()
{
intn;
chara[10];
do
{
search();
cout<<"请输入您要退的机票数目:
"<cin>>n;
if(n<0)
cout<<"请输入有效的机票数!
"<s[i].count=s[i].count+n;
save();
cout<<"退票成功!
"<cout<<"是否继续?
请键入yes或no+Enter结束:
"<cin>>a;
}while(!
strcmp(a,"yes"));
getchar();
}
voidxiugai()
{
structxiu
{
intno;
charname1[20];
charname2[20];
chartime[20];
intcount;
charcost[20];
}x[1];
charj[10];
intn;
read();
do
{
cout<<"请选择修改方式:
"<<<"*1,按航班号修改:
"<<<"*2,按航线修改:
"<cout<<"请在---2中修改+Enter结束:
"<cin>>n;
switch(n)
{
case1:
cout<<"请输入航班号:
"<cin>>x[0].no;
break;
case2:
cout<<"请输入起始站:
"<cin>>x[0].name1;
cout<<"请输入终点站:
"<cin>>x[0].name2;
break;
}
for(i=0;i{
if(strcmp(s[i].over,x[0].name1)==0&&strcmp(s[i].over,x[0].name2)==0)//判断输出条件
{
cout<<"航班号起始站终点站时间机票数票价"<printf(PRINT);
break;
}
if(s[i].num==x[0].no)//判断输出条件
{
cout<<"航班号起始站终点站时间机票数票价"<printf(PRINT);
break;
}
}
x[0].no=0;//将结构体中的号为零
cout<<"请输入新航班号、起始站、终点站、时间、机票数、票价:
"<cin>>x[0].no>>x[0].name1>>x[0].name2>>x[0].time>>x[0].count>>x[0].cost;
s[i].num=x[0].no;//替换航班号
strcpy(s[i].start,x[0].name1);//替换其始站
strcpy(s[i].over,x[0].name2);//替换终点站
strcpy(s[i].time,x[0].time);//替换时间
s[i].count=x[0].count;//替换机票数
strcpy(s[i].cost,x[0].cost);//
save();
cout<<"是否继续?
请键入yes或no+Enter结束:
"<cin>>j;
}while(strcmp(j,"yes")==0);
}