【问题描述】输入一组人员的姓名 身高(以cm为单位),输出这组人员中身高的中位数,以及位于中位数位置的人员信息。 当输入姓名为#时结束信息输入。人数不超过15人。 中位数是按大小顺序排列的一组数据中居于中间位置的数。 例如,输入N人信息,当N为奇数时,身高中位数就是身高为正中间的数;中位数位置人员为正中1人 当N为偶数时,身高中位数就是处于正中间2个身高数的平均值,中位数位置人员为中间2人。 【输入形式】姓名 身高 以空格或回车分隔数据,输入姓名为#时,输入信息结束 【输出形式】先输出按身高排序后的各人姓名身高,一行输出一人信息。 然后输出中位数以及中位数人员信息如下: 人数为奇数时,输出mid height=身高,name=姓名 人数为偶数时,输出mid height=身高 (正中2人身高均值,保留1位小数输出) first person:姓名,身高 (正中第1人) second person:姓名,身高 (正中第2人)
时间: 2024-02-10 12:09:17 浏览: 169
以下是C++代码实现:
```c++
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct Person {
string name;
int height;
};
bool cmp(Person p1, Person p2) {
if (p1.height != p2.height) {
return p1.height < p2.height;
} else {
return p1.name > p2.name;
}
}
int main() {
Person people[15];
int count = 0;
while (true) {
cin >> people[count].name;
if (people[count].name == "#") {
break;
}
cin >> people[count].height;
count++;
}
sort(people, people + count, cmp);
int mid = count / 2;
if (count % 2 == 1) {
cout << "mid height=" << people[mid].height << ",name=" << people[mid].name << endl;
} else {
cout << "mid height=" << (people[mid - 1].height + people[mid].height) / 2.0 << endl;
cout << "first person:" << people[mid - 1].name << "," << people[mid - 1].height << endl;
cout << "second person:" << people[mid].name << "," << people[mid].height << endl;
}
for (int i = 0; i < count; i++) {
cout << people[i].name << " " << people[i].height << endl;
}
return 0;
}
```
代码思路:
首先定义一个名为`Person`的结构体,包含姓名和身高两个成员变量,用于存储每一个人的信息。
然后定义一个`cmp`函数作为`sort`函数的第三个参数,用于排序。排序的规则是先按照身高从小到大排序,如果身高相等,则按照姓名从大到小排序。
接着用一个循环读入每一个人的信息,当输入姓名为`#`时结束输入。同时用一个变量`count`记录输入的人数。
然后调用`sort`函数对所有人的信息进行排序。
接着根据人数的奇偶性计算出中位数。如果人数为奇数,则中位数即为正中间的那个人的身高和姓名;如果人数为偶数,则中位数为正中间两个人的身高的平均值。
最后输出所有人的信息和中位数相关的信息。
注意事项:
1. 输出中要保留小数,可以用`double`类型存储中位数,输出时使用`printf`函数格式化输出,保留1位小数。
2. 注意排序时身高相等时按照姓名从大到小排序,可以使用一个if语句进行判断。
阅读全文