PAT Basic 1054

Posted yxp400

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT Basic 1054相关的知识,希望对你有一定的参考价值。

1054 求平均值

本题的基本要求非常简单:给定 N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [?1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数据算在内。

输入格式:

输入第一行给出正整数 N(100)。随后一行给出 N 个实数,数字间以一个空格分隔。

输出格式:

对每个非法输入,在一行中输出 ERROR: X is not a legal number,其中 X 是输入。最后在一行中输出结果:The average of K numbers is Y,其中 K 是合法输入的个数,Y 是它们的平均值,精确到小数点后 2 位。如果平均值无法计算,则用 Undefined 替换 Y。如果 K 为 1,则输出 The average of 1 number is Y

输入样例 1:

7
5 -3.2 aaa 9999 2.3.4 7.123 2.35

输出样例 1:

ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38

输入样例 2:

2
aaa -9999

输出样例 2:

ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined

  题解:这道题要注意,首先满足以下几种情况就是错误数据
  1.由字母组成或者包含字母。
  2.有两个或两个以上的小数点。
  3.数据超过[-1000,1000]范围。
  我们需要对每个数据进行判断,如果不是错误数据,将其加到总数上并在正确数据个数上加一即可。最后进行输出,输出时注意当正确个数为1时的情况。
  知识点复习:
  ①atof包含在头文件#include <stdlib.h>下,用于将字符串转化为浮点数,(只能处理char数组,不可以处理string串)。
  ②使用string的话,可以借助stringstream来实现字符串到浮点数的操作,stringstream包含在#include<sstream>下,每次使用前记得要使用.clear()清空流的错误标记,并且用.str()方法赋值。(现在感觉stringstream是真的好用,可以实现字符串到int,字符串到double的转换,还可以用流的方式给字符串赋值。)
  ③也可以使用sscanf() 和sprintf()进行这个转换操作,时间有点晚,明天给你们接着写这个。
代码如下:
 1 #include<iostream>
 2 #include<string>
 3 #include<sstream>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int num, N, k = 0;
 9     double sum = 0, y;
10     string a;
11     stringstream ss;
12     scanf("%d",&N);
13     while(N--){
14         bool flag1 = true, flag2 = false;
15         cin>>a;
16         int num2 = 0, num3 = 0;
17         for( int i = 0; i < a.length(); i++){
18             if( (a[i] < 0 || a[i] > 9) && a[i] != . && a[i] != - ){
19                 flag1 = false;
20                 break;
21             }
22             if(flag2)
23                 num2++;
24             if( num2 > 2){
25                 flag1 = false;
26                 break;
27             }
28             if( a[i] == .  ){
29                 flag2 = true;
30                 num3++;
31             }
32             if(num3 > 1){
33                 flag1 = false;
34                 break;
35             }
36         }
37         ss.clear();
38         ss.str(a);
39         ss>>y;    
40         if(!flag1 || ( y > 1000 || y < -1000 )){
41             cout<<"ERROR: "<<a<<" is not a legal number
";
42             continue;
43         }
44         sum += y;
45         k++;
46     }
47     if(k==0)
48         cout<<"The average of 0 numbers is Undefined";
49     else if(k>1){
50         cout<<"The average of "<<k<<" numbers is ";
51         printf("%0.2lf",sum/k);
52     }
53     else if( k == 1){
54         cout<<"The average of 1 number is ";
55         printf("%0.2lf",sum);
56     }
57     return 0;
58 }

 















以上是关于PAT Basic 1054的主要内容,如果未能解决你的问题,请参考以下文章

PAT Basic 1078

pat 1054 The Dominant Color(20 分)

PAT 1054. 求平均值

PAT A1054

PAT 甲级 1054 The Dominant Color (20 分)(简单题)

PAT Advanced 1054 The Dominant Color (20分)