C语言程序设计课程设计飞机订票系统的设计.docx
《C语言程序设计课程设计飞机订票系统的设计.docx》由会员分享,可在线阅读,更多相关《C语言程序设计课程设计飞机订票系统的设计.docx(39页珍藏版)》请在冰豆网上搜索。
![C语言程序设计课程设计飞机订票系统的设计.docx](https://file1.bdocx.com/fileroot1/2023-6/24/f71423f0-d307-432c-802d-6a6ef990aa56/f71423f0-d307-432c-802d-6a6ef990aa561.gif)
C语言程序设计课程设计飞机订票系统的设计
一、需求分析
1.1系统功能需求
1.1.1程序的功能
1.系统管理员功能:
1)录入和修改航班和机票的信息:
输入航班号,输入起飞港,途径港,到达港,录入起飞时间,到达时间,飞行总共用时,可随时修改航班信息
2)输出航班的信息:
输入航班号便可输出之前输入的航班信息
2.客户需要的功能:
1)查找航班信息:
a.显示空座的数量
b.显示空座的信息
c.显示已订座的信息
d.起飞时间
2)订票预约:
查询航班信息后,提前订票预约需要的飞机票,
3)删除定票预约
4)退出系统
1.1.2主要模块流程图
1.1.3功能描述
功能序号
功能名称
功能说明
3
查询
查询空座信息,包括空座数量。
查询已定座的信息,包括起飞时间。
4
订票预约
填写个人信息:
包括乘客姓名、乘客所在单位,乘客身份证号
填写订单信息:
包括起飞城市、起飞时间、到达城市、路径城市。
5
删除订票
由于各种原因,客户不再需要订购的飞机票,客户可以删除之前定的飞机票,只需依次输入航班号,座位号,确定删除即可。
1.1.4各功能模块的功能描述
(1)显示菜单函数:
FLIGHTfltlist[5];PASSENGERpsglist[5][12];ReadFlight(fltlist);
PASSENGER*k;k=(PASSENGER*)psglist;ReadPassenger(k);
用户可以根据菜单提示,选择相关菜单。
(2)查找函数:
查询航班号函数chaxunhangban(FLIGHTfltlist[]),查询已定座信息函数chaxunyidingxinxi(PASSENGER*psglist),查空位信息函数chakongweixinxi(FLIGHTfltlist[],PASSENGER*psglist),查空位个数函数chakongweigeshu(FLIGHTfltlist[],PASSENGER*psglist)。
本算法实现查找航班信息功能。
用户可以根据航班号或起飞抵达城市查找航班信息。
如果没有该航班信息,将提示相关信息。
(3)主控函数:
voidmain(void)从数据文件中读入航班信息,用户选择某菜单,实现调用该菜单功能的函数。
(4)订票函数:
voidBook(FLIGHTfltlist[],PASSENGER*psglist)
本算法实现订票功能。
用户输入订票信息后,该算法就会根据用户输入信息查找航班信息,找到就显示订票成功相关信息,且该航班票量减去用户订的票数。
如没找到,则提供相关的其他航班信息。
该算法功能可以循环执行。
(5)退票函数:
voidtuipiao(FLIGHTfltlist[],PASSENGER*psglist)
本算法实现退票功能。
用户可以根据自己的航班型号退票。
当用户输入航班型号退票,该算法会根据用户的航班型号查找储存在以head为头节点链表中的客户信息,找到删除该客户信息节点,并输出退票成功相关信息。
否则提示没有该客户信息。
1.2输入输出的要求
1.2.1输入的要求
输入必须按以下五个步骤进行:
1)输入航班号,航班号为0到4的数;
2)输入起飞港,比如beijing;
3)输入途径港,比如tianjing;
4)输入到达港,比如shanghai;
5)输入起飞时间,比如12:
00;输入到达时间,比如14:
00,输入总共用时,比如02:
00
1.2.2输出的要求
1)输入航班号,航班号为0到4的数;
2)输出结果为之前输入的数据;
二、概要设计
2.1引言
2.1.1编写目的
在本机票预定系统项目的前一阶段,也就是需求分析阶段中,已经将系统用户对本系统的做了详细的阐述,这些用户需求已经在上一阶段中对航空公司、各旅行社为及机场的实地调研中获得,并在需求规格说明书中得到详尽得叙述及阐明。
本阶段已在系统的需求分析基础上,对机票预定系统做概要设计。
主要解决了实现该系统需求的程序模块设计问题。
包括如何把系统划分成若干个模块、决定各个模块之间的借口、模块之间传递的信息。
以及数据结构、模块结构设计等。
在以下的概要设计报告中将对在本阶段中对系统所做的所有概要设计进行详细的说明。
在下一阶段的详细设计中,程序设计员可参考此设计报告,在概要设计对机票预订系统所做的模块结构设计的基础上,对系统进行详细设计,在以后的软件测试以及软件维护阶段也可参考次说明书,以便于了解在概要设计过程中所完成的模块设计结构,或在修改时找出本阶段设计的不足或错误。
2.2模块
3.2.1模块组成
本程序由六大模块组成,分别是主函数模块,查找模块,输入信息模块,输出信息模块,订票模块,退票模块。
3.2.2模块功能
主函数模块:
本模块的主要功能是调用各子功能模块,实现系统功能。
查找模块功能:
查找模块实现信息的查找,包括显示空座的数量,订座的信息,航班起飞的时间等信息。
输入输出模块的功能:
实现数据信息的录入与输出。
订票模块功能块实现用户订票的功能。
退票模块功能:
实现用户的退票要求。
3.2.3模块的调用关系
(见4.3函数的调用关系)
2.3任务概述
2.3.1目标
实现飞机票的预定与退订等目标。
2.3.2运行环境
计算机配置均在Pentium133级别以上,客户程序应能够在Pentium级别以上,Windows98以上环境下运行。
2.3.3条件与限制
由于此系统仅仅是一个小的课程设计,尚未配给漂亮的界面,技术上也有限制。
2.4数据结构设计
typedefstruct_flight{
intm_fltno;
structDATE{
intm_year;
intm_month;
intm_day;
}m_Date;
structTIME{
intm_hour;
intm_min;
}m_start;
charm_szTo[30];
charm_szPass[30];
intm_seatno;
boolyou_wu;
charm_szName[20];
charm_szNumber[19];
}FLIGHT;
三、详细设计
3.1数据类型
根据设计要求,我们知道设计中所以用到的数据记录有航班信息和客户信息,因此要定义相关的数据类型:
航班号
起飞时间
目的地
座次号
座次订出与否的标记
订票者姓名
订票者身份证号码
int
char
char
int
Char
char
char
3.2模块分析
(1)主函数模块
本模块的主要功能是调用各子功能模块,实现系统功能。
开头定义结构体,相关头文件及宏定义。
通过switch语句进入界面函数,进而调用各功能函数。
(2)查找模块
查询模块由四个函数构成,分别为:
查询航班号函数chaxunhangban(FLIGHTfltlist[]),查询已定座信息函数chaxunyidingxinxi(PASSENGER*psglist),查空位信息函数chakongweixinxi(FLIGHTfltlist[],PASSENGER*psglist),查空位个数函数chakongweigeshu(FLIGHTfltlist[],PASSENGER*psglist),
查找模块各函数通过循环语句for语句while语句等主要语句和结构体成员psg.m_fltno,定义指针p等来实现。
(3)输入输出模块
输入模块由函数shuruFlight(FLIGHTfltlist[])实现,输出模块主要由函数shuchuFlight(FLIGHTfltlist[])实现。
(4)订票模块
订票模块由函数Book(FLIGHTfltlist[],PASSENGER*psglist)实现,定义strcpy,getchar函数通过while循环语句和结构体成员psg.m_fltno,psg.m_seatno,m_Date,psg.m_Date完成指定任务。
(5)退票模块
退票模块由函数tuipiao(FLIGHTfltlist[],PASSENGER*psglist)实现,定义指针PASSENGER*p,通过结构体,循环语句完成指定任务。
3、函数的调用关系
函数的调用关系图:
四、调试分析以及设计体会
1、测试数据
我们按要求输入整形数1,出现“请输入航班号0到5”的提示见下图:
然后按要求输入0,出现提示:
请输入起飞时间,比如12:
00
诸如此类按要求输入所测试的数据均正确,下面我们输入几组错误:
比如定票为0号票,在退票时输入1出现提示:
座位是空的
再如输入航班信息,要求输入0到5的数,输入6结果如下:
数据测试无误。
2、调试分析
4.2.1清屏问题
如开始设计的程序每执行一个模块,输出结果都会留在界面上,为此加入函数system("cls")后便得到了应有的清屏。
4.2.2errorC2143:
syntaxerror:
missing';'before'}'这个错误虽然有点低级,但却也是比较容易犯的一个错误,也不容忽视。
4.2.3errorC2440:
'=':
cannotconvertfrom'struct_iobuf*'to'int'
4.2.4errorC2065:
'fp':
undeclaredidentifier没有定义的使用系统不认识那未定义的字符。
3、心得体会
之前没有做过程设计,所以在设计的过程中遇到很大的困难。
大一第二学期才开始学c语言,陈老师是位很负责的老师,教书育人很有一套,但我的编程基础还是很薄弱,于是我查阅了一些资料。
比如在图书馆借的王敬栋主编的《课程设计案例精编》,我获益匪浅。
此次编程设计中,我采用自顶向下的设计方法。
即需求分析→总体设计→编码实现→测试→维护。
首先要了解做什么,有什么想法(总体设计),怎么做,做完后上机验证。
确定了各功能函数后,在确定所需的数据,在定义数据类型。
分模块的设计。
与同学老师交流非常重要,可以说假如没有同学老师的帮助,我是很难完成这份课程设计任务的。
可见众人拾柴火焰高是没错的,团结就是力量啊。
互帮互助,共同进步。
这里尤其要感谢做同一个课题的同学何鹏,我深刻的体会到见贤思齐是多么重要的,深刻体会到基础是多么重要。
编程时遇到错误是在所难免的,错误解决的过程是枯燥的。
必须根据系统提示的错误返回到原程序中,分析查找错误,进行订正,再运行调试,直到解决。
问题得到解决的那一刻我是兴奋的,是自豪的,是对c语言编程如此的感兴趣的。
嘿,C语言还是挺有趣的。
经过若干次与程序的“磨合”,我最终完成了设计。
实现了题目的相关要求,也对设计整体过程有了更深一层的认识,受益良多。
五、使用说明
1)从主菜单中选择需要的业务,如输入1出现
按要求输入0到4,如输入0,出现
按要求输入便可。
出现以下界面:
最后输入y或n表明是否还要继续修改。
2)从主菜单中选择需要的业务,如输入2出现
按要求输入0到4,如输入0,按要求输入,出现以下界面:
查询完毕,选择y或n表明是否还要继续查询航班信息。
3)从主菜单中选择需要的业务,如输入3出现
按要求输入1或2,如输入1,出现以下界面:
选择y或n,表明是否要继续寻找航班。
4)从提示中选择需要的业务,如上步中选择了y则步骤同3),如选择n则出现以下界面:
选择n则退出以上菜单,选择y则出现选择a—b的提示,如选择a则为:
选择y将重复以上4)步骤,我们选择n,将出现4)步骤的第一个界面,选择n则退出服务菜单,我们选择y,出现以下界面:
选择y则重复以上步骤,我们选择n将退出服务菜单。
5)从主菜单中选择需要的服务,如输入4出现
按要求输入0到4,如输入0,出现以下界面:
选择n则将退出此服务,我们选择y,出现
输入如:
2010,07,02,出现
选择y则订票成功,选择n则不订票。
6)从主菜单中选择需要的业务,如选择5,按要求输入出现以下界面:
选择y则退票成功,选择n则不退票。
7)从主菜单中选择6则退出此系统。
六、附录
1、参考书目
1.谭浩强《C程序设计》(第三版).清华大学出版社,2009。
2.王敬栋《课程设计案例精编》中国水利水电出版社,2006
2、源程序清单(带注释)
#include
#include
#include
#defineM5
#defineN12
//////////////以上是乘客数据结构。
typedefstruct_flight{/*航班数据*/
intm_fltno;/*航班号o*/
structDATE{/*订票日期*/
intm_year;
intm_month;
intm_day;
}m_Date;
structTIME{
intm_hour;
intm_min;
}m_start;/*起飞时间o*/
charm_szTo[30];/*到达港o*/
charm_szPass[30];/*途经港o*/
intm_seatno;/*座位号o*/
boolyou_wu;/*座次订出与否的标记o*/
charm_szName[20];/*姓名*/
charm_szNumber[19];/*身份证号,考虑到字母的情况,故使用字符串*/
}FLIGHT;
///////////以上是结构体。
voidReadFlight(FLIGHT*fltlist)
{
FILE*fp;
if((fp=fopen("fltlist.dat","rb"))!
=NULL)
fread(fltlist,sizeof(FLIGHT),M*N,fp);
else
{
FLIGHT*p;
p=fltlist;
inti,j;
for(i=0;i{
for(j=0;j{
p->m_fltno=i;
p->m_seatno=j;
p->you_wu=0;
p++;
}
}
fp=fopen("fltlist.dat","wb+");
fwrite(fltlist,sizeof(FLIGHT),M*N,fp);
}
fclose(fp);
}
voidshuruFlight(FLIGHT*fltlist)
{getchar();
FLIGHT*p;
FLIGHTfltlist1;
FILE*fp;
intj;
charc='y';
while(c=='y'||c=='Y')
{printf("请输入航班号(0<=航班号<%d):
",M);
inti;
scanf("%d",&i);
while(i>=M||i<0)
{printf("航班不存在,");
printf("请重新输入:
");
scanf("%d",&i);
}
printf("请输入起飞时间,比如(12:
00):
");
scanf("%d:
%d",&(fltlist1.m_start.m_hour),&(fltlist1.m_start.m_min));
printf("请输入途经港,比如(tianjing):
");
scanf("%s",fltlist1.m_szPass);
printf("请输入到达港,比如(shanghai):
");
scanf("%s",fltlist1.m_szTo);
p=fltlist;
for(j=0;j{
(p+i*N+j)->m_start.m_hour=fltlist1.m_start.m_hour;
(p+i*N+j)->m_start.m_min=fltlist1.m_start.m_min;
strcpy((p+i*N+j)->m_szPass,fltlist1.m_szPass);
strcpy((p+i*N+j)->m_szTo,fltlist1.m_szTo);
}
if((fp=fopen("fltlist.dat","wb"))==NULL)exit(0);
fwrite(fltlist,sizeof(FLIGHT),M*N,fp);
fclose(fp);
printf("修改成功,还要修改吗?
(y/n)");
getchar();
scanf("%c",&c);
}
}
///////////////////////以上是输入航班函数。
voidshuchuFlight(FLIGHT*fltlist)
{
getchar();
FLIGHT*p;
p=fltlist;
charc='y';
while(c=='y'||c=='Y')
{printf("请输入航班号(0<=航班号<%d):
",M);
inti;
scanf("%d",&i);
while(i>=M||i<0)
{printf("航班不存在,");
printf("请重新输入:
");
scanf("%d",&i);
}
printf("起飞时间:
");
printf("%d:
%d\n",(p+i*N)->m_start.m_hour,(p+i*N)->m_start.m_min);
printf("途经港:
");
printf("%s\n",(p+i*N)->m_szPass);
printf("到达港:
");
printf("%s\n",(p+i*N)->m_szTo);
printf("查询完毕,还要继续查询吗?
(y/n)");
getchar();
scanf("%c",&c);
}
}
///////////////////////以上是输入航班函数。
voidAddPassenger(FLIGHT*fltlist)
{FILE*fp;
if((fp=fopen("fltlist.dat","wb"))!
=NULL)
{fwrite(fltlist,sizeof(FLIGHT),M*N,fp);
fclose(fp);
}
else
{printf("打开文件失败!
按任意键退出。
。
。
");
getchar();
exit(0);
}
}
voidBook(FLIGHT*fltlist)
{charc='y';
FLIGHT*p;
p=fltlist;
while(c=='y'||c=='Y')
{inti;
FLIGHTfltlist1;
printf("请输入航班号:
(0<=航班号<%d)",M);
loop:
scanf("%d",&fltlist1.m_fltno);
while(fltlist1.m_fltno>=M||fltlist1.m_fltno<0)
{printf("航班不存在,");
printf("请重新输入:
");
scanf("%d",&fltlist1.m_fltno);
}
for(i=0;i{
if((p+i*N)->m_fltno==fltlist1.m_fltno)
{printf("检测未订的座位...\n请稍等...\n");
intj;
i=(p+i*N)->m_fltno;
p=fltlist;
intw=0;
for(j=0;j{
if((p+i*N+j)->you_wu==0)
{
printf("%d\t",j);
w++;
}
}
if(w==0)
{printf("座位已满!
请重新输入航班号:
");
gotoloop;
}
printf("\n以上是座位号,要订票吗?
(y/n)");
getchar();
scanf("%c",&c);
while(c=='y'||c=='Y')
{printf("\n请输入订票日期:
(yyyy,mm,dd)");
scanf("%d,%d,%d",&fltlist1.m_Date.m_year,&fltlist1.m_Date.m_month,&fltlist1.m_Date.m_day);
printf("请输入乘客姓名:
");
scanf("%s",fltlist1.m_szName);
printf("请输入身份证号:
");
scanf("%s",fltlist1.m_szNumber);
printf("\n请输入订票座位号:
(0<=座位号<%d)",N);
scanf("%d",&fltlist1.m_seatno);
for(;;)
{if(fltlist1.m_seatno<0||fltlist1.m_seatno>=N)
{printf("没有这个座位号!
请重新输入:
");
scanf("%d",&fltlist1.m_seatno);
}
elseif((p+N*(fltlist1.m_fltno)+fltlist1.m_seatno)->you_wu==1)
{printf("这个座位有人了!
请重新输入:
");
scanf("%d",&fltlist1.m_seatno);
}
elsebreak;
}
printf("确认订票吗?
(y/n)");
getchar();
scanf("%c",&c);
while(c=='y'||c=='Y')
{
strcpy((p+N*(fltlist1.m_fltno)+fltlist1.m_se