内容简介:在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1〜100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。求一组数中的最大值、最小值是C语言编程或计算机等级考试中常见的一类问题,这类问题的算法十分简单,定义两个变量max、min分别存储最大值、最小值,利用两个变量与给定的数依次比较的方法求出最大、最小值。但是要注意在程序中判定最大、最小值的变量是如何赋值的。确定变量初值。变量max、min要分别与每个数进行比较,因此在第一次比较时用到两变量的初值,max、min
问题描述
在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1〜100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
问题分析
求一组数中的最大值、最小值是 C语言 编程或计算机等级考试中常见的一类问题,这类问题的算法十分简单,定义两个变量max、min分别存储最大值、最小值,利用两个变量与给定的数依次比较的方法求出最大、最小值。但是要注意在程序中判定最大、最小值的变量是如何赋值的。
算法设计
确定变量初值。变量max、min要分别与每个数进行比较,因此在第一次比较时用到两变量的初值,max、min的初值赋多少合适呢?一般情况可按照下面的方法赋值,最大值max的初值尽量小、最小值min的初值尽量大。对于变量max来说只有其初值尽可能小的时候,在第一次与给定的数比较时,数1才会大于max,才能把数1赋给max,作为变量max的新值,接着与数2比较,若数2>max,同样把数2的值作为新值赋给max;若数2<max,则max中的值保持不变。重复上面的过程直到max与所有的数都比较完,则max中存储的就是最大值。若刚开始max的值就很大,那么在比较过程中给定的数若都比当前max的值小,经过一轮比较结束时变量max中存储的仍然是最初所赋的初值,那么这样的比较是没有意义的。
对于10个评委的评分利用循环结构实现,循环变量i记录已经输入的评分的个数,初值为0,判定条件为i<10。评分的总和采用累加的方式存储到变量sum中,即循环体执行一次输入一个分数,接着将其累加到变量sum上,等到循环结束时,sum中即为所有评分的总和。
程序流程图:
下面是完整的代码:
#include<stdio.h>
int main()
{
int m, n, temp, i;
printf("Input m & n:");
scanf("%d%d", &m, &n);
if(m<n) /*比较大小,使得m中存储大数,n中存储小数*/
{
temp = m;
m = n;
n = temp;
}
for(i=m; i>0; i++) /*从大数开始寻找满足条件的自然数*/
if(i%m==0 && i%n==0)
{/*输出满足条件的自然数并结束循环*/
printf("The LCW of %d and %d is: %d\n", m, n, i);
break;
}
return 0;
}
运行结果:
linuxidc@linuxidc:~/www.linuxidc.com$ ./linuxidc.com
Input m & n:7 23
The LCW of 23 and 7 is: 161
linuxidc@linuxidc:~/www.linuxidc.com$ ./linuxidc.com
Input m & n:8 24
The LCW of 24 and 8 is: 24
知识点补充
题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?
问题分析与算法设计
要找出最公平与最不公平的评委,在求出平均值后,需要与所有分数进行比较,求出与平均值差的绝对值最大和最小的两个评分所对应的评委即为所求。因有个比较过程,因此在输入完评委的评分后需要将其存储,若在上述代码基础上进行改进,则需要另外定义10个变量来存储评委评分。此算法虽然可以满足题目要求,但是写起来麻烦,为解决这个问题可以利用数组来实现,这样不必定义10个变量,只需要定义一个含量有10个元素的数组,第1〜10个评委的评分分别存储到数组score[0]到score[10]。
最公平的评委即求出与平均值差值最小评分所对应的评委,若有一个评分正好等于平均分,则此分数对应的评委即为最公平的;若都不相同,则需要将差值进行比较选出最小值,算法与求一组数最小值的思路相同。最不公平的评委一定在所求的最大值、最小值对应的评委中产生。
#include <stdio.h> #include <math.h> int main() { float score [10] , max, min, ave, sum, s; int i, j, m, n, temp; /*m、n用来记录最大值、最小值的下标*/ sum=0; for(i=0; i<10; i++) { score[i]=1+rand()%100; /*利用数学函数rand()生成10个随机数据*/ printf("%f ", score [i]); /*输出随机生成的数据*/ sum=sum+score[i]; } printf("\n"); max=score[0]; m=0; for(j=1; j<10; j++) { if(max<score[j]) { max=score[j]; m=j ; /*记录最大值的下标*/ } } printf("max is %5.2f\n", max); min=score[0]; n=0; for(j=1; j<10; j++) { if(min>score[j]) { min=score[j]; n=j; /*记录最小值得的下标*/ } } printf("min is %5.2f\n", min); ave=(sum-max-min)/8; /*计算平均值*/ printf("average is %5.2f\n", ave); temp=0; /*temp用来记录最公平与最不公平评委给出的评分存储的下标*/ s=fabs(score[0]-ave); /*s记录评分与平均值差的绝对值*/ for(i=0; i<10; i++) { if(fabs(score[i]-ave)==0) { temp=i; printf("最公平的评委是%d\n", temp+1); } } temp=0; s=fabs(score[0]-ave); for(i=0; i<10; i++) { if(fabs(score[i]-ave)!=0) { if(s>fabs(score[i]-ave)) { s=fabs(score[i]-ave); temp=i; } } } printf("最公平的评委是%d\n", temp+1); if( (ave-min) == (max-ave) ) { printf("最不公平的评委是%d %d\n", m+1, n+1); } else if( (ave-min)>(max-ave)) { printf("最不公平的评委是%d",n+1); } else { printf("最不公平的评委是%d",m+1); } printf("\n"); return 0; }
运行结果:
linuxidc@linuxidc:~/www.linuxidc.com$ ./linuxidc.com
84.000000 87.000000 78.000000 16.000000 94.000000 36.000000 87.000000 93.000000 50.000000 22.000000
max is 94.00
min is 16.00
average is 67.12
最公平的评委是3
最不公平的评委是4
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-01/156255.htm
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员的算法趣题
[ 日] 增井敏克 / 绝 云 / 人民邮电出版社 / 2017-7 / 55.00元
本书是一本解谜式的趣味算法书,从实际应用出发,通过趣味谜题的解谜过程,引导读者在愉悦中提升思维能力、掌握算法精髓。此外,本书作者在谜题解答上,通过算法的关键原理讲解,从思维细节入手,发掘启发性算法新解,并辅以Ruby、JavaScript等不同语言编写的源代码示例,使读者在算法思维与编程实践的分合之间,切实提高编程能力。 本书适合已经学习过排序、搜索等知名算法,并想要学习更多有趣算法以提升编程技巧......一起来看看 《程序员的算法趣题》 这本书的介绍吧!