題目描述:數組
在浙大的計算機專業課中,常常有互評分組報告這個環節。一個組上臺介紹本身的工做,其餘組在臺下爲其表現評分。最後這個組的互評成績是這樣計算的:全部其餘組的評分中,去掉一個最高分和一個最低分,剩下的分數取平均分記爲 G1 ;老師給這個組的評分記爲 G2 。該組得分爲 (G1 +G2 )/2,最後結果四捨五入後保留整數分。 本題就要求你寫個程序幫助老師計算每一個組的互評成績。 輸入格式: 輸入第一行給出兩個正整數 N(> 3)和 M,分別是分組數和滿分,均不超過 100。隨後 N 行,每行給出該組獲得的 N 個分數(均保證爲整型範圍內的整數),其中第 1 個是老師給出的評分,後面 N−1 個是其餘組給的評分。合法的輸入應該是 [0,M] 區間內的整數,若不在合法區間內,則該分數須被忽略。題目保證老師的評分都是合法的,而且每一個組至少會有 3 個來自同窗的合法評分。 輸出格式: 爲每一個組輸出其最終得分。每一個得分佔一行。 輸入樣例: 6 50 42 49 49 35 38 41 36 51 50 28 -1 30 40 36 41 33 47 49 30 250 -25 27 45 31 48 0 0 50 50 1234 43 41 36 29 42 29 輸出樣例: 42 33 41 31 37 39
核心思路:spa
// 把成績記錄在Score[] 數組中,Score[0] 表明老師的打分 // 統計學生的有效成績個數和最高最低分 // 最後運算的時候減去兩個最值,有效成績個數也要減去2 printf("%d\n",(int)(((((sum-min_s-max_s)*1.0/num)+Score[0])*1.0/2)+0.5));
本人AC代碼:blog
// 1077 互評成績計算 # include <stdio.h> # define Max 101 int main(void) { int N, len, num=0, i; int flag = -1; // flag標記爲第一個有效的學生成績 int M, sum=0, min_s, max_s; int Score[Max] = {0}; scanf("%d %d",&N,&M); len = N; while (len > 0) { sum = 0.0; num = 0; flag = -1; // 每次都設初值爲-1 // 每組進行單獨遍歷,找出有效成績個數,找到最大最小值 for (i=0; i<N; i++) { // Score[0]爲老師評分,不參與G1計算 scanf("%d",&Score[i]); // 找到第一個有效的學生成績 if (i>0 && flag==-1) { if (Score[i]>=0 && Score[i]<=M) flag = 0; } // 把找到的學生成績記錄爲當前的最大最小值 if (0 == flag) { // 記錄第一個有效的學生成績 min_s = max_s = Score[i]; flag = 1; } // 統計有效分數 if (i>0 && Score[i]>=0 && Score[i]<=M) { sum += Score[i]; // 有效分數的個數 num++; // 更新最大最小值 if (Score[i] > max_s) max_s = Score[i]; if (Score[i] < min_s) min_s = Score[i]; } } num -= 2; // 總成績計算 // 學生成績爲去掉最大最小值的平均值 // 總成績爲學生最終成績和老師最終成績均值 printf("%d\n",(int)(((((sum-min_s-max_s)*1.0/num)+Score[0])*1.0/2)+0.5)); len--; // 計算下一組 } return 0; }
RRRio