PAT Bブラシ被験者平均経路1054(20分)

平均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;
}
公開された73元の記事 ウォンの賞賛0 ビュー535

おすすめ

転載: blog.csdn.net/derbi123123/article/details/103793430