题目

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

输入格式:

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

输出格式:

对每个非法输入,在一行中输出 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

代码

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n, cnt = 0;
    char a[50], b[50];  
    double temp, sum = 0.0;
    cin>>n;
    for(int i = 0; i < n ; i++){
        scanf("%s",a);
        sscanf(a,"%lf",&temp);  //从⼀个字符串中读进与指定格式相符的数据
        sprintf(b,"%.2f",temp);  //字符串格式化命令,主要功能是把格式化的数据写⼊某个字符串中
        int flag = 0;
        // 要求输入的这个数最多精确到小数点后两位
        for(int j = 0; j < strlen(a); j ++){
            if(a[j]!=b[j]) flag = 1;
        }
        //判断是否满足 是合法的输入
        if(flag||temp<-1000||temp>1000){
            printf("ERROR: %s is not a legal number\n",a);
            continue;
        }else{
            sum+=temp;
            cnt++;
        }
    }
    if(cnt == 1){
        printf("The average of 1 number is %.2f",sum);
    }else if(cnt > 1){
        printf("The average of %d numbers is %.2f",cnt,sum/cnt);
    }else{
        printf("The average of 0 numbers is Undefined");
    }
    return 0;
}

tips

通过此题目,掌握sscanf() 与sprintf() 的用法

对于 sprintf(b,"%.2f",temp); 有些疑惑:

这里让b保留小数点后两位,而如果此时a没有小数位,会不会因为下面的代码而认为a是不符合题意的

for(int j = 0; j < strlen(a); j ++){
    if(a[j]!=b[j]) {
   flag = 1;
    }
}

事实证明,不会出现这种情况😄

执行如下代码进行证明:

#include<bits/stdc++.h>
using namespace std;


int main(){
    char a[50], b[50];
    double temp =0.0;
    while(true){
        scanf("%s",a);
        sscanf(a,"%lf",&temp);
        sprintf(b,"%.2f",temp);
        cout<<a<<endl;
        cout<<b<<endl;
        int flag =0;
        for(int j = 0; j < strlen(a); j ++){
            if(a[j]!=b[j]) {
//	       flag = 1;
               cout<<"flag"<<endl;
            }
        }
    } 

}

输入:

2

输出:

2
2.00

输入:

2.567

输出:

2.567

2.57

flag

Comments are closed

2020年十二月
« 11月    
 123456
78910111213
14151617181920
21222324252627
28293031