C语言歌星大奖赛代码解析

问题描述

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

问题分析

求一组数中的最大值、最小值是C语言编程或计算机等级考试中常见的一类问题,这类问题的算法十分简单,定义两个变量max、min分别存储最大值、最小值,利用两个变量与给定的数依次比较的方法求出最大、最小值。但是要注意在程序中判定最大、最小值的变量是如何赋值的。

算法设计

确定变量初值。变量max、min要分别与每个数进行比较,因此在第一次比较时用到两变量的初值,max、min的初值赋多少合适呢?一般情况可按照下面的方法赋值,最大值max的初值尽量小、最小值min的初值尽量大。对于变量max来说只有其初值尽可能小的时候,在第一次与给定的数比较时,数1才会大于max,才能把数1赋给max,作为变量max的新值,接着与数2比较,若数2>max,同样把数2的值作为新值赋给max;若数2<max,则max中的值保持不变。重复上面的过程直到max与所有的数都比较完,则max中存储的就是最大值。若刚开始max的值就很大,那么在比较过程中给定的数若都比当前max的值小,经过一轮比较结束时变量max中存储的仍然是最初所赋的初值,那么这样的比较是没有意义的。

对于10个评委的评分利用循环结构实现,循环变量i记录已经输入的评分的个数,初值为0,判定条件为i<10。评分的总和采用累加的方式存储到变量sum中,即循环体执行一次输入一个分数,接着将其累加到变量sum上,等到循环结束时,sum中即为所有评分的总和。

程序流程图:

C语言歌星大奖赛代码解析

下面是完整的代码:

#include<stdio.h>
int main()
{
    int m, n, temp, i;
    printf("Input m & n:");
    scanf("%d%d", &m, &n);
    if(m<n)  /*比较大小,使得m中存储大数,n中存储小数*/
    {
        temp = m;
        m = n;
        n = temp;
    }
    for(i=m; i>0; i++)  /*从大数开始寻找满足条件的自然数*/
        if(i%m==0 && i%n==0)
        {/*输出满足条件的自然数并结束循环*/
            printf("The LCW of %d and %d is: %d\n", m, n, i);
            break;
        }
 
    return 0;
}

运行结果:

C语言歌星大奖赛代码解析

知识点补充

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

问题分析与算法设计

要找出最公平与最不公平的评委,在求出平均值后,需要与所有分数进行比较,求出与平均值差的绝对值最大和最小的两个评分所对应的评委即为所求。因有个比较过程,因此在输入完评委的评分后需要将其存储,若在上述代码基础上进行改进,则需要另外定义10个变量来存储评委评分。此算法虽然可以满足题目要求,但是写起来麻烦,为解决这个问题可以利用数组来实现,这样不必定义10个变量,只需要定义一个含量有10个元素的数组,第1〜10个评委的评分分别存储到数组score[0]到score[10]。

最公平的评委即求出与平均值差值最小评分所对应的评委,若有一个评分正好等于平均分,则此分数对应的评委即为最公平的;若都不相同,则需要将差值进行比较选出最小值,算法与求一组数最小值的思路相同。最不公平的评委一定在所求的最大值、最小值对应的评委中产生。

#include <stdio.h>
#include <math.h>
int main()
{
    float score [10] , max, min, ave, sum, s;
    int i, j, m, n, temp;  /*m、n用来记录最大值、最小值的下标*/
    sum=0;
    for(i=0; i<10; i++)
    {
        score[i]=1+rand()%100;  /*利用数学函数rand()生成10个随机数据*/
        printf("%f ", score [i]);  /*输出随机生成的数据*/
        sum=sum+score[i];
    }
    printf("\n");
    max=score[0];
    m=0;
    for(j=1; j<10; j++)
    {
        if(max<score[j])
           
        {
            max=score[j];
            m=j ;  /*记录最大值的下标*/
        }
    }
   
    printf("max is %5.2f\n", max);
    min=score[0];
    n=0;
    for(j=1; j<10; j++)
    {
        if(min>score[j])
        {
            min=score[j];
            n=j;  /*记录最小值得的下标*/
        }
    }
    printf("min is %5.2f\n", min);
    ave=(sum-max-min)/8;  /*计算平均值*/
    printf("average is %5.2f\n", ave);
    temp=0;  /*temp用来记录最公平与最不公平评委给出的评分存储的下标*/
    s=fabs(score[0]-ave);  /*s记录评分与平均值差的绝对值*/
    for(i=0; i<10; i++)
    {
        if(fabs(score[i]-ave)==0)
        {
            temp=i;
            printf("最公平的评委是%d\n", temp+1);
        }
    }
    temp=0;
    s=fabs(score[0]-ave);
    for(i=0; i<10; i++)
    {
        if(fabs(score[i]-ave)!=0)
        {
            if(s>fabs(score[i]-ave))
            {
                s=fabs(score[i]-ave);
                temp=i;
            }
        }
    }
    printf("最公平的评委是%d\n", temp+1);
    if( (ave-min) == (max-ave) )
    {
        printf("最不公平的评委是%d %d\n", m+1, n+1);
    }
    else
        if( (ave-min)>(max-ave))
        {
            printf("最不公平的评委是%d",n+1);
        }
        else
        {
            printf("最不公平的评委是%d",m+1);
        }
    printf("\n");
    return 0;
}

运行结果:

C语言歌星大奖赛代码解析

相关推荐