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