⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datachk.cpp

📁 这是一个简单不良数据简册算法的源代码
💻 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 + -