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 + -
显示快捷键?