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 + -
显示快捷键?