C语言,校园歌手大赛

题目描述

圆圆是学生会的文艺部部长。她要组织下个月的校园歌手大赛。她为了公平公正原则让你写计算平均成绩并且按平均成绩排序(平均成绩一样的数序不变,排名一样)。平均成绩计算方法(8个评委给选手打分,要求去掉一个最高分和去掉一个最低分,再算出平均分)。

输入

测试数据包括多个实例。 每组数据包括选手的名字,名字的长度不超过30个字符。紧接着是8个1到10的实数,代表评委们对该选手的评分。输入直到文件结束。

输出

降序排序后每位选手排名、名字和最终得分(保留两位有效数字)。

样例输入

zhangsan 1 2 3 4 5 6 7 8
lisi 9 10 10 10 10 10 10 9
lili 10 10 10 10 9 10 10 10
yuanyuan 3 3 4 3 5 4 5 5
zhaowei 1 2 3 6 5 4 8 7

样例输出

1 lili 10.00
2 lisi 9.83
3 zhangsan 4.50
3 zhaowei 4.50
4 yuanyuan 4.00

 

参考GPT和自己的思路:

好的,这个问题可以用C语言来解决。我们可以先定义一个结构体,用来存储每一位选手的名字和分数。然后读入每组数据,针对每位选手计算平均分,将计算结果存入结构体中,并按照平均分进行排序输出即可。下面是一个可能的解答:

#include <stdio.h>
#include <string.h>
#define MAX_N 100

struct Player {
    char name[31]; // 选手名字
    double score;  // 选手平均分
} players[MAX_N];   // 结构体数组

// 比较函数,用于qsort排序
int cmp(const void *a, const void *b) {
    Player *p1 = (Player *)a;
    Player *p2 = (Player *)b;
    if (p1->score != p2->score) {  // 平均分不同,按照降序排列
        return p2->score > p1->score ? 1 : -1;
    } else {  // 平均分相同,按照名字字典序排列
        return strcmp(p1->name, p2->name);
    }
}

int main() {
    char name[31];
    double scores[8];
    while (scanf("%s", name) != EOF) { // 每组数据读入
        double sum = 0, max = 0, min = 10;
        for (int i = 0; i < 8; i++) {
            scanf("%lf", &scores[i]);
            sum += scores[i];
            max = scores[i] > max ? scores[i] : max;
            min = scores[i] < min ? scores[i] : min;
        }
        double avg = (sum - max - min) / 6;
        // 将计算结果存入结构体中
        strcpy(players[0].name, name);
        players[0].score = avg;
        qsort(players, 1, sizeof(Player), cmp); // 按照平均分排序
    }
    // 输出结果
    int rank = 1, cnt = 1;
    printf("%d %s %.2lf\n", rank, players[0].name, players[0].score);
    for (int i = 1; i < MAX_N && players[i].score > 0; i++) {
        cnt++;
        if (players[i].score != players[i - 1].score) {
            rank = cnt;
        }
        printf("%d %s %.2lf\n", rank, players[i].name, players[i].score);
    }
    return 0;
}

这里我们使用了qsort库函数对结构体数组进行排序,按照平均分从高到低进行排序,如果平均分相同,则按照名字的字典序进行排序。在输出时需要考虑相同平均分的情况,需要统计排名并输出排名、名字以及平均分。

参考GPT和自己的思路:

好的,针对你的问题,我可以给出以下C语言代码实现:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 评委数量
#define N 8
// 最大选手数量
#define MAX_NUM 1000
// 名字最大长度
#define MAX_NAME_LEN 31

// 选手结构体
struct Player {
    char name[MAX_NAME_LEN];    // 名字
    double score;               // 平均分数
};

// 比较函数,用于qsort排序
int cmp(const void *a, const void *b) {
    struct Player *pa = (struct Player *)a;
    struct Player *pb = (struct Player *)b;
    if (pa->score < pb->score) {
        return 1;
    } else if (pa->score > pb->score) {
        return -1;
    } else {
        return strcmp(pa->name, pb->name);
    }
}

int main() {
    char name[MAX_NAME_LEN];
    double score[N], sum;
    int i, j, k, n = 0;
    struct Player players[MAX_NUM];

    while (scanf("%s", name) != EOF) {
        // 输入成绩
        sum = 0;
        for (i = 0; i < N; i++) {
            scanf("%lf", &score[i]);
        }
        // 去掉最高分和最低分,求平均分
        qsort(score, N, sizeof(double), cmp);
        for (i = 1; i < N - 1; i++) {
            sum += score[i];
        }
        players[n].score = sum / (N - 2);
        strcpy(players[n].name, name);
        n++;
    }

    // 排序并输出
    qsort(players, n, sizeof(struct Player), cmp);
    for (i = 0, k = 1; i < n; i++) {
        if (i == 0 || players[i].score != players[i-1].score) {
            k = i + 1;
        }
        printf("%d %s %.2lf\n", k, players[i].name, players[i].score);
    }

    return 0;
}

以上代码实现了从输入选手名字和8个成绩,计算平均分并排序输出的功能。具体实现过程如下:

首先定义了一个Player结构体,包含选手的名字和平均分数。同时定义了一些常量和全局变量,如评委数量(N)、最大选手数量(MAX_NUM)、名字最大长度(MAX_NAME_LEN)等。

接下来,进入while循环,从输入中读取每个选手的名字和8个成绩,去掉最高分和最低分,计算平均分存入players数组中。由于题目要求按平均分排序,所以在计算完所有选手的平均分后,使用qsort函数进行排序。排序使用cmp函数作为比较函数,首先按成绩降序排序,如果成绩一样则按名字升序排序,这样可以保证平均成绩一样的选手排名一样。

最后,遍历排序后的players数组,并输出每个选手的排名、名字和平均分即可。

以上就是针对你的问题所给出的回答,希望能够帮助到你。如果还有其他问题,欢迎继续咨询。