题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805360777347072
读几个数,不合法就报错,计算合法的数量和平均数。
构思这种题,一开始就要思考测试点都在哪,这样才能有的放矢嘛——最保险的思路就是题目有说的,都当测试点,没说的地方,对于这种20分的题,先不要管。
这道题的测试都是浅显的覆盖了以下情况:
1、(易错点)有没有分合法的数的数量是0、1、其他,其中0和其他的number带s,1的不带s;
2、带两个小数点以上的数
3、含有除了数字、符号、小数点以外的数,如aaa
4、小数位数超过两位的数
5、大小不在[-1000,1000]范围内的数
6、(易错点)输出的小数要是两位的
不需要考虑的点:
1、输入的数是1.000、2.000等,后面带0的小数超过了2位,合法不合法
2、输入带两个负号的,合法不合法
满分代码如下:
int main(){
int n,num=0;
double total=0.0;
cin>>n;
string s;
for(int i=0;i<n;i++){
cin>>s;
bool f=true;
int dot=0;
int len=s.size();
for(int j=0;j<len;j++){
if(s[j]=='-'&&j>0){
f=false;
}
if(s[j]!='-'&& s[j]!='.' && !isdigit(s[j])){
f=false;
}
if(s[j]=='.'){
dot++;
}
}
if(f && dot>1){
f=false;
}
if(f){
int pos=s.find('.');
if(pos!=-1){
int zero=s.find_last_not_of('0');
//int zero=s.size()-1;
if(zero-pos>2){
f=false;
}
}
}
if(f && (stof(s)>1000.0 || stof(s)<-1000.0)){
f=false;
}
if(!f){
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
}else{
num++;
total+=stod(s);
}
}
if(num==0){
cout<<"The average of 0 numbers is Undefined";
}else if(num==1){
printf("The average of 1 number is %.02lf",total);
}else{
printf("The average of %d numbers is %.02lf",num,(double)total/num);
}
return 0;
}