本题的基本要求非常简单:给定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
本题比较简单,但是有两个坑,一个是输出-0.00这样的数字(测试数据未检测这一点),二是出现1 numbers这样的语法错误。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//isNum判断一段字符是个数字
int isNum(const char* str)
{int result = 0;int i = 0;int dotCnt = 0;double val = 0.0;int acuCnt = 0;for (i = 0; i < strlen(str); i++) {result = (str[i]>='A' && str[i]<='Z') || (str[i]>='a' && str[i]<='z');if (result) { //如果存在字母,则不是数字return 0;}if (str[i]=='-' && i!=0) { //如果非首位置出现‘-’,则不是数字return 0;}if (str[i] == '.') { dotCnt++;acuCnt = strlen(str) - i - 1;}}if (dotCnt > 1) { //如果‘.’出现两次以上,则不是数字return 0;}if (atof(str)>1000 || atof(str)<-1000) { //如果大于设定范围,则为非法数字return 0;}if (acuCnt > 2) { //如果小数点后精确数字位数>2,则是非法数字return 0;}return 1;
}int main()
{char str[100] = {'\0'};int N;int i;double sum = 0.0;int vldNumCnt = 0;double average = 0.0;scanf("%d", &N);for (i = 0; i < N; i++) {scanf("%s", str);if (isNum(str)) {vldNumCnt++;sum += atof(str);} else {printf("ERROR: %s is not a legal number\n", str);}}if (vldNumCnt == 0) {printf("The average of 0 numbers is Undefined\n");} else {average = sum / vldNumCnt;if (-0.005<average && average<0) { //防止输出-0.00printf("The average of %d %s is 0.00\n", vldNumCnt, vldNumCnt==1 ? "number":"numbers"); //防止输出1numbers} else {printf("The average of %d %s is %.2lf\n", vldNumCnt, vldNumCnt==1 ? "number":"numbers", average);}}return 0;
}