资源描述
______________________________________________________________________________________________________________
目 录
设计目的………………………………………………………1
总体设计………………………………………………………1
详细设计………………………………………………………3
调试与测试……………………………………………………4
源程序代码……………………………………………4
程序运行截图…………………………………………16
仍存在的问题…………………………………………18
心得体会………………………………………………………18
设计进度表……………………………………………………19
参考文献………………………………………………………20
一、 正文
(一) 设计目的:
假定民航机场共有n个航班,每个航班有一航班号、确定的航线(起始站、终点站)、确定的飞行时间(星期几)和一定的成员订额。设计一飞机订票系统,使之能提供下列服务:
1、航班信息录入功能(航班信息用文件保存)
包括航班号、起始站、终点站、机票总数、已售机票数;
2、航班信息浏览功能
3、查询航线:按航班号查询、按终点站查询、按航线查询
4、承办订票和退票业务(可选项)
5、修改航班信息
6、删除航班信息
(二) 总体设计:
编写一个飞机订票系统的程序,使该系统能够实现对航班信息的录入、浏览、查询、修改、删除以及订票、退票的功能。根据题目要求,首先要制作一个主菜单显示出各个操作的提示可供用户选择,进而一步步地深入操作。根据主菜单的内容再进一步编制具体操作的函数,各个功能均用专门编制的函数来完成。这就是看到题目后的最初的思路。
因为飞机票管理系统含有各航班的各项信息,如航班号、航线、飞行时间、机票数目等必要信息,综合考虑决定用结构体数组比较合适,根据题目要求定义如下结构体类型:
头文件包含、全局变量定义和结构体定义源代码:
#include<stdio.h>//标准输入、输出头文件
#include<string.h>//包含字符串函数处理头文件
#include<stdlib.h>
#define N 1000 //定义最多的航班数
#define PRT "%-d%12s %12s %10s %12d %12d\n",s[i].num,s[i].start,s[i].over,s[i].time,s[i].count,s[i].selled //定义输出格式
#define LB " 航班号 起始站 终点站 时 间 机票总数 已售票数 \n"//定义打印列表格式
struct air
{int num;
char start[20];
char over[20];
char time[10];
int count;//机票总数
int selled;//已预定机票总数
}s[N];
int i,m=0; //定义全局变量,记录下航班信息的数量
char ii[10]; //用来选择是否继续的变量
大概思路就是这样!
详细设计(定义的每个函数均作介绍):
1) 初始化界面函数(face函数)
在程序开始执行时调用该函数,在屏幕上打印出初始界面!并选择要执行的操作!
2)信息输入函数(input函数)
该函数里面调用for循环控制,该函数中用到一个全局变量k,用来控制该函数被再次调用时可以在已存放信息结构体后面继续输入数据,每当一个完整的航班信息输入完毕后,会提示是否输入下一个信息!按"0"j结束输入!然后调用下面要介绍的信息保存函数(save函数)!保存完毕后退回到主菜单!
3) 信息保存函数(save函数)
由于本程序设计时当输入机票总数不是正数时就会结束保存航班信息,所以进入save函数时首先判断机票总数是否大于0,大于0时候开始进入主体部分执行!主要过程是先打开文件,文件打开成功后调用文件格式输出函数(fprinf函数)将信息保存到文件中区!
4) 文件读取函数(read函数)
该函数首先打开保存飞机票信息的文件,然后将保存的信息写到飞机信息的结构体数组里面去(调用格式输入函数fscanf),并将航班信息输出到屏幕上!输入完毕后关闭文件!
5) 信息打印函数(print函数)
该函数只是负责把调用read函数,并打印出航班信息输出事的一些辅助信息!
6)航班信息查找函数
本函数用do.....while 循环控制结构,进入函数后选择查询方式(可以按航班号、终点站、航线查询),方式选择后用switch语句飞机的航班号(或者起始站、终点站)!从switch语句出来后,首先调用文件读取函数(read函数),输出所有航班信息到屏幕上,然后在if语句中判断刚才所输入飞机的航班号(或者起始站、终点站)与数组中那个航班信息符合,找到后打印出来!循环结束后,输入“yes”(“no”),while判断输入的条件继续(终止查找)!选择终止查找后返回主菜单!
7)航班信息删除函数(Delete)
航班删除模块与查找函数类似,也是用的do.....while 循环控制结构,不同时要先输入密码才能进入函数!进入函数后要选择删除方式(按航班号、航线)删除,输入要删除的航班号(航线)后,比如说选择按航班号删除,找到要删除的航班数组下标i后,用for(int j=i;j<m;j++) { s[j]=s[j+1]; }方式实现删除,
删除完毕后打印出删除过的航班信息列表,然后选择“no”结束该函数,返回到主菜单!
8) 订票函数(Book函数)
首先调用查询函数(search函数),找到要预订机票的航班,然后输入要顶的机票数目,根据输入的机票书修改已售机票书数值!然后保存信息!
9) 退票函数(Refund()函数
与订票函数类似,首先调用查询函数(search函数),找到要预订机票的航班,然后输入要退的机票数目,根据输入的机票书修改已售机票书数值!然后保存信息!
10) 修改函数(Modify函数)
该函数与输入函数类似,把数组里面的信息重新输入一遍达到修改航班信息的功能!
11) main函数
输入密码后进入main函数,然后main函数负责调用以上程序就行了!
源程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 200
struct air
{int num;
char start[20];
char over[20];
char time[10];
int count;//机票总数
int selled;//已预定机票总数
}s[N];
#define PRT "%-d%12s %12s %10s %12d %12d\n",s[i].num,s[i].start,s[i].over,s[i].time,s[i].count,s[i].selled //定义输出格式
#define LB " 航班号 起始站 终点站 时 间 机票总数 已售票数 \n"//定义打印列表格式
void face();
void input();
void print();
void search();
void Delete();
void Booking();
void Modify();
void Refund();
void save();
void read();
int i,m=0,k=0;
void face()
{system("color 0E");
puts(" ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
puts(" ★* 飞机票管理系统欢迎您 *★");
puts(" ★********************************************************★");
puts(" ★* 你可以选择下面的操作: *★");
puts(" ★* 1.输入航班信息 *★");
puts(" ★* 2.浏览航班信息 *★");
puts(" ★* 3.查询航班信息 *★");
puts(" ★* 4.删除航班信息 *★");
puts(" ★* 5.订票信息 *★");
puts(" ★* 6.修改信息 *★");
puts(" ★* 7.退票信息 *★");
puts(" ★* 0.退出 *★");
puts(" ★********************************************************★");
puts(" ★* 制作人:##### 学号:111111111111 *★");
puts(" ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
}
void main()
{
//delay(1000);
system("color a0");//设置背景和字体颜色
//system("color 100");//yanse
int j;
char f[]="1111111111"; //设置密码
int y;
printf(" 飞 机 票 管 理 系 统\n\n");
while(1){
printf(" 请 输 入 密 码 进 入 系 统:\n ");
scanf("%s",f); //读取密码
if(strcmp(f,"1111111111")==0)
{
while(1)
{
system("cls");
face();
printf("请在0-7中选择以回车键结束: ");
scanf("%d",&j);
system("cls");
switch(j)
{
case 1: input();//调用输入模块
break;
case 2:print();//调用打印模块
break;
case 3:search();//调用查询模块
break;
case 4:Delete();//调用删除模块
break;
case 5:Booking();//调用订票模块
break;
case 6:Modify();//调用修改模块
break;
case 7:Refund();//调用退票模块
break;
case 0:goto end;
}
printf("\n按任意键继续......");
}
}
else
{
int yy;
printf(" 输入密码错误!请检查您的密码是否正确! \n\n");
printf(" 是否继续输密码?按任意键继续,0结束!\n",m);
scanf("%d",&y);//在此需输入任意一个整数值数值,程序才能继续执行
if(y==0)
break;
}
}
end:printf(" (=^ ^=) 欢 迎 再 次 回 来 (=^ ^=)\n");
printf(" 任意键退出系统!\n");
int hp2;
scanf("%d",&hp2);
}
void input()
{
system("color 8f");
printf("请依次输入航班信息(机票总数为0结束输入): "
"完成输入信息请键入w以回车键结束 \n"); //打印提示信息
printf("-------------------------------------------------------------------------- \n");
int y;
for(i=k;i<N;i++)
{
printf("请输入航班号: ");
scanf("%d",&s[i].num); //读取航班号
printf("请输入起始站: ");
scanf("%s",s[i].start);//读取起始站
printf("请输入终点站: ");
scanf("%s",s[i].over);//读取终点站
printf("请输入时间(星期): ");
scanf("%s",s[i].time);//读取时间
printf("请输入总机票数(0结束): ");
scanf("%d",&s[i].count);//读取机票数
printf("请输入已售机票数: ");
scanf("%d",&s[i].selled);//读取机票数
m++;//飞机信息录入计数
k++;
printf(" 第%d个信息已经输完是否继续?按任意键继续(0结束)\n",m);
scanf("%d",&y);//在此需输入任意一个整数值数值,程序才能继续执行
if(y==0)
{
save();//保持输入数据
break;
}
}
}
void save()//保存模块程序
{
if(s[0].count>0)
{
system("color 78");
FILE *fp;//定义文件指针
if((fp=fopen("D:\\飞机票系统数据保存.txt","w+"))==NULL)//打开文件并判断是否出错
{
printf("文件打开失败! ");//打印出错提示
}
else
{
fprintf( fp,LB);
fprintf( fp,"============================================================\n ");
for(i=0;i<m&&s[i].count>0;i++)
{
fprintf(fp,PRT);
}
}
fclose(fp);//关闭文件
int hp;
printf(" 信息保存到文件成功!任意键返回主菜单!\n\n");
scanf("%d",&hp);
}
else
{
int k;
printf("飞机票总数为零!输入结束!\n");
printf(" 任意键返回主菜单!\n\n");
scanf("%d",&k);
}
}
void read()//从文件读取信息模块
{
system("color E0");
FILE *fp;//定义文件指针
if((fp=fopen("D://飞机票系统数据保存.txt","r"))==NULL)//打开文件,并判断是否出错
printf("创建文件失败! ");//打印出错提示
else
for(i=0;i<m;i++)
{
fscanf(fp,"%-d%12s%12s%10s%12d%12d\n ",&s[i].num,s[i].start,s[i].over,s[i].time,&s[i].count,&s[i].selled );
printf(PRT);
}
fclose(fp);//关闭文件
}
void print()//打印模块
{
system("color 97");
char w[10];
printf("\n 所有航班信息如下\n");
printf(LB);
read();//调用读取文件函数
printf("\n\n 按任意键回车键结束返回上层菜单: \n\n");
scanf("%s",w);
}
void search()//查询模块
{
system("color 5E");
char name1[20];
char name2[20];
char ii[10];
int n,no,flag=0;
do
{
printf("请选择查找方式:\n ");//打印查询方式菜单
printf("1.按航班号查找\n "
"2.按终点站查找\n "
"3.按航线查找 \n"
" 0.返回 \n");
printf("请在0-3中选择:\n "
"\n\n 按其他键以回车键结束返回主菜单:\n ");
scanf("%d",&n);//读取查找方式
if(n==0)
break;
switch(n)
{
case 1:
printf("请输入航班号: ");
scanf("%d",&no);//航班号
break;
case 2:
printf("请输入终点站名称: ");
scanf("%s",name2);//读取终点站
break;
case 3:
printf("请输入起始站名称: ");
scanf("%s",name1);//读取起始站
printf("请输入终点站名称: ");
scanf("%s",name2);//终点站
break;
default:
break;
}
printf("\n 已经存在的航班如下\n\n");
printf(LB);
read();//调用读取函数
for(i=0;i<m;i++)
{
if(strcmp(s[i].over,name1)==0&&strcmp(s[i].over,name2)==0)//按终点站起始站判断输出条件
{
//printf("\n 查找航班信息成功!\n\n");
printf("\n 下面是你要查找的航班信息\n\n ");
flag=1;
printf(LB);
printf(PRT);//打印信息
break;
}
if(strcmp(s[i].over,name2)==0)
{
printf("\n 下面是你要查找的航班信息\n\n ");
flag=1;
printf(LB);
printf(PRT);//打印信息
break;
}
if(s[i].num==no)//按航班号判断输出条件
{
printf("\n 下面是你要查找的航班信息\n\n ");
flag=1;
printf(LB);
printf(PRT);//打印信息
break;
}
}
no=0;//将航班号赋值为0
if(flag)
{printf("\n 您需要的信息查找完毕:\n "
" 是否继续查找?请键入yes或no以回车键结束\n ");
scanf("%s",ii);
}
else
{
printf("\n 没有您需要的信息:\n "
" 是否继续查找?请键入yes或no以回车键结束\n ");
scanf("%s",ii);
}
}
while(strcmp(ii,"yes")==0);//判断结束
while(strcmp(ii,"no")==0)
break;
}
void Delete()//删除模块
{
system("color 1E");
char name1[20];
char name2[20];
char ii[10];
char f[]="2010146104";//设置密码
int no,n,flag=0;
printf("请输入密码并以回车键结束: \n");
scanf("%s",f);//读取密码
if(strcmp(f,"2010146104")==0) //判断密码是否正确
{
do
{
printf("请选择删除以方式回车键结束:\n ");//打印删除方式菜单
printf("*1.按航班号删除 \n"
" *2.按航线删除\n "
"*0.返回\n ");
printf("\n\n 请在0-2中选择以回车键结束: \n");
scanf("%d",&n);//读取删除方式
if(n==0)
break; //跳出循环
switch(n)
{
case 1:
printf("请输入航班号: ");
scanf("%d",&no);//读取航班号
printf("\n 已经存在的航班如下\n\n");
read();//调用读取函数
break;//跳出循环
case 2:
printf("请输入起始站 名称: ");
scanf("%s",name1);//读取起始站
printf("请输入终点站名称: ");
scanf("%s",name2);//读取终点站
printf("\n 已经存在的航班如下\n\n");
read();//调用读取函数
break;//跳出循环
}
printf("\n 删除后的航班如下\n\n");//
for(i=0;i<m;i++)
{
if(s[i].num==no)//按航班号删除
{
printf(LB);
flag=1;
for(int j=i;j<m;j++)
{
s[j]=s[j+1];
}
m--;
for(int i=0;i<m;i++)
{
printf(PRT);
}
}
if(strcmp(s[i].start,name1)==0&&strcmp(s[i].over,name2)==0)
{
flag=1;
printf(LB);
for(int k=i;k<m;k++)
{
s[k]=s[k+1];
}
m--;
for(int i=0;i<m;i++)
{
printf(PRT);
}
}
}
if(flag)
{printf("\n 您需要的信息查找完毕:\n "
" 是否继续查找?请键入yes或no以回车键结束\n ");
scanf("%s",ii);
}
else
{
printf("\n 没有您需要的信息:\n "
" 是否继续查找?请键入yes或no以回车键结束\n ");
scanf("%s",ii);
}
}
while(strcmp(ii,"yes")==0); //判断结束
while(strcmp(ii,"no")==0)
break;
}
else
printf("\n 对不起密码错误!您不是管理员,不能使用此项功能!\n ");
int q;
scanf("%d",&q);
}
void Booking()//订票模块
{
system("color 0E");
int n;
char a[10];
do
{
search();//调用查询模块
printf("请输入您要订的机票数以回车键结束:\n ");
scanf("%d",&n);//读取所订机票数
if(n<0||s[i].count<n)
{
printf("请输入有效的机票数! ");//判断机票数是否出错
}
if(s[i].count!=0&&s[i].count>=n)//判断是否出错
{
s[i].selled=s[i].selled+n;
save();//调用保存函数
printf("订票成功!\n\n ");
}
printf(" 是否继续? 请输入yes或no以回车键结束: \n");//判断是否继续订票
scanf("%s",a);
}while(!strcmp(a,"yes"));//判断结束
while(!strcmp(a,"no"))
break;//判断结束
}
void Refund()//退票模块
{
system("color F0");
int n;
char a[10];
do
{
search();//调用查询模块
printf("请输入您要退的机票数目: ");
scanf("%d",&n);//输入所退票数
if(n<0) //判断票数是否有效
printf("请输入有效的机票数! ");
else{
s[i].selled=s[i].selled-n;
save(); //调用保存模块
printf("退票成功! ");
}
printf("是否继续? 请键入yes或no以回车键结束: ");//判断是否继续退票
scanf("%s",a);
}while(!strcmp(a,"yes"));//判断并跳出循环
}
void Modify() //修改模块
{
system("color 4E");
struct modify //定义结构体
{
int mo;
char start1[20];
char over1[20];
char time1[20];
int count1;
int selled1;
}M[1];
char j[10];
char f[]="2010146104";//设置密码
int n;
printf("请输入密码并以回车键结束: ");
scanf("%s",f);//读取密码
if(strcmp(f,"2010146104")==0)//判断是否出错
{
printf(LB);
read();//调用读取模块
do
{
printf( "请选择修改方式:\n "
"*1:按航班号修改: \n"
" *2:按航线修改:\n ");
printf("请在1---2中修改以回车键结束: \n");
scanf("%d",&n);//读取修改方式
switch(n)
{
case 1:printf("请输入航班号: ");
scanf("%d",&M[0].mo);//读取航班号
break;
case 2:printf("请输入起始站: ");
scanf("%s",M[0].start1);//读取起始站
printf("请输入终点站: ");
scanf("%s",M[0].over1);//读取终点站
break;
}
for(int i=0;i<m;i++)
{
if(strcmp(s[i].start,M[0].start1)==0&&strcmp(s[i].over,M[0].over1)==0)//判断输出条件
{
printf(" 航班号 起始站 终点站 时 间 机票总数 已售票数 \n");
printf(PRT);
break;
}
if(s[i].num==M[0].mo)//判断输出条件
{
printf(" 航班号 起始站 终点站 时 间 机票总数 已售票数 \n");
printf(PRT);
break;
}
}
M[0].mo=0; //将结构体中的号为零
printf("\n 请输入新航班号、起始站、终点站、时间(星期几)、机票总数、已售票数:\n ");
printf(" 航班号 起始站 终点站 时 间 机票总数 已售票数 \n");
scanf("%d\t%s\t%s\t%s\t%d%d",&M[0].mo,M[0].start1,M[0].over1,M[0].time1,&M[0].count1,&M[0].selled1); //定义输入格式
s[i].num=M[0].mo;//替换航班号
strcpy(s[i].start,M[0].start1);//替换其始站
strcpy(s[i].over,M[0].over1);//替换终点站
strcpy(s[i].time,M[0].time1);//替换时间
s[i].count=M[0].count1;//替换机票数
s[i].selled=M[0].selled1;//替换机票数
save();//调用保存模块
printf("是否继续?请键入yes或no以回车键结束:\n ");
scanf("%s",j);
}while(strcmp(j,"yes")==0||strcmp(j,"no")==0); //判断结束
}
else
printf("\n 对不起密码错误!您不是管理员,不能使用此项功能!\n\n ");
int q;
scanf("%d",&q);
}
以上即为我的源程代码。
a) 执行结果:
程序最终运行情况如所贴图表。
1) 第一次运行程序(输入初始数据)
首次进入程序要求输入密码方能进入系统!密码错误后可以选择是否继续输入密码!进入成功后!界面提示输入原始数据:选择操作1→请输入航班号→请输入起始站→请输入终点站→请输入飞行时间→请输入机票数→请输入已售机票数。我按照提示一次输入了4个航班信息后按提示输入“0”则不再继续输入,系统显示出了主菜单界面。接着按0退出程序,显示“欢迎再次回来!。”
图表 1—主菜单界面
2) 航班信息的浏览
退到主菜单后在提示中输入“2” →浏览航班信息。输出如下航班信息(如图表2)!
图表 2—显示航班信息
3) 查询航班信息
在主菜单界面输入3→选择查询方式1→输入“20101461” →显示出所查找的信息(如图表3)
图表 3—查询航班信息
4) 航班删除
在主菜单界面输入4→按照提示输入“2”(按航班号从大到小排序)→显示出排序后的
展开阅读全文