zssmeancomplete.cpp

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

CPP
173
字号
// ZssMeanComplete.cpp: implementation of the CZssMeanComplete class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ZssMeanComplete.h"

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

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

CZssMeanComplete::CZssMeanComplete()
{
}

CZssMeanComplete::~CZssMeanComplete()
{
}

BOOL CZssMeanComplete::MeanComplete(CString str_s, CString str_d)
{
	fpos_t file_pos;
	FILE *file_s,*file_d;
	if ((file_pos=ReadFileHead((LPCTSTR)(str_s),0))==0)//读取文件头
		return FALSE;//失败返回
	if ((file_s=fopen(str_s,"r"))==NULL)//打开文件
		return FALSE;
	if ((file_d=fopen((LPCTSTR)(str_d),"w"))==NULL)//打开文件
	{
		return FALSE;
	}	
	//得到字符串属性和非字符串属性的个数
	int i_str_Attr_Num,i_Nonstr_Attr_Num;
	GetStrAndNonStrNum(i_str_Attr_Num, i_Nonstr_Attr_Num);
	CArray<float,float> array_nonstr;
	CStringArray array_str;
	array_str.SetSize(m_iConAttrNum);
	array_nonstr.SetSize(m_iConAttrNum);
	for (int i=0;i<m_iConAttrNum;i++)
	{
		if (stricmp("String",m_AttrType[i])==0)//处理字符串属性
		{
			array_str[i]=GetMostString(file_s,file_pos,i);
		}
		else//非字符串属性
		{
			array_nonstr[i]=GetMeanValue(file_s,file_pos,i);
		}
	}
	WriteFileHead(file_d,1,1);//写文件头
	WriteCompleteResult(file_s,file_d,file_pos,array_nonstr,array_str);//写离散化的结果
	fclose(file_s);
	fclose(file_d);
	return TRUE;
}

//计算一个字符串属性中出现次数最多的字符串
CString CZssMeanComplete::GetMostString(FILE *file_s,fpos_t file_pos,int i_attr)
{
	STRINGATTR tag;
	CArray<STRINGATTR,STRINGATTR> array_tag;
	fsetpos(file_s,&file_pos);
	tag.i_count=1;
	MoveFilePoint(file_s,i_attr);
	for (long l_record=0;l_record<m_iRecordNum;l_record++)
	{		
		fscanf(file_s,"%s",tag.str_attr);
		MoveFilePoint(file_s,m_iConAttrNum);
		if (IsMissingValue(tag.str_attr))
			continue;
		AddToTagArray(tag,array_tag);		
	} 
	return GetStringInTagArray(array_tag);

}


//把一个字符串属性加入到数组中去,并统计出现的次数
void CZssMeanComplete::AddToTagArray(STRINGATTR &tag,CArray<STRINGATTR,STRINGATTR> &array_tag)
{
	int i_size=array_tag.GetSize();
	for(int i=0;i<i_size;i++)
	{
		if(array_tag[i].str_attr==tag.str_attr)
		{
			array_tag[i].i_count++;
			return;
		}
	}
	array_tag.Add(tag);
}

//根据数组array_tag,计算tag.i_count最大的字符串
CString CZssMeanComplete::GetStringInTagArray(CArray<STRINGATTR,STRINGATTR> &array_tag)
{
	int size=array_tag.GetSize(),i_index,i_times=0;
	for (int i=0;i<size;i++)
	{
		if(array_tag[i].i_count>i_times)
		{
			i_times=array_tag[i].i_count;
			i_index=i;
		}
	}
	return array_tag.GetAt(i_index).str_attr;
}

//计算一个的非字符串属性的平均字
float CZssMeanComplete::GetMeanValue(FILE *file_s,fpos_t file_pos, int i_attr)
{
	fsetpos(file_s,&file_pos);
	CString str_temp;
	double d_total=0;
	long l_num=0;
	MoveFilePoint(file_s,i_attr);
	for (long l_record=0;l_record<m_iRecordNum;l_record++)
	{		
		fscanf(file_s,"%s",str_temp);
		MoveFilePoint(file_s,m_iConAttrNum);
		if (IsMissingValue(str_temp))
			continue;
		l_num++;
		d_total+=atof(str_temp);
	//	cout<<l_record<<"\n";
	}
	return (float)(d_total/(float)l_num);
}

//写补齐的结果
void CZssMeanComplete::WriteCompleteResult(FILE *file_s, FILE * file_d,fpos_t file_pos,CArray<float,float> &nonstr_array, CStringArray &str_array)
{
	fsetpos(file_s, &file_pos);
	CString str_temp;
	for (long l_record=0; l_record<m_iRecordNum; l_record++)
	{
		for (int i_attr=0;i_attr<m_iConAttrNum; i_attr++)
		{
			fscanf(file_s,"%s",str_temp);
			if (!IsMissingValue(str_temp))
			{
				if(stricmp("Float",m_AttrType[i_attr])==0)
				  fprintf(file_d,"%f\t",(float)atoi(str_temp));
                else 
				if(stricmp("Integer",m_AttrType[i_attr])==0)
				  fprintf(file_d,"%d\t",(int)atoi(str_temp));
     			else
					fprintf(file_d,"%s\t",str_temp);
				continue;
			}
			if (0==stricmp(m_AttrType[i_attr],"Float"))
			{
				fprintf(file_d,"%.8f\t",nonstr_array[i_attr]);
			}
			else if (0==stricmp(m_AttrType[i_attr],"Integer"))
			{
				fprintf(file_d,"%d\t",(int)nonstr_array[i_attr]);
			}
			else//for string attribute
			{
				fprintf(file_d,"%s\t",str_array[i_attr]);
			}
		}
		fscanf(file_s,"%s",str_temp);
		fprintf(file_d,"%s\n",str_temp);//写决策属性
	}
}

⌨️ 快捷键说明

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