没说能不能用结构体 我就没用了 用数组 写写还挺头疼的 要考虑排名时要对应裁判编号和运动员编号写的挺复杂 如果有简化的 麻烦共同进步一下
#include<stdio.h>
#include<time.h>
#include<math.h>
#include <stdlib.h>
#define N 5
#define M 12
int main() {
//A代表运动员 C代表裁判
int s[N][M], s1[N][M]; //s1用于算平均分等操作,s用于第二问
double averageA[N], averageC[M], sumC[M], averageA1[N], averageC1[M];//averageA1[N], averageC1[M]用于排名时进行比较
int sumA[N], numA[N],numC[M];
int temp;
srand((unsigned)time(NULL));
//随机数给分
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++) {
s[i][j] = rand() % 10;
s1[i][j] = s[i][j];
printf("%d\t", s[i][j]);
}
printf("\n");
}
//将每个人分数从小到大排列
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M - 1; j++) {
if (s1[i][j] > s1[i][j + 1]) {
temp = s1[i][j + 1];
s1[i][j + 1] = s1[i][j];
s1[i][j] = temp;
}
}
}
//计算平均分
for (int i = 0; i < N; i++)
{
sumA[i] = 0;
numA[i] = i + 1; //运动员编号赋值
for (int j = 1; j < M - 1; j++) { //通过下标限制去掉最高分和最低分
sumA[i] += s1[i][j];
}
averageA[i] = sumA[i] / (double)(M - 2);
averageA1[i] = sumA[i] / (double)(M - 2);
}
//将每个人平均分从大到小排列并且在numA排名表中对应切换运动员编号
for (int i = 0; i < N-1; i++)
{
for (int j = i+1; j < N ; j++) {
if (averageA1[i] < averageA1[j]) {
temp = averageA1[i];
averageA1[i] = averageA1[j];
averageA1[j] = temp;
temp = numA[i];
numA[i] = numA[j];
numA[j] = temp;
}
}
}
//输出排名
for (int j = 0; j < N ; j++) {
printf("%d号运动员得分%.2lf\n", numA[j], averageA[numA[j]-1]);
}
printf("\n");
//计算标准差
for (int i = 0; i < M; i++) {
sumC[i] = 0;
numC[i] = i + 1;
for (int j = 0; j < N; j++) {
sumC[i] += pow((s[numA[j] - 1][i] - averageA[numA[j] - 1]), 2);
}
averageC[i] = sqrt(sumC[i] / (double)(N - 1));
averageC1[i] = sqrt(sumC[i] / (double)(N - 1));
}
//将每个裁判的标准差从大到小排列并且numC排名表中切换对应裁判编号
for (int i = 0; i < M - 1; i++)
{
for (int j = i + 1; j < M; j++) {
if (averageC1[i] < averageC1[j]) {
temp = averageC1[i];
averageC1[i] = averageC1[j];
averageC1[j] = temp;
temp = numC[i];
numC[i] = numC[j];
numC[j] = temp;
}
}
}
//输出排名
for (int j = 0; j < M; j++) {
printf("%d号裁判得分%.2lf\n", numC[j], averageC[numC[j] - 1]);
}
}
定义一个二维数组,用随机数产生0-10的分数,统计每个每个选手的总分、最高分和最低分,根据规则得到平均分