★【C语言及程序设计】第 n+1 次输入字符(scanf 或getchar)

问题描述:

【项目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语句的实践,遇到了一个菜鸟问题,收获很大。

=

猜你喜欢

转载自www.cnblogs.com/miyazakehime/p/9133114.html