PAT甲级1108.

目录

A1108

题目

样例

样例1

输入:

7
5 -3.2 aaa 9999 2.3.4 7.123 2.35

输出:

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

输出:

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

思路和坑点

  思路:
  由于给的输入不仅包含纯数字,还包含字符,所以使用字符串进行存储和处理。主要的处理过程为:每次读入一个字符串,然后对字符串进行判定,看是否满足合法性的要求,不合法数字进行错误提示输出,合法的数字进行统计和累加,需要统计的原因是因为涉及到计算平均值的时候数字个数的计算,按照题目要求需要特判。
  坑点:
  对于数字合法性的判定有以下的标准:
  1.首先必须是数字。
  2.不多于两个小数位。可以没有小数位,但是如果有小数位,必须不多于两位。

AC代码

#include<bits/stdc++.h>
using namespace std;    
bool Isreal(char *s);
int main(){    
#ifdef ONLINE_JUDGE    
#else    
    freopen("1.txt", "r", stdin);    
#endif    
    double sum=0;
    int cnt=0,n;
    char temp[50];                                      //使用字符串读入每一个数据
    scanf("%d",&n);
    for(int i=0;i<n;i++){                               //依次读入n个数据,然会对每一个数据进行判断
        scanf("%s",temp);
        if(Isreal(temp)){                               //如果是一个合法输入,转化为浮点数然后进行累加并计数                
            double num;
            sscanf(temp,"%lf",&num);
            sum+=num;
            cnt++;
        }
        else                                            //不合法数字输出不合法提示
            printf("ERROR: %s is not a legal number\n",temp);
    }
    if(cnt==1)                                          //合法数字的单复数处理
        printf("The average of 1 number is ");
    else    
        printf("The average of %d numbers is ",cnt);
    if(cnt==0)                                          //平均数计算中的除0处理
        printf("Undefined");
    else
        printf("%.2f",sum/cnt);
    return 0;    
}
bool Isreal(char *s)                                    //判断输入字符串合法性的函数,合法输入位-1000到1000(闭区间)的不多于两位小数的数字
{
    double num;
    int point=0;
    for(int i=0;s[i]!='\0';i++){                        //统计小数点个数
        if(s[i]=='.')
            point++;
    }
    if(point>1)                                         //如果小数点个数大于1,显然不是一个合法输入
        return false;
    if(sscanf(s,"%lf",&num)==1){                        //读取检测,如果成功读取到一个数字
        if(num>=-1000&&num<=1000){                      //检验浮点数的范围
            if(point==1&&strrchr(s,'\0')-strrchr(s,'.')>3)
                return false;                           //如果有是一个浮点形式(即有一个小数点),对小数点的位数进行判断
            else return true;
        }
        else return false;                              //如果不满足数字的区间范围
    }
    else
        return false;                                   //如果不是数字
}