📄 disone.cpp
字号:
minvalue=maxcols[num][1];
num++;
}
num=1;
for(i=0;i<maxnum;i++)
{
if(minvalue==maxcols[num][1])
maxcol=maxcols[num][0];
num++;
}
}
// 删除i所在的列和列值为1的行
for(i=0;i<rows;i++)
if(matrix[i][maxcol]==1)
{
//行标志标为0
countrows[i]=0;
for(j=0;j<cols;j++)
matrix[i][j]=-1;
}
for(i=0;i<rows;i++)
matrix[i][maxcol]=-1;
//列标志标为0
countcols[maxcol]=0;
cuts[0]++;
cuts[cuts[0]]=maxcol;
for(i=0;i<cols;i++)
if(countcols[i]!=0)
{
countcols[i]=0;
for(j=0;j<rows;j++)
if(matrix[j][i]==1)
countcols[i]++;
}
for(i=0;i<rows;i++)
if(countrows[i]!=0)
{
countrows[i]=0;
for(j=0;j<cols;j++)
if(matrix[i][j]==1)
countrows[i]++;
}
for(i=0;i<rows;i++)
if(countrows[i]!=0)
remains+=countrows[i];
}while(remains>0);
delete countrows;
delete countcols;
for(i=0;i<rows;i++)
delete matrix[i];
delete matrix;
for(i=0;i<cols;i++)
delete maxcols[i];
delete maxcols;
get_cut(cuts);
}
void CDisOne::get_cut(int *pos)
{
int i,j; //循环变量
int cut_num; //每个属性的断点数
int * new_pos;
int num;
cut=new float *[iAttNum];
for(i=0;i<iAttNum;i++)
{
cut_num=0;
num=0;
cut[i]=new float[(int)interval[i][0]+1];
for(j=0;j<pos[0];j++)
if(pos[j+1]<interval[i][0])
{
cut_num++;
cut[i][cut_num]=interval[i][pos[j+1]+1];
}
cut[i][0]=(float)cut_num;
new_pos=new int[pos[0]-cut_num+1];
new_pos[0]=pos[0]-cut_num;
for(j=0;j<pos[0];j++)
if(pos[j+1]>=interval[i][0])
new_pos[++num]=pos[j+1]-(int)interval[i][0];
delete []pos;
pos=new int[num+1];
for(j=0;j<num+1;j++)
pos[j]=new_pos[j];
delete []new_pos;
}
delete []pos;
}
void CDisOne::make_new_table()
{
int i,j,k; //循环变量
int m;
selectsort(cut);
new_table=new int *[iRecordNum];
for(i=0;i<iRecordNum;i++)
{
new_table[i]=new int[iAttNum+1];
for(j=0;j<iAttNum;j++)
{
m=0;
for(k=0;k<cut[j][0];k++)
{
if(infotable[i][j]<cut[j][k+1])
{
new_table[i][j]=m;
break;
}
m++;
if(infotable[i][j]>cut[j][(int)cut[j][0]])
new_table[i][j]=m;
}
if(cut[j][0]==0)
new_table[i][j]=0;
}
new_table[i][iAttNum]=(int)infotable[i][iAttNum];
}
}
int CDisOne::search(float val, int condition)
{
int i; //循环变量
int num;
for(i=0;i<att_val[condition][0];i++)
if(val==att_val[condition][i+1])
num=i+1;
return num;
}
int CDisOne::load_table()
{
int i,j;
infotable=new float * [iRecordNum];
for(i=0;i<iRecordNum;i++)
{
try
{
infotable[i]=new float[iAttNum+1];
}
catch(CMemoryException * e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return -2;
}
for(j=0;j<iAttNum+1;j++)
for(j=0;j<iAttNum+1;j++)
infotable[i][j]=(float)atof(pStringTable[i][j]);
}
return 1;
}
void CDisOne::OnDisOneSave(LPCTSTR lpszPathName)
{
int i,j;
fstream fpw;
fpw.open(lpszPathName,ios::out);
if(!fpw)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("some error happen, file can't be opend!",
MB_OK|MB_ICONSTOP);
exit(0);
}
fpw<<"Style:"<<"train"<<endl;
fpw<<"Stage:2"<<endl;
fpw<<"Condition attributes number:"<<iAttNum<<endl;
fpw<<"Records number:"<<iRecordNum<<endl;
for(i = 0;i < iAttNum+1;i++)
fpw<<pAttName[i]<<" ";
fpw<<endl;
for(i = 0;i < iAttNum+1;i++)
fpw<<pDataType[i]<<" ";
fpw<<endl;
for(i=0;i<iRecordNum;i++)
{
for(j=0;j<iAttNum+1;j++)
{
fpw<<new_table[i][j];
fpw<<" ";
}
fpw<<endl;
}
fpw<<"[Cuts]"<<endl;
for(i=0;i<iAttNum;i++)
{
fpw<<i<<endl<<cut[i][0]+1<<endl;
fpw<<"["<<"*"<<",";
for(j=0;j<(int)cut[i][0];j++)
{
fpw<<cut[i][j+1]<<")"<<" "<<j<<endl;
fpw<<"["<<cut[i][j+1]<<",";
}
fpw<<"*"<<")"<<" "<<j;
fpw<<endl;
}
fpw.close();
}
BOOL CDisOne::ReadDataFromFile(char *filename)
{
FILE *fp;
if((fp = fopen(filename,"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);
if(_stricmp(cStyle,"train") == 0 && iStage<=1)
{
fscanf(fp,"Records number:%d\n",&iRecordNum);
if(!SetAttName(fp,iAttNum+1))
return FALSE;
if(!SetDataType(fp,iAttNum+1))
return FALSE;
if(!SetStringTable(fp,iAttNum+1,iRecordNum))
return FALSE;
}
return TRUE;
}
BOOL CDisOne::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 CDisOne::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 CDisOne::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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -