1054 求平均值 (string+.c_str() )

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

输入格式:

输入第一行给出正整数 N(≤)。随后一行给出 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.以字符串输入,用函数判断是否合法,合法的再用string.c_str()转过来

2.如果字符串第一个字符是 '-' 则去掉,接下来的合法字符只剩:0-9,'. '

3.当遍历到 '. ',如果小数点下标的初值不是-1则判断出两个小数点不合理,返回false

4.将遍历完后的合理字符串转换为double型,如果值大于1000返回false否则返回true

#include<string>
#include<cstdio>
#include<iostream>
using namespace std;

bool isok(string s){
    if(s[0]=='-') s.erase(s.begin());//hulue diyige fuhao
    int low=-1,len=s.length();
    if(len==0) return false;
    for(int i=0;i<len;i++){
        if(!(s[i]=='.'||(s[i]>='0'&&s[i]<='9'))) return false;//feifa zifu
        if(s[i]=='.'){
            if(low!=-1) return false;//yijingchuxianguo xiaoshudian
            else low=i;
        }    
    }
    if(low!=-1&&low+3<len) return false;//chaoguoliangweixiaoshu
    double temp;
    sscanf(s.c_str(),"%lf",&temp);//zifuchuan zhuanhuancheng double
    return temp<=1000;
}

int main(){
    int n,num=0;
    cin>>n;
    double sum=0,temp;
    string input;
    for(int i=0;i<n;i++){
        cin>>input;
        if(isok(input)){
            sscanf(input.c_str(),"%lf",&temp);
            sum+=temp;
            num++;
        }else{
            printf("ERROR: %s is not a legal number\n",input.c_str());
        }
    }
    if(num==0) printf("The average of 0 numbers is Undefined\n");
    else if(num==1) printf("The average of 1 number is %.2f\n",sum);
    else printf("The average of %d numbers is %.2f\n",num, sum/num);
    return 0;
}

 

上一篇:1054 求平均值 (20 分)


下一篇:报错:1054:Unknown column 'city' in 'where clause' [ SQL语句 ] : SELECT * FROM `iot_p