下面是一个简单的例子,实现了上述所有功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_FLIGHTS 100 // 最大航班数
#define MAX_PASSENGERS 50 // 每个航班最大乘客数
// 航班结构体
typedef struct {
char flight_no[10]; // 航班号
char origin[20]; // 出发地
char destination[20]; // 目的地
int capacity; // 容量
int available_seats; // 剩余座位数
char passengers[MAX_PASSENGERS][20]; // 乘客名单
} Flight;
Flight flights[MAX_FLIGHTS]; // 存储所有航班信息
int num_flights = 0; // 航班数
// 从文件中读取所有航班信息
void read_flights() {
FILE *fp = fopen("flights.dat", "rb");
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
fread(&num_flights, sizeof(int), 1, fp);
fread(flights, sizeof(Flight), num_flights, fp);
fclose(fp);
}
// 将所有航班信息写入文件
void write_flights() {
FILE *fp = fopen("flights.dat", "wb");
fwrite(&num_flights, sizeof(int), 1, fp);
fwrite(flights, sizeof(Flight), num_flights, fp);
fclose(fp);
}
// 航班的增加功能
void add_flight() {
if (num_flights >= MAX_FLIGHTS) {
printf("无法添加更多航班!\n");
return;
}
printf("请输入航班号:");
scanf("%s", flights[num_flights].flight_no);
printf("请输入出发地:");
scanf("%s", flights[num_flights].origin);
printf("请输入目的地:");
scanf("%s", flights[num_flights].destination);
printf("请输入容量:");
scanf("%d", &flights[num_flights].capacity);
flights[num_flights].available_seats = flights[num_flights].capacity;
num_flights++;
write_flights(); // 更新文件
printf("航班添加成功!\n");
}
// 航班的删除功能
void delete_flight() {
char flight_no[10];
printf("请输入要删除的航班号:");
scanf("%s", flight_no);
int i;
for (i = 0; i < num_flights; i++) {
if (strcmp(flights[i].flight_no, flight_no) == 0) {
// 将最后一个航班信息赋值给当前要删除的航班
flights[i] = flights[num_flights - 1];
num_flights--;
write_flights(); // 更新文件
printf("航班删除成功!\n");
return;
}
}
printf("未找到该航班!\n");
}
// 航班查询功能
void search_flights() {
int choice;
printf("请选择查询方式:\n");
printf("1. 按出发地和目的地查询航班号\n");
printf("2. 按航班号查询订票乘客信息\n");
scanf("%d", &choice);
if (choice == 1) {
char origin[20], destination[20];
printf("请输入出发地:");
scanf("%s", origin);
printf("请输入目的地:");
scanf("%s", destination);
int i;
for (i = 0; i < num_flights; i++) {
if (strcmp(flights[i].origin, origin) == 0 &&
strcmp(flights[i].destination, destination) == 0) {
printf("航班号:%s,剩余座位数:%d\n",
flights[i].flight_no, flights[i].available_seats);
}
}
} else if (choice == 2) {
char flight_no[10];
printf("请输入航班号:");
scanf("%s", flight_no);
int i;
for (i = 0; i < num_flights; i++) {
if (strcmp(flights[i].flight_no, flight_no) == 0) {
printf("航班号:%s,乘客名单:\n", flights[i].flight_no);
int j;
for (j = 0; j < MAX_PASSENGERS; j++) {
if (flights[i].passengers[j][0] != '\0') {
printf("%s\n", flights[i].passengers[j]);
}
}
return;
}
}
printf("未找到该航班!\n");
} else {
printf("无效的选择!\n");
}
}
// 航班订票功能
void book_flight() {
char flight_no[10], name[20];
printf("请输入航班号:");
scanf("%s", flight_no);
int i;
for (i = 0; i < num_flights; i++) {
if (strcmp(flights[i].flight_no, flight_no) == 0) {
if (flights[i].available_seats == 0) {
printf("该航班已满员!\n");
return;
}
printf("请输入乘客姓名:");
scanf("%s", name);
int j;
for (j = 0; j < MAX_PASSENGERS; j++) {
if (flights[i].passengers[j][0] == '\0') { // 找到空位置
strcpy(flights[i].passengers[j], name);
flights[i].available_seats--;
write_flights(); // 更新文件
printf("订票成功!\n");
return;
}
}
printf("该航班已满员!\n");
return;
}
}
printf("未找到该航班!\n");
}
// 航班退票功能
void cancel_flight() {
char flight_no[10], name[20];
printf("请输入航班号:");
scanf("%s", flight_no);
int i;
for (i = 0; i < num_flights; i++) {
if (strcmp(flights[i].flight_no, flight_no) == 0) {
printf("请输入乘客姓名:");
scanf("%s", name);
int j;
for (j = 0; j < MAX_PASSENGERS; j++) {
if (strcmp(flights[i].passengers[j], name) == 0) {
flights[i].available_seats++;
flights[i].passengers[j][0] = '\0'; // 清空该位置
write_flights(); // 更新文件
printf("退票成功!\n");
return;
}
}
printf("未找到该乘客!\n");
return;
}
}
printf("未找到该航班!\n");
}
// 显示所有航班信息
void show_all_flights() {
int i, j;
printf("所有航班信息:\n");
for (i = 0; i < num_flights; i++) {
printf("航班号:%s,出发地:%s,目的地:%s,容量:%d,剩余座位数:%d,乘客名单:\n",
flights[i].flight_no, flights[i].origin, flights[i].destination,
flights[i].capacity, flights[i].available_seats);
for (j = 0; j < MAX_PASSENGERS; j++) {
if (flights[i].passengers[j][0] != '\0') {
printf("%s\n", flights[i].passengers[j]);
}
}
printf("\n");
}
printf("共 %d 条记录。\n", num_flights);
}
int main() {
read_flights(); // 从文件中读取航班信息
int choice;
do {
printf("\n请选择操作:\n");
printf("1. 航班增加\n");
printf("2. 航班删除\n");
printf("3. 航班查询\n");
printf("4. 航班订票\n");
printf("5. 航班退票\n");
printf("6. 显示所有航班信息\n");
printf("0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
add_flight();
break;
case 2:
delete_flight();
break;
case 3:
search_flights();
break;
case 4:
book_flight();
break;
case 5:
cancel_flight();
break;
case 6:
show_all_flights();
break;
case 0:
break;
default:
printf("无效的选择!\n");
break;
}
} while (choice != 0);
return 0;
}
```
注意:这只是一个简单的例子,没有考虑并发访问等问题,仅供参考。