算法与数据结构——航班信息的查询与检索

一、概要设计

        构建一个结构体,用于存放单个航班信息表,其中存储航班号、起点站、终点站、起飞时间、到达时间、飞机型号和票价;再在外部嵌套一个结构体,内含一个数组,用于存放总航班信息表。

        初始化函数利用循环体,将航班信息存入每个单个航班信息表中。若输入与规定类型不符,则报错,并返回后重新输入。

        展示函数利用循环体,将已存入的所有航班信息输出。

        六个顺序查找函数分别用于按起点站、终点站、起飞时间、到达时间、飞机型号、票价查找航班,并将查找到的航班进行输出。

        排序函数将航班信息按航班号进行排序。

        折半查找函数内含排序函数,先将航班信息按航班号进行排序,再利用折半查找找到用户输入的航班号,最后输出航班号对应航班信息。

        总查找函数按照输入的序号,来决定调用七个查找函数中的哪一个,并输入需要查找的对象。若未找到相应航班信息,则退出,并输出“无法找到该航班!”

        主函数中先构建结构体,并调用初始化函数,随后进入循环函数,即进入主程序,由判断函数决定进入展示还是查询系统,并通过用户输入来决定进入的程序。

二、详细设计和编码

        struct FlyNode为单个航班信息表,其中包含 string num,string depart_station,string arrive_station,string depart_time,string arrive_time,string model,int price,分别为航班号、起点站、终点站、起飞时间、到达时间、飞机型号和票价。

        FlyList用于存放总航班信息表,其中包含FlyNode类型的数组。

        void create(FlyList& list)用于初始化总航班信息表,利用循环结构分别将每条航班信息的航班号、起点站、终点站、起飞时间、到达时间、飞机型号和票价输入。若票价为NULL或其余六项存在空字符串,则报错,清空cin缓存后返回,重新输入;反之则赋值到FlyNode中的各项中。

其余函数:

        void show(FlyList& list)

        void sort(FlyList& list, int n)

        void search_depart_station(FlyList list, string k)

        void search_arrive_station(FlyList list, string k)

        void search_depart_time(FlyList list, string k)

        void search_arrive_time(FlyList list, string k)

        void search_model(FlyList list, string k)

        void search_price(FlyList list, int k)

        void search_num(FlyList list, string k)

        void Search(FlyList list, int key)

三、主要代码

void sort(FlyList& list, int n)                   //将航空信息按航班号排序
{
	int i = n - 1;                                //冒泡排序
	FlyNode temp;
	for (int i = 0; i < MaxSize - 1; i++)
		for (int j = 0; j < MaxSize - 1 - i; j++)
			if (list.sl[j].num.compare(list.sl[j + 1].num) > 0)               //航班号从小到大排序,若前项大于后项,则交换整个FlyNode
			{
				temp = list.sl[j];
				list.sl[j] = list.sl[j + 1];
				list.sl[j + 1] = temp;
			}
}

void search_depart_station(FlyList list, string k)                       //起点站_顺序查找
{
	int j = 0;
	cout << "航班号\t起点站\t终点站\t起飞时间\t到达时间\t飞机型号\t票价" << endl;
	for (int i = MaxSize - 1; i >= 0; i--)
	{
		if (k == list.sl[i].depart_station)
		{
			j++;
			cout << list.sl[i].num << "\t" << list.sl[i].depart_station << "\t" << list.sl[i].arrive_station << "\t" << list.sl[i].depart_time << "\t" << list.sl[i].arrive_time << "\t" << list.sl[i].model << "        " << list.sl[i].price << endl;
		}
	}
	if (j == 0)
		cout << "无法找到该航班!" << endl;
}

void search_num(FlyList list, string k)                       //航班号_折半查找
{
	int low = 0, high = MaxSize - 1, j = 0;
	cout << "航班号\t起点站\t终点站\t起飞时间\t到达时间\t飞机型号\t票价" << endl;
	while (low <= high)
	{
		int mid = (low + high) / 2;
		if (k == list.sl[mid].num)
		{
			j++;
			cout << list.sl[mid].num << "\t" << list.sl[mid].depart_station << "\t" << list.sl[mid].arrive_station << "\t" << list.sl[mid].depart_time << "\t" << list.sl[mid].arrive_time << "\t" << list.sl[mid].model << "        " << list.sl[mid].price << endl;
			break;
		}
		else if (k > list.sl[mid].num)
			low = mid + 1;
		else high = mid - 1;
	}
	if (j == 0)
		cout << "无法找到该航班!" << endl;
}

四、调试分析及运行结果

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1.问题描述 该设计要求对飞机航班信息进行排序和查找。可按航班的航班号、起点站、终点站、起飞时间以及到达时间等信息进行查询。 2.扩展功能: ①能够在起点站与终点站相同的航班信息中筛选出票价最低及飞行时间最短的航班,并显示; ②能够不断添加新的航班信息; ③能够检验输入时间的合法性。 3.任务要求 对于本设计,可采用基数排序法对一组具有结构特点的飞机航班号进行排序,利用二分查找法对排好序的航班记录按航班号实现快速查找,按其他次关键字的查找可采用最简单的顺序查找方法进行,因此他们用得较少。 每个航班记录包括八项,分别是:航班号、起点站、终点站、班期、起飞时间、到达时间、飞机型号以及票价等,假设航班信息表(8条记录) 航班号 起点站 终点站 班期 起飞时间 到达时间 机型 票价 CA1544 合肥 北京 1.2.4.5 1055 1240 733 960 MU5341 上海 广州 每日 1420 1615 M90 1280 CZ3869 重庆 深圳 2.4.6 0855 1035 733 1010 MU3682 桂林 南京 2.3.4.6.7 2050 2215 M90 1380 HU1836 上海 北京 每日 0940 1120 738 1250 CZ3528 成都 厦门 1.3.4.5.7 1510 1650 CRJ 1060 MU4594 昆明 西安 1.3.5.6 1015 1140 328 1160 SC7425 青岛 海口 1.3.6 1920 2120 DH4 1630 其中航班号一项的格式为: K0 K1 K2 K3 K4 K5 C Z 3 8 6 9 其中K0和K1的输入值是航空公司的别称,用两个大写字母标示,后4位为航班号,这种航班号关键字可分成两段,即字母和数字。其余七项输入内容因为不涉及本设计的核心,因此除了票价为数值型外,均定义为字符串即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱桃小叮当

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值