用c语言完成【问题描述】输入一组人员的姓名 身高(以cm为单位),输出这组人员中身高的中位数,以及位于中位数位置的人员信息。 当输入姓名为#时结束信息输入。人数不超过15人。 中位数是按大小顺序排列的一组数据中居于中间位置的数。 例如,输入N人信息,当N为奇数时,身高中位数就是身高为正中间的数;中位数位置人员为正中1人 当N为偶数时,身高中位数就是处于正中间2个身高数的平均值,中位数位置人员为中间2人。 【输入形式】姓名 身高 以空格或回车分隔数据,输入姓名为#时,输入信息结束 【输出形式】先输出按身高排序后的各人姓名身高,一行输出一人信息。 然后输出中位数以及中位数人员信息如下: 人数为奇数时,输出mid height=身高,name=姓名 人数为偶数时,输出mid height=身高 (正中2人身高均值,保留1位小数输出) first person:姓名,身高 (正中第1人) second person:姓名,身高 (正中第2人)
时间: 2024-02-10 22:09:17 浏览: 136
好的,我会根据你的要求进行对话并协助你解决问题。对于你的问题,我可以给你提供一个C语言的代码实现,你可以参考一下:
```c
#include <stdio.h>
#include <string.h>
#define MAXN 15
struct Person {
char name[20];
int height;
} persons[MAXN];
int cmp(const void *a, const void *b) {
struct Person *pa = (struct Person *)a;
struct Person *pb = (struct Person *)b;
if (pa->height != pb->height) return pb->height - pa->height;
else return strcmp(pa->name, pb->name);
}
int main() {
int n = 0, mid, left, right, is_odd = 0;
while (scanf("%s %d", persons[n].name, &persons[n].height) == 2) {
if (persons[n].name[0] == '#') break;
n++;
}
qsort(persons, n, sizeof(struct Person), cmp);
mid = n / 2;
if (n % 2 == 1) {
is_odd = 1;
printf("mid height=%d,name=%s\n", persons[mid].height, persons[mid].name);
left = mid - 1, right = mid + 1;
} else {
printf("mid height=%.1f\n", (persons[mid-1].height + persons[mid].height) / 2.0);
left = mid - 1, right = mid;
}
while (left >= 0 && right < n) {
printf("first person:%s,%d\n", persons[left].name, persons[left].height);
printf("second person:%s,%d\n", persons[right].name, persons[right].height);
left--, right++;
}
if (left >= 0) printf("first person:%s,%d\n", persons[left].name, persons[left].height);
if (right < n) printf("second person:%s,%d\n", persons[right].name, persons[right].height);
return 0;
}
```
这段代码使用了结构体保存每个人的姓名和身高,然后使用qsort函数进行排序,最后根据人数的奇偶性输出中位数和中位数位置的人员信息。你可以在自己的电脑上编译运行一下,看看是否符合你的要求。
阅读全文