📄 datachk.cpp
字号:
#include "stdafx.h"
#include "datachk.h"
#include "math.h"
CDataChk::CDataChk()
{
m_fError=float(0.1);
m_nNumber=m_nNumberofday=nBadData=0;
}
CDataChk::~CDataChk()
{
}
void CDataChk::Setlimit(float value)
{
if(value<0&&value>1) return;
m_fError=value;
}
BOOL CDataChk::SetInitInfo(int number,int numberofday,float* pData)
{
if(number==0||number<3) return FALSE;
ASSERT(pData);
m_pData=pData;
m_nNumber=number;
m_nNumberofday=numberofday;
nBadData=OnCheck();
return nBadData;
}
BOOL CDataChk::OnCheck()
{
INT number;
//粗检
number=OnGrossCheck();
//细检
number=OnReCheck();
for(INT i=0;i<m_nNumber;++i)
{
if(m_pData[i]<0)
{
m_pData[i]=(float)fabs(m_pData[i]);
OnRecord(i,number,-m_pData[i],m_pData[i]);
}
}
return number;
}
BOOL CDataChk::OnGrossCheck()
{
INT number=0;
for(INT i=0;i<m_nNumber;++i)
{
if(m_pData[i]<0)
{
CBadDataInfo* pInfo=new CBadDataInfo;
m_pData[i]=(float)fabs(m_pData[i]);
pInfo->nPos=i;
pInfo->m_fOldValue=-m_pData[i];
pInfo->m_fNewValue=m_pData[i];
m_badDatarecord[number++]=pInfo;
}
else if(m_pData[i]==0)
{
if(i==0) m_pData[i]=(float)fabs(m_pData[i+1]);
else m_pData[i]=m_pData[i-1];
CBadDataInfo* pInfo=new CBadDataInfo;
pInfo->nPos=i;
pInfo->m_fOldValue=0;
pInfo->m_fNewValue=m_pData[i];
m_badDatarecord[number++]=pInfo;
}
}
return number;
}
BOOL CDataChk::OnReCheck()
{
INT number=m_badDatarecord.GetCount();
float oldvalue,newvalue;
for(INT i=0;i<m_nNumber;++i)
{
if(i==0)
{
if(m_pData[i]==0)
{
oldvalue=0;
newvalue=m_pData[i+1];
m_pData[i]=m_pData[i+1];
OnRecord(i,number,oldvalue,newvalue);
}
if(fabs(fabs((m_pData[i]-m_pData[i+1])/m_pData[i])-fabs((m_pData[i]-m_pData[i+1])/m_pData[i+1]))>m_fError&&
fabs(fabs((m_pData[i+1]-m_pData[i+2])/m_pData[i+2])-fabs((m_pData[i+1]-m_pData[i+2])/m_pData[i+1]))<m_fError)
{
oldvalue=m_pData[i];
if(m_pData[i]>m_pData[i+1])
m_pData[i]=(1+m_fError)*m_pData[i+1];
else
m_pData[i]=(1-m_fError)*m_pData[i+1];
newvalue=m_pData[i];
OnRecord(i,number,oldvalue,newvalue);
}
}
else
{
if(m_pData[i]==0)
{
oldvalue=0;
newvalue=m_pData[i-1];
m_pData[i]=m_pData[i-1];
if(i<m_nNumber-1)
m_pData[i]=(1.2*m_pData[i-1]+0.8*m_pData[i+1])/2;
OnRecord(i,number,oldvalue,newvalue);
}
else if(fabs(fabs((m_pData[i]-m_pData[i-1])/m_pData[i])-fabs((m_pData[i]-m_pData[i-1])/m_pData[i-1]))>m_fError)
{
oldvalue=m_pData[i];
if(m_pData[i]>m_pData[i-1])
m_pData[i]=(1+m_fError)*m_pData[i-1];
else
m_pData[i]=(1-m_fError)*m_pData[i-1];
if(i<m_nNumber-1)
m_pData[i]=((1+m_fError)*m_pData[i-1]+(1-m_fError)*m_pData[i+1])/2;
newvalue=m_pData[i];
OnRecord(i,number,oldvalue,newvalue);
}
}
}
return number;
}
void CDataChk::OnRecord(INT nIndex,INT& number,float oldvalue,float newvalue)
{
CBadDataInfo* pInfo;
for(POSITION pos=m_badDatarecord.GetStartPosition();pos!=NULL;)
{
UINT key=0;
m_badDatarecord.GetNextAssoc(pos,key,pInfo);
if(pInfo->nPos==nIndex)
{
pInfo->m_fOldValue=oldvalue;
pInfo->m_fNewValue=newvalue;
return;
}
}
pInfo=new CBadDataInfo;
pInfo->nPos=nIndex;
pInfo->m_fOldValue=oldvalue;
pInfo->m_fNewValue=newvalue;
m_badDatarecord[number++]=pInfo;
}
BOOL CDataChk::GetBadDataInfo(INT nIndex, INT& nPos,float& foldValue, float& fnewvalue)
{
if(nIndex<0||nIndex>=nBadData) return FALSE;
nPos=m_badDatarecord[nIndex]->nPos;
foldValue=m_badDatarecord[nIndex]->m_fOldValue;
fnewvalue=m_badDatarecord[nIndex]->m_fNewValue;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -