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

📄 baocomplete.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
字号:
// BaoComplete.cpp: implementation of the CBaoComplete class.
//
//////////////////////////////////////////////////////////////////////
 
#include "stdafx.h"
#include "RSet.h"
#include "stdlib.h"
#include "BaoComplete.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CBaoComplete::CBaoComplete()
{
	iStage = 1;
	bIncompletion = FALSE;
	pAttName=NULL;
	pDataType=NULL;
	pStringTable=NULL;
	ii=NULL;
	itemp=NULL;
	t=NULL;
}

CBaoComplete::~CBaoComplete()
{
	for (int i=0;i<pl;i++)
	{
		delete[] ii[i];
		delete[] itemp[i];
	}
	delete[] ii;
	ii=NULL;
	delete[] itemp;
	itemp=NULL;
	delete[] t;
	t=NULL;
	if(pAttName)
	{
		for(i=0;i<iAttNum+1;i++)
			delete []pAttName[i];
		delete[] pAttName;
	}
    pAttName=NULL;
	if(pDataType)
	{
		for(i=0;i<iAttNum+1;i++)
			delete []pDataType[i];
		delete[] pDataType;
	}
    pDataType=NULL;
	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;
	}
    pStringTable=NULL;
}
BOOL CBaoComplete::ReadDataFromFile(LPCTSTR	lpszPathName)
{
	FILE* fp;
	if((fp = fopen(lpszPathName,"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);
	bl = iAttNum + 1;  //总的属性数
	fscanf(fp,"Records number:%d\n",&iRecordNum);
	pl = iRecordNum;    //记录数
	
	if(_stricmp(cStyle,"train") == 0 && iStage == 0)
	{
		if(!SetAttName(fp,iAttNum+1))
			return FALSE;
		if(!SetDataType(fp,iAttNum+1))
			return FALSE;
		if(!SetStringTable(fp,iAttNum+1,iRecordNum))
			return FALSE;
		
		if(GetIncompletion())
			bIncompletion = TRUE;
		fclose(fp);
		return TRUE;
	}
	else	//not correct input file
	{
		fclose(fp);
		return FALSE;
	}

}

int CBaoComplete::GetIncompletion()
{
	for(int i = 0;i < iRecordNum;i++)
	{
		for(int j = 0;j < iAttNum+1;j++)
		{
			if((strcmp(pStringTable[i][j],"?") == 0)||(strcmp(pStringTable[i][j],"-") == 0)||(strcmp(pStringTable[i][j],"*") == 0))
				return 1;
		}
	}
	return 0;
}

BOOL CBaoComplete::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 CBaoComplete::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 CBaoComplete::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;
}

BOOL CBaoComplete::Remedy()
{
	int **m,i,j,q,i1,j1,s1,k,s,a1;
	int **ns,sg,*co,ss,ch;
	float s2;
	try
	{
    	m=new int*[pl];       //建立扩充差异矩阵M
	}
	catch(CMemoryException* e)
	{
		::MessageBeep(MB_ICONHAND);
		AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
		e->Delete();
		return FALSE;
	}
	for (i=0;i<pl;i++)
    	try
		{
		   m[i]=new int[pl];
		}
		catch(CMemoryException* e)
		{
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
			e->Delete();
			return FALSE;
		}
	do//每次对不同的可辨识矩阵进行
	{
		for (i=0;i<pl;i++)//初始化临时矩阵
		{
			for(k=0;k<bl;k++)//bl为属性数目
			{
				itemp[i][k].mark=ii[i][k].mark;
				itemp[i][k].intnub=ii[i][k].intnub;
				itemp[i][k].fltnub=ii[i][k].fltnub;
				strcpy(itemp[i][k].chnub,ii[i][k].chnub);
			}//end for
		}//end for
		sg=0;
		for (i=0;i<pl;i++)   //给M填值
			for (j=0;j<pl;j++)
				m[i][j]=0;
		for(i=0;i<pl;i++)
			for(j=0;j<pl;j++)//i,j为不同两行
			{                //每次都扫描整个信息表
				q=0;
				while(q<bl)
				{
					if(itemp[i][q].mark==itemp[j][q].mark)
					{
						if((itemp[i][q].mark==1)&&(itemp[i][q].intnub!=itemp[j][q].intnub))
						{//为整型
							q=bl+1;m[i][j]=1;//q》b1 从而退出while循环
						}//end if
						if((itemp[i][q].mark==2)&&(itemp[i][q].fltnub!=itemp[j][q].fltnub))
						{//浮点型
							q=bl+1;m[i][j]=1;
						}//end if
						if((itemp[i][q].mark==3)&&(strcmp(itemp[i][q].chnub,itemp[j][q].chnub)!=0))
						{//字符型
							q=bl+1;m[i][j]=1;
						}//end if
					}//end if
					q++;	
				}//end while
			}//end for                     //M处理完毕
	try
	{
	  ns=new int *[pl];        //建立无差别对象集NS
	}
	catch(CMemoryException* e)
	{
		::MessageBeep(MB_ICONHAND);
		AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
		e->Delete();
		return FALSE;
	}
	for (i=0;i<pl;i++)
    	try
		{
			ns[i]=new int[pl];
		}
		catch(CMemoryException* e)
		{
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of memory!",MB_OK|MB_ICONSTOP);
			e->Delete();
			return FALSE;
		}
		for(i=0;i<pl;i++)        //给NS赋初值
  		 for(j=0;j<pl;j++)
			ns[i][j]=-1;
		for(i=0;i<pl;i++)        //计算无差别对象集NS
		{
			j1=0;
			for(j=0;j<pl;j++)
			{
				if((m[i][j]==0)&&(i!=j))
				{
					ns[i][j1]=j;j1++;
				}//end if
			}//end for
		}//end for                       //NS处理完毕
			for(i=0;i<pl;i++)         //循环,对每个样例
				for(k=0;k<bl;k++)  //对每个属性
					if(itemp[i][k].mark>3)//遗失值
					{
						j=0;
						while ((j<bl)&&(ns[i][j]!=-1)) 
							j++;
						j--;//找到该样例的最后一个无差别对象
						if (j>-1)
							if (j==0)//只有一个无差别对象
							{
								s=ns[i][j];
								if(itemp[s][k].mark<=3)
								{//将s对象的属性值赋给i对象对应遗失值
									ii[i][k].mark=itemp[s][k].mark;
									ii[i][k].intnub=itemp[s][k].intnub;
									ii[i][k].fltnub=itemp[s][k].fltnub;
									strcpy(ii[i][k].chnub,itemp[s][k].chnub);
									sg=1;//标志位
								}//end if
							}//end if
							else//不止一个无差别对象
							{
								ss=0;//标志位
								for(i1=0;i1<=j;i1++)
									for(j1=0;j1<=j;j1++)
									{
										if (i1!=j1)
										{
											s1=ns[i][i1];
											a1=ns[i][j1];
											if((itemp[s1][k].mark<=3)&&(itemp[a1][k].mark<=3))
											{
												if ((itemp[s1][k].mark==1)&&(itemp[s1][k].intnub!=itemp[a1][k].intnub))//无差别对象对应遗失属性的属性值不同
								                     ss=1;
												if ((itemp[s1][k].mark==2)&&(itemp[s1][k].fltnub!=itemp[a1][k].fltnub))
													ss=1;
												if ((itemp[s1][k].mark==3)&&(strcmp(itemp[s1][k].chnub,itemp[a1][k].chnub)!=0))
													ss=1;
											}//end if
										}//end if
									}//end for
									if (ss==0)//无差别对象对应属性值相同
										for (i1=0;i1<=j;i1++)
										{
											s1=ns[i][i1];
											if (itemp[s1][k].mark<=3)
											{
												ii[i][k].mark=itemp[s1][k].mark;
												ii[i][k].intnub=itemp[s1][k].intnub;
												ii[i][k].fltnub=itemp[s1][k].fltnub;
												strcpy(ii[i][k].chnub,itemp[s1][k].chnub);
												sg=1;//修改标志位
											}//end if
										}//end for
							}//end else
					}//end if
	} while (sg==1);  //I处理完毕,sg为0表示整个操作没有补齐任何值,于是退出
	co=new int[pl];
	for(i=0;i<pl;i++)          //剩余遗失值处理
		for(k=0;k<bl;k++)
			if(ii[i][k].mark>3)
			{
				ch=0;
				if(ii[i][k].mark==4)//遗失值为整型
				{
					s1=0;		
					for(i1=0;i1<pl;i1++)
						if (ii[i1][k].mark==1)//对数值才累加和
						{
							s1=s1+ii[i1][k].intnub;ch++;
						}//end if
						s1=s1/ch;//求平均值
						ii[i][k].mark=1;
						ii[i][k].intnub=s1;
				}//end if
				if(ii[i][k].mark==5)//遗失值为浮点型
				{
					s2=0;
					for(i1=0;i1<pl;i1++)
						if (ii[i1][k].mark==2)
						{
							s2=s2+ii[i1][k].fltnub;ch++;
						}//end if
					s2=s2/ch;
					ii[i][k].mark=2;
					ii[i][k].fltnub=s2;
				}//end if
				if(ii[i][k].mark==6)//遗失值为字符型
				{
					for(i1=0;i1<pl;i1++)
					  if(ii[i1][k].mark==3)
						co[i1]=1;  //初始化非遗失属性
					  else co[i1]=0;
					s=0;
					for(i1=0;i1<pl;i1++)
						for(j1=0;j1<pl;j1++)
							if((i1!=j1)&&(strcmp(ii[i1][k].chnub,ii[j1][k].chnub)==0)&&(ii[i1][k].mark==3)&&(ii[j1][k].mark==3))
								co[i1]++;
					for(i1=0;i1<pl;i1++)//求出现次数最多的字符串,s=0
						if(co[i1]>s)//当同时出现几个字符串出现次数一样时,取决策表中最先出现的字符串
						{
							s=co[i1];
							ii[i][k].mark=3;
							strcpy(ii[i][k].chnub,ii[i1][k].chnub);
						}//end if
				}//end if
			}//end if
	for (i=0;i<pl;i++)
	{
		delete[] m[i];
		delete[] ns[i];
	}
	delete[] co;
	delete[] m;  
    delete[] ns;
	return true;
}

BOOL CBaoComplete::InitTable()
{
	int i,j;
	try
	{
		ii=new struct itab*[pl];//存储决策表值
		itemp = new struct itab*[pl];//临时表
	}
	catch(CMemoryException* e)
	{
		::MessageBeep(MB_ICONHAND);
       	AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
		e->Delete();
    	return FALSE;
	}
	
	for (i=0;i<pl;i++)
	{
		try
		{
			ii[i]=new struct itab[bl];
			itemp[i] = new struct itab[bl];
		}
		catch(CMemoryException* e)
		{
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
			e->Delete();
			return FALSE;
		}
	}//end for
	try
	{
		t=new int[bl];//t表示每一个属性的数据类型
	}
	catch(CMemoryException* e)
	{
		::MessageBeep(MB_ICONHAND);
		AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
		e->Delete();
		return FALSE;
	}
	  
	for(i=0;i<bl;i++)//b为iAttNum+1
	{
		if(stricmp(pDataType[i],"Integer") == 0)
		{
			t[i] = 1;
		}
		if(stricmp(pDataType[i],"Float") == 0)
		{
			t[i] = 2;
		}
		if(stricmp(pDataType[i],"String") == 0)
		{
			t[i] = 3;
		}
		for (j=0;j<pl;j++)
			ii[j][i].mark=t[i];
	}//end for                            
    for (i=0;i<pl;i++)
	{
		for (j=0;j<bl;j++)
		{
			if (strcmp(pStringTable[i][j],"?") == 0||strcmp(pStringTable[i][j],"-") == 0||strcmp(pStringTable[i][j],"*") == 0)
				ii[i][j].mark=ii[i][j].mark+3;
			else
			{
				if(ii[i][j].mark==1)
					ii[i][j].intnub=atoi(pStringTable[i][j]);//将字符型转换为整型atoi
				if(ii[i][j].mark==2)
					ii[i][j].fltnub=(float)atof(pStringTable[i][j]);
 				if(ii[i][j].mark==3)
					strcpy(ii[i][j].chnub,pStringTable[i][j]);
			}
		}
	}
	return TRUE;
}

BOOL CBaoComplete::SaveFile(LPCTSTR lpszPathName)
{
	FILE* fp;
	CString temp;
	if((fp = fopen(lpszPathName,"w")) == NULL)
	{
		::MessageBeep(MB_ICONHAND);
		AfxMessageBox("Couldn't save the file",MB_OK|MB_ICONSTOP);
		return FALSE;
	}//end if

	fprintf(fp,"Style: train\n");
	fprintf(fp,"Stage: 1\n");
	fprintf(fp,"Condition attributes number: %d\n",bl-1);
	fprintf(fp,"Records number: %d\n",pl);
	for(int i = 0;i < bl;i++)
		fprintf(fp,"%s ",pAttName[i]);
	fprintf(fp,"\n");
	for(i = 0;i < bl;i++)
		fprintf(fp,"%s ",pDataType[i]);
	fprintf(fp,"\n");
	for(i = 0;i < pl;i++)
	{
		for(int j = 0;j < bl;j++)
		{ 
			if (ii[i][j].mark == 1)
				fprintf(fp,"%d ",ii[i][j].intnub);
			 if (ii[i][j].mark == 2)
			 {
			  fprintf(fp,"%f ",ii[i][j].fltnub);
			 }
			 if (ii[i][j].mark == 3)
				fprintf(fp,"%s ",ii[i][j].chnub);
			 if (ii[i][j].mark > 3)
				fprintf(fp,"? ");
		}
		fprintf(fp,"\n");
	}
	fclose(fp);
	return TRUE;
}

⌨️ 快捷键说明

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