链接:https://pan.baidu.com/s/1dGYHv9cp9rNK9_CWmNtRIA
提取码:g4a1
复制这段内容后打开百度网盘手机App,操作更方便哦

main函数里面

/************************************************
* 这是电话本管理程序的主程序文件。
*
*
************************************************/

#include <stdio.h>
#include <Windows.h>
#include "flight.h"

//显示程序信息
void displaymenu( );

void main()
{
int option = 0;

//从文件中读出数据并插入链表中
ReadDataFromFile("flight.dat");

do
{
//提示用户选择操作
displaymenu();

scanf("%d", &option);
getchar();

//根据用户选择调用相关函数完成指定的操作
switch(option )
{
//打印所有记录信息
case 1:
displayall();
break;

//查询航班
case 2:
search();
break;

//预定航班
case 3:
bookticket();
break;

default:
break;
}
}while(option != 0 );


}

//显示程序信息
void displaymenu( )
{
system("CLS");
puts(" ");
puts("********************************************************************" );
puts(" 欢迎使用非常小航班系统V1.0" );
puts("********************************************************************\n" );
puts(" ");
puts("请选择操作:\n" );
puts("0:退出系统\n" );
puts("1:显示所有航班信息\n") ;
puts("2:查询航班信息\n") ;
puts("3:购票\n" );
// system("pause");
}

flight.h

#ifndef
#define

typedef struct
{
char cityfrom; //出发城市
char cityto; //到达城市
int depttime; //出发时间24小时制
int flttime; //飞行时长不超过12小时
int tcktnum; //剩余票额
int price; //价格
int fltno; //航班编号

}FLIGHT;

//用于显示所有航班信息
void displayall();
//用于显示单条航班信息
void displaysingle(int n);
//用于根据出发城市和到达城市查询有哪些航班
void search();
//输入航班号,预定机票
int bookticket();
//排序,按出发城市字母从小到大排序,若出发城市字母相等则按到达城市字母从小到大排序,
//若出发和到达城市均相等则按航班出发时刻由小到大排序,其余忽略
void bubblesortflight() ;
//从文件中读出航班数据
int ReadDataFromFile( const char *filename );

#endif

flight.c

#include  <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>
#include "flight.h"

#define


int g_num = 0; //全局变量,数组里的有效名片数
FLIGHT flightary[SIZE] ;//全局变量,名片数组

/*对从文件里读出的所有航班信息做特殊排序后进行显示*/
/*
输入: 无 使用全局数组flightary
返回:无
本函数是否需要修改:否
*/
void displayall()
{
int i;
//调用排序函数做特殊排序
bubblesortflight() ;

puts("No 航班号 出发城市 到达城市 离港时间 到达时间\t\t余票额 单价\n");
for(i=0;i<g_num;i++)//遍历所有元素
{
displaysingle(i);//调用单条记录显示函数
}
system("pause");
}


/*显示某一条航班信息*/
/*
输入: n,表示是结构体数组中的第几条信息(即下标)
返回:无
本函数是否需要修改:否
*/
void displaysingle(int n)
{
int temphour=0;
printf("%2d %2d \t%c\t %c\t %2d\t\t",n,flightary[n].fltno,flightary[n].cityfrom,flightary[n].cityto,flightary[n].depttime);
temphour=flightary[n].depttime+flightary[n].flttime;
if(temphour>24)
printf("%2d+1day\t\t",temphour%24);
else
printf("%2d\t\t",temphour);

printf("%2d\t %2d\n",flightary[n].tcktnum,flightary[n].price);
}

/*完成航班信息的特殊排序*/
/*
排序要求说明:按出发城市字母从小到大排序,若出发城市字母相等则进一步按到达城市字母从小到大排序,
若出发和到达城市都相等则进一步按航班出发时刻由小到大排序,航班出发时刻相等情况不再进行特殊处理
不限制使用哪种排序算法,但不得使用库函数进行排序
如不能理解以上说明请观察题目输出,或询问监考老师
输入: 无,使用全局数组flightary
返回: 无
本函数需要自行编写,并在displayall开始执行处被调用,调用指令已经写好
*/
void bubblesortflight()
{
//请写入你的代码
int i,j;
FLIGHT temp;
int k=0;
int flag;
for(i=0;i<g_num-1;i++)
{
flag = 0;
for(j=0;j<g_num-i-1;j++)
{
if(flightary[j].cityfrom>flightary[j+1].cityfrom)
{
temp = flightary[j];
flightary[j]=flightary[j+1];
flightary[j+1]=temp;

}else if(flightary[j].cityto>flightary[j+1].cityto)
{
temp = flightary[j] ;
flightary[j]=flightary[j+1];
flightary[j+1]=temp;
k++;
}else if(flightary[j].depttime>flightary[j+1].depttime)
{
temp = flightary[j];
flightary[j]=flightary[j+1];
flightary[j+1]=temp;
k++;
}
if (flag == 0) break;
}
}

}

/*用于根据出发城市和到达城市查询有哪些航班*/
/*
要求用户输入出发城市字母和到达城市字母,然后将满足条件航班信息全部输出,此处不需要考虑排序,仅依据对数组的搜索顺序进行结果显示,不考虑票额是否为0
显示格式: puts("No 航班号 出发城市 到达城市 离港时间 到达时间\t\t余票额 单价\n");
输入: 无,使用全局数组flightary
返回: 无
本函数需要自行编写,注意防错设计
*/
void search()
{
//请填入你的代码
char start;
char go;
int i,j;
j=0;
do
{
puts("请输入出发城市<C for Chendu B for Beijing X for Xian>: ");
scanf("%c", &start);
getchar();
}
while ( start != 'C' && start != 'B' && start != 'X' );
do
{
puts("请输入到达城市<C for Chendu B for Beijing X for Xian>: ");
scanf("%c", &go);
getchar();
}
while ( go != 'C' && go != 'B' && go != 'X' );
putchar('\n');
puts("No 航班号 出发城市 到达城市 离港时间 到达时间\t\t余票额 单价\n");
for(i=0;i<g_num;i++)
{
if(flightary[i].cityfrom==start&&flightary[i].cityto==go)
{
displaysingle(i);
}
}
system("pause");
}


/*预定机票*/
/*
要求用户输入航班的2位编号(注意不是NO)显示该航班的余票数
并且要求用户输入所需购票数目,
如果购票数大于余票,则显示“购票数大于余票,购票失败”
如果购票数小于等于余票,随后输出购票数,从起飞城市到到达城市,起飞时间和应付的购票总金额
如果未查询到航班号,输出未找到航班号,返回-1
输入: 无,使用全局数组flightary
返回: 整型:成功返回购票数;失败返回-1
本函数需要自行编写,注意防错设计
*/
int bookticket()
{
//请填写代码
int num;
int buy;
int result;
int i,j;
do
{
do
{
printf("请输入航班编号: ");
scanf("%d", &num);
}while ( num <= 9 );

}while ( num > 99 );

for ( i = 0; ; ++i )
{
if ( i >= g_num )
{
puts("未找到航班号!");
system("pause");
return -1;
}
if ( flightary[i].fltno == num && flightary[i].tcktnum>0)
break;
}
printf("目前余票%d,请输入购票数<x x>:",flightary[i].tcktnum);
scanf("%d", &buy);
if(buy<=flightary[i].tcktnum)
{
printf("您已成功购票%d张:%c到%c,起飞时间%d,应付总金额%d\n",buy,flightary[i].cityfrom,flightary[i].cityto,flightary[i].depttime,flightary[i].price*buy);
flightary[i].tcktnum -= buy;
system("pause");
result = buy;
}else
{
puts("购票数目大于余额,本次购票失败");
system("pause");
result = -1;
}
return result;
}

/*从文件中读取航班信息*/
/*
以结构体元素为单位从指定文件读取航班信息
输入: 数据文件名,该文件已经和代码放置在一起
返回: 整型:成功返回1;失败返回0
本函数仅需要补充一行代码,请完成while中的表达式
*/
int ReadDataFromFile( const char *filename )
{
FILE *pfile; //文件指针
//清空数组
memset(flightary,0,sizeof(FLIGHT)*SIZE);
g_num=0;

//打开保存信息的数据文件
pfile = fopen(filename, "rb" );
if(pfile == NULL)
{
printf("文件打开失败!\n" );
return 0;
}

// 从文件中读取一个成员的信息,放到数组尾部
//请完成while中的表达式
while((fread(flightary+g_num,sizeof(FLIGHT),1,pfile))==1)
{
g_num++;
if(g_num >= SIZE)
{
printf("Reach max storage capability! Stop reading from file!\n");
break;
}
}

fclose(pfile );
return 1;

}