问题描述
求n个数的平均数和标准差。给定n个数X1 ,X2 ,X3 ......Xn ,数据的平均数为x
输入
第一行一个正整数T,表示有T组测试数据。以下每行是一组数,第一个数为数据个数m(m<200),然后是m个正整数构成,
输出
对于每组数据输出一行,即平均数和标准差,两个数据均保留3位小数,并且以一个空格隔开。
输入样列
2
5 1 1 1 1 1
6 1 2 3 4 6 5
输出样例
1.000 0.000
3.500 1.708
#include<stdio.h>
#include<math.h>
int main()
{
int a[101];
int n,t,i;
double ave,d,s;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
s=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
s=s+a[i];
ave=s/n;
d=(a[i]-ave)*(a[i]-ave)/n;
d=sqrt(d);
}
printf("%.3f %.3f\n",ave,d);
}
return 0;
}
1、问题出在for语句,计算平均值ave应该在输入完所有数据之后,所以不能放在输入数据的for语句中,而标准差需要用到ave,所以也要放在for语句之外,另外再建一个for语句求各值与ave的差的和,最后求标准差。
2、建议在涉及到多个数据输入的代码中,适当添加提示语句。
代码我大概修改了一下,如果要严格按照两行输出在一起的格式,还需要调整一下,增加几个变量用于储存那四个值。
```c
#include<stdio.h>
#include<math.h>
int main()
{
int a[101];
int n,t,i,j;
double ave,d,s;
printf("请输入有几组数据:");
scanf("%d",&t);
for (j=1;j<=t;j++)
{
printf("第%d组有多少个数据:",j);
scanf("%d",&n);
s=0;
for(i=1;i<=n;i++)
{
printf("第%d组第%d个数据:",j,i);
scanf("%d",&a[i]);
s=s+a[i];
}
ave=s/n;
for (i=1;i<=n;i++)
{
d+=(a[i]-ave)*(a[i]-ave);
}
d=sqrt(d/n);
printf("平均值是:%.3f\t 标准差是:%.3f\n",ave,d);
}
return 0;
}
输出结果:
请输入有几组数据:2
第1组有多少个数据:5
第1组第1个数据:1
第1组第2个数据:1
第1组第3个数据:1
第1组第4个数据:1
第1组第5个数据:1
平均值是:1.000 标准差是:0.000
第2组有多少个数据:6
第2组第1个数据:1
第2组第2个数据:2
第2组第3个数据:3
第2组第4个数据:4
第2组第5个数据:6
第2组第6个数据:5
平均值是:3.500 标准差是:1.708
Process exited after 18.02 seconds with return value 0
请按任意键继续. . .