利用数组的相关知识解决问题

img

没说能不能用结构体 我就没用了 用数组 写写还挺头疼的 要考虑排名时要对应裁判编号和运动员编号写的挺复杂 如果有简化的 麻烦共同进步一下


#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的分数,统计每个每个选手的总分、最高分和最低分,根据规则得到平均分