简单数据处理的计算机语言实现.docx
《简单数据处理的计算机语言实现.docx》由会员分享,可在线阅读,更多相关《简单数据处理的计算机语言实现.docx(13页珍藏版)》请在冰豆网上搜索。
![简单数据处理的计算机语言实现.docx](https://file1.bdocx.com/fileroot1/2022-10/26/c40af1ec-9d2f-4dd9-9c5b-f60e3afbee69/c40af1ec-9d2f-4dd9-9c5b-f60e3afbee691.gif)
简单数据处理的计算机语言实现
简单数据处理的计算机语言实现
测量数据的处理和误差分析,是一个牵涉到众多知识的繁杂的过程,本次作业主要以蒋换文、孙续所著的<<电子测量>>一书的第二章(测量误差理论与数据处理)为理论基础,将简单的数据处理的过程利用计算机语言来实现。
一、程序设计思路
本程序实现的主要功能包括数据处理和误差分析两部分。
数据处理主要就是计算数据的均值,残差,标准偏差,并利用肖维纳准则剔除数据中可能存在的坏值,为误差分析做好准备。
误差分析主要就是进行了变值系差(包括周期性系差和累进性系差)的分析。
程序设计中所用的公式均来自课本,程序流程图见[附录1]。
二、程序功能测试
1、编程与测试环境:
VC++6.0
2、测试过程:
2-1、利用一组不存在坏值也没有系差的数据测试该程序的如下结果:
2-2、利用一组存在坏值的数据测试该程序的如下结果:
2-3、利用一组存在系差的数据测试该程序的如下结果:
注:
因为程序中所用的剔除坏值的准则为肖维纳准则,故程序在设计时要求输入的待处理数据个数必须大于5。
从以上的测试过程及结果可以看出:
本程序实现了简单的数据处理功能,达到了设计要求。
三、编程与调试过程总结
本次作业从流程图设计到程序调试完毕共用了整一下午时间,基本实现了设计的要求。
在编程和调试的过程中有不少收获,现简要总结如下:
首先最直接的一点就是:
通过这次作业,我对整个第二章的知识的结构和各知识点相互间的关系理解得更透彻了,同时我的计算机语言的实践能力也得到了提高。
在调试过程中发现了一个我平时没注意到的问题:
一开始,误差分析子函数是这样写的:
//误差分析子函数
voiderrorcheck(intN,double*pv,structresult*resultx)
{
//intljerflag=0;
intcicleerflag=circleerror(N,pv,resultx->xb);
if(cicleerflag==1)
print2(resultx->xj,resultx->xb);
elseif(cicleerflag==0)
intljerflag=ljerror(N,pv,resultx->vm);
//ljerflag=ljerror(N,pv,resultx->vm);
else
cout<<"数据处理过程出错!
!
";
if(ljerflag==1)
print3(resultx->xj,resultx->xb);
else
{
resultx->xjb=resultx->xb/sqrt(N);
print4(resultx->xj,resultx->xb,resultx->xjb);
}
}
编译时会出现"errorC2065:
'ljerflag':
undeclaredidentifier"的错误。
比较了一下前后的程序,发现其实变量cicleerflag,ljerflag的语法位置是一样的,可是为什么只报ljerflag有错呢?
分析了一下,猜想应该是编译规则的原因照成的:
系统在编译时对于分支程序只编译第一个分支,故在第二个分支中的变量定义没有检测到。
所以猜想将变量定义语句"intljerflag=0;"提前,即将黑体的那句曲调,用注释掉的那两句代替,程序运行正常。
由于时间较紧,本程序还是存在很多需要完善的地方,比如代码可以进行优化,提高程序的效率,利用VC为其设计一个较好的操作界面等。
在以后的升级版本中,我将继续进行这些工作。
[附录1]
[附录2]:
/*********************************************************/
/*功能:
实验数据的简单处理
/*作者:
舒光华北京交通大学电子学院电子0402班
/*日期:
2006年10月14日
/*版本号:
v1.0
/*********************************************************/
#include
usingnamespacestd;
#include
structresult{
doublexj;
doublexb;
doublexjb;
doublevm;
};
doublech[50]={
0,0,0,0,0,1.65,1.73,1.79,1.86,1.92,
1.96,2.00,2.04,2.07,2.10,2.13,2.16,2.18,2.20,2.22,
2.24,2.26,2.28,2.30,2.32,2.33,2.34,2.35,2.37,2.38,
2.39,2.40,2.41,2.42,2.43,2.45,2.46,2.47,2.48,2.49,
2.50,2.51,2.52,25.3,2.54,2.54,2.55,2.56,2.56,2.57,
};
intprepare(intN,double*px,double*pv,result*resultx);//返回值用于控制
//检测坏值的循环
voidabnormal(double*px,intk,int*pn);//剔除坏值子函数
voiderrorcheck(intN,double*pv,structresult*resultx);//剔除坏值子函数
intcircleerror(intN,double*pv,doublexb);//误差分析子函数
intljerror(intN,double*pv,doublevm);//周期误差分析子函数
voidprint1(intk,double*px);
voidprint2(doublexj,doublexb);//输出存在周期误差的数据处理结果
voidprint3(doublexj,doublexb);//输出存在累进性误差的数据处理结果
voidprint4(doublexj,doublexb,doublexjb);//输出不存在误差的数据处理
//结果
/*******************主函数*********************/
voidmain()
{
//变量定以及初始化
intN;
int*pn=&N;
intabflag=1;
//interflag=0;
//intpflag=1;
structresultresult1;
structresult*resultx=&result1;
resultx->xj=0;
resultx->xb=0;
resultx->xjb=0;
resultx->vm=0;
cout<<"请输入您要处理的数据的个数:
";
cin>>N;
if(N<5)
{cout<<"您要输入的数据个数太少,处理的结果可能很不准确,";
cout<<"数据个数至少在5个以上才能获得比较满意的处理结果,";
cout<<"请重新输入您要处理的数据个数:
";
cin>>N;
}
//动态分配内存
double*x;
x=newdouble[N];
double*v;
v=newdouble[N];
//数据输入
cout<<"开始输入数据:
"<for(inti=0;i{
cout<<"x["<
cin>>x[i];
}
//做好剔除坏值的准备工作
while(abflag)
{
abflag=prepare(N,x,v,resultx);
if(abflag>0)
{
abnormal(x,abflag,pn);
}
}
cout<<"坏值剔除完毕!
剩余数据"<cout<<"下面进行误差分析:
"<errorcheck(N,v,resultx);
//释放内存空间
delete[]x;
delete[]v;
}
/*****************子函数****************************/
//数据初步处理子函数
intprepare(intN,double*px,double*pv,result*resultx)
{
doubletemp1=0;
doubletemp2=0;
doubletemp3=0;
//计算均值
for(inti=0;i{
temp1+=px[i];
}
temp1=temp1/N;
resultx->xj=temp1;
//获得最大残差
for(intj=0;j{
pv[j]=px[j]-temp1;
}
temp2=abs(pv[0]);
for(intm=1;m{
if(abs(pv[m])>temp2)
temp2=abs(pv[m]);
}
resultx->vm=temp2;
//计算标准差
for(intn=0;n{
temp3+=px[n]*px[n];
}
temp3=sqrt((temp3-N*temp1*temp1)/(N-1));
resultx->xb=temp3;
doubletemp4=ch[N-1];
for(intl=0;l{
if(abs(px[l]-temp1)>temp4*temp3)
return(l+1);
}
return0;
}
//剔除坏值子函数
voidabnormal(double*px,intk,int*pn)
{
cout<<"利用肖维纳剔除坏值:
";
print1(k,px);
for(inti=k-1;i<*pn-1;i++)
{
px[i]=px[i+1];
}
*pn=*pn-1;
}
//输出剔除坏值的信息
voidprint1(intk,double*px)
{
cout<<"第"<cout<<"将予以剔除!
!
"<}
//误差分析子函数
voiderrorcheck(intN,double*pv,structresult*resultx)
{
intljerflag=0;
intcicleerflag=circleerror(N,pv,resultx->xb);
if(cicleerflag==1)
print2(resultx->xj,resultx->xb);
elseif(cicleerflag==0)
ljerflag=ljerror(N,pv,resultx->vm);
else
cout<<"数据处理过程出错!
!
if(ljerflag==1)
print3(resultx->xj,resultx->xb);
else
{
resultx-