本题的基本要求非常简单:给定 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
思路:牛啊这题,这题牛
新学习两个东西
scanf("%s",&arr);
sscanf(arr,"%lf",&tmp);//从一个字符串中读进与指定格式相符的数据
sprintf(sam,"%.2lf",tmp);//字符串格式化命令,主要功能是把格式化的数据写入某个字符串中
//这里能观察到arr,tmp,sam值的变化 printf("%s %lf %s\n",arr,tmp,sam);
1.sscanf
#include<stdio.h>
int main(){
char str[100];
//用法一:取指定长度的字符串
sscanf("12345","%4s",str);
printf("用法一\nstr = %s\n",str);
//用法二:格式化时间
int year,month,day,hour,minute,second;
sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);
printf("用法二\ntime = %d-%d-%d %d:%d:%d\n",year,month,day,hour,minute,second);
//用法三:读入字符串
sscanf("12345","%s",str);
printf("用法三\nstr = %s\n",str);
//用法四:%*d 和 %*s 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
sscanf("12345acc","%*d%s",str);
printf("用法四\nstr = %s\n",str);
//用法五:取到指定字符为止的字符串。如在下例中,取遇到'+'为止字符串。
sscanf("12345+acc","%[^+]",str);
printf("用法五\nstr = %s\n",str);
//用法六:取到指定字符集为止的字符串。如在下例中,取遇到小写字母为止的字符串。
sscanf("12345+acc121","%[^a-z]",str);
printf("用法六\nstr = %s\n",str);
return 0;
}
用法一
str = 1234
用法二
time = 2013-2-13 14:55:34
用法三
str = 12345
用法四
str = acc
用法五
str = 12345
用法六
str = 12345+
2.sprintf
1.格式化数字字符串
sprintf最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf在大多数场合可以替代itoa。如:
//把整数123打印成一个字符串保存在s中。
sprintf(s, “%d”, 123); //产生“123″
2.控制浮点数打印格式
浮点数的打印和格式控制是sprintf的又一大常用功能,浮点数使用格式符”%f”控制,默认保留小数点后6位数字,比如:
sprintf(s, “%f”, 3.1415926); //产生“3.141593″
但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m表示打印的宽度,n表示小数点后的位数。比如:
sprintf(s, “%10.3f”, 3.1415626); //产生:“ 3.142″
sprintf(s, “%-10.3f”, 3.1415626); //产生:“3.142 ”
sprintf(s, “%.3f”, 3.1415626); //不指定总宽度,产生:“3.142″
代码
#include <stdio.h>
#include<string.h>
int main(){
int n,i,j,cnt=0;//cnt记录合法数目个数
scanf("%d",&n);
char arr[50],sam[50];//存储输入的字符,存储格式化后的字符串
double sum=0,tmp;//sum总和,实数tmp
for(i=0;i<n;i++){
scanf("%s",&arr);
sscanf(arr,"%lf",&tmp);//从一个字符串中读进与指定格式相符的数据
sprintf(sam,"%.2lf",tmp);//字符串格式化命令,主要功能是把格式化的数据写入某个字符串中
//这里能观察到arr,tmp,sam值的变化 printf("%s %lf %s\n",arr,tmp,sam);
int flag=0;
for(j=0;j<strlen(arr);j++){//strlen()计算指定字符串arr的长度
if(arr[j]!= sam[j]) flag=1;
}
if(flag != 0|| tmp< -1000|| tmp> 1000){
printf("ERROR: %s is not a legal number\n",arr);
continue;
}else{
sum += tmp;//求和
cnt++;
}
}
if(cnt>1) printf("The average of %d numbers is %.2lf",cnt,sum/cnt);
if(cnt==1) printf("The average of 1 number is %.2lf",sum);
if(cnt==0) printf("The average of 0 numbers is Undefined");
return 0;
}