Copyright (c) 2016 烟台大学计算机与控制工程学院
All rights reserved.
文件名称:test.cpp
作者:何定钦
完成日期:2017年1月1日
题目描述:
(1)在歌手大奖赛中,有n位评委为参赛的选手打分,分数为0~10分(运行时由人输入)。
选手最后得分为:去掉一个最高分和一个最低分后其余分数的平均值。请编写一个程序,完成相关的功能。
要求利用一个函数void calScore(int n),对一位选手成绩的输入成绩、计算和显示实现,其中n为评委人数。
这样,在main函数调用时,需要将输入的评委人数n作为实参。
(2) 进一步完善(1)的程序。输入时,难免有录入错误发生,如果输入的成绩不在0-10之间,
要求用户立即重新输入(在函数calScore中修改);一次运 行程序只计算一位选手成绩太麻烦,
要求输出当前选手的最后得分后,提示“按任意键计算下一位选手的成绩,退出请选择N:”如果输
入的不是N或n,可以为下 一位选手计算成绩(在main函数中进行控制即可)。
输入:
输入n以及各位评委的给分。
输出:
去掉的最高分及最低分以及最后得分
样例输入:
对于(1):
7 10 9 8 7 6 5 4
对于(2):
7 0 9 8 7 6 8 10
g -1 -9 -7 89 8 7 6 7 8 6 10 n
样例输出:
对于(1):
10.00 4.00
7.000
对于(2):
10.00 0.00
7.600
10.00 6.00
7.200
分析(1):
#include <stdio.h>
#include <stdlib.h>
void calScore(int n);
/*功能:
输入评委人数,调用函数*/
int main()
{
int n; /*评委人数*/
printf("输入评委人数:");
scanf("%d",&n);
calScore(n);
return 0;
}
/*功能·:
计算出评委给出的分的最高分和最低分以及歌手最后得分*/
void calScore(int n)
{
int i;
float score,last_score; /*评委给分以及最后得分*/
float max=0,min=10; /*最高分和最低分*/
float sum=0; /*评委给出的分的总和*/
printf("请输入选手的成绩(0-10)\n");
for(i=0;i<n;i++)
{
printf("第%d位评委给分:",i+1);
scanf("%f",&score);
sum=sum+score; /*累加每次的给分*/
if(score>max)
max=score;
if(score<min)
min=score;
}
last_score=(sum-max-min)/(n-2); /*计算最后得分*/
printf("去掉一个最高分:%.2f,去掉一个最低分:%.2f\n",max,min);
printf("当前选手的最后得分是:%.3f",last_score);
return;
}
分析(2):
#include <stdio.h>
#include <stdlib.h>
void calScore(int n);
/*功能:
可计算多位歌手的得分*/
int main()
{
int n; /*评委人数*/
char judge; /*判断是否计算下一个歌手的字符常量*/
printf("输入评委人数:");
scanf("%d",&n);
do
{
calScore(n); /*调用函数*/
printf("按 N 或者 n 退出,按其他键继续计算下一位歌手的成绩:\n");
fflush(stdin); /*清除缓冲区*/
judge=getchar();
}
while(judge!='n' && judge!='N'); /*输入非N或n时计算下一个歌手的得分*/
return 0;
}
/*功能:
计算最高分,最低分及最后得分*/
void calScore(int n)
{
int i;
float score,last_score; /*评委给分以及最后得分*/
float max=0,min=10; /*最高分和最低分*/
float sum=0; /*评委给出的分的总和*/
printf("请输入选手的成绩(0-10)\n");
for(i=0; i<n; i++)
{
printf("第%d位评委给分:",i+1);
scanf("%f",&score);
while(score<0 || score>10)
{
printf("第%d位评委给分:",i+1);
scanf("%f",&score);
}
sum=sum+score; /*累加每次的给分*/
if(score>max)
max=score;
if(score<min)
min=score;
}
last_score=(sum-max-min)/(n-2); /*计算最后得分*/
printf("去掉一个最高分:%.2f,去掉一个最低分:%.2f\n",max,min);
printf("当前选手的最后得分是:%.3f\n",last_score);
return;
}
结果(1):
结果(2):
知识点总结:
运用了计算和的方法以及找最大值及最小值的方法。
心得体会:
一直卡在为下一位歌手怎么样计分的地方,最后才发现需要先清除缓冲区才可以再输入下一个字符。