1108 Finding Average (20 分)

  1. 以字符串形式输入每个数,然后分别判断是否合法,不合法时输出错误信息,合法时对其进行累加,最后输出平均数。
  2. 判断是否合法的过程:
    (1) 如果字符串以负号'-'开头,那么先把它去掉,去掉后如果字符串长度为0,那么直接认为不合法(虽然数据里似乎没有只存在负号的字符串);
    (2) 使用一个变量 dotPos 记录小数点的下标,初值为-1,然后遍历整个字符串。如果遍历过程中出现了小数点或者0~9以外的字符,那么返回不合法:由于小数点只能存在一个,因此当前位是小数点时如果dotPos不等于初值-1的话就直接返回不合法,否则把dotPos赋值为当前位置。
    (3) 遍历完整个字符串后,如果dotPos不为-1 (即存在小数点)、且dotPos位置之后还存在至少两个字符位时,说明精度超过两位小数,直接返回不合法;
    (4) 最后,将字符串转换为double型,判断其绝对值是否超过了1000,是的话说明不合法,否则合法。

注意点

注意最后输出时“number"的单复数,当合法的数的个数为0或者不小于2时,使用复数numbers,否则用单数number。

int n;

bool check(string s)
{
    int i=0;
    if(s[0] == '-') i++;
    int pos=s.find('.');
    for(;i<s.size();i++)
        if(i==pos || isdigit(s[i]))
            continue;
        else
            return false;
        
    if(pos != string::npos && s.substr(pos+1).size() > 2) return false;

    double x=stod(s);
    if(fabs(x) > 1000) return false;

    return true;
}

int main()
{
    cin>>n;

    vector<double> res;
    for(int i=0;i<n;i++)
    {
        string s;
        cin>>s;

        if(check(s)) res.pb(stod(s));
        else printf("ERROR: %s is not a legal number\n",s.c_str());
    }

    double sum=0;
    for(int i=0;i<res.size();i++)
        sum+=res[i];
    if(res.size() == 0)
        printf("The average of 0 numbers is Undefined\n");
    else if(res.size() == 1)
        printf("The average of 1 number is %.2f",sum);
    else
        printf("The average of %d numbers is %.2f\n",res.size(),sum/res.size());

    //system("pause");
    return 0;
}
posted @ 2021-02-22 11:16  Dazzling!  阅读(48)  评论(0编辑  收藏  举报