一维数组实验题:大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选
时间: 2023-04-28 10:03:31 浏览: 151
手的最终得分。请编写一个程序,输入每个选手的m个得分,输出每个选手的最终得分。
思路:对于每个选手,先将其m个得分从小到大排序,然后去掉最高分和最低分,再求平均值即可。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
int n, m;
int score[MAXN][MAXN];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> score[i][j];
}
sort(score[i] + 1, score[i] + m + 1); // 排序
int sum = ;
for (int j = 2; j <= m - 1; j++) { // 去掉最高分和最低分
sum += score[i][j];
}
cout << sum / (m - 2) << endl; // 求平均值
}
return ;
}
相关问题
【题目】某大奖赛有n个选手参赛,m(m>2)个评委为依次参赛的选手评判打分:最高10分,最低0分。统分规则为:每个选手所得的m 个评分中,去掉一个最高分,去掉 个最低分,然后平均为该选手的最后得分。根据n个选手的最后得分从高到低排出名次表,以便确定获奖名单。使用数组方法实现程序设计。 【编程提示】定义3个数组:sh[i为第i个选手编号,fUj]为第j个评委给第i个选手的评分,sf为第i个选手的最后得分。对第i个选手,将每个fiU]累加到sfi]中,然后求最后得分sf=(sf]-max-min)/(m-2),将n个选手的最后得分sf根据冒泡法从高到低排序后输出。(用c语言)
以下是使用C语言实现的代码:
```c
#include <stdio.h>
#define MAXN 100
int sh[MAXN], fj[MAXN][MAXN], n, m;
double sf[MAXN];
void bubble_sort() {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (sf[j] < sf[j + 1]) {
double temp = sf[j];
sf[j] = sf[j + 1];
sf[j + 1] = temp;
int t = sh[j];
sh[j] = sh[j + 1];
sh[j + 1] = t;
}
}
}
}
int main() {
scanf("%d%d", &n, &m); // 输入选手数量和评委数量
for (int i = 0; i < n; i++) {
scanf("%d", &sh[i]); // 输入选手编号
for (int j = 0; j < m; j++) {
scanf("%d", &fj[i][j]); // 输入评委评分
}
}
for (int i = 0; i < n; i++) {
int max = 0, min = 10; // 初始化最高分和最低分
double sum = 0;
for (int j = 0; j < m; j++) {
if (fj[i][j] > max) max = fj[i][j]; // 更新最高分
if (fj[i][j] < min) min = fj[i][j]; // 更新最低分
sum += fj[i][j];
}
sf[i] = (sum - max - min) * 1.0 / (m - 2); // 计算最终得分
}
bubble_sort(); // 排序
for (int i = 0; i < n; i++) {
printf("%d %.2f\n", sh[i], sf[i]); // 输出结果
}
return 0;
}
```
代码思路:
首先输入选手数量和评委数量,然后输入每个选手的编号和每个评委给该选手的评分。接着,对于每个选手,计算其最终得分,并存储在 `sf` 数组中。计算最终得分时,需要去掉一个最高分和一个最低分,因此需要先找到最高分和最低分。最后,使用冒泡排序将选手按照得分从高到低排序,并输出结果。
用c语言实现某大奖赛有n(1<n<40)个选手参赛,m (2<m<20)个评委为依次参赛的选手评判打分:最高10分,最低0分。统分规则为:每个选手所得的m个得分中,去掉一个最高分,去掉一个最低分,最后平均为该选手的最后得分。根据n个选手的最后得分从高到低排出名次表,以便确定获奖名单。 输入 输入选手的数目n(1<n<40),评委的数目m (2<m<20),以及评委对每位选手的打分。 输出 选手的排名及最终的得分值(小数点后保留两位)。 样例输入 3,5 5.6 7.8 9.4 5.8 8.8 7.8 6.7 8.3 6.9 5.5 6.7 9.2 8.8 8.3 9.0 样例输出 第1名:3号选手,得分8.70 第2名:1号选手,得分7.47 第3名:2号选手,得分7.13
这是一个非常典型的统计问题,需要用到排序和求平均数的知识。以下是可能的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id; //选手编号
double score; //选手得分
} Player;
int compare(const void* a, const void* b) { //用于qsort排序的比较函数
double a_score = ((Player*)a)->score;
double b_score = ((Player*)b)->score;
if (a_score > b_score) {
return -1; //从大到小排序
} else if (a_score < b_score) {
return 1;
} else {
return 0;
}
}
int main() {
int n, m;
printf("请输入选手数n和评委数m:");
scanf("%d,%d", &n, &m);
double** scores = (double**) malloc(n * sizeof(double*));
for (int i = 0; i < n; i++) {
scores[i] = (double*) malloc(m * sizeof(double));
printf("请输入第%d个选手的%d个得分:", i+1, m);
for (int j = 0; j < m; j++) {
scanf("%lf", &scores[i][j]);
}
}
Player* players = (Player*) malloc(n * sizeof(Player));
for (int i = 0; i < n; i++) {
players[i].id = i+1;
double min_score = 10.0, max_score = 0.0;
double score_sum = 0.0;
for (int j = 0; j < m; j++) {
if (scores[i][j] < min_score) {
min_score = scores[i][j];
}
if (scores[i][j] > max_score) {
max_score = scores[i][j];
}
score_sum += scores[i][j];
}
players[i].score = (score_sum - min_score - max_score) / (m-2); //按照题目要求计算排名得分
}
qsort(players, n, sizeof(Player), compare); //排序
for (int i = 0; i < n; i++) {
printf("第%d名:%d号选手,得分%.2lf\n", i+1, players[i].id, players[i].score);
}
//释放内存
for (int i = 0; i < n; i++) {
free(scores[i]);
}
free(scores);
free(players);
return 0;
}
```
需要注意的几点:
1. 输入格式比较特殊,需要用逗号隔开,可以用`scanf`的`%d,%d`格式读入。
2. 由于题目中n和m都比较小,我们可以用二维数组`scores`存储每个选手的得分。如果数据量很大,这种方法可能会导致内存不够用,需要使用其他的数据结构,比如链表或者树。
3. 将选手得分计算出来后,可以用一个结构体数组`players`存储每个选手的编号和得分,而不需要二维数组。
4. 为了方便排序,我们写了一个比较函数`compare`,将得分从大到小排序。C语言中的`qsort`函数需要用到这个比较函数。
5. 最后别忘了释放动态分配的内存,避免内存泄露。
阅读全文