1108 Finding Average (20 分)
- 以字符串形式输入每个数,然后分别判断是否合法,不合法时输出错误信息,合法时对其进行累加,最后输出平均数。
- 判断是否合法的过程:
(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;
}