常规解法:
写一个函数来判断,出现数字、小数点、负号以外的返回false;出现负号但不在开始的返回false;
小数点出现多次或者精度过高返回false;
最后还有一个范围限制。
stof string->double
#include<bits/stdc++.h>
using namespace std;
double sum=0;int cnt=0;
bool f(string a){
int num=0;//.
int pospoint;
for(int i=0;i<a.size();i++){
if(isdigit(a[i])) continue;
else if(i==0&&a[i]=='-') continue;
else if(a[i]=='.'){
num++;pospoint=i;
}else{
return false;
}
}
if(num>=2||num==1&&a.size()-pospoint>3) return false;
if(stof(a)>1000||stof(a)<-1000) return false;
return true;
}
int main(){
int n;
cin>>n;
string a;
while(n--){
cin>>a;
if(f(a)){
sum+=stof(a);
cnt++;
}else{
cout<<"ERROR: "<<a<<" is not a legal number"<<endl;
}
}
if(cnt==0){
cout<<"The average of 0 numbers is Undefined"<<endl;
}else if(cnt==1){
cout<<"The average of 1 number is ";
printf("%.2f",sum);
}else{
cout<<"The average of "<<cnt<<" numbers is ";
sum/=cnt;
printf("%.2f",sum);
}
return 0;
}
sscanf sprintf解法
sscanf() – 从⼀个字符串中读进与指定格式相符的数据sprintf() – 字符串格式化命令,主要功能是把格式化的数据写⼊某个字符串中
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,cnt=0;
double temp,sum=0.0;
char a[50],b[50];
cin>>n;
while(n--){
scanf("%s",a);
sscanf(a,"%lf",&temp);
sprintf(b,"%.2f",temp);
//判断,如果原来的格式就是%.2f 那么字符串不会变
bool flag=false;
for(int j=0;j<strlen(a);j++)
if(a[j]!=b[j]) flag=true;
if(flag||temp<-1000||temp>1000){
printf("ERROR: %s is not a legal number\n",a);
continue;
}else{
sum+=temp;
cnt++;
}
}
if(cnt == 1)
printf("The average of 1 number is %.2f", sum);
else if(cnt > 1)
printf("The average of %d numbers is %.2f", cnt, sum / cnt);
else
printf("The average of 0 numbers is Undefined");
return 0;
}