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

📄 disone.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DisOneDoc1.cpp: implementation of the CDisOneDoc class.
//
//////////////////////////////////////////////////////////////////////
 
#include "stdafx.h"
#include "RSet.h"
#include "fstream.h"
#include "DisOne.h"
 
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDisOne::CDisOne()
{
		
	infotable=NULL;
	att_val=NULL;
	interval=NULL;
	formulas=NULL;
	matrix=NULL;
	cut=NULL;
	new_table=NULL;
		pAttName=NULL;
	pDataType=NULL;
	pStringTable=NULL;

}

CDisOne::~CDisOne()
{
	int i;                                       //循环变量
	if(interval!=NULL)
	{
    	for(i=0;i<iAttNum;i++)
	    	delete []interval[i];
    	delete []interval;
	} 
	if(infotable!=NULL)
	{
    	for(i=0;i<iRecordNum;i++)
	     	delete []infotable[i];
    	delete []infotable;
	}	
	if(att_val!=NULL)
	{
    	for(i=0;i<iAttNum;i++)
    		delete []att_val[i];
    	delete []att_val;
	}

	if(cut!=NULL)
	{
    	for(i=0;i<iAttNum;i++)
	    	delete []cut[i];
    	delete []cut;
	}
	if(new_table!=NULL)
	{
    	for(i=0;i<iRecordNum;i++)
	    	delete []new_table[i];
    	delete []new_table;
	}
	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<iAttNum+1;j++)
				delete[] pStringTable[i][j];
			delete[] pStringTable[i];
		}
		delete[] pStringTable;
	}
}

BOOL CDisOne::OnDisOne()
{   
	int matrix_row;                       //矩阵的行数
	int matrix_col;                       //矩阵的列数
	int i = load_table();
	if(i==1)
	{
	    get_att_val();
		matrix_row=logic();
		matrix_col=init_matrix(matrix_row);
		findcuts(matrix_row,matrix_col);
		make_new_table();
		return TRUE;
	}
	return FALSE;
}
 
int CDisOne::get_att_val()
{
	int i,j;                                          //循环变量
	int n;                                            //记录数
	att_val=new float * [iAttNum];	
	float * val=new float[iRecordNum+1];
	for(i=0;i<iAttNum;i++)
	{
        n=get_rec_num(i,val);
    	try
		{
			att_val[i]=new float[n+1];
		}
		catch(CMemoryException * e)
		{
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
			e->Delete();
			return -2;
		}
		for(j=0;j<n+1;j++)
			att_val[i][j]=val[j];
	}
	selectsort(att_val);
	interval=new float *[iAttNum];
	for(i=0;i<iAttNum;i++)
	{
		interval[i]=new float[(int)att_val[i][0]];
		interval[i][0]=att_val[i][0]-1;
		for(j=1;j<att_val[i][0];j++)
			interval[i][j]=(att_val[i][j]+att_val[i][j+1])/2;
	}
	delete val;
	return 1;

}

int CDisOne::get_rec_num(int att, float *val)
{
int i,j;                                     //循环变量
	bool find=FALSE;
	val[0]=0;
	for(i=0;i<iRecordNum;i++)
	{
		for(j=0;j<val[0];j++)
			if(infotable[i][att]==val[j+1])
			{
				find=TRUE;
				break;
			}
		if(find==FALSE)
		{
			val[0]++;
			val[(int)val[0]]=infotable[i][att];
		}
		find=FALSE;
	}
	return (int)val[0];
}

void CDisOne::selectsort(float **val)
{
	int i,j,k;                                     //循环变量
	int mini=0;
	float middle_val;
	for(i=0;i<iAttNum;i++)
		for(j=1;j<(int)val[i][0];j++)
		{
			mini=j;
			for(k=j+1;k<(int)val[i][0]+1;k++)
				if(val[i][k]<val[i][mini])
					mini=k;
			if(mini!=j)
			{
				middle_val=val[i][j];
				val[i][j]=val[i][mini];
				val[i][mini]=middle_val;
			}
		}
}

int CDisOne::logic()
{
int i,j,k,m;                                    //循环变量
	int count=0;   
    int recnum1,recnum2,distance;
	float val1,val2;
	for(i=0;i<iRecordNum-1;i++)
		for(j=i+1;j<iRecordNum;j++)
			if(infotable[i][iAttNum]!=infotable[j][iAttNum])
				count++;
	formulas=new float ** [count];
	count=0;
	for(i=0;i<iRecordNum-1;i++)
		for(j=i+1;j<iRecordNum;j++)
			if(infotable[i][iAttNum]!=infotable[j][iAttNum])
			{
				formulas[count]=new float * [iAttNum];
				for(k=0;k<iAttNum;k++)
				{
					formulas[count][k]=new float[(int)interval[k][0]+1];
					recnum1=search(infotable[i][k],k);
					recnum2=search(infotable[j][k],k);
				    distance=abs(recnum2-recnum1);
					formulas[count][k][0]=(float)distance;
					if(recnum1<recnum2)
						for(m=1;m<distance+1;m++)
						{
							val1=att_val[k][recnum1];
							val2=att_val[k][recnum1+1];
							formulas[count][k][m]=(val1+val2)/2;
							recnum1++;
						}
					if(recnum1>recnum2)
						for(m=1;m<distance+1;m++)
						{
							val1=att_val[k][recnum2];
							val2=att_val[k][recnum2+1];
							formulas[count][k][m]=(val1+val2)/2;
							recnum2++;
						}
				}
				count++;
			}
	return count;
}

int CDisOne::init_matrix(int rows)
{
int i,j,k,m;                                  //循环变量
	int cols=0;                                   //定义矩阵的行数列数
    bool find=FALSE;
	int num=0;                                    //矩阵列数     
	matrix=new int * [rows];
	for(i=0;i<iAttNum;i++)
		num+=(int)interval[i][0];
	for(i=0;i<rows;i++)
	{
		matrix[i]=new int[num];
		for(j=0;j<iAttNum;j++)
			for(k=0;k<(int)interval[j][0];k++)
			{
				if((int)formulas[i][j][0]==0)
					 matrix[i][cols]=0;
				if((int)formulas[i][j][0]>0)
				{
				   for(m=0;m<(int)formulas[i][j][0];m++)
				    	if(interval[j][k+1]==formulas[i][j][m+1])
						{
						  matrix[i][cols]=1;
						  find=TRUE;
						  break;
						}
				    if(find==FALSE)
					  matrix[i][cols]=0;				
		    	    find=FALSE;
				}
		        cols++;
			}  
		cols=0;
	}
	for(i=0;i<iAttNum;i++)
		cols+=(int)interval[i][0];	

    	for(i=0;i<rows;i++)
	    	for(j=0;j<iAttNum;j++)
		    	delete []formulas[i][j];
    	for(i=0;i<rows;i++)
			delete []formulas[i];
    	delete []formulas;
    	
	return cols;
}

void CDisOne::findcuts(int rows, int cols)
{
	int i,j;                                       //循环变量
    int * cuts=new int[cols+1];                      //定义断点
	cuts[0]=0;   //设置断点的初始个数
    int num;
	int remains; //未处理的矩阵元素个数
	int maxvalue;//含1最多的列
	int minvalue; //在含1最多的列相等的情况下,求行的最小值
	int maxnum; //含1最多的列中1的个数
	int maxcol=0;
    int **maxcols=new int*[cols];
	for(i=0;i<cols;i++)
		maxcols[i]=new int[2];

	int * countcols=new int[cols];                   //各列中含1的个数
	int * countrows=new int[rows];
	//初始化各列1的总和以及各行1的总和
    for(i=0;i<cols;i++)
	{
            countcols[i]=0;
	   for(j=0;j<2;j++)
	    	maxcols[i][j]=0;
	}
    for(i=0;i<rows;i++)
		countrows[i]=0;

	for(i=0;i<cols;i++)
		  for(j=0;j<rows;j++)
			  if(matrix[j][i]==1)
			     countcols[i]++;
	for(i=0;i<rows;i++)
		for(j=0;j<cols;j++)
			if(matrix[i][j]==1)
				countrows[i]++;
   do
	{
		maxnum=0;
		maxvalue=0;
		remains=0;
	//先选列值为1总和最多的断点,
	//当有两列以上都为最多时,看行的总数
    //选取行总数最少的断点
		for(i=0;i<cols;i++)
			if(maxvalue<countcols[i])
				maxvalue=countcols[i];
		for(i=0;i<cols;i++)
			if(countcols[i]==maxvalue)
			  maxnum++;
        if(maxnum==1)//只有一列1的总数最多
		{
			for(i=0;i<cols;i++)
               if(countcols[i]==maxvalue)
			        maxcol=i;

		}
		else if(maxnum>1)//1的总数最多的列不止一个
		{	
		  num=0;
		  maxcols[num][0]=maxnum;
          for(i=0;i<cols;i++)
			  if(countcols[i]==maxvalue)
			  {
				  num++;
				  maxcols[num][0]=i;
			  }
          //判断行总数最少的列
              num=1;
		       int num1=0;
		     for(i=0;i<maxnum;i++)
			 {
				 for(j=0;j<rows;j++)
		           if(matrix[j][maxcols[num][0]]==1)
				    num1+=countrows[i];
               //行为1的数放在maxcols[num][1]中
			       maxcols[num][1]=num1;
				   num++;
			       num1=0;
			 }
	        	num=1;
		     maxvalue=0;
		      for(i=0;i<maxnum;i++)
			  { 
			    if(maxvalue<maxcols[num][1])
				maxvalue=maxcols[num][1];
                num++;
			  }
			  num=1;
			  minvalue=maxvalue;
			  for(i=0;i<maxnum;i++)
			  { 
			    if(minvalue>maxcols[num][1])

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -