C语言每日一练——第71天:歌星大奖赛

C语言每日一练
2022年1月1日

题目描述

在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1〜100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。

提高:题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?

问题分析

这道题难度较低,实现思路:

  1. 获取分数,可以手动输入,也可以使用随机数(这里采用手动输入),分数存在放一个数组里,数据类型采用浮点型。
  2. 求出最高分和最低分。
  3. 求出总分,然后用总分减去最高分和最低分再除以8,得出选手得分。

代码实现

#include<stdio.h>

int main()
{
    float score[10] = {0};
    int i = 0;
    float sum = 0;
    float min = 0, max = 0, avg = 0;

    //获取分数
    printf("请输入10个评委的分数(1-100)n");
    for(i = 0; i < 10; i++)
        scanf("%f", &score[i]);

    //初始化最高分和最低分
    min = max = score[0];

    //求最高分和最低分
    for(i = 1; i < 10; i++)
    {
        if(score[i] < min)
            min = score[i];
        else if(score[i] > max)
            max = score[i];
    }

    //求总分sum,初始值为0
    for(i = 0; i < 10; i++)
        sum += score[i];

    //去除最高分和最低分后的选手平均分
    avg = (sum - max - min) / 8;

    printf("该选手最后得分为:%.1fn", avg);
    return 0;
}

运行结果

在这里插入图片描述

附加题代码

这里再重复一下附加的题目:

题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?

实现思路

  1. 求选手平均分(代码和上文相同)。
  2. 定义一个浮点型数组,存放10个评委评分与平均分的差值(绝对值)。
  3. 求出数组中最大值和最小值,差值(绝对值)最小的评分最公平,差值(绝对值)越大越不公平。
  4. 将评分与数组最大值和最小值相同的评委的编号打印出来。

代码

#include<stdio.h>

/**
 * @brief 获取绝对值(absolute value)
 * @param num 目标值
 * @return 返回num的绝对值
 */
float Get_Abs(float num)
{
    if(num < 0)
        return -num;
    else
        return num;
}

int main()
{
    float score[10] = {0};
    int i = 0;
    float sum = 0;
    float min = 0, max = 0, avg = 0;
    float diff[10] = {0};

    //获取分数
    printf("请输入10个评委的分数(1-100)n");
    for(i = 0; i < 10; i++)
        scanf("%f", &score[i]);

    //初始化最高分和最低分
    min = max = score[0];

    //求最高分和最低分
    for(i = 1; i < 10; i++)
    {
        if(score[i] < min)
            min = score[i];
        else if(score[i] > max)
            max = score[i];
    }

    //求总分sum,初始值为0
    for(i = 0; i < 10; i++)
    {
        sum += score[i];
    }

    //去除最高分和最低分后的选手平均分
    avg = (sum - max - min) / 8;

    //将每位评委的评分与平均分的差值存入diff数组
    for(i = 0; i < 10; i++)
    {
        diff[i] = Get_Abs(score[i] - avg);
    }

    //初始化评分最公平和最不公平评委的评分与平均分的差值
    min = max = diff[0];

    //求评分最公平和最不公平评委的评分
    for(i = 1; i < 10; i++)
    {
        if(diff[i] < min)
            min = diff[i];
        else if(diff[i] > max)
            max = diff[i];
    }

    printf("该选手最后得分为:%.1fn", avg);

    //找出评分最公平的评委(可能不止一个)
    printf("评分最公平的评委为:");
    for(i = 0; i < 10; i++)
        //浮点数比较相等(用if(diff[i] == min)也行,但不严谨)
        if(diff[i] - min < 0.000001 && diff[i] - min > -0.000001)
            printf("%d号:%.1f分   ", i + 1, score[i]);

    //找出评分最不公平的评委(可能不止一个)
    printf("n评分最不公平的评委为:");
    for(i = 0; i < 10; i++)
        //浮点数比较相等(用if(diff[i] == max)也行,但不严谨)
        if(diff[i] - max < 0.000001 && diff[i] - max > -0.000001)
            printf("%d号:%.1f分   ", i + 1, score[i]);
    printf("n");
    return 0;
}

运行结果
在这里插入图片描述


本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>