m0_63560339 2021-11-24 12:59 采纳率: 33.3%
浏览 54
已结题

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

img

  • 写回答

2条回答 默认 最新

  • 南城Flipped 2021-11-24 14:22
    关注

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

    
    #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]);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月2日
  • 已采纳回答 11月24日
  • 创建了问题 11月24日