whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1054 || 求平均值(详解,C/C++示例,测试点分析)

Posted on 2019-10-01 In PAT

求平均值

题目描述

本题的基本要求非常简单:给定 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

1
2
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35

输出样例1

1
2
3
4
5
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

1
2
2
aaa -9999

输出样例2

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

问题解决

解题思想

本题如果用分类讨论法将会很复杂,利用sscanf()函数与sprintf()函数将大大简化问题。判断一个输入数据是否为合法的过程如下:

  1. 输入数据到字符数组str1中;
  2. 将字符数组str1的内容以”%lf”的格式写入temp(temp为double型)中;
  3. 把temp中的数据以”%.2lf”的格式写到str2字符数组中;
  4. 比较字符数组str1中的字符是否与str2中的相应字符相等;
  5. 若4中相等且temp是 [−1000,1000] 区间内的实数则输入数据合法,否则不合法。

坑点提醒

题目明确要求如果 K 为 1,则输出 The average of 1 number is Y,注意此处输出语句中的number,当k>1时输出语句应中应为numbers。但是下面的平均值输出都是numbers。

知识拓展

  • sscanf(str1,"%lf",&temp);写法的作用是把字符数组str1的内容以”%lf”的格式写入temp中
  • sprintf(str2,"%.2lf",temp);写法的作用是把temp中的数据以”%.2lf”的格式写到str2字符数组中

以上可灵活应用。

代码示例(C/C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int Str_Cmp(char str1[],char str2[]);
int main()
{
int n;
scanf("%d",&n);
int k = n;
double sum = 0.0;
char str1[50],str2[50]; //数组长度不能太短,否则会出现运行时错误
for(int i = 0; i < n; i++){
double temp;
scanf("%s",str1);
sscanf(str1,"%lf",&temp); //将字符数组str1的内容以"%lf"的格式写入temp中
sprintf(str2,"%.2lf",temp); //把temp以"%.2lf"的格式写到str2字符数组中
if(fabs(temp) <= 1000&&!Str_Cmp(str1,str2)){
sum += temp;
}
else{
k--; //合法数减1
printf("ERROR: %s is not a legal number\n",str1);
}
}
if(!k){
printf("The average of 0 numbers is Undefined");
}
else if(k == 1){ //题目明确说明k为1时要特殊对待,即把numbers改为number
printf("The average of 1 number is %.2lf",sum);
}
else{
printf("The average of %d numbers is %.2lf",k,sum / k);
}
return 0;
}
//重写字符串比较函数
int Str_Cmp(char str1[],char str2[])
{
int len1 = strlen(str1);
for(int i = 0; i < len1; i++){ //只需按str1字符串的长度比较即可,str2多出的部分不必比较
if(str1[i] != str2[i]){
return 1;
}
}
return 0;
}

题目来源:PAT乙级1054
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1053 || 住房空置率(详解,C/C++示例,测试点分析)
PAT乙级1055 || 集体照(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 求平均值
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例1
    5. 1.5. 输出样例1
    6. 1.6. 输入样例2
    7. 1.7. 输出样例2
    8. 1.8. 问题解决
      1. 1.8.1. 解题思想
      2. 1.8.2. 坑点提醒
      3. 1.8.3. 知识拓展
      4. 1.8.4. 代码示例(C/C++)
© 2021 Mengzhao Wang