📄 误差程序.c
字号:
#include <stdio.h>
#include <math.h>
int N ;
//extern float c,t;
/*********************子函数:求输入数组的算术平均值*******************************/
float pingjun(float *p)
{ int i;float e,sum=0.0;
for (i=0;i<N;i++)
sum+=p[i];
e=sum/N;
return e;
}
/******************子函数:求输入数组的标准差*******************************/
float biaozhuncha(float *p)
{ float b[100],aver;
float sum1=0.0;
int i;
aver=pingjun(p);
for (i=0;i<N;i++)
{ b[i]=(p[i]-aver)*(p[i]-aver);
sum1+=b[i]; /*求残余误差平方和*/
}
sum1=(float)sqrt(sum1/(N-1)); /*标准差*/
return sum1;
}
/*******************求算术平均值标准差**********************************/
float aver_biaozhuncha (float *p)
{float aver_bzc;
aver_bzc=(float)biaozhuncha(p)/sqrt(N);
return aver_bzc;
}
/*********************求算术平均值的极限误差*****************************/
float aver_jixian(float *p)
{ double t, fenbu1[]={63.66,9.92,5.84,4.60,4.03,3.71,3.50,3.36,3.25,3.17,
3.11,3.05,3.01,2.98,2.95,2.92,2.90,2.88,2.86,2.85,
2.83,2.82,2.81,2.80,2.79,2.78,2.77,2.76,2.76,2.75,2.70,
2.68,2.66,2.65,2.64,2.63,2.63,2.58}, /*显著度取0.01*/
fenbu2[]={12.71,4.30,3.18,2.78,2.57,2.45,2.36,2.31,2.26,2.23,
2.20,2.18,2.16,2.14,2.13,2.12,2.11,2.10,2.09,2.09,2.08,
2.07,2.07,2.06,2.06,2.06,2.05,2.05,2.05,2.04,2.02,2.01,
2.00,1.99,1.99,1.99,1.98,1.96} ; /*显著度取0.05*/
float aver_jx;
int v,i,j,m;
v=N-1; /*自由度v=n-1*/
j=v-1;
printf("极限误差 = \n");
loop: printf(" 请选择显著度水平:'1'---0.01 '2'---0.05\n");
m=getchar();
putchar(m);
/* if(m=='1') t=fenbu1[j];
else if(m=='2') t=fenbu2[j];
else printf(" \n输入错误 ! 请重新输入\n ");goto loop;*/
switch (m=getchar())
{ case '1' :for (i=0;i<38;i++)
t=fenbu1[j]; break;
case '2' :for (i=0;i<38;i++)
t=fenbu2[j]; break;
default :printf(" \n输入错误 ! 请重新输入\n ");goto loop;
//}
}
aver_jx=(float)t*aver_biaozhuncha(p); /*极限误差为t与平均标准差之积*/
return aver_jx;
}
/***************************粗大误差分析函数****************************/
float cudawucha ( float *p)
{ int i,m,n;
float k,c,b[100],aver,sum=0.0,sum1=0.0,d;
double tfenbu1[27]={11.46,6.53,5.04,4036,3.96,3.71,3.54,3.41,3.31,
3.23,3.17,3.12,3.08,3.04,3.01,3.00,2.95,2.93,
2.91,2.90,2.88,2.86,2.85,2.84,2.83,2.82,2.81};/*显著度取0.01*/
double tfenbu2[27]={4.97,3.56,3.04,2.78,2.62,2.51,2.43,2.37,2.33,2.29
,2.26,2.24,2.22,2.20,2.18,2.17,2.16,2.15,2.14,2.13
,2.12,2.11,2.10,2.10,2.09,2.09,2.08}; /*显著度取0.05*/
for(m=0;m<N;m++)
{ sum=0.0;
sum1=0;
for (i=0;i<N;i++)
{ if (i==m) continue;
sum+=p[i];
aver=sum/(N-1);
}
for (i=0;i<N;i++)
{ if (i==m) continue;
b[i]=(p[i]-aver)*(p[i]-aver);
sum1+=b[i];
}
/* printf("i=%d ",i);
printf("m=%d ",m);
printf("\n");
printf("aver=%f ",aver);
printf("sum1=%f ",sum1);*/
c=(float)sqrt(sum1/(N-2));
loop: printf(" 请选择显著度水平:'1'---0.01 '2'---0.05\n");
n=getchar();
putchar(n);
switch (n=getchar())
{ case '1' : k=(float)tfenbu1[N-4]; break;
case '2' :k=(float)tfenbu2[N-4]; break;
default :printf(" \n输入错误 ! 请重新输入\n ");goto loop;
}
//k=(float)tfenbu[N-4];
k*=c;
d=(float)fabs(p[m]-aver);
// printf("d=%f ",d);
// printf("k=%f \n",k);
if (d>k)
printf ("\n原数组中的 a[%d] 即数字 %f 存在粗大误差,必须剔除!\n",m,p[m]);
/* for (i=0,j=0;i<N,j<N-1;i++,j++)
{
if (i==m) continue;
printf("i=%d ",i);
p[j]=p[i];
printf("%f ",p[j]);
}*/
// printf ("\n数组不存在粗大误差!\n");
}
//for(j=0;j<N-1;j++)
//printf("%f ",p[j]);
printf ("\n数组不存在粗大误差!\n");
}
/*****************************主函数************************************/
main()
{ int i;
char d;
float a[100];
float c,t,m,n,cdwc;
printf("请输入数组元素个数:\n");
scanf("%d",&N);
printf("请输入数组:\n");
for (i=0;i<N;i++)
scanf("%f",&a[i]); /*输入一数组,传递给子函数计算处理*/
printf("\n");
//clrscr();
loop: printf("\n请选择操作: a--等精度误差分析\n");
printf(" b--粗大误差分析\n");
printf(" c--退出\n");
d=getchar();
putchar(d);
switch(d=getchar())
{
case 'a':c=pingjun(a);
printf("数组的平均值=%f\n",c);
t=biaozhuncha(a);
printf("数组的标准差 =%f\n",t);
m=aver_biaozhuncha(a);
printf("算术平均值的标准差 =%f\n",m);
n=aver_jixian(a);
printf("极限误差 =%f\n",n); goto loop;
case 'b': cdwc=cudawucha (a); goto loop;
case 'c':break;
default: printf("字符输入错误,请重新输入 \n");goto loop;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -