功能需求

设计过程

(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;
}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐