📄 zsscombinalcomplete.cpp
字号:
// ZssComplet.cpp: implementation of the CZssComplet class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ZssCombinalComplete.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CZssCombinalComplete::CZssCombinalComplete()
{
}
CZssCombinalComplete::~CZssCombinalComplete()
{
}
/*------------combinaltorial completer ------------------*/
BOOL CZssCombinalComplete::CombinatorialCompleter(LPCTSTR openfilename, LPCTSTR savefilename)
{
fpos_t filepos;
FILE *fp1,*fp2;
int i_record, i_attr, i_count, i_index;
CStringArray *pattr;//保存每个属性的属性值
CStringArray attr_array;//保存记录的各个属性的属性值
INTATTR element;//
CArray<INTATTR,INTATTR> array;//保存每个存在记录的遗失属性,以及当前采用的补齐组合
char str_temp[ZSSLEN];//ZSSLEN=15
filepos=ReadFileHead(openfilename,0);
if((fp1=fopen(openfilename,"r"))==NULL || (fp2=fopen(savefilename,"w+"))==NULL)
{
TRACE("fopen failed\n");
return FALSE;
}
pattr=new CStringArray[m_iConAttrNum];
ReadAttrFromFile(fp1, filepos, pattr);//读文件头信息,初始化pattr
WriteFileHead(fp2,1,1);//写文件头
fsetpos(fp1,&filepos);
const int i_RecordNum=m_iRecordNum;
for(i_record=0;i_record<i_RecordNum;i_record++)
{
i_count=1;
/*------读取每一个改记录的属性值和组合信息----------*/
for(i_attr=0;i_attr<=m_iConAttrNum;i_attr++)
{
fscanf(fp1,"%s",str_temp);
attr_array.Add(str_temp);
if(IsMissingValue(str_temp))
{
i_count= i_count*pattr[i_attr].GetSize();
element.i_count =0;//置起始位置
element.i_attr =i_attr;//属性值的位置
array.Add(element);
}
}
m_iRecordNum +=i_count-1;
/*----------写入组合后的规则-------------*/
while( (i_count--) >0)//对每一种补齐情况,写文件
{
i_index=0;
for(i_attr=0; i_attr<=m_iConAttrNum; i_attr++)//to every att_value
{
if(IsMissingValue((LPCSTR)(attr_array.GetAt(i_attr))))
{//该属性值为遗失属性
fprintf(fp2, "%-15s", (LPCSTR)(pattr[i_attr].GetAt(array.GetAt(i_index).i_count)));
i_index++;
}
else//该属性值不是遗失属性值
fprintf(fp2,"%-15s",(LPCSTR)(attr_array.GetAt(i_attr)));
}//LPCSTR A 32-bit pointer to a constant character string.
fprintf(fp2,"\n"); //end line
if(i_count==0)//没有下一组组合,退出
continue;
int i_index1=array.GetSize()-1, i_index2;
/*----------得到下一个组合数---------------*/
while(i_index1>=0)//i_index1表示该记录有多少属性遗失 为0时表示有一个属性遗失
{
INTATTR attr1=array.GetAt(i_index1);//array表示遗失属性队列
i_index2=attr1.i_attr;//遗失属性的位置
if(attr1.i_count <pattr[i_index2].GetSize()-1)//?
{
attr1.i_count++;//增加一个值
array.SetAt(i_index1, attr1);//插入队列
break;
}
else
{
attr1.i_count=0;
array.SetAt(i_index1,attr1);
}
i_index1--;
}
}
attr_array.RemoveAll();
array.RemoveAll();
}
delete []pattr;
WriteFileHead(fp2, 0,1);//重写文件头
fclose(fp1);
fclose(fp2);
return TRUE;
}
/*------------从文件中读属性值在 Combinatorial Completer中用到*/
void CZssCombinalComplete::ReadAttrFromFile(FILE *fp, fpos_t &filepos, CStringArray *pattr)
{ //得到的pattr[i]中保存有第i个属性上除遗失属性值以外所有不同的值
char str_temp[ZSSLEN];
fsetpos(fp, &filepos);
int size, i_record, i_attr, index;
for(i_record=0; i_record<m_iRecordNum; i_record++)
{
for (i_attr=0;i_attr<m_iConAttrNum;i_attr++)
{
fscanf(fp,"%s",str_temp);
if (IsMissingValue(str_temp))
continue;
size=pattr[i_attr].GetSize();
for(index=0; index<size; index++)
if(strcmp(str_temp,(LPCSTR)(pattr[i_attr].GetAt(index)))==0)
break;
if(index==size)
pattr[i_attr].Add(str_temp);
}
fscanf(fp,"%s",str_temp);
}
}
/*-----------conditoned combinatorial completer---------------*/
BOOL CZssCombinalComplete::ConditionCombinatorialCompleter(LPCTSTR openfilename, LPCTSTR savefilename)
{
fpos_t filepos,filepos1;
FILE *fp1,*fp2;
int i_record, i_attr, i_count, i_index;
CArray<CON_COMB_ATTR,CON_COMB_ATTR> *pattr;
//所有条件属性值和决策属性值的组合
CStringArray *pconattr;
//每个存在遗漏的条件属性上和当前决策属性相同的其余记录的条件属性值
//及是当前记录应当补齐的属性值
char str_temp[ZSSLEN],str_dattr[ZSSLEN],str_olddattr[ZSSLEN];//ZSSLEN=15
CStringArray attr_array; //当前记录的所有属性值
INTATTR element;
CArray<INTATTR,INTATTR> info_array;
//存放当前记录上存在遗漏的条件属性及和他决策相同的条件属性值的个数
bool bmissing;
filepos=ReadFileHead(openfilename,0);
if((fp1=fopen(openfilename,"r"))==NULL || (fp2=fopen(savefilename,"w+"))==NULL)
{
TRACE("fopen failed\n");
return FALSE;
}
fsetpos(fp1,&filepos);
fscanf(fp1,"%s",str_temp);
/* ---allocate memroy for array----- */
pattr=new CArray<CON_COMB_ATTR,CON_COMB_ATTR>[m_iConAttrNum+1];
pconattr=new CStringArray[m_iConAttrNum];
WriteFileHead(fp2,1,1);
ReadAttrFromFile_Condition(fp1, filepos, pattr);
//读文件头信息,初始化pattr
fsetpos(fp1,&filepos);
const int i_RecordNum=m_iRecordNum;
for(i_record=0;i_record<i_RecordNum;i_record++)
{
fgetpos(fp1,&filepos1);
MoveFilePoint(fp1,m_iConAttrNum);//跳到该记录的决策属性
fscanf(fp1,"%s",str_dattr);//读入该记录的决策属性
bmissing=false;
fsetpos(fp1,&filepos1);
/*---得到该规则的所有条件属性和组合信息-----*/
i_count=1;
for(i_attr=0;i_attr<=m_iConAttrNum;i_attr++)
{//把该记录的所有属性值存入attr_array数组中
fscanf(fp1,"%s",str_temp);
if(!bmissing && IsMissingValue(str_temp))
bmissing=true;
attr_array.Add(str_temp);
}
if(bmissing)//有遗失的属性
{//pconattr中保存了所有决策属性为str_olddattr的各个条件
//属性的出现的值,故先判断当前的决策属性是否和上次的一样,以减少计算次数
if(strcmp(str_dattr,str_olddattr)!=0)
{
strcpy(str_olddattr,str_dattr);
SelectCattrByDattr(pattr,pconattr,str_dattr);
}
/*------写入组合信息------------*/
for(i_attr=0;i_attr<m_iConAttrNum;i_attr++)
{
if(IsMissingValue((LPCSTR)(attr_array[i_attr])))
{
element.i_count=0;
element.i_attr=i_attr;
i_count*= pconattr[i_attr].GetSize();
info_array.Add(element);
}
}
}
m_iRecordNum+=i_count-1;
while( (i_count--) >0)
{
i_index=0;
for(i_attr=0;i_attr<=m_iConAttrNum;i_attr++)
{ //对记录的每个属性
if( IsMissingValue((LPCSTR)(attr_array[i_attr])))
{
fprintf(fp2,"%-15s",(LPCSTR)(pconattr[i_attr].GetAt(info_array[i_index].i_count)));
i_index++;//LPCSTR:A 32-bit pointer to a constant character string.
}
else
fprintf(fp2,"%-15s",(LPCSTR)(attr_array[i_attr]));
}
fprintf(fp2,"\n");
if(i_count==0)
continue;
int i_index1=info_array.GetSize()-1,i_index2;
/*--------整理组合信息---------------*/
while(i_index1>=0)
{
INTATTR attr1=info_array.GetAt(i_index1);
i_index2=attr1.i_attr;
if(attr1.i_count <pconattr[i_index2].GetSize()-1)
{
attr1.i_count++;
info_array.SetAt(i_index1, attr1);
break;
}
else
{
attr1.i_count=0;
info_array.SetAt(i_index1,attr1);
}
i_index1--;
}//end : while(i_index1>=0)
}//end : while(i_count-->0)
info_array.RemoveAll();
attr_array.RemoveAll();//清空数组内的元素
}//end: for(i_record=0;i_record<i_RecordNum;i_record++)
/*----free memory-------*/
delete []pattr;
delete []pconattr;
WriteFileHead(fp2, 0,1);//重写文件头
fclose(fp1);
fclose(fp2);
return TRUE;
}
/*--------------从文件中读取条件属性值在 condition combinatiroal completer 用到----*/
/*把每个属性上不同的值写入pattr二维数组中,数组中的每个元素是一个记录类型,有两个字段组成,第一个表示条件属性,第二个表示决策属性,该数组记录每个
条件属性和决策属性的不同组合,如pattr[1][2]就表示了第二个条件属性的第三种组合----*/
void CZssCombinalComplete::ReadAttrFromFile_Condition(FILE *fp, fpos_t &filepos,CArray<CON_COMB_ATTR, CON_COMB_ATTR> * pattr)
{
int i_record,i_attr,size,index;
fpos_t filepos1;
char str_temp[ZSSLEN],str_dattr[ZSSLEN];
CON_COMB_ATTR attr;
fsetpos(fp,&filepos);
for(i_record=0;i_record<m_iRecordNum;i_record++)
{//对每一条记录
fgetpos(fp,&filepos1);
MoveFilePoint(fp,m_iConAttrNum);
fscanf(fp,"%s",str_dattr);//得到决策属性值
strcpy(attr.str_dattr,str_dattr);
fsetpos(fp,&filepos1);
for(i_attr=0;i_attr<m_iConAttrNum;i_attr++)
{//读入该记录的每个属性
fscanf(fp,"%s",str_temp);
if (IsMissingValue(str_temp))
continue;
size=pattr[i_attr].GetSize();
for(index=0;index<size;index++)
{
if( strcmp(str_temp,pattr[i_attr].GetAt(index).str_cattr)==0 &&//条件属性相同
strcmp(str_dattr,pattr[i_attr].GetAt(index).str_dattr)==0)//决策相同
break;//此时说明在pattr中已经包含此属性组合
}
if(index==size)//不包含时,加入此属性组合
{
strcpy(attr.str_cattr,str_temp);
pattr[i_attr].Add(attr);
}
}
MoveFilePoint(fp,1);
}
}
/*-----拷贝和指定决策属性相同的条件属性值------
在数组pdattr中存放了所有和当前记录的决策属性str_dattr相同
的条件属性值,既是要补齐到当前的记录上的所有值------*/
void CZssCombinalComplete::SelectCattrByDattr(CArray<CON_COMB_ATTR,CON_COMB_ATTR> *psattr,
CStringArray *pdattr, const char *str_dattr)
{
for(int i_attr=0;i_attr<m_iConAttrNum;i_attr++)
{
pdattr[i_attr].RemoveAll();//清除
int size=psattr[i_attr].GetSize();//每个属性的属性组合数目
for(int i_index=0;i_index<size;i_index++)
{
if( strcmp(str_dattr,psattr[i_attr].GetAt(i_index).str_dattr)==0)//决策相同时
pdattr[i_attr].Add(psattr[i_attr].GetAt(i_index).str_cattr);//加入所有的条件属性组合
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -