天天看點

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中即為所有評分的總和。

知識點補充

題目條件不變,但考慮同時對評委評分進行裁判,即在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;
}
           

繼續閱讀