#include <stdio.h>
#include <string.h>
#include <io.h>
#include <process.h>
#define N 9999 //定义最多的航班数
#define PRINT "%d\t\t%s\t\t%s\t\t%s\t\t%d\t\t%s\t\t%s\t\t%s\n",s[i].num1,s[i].start,s[i].over,s[i].time,s[i].num2,s[i].marking,s[i].name,s[i].num3
struct air { //定义结构体数组
int num1;
char start[20];
char over[20];
char time[10];
int num2;
char marking[10];
char name[10];
char num3[20];
int count;
} s[N];
int i, m = 0; //定义全局变量
char ii[10];
void main();
void add(); //函数声明增加航班信息函数
void print(); //显示航班信息
void search(); //查找航班信息(按终点站)
void dingpiao(); //订票业务
void tuipiao(); //退票
void read1(); //读取文件
void save(); //保存文件
void output(); //输出格式
void paixu(); //航班排序
void chushihua(); //系统初始化
void build(); //建立数据文件
void paixu1(); //按航班号从小到大排序
void paixu2(); //从大到小
void main() { //主函数
int j;
chushihua(); //系统初始化判断是否存在原始数据文件
printf(" 欢迎使用飞机订票系统 \n");
printf(" 该系统有以下功能 \n");
do {
printf("==========================\n");
printf("1.航班信息录入 \n"
"2.航班信息浏览 \n"
"3.查找航班信息 \n"
"4.订票业务 \n"
"5.退票业务 \n"
"6.退出系统 \n");
printf("==========================\n");
printf(" 请在 1-6 中选择以回车键结束: ");
scanf("%d", &j);
fflush(stdin);
switch (j) {
case 1:
add();
break;
case 2:
print();
break;
case 3:
search();
break;
case 4:
paixu();
break;
case 5:
dingpiao();
break;
case 6:
tuipiao();
break;
case 7:
save();
printf(" 谢谢使用,再见 !");
break;
default:
printf(" 您输入不合法 ,请按回车键继续 ");
getchar();
}
} while (j != 0); //判断是否调用其他函数
}
void chushihua() { //定义系统初始化函数
if (access("hangban.txt", 0)) {
build();
} else
read1();
}
void build() { //定义建立数据文件函数
FILE *fp; //定义文件指针
if ((fp = fopen("hangban.txt", "wb")) == NULL) { //打开文件并判定是否出错
printf(" 创建文件失败 ! ");
getchar();
return;
}
printf(" 请依次输入航班信息 (以回车键结束 ):\n");
printf("----------------------------\n");
for (int i = 0; i < N; i++) {
printf(" 请输入航班号 : ");
scanf("%d", &s[i].num1);
printf(" 请输入起始站 : ");
scanf("%s", s[i].start);
printf(" 请输入终点站 : ");
scanf("%s", s[i].over);
printf(" 请输入起飞时间 (星期几 ): ");
scanf("%s", s[i].time);
printf(" 请输入座次号 : ");
scanf("%d", &s[i].num2);
printf(" 座次订出与否 : ");
scanf("%s", s[i].marking);
printf(" 订票者姓名 : ");
scanf("%s", s[i].name);
printf(" 订票者身份证号码 : ");
scanf("%s", s[i].num3);
fwrite(&s[i], sizeof(struct air), 1, fp);
m++;
printf(" 添加完毕 ,是否继续添加 ?请键入 y 或 n 以回车键结束 :");
scanf("%s", ii);
if (strcmp(ii, "y") != 0) { //判断是否继续添加航班信息
fclose(fp); //关闭文件
return;
}
}
}
void read1() { //定义读取文件函数
FILE *fp;
if ((fp = fopen("hangban.txt", "r")) == NULL) {
printf(" 创建文件失败 ! ");
getchar();
return;
}
i = 0;
while (!feof(fp)) {
fread(&s[i], sizeof(struct air), 1, fp); //逐块读取数据
i++;
m++; //计算存在航班数
}
m--;
fclose(fp);
}
void save() { //定义保存函数
FILE *fp;
if ((fp = fopen("hangban.txt", "wb")) == NULL) {
printf(" 创建文件失败 ! ");
getchar();
return;
}
for (int i = 0; i < m; i++) //逐块保存数据
fwrite(&s[i], sizeof(struct air), 1, fp);
fclose(fp);
}
void add() { //定义增加航班信息函数
char ch;
do {
printf(" 请依次输入您要增加的航班信息 (以回车键结束 ): \n"); //打印提示信息
printf("----------------------------\n");
for (int i = 0; i < N; i++) {
printf(" 请输入航班号 : ");
scanf("%d", &s[i].num1);
printf(" 请输入起始站 : ");
scanf("%s", s[i].start);
printf(" 请输入终点站 : ");
scanf("%s", s[i].over);
printf(" 请输入起飞时间 (星期几 ): ");
scanf("%s", s[i].time);
printf(" 请输入座次号 : ");
scanf("%d", &s[i].num2);
printf(" 座次订出与否 : ");
scanf("%s", s[i].marking);
printf(" 订票者姓名 : ");
scanf("%s", s[i].name);
printf(" 订票者身份证号码 : ");
scanf("%s", s[i].num3);
m++;
printf(" 添加完毕 ,是否继续添加 ?请键入 y 或 n 以回车键结束 :");
scanf(" %c", &ch); //%前有一个空格
}
while (ch == 'y' || ch == 'Y'); //判断是否继续添加
}
void print() { //定义显示航班信息函数
printf("\n 目前我们有如下航班: \n");
output(); //调用输出格式函数
printf("\n 请按回车键返回上层菜单 ");
getchar();
}
void output() { //定义输出格式函数
printf(" 航班号 \t\t 起始站 \t\t 终点站 \t\t 起飞时间 \t\t 座位号 \t\t 座次订出与否 \t\t 订票者姓名 \t\t 订票者身份证号码 \n");
for (int i = 0; i < m; i++)
printf(PRINT);// 打印出信息
}
void search() { //定义查询函数
char c[20];
do {
printf("\n 请输入终点站: ");
scanf("%s", c); //输入查询的终点站
for (int i = 0; i < m; i++) {
if (strcmp(s[i].over, c) == 0) { //按终点站判定输出条件
printf("\n 您所查找的航班信息为 :\n ");
printf(" 航班号 \t\t 起始站 \t\t 终点站 \t\t 时间 \t\t 座位号 \t\t 座次订出与否 \t\t 订票者姓名 \t\t 订票者身份证号码 \n");
printf(PRINT); //显示信息
printf("\n 查询完毕,按回车键继续 ");
getchar();
getchar();
return;
}
}
printf(" 对不起,没有您需要的信息 !\n ");
printf(" 是否重新查找 ?请键入 y 或 n 以回车键结束 ");
scanf("%s", ii);
} while (!strcmp(ii, "y")); // 判定是否重新查找
}
void dingpiao() { //定义订票业务函数
int n;
char a[10] = "y";
do {
search();//调用查询模块
if (!strcmp(ii, "n")) {
printf(" 对不起 !没有找到您所需要的航班 ,所以不能订票。 \n");
printf("\n 请按回车键返回上层菜单 ");
getchar();
strcpy(ii, "n");
break;
}
do {
printf(" 请输入您要订的机票数(以回车键结束) : ");
scanf("%d", &n);
if (n <= 0) { //判定机票数是否出错
printf(" 输入错误!至少需订 1 张机票。 \n");
} else if (s[i].count == 0) { //判定机票是否售完
printf(" 对不起,你所选择的航班的机票已售空 !\n");
break;
} else if (s[i].count != 0 && s[i].count >= n) { //判定机票数是否大于等于订票数
s[i].count = s[i].count - n;
printf(" 订票成功 ! ");
break;
} else if (s[i].count < n) { //判定机票数是否小于订票数
printf(" 对不起,你所选择的航班只剩 %d 张机票 \n", s[i].count);
printf(" 是否需要重新输入机票数 ?请输入 y 或 n 以回车键结束 :");//判定是否重新输入订票数
scanf("%s", a);
}
} while (!strcmp(a, "y"));
printf(" 是否需要订其他航班的机票 ?请输入 y 或 n 以回车键结束 : ");
scanf("%s", a);
} while (!strcmp(a, "y")); //判定是否继续订票
}
void tuipiao() { //定义退票函数
int n;
char a[10];
do {
search(); //调用查询函数
if (!strcmp(ii, "n")) {
printf(" 对不起 !没有找到您所需要的航班 ,所以不能退票。 \n");
printf("\n 请按回车键返回上层菜单 ");
getchar();
strcpy(ii, "n");
break;
}
printf(" 请输入您要退的机票数目: ");
scanf("%d", &n);
if (n <= 0) //判定票数是否有效
printf(" 输入错误!至少需退 1 张机票。 ");
else {
s[i].count = s[i].count + n;
printf(" 退票成功 ! ");
}
printf(" 是否继续? 请键入 y 或 n 以回车键结束 : "); //判定是否继续
scanf("%s", a);
} while (!strcmp(a, "y")); //判定并跳出循环
}
void paixu() { //定义排序函数
int n;
printf("\n***************************\n ");
printf("1. 按航班号从小到大排序 \n"
" 2.按航班号从大到小排序 \n");
printf("***************************\n ");
printf(" 请在 1-2 中选择以回车键结束: ");
scanf("%d", &n);
switch (n) {
case 1:
paixu1();//调用从小到大排序函数
break;
case 2:
paixu2();//调用从大到小排序函数
break;
}
printf(" 排序后的航班信息为 :\n");
output(); //显示排序后航班信息
printf("\n 请按回车键返回上层菜单 ");
getchar();
}
void paixu1() { //定义从小到大排序函数
int k, j;
struct air t;
for (int i = 0; i < m; i++) { // 选择法排序
k = i;
for (j = i + 1; j < m; j++)
if (s[k].num1 > s[j].num1)
k = j;
if (i != k) {
t = s[k];
s[k] = s[i];
s[i] = t;
}
}
}
void paixu2() { //定义从大到小排序函数
int k, j;
struct air t;
for (int i = 0; i < m; i++) {
k = i;
for (j = i + 1; j < m; j++)
if (s[k].num1 < s[j].num1)
k = j;
if (i != k) {
t = s[k];
s[k] = s[i];
s[i] = t;
}
}
}