问题描述:
【项目4:大奖赛计分】
(1)基本要求:在歌手大奖赛中,有10个评委为参赛的选手打分,分数为1~10分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
(2)上面的程序只能处理一位选手的成绩,现拓展为多人版。输出当前选手的最后得分后,提示“按任意键计算下一位选手的成绩,退出请选择N:”如果输入的不是N或n,可以为下一位选手计算成绩。
笔者的code:
1 /* 2 判断极值模块的“伪代码”: 3 输入10个值,判断最大值和最小值,并取平均值 4 5 输入i1, max = min = i1 6 7 输入i2: 8 9 一,i1》i2,min =i2 10 二,i1《i2,max = i2 11 三,i1 = i2,维持现状 12 储存i2 13 14 输入i3: 15 一,i2》i3,min = i3 16 二,i2《i3,max = i3 17 储存i3 18 19 …… 20 21 */ 22 23 #include "stdafx.h" 24 25 int main() 26 { 27 28 29 while (1) 30 { 31 double score(0), m_score(0), max(0), min(0), sum(0), ave(0), ini_score(0); 32 char c; 33 34 scanf_s("%lf", &score); 35 ini_score = max = min = score; 36 37 for (int i = 0; i < 9; i++) 38 { 39 scanf_s("%lf", &score); 40 sum += score; 41 if (m_score < score) 42 { 43 max = score; 44 } 45 else 46 { 47 min = score; 48 } 49 m_score = score; 50 } 51 ave = (sum - max - min + ini_score) / 8; 52 printf("average score is %lf.\n", ave); 53 54 printf("Input the next candidate score(Yes:Any Key/No:n).\n"); 55 56 c = getchar(); //★第二次输入,中和回车字符,scanf_s("%c", &c);效果一样 57 c = getchar(); 58 59 if (c == 'N' || c == 'n'){ 60 break; 61 } 62 else{ 63 continue; 64 } 65 } 66 67 return 0; 68 }
老师的code:
1 #include <stdio.h> 2 #define n 10 3 int main( ) 4 { 5 int i; 6 double ave, score, sum, max, min; 7 char choice; //用于接受用户选择,字符型是合适的 8 do //计算选手的成绩,至少1次,用do很自然,别的循环不用想 9 { 10 i=1; //i代表评委的编号,其实这个变量名起得不好 11 max=-1; 12 min=11; 13 sum=0; 14 printf("请输入选手的成绩(0-10)\n"); 15 do 16 { 17 printf("第 %d 位评委给分:", i); 18 scanf("%lf", &score); 19 sum+=score; 20 if(max<score) 21 max=score; 22 if(min>score) 23 min=score; 24 i++; 25 }while(i<=n); 26 //下面开始计算 27 ave = (sum-max-min)/(n-2); 28 printf("减去一个最高分: %.3f\n", max); 29 printf(", 减去一个最低分: %.3f\n", min); 30 printf("当前选手的最后得分是:%.3f\n", ave); 31 printf("******************* SUCCESS ***********************\n"); 32 printf("按 N 退出,其他键继续...."); 33 fflush(stdin); //将输入缓冲清空,否则getchar()会读入之前录入中的回车等符号 34 choice=getchar(); 35 }while(choice!='N' && choice!='n'); //不管输入大小写,全算数 36 return 0; 37 }
感想:
典型的菜鸟问题,第 n+1 次输入字符(scanf 或getchar),需中和上一次输入留在缓冲区中的回车或其它(字符);
这个项目实现了“伪代码”、break和continue语句的实践,遇到了一个菜鸟问题,收获很大。
=