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