📄 飞机订票系统.c
字号:
/***************************************************************
飞机订票系统设计:
要求:
假定民航机场共有n个航班,每个航班有一航班号、确定的航线(起始站、终点站)、
确定的飞行时间(星期几)和一定的成员订额。试设计一飞机订票系统,使之能提供下列服务:
1、航班信息录入功能(航班信息用文件保存)
2、航班信息浏览功能
3、查询航线:(至少一种查询方式)
1按航班号查询
2按起点站查询
3按终点站查询
4按飞行时间查询
***************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define DATA "flight.dat" //数据库
#define N 100 //最大数据量
#define PAGE 10 //浏览一次显示数据量
#define PRHEAD printf("\n 航班号 | 起始站 | 终点站 |飞行时间|预售票总数|已售票数\n")
#define PRINFO(i) printf("%8s |%10s |%10s |%5d |%7d |%5d \n",i.num,i.start,i.finish,i.time,i.ticket,i.buy_num)
#define LEN sizeof(FLIGHT)
typedef struct //定义航班结构体数组
{
char num[7]; //航班号:国内为6位,例如CZ3151;国外航班为5位BA038
char start[20]; //起始站
char finish[20]; //终点站
int time; //飞行时间:1-7分别表示星期一到星期天
int ticket; //预售票总数
int buy_num; //已售票数
}FLIGHT;
FLIGHT fltinfo[N];
int n;
/*********************定义模块******************/
int msgbox(char *); //模拟msgbox确定框
void modify(FLIGHT *); //修改数据子函数
void input(FLIGHT *); //航班信息录入功能模块
void save(char *,FLIGHT *,int); //航班信息保存功能模块
int read(char *,FLIGHT *); //航班信息读取功能模块
void list(FLIGHT *,int); //航班信息浏览功能模块
void searth(FLIGHT *); //航班信息查询功能模块
int main()
{
if(n=read(DATA,fltinfo))//读取航班数据
{
printf("\n\n\t\t共读取%d个已有航班数据\n",n);
}
else
{
printf(
"\n\n\t\t欢迎您第一次进入本飞机订票系统\n"
"\t\t该程序由陈秋炜制作\n");
}
getch();
while(1)
{
//显示主界面
system("cls");
printf(
"------------------------------"
"飞机订票系统"
"-------------------------------\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t1.信息录入\t\t\t\t|\n"
"|\t\t\t\t2.信息浏览\t\t\t\t|\n"
"|\t\t\t\t3.信息查询\t\t\t\t|\n"
"|\t\t\t\t4.保存数据库\t\t\t\t|\n"
"|\t\t\t\t0.离开系统\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"-------------------------------"
"请选择(0-4)"
"-------------------------------\n"
);
switch(getch())//获取键盘ascii码值
{
case '1':
input(fltinfo);break;
case '2':
list(fltinfo,n);break;
case '3':
searth(fltinfo);break;
case '4':
save(DATA,fltinfo,n);break;
case '0':
if(msgbox("退出前是否保存数据库?"))
save(DATA,fltinfo,n);
exit(0);break;
default:break;
}
}
return 0;
}
/*********************************************
航班数据录入模块
提供数据全部录入及数据追加功能
并具有菜单。
********************************************/
void input(FLIGHT *flt)
{
int i,j;
FLIGHT *p=(FLIGHT *)malloc(LEN);
while(1)
{
//显示录入界面
system("cls");
printf(
"------------------------------"
"信息录入功能"
"-------------------------------\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t1.信息录入(!覆盖原有信息!)\t\t\t|\n"
"|\t\t\t2.追加航班数据\t\t\t\t\t|\n"
"|\t\t\t0.返回主菜单\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"-------------------------------"
"请选择(0-2.)"
"-------------------------------\n"
);
switch(getch())//获取键盘ascii码值
{
case '1':
{
printf("\n\n\t请输入航班数量(小于%d)(0取消操作):",N);
while(scanf("%d",&j)!=1)
{
flushall();
printf("\t输入出错,重新输入:");
}
system("cls");
for(i=0;i<j;i++)
{
flushall();
printf("\n\n\t当前输入数据:%d/%d\n\t可以直接全部输入",i+1,j);
modify(p);
if(msgbox("数据是否写入?"))flt[i]=*p;
else i--;
system("cls");
n=j;
}
free(p);
}
break;
case '2':
{
if(msgbox("确定追加新航班数据"))
{
n++;
if(n>N)
{
printf("程序数据量已经超过%d",N);
break;
}
printf("\n\n\t当前输入数据:%d/%d\n\t可以直接全部输入",n,n);
modify(p);
if(msgbox("\t\t数据是否写入?"))memcpy(&flt[n-1],p,LEN);
}
}
break;
case '0':return;break;
default:break;
}
system("cls");
}
}
/*********************************************
文件读取写入模块
********************************************/
void save(char *file,FLIGHT *from,int n)
{
FILE *fp;
if((fp=fopen(file,"wb"))==NULL)//打开文件
{
printf("\n\t\t保存失败。文件可能被写保护!\n ",file);//打印出错提示
getch();
return;
}
fwrite(&from[0],LEN,n,fp);
printf("\n\t\t保存到%s,共数据%d个",file,n);
getch();
fclose(fp);//关闭文件
}
int read(char *file,FLIGHT *to)
{
int i;
FILE *fp;
if((fp=fopen(file,"rb"))==NULL)//打开文件
{
return 0;
}
for(i=0;!feof(fp);i++)
{
fread(&to[i],LEN,1,fp);
}
fclose(fp);//关闭文件
return (i-1);//最后读取为文件结束标志,故返回i-1;
}
/*********************************************
航班数据浏览模块
分页显示数据,每页显示总数由宏PAGE控制
********************************************/
void list(FLIGHT *flt,int n)
{
int i,page;
system("cls");
PRHEAD;
for(i=0,page=1;i<n;)
{
//每页打印头
if(i!=0&&i%PAGE==0)
{
system("cls");
PRHEAD;
}
PRINFO(flt[i]);
if(++i%PAGE==0&&i!=n)
{
printf("当前浏览第%d页。",page++);
getch();
}
}
printf("当前浏览第%d页。",page++);
printf("\n浏览结束,点击任意键进入主菜单!");
getch();
}
/*********************************************
航班数据结构体修改模块
提供数据结构体修改,并简单判定数据是否正确。
********************************************/
void modify(FLIGHT *p)
{
printf("\n\t请输入航班号:");
scanf("%s",p->num);
printf("\t请输入起始站:");
scanf("%s",p->start);
printf("\t请输入终点站:");
scanf("%s",p->finish);
printf("\t请输入飞行时间(1-7):");
while(scanf("%d",&p->time)!=1)
{
flushall();
printf("\t输入出错,重新输入:");
}
printf("\t请输入预售票总数:");
while(scanf("%d",&p->ticket)!=1)
{
flushall();
printf("\t输入出错,重新输入:");
}
printf("\t请输入已售票数:");
while(scanf("%d",&p->buy_num)!=1)
{
flushall();
printf("\t输入出错,重新输入:");
}
PRHEAD;
PRINFO((*p));
if(p->time<1||p->time>7||p->buy_num>=p->ticket)
printf("\n\t数据可能出现错误,请检查");
}
/*********************************************
信息查询模块
提供4种信息查询
并具有菜单。
********************************************/
void searth(FLIGHT *flt)
{
char temp[20];
int tmp;
int i,j;
while(1)
{
system("cls ");
printf(
"------------------------------"
"飞机航线查询"
"-------------------------------\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t1.按航班号查询\t\t\t\t|\n"
"|\t\t\t\t2.按起点站查询\t\t\t\t|\n"
"|\t\t\t\t3.按终点站查询\t\t\t\t|\n"
"|\t\t\t\t4.按飞行时间查询\t\t\t|\n"
"|\t\t\t\t0.返回菜单\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"|\t\t\t\t\t\t\t\t\t|\n"
"-------------------------------"
"请选择(0-4)"
"-------------------------------\n"
);
switch(getch())
{
case '1':
{
printf("请输入要查询的航班号:");
scanf("%s",temp);
PRHEAD;
for(i=0,j=0;i<N;i++)
{
if(strcmp(flt[i].num,temp)==0)
{
PRINFO(flt[i]);
j++;
}
}
if(j==0)printf("\n\t没有相关资料!");
printf("\n\t共查询到%d条资料\n\t点击任意键返回......",j);
getch();
}
break;
case '2':
{
printf("请输入要查询的起点站:");
scanf("%s",temp);
PRHEAD;
for(i=0,j=0;i<N;i++)
{
if(strcmp(flt[i].start,temp)==0)
{
PRINFO(flt[i]);
j++;
}
}
if(j==0)printf("\n\t没有相关资料!");
printf("\n\t共查询到%d条资料\n\t点击任意键返回......",j);
getch();
}
break;
case '3':
{
printf("请输入要查询的终点站:");
scanf("%s",temp);
PRHEAD;
for(i=0,j=0;i<N;i++)
{
if(strcmp(flt[i].finish,temp)==0)
{
PRINFO(flt[i]);
j++;
}
}
if(j==0)printf("\n\t没有相关资料!");
printf("\n\t共查询到%d条资料\n\t点击任意键返回......",j);
getch();
}
break;
case '4':
{
printf("请输入要查询的飞行时间:");
while(scanf("%d",&tmp)!=1)
{
flushall();
printf("\t输入出错,重新输入:");
}
PRHEAD;
for(i=0,j=0;i<N;i++)
{
if(flt[i].time==tmp)
{
PRINFO(flt[i]);
j++;
}
}
if(j==0)printf("\n\t没有相关资料!");
printf("\n\t共查询到%d条资料\n\t点击任意键返回......",j);
getch();
}
break;
case '0':return;break;
default:break;
}
}
}
/*********************************************
大名鼎鼎的msgbox之c语言简化版
本程序中有一部分确定取消
故引用这个函数。
********************************************/
int msgbox(char *msg)
{
char ch;
printf("\n\t\t%s",msg);
printf("\n\t\t确定(enter) 取消(esc)");
while(1)
{
ch=getch();
if(ch==13)return 1;
if(ch==27)return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -