📄 seminaive.cpp
字号:
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 + -