⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydis.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 // 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 + -