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

📄 mydis.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	   return 1;

}

BOOL CMydis::OnMydis(){
/*	int i;
	i=InitTable();
*/
	GetMidCut();
	GetNewTable();
	GetDiscreteTable();
	if(iStrAttNum!=0)
		doString();
	return TRUE;
}

int CMydis::ComImport(int n)
{
  int i,j,k;
	int sum;
	int sum1=1;
	int *Mid1 ;
	Mid1=new int[iRecordNum];
    for(i=0;i<iRecordNum;i++)
		Mid1[i]=0;
    //存储记录i的等价类的个数

	float **Mid;
	Mid=new float*[iRecordNum];
	
	for(i=0;i<iRecordNum;i++)
		Mid[i]=new float[iNonStrAttNum+2];
	
	for(i=0;i<iRecordNum;i++)
        for(j=0;j<iNonStrAttNum+1;j++)
			Mid[i][j]=pNonStringTable[i][j];

     for(i=0;i<iRecordNum;i++)
	 {
		 Mid[i][n]=0;
		 Mid[i][iNonStrAttNum+1]=0;
	 }
   //把信息系统中的第n个属性值全部置为0,信息系统中记录中
	 //的最后一个值为标记值,全部置为0
	 //当后面的记录和前面的是同一个等价类时,
	 //标记值改为前一个记录的记录值
    for(i=0;i<iRecordNum-1;i++)
	{
		if(Mid[i][iNonStrAttNum+1]==0)
		{
		  Mid[i][iNonStrAttNum+1]=(float)(i+1);

		  for(j=i+1;j<iRecordNum;j++)
		  {
			for(k=0;k<iNonStrAttNum;k++)
				if(Mid[i][k]==Mid[j][k])
					sum++;
				else
					break;
			if(sum==iNonStrAttNum)
			{
				Mid[j][iNonStrAttNum+1]=(float)(i+1);//表示此记录j是i的等价类;
			    ++sum1;
			}
			sum=0;	
		  }
		  sum=0;
		  Mid1[i]=sum1;
		}		
		sum1=1;
	}
	if(Mid[iRecordNum-1][iNonStrAttNum+1]==0)
	{
		Mid[iRecordNum-1][iNonStrAttNum+1]=(float)iRecordNum;
        Mid1[iRecordNum-1]=1;
	}
	
	for(i=0;i<iRecordNum-1;i++)
	{
		if(Mid1[i]!=0)
		{
			for(j=i+1;j<iRecordNum;j++)
			{
				if(Mid[j][iNonStrAttNum+1]==i+1)
				{
					if(Mid[i][iNonStrAttNum]!=Mid[j][iNonStrAttNum]) 	
					{
						Mid1[i]=0;
						break;
					}
				}
			}
		}
	}

	sum=0;
    for(i=0;i<iRecordNum;i++)
		sum+=Mid1[i];
	
	for(i=0;i<iRecordNum;i++)
		delete[] Mid[i];
	delete[] Mid;
	
	delete[] Mid1;

	return sum;
}

void CMydis::OnMydisSave(LPCTSTR lpszPathName){
	int i,j;
	fstream fpw;
	fpw.open(lpszPathName,ios::out);
	if(!fpw){
		::MessageBeep(MB_ICONHAND);
		AfxMessageBox("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;i++)
		fpw<<pAttName[i]<<"	";
	fpw<<endl;
	for(i = 0;i <= iAttNum;i++)
		fpw<<pDataType[i]<<"	";
	fpw<<endl;

	int strIndex=0,nonStrIndex=0;
	for(i=0;i<iRecordNum;i++){
		for(j=0;j< iAttNum;j++){
			if(!strcmp(pDataType[j],"String")){
				fpw<<pStringTableResult[i][strIndex++]<<"	";
			}
			else{
				fpw<<NewTable[i][nonStrIndex++]<<"	";
			}
		}
		fpw<<NewTable[i][nonStrIndex];//决策属性
		strIndex=0,nonStrIndex=0;
		fpw<<endl;
	}
	fpw<<"[Cuts]"<<endl;

	strIndex=0,nonStrIndex=0;
	for(i=0;i<iAttNum;i++){
		fpw<<i<<endl;
		if(!strcmp(pDataType[i],"String")){
			fpw<<strCuts[strIndex]<<endl;	//断点个数
			for(j=0;j<strCuts[strIndex];j++){
				fpw<<pStrResult[j][strIndex]<<"	"<<j<<endl;	//断点与离散值对应关系
			}
			strIndex++;
		}
		else{
			fpw<<Cut[nonStrIndex][0]+1<<endl;	//断点个数
			fpw<<"["<<"*"<<",";
			for(j=0;j<(int)Cut[nonStrIndex][0];j++){
				fpw<<Cut[nonStrIndex][j+1]<<")"<<"	"<<j<<endl;
				fpw<<"["<<Cut[nonStrIndex][j+1]<<",";
			}
			fpw<<"*"<<"]"<<" "<<j;
			fpw<<endl;
			nonStrIndex++;
		}
	}
    fpw.close();
}

BOOL CMydis::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(!readAttrInfo(fp))
			return FALSE;
		if(!readTable(fp))
			return FALSE;
	}
	return TRUE;
}




BOOL CMydis::readAttrInfo(FILE* fp){
	int i;
	if(pAttName == NULL){
		try{
			pAttName = new char*[iAttNum+1];
			pDataType= new char*[iAttNum+1];
		}
		catch(CMemoryException* e){
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
			e->Delete();
			return FALSE;
		}

		for(i=0;i <= iAttNum;i++){
			try{
				pAttName[i]=new char[MAX];
				pDataType[i]=new char[MAX];
			}
			catch(CMemoryException* e){
				::MessageBeep(MB_ICONHAND);
				AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
				e->Delete();
				return FALSE;
			}
		}//end for
	}//end if
	for(i=0;i <= iAttNum;i++)
		fscanf(fp,"%s",pAttName[i]);
	fscanf(fp,"\n");
		//读属性名

	iStrAttNum = 0;
	iNonStrAttNum = 0;
	for(i = 0;i < iAttNum;i++){
		fscanf(fp,"%s",pDataType[i]);
		if(!strcmp(pDataType[i],"String"))
			iStrAttNum++;
		else
			iNonStrAttNum++;
	}//读属性值类型
	fscanf(fp,"%s",pDataType[iAttNum]);
		//决策属性类型
	fscanf(fp,"\n");
	return TRUE;
}

/*
BOOL CMydis::SetDataType(FILE *fp)
{
	int i;
	if(pDataType == NULL)
	{
		try
		{
			pDataType = new char*[count];
		}
		catch(CMemoryException* e)
		{
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of 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 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 CMydis::readTable(FILE* fp){
	int i,j;	
	if((pStringTable == NULL)&&(pNonStringTable == NULL)){
		try
		{
			if(iStrAttNum!=0)
				pStringTable = new char**[iRecordNum];
			pNonStringTable = new float*[iRecordNum];
				//至少决策属性是保存在pNonStringTable中的,所以pNonStringTable一定不为空
		}
		catch(CMemoryException* e){
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
			e->Delete();
			return FALSE;
		}
		for(i = 0;i < iRecordNum;i++){
			try{
				if(iStrAttNum!=0)
					pStringTable[i] = new char*[iStrAttNum];
				pNonStringTable[i] = new float[iNonStrAttNum+1];//包括决策属性
			}
			catch(CMemoryException* e){
				::MessageBeep(MB_ICONHAND);
				AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
				e->Delete();
				return FALSE;
			}
			for(j = 0;j < iStrAttNum;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;
				}
			}//end for
			for(j=0;j<=iNonStrAttNum;j++)
				pNonStringTable[i][j]=0.0;
		}//end for
	}//end if

	int iStrIndex=0,iNonStrIndex=0;
	char* str;
	str=new char[MAX];
	for(i = 0;i < iRecordNum;i++){
		for(j = 0;j < iAttNum;j++){
			if(!strcmp(pDataType[j],"String"))
				fscanf(fp,"%s",pStringTable[i][iStrIndex++]);
			//字符串类型的属性值读入pStringTable
			else{
				fscanf(fp,"%s",str);
				pNonStringTable[i][iNonStrIndex++]=(float)atof(str);
			}//非字符串类型的属性值读入pNonStringTable
		}
		fscanf(fp,"%s",str);//读入决策属性的值
		fscanf(fp,"\n");
		pNonStringTable[i][iNonStrIndex]=(float)atof(str);
		iStrIndex=0,iNonStrIndex=0;
	}
	delete[] str;
	return TRUE;
}


void CMydis::doString(){
	//先建立一个pStrResult,通过对pStringTable的一次扫描,把每一个属性的所有可能值找出来,建立字符串值与离散值的映射关系
	//再把pStringTable中的数据与pStrResult中的数据进行比较,修改pStringTable中的值,以便打印结果
	//strCuts[]存放断点个数

	int i=0,j=0,k=0;
	try{
		pStrResult = new char**[iRecordNum];
		pStringTableResult = new int*[iRecordNum];
			//存放离散化以后的结果
		strCuts = new int[iStrAttNum];
			//存放字符串属性的断点个数
	}
	catch(CMemoryException* e){
		::MessageBeep(MB_ICONHAND);
		AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
		e->Delete();
	}
	for (i=0;i<iRecordNum;i++){
		try{
			pStrResult[i]= new char*[iStrAttNum];
			pStringTableResult[i]= new int[iStrAttNum];
		}
		catch(CMemoryException* e){
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
			e->Delete();
		}
		for(j=0;j<iStrAttNum;j++){
			pStrResult[i][j] = new char[MAX];
			pStrResult[i][j] = "";
		}
	}
	for(i=0;i<iStrAttNum;i++){
		for(j=0;j<iRecordNum;j++)
			pStringTableResult[j][i]=0;
		strCuts[i]=0;
	}

	for(i=0;i<iStrAttNum;i++){
		for(j=0;j<iRecordNum;j++){//对每一列
			for(k=0;k<=j; k++){
				if(!strcmp(pStringTable[j][i],pStrResult[k][i]))
					break;
				else if(!strcmp(pStrResult[k][i],"")){	//如果pStrResult[k][i]不等于pStringTable[j][i]
														//而且pStrResult[k][i]为空
														//则应该把pStringTable[j][i]赋值给pStrResult[k][i]
					pStrResult[k][i]=pStringTable[j][i];
					strCuts[i]++;//记录断点个数
					break;
				}
			}
			pStringTableResult[j][i]=k;//把pStringTableResult[j][i]的值改为离散化以后的值
		}
	}
}

⌨️ 快捷键说明

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