C语言每日一练——第71天:歌星大奖赛
C语言每日一练
2022年1月1日
题目描述
在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1〜100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
提高:题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?
问题分析
这道题难度较低,实现思路:
- 获取分数,可以手动输入,也可以使用随机数(这里采用手动输入),分数存在放一个数组里,数据类型采用浮点型。
- 求出最高分和最低分。
- 求出总分,然后用总分减去最高分和最低分再除以8,得出选手得分。
代码实现
#include<stdio.h>
int main()
{
float score[10] = {0};
int i = 0;
float sum = 0;
float min = 0, max = 0, avg = 0;
//获取分数
printf("请输入10个评委的分数(1-100)n");
for(i = 0; i < 10; i++)
scanf("%f", &score[i]);
//初始化最高分和最低分
min = max = score[0];
//求最高分和最低分
for(i = 1; i < 10; i++)
{
if(score[i] < min)
min = score[i];
else if(score[i] > max)
max = score[i];
}
//求总分sum,初始值为0
for(i = 0; i < 10; i++)
sum += score[i];
//去除最高分和最低分后的选手平均分
avg = (sum - max - min) / 8;
printf("该选手最后得分为:%.1fn", avg);
return 0;
}
运行结果
附加题代码
这里再重复一下附加的题目:
题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?
实现思路
- 求选手平均分(代码和上文相同)。
- 定义一个浮点型数组,存放10个评委评分与平均分的差值(绝对值)。
- 求出数组中最大值和最小值,差值(绝对值)最小的评分最公平,差值(绝对值)越大越不公平。
- 将评分与数组最大值和最小值相同的评委的编号打印出来。
代码
#include<stdio.h>
/**
* @brief 获取绝对值(absolute value)
* @param num 目标值
* @return 返回num的绝对值
*/
float Get_Abs(float num)
{
if(num < 0)
return -num;
else
return num;
}
int main()
{
float score[10] = {0};
int i = 0;
float sum = 0;
float min = 0, max = 0, avg = 0;
float diff[10] = {0};
//获取分数
printf("请输入10个评委的分数(1-100)n");
for(i = 0; i < 10; i++)
scanf("%f", &score[i]);
//初始化最高分和最低分
min = max = score[0];
//求最高分和最低分
for(i = 1; i < 10; i++)
{
if(score[i] < min)
min = score[i];
else if(score[i] > max)
max = score[i];
}
//求总分sum,初始值为0
for(i = 0; i < 10; i++)
{
sum += score[i];
}
//去除最高分和最低分后的选手平均分
avg = (sum - max - min) / 8;
//将每位评委的评分与平均分的差值存入diff数组
for(i = 0; i < 10; i++)
{
diff[i] = Get_Abs(score[i] - avg);
}
//初始化评分最公平和最不公平评委的评分与平均分的差值
min = max = diff[0];
//求评分最公平和最不公平评委的评分
for(i = 1; i < 10; i++)
{
if(diff[i] < min)
min = diff[i];
else if(diff[i] > max)
max = diff[i];
}
printf("该选手最后得分为:%.1fn", avg);
//找出评分最公平的评委(可能不止一个)
printf("评分最公平的评委为:");
for(i = 0; i < 10; i++)
//浮点数比较相等(用if(diff[i] == min)也行,但不严谨)
if(diff[i] - min < 0.000001 && diff[i] - min > -0.000001)
printf("%d号:%.1f分 ", i + 1, score[i]);
//找出评分最不公平的评委(可能不止一个)
printf("n评分最不公平的评委为:");
for(i = 0; i < 10; i++)
//浮点数比较相等(用if(diff[i] == max)也行,但不严谨)
if(diff[i] - max < 0.000001 && diff[i] - max > -0.000001)
printf("%d号:%.1f分 ", i + 1, score[i]);
printf("n");
return 0;
}
运行结果