1. 程式人生 > >1054 求平均值 (string+.c_str() )

1054 求平均值 (string+.c_str() )

兩個 1.3 輸入 def number 給定 scanf scan iso

本題的基本要求非常簡單:給定 N 個實數,計算它們的平均值。但復雜的是有些輸入數據可能是非法的。一個“合法”的輸入是 [?] 區間內的實數,並且最多精確到小數點後 2 位。當你計算平均值的時候,不能把那些非法的數據算在內。

輸入格式:

輸入第一行給出正整數 N(≤)。隨後一行給出 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

思路:

1.以字符串輸入,用函數判斷是否合法,合法的再用string.c_str()轉過來

2.如果字符串第一個字符是 ‘-‘ 則去掉,接下來的合法字符只剩:0-9,‘. ‘

3.當遍歷到 ‘. ‘,如果小數點下標的初值不是-1則判斷出兩個小數點不合理,返回false

4.將遍歷完後的合理字符串轉換為double型,如果值大於1000返回false否則返回true

#include<string
> #include<cstdio> #include<iostream> using namespace std; bool isok(string s){ if(s[0]==-) s.erase(s.begin());//hulue diyige fuhao int low=-1,len=s.length(); if(len==0) return false; for(int i=0;i<len;i++){ if(!(s[i]==.||(s[i]>=0&&s[i]<=9))) return false;//feifa zifu if(s[i]==.){ if(low!=-1) return false;//yijingchuxianguo xiaoshudian else low=i; } } if(low!=-1&&low+3<len) return false;//chaoguoliangweixiaoshu double temp; sscanf(s.c_str(),"%lf",&temp);//zifuchuan zhuanhuancheng double return temp<=1000; } int main(){ int n,num=0; cin>>n; double sum=0,temp; string input; for(int i=0;i<n;i++){ cin>>input; if(isok(input)){ sscanf(input.c_str(),"%lf",&temp); sum+=temp; num++; }else{ printf("ERROR: %s is not a legal number\n",input.c_str()); } } if(num==0) printf("The average of 0 numbers is Undefined\n"); else if(num==1) printf("The average of 1 number is %.2f\n",sum); else printf("The average of %d numbers is %.2f\n",num, sum/num); return 0; }

1054 求平均值 (string+.c_str() )