1054 求平均值 (20分)
本题的基本要求非常简单:给定 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.4
小数点超过2位 (特殊情况1)7.12345
小数点后精度超过2 (特殊情况2)-
刚好只输入一个负号 (特殊情况3)- 小数点后面不跟上数字 如
34.
(特殊情况4)
于是需要一个一个写if-else语句排除。不过情况3和4似乎没写入测试点。
测试点分析:
- 测试点0
1.2.3.4
小数点超过2位 - 测试点1 输入样例含非数字,如
abcd
,并且最后合法输入为零。需要输出The average of 0 numbers is Undefined
- 测试点2 合法输入的个数刚好为1,这里特别需要注意的是最后输出是
number
而不是numbers
,这里容易看错······
AC代码
#include<iostream>
#include<vector>
#include<cctype>
using namespace std;
int main()
{
int n; cin>>n;
vector <double> v;
while(n--)
{
string s;
cin>>s;
int point=0,alpha=0,pos=0,minus=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='-' && s.size()==1) minus++;
if(s[i]=='-' && i==0) continue;
if(s[i]=='.')
{
point++;
pos=i+1;
}
if( !isdigit(s[i]) && s[i]!='.') alpha++;
}
if(alpha>0)
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//排除有非数字的字符
else if(minus>0)
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//排除当只输入一个负号'-'的特殊情况。
else if(point>1)
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//排除类似1.2.3有1个以上小数点的情况
else if(point==1 && ( s.size()-pos>2 ) )
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//排除类似1.2345等数字精度超过小数点后2位的情况
else if(stod(s)<-1000 || stod(s)>1000)
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//排除不在-1000到1000内数字的情况
else
{
double t = stod(s);
v.push_back(t);
}
}
double sum=0;
for(auto x:v) sum+=x;
cout<<"The average of "<<v.size();
if(v.empty()) cout<<" numbers is Undefined";
else if(v.size()==1) printf(" number is %.2lf",sum/v.size());
else printf(" numbers is %.2lf",sum/v.size());
return 0;
}