C语言-航班座位预订系统
本文设计了一个航班座位预订系统,采用C语言实现。系统通过结构体数组存储航班号、座位号、预订状态和乘客姓名等信息,提供8项核心功能:1)显示所有预订信息;2)查询座位状态;3)修改预订信息;4)取消预订;5)在线预订;6)数据保存;7)数据读取;8)系统退出。系统实现了输入验证、重复预订检测、文件存储等功能,采用菜单式交互界面。关键设计包括:使用strcmp进行数据匹配、二进制文件存储提高效率、输入
功能需求

设计过程
(1)设计主程序框图

图3-1 主流程图
(2)自定义数据类型:对需求中的每一条基本信息,定义为结构体数据类型
//开发一个航班座位预订系统,基本信息包括:航班号、座位编号、座位是否预订、预订人姓名、剩余座位编号等基本信息

图3-2 结构体图
(3)定义一个结构体数组:将这些基本信息储存在数组中
![]()

图3-3 结构体数组图
(4)设计基本功能以及明确主函数对基本功能的调用关系,完善主菜单功能,
例如
表3-2 函数设计表
|
序号 |
基本功能 |
设计思路(完善模块函数细节(函数名、参数、返回值等) |
|
1 |
具有数据的修改、删除、显示和查询功能的航班座位预订程序 |
设计一个显示菜单界面的函数menu( ); |
|
2 |
数据包括:航班号、座位编号、座位是否预订、预订人姓名 |
定义结构体:struct Pass 定义结构体数组:struct Pass Passenger[M]; |
|
3 |
乘客可在本系统查询航班座位预订信息 |
定义一个查询函数 Void search(struct Pass s[], int n); |
|
4 |
可在线预订座位 |
设计一个在线预约函数 int add(struct Pass s[], int n); |
|
5 |
可对记录的姓名、航班号、座位编号等信息进行修改 |
设计一条信息修改函数 void modify(struct Pass s[], int n); |
|
6 |
可显示所有航班预订数据 |
设计一个信息显示函数:void print(struct Pass s[], int n); |
|
7 |
可取消预约座位 |
设计取消预约函数 int del(struct Pass s[], int n) ; |
|
8 |
保存信息到文件中 |
设计一个保存信息的函数:void save(struct Pass s[], int n); |
|
9 |
从文件中读取信息 |
设计一个读取文件的函数:int load(struct Pass s[] |
代码运行的结果:

图3-4 主菜单图
(5)设计航班座位预订系统基本功能
1、具有数据的修改、删除、显示和查询等功能的航班座位预订程序。
引用#include <stdlib.h>库函数,然后在每个功能函数的结尾使用暂停的指令system("pause")和清除屏幕的指令system("cls");引用#include <conio.h>库函数中的_getch()函数(该函数与scanf函数相比不会吸收回车);引用#include <string.h>库函数,在寻找信息使用strcmp等相关的函数。
2、乘客可在本系统查询航班座位预订信息。
设计一个void search(struct Pass s[], int n)函数。本系统设置了AC8848、4U4888、UH6041三个航班,使用查询功能时,输入1~3选择要选择需要查询的航班号,如图3-5所示,正确输入字符1~3后进入相应的航班输入需要查询的座位编号进行查询,本系统座位编号是1A~1E、2A~2E、3A~3E、4A~4E、5A~5E。在设计座位编号输入时设置判断语句,判断是否正确输入,正确之后再进行下一步,最后设计判断语句对预订信息进行遍历筛查是否预订。

图3-5 数字判断图
3、可在线预订座位
设计一个int add(struct Pass s[], int n)函数。首先判断结构体数组的容量是否达到上限,即n是否等于M。没有达到上限则先选择预约的航班号,如图3-5所示,正确之后进入输入预约的座位编号(1A~1E、2A~2E、3A~3E、4A~4E、5A~5E)以及姓名。同样在设计座位编号输入时设置判断语句,判断是否正确输入,如图3-6。正确之后再进行下一步。正确输入后则预约成功。最后系统自动给结构体变量的预约信息元素使用strcpy函数复制“是”的字符串,简便用户的操作

图3-6 座位判断图
4、可对记录的姓名、航班号、座位编号等信息进行修改
设计一个void modify(struct Pass s[], int n)函数。在进行修改前先输入航班号以及座位编号,然后使用for循环遍历查找预订信息,查找是否有预订信息,如果没有则显示没有该预订信息并退出该功能函数;否则有此预订信息后,先选择是否修改航班号,输入y则选择1~3数字改为对应的航班号(如图3-5,),n则不修改,如图3-7。然后选择是否修改姓名,同样y为修改,n为不修改,如图3-7。然后就是选择是否修改座位编号,y为修改,n为不修改。如图3-7。最后对此航班的座位编号进行判断是否重复预订,不正确就重新输入,如图3-6。正确则使用strcmp函数对航班号和座位编号遍历寻找,有重复预订的就打印"座位被预订请重新输入座位编号(1~5排A~E座):",没有则打印“修改成功”

图3-7 修改信息图
5、可显示所有航班预订数据
设计一个void print(struct Pass s[], int n)函数。使用一个for循环遍历输出结构体变量的元素,把所有的预订信息打印出来。
6、可取消预约座位
设计一个int del(struct Pass s[], int n)函数。先定义flight[10], seat[10]两个字符数组,用户输入航班号和座位编号,然后用遍历的方法使用strcmp函数对输入的航班号和座位编号与预订信息进行比较,如果找到了相应的信息是第i个数据,则从第i+1个数据前移,删除第i个数据,达到取消预约的操作;如果没找到则输出“没有预订信息,取消失败”。
7、保存信息到文件中
设计一个void save(struct Pass s[], int n)函数。先定义指向文件的指针*fp以及字符数组outfile[20],然后让输入文件名储存到outfile[20]数组,使用fopen函数打开文件,然后把每一个结构体数据保存到文件中,直至全部储存完毕。打开文件时判断是否打开成功,不成功则跳出该功能函数,保护系统。保存时使用fwrite函数写入不需要格式化,使用2进制数据,传输速度快。
8、从文件中读取信息
设计一个int load(struct Pass s[])函数。先定义指向文件的指针*fp以及字符数组infile[20],然后让输入文件名储存到infile[20]数组,使用fopen函数打开文件,先用feof检查文件是否还有记录,有记录不能打开就使用return返回系统。没有记录则关闭文件。
实现过程
根据系统的基本功能,逐个功能进行代码实现,并设计测试用例设计,对逐个功能进行测试(将测试结果截图)。
功能1:数据包括:航班号、座位编号、座位是否预订、预订人姓名
输入1,显示结构体的航班号、座位编号、座位是否预订、预订人姓名
如图3-8所示。

图3-8 数据图
功能2:乘客可在本系统查询航班座位预订信息
查询预订信息,输入2,显示提示信息,如图3-9所示。

图3-9 查询座位信息图
根据图3-9的提示信息选择航班号输入1~3,然后输入查找的座位编号,如图3-10所示。
![]()
图3-10 输入座位图
错误输入座位编号则重新输入,座位是1A~1E、2A~2E、3A~3E、4A~4E、5A~5E,如图3-11所示。

图3-11 座位输入错误图
正确输入座位编号后显示座位是否被预订,如图3-12。

图3-12 座位没有被预订图
功能3:可在线预订座位
输入5,显示提示信息,进入在线预约功能,如图3-13所示。

图3-13 在线预约图
根据图3-13的提示信息,输入1~3的数字,然后输入预约的座位,如图3-14所示。
![]()
图3-14 输入座位图
输入座位编号接着输入姓名预约座位,如图3-15所示。

图3-15 输入姓名图
如果座位被预订则需要重新预约座位,如图3-16所示。
如果输入错误也需要重新输入,如图3-11所示。

图3-16 座位已被预订图
功能4:可对记录的姓名、航班号、座位编号等信息进行修改
输入3,进入修改功能,如图3-17所示。

图3-17 信息修改图
依次输入航班号和座位编号,如图3-18所示。

图3-18 输入信息图
输入y进行修改,n则不修改,如图3-19所示。

图3-19 是否修改效果图
功能5:可显示所有航班预订数据
输入1,显示所有数据,如图3-20所示。

图3-20 显示信息效果图
功能6:可取消预约座位
输入4,输入需要取消预习的航班号和座位编号,如图3-21所示。
输入错误或者没有预订则显示“没有预订信息,取消失败”,如图3-22。

图3-21 成功取消预订效果图

图3-22 失败取消预订效果图
功能7:保存信息到文件中
输入6,然后输入储存的文件地址,如图3-23所示。
保存的文件时使用fwrite函数文件是乱码状态,如图3-24所示。

图3-24 保存的文件图

图3-23 保存效果图
功能8:从文件中读取信息
输入7,然后输入读取的文件名读取文件,如图3-25.

图3-25 读取效果图
至此简单的航班座位预订基本实现,下面附完整代码。希望对你有所帮助
#define NULL 0
#define M 100 //数组个数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
struct Pass { //定义结构体
char name[20]; //姓名
char flight[20] ; //航班号
char seat[20]; //座位编号
char information[10];//预订信息
};
void print(struct Pass s[], int n); //显示所有预订信息
void search(struct Pass s[], int n); //查询航班座位预订信息
int add(struct Pass s[], int n); //在线预订座位
void modify(struct Pass s[], int n); //修改预订座位信息
int del(struct Pass s[], int n); //取消预订座位信息
void save(struct Pass s[], int n); //保存到文件
int load(struct Pass s[]); //读取文件
char menu();
int main() {
struct Pass Passenger[M];
int length = 0 ; //预约个数
for (;;) //无限循环
switch (menu()) { //调用主菜单
case '1':
print(Passenger, length); //显示所有信息
break;
case '2':
search(Passenger, length); //查找
break;
case '3':
modify(Passenger, length); //修改
break;
case '4':
length = del(Passenger, length); //取消预约
break;
case '5':
length = add(Passenger, length); //在线预订
break;
case '6':
save(Passenger, length); //保存到文件中
break;
case '7':
length = load(Passenger); //读取文件信息
break;
case '8': //退出
system("cls");
printf("欢迎下次使用\n");
exit(0);
break;
default:
break;
}
return 0;
}
char menu() { //菜单 返回字符
char choice ;
printf("*********************************\n"); //提示信息
printf("*\t航班座位预订系统\t*\n");
printf("*********************************\n");
printf("*\t请选择功能\t\t*\n");
printf("*********************************\n");
printf("*\t1.显示所有预订信息\t*\n");
printf("*\t2.查询座位预订信息\t*\n");
printf("*\t3.修改预订座位信息\t*\n");
printf("*\t4.取消预订座位 \t*\n");
printf("*\t5.在线预订座位 \t*\n");
printf("*\t6.保存信息到文件中\t*\n");
printf("*\t7.从文件中读取信息\t*\n");
printf("*\t8.退出系统\t\t*\n");
printf("*********************************\n");
printf("\n请输入:\n");
choice = _getch(); //conio中的函数,不会吸收回车
while (1) {
if (choice >= '1' && choice <= '8') //判断选项是否正确输入
break;
else {
printf("输入错误,请重新输入:\n");
choice = _getch();
}
}
printf("%c\n", choice);
return choice; //返回选项给主函数
}
void print(struct Pass s[], int n) { //显示所有记录
int i;
printf("\n|%-8s|%-8s|%-8s|%s\n", "姓名", "航班号", "座位编号", "是否预订 ");
for (i = 0; i < n; i++) {
printf("|%-8s|%-8s|%-8s|%s\n", s[i].name, s[i].flight, s[i].seat, s[i].information );
}
printf("***********************************\n");
system("pause"); //暂停
system("cls"); //清空
}
void modify(struct Pass s[], int n) { //修改信息
char flight[10], seat[10], ch, a[10];
int i, j = 0;
const char *str = a;
printf("输入要修改的航班号(AC8848/4U4888/UH6041):");
scanf("%s", flight);
getchar();
printf("输入要修改的座位编号:");
scanf("%s", seat);
getchar();
for (i = 0; i < n; i++) //循环寻找信息
if (strcmp(s[i].flight, flight) == 0 && strcmp(s[i].seat, seat) == 0)
break;
if (i >= n)
printf("航班%s座位%s没有预订信息", flight, seat);
else {
printf("是否修改航班(y/n)? ");
ch = getchar();
getchar();
if (ch == 'y') {
printf("*********************************\n"); //提示信息
printf("*\t输入1改为AC8848航班 *\n");
printf("*\t输入2改为4U4888航班 *\n");
printf("*\t输入3改为UH6041航班 *\n");
printf("*********************************\n");
char x = _getch();
while (1) { //判断输入是否正确
if (x >= '1' && x <= '3')
break;
else {
printf("输入错误,请重新输入:\n");
x = _getch();
}
}
switch (x) { //选择航班
case '1':
strcpy(s[i].flight, "AC8848");
break;
case '2':
strcpy(s[i].flight, "4U4888");
break;
case '3':
strcpy(s[i].flight, "UH6041");
break;
default :
break;
}
}
printf("是否修改姓名(y/n)? ");
ch = getchar();
getchar();
if (ch == 'y') {
printf("输入修改的姓名:");
scanf("%s", s[i].name);
getchar();
}
printf("是否修改座位编号(y/n)? ");
ch = getchar();
getchar();
if (ch == 'y') {
printf("输入修改的座位编号:");
scanf("%s", a);
getchar();
while (1) {
if ('1' <= a[0] && a[0] <= '5' && 'A' <= a[1] && a[1] <= 'E') {
for ( j = 0; j < n; j++)
if (strcmp(s[j].flight, s[i].flight) == 0 ) {
if (strcmp(s[j].seat, str) == 0) {
printf("座位被预订请重新输入座位编号(1~5排A~E座):");
scanf("%s", a);
break;
}
}
if (j >= n) {
strcpy(s[i].seat, str);
break;
}
} else {
printf("没有此座位请重新输入座位编号(1~5排A~E座):");
scanf("%s", a);
}
}
} else
strcpy( a, s[i].seat);
printf("修改成功\n");
}
printf("\n");
system("pause");
system("cls");
return;
}
void search(struct Pass s[], int n) {
char flight[20], seat[20];
int j, c;
printf("*********************************\n"); //提示信息
printf("*\t输入1查找AC8848航班 *\n");
printf("*\t输入2查找4U4888航班 *\n");
printf("*\t输入3查找UH6041航班 *\n");
printf("*********************************\n");
char x = _getch();
while (1) { //判断输入是否正确
if (x >= '1' && x <= '3')
break;
else {
printf("输入错误,请重新输入:\n");
x = _getch();
}
}
switch (x) {
case '1':
strcpy(flight, "AC8848");
printf("查找的座位编号(1~5排A~E座):");
scanf("%s", seat);
getchar();
break;
case '2':
strcpy(flight, "4U4888");
printf("查找的座位编号(1~5排A~E座):");
scanf("%s", seat);
getchar();
break;
case '3':
strcpy(flight, "UH6041");
printf("查找的座位编号(1~5排A~E座):");
scanf("%s", seat);
getchar();
break;
default :
break;
}
while (1) {
if ('1' <= seat[0] && seat[0] <= '5' && 'A' <= seat[1] && seat[1] <= 'E') {
for (j = 0; j < n; j++)
if (strcmp(flight, s[j].flight) == 0 && strcmp(s[j].seat, seat) == 0 ) {
printf("座位已被预订\n");
c = 1;
}
if (c == 1)
break;
if (j >= n) {
printf("座位无预订\n");
break;
}
} else {
printf("没有此座位请重新输入座位编号(1~5排A~E座):");
scanf("%s", seat);
}
}
system("pause");
system("cls");
}
int add(struct Pass s[], int n) { //预订
char a[10];
const char *str = a;
int i = 0;
if (n == M) //检查数组是否满
printf("预约上限\n");
else {
n++;
printf("*********************************\n"); //提示信息
printf("*\t输入1预约AC8848航班 *\n");
printf("*\t输入2预约4U4888航班 *\n");
printf("*\t输入3预约UH6041航班 *\n");
printf("*********************************\n");
char x = _getch();
while (1) { //判断输入是否正确
if (x >= '1' && x <= '3')
break;
else {
printf("输入错误,请重新输入:\n");
x = _getch();
}
}
switch (x) { //选择航班
case '1':
strcpy(s[n - 1].flight, "AC8848");
printf("输入座位编号(1~5排A~E座):");
scanf("%s", a);
printf("输入姓名:");
scanf("%s", s[n - 1].name);
break;
case '2':
strcpy(s[n - 1].flight, "4U4888");
printf("输入座位编号(1~5排A~E座):");
scanf("%s", a);
printf("输入姓名:");
scanf("%s", s[n - 1].name);
break;
case '3':
strcpy(s[n - 1].flight, "UH6041");
printf("输入座位编号(1~5排A~E座):");
scanf("%s", a);
printf("输入姓名:");
scanf("%s", s[n - 1].name);
break;
default :
break;
}
while (1) {
if ('1' <= a[0] && a[0] <= '5' && 'A' <= a[1] && a[1] <= 'E') {
for ( i = 0; i < n; i++)
if (strcmp(s[i].flight, s[n - 1].flight) == 0 ) {
if (strcmp(s[i].seat, str) == 0) {
printf("座位被预订请重新输入座位编号(1~5排A~E座):");
scanf("%s", a);
break;
}
}
if (i >= n) {
strcpy(s[n - 1].seat, str);
break;
}
} else {
printf("没有此座位请重新输入座位编号(1~5排A~E座):");
scanf("%s", a);
}
}
strcpy(s[n - 1].information, "是");
printf("预订成功\n");
}
system("pause");
system("cls");
return n;
}
int del(struct Pass s[], int n) { //删除信息
char flight[10], seat[10];
int i, j;
printf("输入要取消的航班号:");
scanf("%s", flight);
printf("输入要取消的座位编号:");
scanf("%s", seat);
for (i = 0 ; i < n; i++) {
if (strcmp(flight, s[i].flight) == 0 && strcmp(seat, s[i].seat) == 0) { //查找对应信息
for (j = i + 1; j < n; j++) { //从第i+1个数据前移,删除第i个数据
strcpy(s[j - 1].name, s[j].name);
strcpy(s[j - 1].flight, s[j].flight);
strcpy(s[j - 1].information, s[j].information);
strcpy(s[j - 1].seat, s[j].seat);
n--;
}
printf("取消成功\n");
break;
}
}
if (i >= n)
printf("没有预订信息,取消失败\n"); //没有记录
system("pause");
system("cls");
return n;
}
void save(struct Pass s[], int n) { //保存到文件中
FILE *fp; //定义指向文件的指针
int i;
char outfile[20];
printf("请输入文件名(格式:C:\\CC\\temp\\file.doc)\n"); //提示格式信息
scanf("%s", outfile);
if ((fp = fopen(outfile, "w+") ) == NULL) { //打开文件,没有则建立
printf("不能打开文件\n"); //不能打开,则结束
return;
} else {
for (i = 0; i < n; i++)
fwrite(&s[i], sizeof(struct Pass), 1, fp); //存一条
fclose(fp); //关闭文件
printf("保存成功\n");
}
system("pause");
system("cls");
}
int load(struct Pass s[]) { //读取文件信息
FILE *fp; //定义指向文件的指针
int n = 0;
char infile[20]; //储存文件名
printf("请输入读取的文件:(格式:C:\\CC\\temp\\file.doc)\n");
scanf("%s", infile);
if ((fp = fopen(infile, "r")) == NULL) { //打开文件
printf("读取失败\n");
system("pause");
system("cls");
return 0; //不能打开,退出程序
} else {
if (fp != NULL)
while (!feof(fp)) { //feof判断文件是否还有记录
fread(&s[n], sizeof(struct Pass), 1, fp);
n++;
}
fclose(fp); //关闭文件
printf("读取成功\n");
}
system("pause");
system("cls");
return --n;
}
更多推荐


所有评论(0)