1. 程式人生 > 實用技巧 >1054 求平均值 (20分)

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

輸入樣例:

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
aaa -9999

輸出樣例:

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

解析

  處理字串,判斷是否合法,這裡用-9999表示是一個非法數字
  遍歷字串如果遇到非數字非負號的字元,就要判斷可能是是小數點,如果不是小數點就不合法,而且小數點只能有一個,如果是第二次就return -9999,同時如果是小數點還要判斷一下小數點後的長度,大於2也不合法
  如果合法就atof()轉換為浮點數求和,總數+1,不合法就輸出不合規資訊

答案

#include<iostream>
#include<string>
#include<stdlib.h>
#include<math.h>
using namespace std;

double isNum(string s){
    int flag =1;
    for(int i = 0 ; i <s.length() ; i++){
        if((s[i] <'0' || s[i] > '9') && s[i] != '-'){
            if(s[i] == '.' && flag){
                flag = 0;
                if(s.length() - i > 3){
                    return -9999;
                }  
                continue;
            }
            return -9999;
        }
    }
    return abs(atof(s.c_str())) > 1000 ? -9999 : atof(s.c_str());
}

int main(){
    int n,count = 0;
    string s;
    double sum,a;
    cin >> n;
    while(n--){
        cin>>s;
        if((a = isNum(s) ) != -9999){
            sum +=a;
            count ++;
        }else{
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
        }
    }
    if(count > 1){
        printf("The average of %d numbers is %.2f",count,sum / count);
    }else if(count == 1){
        printf("The average of 1 number is %.2f",sum / count);
    }else{
        printf("The average of %d numbers is Undefined",count);
    }
    
}