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

📄 zsswidthscaler.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
字号:
// ZssWidthScaler.cpp: implementation of the CZssWidthScaler class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ZssWidthScaler.h"
#include "../SetArgumentDlg3.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CZssWidthScaler::CZssWidthScaler()
{
}

CZssWidthScaler::~CZssWidthScaler()
{
}

/*-------------等距离划分离散化算法
输入参数    strfilesour:源文件名
----------- strfiledest:离散化结果保存文件名
没有对决策属性进行离散化*/
BOOL CZssWidthScaler::EqualWidthScaler(CString strfilesour, CString strfiledest)
{
	FILE *file_source,*file_dest;
	fpos_t file_pos;
	CWordArray array_k,array_pos;//存放字符串属性
	char str_input[ZSSLEN];		
	char str_temp[ZSSLEN];
	float f_input;
	int i,j,size,i_result;
	CArray<INTERVALWIDTH,INTERVALWIDTH> tag;
	CStringArray *ptagstring=NULL;

	if ((file_pos=ReadFileHead((LPCTSTR)(strfilesour),1))==0)//读取文件头
		return FALSE;//失败返回
	if ((file_source=fopen(strfilesour,"r"))==NULL)
		return FALSE;
	tag.SetSize(m_iConAttrNum);//设定数组的大小
	array_k.SetSize(m_iConAttrNum);
	array_pos.SetSize(m_iConAttrNum);
    size=0;
    CSetArgumentDlg dlg(m_AttrName,m_AttrType,array_k,"等距离离散化",NULL);//设置参数
    if(dlg.DoModal()!=IDOK)
     return FALSE;
	//统计属性为字符串的个数
	for(i=0;i<m_iConAttrNum;i++)
		if(stricmp(m_AttrType[i],"String")==0)
		{
			array_pos.InsertAt(i,size);
			size++;
		}
	//分配空间
	if (size>=0)
	{
		if ((ptagstring=new CStringArray[size+1])==NULL)
			return FALSE;
	}

	GetIntervalInWidth(file_source,file_pos, array_k, array_pos, ptagstring,tag);
	if ((file_dest=fopen(strfiledest,"w"))==NULL)
	{
		delete []ptagstring;
		return FALSE;
	}
	WriteFileHead(file_dest,1,2);
	fsetpos(file_source, &file_pos);

	//把离散化的结果写入文件
	for (i=0; i<m_iRecordNum; i++)
	{
		for (j=0;j<m_iConAttrNum; j++)
		{
			if(stricmp(m_AttrType[j],"String")==0)//写字符串属性值
			{
				fscanf(file_source,"%s",str_input);
				if((i_result=GetIndex(str_input,ptagstring[array_pos[j]]))==-1)
			       	return FALSE;
				else
					fprintf(file_dest,"%-7d",i_result);//写离散结果
			}
			else//写非字符串属性值
			{
			    fscanf(file_source,"%s",str_temp);//考虑到出现字符的情况,此时将其当成0处理
		        f_input=atof(str_temp);
				//fscanf(file_source, "%f", &f_input);
				i_result=(int)((f_input-tag[j].f_min)/tag[j].f_interval);//计算间隔
				i_result=(i_result==array_k[j])?i_result-1:i_result;
				//考虑到边界情况,对最大值的离散结果
				fprintf(file_dest,"%-7d",i_result);//写离散结果
			}
		}
		fscanf(file_source,"%s",str_input);
		fprintf(file_dest,"%-7s\n",str_input);//决策属性
	}
	WriteFileTail(file_dest, array_k, array_pos, ptagstring,tag);//写文件结尾
	//释放空间
	fclose(file_source);
	fclose(file_dest);
	if (ptagstring!=NULL)
		delete []ptagstring;
	return TRUE;
}

/* 在等距离算法中取得每一个条件属性的断点间隔和最小属性值
输入参数          fp:文件指针
---------------   file_pos:文件位置(数据区的位置)
---------------   array_k: 用户指定的参数
---------------   array_pos:字符串条件属性在字符串数组中的位置
---------------   ptagarray:字符串属性数组的指针
---------------   tag :存放结果的数组*/
void CZssWidthScaler::GetIntervalInWidth(FILE *fp, fpos_t &file_pos, CWordArray &array_k,
									 CWordArray &array_pos, CStringArray *ptagarray,
									 CArray<INTERVALWIDTH,INTERVALWIDTH> & tag)
{
	int i,j,index;
	float f_min, f_max, f_temp;
	char str_attr[ZSSLEN];
	char str_temp[ZSSLEN];
	INTERVALWIDTH tag_temp;
	for (i=0; i<m_iConAttrNum; i++)
	{
		fsetpos(fp, &file_pos);
		MoveFilePoint(fp,i);
		if (0==stricmp(m_AttrType[i],"String"))//处理字符串属性
		{
			fscanf(fp, "%s",str_attr);
			index= array_pos[i];
			ptagarray[index].Add(str_attr);
			for (j=1; j<m_iRecordNum; j++)//对该字符串属性的所有值
			{
				MoveFilePoint(fp, m_iConAttrNum);
				fscanf(fp,"%s", str_attr);
				if (!IsStringInStringArray(str_attr,ptagarray[index]))
					ptagarray[index].Add(str_attr);
			}
		}
		else//处理非字符串属性
		{
		    fscanf(fp,"%s",str_temp);
		    f_min=atof(str_temp);//道理同上 ln:92
			//fscanf(fp,"%f",&f_min);
			f_max= f_min;
			for (j=1; j<m_iRecordNum; j++)
			{//扫描该属性的所有值,找出最小最大值
				MoveFilePoint(fp, m_iConAttrNum);
				fscanf(fp,"%f", &f_temp);
				if (f_temp<f_min)
					f_min=f_temp;
				if (f_temp>f_max)
					f_max=f_temp;
			}
		tag_temp.f_min =f_min;//定义区间结构
		tag_temp.f_interval = (f_max-f_min)/array_k[i];//array_k[i]为用户定义该属性的断点区间数目
		tag.SetAt(i,tag_temp);
		}
	}
}

/* 将离散化结果断点写入文件结尾
输入参数          fp:文件指针
---------------   array_k: 用户指定的参数
---------------   array_pos:字符串条件属性在字符串数组中的位置
---------------   ptagarray:字符串属性数组的指针
---------------   tag :存放结果的数组*/
void CZssWidthScaler::WriteFileTail(FILE *fp, CWordArray &array_k, 
								CWordArray &array_pos, CStringArray *ptagstring,
								CArray<INTERVALWIDTH,INTERVALWIDTH> & tag)
{
	int i,j,index,size;
	fprintf(fp, "\n[Cuts]\n");
	float f_temp1, f_temp2;
	for(i=0; i<m_iConAttrNum; i++)
	{
		if (stricmp(m_AttrType[i],"String")!=0)//对数值型属性处理
		{
			fprintf(fp,"%d\n%d\n",i,array_k[i]);//区域个数array_k[i]
			if(array_k[i]<1)
				return;
			else if(array_k[i]==1|| tag[i].f_interval==0)
			{//输入区间为一或者间距为零时
				fprintf(fp,"[*,*] %d\n",0);
			}
			else 
			if(array_k[i]>1)
			{
				f_temp2= tag[i].f_min+tag[i].f_interval;
				fprintf(fp,"[*,%.5f) %d\n",f_temp2,0);
				for(j=1; j<array_k[i]-1; j++)
				{
				f_temp1=f_temp2;
				f_temp2=f_temp1+tag[i].f_interval;
				fprintf(fp,"[%.5f,%.5f) %d\n",f_temp1,f_temp2,j);
				}
		    	fprintf(fp,"[%.5f,*] %d\n",f_temp2,j);
			}
		}
		else//字符串条件属性
		{
			index=array_pos[i];
			size=ptagstring[index].GetSize();
			fprintf(fp,"%d\n%d\n",i,size);
			for(j=0;j<size;j++)
				fprintf(fp,"%s %d\n",ptagstring[index].GetAt(j),j);
		}
	}			
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -