zssconditionmeancomplete.cpp

来自「某个实验事编写粗糙集智能信息处理的程序」· C++ 代码 · 共 256 行

CPP
256
字号
// ZssConditionMeanComplete.cpp: implementation of the CZssConditionMeanComplete class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ZssConditionMeanComplete.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CZssConditionMeanComplete::CZssConditionMeanComplete()
{

}

CZssConditionMeanComplete::~CZssConditionMeanComplete()
{

}

/*-----------------conditionmeancompleter
   open_filename:the filename which to be meancompletered
   save filename:the filename which to save the result*/
BOOL CZssConditionMeanComplete::ConditionMeanCompleter(LPCTSTR open_filename, LPCTSTR save_filename)
{
	fpos_t file_pos;
	int i_Attr;
	long l_record;
	FILE *pfile_read,*pfile_write;
	char str_temp[ZSSLEN];
	if ((file_pos=ReadFileHead(open_filename,0))==0)
		return FALSE;
	
	if((pfile_write=fopen(save_filename,"w"))==NULL
		||(pfile_read=fopen(open_filename,"r"))==NULL)//open file
	{
		return FALSE;
	}	
	int i_strattrnum,i_notstrattrnum;
	GetStrAndNonStrNum(i_strattrnum,i_notstrattrnum);//get attr num

	CArray<CON_STRINGATTR,CON_STRINGATTR> *pstrarray=new 
		CArray<CON_STRINGATTR,CON_STRINGATTR>[i_strattrnum+1];
	if (pstrarray==NULL)
		return FALSE;

	CArray<CON_FLOATATTR,CON_FLOATATTR> *pnotstrarray=new
		CArray<CON_FLOATATTR,CON_FLOATATTR>[i_notstrattrnum+1];
	if (pnotstrarray==NULL)
	{
		delete []pstrarray;
		return FALSE;
	}
	WriteFileHead(pfile_write, 1, 1);
	//写结果
	CStringArray strarray;
	strarray.SetSize(m_iConAttrNum+1);
	fsetpos(pfile_read,&file_pos);
	for(l_record=0;l_record<m_iRecordNum; l_record++)
	{//每一个样列
		for(i_Attr=0;i_Attr<=m_iConAttrNum;i_Attr++)//首先预读一行
		{
			fscanf(pfile_read,"%s",str_temp);	
			strarray[i_Attr]=str_temp;
		}

		i_strattrnum=i_notstrattrnum=-1;
		for (i_Attr=0;i_Attr<m_iConAttrNum;i_Attr++)
		{//对每一个条件属性
			if (stricmp("String",m_AttrType[i_Attr])==0)
				i_strattrnum++;
			else
				i_notstrattrnum++;

			if (IsMissingValue(strarray[i_Attr]))
			{
				int index;
				if(stricmp("String",m_AttrType[i_Attr])==0)//String attr
				{
					if ((index=GetIndexInStrAttr(pstrarray[i_strattrnum],
						strarray[m_iConAttrNum]))==-1)//重新计算遗失属性应该补上的字符串
					{
						CON_STRINGATTR tag1;
						tag1.str_d=strarray[m_iConAttrNum];
						tag1.str_val=ComputeInStr(pfile_read,file_pos,i_Attr,strarray[m_iConAttrNum]);
						pstrarray[i_strattrnum].Add(tag1);
						fprintf(pfile_write,"%s\t",tag1.str_val);//写入补齐的结果
					}
					else
						fprintf(pfile_write,"%s\t",pstrarray[i_strattrnum].GetAt(index).str_val);//写入补齐的结果
				}
				else//non String attr
				{					
					if((index=GetIndexInNotStrAttr(pnotstrarray[i_notstrattrnum],
						strarray[m_iConAttrNum]))==-1)//重新计算遗失属性应该补上的float
					{
						CON_FLOATATTR tag2;
						tag2.str_d=strarray[m_iConAttrNum];
						//计算遗失属性的值
						tag2.f_attr=ComputeInNotStr(pfile_read,file_pos,i_Attr,
							strarray[m_iConAttrNum]);
						pnotstrarray[i_notstrattrnum].Add(tag2);
						if (stricmp("Float",m_AttrType[i_Attr])==0)
							fprintf(pfile_write,"%.5f\t",(float)tag2.f_attr);
						else
							fprintf(pfile_write,"%d\t",(int)tag2.f_attr);
					}
					else//写入补齐的结果
					{
						if (stricmp("Float" ,m_AttrType[i_Attr])==0)	//Float type				
							fprintf(pfile_write,"%.5f\t",(float)pnotstrarray[i_notstrattrnum].GetAt(index).f_attr);						
						else//integer type
							fprintf(pfile_write,"%d\t",(int)pnotstrarray[i_notstrattrnum].GetAt(index).f_attr);
					}

				}
			}
			else
			{
				if(stricmp("Float",m_AttrType[i_Attr])==0)
				  fprintf(pfile_write,"%.5f\t",(float)atoi(strarray[i_Attr]));
                else 
				if(stricmp("Integer",m_AttrType[i_Attr])==0)
				        fprintf(pfile_write,"%d\t",(int)atoi(strarray[i_Attr]));
     			else
					fprintf(pfile_write,"%s\t",strarray[i_Attr]);
			}
		}
		fprintf(pfile_write,"%s\n",strarray[m_iConAttrNum]);//写入决策属性
	}	

	fclose(pfile_read);
	fclose(pfile_write);//close file
	delete []pstrarray;
	delete []pnotstrarray;	//free memory
	return TRUE;
}


int  CZssConditionMeanComplete::GetIndexInNotStrAttr(CArray<CON_FLOATATTR,CON_FLOATATTR>
					 &notstrarray,CString str_d)
{
	int size=notstrarray.GetSize();
	for(int i=0;i<size;i++)
	{
		CON_FLOATATTR &tag=notstrarray[i];
		if (tag.str_d==str_d)
			return i;
	}
	return -1;//not found
}

int  CZssConditionMeanComplete::GetIndexInStrAttr(CArray<CON_STRINGATTR,CON_STRINGATTR>
					 &strarray,CString str_d)
{
	int size=strarray.GetSize();
	for(int i=0;i<size;i++)
	{
		CON_STRINGATTR &tag=strarray[i];
		if (tag.str_d==str_d)
			return i;
	}
	return -1;//not found
}

float CZssConditionMeanComplete::ComputeInNotStr(FILE *pfile,fpos_t file_pos,
												 int i_Attr,CString str_d)
{
	fpos_t file_pos1;
	fgetpos(pfile,&file_pos1);
	fsetpos(pfile,&file_pos);
	char str_temp[ZSSLEN];
	CStringArray strarray;
	strarray.SetSize(m_iConAttrNum+1);
	int j,i_count=0;
	double d_sum=0;
	for (long l_record=0;l_record<m_iRecordNum;l_record++)
	{
		for(j=0;j<=m_iConAttrNum;j++)//预读
		{
			fscanf(pfile,"%s",str_temp);
			strarray[j]=str_temp;
		}
		if(strarray[m_iConAttrNum]==str_d && !IsMissingValue(strarray[i_Attr]) )
		{
			d_sum+=atof(strarray[i_Attr]);
			i_count++;
		}
		fscanf(pfile,"\n");
	}
	fsetpos(pfile,&file_pos1);//恢复文件指针的位置
	return (float)d_sum/i_count;

}

CString CZssConditionMeanComplete::ComputeInStr(FILE *pfile,fpos_t file_pos,
												int i_Attr,CString str_d)
{
	fpos_t file_pos1;
	fgetpos(pfile,&file_pos1);
	fsetpos(pfile,&file_pos);
	char str_temp[ZSSLEN];
	CStringArray strarray;
	strarray.SetSize(m_iConAttrNum+1);
	struct tagtemp tag1;
	tag1.i_count=1;
	CArray<tagtemp,tagtemp> array;
	strarray.SetSize(m_iConAttrNum+1);

	int i,j,size;
	for (long l_record=0;l_record<m_iRecordNum;l_record++)
	{
		for(j=0;j<=m_iConAttrNum;j++)//预读
		{
			fscanf(pfile,"%s",str_temp);
			strarray[j]=str_temp;
		}
		if(strarray[m_iConAttrNum]==str_d)
		{
			size=array.GetSize();
			for(i=0;i<size;i++)
			{
				if (array[i].str_val==strarray[i_Attr])
					array[i].i_count++;
			}
			if (i==size)
			{
				tag1.str_val=strarray[i_Attr];
				array.Add(tag1);
			}
		}
	}
	size=array.GetSize();
	int i_count=0,i_index=0;
	for(i=0;i<size;i++)
	{
		if (i_count<array[i].i_count)
		{
			i_count=array[i].i_count;
			i_index=i;
		}
	}
	fsetpos(pfile,&file_pos1);//恢复文件指针的位置
	return array[i_index].str_val;
}



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?