lierandomfilter.cpp
来自「某个实验事编写粗糙集智能信息处理的程序」· C++ 代码 · 共 183 行
CPP
183 行
// LieRandomFilter.cpp: implementation of the CLieRandomFilter class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "rset.h"
#include "LieRandomFilter.h"
#include "RandomFilterDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include <string>
#include <memory.h>
#include <fstream>
#include <new>
#include <stdlib.h>
#include <time.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CLieRandomFilter::CLieRandomFilter()
{
beSelected=0;
attributeName=0;
datatype=0;
}
CLieRandomFilter::~CLieRandomFilter()
{
if(beSelected)
delete[] beSelected;
if(attributeName)
delete[] attributeName;
if(datatype)
delete[] datatype;
}
bool CLieRandomFilter::SelectRecord(int num)
{
if(beSelected==0)
return false;
if(num==0)
return false;
// for(int i=0;i<num;i++)
// beSelected[i]=false;
memset(beSelected,0,sizeof(bool)*recordNumber);
srand((unsigned)time(0));
for(int i=0;i<num;i++)
{
int nRand=rand() % recordNumber;
if( beSelected[nRand] == false)
{
beSelected[nRand]=true;
continue;
}
while(1)
{
nRand++;
if(nRand>=recordNumber)
nRand=0;
if ( beSelected[nRand]==false )
{
beSelected[nRand]=true;
break;
}
}
}
return true;
}
bool CLieRandomFilter::Perform(const char* infile,const char*outfile)
{
int i;
char buffer[1024];
std::ifstream in;
std::ofstream out;
std::ofstream out1;
in.open(infile,std::ios::in);
if(!in)
{
AfxMessageBox("文件打开出错!");
return false;
}
out.open(outfile,std::ios::out);
if(!out)
{
AfxMessageBox("文件打开出错!");
return false;
}
char* filename;
bool SaveRemain=false;
in.getline(buffer,256,':');
in>>style;
in.getline(buffer,256,':');
in>>stage;
in.getline(buffer,256,':');
in>>conAttNumber;
in.getline(buffer,256,':');
in>>recordNumber;
try
{
attributeName=new std::string[conAttNumber+1];
datatype=new std::string[conAttNumber+1];
beSelected=new bool[recordNumber];
}
catch(std::bad_alloc* e)
{
delete e;
AfxMessageBox("内存分配错误!");
return false;
}
CRandomFilterDlg dlg;
dlg.SetTotalNumber(recordNumber);
if(dlg.DoModal()==IDCANCEL)
return false;
if(dlg.GetSelectedNumber()==0)
return false;
else SelectRecord(dlg.GetSelectedNumber());
if(AfxMessageBox("要保存抽取样列后的剩余样列文件吗?",MB_YESNO|MB_ICONINFORMATION)==IDYES)
{
CFileDialog dlg(false,".txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"RS files(*.txt)|*.txt|all files(*.*)|*.*||",NULL);
if(dlg.DoModal()==IDOK)
{
// CopyFile(filename, dlg.GetPathName(),FALSE);
out1.open(dlg.GetPathName(),std::ios::out);
SaveRemain=true;
if(!out1)
{
AfxMessageBox("文件打开出错!");
return false;
}
}
}
//read and write
for(i=0;i<conAttNumber+1;i++) //写属性名称
in>>attributeName[i];
for(i=0;i<conAttNumber+1;i++) //写属性类型
in>>datatype[i];
out<<"Style:train\n";
out<<"Stage:0\n";
out<<"Condition attributes number:"<<conAttNumber<<std::endl;
out<<"Records number:"<<dlg.GetSelectedNumber()<<std::endl;
for(i=0;i<conAttNumber;i++) //写属性名称
out<<attributeName[i]<<' ';
out<<attributeName[conAttNumber]<<'\n';
for(i=0;i<conAttNumber;i++) //写数据类型
out<<datatype[i]<<' ';
out<<datatype[conAttNumber]<<'\n';
if(SaveRemain){
out1<<"Style:train\n";
out1<<"Stage:0\n";
out1<<"Condition attributes number:"<<conAttNumber<<std::endl;
out1<<"Records number:"<<recordNumber-dlg.GetSelectedNumber()<<std::endl;
for(i=0;i<conAttNumber;i++) //写属性名称
out1<<attributeName[i]<<' ';
out1<<attributeName[conAttNumber]<<'\n';
for(i=0;i<conAttNumber;i++) //写数据类型
out1<<datatype[i]<<' ';
out1<<datatype[conAttNumber]<<'\n';
}
in.getline(buffer,1024);
for(i=0;i<recordNumber;i++)
{
in.getline(buffer,1024);
if(beSelected[i] )
out<<buffer<<std::endl;
else if(SaveRemain)
out1<<buffer<<std::endl;
}
return true;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?