pat1054 求平均值 (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”。
輸入樣例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.字符串中包含除了- . 和 0-9以外的違法字符
2.不包含違法字符
不包含小數點,但轉化的整數<-1000 或者>1000
包含一個小數點,但小數點後的字符數大於2
包含2個以上的小數點,此時違法
#include <iostream>
#include <sstream>
#include <string>
#include<iomanip>
using namespace std;
int num=0;
double sum=0;
//該字符串是否包含除 - . 0-9以外的字符
int containCh(string str)
{
int i,len=str.size();
for(i=0;i<len;i++)
{
if(str[i]==‘-‘||str[i]==‘.‘)
{
continue;
}
if(str[i]<‘0‘||str[i]>‘9‘)
{
return 1;
}
}
return 0;
}
//
//將字符串轉化為整數
int stoint(string res)
{
int a;
stringstream ss;
ss << res;
ss >> a;
return a;
}
//將字符串轉化為浮點數
double stodouble(string res)
{
double a;
stringstream ss;
ss << res;
ss >> a;
return a;
}
//當字符串只包含合法的字符時對字符串進行判斷
void pointnum(string str)
{
int i,len=str.size();
//統計小數點的個數
int count=0;
for(i=0;i<len;i++)
{
if(str[i]==‘.‘)
{
count++;
}
}
//當沒有小數點時
if(count==0)
{
int a=stoint(str);
if(a>=-1000&&a<=1000)
{
sum+=a;
num++;
}
else
{
cout<<"ERROR: "<<str<<" is not a legal number"<<endl;
}
}
else if(count==1)
{
int pos=str.find(‘.‘);
//小數點後的位數<=2位
if(len-pos-1<=2)
{
double b=stodouble(str);
sum+=b;
num++;
}
else
{
cout<<"ERROR: "<<str<<" is not a legal number"<<endl;
}
}
else if(count>1)
{
cout<<"ERROR: "<<str<<" is not a legal number"<<endl;
}
}
int main()
{
int n,i;
cin>>n;
string *input=new string[n];
for(i=0;i<n;i++)
{
cin>>input[i];
}
for(i=0;i<n;i++)
{
//如果該字符串包含不合法的字符直接跳過
if(containCh(input[i]))
{
cout<<"ERROR: "<<input[i]<<" is not a legal number"<<endl;
}
else
{
pointnum(input[i]);
}
}
if(num==0)
{
cout<<"The average of "<<num<<" numbers is Undefined"<<endl;
}
else
{
double average=sum/num;
cout<<"The average of "<<num<<" numbers is "<<setiosflags(ios::fixed)<<setprecision(2)<<average;
}
return 0;
}
pat1054 求平均值 (20)