1054 求平均值 (20 分)*sscanf和sprintf函数的用法

1054 求平均值 (20 分)*sscanf和sprintf函数的用法
本题的基本要求非常简单给定 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。输入样例 17 5 -3.2 aaa 9999 2.3.4 7.123 2.35输出样例 1ERROR: 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输入样例 22 aaa -9999输出样例 2ERROR: aaa is not a legal number ERROR: -9999 is not a legal number The average of 0 numbers is Undefined怎么判断是否合法、怎么转换字符串为数字怎么想都没有什么好办法在网上一查原来这么简单AC代码#include bits/stdc.h using namespace std; int main(){ int N,cnt0,i,j; double sum0; scanf(%d,N); for(i0;iN;i){ char s1[100],s2[100]; scanf(%s,s1); double temp; sscanf(s1,%lf,temp); sprintf(s2,%.2lf,temp); int flag0; for(j0;jstrlen(s1);j) if(s1[j]!s2[j]) flag1; if(flag1||temp-1000||temp1000) printf(ERROR: %s is not a legal number\n,s1); else{ sumtemp; cnt; } } if(cnt1) printf(The average of 1 number is %.2lf,sum); else if(cnt1) printf(The average of %d numbers is %.2lf,cnt,sum/cnt); else printf(The average of 0 numbers is Undefined); return 0; }两个函数sscanf(s1,%lf,temp):把s1转化成lf类型存到temp这个变量中提前声明temp变量#include stdio.h #include stdlib.h #include string.h int main() { int day, year; char weekday[20], month[20], dtm[100]; strcpy( dtm, Saturday March 25 1989 ); sscanf( dtm, %s %s %d %d, weekday, month, day, year ); printf(%s %d, %d %s\n, month, day, year, weekday ); return(0); } 输出 March 25, 1989 Saturdaysprintf(s2,%.2lf,temp):把temp这个数按照%.2lf的格式往字符串s2中输出