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

📄 seminaive.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			for(k=0;k<(int)Cut[j][0];k++)
			{
				if( pNonStringTable[i][j]<Cut[j][k+1])
				{
					NewTable[i][j]=m;
					break;
				}
				m++;
			}
			if(pNonStringTable[i][j]>=Cut[j][(int)Cut[j][0]])
					NewTable[i][j]=(int)Cut[j][0];
			}
	   NewTable[i][iNonStrAttNum]=(int) pNonStringTable[i][iNonStrAttNum];
   }
}
//保存离散化后的结果,包括离散化后的决策表和所选取的断点集
void CSemiNaive::OnSemiNaivedisSave(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(); 	
}
//返回一个数组,保存了决策属性值中出现不同值
float* CSemiNaive::GetDeciValue()
{
   int i,j;
   float *Mid;
   float *DeciValue;
   int num=0;
   int flag=0;
   Mid=new float[iRecordNum];
   Mid[num++]= pNonStringTable[0][iNonStrAttNum];

   for(i=1;i<iRecordNum;i++)
   {
	   for(j=0;j<num;j++)
	   {
		   if( pNonStringTable[i][iNonStrAttNum]==Mid[j])
		   {
			   flag=1;
			   break;
		   }
		 
	   }
	     if(flag==0)
			Mid[num++]= pNonStringTable[j][iNonStrAttNum];
	   flag=0;
   }
   DeciValue=new float[num];
   for(i=0;i<num;i++)
	   DeciValue[i]=Mid[i];
   
   delete []Mid;
   return DeciValue;
}
//返回决策属性值中出现不同值个数
int CSemiNaive::GetDeciNum()
{
   int i,j;
   float *Mid;
   int num=0;
   int flag=0;
   Mid=new float[iRecordNum];
   Mid[num++]= pNonStringTable[0][iNonStrAttNum];

   for(i=1;i<iRecordNum;i++)
   {
	   for(j=0;j<num;j++)
	   {
		   if( pNonStringTable[i][iNonStrAttNum]==Mid[j])
		   {
			   flag=1;
			   break;
		   }
		   
	   }
	   if(flag==0)
	   Mid[num++]= pNonStringTable[j][iNonStrAttNum];
	   
	   flag=0;
   }
   delete []Mid;
   return num;
}
//从文件中读取决策表的所有信息
BOOL CSemiNaive::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; 
}

//将属性名称读入pAttName中,将数据类型读入pDataType中
BOOL CSemiNaive::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; 
} 

    
     
//将表中属性值读入 pNonStringTable和pStringTable中
BOOL CSemiNaive::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 CSemiNaive::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]; 
            strcpy(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] 
                    strcpy(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 + -