其他分享
首页 > 其他分享> > PAT(乙级)1054 求平均值

PAT(乙级)1054 求平均值

作者:互联网

1054 求平均值 (20 分)

本题的基本要求非常简单:给定 N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数据算在内。

输入格式:

输入第一行给出正整数 N(≤100)。随后一行给出 N 个实数,数字间以一个空格分隔。

输出格式:

对每个非法输入,在一行中输出 ERROR: X is not a legal number,其中 X 是输入。最后在一行中输出结果:The average of K numbers is Y,其中 K 是合法输入的个数,Y 是它们的平均值,精确到小数点后 2 位。如果平均值无法计算,则用 Undefined 替换 Y。如果 K 为 1,则输出 The average of 1 number is Y

输入样例 1:

7
5 -3.2 aaa 9999 2.3.4 7.123 2.35

结尾无空行

输出样例 1: 

ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38

结尾无空行

输入样例 2: 

2
aaa -9999

结尾无空行

输出样例 2:

ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined

结尾无空行

关键点:

 1.后面结尾带一个负号如,' 111.'是合法的数

2.当合法的数只有一个时要用 ' number ',没有s

3.当只有一个负号 '-' 时是非法的数

4.用sscanf函数和sprintf函数更加方便

详细代码:

#include<stdio.h>
#include<string.h>

int main() {
	int N;
	scanf("%d",&N);
	char ch[1000];
	int i, t, r, dian, fu, b ;
	int n = 0;
	int j = 0;
	double a;
	double sum = 0;
	double temp;
	while( scanf("%s",ch) != EOF ) {
		j++;
		//printf("%s\n",ch);
		r = 1;//是否为合理数
		dian = 0;//点的数量
		fu = 0;//负号的数量
		temp = 0;//合理的数的值
		t = strlen(ch);//长度

		for( i = 0; i < t; i++) {
			if( ( ch[i] < '0' || ch[i] > '9' ) && ch[i] != '.' && ch[i] != '-' ) {
				r = 0;
				break;
			} else if( ch[i] == '.' ) {
				dian++;
				b = i;
				if(dian > 1) {
					r = 0;
					break;
				}
			} else if( ch[i] == '-' ) {
				fu++;
				if(fu > 1) {
					r = 0;
					break;
				}
			}

		}
		//只有一个负数的情况
		if(fu == t ) {
			r = 0;
		}
		//小数点为2位
		if( r == 1 && dian == 1) {
			if(t - b > 3) {
				r = 0;
			}
		} /*else if(r == 1 && dian == 0 ) {
			if( t > 4) {
				r = 0;
			}
		}
*/
		if(r == 0) {
			printf("ERROR: %s is not a legal number\n",ch);
		} else if( dian == 0) {
			a = 1;
			for( i = t-1; i >= 0; i--) {
				if(ch[i] != '-') {
					temp += (ch[i] - '0') * a;
					a *= 10;
				}
			}

			if( fu == 1) {
				temp *= (-1);
			}
			//数据范围 -1000 ~ 1000
			if(temp >1000 || temp < -1000) {
				printf("ERROR: %s is not a legal number\n",ch);
				continue;
			}
			//printf("%lf\n",temp);
			sum += temp;
			n++;
		} else if( dian == 1) {
			a = 1;
			for( i = 0; i < ( t-b-1 ); i++) {
				a /= 10;
			}
			for( i = t-1; i >= 0; i--) {
				if( ch[i] != '.' && ch[i] != '-') {
					temp += (ch[i] - '0')/1.0 * a;
					a *= 10;
				}
			}
			if(fu == 1) {
				temp *= (-1);
			}
			//数据范围 -1000 ~ 1000
			if(temp > 1000 || temp < -1000) {
				printf("ERROR: %s is not a legal number\n",ch);
				continue;
			}
			//printf("%lf\n",temp);
			sum += temp;
			n++;
		}
	}
	if(n != 0) {
		sum /= n;
	}
	if( n> 1) {
		printf("The average of %d numbers is %.2lf", n, sum);
	} else if(n == 1) {
		printf("The average of %d number is %.2lf", n, sum);
	} else {
		printf("The average of 0 numbers is Undefined");
	}
	return 0;
}

 

标签:ch,PAT,temp,number,乙级,legal,ERROR,1054,1000
来源: https://blog.csdn.net/qq_61744307/article/details/121091581