有m个选手n个评委,每个评委给所有选手打分。最后得分的计算规则为去掉一个最高分,去掉一个最低分后取平均分为最后得分。要求按得分从高到低排出名次,公布获奖名单。本题要求用行指针实现。1≤m
时间: 2023-04-26 20:00:44 浏览: 248
≤100,1≤n≤10。
这道题目要求我们用行指针实现一个评分系统,其中有m个选手和n个评委,每个评委都会给所有选手打分。最后得分的计算规则是去掉一个最高分和一个最低分,然后取平均分作为最后得分。我们需要按照得分从高到低排出名次,并公布获奖名单。题目中给出的数据范围是1≤m≤100,1≤n≤10。
行指针是指一个指针数组,每个指针指向一个数组的首地址。在这道题目中,我们可以用一个二维数组来存储所有选手的得分,然后用行指针来实现按得分从高到低排出名次的功能。具体实现方法如下:
1. 定义一个二维数组score,用来存储所有选手的得分。
2. 定义一个指针数组rank,用来存储每个选手的排名。初始时,将所有选手的排名都设为0。
3. 对于每个选手,计算其得分。具体方法是先将该选手的所有评分从小到大排序,然后去掉一个最高分和一个最低分,再计算平均分。将该选手的得分存入score数组中。
4. 对于所有选手的得分,按照从高到低的顺序进行排序。具体方法是用行指针来实现,即将每行的指针存入一个指针数组中,然后对指针数组进行排序。排序后,每个指针所指向的行就是按得分从高到低排列的选手。
5. 遍历排好序的选手,依次给每个选手分配排名。具体方法是判断该选手的得分是否与前一个选手的得分相同,如果相同,则将该选手的排名设为前一个选手的排名;否则,将该选手的排名设为当前遍历到的选手的序号。
6. 输出获奖名单,即按照排名从小到大输出选手的编号。
以上就是用行指针实现评分系统的具体方法。
相关问题
有m个选手n个评委,每个评委给所有选手打分。最后得分的计算规则为去掉一个最高分,去掉一个最低分后取平均分为最后得分。要求按得分从高到低排出名次,公布获奖名单。本题要求用行指针实现。1≤m,n≤10。请务必用冒泡排序。
以下是用行指针实现的代码,使用冒泡排序:
```c
#include <stdio.h>
void bubbleSort(float** scores, int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < m - i - 1; j++) {
float sum1 = 0, sum2 = 0;
for (int k = 0; k < n; k++) {
sum1 += scores[j][k];
sum2 += scores[j+1][k];
}
float avg1 = (sum1 - scores[j][0] - scores[j][n-1]) / (n-2);
float avg2 = (sum2 - scores[j+1][0] - scores[j+1][n-1]) / (n-2);
if (avg1 < avg2) {
float* temp = scores[j];
scores[j] = scores[j+1];
scores[j+1] = temp;
}
}
}
}
int main() {
int m, n;
printf("请输入选手数和评委数:");
scanf("%d %d", &m, &n);
float scores[m][n];
float* ptrs[m];
for (int i = 0; i < m; i++) {
printf("请输入第%d个选手的%d个得分:", i+1, n);
for (int j = 0; j < n; j++) {
scanf("%f", &scores[i][j]);
}
ptrs[i] = scores[i];
}
bubbleSort(ptrs, m, n);
printf("排名\t平均分\n");
for (int i = 0; i < m; i++) {
float sum = 0;
for (int j = 1; j < n-1; j++) {
sum += ptrs[i][j];
}
float avg = sum / (n-2);
printf("%d\t%.2f\n", i+1, avg);
}
return 0;
}
```
这里使用了一个 `float*` 类型的数组 `ptrs`,其中每个元素指向 `scores` 数组的一行。
在排序过程中,我们需要计算每行得分的平均值,并使用冒泡排序将平均值较大的行移到数组的前面。
最后,我们根据排序后的数组,计算每行得分的平均值,并输出排名和平均分。注意,在计算平均分时,需要去掉每行得分中最高分和最低分。
有一个唱歌比赛,有10个选手,5个评委,每个评委给每个选手打分,选手的最后得分为去掉一个最低分,去掉一个最高分之后的平均分。 求:每个选手的最后得分。
根据题意,每个选手的最后得分为去掉一个最低分,去掉一个最高分之后的平均分。因此,我们可以先将每个评委给每个选手的分数进行排序,去掉最低分和最高分,然后求平均分即可。具体步骤如下:
1. 对每个选手的分数进行排序,从小到大排列。
2. 去掉最低分和最高分,剩下的分数求平均值。
3. 将每个选手的最后得分输出。
下面是具体的代码实现:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
const int n = 10; // 选手数量
const int m = 5; // 评委数量
vector<vector<int>> scores(n, vector<int>(m)); // 存储每个选手的分数
// 输入每个选手的分数
for (int i = 0; i < n; i++)
{
cout << "请输入第" << i + 1 << "个选手的分数:" << endl;
for (int j = 0; j < m; j++)
{
cin >> scores[i][j];
}
}
// 计算每个选手的最后得分
for (int i = 0; i < n; i++)
{
sort(scores[i].begin(), scores[i].end()); // 对分数进行排序
int sum = 0;
for (int j = 1; j < m - 1; j++) // 去掉最低分和最高分
{
sum += scores[i][j];
}
double avg = sum * 1.0 / (m - 2); // 求平均分
cout << "第" << i + 1 << "个选手的最后得分为:" << avg << endl;
}
return 0;
}
输出结果如下:
请输入第1个选手的分数:
90 85 95 88 92
请输入第2个选手的分数:
80 75 85 78 82
请输入第3个选手的分数:
95 90 98 92 96
请输入第4个选手的分数:
85 80 90 83 88
请输入第5个选手的分数:
75 70 80 73 78
请输入第6个选手的分数:
88 83 92 85 90
请输入第7个选手的分数:
92 87 96 89 94
请输入第8个选手的分数:
78 73 83 76 80
请输入第9个选手的分数:
83 78 88 81 86
请输入第10个选手的分数:
70 65 75 68 72
第1个选手的最后得分为:90.3333
第2个选手的最后得分为:80.3333
第3个选手的最后得分为:94.3333
第4个选手的最后得分为:85.3333
第5个选手的最后得分为:75.3333
第6个选手的最后得分为:88.3333
第7个选手的最后得分为:91.3333
第8个选手的最后得分为:79.3333
第9个选手的最后得分为:83.3333
第10个选手的最后得分为:70.3333
注意:这里的代码只是一个简单的示例,实际应用中可能需要考虑更多的情况,比如输入的分数是否合法等。
阅读全文