1054 求平均值 (20分)
阿新 • • 發佈:2020-08-05
題目
本題的基本要求非常簡單:給定 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); } }