📄 zsswidthscaler.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 + -