C語言每日一練——第71天:歌星大獎賽

2022-01-01 22:00:02

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("該選手最後得分為:%.1f\n", 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("該選手最後得分為:%.1f\n", 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;
}

執行結果
在這裡插入圖片描述