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