📄 mydis.cpp
字号:
// MydisDoc1.cpp: implementation of the CMydisDoc class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "../RSet.h"
#include "fstream.h"
#include "Mydis.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMydis::CMydis(){
// InfoTable=NULL;
Cut=NULL;
NewTable=NULL;
MidCut=NULL;
MidInfoTable=NULL;
AttImportant=NULL;
pAttName=NULL;
pDataType=NULL;
pStringTable=NULL;
pStringTableResult=NULL;
pStrResult=NULL;
strCuts=NULL;
pNonStringTable=NULL;
}
CMydis::~CMydis(){
int i;
/* if(InfoTable!=NULL)
{
for(i=0;i<iRecordNum;i++)
delete[] InfoTable[i];
delete[] InfoTable;
}*/
if(Cut!=NULL){
for(i=0;i<iNonStrAttNum;i++)
delete[] Cut[i];
delete[] Cut;
}
if(NewTable!=NULL){
for(i=0;i<iRecordNum;i++)
delete[] NewTable[i];
delete[] NewTable;
}
if(MidCut!=NULL){
for(i=0;i<iNonStrAttNum;i++)
delete[] MidCut[i];
delete[] MidCut;
}
if(AttImportant!=NULL){
for(i=0;i<iNonStrAttNum;i++)
delete[] AttImportant[i];
delete[] AttImportant;
}
if(MidInfoTable!=NULL){
for(i=0;i<iRecordNum;i++)
delete[] MidInfoTable[i];
delete[] MidInfoTable;
}
if(pAttName){
for(i=0;i<iAttNum+1;i++)
delete[] pAttName[i];
delete[] pAttName;
}
if(pDataType){
for(i=0;i<iAttNum+1;i++)
delete[] pDataType[i];
delete[] pDataType;
}
/* if(pStringTable){
for(i=0;i<iRecordNum;i++){
for(int j=0;j<iStrAttNum;j++)
delete[] pStringTable[i][j];
delete[] pStringTable[i];
}
delete[] pStringTable;
}
*/
if(pStringTableResult){
for(i=0;i<iRecordNum;i++)
delete[] pStringTableResult[i];
delete[] pStringTable;
}
/* if(pStrResult){
for(i=0;i<iRecordNum;i++){
for(int j=0;j<iStrAttNum;j++)
delete[] pStrResult[i][j];
delete[] pStrResult[i];
}
delete[] pStrResult;
}
*/ if(pNonStringTable){
for(i=0;i<iRecordNum;i++)
delete[] pNonStringTable[i];
delete[] pNonStringTable;
}
if(strCuts)
delete[] strCuts;
}
void CMydis::GetMidCut()
{
int i,j,k;
int num=0;
int num1=0;
int flag=0;
MidCut=new float*[iNonStrAttNum];
Cut=new float*[iNonStrAttNum];
//MidCut为后选的断点集的上下界的集合,
//MidCut[i][0]为第i个属性后选的断点集的上下界的个数
//MidCut[i]是经过排序的,由小到大
for(i=0;i<iNonStrAttNum;i++)
{
float exchange;
float *Mid;
Mid=new float[iRecordNum+1];
Mid[++num]=pNonStringTable[0][i];
for(j=1;j<iRecordNum;j++)
{
for(k=1;k<=num;k++)
{
if(pNonStringTable[j][i]==Mid[k])
{
flag=1;
break;
}
}
if(flag==0)
{
Mid[++num]=pNonStringTable[j][i];
}
flag=0;
}
Mid[0]=(float)num;
MidCut[i]=new float[num+1];
Cut[i]=new float[num];
Cut[i][0]=0;
MidCut[i][0]=Mid[0];
for(j=1;j<num;j++)
for(k=j+1;k<=num;k++)
if(Mid[j]>Mid[k])
{
exchange=Mid[j];
Mid[j]=Mid[k];
Mid[k]=exchange;
}
for(j=1;j<=num;j++)
MidCut[i][++num1]=Mid[j];
delete []Mid;
num=0;
num1=0;
flag=0;
}
}
void CMydis::GetNewTable()
{
int i,j,m;
int num=0;
MidInfoTable=new float*[iRecordNum];
for(i=0;i<iRecordNum;i++)
MidInfoTable[i]=new float [iNonStrAttNum+1];
for(i=0;i<iRecordNum;i++)
for(j=0;j<iNonStrAttNum+1;j++)
MidInfoTable[i][j]=pNonStringTable[i][j];
ComAttImportant();
for(i=0;i<iNonStrAttNum;i++)
{
for(j=1;j<(int)MidCut[AttImportant[i][0]][0];j++)
{
if(GetMidInfoTable(AttImportant[i][0],j)==0)
{
for(m=0;m<iRecordNum;m++)
if(MidInfoTable[m][AttImportant[i][0]]==MidCut[AttImportant[i][0]][j])
MidInfoTable[m][AttImportant[i][0]]=MidCut[AttImportant[i][0]][j+1];
//把与断点相临的较小值改为较大值
}
else if(GetMidInfoTable(AttImportant[i][0],j)==1)
Cut[AttImportant[i][0]][++num]=(MidCut[AttImportant[i][0]][j]+MidCut[AttImportant[i][0]][j+1])/2;
}
Cut[AttImportant[i][0]][0]=(float)num;
num=0;
}
}
void CMydis::GetDiscreteTable()
{
int i,j,k;
int m;
NewTable=new int *[iRecordNum];
for(i=0;i<iRecordNum;i++)
{
NewTable[i]=new int[iNonStrAttNum+1];
for(j=0;j<iNonStrAttNum;j++)
{
if((int)Cut[AttImportant[j][0]][0]!=0)
{
m=0;
for(k=0;k<(int)Cut[AttImportant[j][0]][0];k++)
{
if(MidInfoTable[i][AttImportant[j][0]]<Cut[AttImportant[j][0]][k+1])
{
NewTable[i][AttImportant[j][0]]=m;
break;
}
m++;
}
if(MidInfoTable[i][AttImportant[j][0]]>Cut[AttImportant[j][0]][(int)Cut[AttImportant[j][0]][0]])
NewTable[i][AttImportant[j][0]]=(int)Cut[AttImportant[j][0]][0];
}
if((int)Cut[AttImportant[j][0]][0]==0)
NewTable[i][AttImportant[j][0]]=0;
}
NewTable[i][iNonStrAttNum]=(int)MidInfoTable[i][iNonStrAttNum];
}
}
void CMydis::ComAttImportant()
{
int i,j;
int mid;
AttImportant=new int*[iNonStrAttNum];
for(i=0;i<iNonStrAttNum;i++)
AttImportant[i]=new int[2];
for(i=0;i<iNonStrAttNum;i++)
AttImportant[i][0]=i;
for(i=0;i<iNonStrAttNum;i++)
AttImportant[i][1]=ComImport(i);
for(i=0;i<iNonStrAttNum-1;i++)
for(j=i+1;j<iNonStrAttNum;j++)
if(AttImportant[i][1]<AttImportant[j][1])
{
mid=AttImportant[i][0];
AttImportant[i][0]=AttImportant[j][0];
AttImportant[j][0]=mid;
mid=AttImportant[i][1];
AttImportant[i][1]=AttImportant[j][1];
AttImportant[j][1]=mid;
}
for(i=0;i<iNonStrAttNum-1;i++)
for(j=i+1;j<iNonStrAttNum;j++)
if(AttImportant[i][1]==AttImportant[j][1])
{
if(MidCut[AttImportant[i][0]][0]<MidCut[AttImportant[j][0]][0])
{
mid=AttImportant[i][0];
AttImportant[i][0]=AttImportant[j][0];
AttImportant[j][0]=mid;
mid=AttImportant[i][1];
AttImportant[i][1]=AttImportant[j][1];
AttImportant[j][1]=mid;
}
}
}
/*int CMydis::InitTable()
{
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 memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return -2;
}
for(j=0;j<iAttNum+1;j++)
InfoTable[i][j]=(float)atof(pStringTable[i][j]);
}
return 1;
}
*/
int CMydis::GetMidInfoTable(int m,int n )
//此函数求得第m个属性的第n个值和第n+1个值之间的断点是否
//能够被去掉,如果能够被去掉,则返回值为0,不能够被去掉,则返回值为1
//能够去掉的话,信息系统的第n个值将被第n+1个值代替.
{
int i,j;
int m1=0;
int m2=0;
int num1=0;
int num2=0;
float **Mid1;
float **Mid2;
for(i=0;i<iRecordNum;i++)
{
if(MidInfoTable[i][m]==MidCut[m][n])
num1++;
if(MidInfoTable[i][m]==MidCut[m][n+1])
num2++;
}
Mid1=new float *[num1];
Mid2=new float *[num2];
for(i=0;i<num1;i++)
Mid1[i]=new float [iNonStrAttNum+1];
for(i=0;i<num2;i++)
Mid2[i]=new float[iNonStrAttNum+1];
for(i=0;i<iRecordNum;i++)
{
if(MidInfoTable[i][m]==MidCut[m][n])
{
for(j=0;j<iNonStrAttNum+1;j++)
Mid1[m1][j]=MidInfoTable[i][j];
Mid1[m1][m]=MidCut[m][n+1];
m1++;
}
else if(MidInfoTable[i][m]==MidCut[m][n+1])
{
for(j=0;j<iNonStrAttNum+1;j++)
Mid2[m2][j]=MidInfoTable[i][j];
m2++;
}
}
if(JudgeConflict(Mid1,m1,Mid2,m2)==0) //表示信息系统不会发生冲突
{
for(i=0;i<num1;i++)
delete []Mid1[i];
delete []Mid1;
for(i=0;i<num2;i++)
delete []Mid2[i];
delete []Mid2;
return 0;
}
else
{
for(i=0;i<num1;i++)
delete []Mid1[i];
delete []Mid1;
for(i=0;i<num2;i++)
delete []Mid2[i];
delete []Mid2;
return 1;
}
}
int CMydis::JudgeConflict(float **Mid1, int num1, float **Mid2, int num2)
{
int i,j,k;
int num=0;
int flag=0;
for(i=0;i<num1;i++)
for(j=0;j<num2;j++)
{
if(Mid1[i][iNonStrAttNum]==Mid2[j][iNonStrAttNum])
num++;
else if(Mid1[i][iNonStrAttNum]!=Mid2[j][iNonStrAttNum])
{
flag=0;
for(k=0;k<iNonStrAttNum;k++)
{
if(Mid1[i][k]==Mid2[j][k])
flag++;
}
if(flag<iNonStrAttNum)
num++;
}
}
if(num==num1*num2)
return 0;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -