題目鏈接: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;
}