航班信息管理系统之欧阳术创编.docx
- 文档编号:27613301
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:29
- 大小:95.98KB
航班信息管理系统之欧阳术创编.docx
《航班信息管理系统之欧阳术创编.docx》由会员分享,可在线阅读,更多相关《航班信息管理系统之欧阳术创编.docx(29页珍藏版)》请在冰豆网上搜索。
航班信息管理系统之欧阳术创编
课程设计
时间:
2021.02.02
创作:
欧阳术
课程名称C语言课程设计
题目名称航班信息管理系统
学生学院物理与光电工程学院
专业班级电子科学与技术(4)班
学号
学生姓名
指导教师
2015年10月23日
一设计目的
进一步加深、巩固所学专业课程(《C语言程序设计》)的基本理论知识,理论联系实际,进一步培养自己综合分析问题和解决问题的能力。
掌握运用C语言独立地编写、调试应用程序和进行其他相关设计的技能。
二课程设计的内容
对航班信息(包括航班号、最大载客数、起飞地点、起飞时间、降落地点、降落时间、单价)和乘客信息(包括航班号、身份证号码
姓名、性别、出生年月、座位号)进行管理,包括航班信息与乘客信息的输入、输出、查询、删除、统计、退出。
假设现收集到了一个机场的所有的航班信息,要求用C语言编写一个简单的航班信息管理系统,可进行录入、查询、修改和浏览航班信息的功能;乘客提出航班号、起飞地点、起飞时间、降落地点、订票数等订票要求,根据事先保存的航班数据决定乘客能否订票。
只有全部满足了乘客的订票要求并且所订航班有足够的未订座位之后才能完成订票处理,并且修改该航班的未订座位数(每个航班的未订座位数的初始值就是该航班的最大载客数),否则,订票失败,并且给出不能订票的原因。
三课程设计的要求与数据
1、对航班信息(包括航班号、最大载客数、起飞地点、起飞时间、降落地点、降落时间、单价)和乘客信息(包括航班号、身份证号码、姓名、性别、出生年月、座位号)进行管理,包括航班信息与乘客信息的输入、输出、查询、删除、统计、退出;
2、航班信息内容较多,要求设计的管理系统能够完成以下功能:
(1)、航班信息录入功能:
航班信息用文件保存,可以一次完成若干条记录的输入;
(2)、航班信息浏览功能:
完成全部航班记录的显示;
(3)、查询功能:
完成按航班号或按目的地查找航班记录,并显示;
(4)、航班信息的修改:
按航班号进行修改某个航班的信息;
(5)、航班信息的删除:
按航班号进行删除某个航班的信息;
(6)、订票处理:
按乘客的订票方式完成航班订票处理;
(7)、应提供一个界面来调节各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
四课程设计应完成的工作
1、编写算法;
2、算法测试,并有具体的测试结果和结果分析;
3、撰写课程设计报告,内容包括:
(1)封面扉页
(2)设计任务书
(3)目录
(4)总体设计方案(包括流程图)
(5)使用说明及运行实例(包括界面)
(6)成员设计内容简介
(7)项目源代码(注意注释的使用)
(8)指导老师评语
五总体设计
1、功能1:
航班信息的输入并对输入的内容进行错误检查;
2、功能2:
航班信息的显示浏览;
3、功能3:
航班信息的修改并对修改的内容进行错误检查;
4、功能4:
航班信息的删除;
5、功能5:
航班信息的查询;
6、功能6:
乘客信息输入并对输入的内容进行错误检查;
7、功能7:
订票处理检查是否还有空座位;
8、退出系统。
六详细设计
系统的整体框图如图1所示:
1、打开存放着航班信息与乘客信息的文件:
分别打开航班文件与乘客文件,存放在链表中,供后续函数调用;可用函数voidread_psg_data(void)、voidread_pla_data(void)来实现此操作。
这是两个无参函数,用来读取存储在文件中的信息当到达文件尾时关闭文件并退出函数,带回指向链表头的一个指针和指向链表尾的指针。
算法:
fopen()函数打开文件后读取一定长度的信息存到malloc()分配的内存地址空间,声明两个全局指针pla_head和psg_head,每读取一组数据就将其地址存放在pla1节点中,并链接到之前列表的尾端。
N-S流程图如图2所示(以读取航班信息为例):
fp=fopen(文件)
while(不到文件尾)
malloc()分配内存pla1是否成功
否是
fread()读取一定长度字节数据到pla1
pla1置为NULL
pla_head是否为空
pla_end->next=pla1;pla_head=pla1;
pla_end=pla1;pla_end=pla1;
pla_end_next置为NULL
读取成功标志位置为0
关闭文件
图2打开文件读取数据流程图
2、输入航班数据与乘客数据(以航班数据为例):
输入信息包括航班号、最大载客数、起飞地点等相关信息;用函数voidadd_pla_info(void),函数再调用intcheck_pla_num(PLA*pla)、voidcheck_time(int*hour,int*min)、voidcheck_string(charname[20])分别进行航班号、输入的时间、输入的地点等信息的正确性验证,从源头避免出错。
算法:
打开待保存输入信息的文件,在一个while循环里面分配内存并输入数据,对输入的数据进行正确性验证,如果出错则会提示重新输入,正确输入完一个航班后将数据保存到链表尾端并将新的航班数据写入打开的文件中。
N-S流程图如图3所示(以读取航班信息为例):
fp=fopen(文件)
while(继续输入)
malloc()分配内存pla是否成功
输入航班号
航班记录已存在?
输入载客数
是否数字且在正常范围
输入起飞时间
时间格式正确?
输入降落地点
地点格式正确?
输入降落时间
时间格式正确?
输入单价
是否数字?
pla_head为空?
pla_end->next=pla;pla_head=pla;
pla_end=pla;pla_end=pla;
保存新航班数据到文件
图3输入航班数据流程图
3、显示浏览航班信息:
显示信息包括航班号、最大载客数、起飞地点、起飞时间、降落地点、降落时间、单价、剩余票数,调用了时间函数localtime()获取当前系统时间;用函数voiddisplay_pla_info(void)完成此操作。
算法:
把读取文件后产生的链表按照一定的格式输出到屏幕上。
N-S流程图如图4所示:
将链表头赋给航班结构体局部变量
while(未到链表尾)
printf(pla1);
pla1=pla1->next;
图4显示航班信息流程图
4、删除航班信息:
删除一个航班的所有信息,调用函数voiddelete_pla_data(void)完成是删除操作。
算法:
显示所有航班信息,要求用户输入需删除的航班号,在while循环中遍历链表,找到数据则显示出来,再次要求用户确认删除,若删除,该数据的下一条数据地址将会取代当前的数据地址,即从链表中删除了,调用save_pla_info()保存新的链表;若没有找到航班则要求用户重新输入。
N-S流程图如图5所示:
输入航班号
否
是
到达链表尾?
是
否
提示找不到航班,重新输入
输入的航班号与pla1_num相同?
是
否
pla2=pla1;输出该航班信息
否
是
pla1=pla1->next;确认删除?
返回菜单
删除的航班是链表头?
pla_head=pla1->next;pla2->next=pla1->next;
释放pla1;
保存文件标志位置位;
调用save_pla_info()保存新的链表;
提示删除成功;
返回菜单
图5删除航班信息流程图
5、修改航班信息:
修改一个航班的信息,调用voidmodify_data(void)实现此操作。
算法:
显示所有航班信息,用户输入一个航班号,在while循环中遍历链表,找到要修改的数据则显示出来,再次要求用户确认修改,若修改,则开始输入信息;若没有找到航班则返回菜单。
这里用到了添加航班时的信息检查函数。
N-S流程图如图6所示:
输入航班号
while(未到链表尾)
输入的航班号与pla1_num相同?
pla2=pla1;输出该航班信息
pla1=pla1->next;确认修改?
输入新的航班号、载客数、起飞时间、降落地点、降落时间、单价,并检查每一项的格式是否符合要求
提示修改成功
返回菜单
提示未找到该航班并返回菜单
图6修改航班信息流程图
6、查询航班信息:
查询信息时分为航班号查询与目的地查询,用户可输入航班号或目的地进行查询并订票,调用voidsearch(void)函数,内部再调用voidsearch_pla_num(void)和voidsearch_destination(void)两个函数实现此操作。
算法:
进入查询后显示另一个菜单要求用户选择相应的查询条件。
按航班号查询时,用户输入一个航班号,在while循环中遍历链表,找到要修改的数据则显示出来,询问用户是否要订票,若订票则会进入订票函数buy_check();若不订票则返回菜单;若没有找到相应的航班信息则返回上一层菜单。
N-S流程图如图7所示:
显示菜单选择程序
选择相应的操作
输入航班号输入目的地
while(不到链表尾)while(不到链表尾)
航班号相同?
目的地相同?
pla2=pla1;显示航班信息pla2=pla1;显示航班信息
pla1=pla1->next;询问是否订票pla1=pla1->next;进入search_pla_num()
执行订票流程询问是否订票
未找到相应的航班信息未找到相应的航班信息
图7查询航班信息流程图
7、订票处理:
进入订票时,会调用search_pla_num()函数完成操作。
算法:
调用display_pla_info()输出所有航班信息,然后调用search_pla_num()和buy_check()订票并完成乘客身份信息的输入与格式检验。
N-S流程图如图8所示:
display_pla_info()显示所有航班信息
提示用户输入相应的航班号
while(未到链表尾)
航班号相同?
pla2=pla1;显示信息
pla1=pla1->next;调用buy_check()检查该航班已满人数?
调用buy_ticket()函数完成乘客信息的录入
(包括姓名、身份证号、性别等信息),并
对正确性进行检查,然后把信息存放到乘客
文件中。
提示订票成功并返回
提示未找到航班信息后返回菜单
8、退出系统:
用户在主菜单界面时按照提示即可退出系统,调用一个exit()函数来实现。
七调试分析
7.1源程序及注释
/*航班信息管理系统*/
#include
#include
#include
#include
#include
#include
#defineLEN1sizeof(PSG)
#defineLENsizeof(PLA)
#defineFORMAT"%3d%7d%5d%7d:
%2d%12s%8d:
%2d%6s%8d\n"
#defineINFOpla_num,pla1->p_num,pla1->l_num,pla1->up_hour,pla1->up_min,pla1->addr_dst,\
pla1->down_hour,pla1->down_min,pla1->price,(pla1->l_num-pla1->buy_num)
typedefstructpassenger
{
intp_num;//航班号
charid_num[20];//身份证号
charname[20];
charsex[5];
intyear_born;
chardot;
intmonth_born;
intsite_num;
structpassenger*next;//下一个乘客
}PSG;
typedefstructplane
{
intp_num;//航班号
intl_num;//载客数
intup_hour;//起飞时
intup_min;//起飞分
charaddr_dst[20];//降落地点
intdown_hour;//降落时
intdown_min;//降落分
charprice[10];//单价
intbuy_num;//已订票数
structplane*next;//下一航班
structPSG*first;//第一位乘客
}PLA;
PSG*psg_head=NULL,*psg_end=NULL;//乘客信息链表头指针和尾指针
PLA*pla_head=NULL,*pla_end=NULL;//航班信息链表头指针和尾指针
chargfirst,pfirst,gsave,psave;//判断标志
intbflag=0;//订票成功标志
/*保存乘客数据*/
voidsave_psg_info(void)
{
FILE*fd;
PSG*psg1;
if(0==psave)
return;
if((fd=fopen("passenger.dat","wb"))==NULL){
printf("\n无法打开文件passenger.dat!
");
getch();
return;
}
psg1=psg_head;
while(psg1){
if(fwrite(psg1,LEN1,1,fd)!
=1){
printf("\n写入数据出错!
");
fclose(fd);
getch();
return;
}
psg1=psg1->next;
}
psave=0;
fclose(fd);
}
/*保存航班数据*/
voidsave_pla_info(void)
{
FILE*fp;
PLA*pla1;
if(0==gsave)
return;
if((fp=fopen("airplanes.dat","wb"))==NULL){
printf("\n无法打开文件airplanes.dat!
");
getch();
return;
}
pla1=pla_head;
while(pla1){
if(fwrite(pla1,LEN,1,fp)!
=1){
printf("\n写入数据出错!
");
fclose(fp);
getch();
return;
}
pla1=pla1->next;
}
gsave=0;
fclose(fp);
}
voidmake_line(charch,inti)
{
while(i--)
putchar(ch);
putchar('\n');
}
/*检查时间输入正确*/
voidcheck_time(int*hour,int*min)
{
inti;
for(i=1;i!
=2;i=1){
if((i=scanf("%d:
%d",hour,min))!
=2){
printf("输入格式错误!
请以\"小时:
分钟\"格式重新输入:
");
fflush(stdin);
continue;
}
if(!
(*hour<24&&*hour>=0)){
printf("小时不在正常范围!
请重新输入:
");
fflush(stdin);
continue;
}
if(!
(*min<60&&*min>=0)){
printf("分钟不在正常范围!
请重新输入:
");
fflush(stdin);
continue;
}
return;
}
}
/*显示航班信息*/
voiddisplay_pla_info(void)
{
PLA*pla1;
time_tnowtime=time(0);
structtm*timeinfo;
chartmp[64];
intpla_num=0;//记录航班信息数目
timeinfo=localtime(&nowtime);
/*显示时间*/
system("cls");
strftime(tmp,sizeof(tmp),"现在是%z%Y-%m-%d%X%A",timeinfo);
puts(tmp);
pla1=pla_head;
printf("\n序号航班号载客数起飞时间降落地点降落时间单价剩余票数\n");
make_line('_',70);
while(pla1)
{
pla_num++;
printf(FORMAT,INFO);
make_line('_',70);
pla1=pla1->next;
}
}
/*删除数据*/
voiddelete_pla_data(void)
{
intnum;
chardel_pla;
PLA*pla1,*pla2;
system("cls");
display_pla_info();
del_again:
printf("请输入要删除的航班号(非数字键返回上层:
");
fflush(stdin);
if(!
(scanf("%d",&num)))
return;
pla1=pla_head;
pla2=pla1;
while(pla1){
if(num==pla1->p_num){
printf("\n航班号载客数起飞时间降落地点降落时间单价\n");
make_line('_',50);
printf("%4d%6d%7d:
%2d%13s%7d:
%2d%6s\n",pla1->p_num,pla1->l_num,\
pla1->up_hour,pla1->up_min,pla1->addr_dst,pla1->down_hour,pla1->down_min,pla1->price);
make_line('_',50);
printf("警告!
您确定要删除该航班吗?
(y/n)");
fflush(stdin);
del_pla=getchar();
if(del_pla!
='y'&&del_pla!
='Y')
return;
if(pla_head==pla1)
pla_head=pla1->next;
else
pla2->next=pla1->next;
free(pla1);
gsave=1;
save_pla_info();
printf("删除成功!
任意键返回\n");
getch();
return;
}
else{
pla2=pla1;
pla1=pla1->next;
}
}
printf("\n未找到航班信息!
\n");
gotodel_again;
return;
}
/*检查字符串*/
voidcheck_string(charname[20])
{
inti,flag=0;
charcheck[20];
for(i=0;i<20;i++)
check[i]=0;
fflush(stdin);
while(scanf("%s",check)){
fflush(stdin);
for(i=0;i<20;i++){
if(check[i]<65&&check[i]>32||check[i]<97&&check[i]>90||check[i]<=127&&check[i]>122){
flag=1;
break;
}
}
if(flag==1){
for(i=0;i<20;i++)
check[i]=0;
flag=0;
printf("\n输入出错,请重新输入:
");
}
else{
strncpy(name,check,20);
break;
}
}
}
/*订票处理*/
voidbuy_ticket(PLA*pla1)
{
inti;
FILE*fd;
PSG*psg1=NULL;
if((fd=fopen("passenger.dat","a+"))==NULL){
printf("打开文件passenger.dat出错!
\n");
getch();
return;
}
psg1=(PSG*)malloc(LEN1);
if(psg1==NULL){
printf("分配内存失败,按任意键退出!
\n");
getch();
return;
}
system("cls");
psg1->p_num=pla1->p_num;//航班号
psg1->site_num=pla1->buy_num;//座位号
printf("警告:
请勿恶意输入,否则将导致您订票失败!
\n");
printf("请输入您的相关信息:
\n");
fflush(stdin);
make_line('_',70);
printf("身份证号:
");
id_again:
for(i=0;i<20;i++)
psg1->id_num[i]=0;
scanf("%s",psg1->id_num);
if(psg1->id_num[17]==0||psg1->id_num[18]!
=0){
printf("\n您输入的身份证号码长度有误,请检查后重新输入:
");
gotoid_again;
}
for(i=14;i<17;i++){
if(psg1->id_num[i]<65&&psg1->id_num[i]>57||psg1->id_num[i]<48||psg1->id_num[i]<97&&\
psg1->id_num[i]>90||psg1->id_num[i]<=127&&psg1->id_num[i]>122){
printf("\n您输入的身份证号码有误,请检查后重新输入:
");
gotoid_again;
}
}
for(i=0;i<14;i++){
if(!
(psg1->id_num[i]<='9'&&psg1->id_num[i]>='0')){
printf("\n您输入的身份证号码有误,请检查后重新输入:
");
gotoid_again;
}
}
printf("姓名:
");
check_string(psg1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 航班信息 管理 系统 欧阳 创编