PAT 1054 求平均值 (20分)+测试点分析

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
#include
#include
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;
}

你可能感兴趣的:(PAT 1054 求平均值 (20分)+测试点分析)