急!!!!这是一段c语言程序,编译没有问题,但是没有办法达到剔除异常数据的功能,求教哈

#include<stdio.h>
#include<math.h>
void main()
{
double a[15]; /*输入数据数组*/
double b[20];
double bl[20]={0.00,0.00,1.15,1.46,1.67,1.82,1.94,2.03,2.11,2.18,2.23,2.29,2.33,2.37,2.41,2.44,2.47,2.50,2.53,2.56};
double bn[20]={0.00,0.00,1.15,1.49,1.75,1.94,2.10,2.22,2.32,2.41,2.48,2.55,2.61,2.66,2.70,2.74,2.78,2.82,2.85,2.85};
int i; /*输入数据个数*/
int k,j,p,m,f,t,s=0,M=0,x,w=0; /*中间变量*/
double c[15]; /* 偏差数组*/
double max;/*中间变量*/
int g[15]; /*坏值位置数组*/
double sum, sumb; /*中间变量 数据的和值*/
double ave; /*平均值*/
double d,y; /*中间变量*/
printf("格拉布斯检验误差率 \n");
scanf("%f",&y);
if(y=0.05)x=0;
else x=1;
printf("input numbers \n");
scanf("%d",&i); /* 输入数据总的个数*/
//printf("input numbers is \n");
//printf("%d\n",i); /*输出数据的总个数*/
printf("input the data\n");
for(sum=0,k=0;k<i;k++) /*输入每一个数据的值*/
{
scanf("%lf",&a[k]);
sum+=a[k];
}
ave=sum/i; /*求平均值*/
art:if(x=0)
{
for(w=0;w<20;w++)
b[w]=bl[w];
}

else for(w=0;w<20;w++)
b[w]=bn[w];
for(j=0,sumb=0;j<i;j++)
{
c[j]=fabs(a[j]-ave);sumb=sumb+c[j]*c[j];
}
d=sqrt(sumb/(i-1)); /*求方差*/
printf("数据的平均值%lf\n",ave);
printf("数据的标准方差%lf\n",d);
m=0;p=0;
for(k=0;k<i;k++)
{
if(c[k]>b[k]*d)
{
m=1;g[p]=k;p++;
}
} /*找所有坏值*/
if(m==0) /*如果无坏值*/
{
goto put;
} /*转到输出*/
for(f=g[0],max=0,t=f;f<=g[p-1];f++)
{
if(max<a[f])
{
max=a[f];
t=f;
}
}/*找出坏值中的最大的一个*/
for (k=t;k<i-1;k++)
{
a[k]=a[k+1];
} /*剔除坏值并将后面的数据往前移*/
printf("out the error\n");
printf("%lf\n",a[t]); /*找到最大的坏值*/
i=i-1; /* 数据总个数减1*/
for(s=0,sum=0;s<i;s++)
{
sum+=a[s];
} /* 重新求和*/
ave=sum/i; M+=1; /*重新算方差*/
goto art; /*回去再找坏值*/
put: printf("now all bad data number\n");
printf("%d\n",M); /* 输出坏值个数*/
printf("mean value is equal to\n");
printf("%lf\n",ave); /*输出平均值*/
printf("stander error is equal to\n");
printf("%lf\n",d); /*输出标准偏差*/
printf("now all right numbers\n");
for(s=0;s<i;s++)

printf("%lf\n",a[s]); /*输出所以正确的数据*/
}

你的思路是先找出所有的坏值,然后再找一个从第一个坏值的位置开始一直到最后一个坏值的位置,这期间的原数组中的一个最大值,然后去掉这个值,你感觉这个是格拉布斯算法吗。
/*找出坏值中的最大的一个*/这个逻辑是不是有问题,你会找从第一个坏值到最后一个坏值之间所有的,这样浪费了很多比较吧而且格拉布斯算法要的也不是原值最大吧,而是差值最大,也就是你直接在c[k]里面找一个最大的,然后那个原值就是你要找的坏值了吧。
而且你用的那个c[k]>b[k]*d,b[k]数组是不是反了?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-28
if(y=0.05)x=0;
else x=1;
这里应该是y==0.05
其他的地方还有这个错误,你改改。
第2个回答  2012-12-16
你怎么解决问题的?能不能告诉一下,我也在用格拉布斯法剔除粗大误差编程,正确的程序可否给我看一下,谢谢啦
第3个回答  2012-04-27
。。。。看看高手们的回答

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网