PAT1054 求平均值 (20 分)【从非法输入字符串中获取合法输入 cin.putback()】

吐槽

题目描述的太不清晰了吧,自己写了一些测试用例,从已知中并不能看出这些输入是否合法…

我的测试用例

21
007 000.01 12. .9 -007 -000.01 -12. -.9 .9. - +100 + -+. -+ .- .+ ± ++ 0. .0 +.00

以上输入到底哪些可以??下面是别人的AC代码和我的代码(有一个测试点不通过)的结果对比
实际上,OJ上的测试点没有那么刁钻,可能是我想复杂了。但既然有的测试用例会引起歧义,至少应该在题目中说清楚正确格式啊…
在这里插入图片描述
在这里插入图片描述

题目

在这里插入图片描述
在这里插入图片描述

代码

没有必要的判断被我注释掉了,但是别人的AC代码里却又有这些判断

#include<iostream>
#include<string>
#include<vector>
using namespace std;
//5 -3.2 aaa 9999 2.3.4 7.123 2.35
int main()
{
	//先吸收一个字符串:判断整个字符串内只有一个小数点、只有一个'-'且负号在第0个字符、小数点后面的数字不超过2位。
	//如果满足以上条件,将string返回stdin,用double接收,如果-1000<=num<=1000,计算sum

	//疑问:以下输入哪些符合要求?可以有加号吗?
	//007 000.01 12. .9 -007 -000.01 -12. -.9 .9. -
	int total;
	cin >> total;

	//输入
	string str;
	int totalJian = 0;
	int totalDian = 0;
	int totalJia = 0;
	int i, j, k;
	vector<double>num;
	double numTemp;
	double sum = 0;
	for (i = 0; i < total; i++)
	{
		cin >> str;

		totalDian = 0;
		totalJian = 0;
		totalJia = 0;

		for (j = 0; j < str.size(); j++)//对这个字符串的每一个字符检测
		{
			if (str[j] == '-' || str[j] == '+' || str[j] == '.' || (str[j] >= '0' && str[j] <= '9'))//一个字符的所有可能
			{
				if (str[j] == '-')
				{
					totalJian++;
					if (totalJian > 1 || j != 0|| str.size()==1)//如果多个减号  或者减号不在第一个  或者整个str只有减号
					{
						//输出error
						cout << "ERROR: " << str << " is not a legal number\n";
						break;
					}
				}
				if (str[j] == '+')
				{
					totalJia++;
					if (totalJia > 1 || j != 0 || str.size() == 1)//如果多个加号  或者加号不在第一个  或者整个str只有加号
					{
						//输出error
						cout << "ERROR: " << str << " is not a legal number\n";
						break;
					}
				}
				if (str[j] == '.')
				{
					totalDian++;
					if (totalDian > 1)
					{
						//输出error
						cout << "ERROR: " << str << " is not a legal number\n";
						break;
					}
					//if (j== str.size()-1)//如果小数点在末尾
					//{
					//	//输出error
					//	cout << "ERROR: " << str << " is not a legal number\n";
					//	break;
					//}
					//if (j == 0)//如果小数点在开头
					//{
					//	//输出error
					//	cout << "ERROR: " << str << " is not a legal number\n";
					//	break;
					//}
					//if (j!=0&&str[j-1]=='-')//如果小数点前面是-
					//{
					//	//输出error
					//	cout << "ERROR: " << str << " is not a legal number\n";
					//	break;
					//}
					if (str.size() - j > 3)
					{
						//输出error
						cout << "ERROR: " << str << " is not a legal number\n";
						break;
					}
				}
			}
			else
			{
				//输出error
				cout << "ERROR: " << str << " is not a legal number\n";
				break;
			}
		}

		//通过了检测
		if (j == str.size())
		{
			//放回
			for (k = str.size() - 1; k >= 0; k--)
			{
				cin.putback(str[k]);
			}
			//用double接收
			cin >> numTemp;
			//检测是否范围内
			if (numTemp >= -1000.00&&numTemp <= 1000.00)
			{
				num.push_back(numTemp);
				sum += numTemp;
			}
			else
			{
				cout << "ERROR: " << str << " is not a legal number\n";
			}
		}
	}

	//输出
	if (num.size() == 0)
	{
		cout << "The average of 0 numbers is Undefined";
	}
	else
	{
		cout << "The average of " << num.size() << " numbers is ";
		printf("%.2lf", sum / num.size());
	}

	cout << endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/88016578