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