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

1054. 求平均值 (20)

lag += 均值 分隔 2.3 blog define stdio.h 區間

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

code:
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 
 5 int islegal(char a[]) 
 6 {
 7     int i = 0,flag = 0,count = 0;
 8     if(a[0] == -)
 9         i = 1;
10     for(;i < strlen(a);i++)
11     {
12         if((a[i] < 0 || a[i] > 9
)&&a[i] != .)//只能是數字或小數點 13 return 0; 14 if(a[i] == . && flag == 1)//只能有一個小數點 15 return 0; 16 if(flag == 1)//只能精確到小數點後兩位 17 count++; 18 if(a[i] == .) 19 flag = 1; 20 21 } 22 if(count > 2) 23 return 0; 24 if(atof(a) < -1000.0 || atof(a) > 1000.0) 25 return 0; 26 return 1; 27 } 28 int main() 29 { 30 int n,i,count = 0; 31 double sum = 0.0; 32 scanf("%d",&n); 33 getchar(); 34 char a[101] = {0}; 35 for(i = 0;i < n;i++) 36 { 37 scanf("%s",a); 38 if(islegal(a)) 39 { 40 sum += atof(a); 41 count++; 42 } 43 else 44 printf("ERROR: %s is not a legal number\n",a); 45 } 46 double average = sum/count; 47 if(count == 0) 48 printf("The average of 0 numbers is Undefined"); 49 else if(count == 1) 50 printf("The average of 1 number is %.2lf",average); 51 else 52 printf("The average of %d numbers is %.2lf",count,average); 53 54 return 0; 55 }



1054. 求平均值 (20)