📄 baocomplete.cpp
字号:
// BaoComplete.cpp: implementation of the CBaoComplete class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RSet.h"
#include "stdlib.h"
#include "BaoComplete.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBaoComplete::CBaoComplete()
{
iStage = 1;
bIncompletion = FALSE;
pAttName=NULL;
pDataType=NULL;
pStringTable=NULL;
ii=NULL;
itemp=NULL;
t=NULL;
}
CBaoComplete::~CBaoComplete()
{
for (int i=0;i<pl;i++)
{
delete[] ii[i];
delete[] itemp[i];
}
delete[] ii;
ii=NULL;
delete[] itemp;
itemp=NULL;
delete[] t;
t=NULL;
if(pAttName)
{
for(i=0;i<iAttNum+1;i++)
delete []pAttName[i];
delete[] pAttName;
}
pAttName=NULL;
if(pDataType)
{
for(i=0;i<iAttNum+1;i++)
delete []pDataType[i];
delete[] pDataType;
}
pDataType=NULL;
if(pStringTable)
{
for(i=0;i<iRecordNum;i++)
{
for(int j=0;j<iAttNum+1;j++)
delete[] pStringTable[i][j];
delete[] pStringTable[i];
}
delete[] pStringTable;
}
pStringTable=NULL;
}
BOOL CBaoComplete::ReadDataFromFile(LPCTSTR lpszPathName)
{
FILE* fp;
if((fp = fopen(lpszPathName,"r")) == NULL)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Couldn't open the file",MB_OK|MB_ICONSTOP);
return FALSE;
}//end if
fscanf(fp,"Style:%s\n",cStyle);
fscanf(fp,"Stage:%d\n",&iStage);
fscanf(fp,"Condition attributes number:%d\n",&iAttNum);
bl = iAttNum + 1; //总的属性数
fscanf(fp,"Records number:%d\n",&iRecordNum);
pl = iRecordNum; //记录数
if(_stricmp(cStyle,"train") == 0 && iStage == 0)
{
if(!SetAttName(fp,iAttNum+1))
return FALSE;
if(!SetDataType(fp,iAttNum+1))
return FALSE;
if(!SetStringTable(fp,iAttNum+1,iRecordNum))
return FALSE;
if(GetIncompletion())
bIncompletion = TRUE;
fclose(fp);
return TRUE;
}
else //not correct input file
{
fclose(fp);
return FALSE;
}
}
int CBaoComplete::GetIncompletion()
{
for(int i = 0;i < iRecordNum;i++)
{
for(int j = 0;j < iAttNum+1;j++)
{
if((strcmp(pStringTable[i][j],"?") == 0)||(strcmp(pStringTable[i][j],"-") == 0)||(strcmp(pStringTable[i][j],"*") == 0))
return 1;
}
}
return 0;
}
BOOL CBaoComplete::SetAttName(FILE* fp, int count)
{
int i;
if(pAttName == NULL)
{
try
{
pAttName = new char*[count];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for(i=0;i < count;i++)
{
try
{
pAttName[i]=new char[MAX];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
}//end for
}//end if
for(i=0;i < count;i++)
fscanf(fp,"%s",pAttName[i]);
fscanf(fp,"\n");
return TRUE;
}
BOOL CBaoComplete::SetDataType(FILE *fp, int count)
{
int i;
if(pDataType == NULL)
{
try
{
pDataType = new char*[count];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for(i = 0;i < count;i++)
{
try
{
pDataType[i]=new char[MAX];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
}//end for
}//end if
for(i = 0;i < count;i++)
fscanf(fp,"%s",pDataType[i]);
return TRUE;
}
BOOL CBaoComplete::SetStringTable(FILE* fp, int column, int row)
{
int i,j;
if(pStringTable == NULL)
{
try
{
pStringTable = new char**[row];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for(i = 0;i < row;i++)
{
try
{
pStringTable[i] = new char*[column];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for(j = 0;j < column;j++)
{
try
{
pStringTable[i][j] = new char[MAX];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
strcpy(pStringTable[i][j]," ");//初始化为空格
}//end for
}//end for
}//end if
for(i = 0;i < row;i++)
for(j = 0;j < column;j++)
fscanf(fp,"%s",pStringTable[i][j]);
return TRUE;
}
BOOL CBaoComplete::Remedy()
{
int **m,i,j,q,i1,j1,s1,k,s,a1;
int **ns,sg,*co,ss,ch;
float s2;
try
{
m=new int*[pl]; //建立扩充差异矩阵M
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for (i=0;i<pl;i++)
try
{
m[i]=new int[pl];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
do//每次对不同的可辨识矩阵进行
{
for (i=0;i<pl;i++)//初始化临时矩阵
{
for(k=0;k<bl;k++)//bl为属性数目
{
itemp[i][k].mark=ii[i][k].mark;
itemp[i][k].intnub=ii[i][k].intnub;
itemp[i][k].fltnub=ii[i][k].fltnub;
strcpy(itemp[i][k].chnub,ii[i][k].chnub);
}//end for
}//end for
sg=0;
for (i=0;i<pl;i++) //给M填值
for (j=0;j<pl;j++)
m[i][j]=0;
for(i=0;i<pl;i++)
for(j=0;j<pl;j++)//i,j为不同两行
{ //每次都扫描整个信息表
q=0;
while(q<bl)
{
if(itemp[i][q].mark==itemp[j][q].mark)
{
if((itemp[i][q].mark==1)&&(itemp[i][q].intnub!=itemp[j][q].intnub))
{//为整型
q=bl+1;m[i][j]=1;//q》b1 从而退出while循环
}//end if
if((itemp[i][q].mark==2)&&(itemp[i][q].fltnub!=itemp[j][q].fltnub))
{//浮点型
q=bl+1;m[i][j]=1;
}//end if
if((itemp[i][q].mark==3)&&(strcmp(itemp[i][q].chnub,itemp[j][q].chnub)!=0))
{//字符型
q=bl+1;m[i][j]=1;
}//end if
}//end if
q++;
}//end while
}//end for //M处理完毕
try
{
ns=new int *[pl]; //建立无差别对象集NS
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for (i=0;i<pl;i++)
try
{
ns[i]=new int[pl];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for(i=0;i<pl;i++) //给NS赋初值
for(j=0;j<pl;j++)
ns[i][j]=-1;
for(i=0;i<pl;i++) //计算无差别对象集NS
{
j1=0;
for(j=0;j<pl;j++)
{
if((m[i][j]==0)&&(i!=j))
{
ns[i][j1]=j;j1++;
}//end if
}//end for
}//end for //NS处理完毕
for(i=0;i<pl;i++) //循环,对每个样例
for(k=0;k<bl;k++) //对每个属性
if(itemp[i][k].mark>3)//遗失值
{
j=0;
while ((j<bl)&&(ns[i][j]!=-1))
j++;
j--;//找到该样例的最后一个无差别对象
if (j>-1)
if (j==0)//只有一个无差别对象
{
s=ns[i][j];
if(itemp[s][k].mark<=3)
{//将s对象的属性值赋给i对象对应遗失值
ii[i][k].mark=itemp[s][k].mark;
ii[i][k].intnub=itemp[s][k].intnub;
ii[i][k].fltnub=itemp[s][k].fltnub;
strcpy(ii[i][k].chnub,itemp[s][k].chnub);
sg=1;//标志位
}//end if
}//end if
else//不止一个无差别对象
{
ss=0;//标志位
for(i1=0;i1<=j;i1++)
for(j1=0;j1<=j;j1++)
{
if (i1!=j1)
{
s1=ns[i][i1];
a1=ns[i][j1];
if((itemp[s1][k].mark<=3)&&(itemp[a1][k].mark<=3))
{
if ((itemp[s1][k].mark==1)&&(itemp[s1][k].intnub!=itemp[a1][k].intnub))//无差别对象对应遗失属性的属性值不同
ss=1;
if ((itemp[s1][k].mark==2)&&(itemp[s1][k].fltnub!=itemp[a1][k].fltnub))
ss=1;
if ((itemp[s1][k].mark==3)&&(strcmp(itemp[s1][k].chnub,itemp[a1][k].chnub)!=0))
ss=1;
}//end if
}//end if
}//end for
if (ss==0)//无差别对象对应属性值相同
for (i1=0;i1<=j;i1++)
{
s1=ns[i][i1];
if (itemp[s1][k].mark<=3)
{
ii[i][k].mark=itemp[s1][k].mark;
ii[i][k].intnub=itemp[s1][k].intnub;
ii[i][k].fltnub=itemp[s1][k].fltnub;
strcpy(ii[i][k].chnub,itemp[s1][k].chnub);
sg=1;//修改标志位
}//end if
}//end for
}//end else
}//end if
} while (sg==1); //I处理完毕,sg为0表示整个操作没有补齐任何值,于是退出
co=new int[pl];
for(i=0;i<pl;i++) //剩余遗失值处理
for(k=0;k<bl;k++)
if(ii[i][k].mark>3)
{
ch=0;
if(ii[i][k].mark==4)//遗失值为整型
{
s1=0;
for(i1=0;i1<pl;i1++)
if (ii[i1][k].mark==1)//对数值才累加和
{
s1=s1+ii[i1][k].intnub;ch++;
}//end if
s1=s1/ch;//求平均值
ii[i][k].mark=1;
ii[i][k].intnub=s1;
}//end if
if(ii[i][k].mark==5)//遗失值为浮点型
{
s2=0;
for(i1=0;i1<pl;i1++)
if (ii[i1][k].mark==2)
{
s2=s2+ii[i1][k].fltnub;ch++;
}//end if
s2=s2/ch;
ii[i][k].mark=2;
ii[i][k].fltnub=s2;
}//end if
if(ii[i][k].mark==6)//遗失值为字符型
{
for(i1=0;i1<pl;i1++)
if(ii[i1][k].mark==3)
co[i1]=1; //初始化非遗失属性
else co[i1]=0;
s=0;
for(i1=0;i1<pl;i1++)
for(j1=0;j1<pl;j1++)
if((i1!=j1)&&(strcmp(ii[i1][k].chnub,ii[j1][k].chnub)==0)&&(ii[i1][k].mark==3)&&(ii[j1][k].mark==3))
co[i1]++;
for(i1=0;i1<pl;i1++)//求出现次数最多的字符串,s=0
if(co[i1]>s)//当同时出现几个字符串出现次数一样时,取决策表中最先出现的字符串
{
s=co[i1];
ii[i][k].mark=3;
strcpy(ii[i][k].chnub,ii[i1][k].chnub);
}//end if
}//end if
}//end if
for (i=0;i<pl;i++)
{
delete[] m[i];
delete[] ns[i];
}
delete[] co;
delete[] m;
delete[] ns;
return true;
}
BOOL CBaoComplete::InitTable()
{
int i,j;
try
{
ii=new struct itab*[pl];//存储决策表值
itemp = new struct itab*[pl];//临时表
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for (i=0;i<pl;i++)
{
try
{
ii[i]=new struct itab[bl];
itemp[i] = new struct itab[bl];
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
}//end for
try
{
t=new int[bl];//t表示每一个属性的数据类型
}
catch(CMemoryException* e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return FALSE;
}
for(i=0;i<bl;i++)//b为iAttNum+1
{
if(stricmp(pDataType[i],"Integer") == 0)
{
t[i] = 1;
}
if(stricmp(pDataType[i],"Float") == 0)
{
t[i] = 2;
}
if(stricmp(pDataType[i],"String") == 0)
{
t[i] = 3;
}
for (j=0;j<pl;j++)
ii[j][i].mark=t[i];
}//end for
for (i=0;i<pl;i++)
{
for (j=0;j<bl;j++)
{
if (strcmp(pStringTable[i][j],"?") == 0||strcmp(pStringTable[i][j],"-") == 0||strcmp(pStringTable[i][j],"*") == 0)
ii[i][j].mark=ii[i][j].mark+3;
else
{
if(ii[i][j].mark==1)
ii[i][j].intnub=atoi(pStringTable[i][j]);//将字符型转换为整型atoi
if(ii[i][j].mark==2)
ii[i][j].fltnub=(float)atof(pStringTable[i][j]);
if(ii[i][j].mark==3)
strcpy(ii[i][j].chnub,pStringTable[i][j]);
}
}
}
return TRUE;
}
BOOL CBaoComplete::SaveFile(LPCTSTR lpszPathName)
{
FILE* fp;
CString temp;
if((fp = fopen(lpszPathName,"w")) == NULL)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Couldn't save the file",MB_OK|MB_ICONSTOP);
return FALSE;
}//end if
fprintf(fp,"Style: train\n");
fprintf(fp,"Stage: 1\n");
fprintf(fp,"Condition attributes number: %d\n",bl-1);
fprintf(fp,"Records number: %d\n",pl);
for(int i = 0;i < bl;i++)
fprintf(fp,"%s ",pAttName[i]);
fprintf(fp,"\n");
for(i = 0;i < bl;i++)
fprintf(fp,"%s ",pDataType[i]);
fprintf(fp,"\n");
for(i = 0;i < pl;i++)
{
for(int j = 0;j < bl;j++)
{
if (ii[i][j].mark == 1)
fprintf(fp,"%d ",ii[i][j].intnub);
if (ii[i][j].mark == 2)
{
fprintf(fp,"%f ",ii[i][j].fltnub);
}
if (ii[i][j].mark == 3)
fprintf(fp,"%s ",ii[i][j].chnub);
if (ii[i][j].mark > 3)
fprintf(fp,"? ");
}
fprintf(fp,"\n");
}
fclose(fp);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -