1054 求平均值 (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
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
aaa -9999
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined
思路:
看到這題因為有非法輸入我們應該知道了這題不能用「數」去處理數據了,應該以字符串的形式處理數據。但是這道題合法數字裡面有負數,又給我們帶來了一些問題,我一開始是有一些自己的想法的,但是抱著學習一下可能存在的更好的思路或者方法的態度上網查了一下,果然又讓我查到了一對很有意思的函數——sscanf函數和sprintf函數。關於這兩個函數的具體使用方法還請自己百度,我就不在這裡獻醜了。
sscanf用法
https://baike.baidu.com/item/sscanf/10551550?fr=aladdin
代碼:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char c[100],b[100]="1.0";
double a=0,s=0.0;
int s1=0,n;
int i,j,f;
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%s",&c);
sscanf(c,"%lf",&a);
sprintf(b,"%.2lf",a);
f=0;
for(j=0;j<strlen(c);j++)
{
if (c[j]!=b[j])
{
f=1;
break;
}
}
if(f||a>1000||a<-1000)
printf("ERROR: %s is not a legal number\n",c);
else
{
s1++;
s+=a;
}
}
if(s1==0)
printf("The average of 0 numbers is Undefined");
else if(s1==1)
printf("The average of 1 number is %.2f",s);
else
printf("The average of %d numbers is %.2lf",s1,s/s1);
return 0;
}