1054 求平均值 (string+.c_str() )
阿新 • • 發佈:2019-02-04
兩個 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() )