1. 程式人生 > >C語言OJ專案參考(2698) 大獎賽計分

C語言OJ專案參考(2698) 大獎賽計分

(2698) 大獎賽計分
Description
在歌手大獎賽中,有9位評委為參賽的選手打分,分數為0~10分。選手最後得分為:去掉一個最高分和一個最低分後,取其餘7個分數的平均值。請編寫一個程式實現這個程式。
Input
9位評委給選手找的分,9個0-10之間的小數
Output
選手的最後得分,即9個成績中去掉一個最高,去掉一個最低後的平均成績。結果輸出中,保留3位小數。
Sample Input
9.8 6.7 8.9 7.6 4.5 6.5 7.8 4.2 6.4
Sample Output
6.914

[參考解答]

#include "stdio.h"
int main()
{
    int i=
1; double ave, score, sum, max, min; max=-1; min=11; sum=0; do { scanf("%lf", &score); sum+=score; if(max<score) max=score; if(min>score) min=score; i++; } while(i<=9); ave = (sum-max-min)/7
; printf("%.3f\n", ave); return 0; }

  如果看懂上面的解答有困難,閱讀並執行下面的程式可能會對你有幫助。
  (1)基本要求:在歌手大獎賽中,有n個評委(至少3人)為參賽的選手打分,分數為1~10分。選手最後得分為:去掉一個最高分和一個最低分後其餘n-2個分數的平均值。請編寫一個程式實現。

#include <stdio.h>  
#define n 10  
int main( )  
{  
    int i=1;  
    double ave, score, sum, max, min;  //這幾個變數涉及成績,double是合理的  
max=-1; //這兒有技巧,第1位評委給的成績一定大於-1,max將變成第1個成績 min=11; //同樣和技巧,要學會這樣“設圈套” sum=0; //注意:這4個變數在迴圈內賦初值是必須的,這意味著計算某一選手成績的開始 printf("請輸入選手的成績(0-10)\n"); do //至少有一位評委,再用do迴圈 { printf("第 %d 位評委給分:", i); scanf("%lf", &score); sum+=score; if(max<score) max=score; // 聯想上一層迴圈中max的初值,學會技巧 if(min>score) min=score; i++; } while(i<=n); //下面開始計算 ave = (sum-max-min)/(n-2); printf("減去一個最高分: %.3f\n", max); printf(", 減去一個最低分: %.3f\n", min); printf("當前選手的最後得分是:%.3f\n", ave); printf("******************* SUCCESS ***********************\n"); return 0; }

  (2)上面的程式只能處理一位選手的成績,現拓展為多人版。輸出當前選手的最後得分後,提示“按任意鍵計算下一位選手的成績,退出請選擇N:”如果輸入的不是N或n,可以為下一位選手計算成績。

#include <stdio.h>  
#define n 10  
int main( )  
{  
    int i;  
    double ave, score, sum, max, min;    
    char choice;  //用於接受使用者選擇,字元型是合適的  
    do     //計算選手的成績,至少1次,用do很自然,別的迴圈不用想  
    {  
        i=1;    //i代表評委的編號,其實這個變數名起得不好  
        max=-1;    
        min=11;    
        sum=0;     
        printf("請輸入選手的成績(0-10)\n");  
        do    
        {  
            printf("第 %d 位評委給分:", i);  
            scanf("%lf", &score);  
            sum+=score;  
            if(max<score)  
                max=score;    
            if(min>score)  
                min=score;    
            i++;  
        }while(i<=n);  
        //下面開始計算  
        ave = (sum-max-min)/(n-2);  
        printf("減去一個最高分: %.3f\n", max);  
        printf(", 減去一個最低分: %.3f\n", min);  
        printf("當前選手的最後得分是:%.3f\n", ave);  
        printf("******************* SUCCESS ***********************\n");  
        printf("按 N 退出,其他鍵繼續....");  
        fflush(stdin);   //將輸入緩衝清空,否則getchar()會讀入之前錄入中的回車等符號  
        choice=getchar();  
    }while(choice!='N' && choice!='n'); //不管輸入大小寫,全算數  
    return 0;  
}