1. 程式人生 > >【演算法精練】歌星大獎賽及擴充套件

【演算法精練】歌星大獎賽及擴充套件

歌星大獎賽

要求:在歌星大獎賽中,有10個評委為參賽選手打分,分數為1到100分。選手最後得分為:去掉一個最高分,去掉一個最低分,最終得分為8個分數的平均分。請編寫C/C++程式實現。

演算法設計:這個問題的演算法十分簡單,但要注意在程式中判斷最大、最小值的變數是如何賦初值的。

原始碼及註釋:

#include <stdio.h>
#include <Windows.h>
int main()
{
	int integer;
	int i = 0;
	int max = INT_MIN;	 //注意max與min的初值,假定兩個極值,
	int min = INT_MAX;	 //  賦初值時注意賦予兩個值域之外的值
int sum = 0; int Average = 0; for(i = 1;i <= 10;i++) { printf("Please enter judges %i:",i); scanf("%d",&integer); sum += integer; //累加求和 if(integer > max) max = integer; //最高分 if(integer < min) min = integer; //最低分 } printf("max = %d , min = %d\n",max,min); printf
("Average sorce: %d\n",(sum - max - min)/8); system("pause"); return 0 ; }

思考題(擴充套件)

要求:題目條件不變,但考慮同時對評委的評分進行裁判,記載10個評委中找到最高分(即評分最接近平均分)和最不公平(即與平均分差距最大)的評委,程式應該如何實現?

演算法設計:在原先的基礎上,要對之前資料進行判斷,因此首先應該儲存之前的資料,這裡用陣列來儲存成績。通過平均分與成績之間的差值儲存在另一個數組中,求出最大值和最小值即可。

原始碼及註釋:

#include <stdio.h>
#include <Windows.h>
int main() { int integer[10] = {0}; //評委判定成績 int temp[10] = {0}; //與平均分的差值 int i = 0; int max = -1; //注意max與min的初值,假定兩個極值 int min = 101; int sum = 0; int Average = 0; int judges1 = 0; int judges2 = 0; for(i = 1;i <= 10;i++) { printf("Please enter judges %i:",i); scanf("%d",&integer[i]); sum += integer[i]; if(integer[i] > max) max = integer[i]; //最高分 if(integer[i] < min) min = integer[i]; //最低分 } printf("去除一個最高分:%d , 去除一個最低分:%d 最終得分為:%d\n",max,min,(sum-max-min)/8); Average = (sum - max - min)/8; min = 101; max = -1; for(i = 1;i <= 10;i++) { temp[i] = Average - integer[i]; temp[i] = temp[i] > 0?temp[i]:(-temp[i]);//將平均分與成績差值的絕對值儲存 if(temp[i] != 0 && (temp[i] > max)) { max = temp[i]; //差值的最大值 judges1 = i; } if(temp[i] != 0 && (temp[i] < min)) { min = temp[i]; judges2 = i; //差值的最小值 } } printf("最公平的裁判是:judges%d,評分為:%d\n最不公平的裁判是:judges%d,評分為:%d\n",judges2,integer[judges2],judges1,integer[judges1]); system("pause"); return 0 ; }