平均1054(20分)
この問題の基本的な要件は非常に簡単です:N実数与えられ、その平均を算出します。しかし、合併症は、入力データの一部が違法であってもよいことです。区間[-1000,1000]入力での実数である「合法的な」、と、小数点以下1桁に最も正確で。あなたは平均値を計算すると、これらの不正なデータはカウントされませ。
入力フォーマット:
最初の行の入力は、正の整数N(≤100)が与えられます。次いで、ラインNの実数を与えられた数の間のスペースで区切られました。
出力フォーマット:
各入力行違法ERRORのための出力は:Xは、法律上の番号ではありません 、 Xが入力されています。最後の出力ラインの結果:K数の平均値がYであり 、 Kは、有効な入力の数であり、Yは平均値その二進場所です。平均値を計算することができない場合は、未定義で置き換えられY. Kが1である場合、出力は1つの数の平均値がYであります
入力サンプル1:。
。7
AAA 9999 5 -3.2 7.123 2.35 2.3.4。
输出样例1:
ERROR:AAAは法的数ない
ERROR:9999法的番号ない
ERROR:2.3.4法的番号ない
ERROR:7.123法的数ではない
3つの数字の平均値は1.38であります
サンプル入力2:
2
AAA -9999
输出样例2:
ERROR:AAAは、法的番号ない
-9999が合法番号がありません:ERROR
0数値の平均値が未定義
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int N;
cin>>N;
string s;
double sum; //合法数据的和
int i,j,K=0;//K记录合法输入个数
for(i=0;i<N;i++){
cin>>s;
int count1=0,count2=0;//记录负号和'.'的个数
int flag=1;//记录输入是否合法
//首先要对第一个字符进行判断只能是负号或数字
if(s[0]=='-'){
count1++;
}else if(s[0]>='0'&&s[0]<='9'){
}else{
printf("ERROR: %s is not a legal number\n",s.c_str());
continue;
}
//如果第一个字符合法进行下面的判断:一个“合法”的输入是 [-1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。
for(j=1;j<s.length();j++){
if(s[j]>='0'&&s[j]<='9'){
}else if(s[j]=='.'){
count2++;
int len=s.length()-j-1;//记录小数点后位数
if(count2>1||len>2){
flag=0;
break;
}
}else if(s[j]=='-'){
count1++;
if(count2>1){
flag=0;
break;
}
}else{
flag=0;
break;
}
}
if(flag==1){
if(stod(s)>=-1000&&stod(s)<=1000){
sum+=stod(s);
K++;
}else{
flag=0;
}
}
if(flag==0){
printf("ERROR: %s is not a legal number\n",s.c_str());
}
}
if(K==0){
printf("The average of 0 numbers is Undefined");
}else if(K==1){
printf("The average of 1 number is %.2f",sum);
}else{
printf("The average of %d numbers is %.2f",K,sum/K);
}
return 0;
}