用c语言有m个选手n个评委,每个评委给所有选手打分。最后得分的计算规则为去掉一个最高分,去掉一个最低分后取平均分为最后得分。要求按得分从高到低排出名次,公布获奖名单。本题要求用行指针实现。1≤m,n≤10。请务必用冒泡排序。 输入格式: 输入共m+1行,第一行是m和n两个整数,其他行是m×n个整数。 输出格式: 输出一行,表示选手编号的一种排列(用%3d格式)
时间: 2024-01-21 18:19:03 浏览: 49
以下是一种实现方式,注意代码中的注释:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_M 10
#define MAX_N 10
// 计算一个选手的得分
double get_score(int *scores, int n) {
int max = scores[0], min = scores[0], sum = scores[0];
for (int i = 1; i < n; i++) {
if (scores[i] > max) max = scores[i];
if (scores[i] < min) min = scores[i];
sum += scores[i];
}
return (double)(sum - max - min) / (n - 2);
}
// 冒泡排序,按照得分从高到低排序
void bubble_sort(double *scores, int *ids, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (scores[j] < scores[j + 1]) {
double tmp_score = scores[j];
scores[j] = scores[j + 1];
scores[j + 1] = tmp_score;
int tmp_id = ids[j];
ids[j] = ids[j + 1];
ids[j + 1] = tmp_id;
}
}
}
}
int main() {
int m, n;
scanf("%d%d", &m, &n);
// 动态分配m个选手的二维数组
int **all_scores = (int **)malloc(m * sizeof(int *));
for (int i = 0; i < m; i++) {
all_scores[i] = (int *)malloc(n * sizeof(int));
}
// 读入所有选手的分数
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &all_scores[i][j]);
}
}
// 计算每个选手的得分
double *final_scores = (double *)malloc(m * sizeof(double));
int *ids = (int *)malloc(m * sizeof(int));
for (int i = 0; i < m; i++) {
final_scores[i] = get_score(all_scores[i], n);
ids[i] = i + 1; // 选手编号从1开始
}
// 排序,输出排名
bubble_sort(final_scores, ids, m);
for (int i = 0; i < m; i++) {
printf("%3d", ids[i]);
}
printf("\n");
// 释放内存
for (int i = 0; i < m; i++) {
free(all_scores[i]);
}
free(all_scores);
free(final_scores);
free(ids);
return 0;
}
```