一、概要设计
构建一个结构体,用于存放单个航班信息表,其中存储航班号、起点站、终点站、起飞时间、到达时间、飞机型号和票价;再在外部嵌套一个结构体,内含一个数组,用于存放总航班信息表。
初始化函数利用循环体,将航班信息存入每个单个航班信息表中。若输入与规定类型不符,则报错,并返回后重新输入。
展示函数利用循环体,将已存入的所有航班信息输出。
六个顺序查找函数分别用于按起点站、终点站、起飞时间、到达时间、飞机型号、票价查找航班,并将查找到的航班进行输出。
排序函数将航班信息按航班号进行排序。
折半查找函数内含排序函数,先将航班信息按航班号进行排序,再利用折半查找找到用户输入的航班号,最后输出航班号对应航班信息。
总查找函数按照输入的序号,来决定调用七个查找函数中的哪一个,并输入需要查找的对象。若未找到相应航班信息,则退出,并输出“无法找到该航班!”
主函数中先构建结构体,并调用初始化函数,随后进入循环函数,即进入主程序,由判断函数决定进入展示还是查询系统,并通过用户输入来决定进入的程序。
二、详细设计和编码
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;
}