1. 程式人生 > >pat1054 求平均值 (20)

pat1054 求平均值 (20)

沒有 輸入 並且 除了 std 給定 其中 set 格式

本題的基本要求非常簡單:給定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)