📄 lietestdlg.cpp
字号:
else
if(atof(pBlockTable[j][k]) != atof(pTestData[k]))
break;
}//end for(k)
if(k == iAttNum)
{
trimstring = pBlockTable[j][iAttNum];
trimstring.Delete(0,5);
if(temp[atoi(trimstring)] == 1)
{
temp[atoi(trimstring)] = 0;
n--;
}//end if
}//end if
}//end for
}//end if
if(n == 0)
{
m_strResult = "未识别";
m_strRule = " ";
delete[] temp;
delete[] d;
return;
}//end if
if(n == 1)
{
for(j = 0;j < iRuleNum;j++)
{
if(temp[j] == 1)
break;
}//end for
m_strResult = pRuleTable[j][iAttNum];
m_strRule.Format("%d",temp1+1);
delete[] temp;
delete[] d;
return;
}//end if
temp1 = -1;
for(j = 0;j < iRuleNum;j++)
{
if(temp[j] == 1)
{
if(temp1 == -1)
{
temp1 = j;
reliability = (float)atof(pRuleTable[j][iAttNum+1]);
coveragenum = atoi(pRuleTable[j][iAttNum+2]);
totalnum = atoi(pRuleTable[j][iAttNum+3]);
strcpy(d,pRuleTable[j][iAttNum]);
}//end if
else
if(atof(d)==atof(pRuleTable[j][iAttNum])) //一致规则
{//一致的就选择可信度最大的
if(reliability<(float)atoi(pRuleTable[j][iAttNum+1]))
{
temp1 = j;
reliability = (float)atof(pRuleTable[j][iAttNum+1]);
coveragenum = atoi(pRuleTable[j][iAttNum+2]);
totalnum = atoi(pRuleTable[j][iAttNum+3]);
strcpy(d,pRuleTable[j][iAttNum]);
}//end if
}
else //对不一致的规则才处理,
{
if(reliability == (float)atof(pRuleTable[j][iAttNum+1]))
{//信任度相同,选取频度小的那条规则
if(totalnum > atoi(pRuleTable[j][iAttNum+3]))
{
temp1 = j;
reliability = (float)atof(pRuleTable[j][iAttNum+1]);
coveragenum = atoi(pRuleTable[j][iAttNum+2]);
totalnum = atoi(pRuleTable[j][iAttNum+3]);
strcpy(d,pRuleTable[j][iAttNum]);
}//end if
}//end if
else
{//信任度不等时
if(totalnum == atoi(pRuleTable[j][iAttNum+3]))
{//频度一样的情况下选取可信度较大的那条规则
if(reliability < (float)atof(pRuleTable[j][iAttNum+1]))
{
temp1 = j;
reliability = (float)atof(pRuleTable[j][iAttNum+1]);
coveragenum = atoi(pRuleTable[j][iAttNum+2]);
totalnum = atoi(pRuleTable[j][iAttNum+3]);
strcpy(d,pRuleTable[j][iAttNum]);
}//end if
}//end if
else
{
if(totalnum > atoi(pRuleTable[j][iAttNum+3]))
{//j规则频度小而可信度高,选取j
if(reliability < atof(pRuleTable[j][iAttNum+1]))
{
temp1 = j;
reliability = (float)atof(pRuleTable[j][iAttNum+1]);
coveragenum = atoi(pRuleTable[j][iAttNum+2]);
totalnum = atoi(pRuleTable[j][iAttNum+3]);
strcpy(d,pRuleTable[j][iAttNum]);
}//end if
else
{//出现频度大的规则可信度高
if(coveragenum/(float)(totalnum*totalnum) <
(float)atoi(pRuleTable[j][iAttNum+2])/(float)(atoi(pRuleTable[j][iAttNum+3])*atoi(pRuleTable[j][iAttNum+3])))
{//选取a/b*b大的
temp1 = j;
reliability = (float)atof(pRuleTable[j][iAttNum+1]);
coveragenum = atoi(pRuleTable[j][iAttNum+2]);
totalnum = atoi(pRuleTable[j][iAttNum+3]);
strcpy(d,pRuleTable[j][iAttNum]);
}//end if
}//end else
}//end if
else
{//j出现的频度大,可信度也高时,如果a/b*b大,则选取j规则
if(reliability < (float)atof(pRuleTable[j][iAttNum+1]))
{
if(coveragenum/(float)(totalnum*totalnum) <
(float)atoi(pRuleTable[j][iAttNum+2])/(float)(atoi(pRuleTable[j][iAttNum+3])*atoi(pRuleTable[j][iAttNum+3])))
{
temp1 = j;
reliability = (float)atof(pRuleTable[j][iAttNum+1]);
coveragenum = atoi(pRuleTable[j][iAttNum+2]);
totalnum = atoi(pRuleTable[j][iAttNum+3]);
strcpy(d,pRuleTable[j][iAttNum]);
}//end if
}//end if
}//end else
}//end else
}//end else
}//end else
}//end if
}//end for
m_strResult = d;
m_strRule.Format("%d",temp1+1);
delete[] temp;
delete[] d;
}
BOOL CLieTestDlg::CheckInputFile(LPCTSTR lpszPathName)
{//检测输入文件的头文件格式是否正确.只能为test和input类型
TRACE("check input file\n");
ifstream in;
in.open(lpszPathName,ios::nocreate);
if(!in)
{
AfxMessageBox("输入文件不能打开!");
return false;
}
char buf[256];
// int attnum;
//----------------- read style ----------------------------------
in.getline(buf,256,':');
in>>buf;
if(m_bTest)
{
if (strcmp(buf,"test")!=0 )
{
// read style error!
AfxMessageBox("输入文件非待测试样本文件或者文件头错误!");
in.close();
return FALSE;
}
}
else
{
if (strcmp(buf,"input")!=0 )
{
// read style error!
AfxMessageBox("输入文件非待识别样本文件或者文件头错误!");
in.close();
return FALSE;
}
}
in.getline(buf,256,':');
in>>buf;//状态
in.getline(buf,256,':');
in>>buf;//条件属性数目
if(atoi(buf)!=m_iAttrNum)
{
AfxMessageBox("输入数据文件条件属性数和\n规则的条件属性数不匹配!");
in.close();
return FALSE;
}
in.close();
return TRUE;
}
int CLieTestDlg::Match(int rule )
{//规则序号rule的规则是否和测试样本匹配.success:普通测试 return 1 ;else return n;
//failed:return 0
int n=0,i;
CString tempstring,trimstring;
for(i=0;i<iAttNum;i++)
{
switch(m_nPerformType)
{
case 0:
if(pTestData[i][0]=='-'&& sizeof(pTestData[i])==1 || pRuleTable[rule][i][0]=='-')
{//对于被约简掉的属性,对应的pRuleTable中该属性为'-',不比较
n++;
continue;
}
break;
case 1: //容差
if(pTestData[i][0]=='-'&&sizeof(pTestData[i])==1|| pRuleTable[rule][i][0]=='-')
{
n++;
continue;
}
break;
case 2: //限制容差
if(pTestData[i][0]=='-'&& sizeof(pTestData[i])==1 || pRuleTable[rule][i][0]=='-')
continue;
break;
case 3://相似
if( pRuleTable[rule][i][0]=='-'&& sizeof(pTestData[i])==1 )
continue;
else
if( pTestData[i][0]=='-'&&sizeof(pTestData[i])==1)
return 0;
break;
}//end switch
tempstring = pRuleTable[rule][i];//此时测试样本和规则都不为'-'
if(tempstring[0] == '[')
{
int pos = tempstring.Find(',');
trimstring = tempstring.Left(pos);
trimstring.Remove('[');
if(strcmp(trimstring,"*") != 0)
{//下界不为'*'
if(atof(trimstring) > atof(pTestData[i]))
return 0; //l比下限小,退出该循环
}//end if
trimstring = tempstring;
trimstring.Delete(0,pos+1);
trimstring.Remove(')');
trimstring.Remove(']');
if(strcmp(trimstring,"*") != 0)
if(atof(trimstring) <= atof(pTestData[i]))
return 0; //比上限大,不匹配规则,退出该循环
n+=iAttNum+1;//初始化为0,加后不为0,后面判断
continue;
}//end if(tempstring[0] == '[')
else
if(strcmp(pDataType[i],"String")==0)
{
if(strcmp(pTestData[i],pRuleTable[rule][i])==0)
{//不是连续区间.直接比较即可
n+=iAttNum+1;
continue;
}
else
return 0;
}
else
if(atof(pTestData[i]) == atof(pRuleTable[rule][i]))
{//不是连续区间.直接比较即可
n+=iAttNum+1;
continue;
}
else
return 0;//不匹配
}
if (n!=0)
{
if(m_nPerformType==0)
return 1;
else
return n;
}
else
return 0;
}
bool CLieTestDlg::IsRuleAttAllNull(int row)
{//看规则row是否全为'-'.是就返回:true;否则返回false
for(int i=0;i<iAttNum;i++)
if(stricmp(pRuleTable[row][i],"-")!=0)
return false;
return true;
}
bool CLieTestDlg::IsTestAttAllNull()
{//看测试样本是否全为'-',yes return:true; else return failse
int k=0;
for(int i=0;i<iAttNum;i++)
{
if(iAttNumDeleted>k)
if(i==pAttDeleted[k])
{
k++;
continue;
}
if(stricmp(pTestData[i],"-")!=0)
return false;
}
return true;
}
void CLieTestDlg::OnConnectDb()
{
pDb=new CDatabase [1];
UpdateData(true);
CString strTableName="";
strTableName=m_table;
if(strTableName=="")
{
pDb->Close();//关闭数据库
AfxMessageBox("请输入数据表名称");
return;
}
//连接数据源,统计并显示相关信息
BOOL bStatus=false;//数据库是否成功打开标志
pDb->SetLoginTimeout(10); //设置连接超时属性值为10
try//连接数据库ODBC
{
bStatus=pDb->OpenEx(NULL);//打开对话框
if(bStatus)
{
TRACE("\n DB opened successfully");
// AfxMessageBox("数据源连接成功");
}
else
{
TRACE("\n open dsn failed\n");
AfxMessageBox("连接失败");
}
}
catch(CMemoryException *pEx)//处理内存错误
{
pDb->Close();//关闭数据库
pEx->ReportError();
}
catch(CDBException *pDBEx)//处理数据库异常
{
pDb->Close();//关闭数据库
pDBEx->ReportError();
TRACE("RetCode:%d strError:[%s] strStatus:[%s]\n",
pDBEx->m_nRetCode,
pDBEx->m_strError,
pDBEx->m_strStateNativeOrigin);
}
CRecordset Rst(pDb);//新建记录,指向数据表
m_sql="select * from "+strTableName;
BOOL flag=false;
try
{
flag=Rst.Open(CRecordset::dynaset,m_sql);//初始化数据表
}
catch(CDBException* e)
{
pDb->Close();//关闭数据库
e->Delete();
AfxMessageBox("数据库中没有发现数据表:"+strTableName);
return;
}
iAttNumber=Rst.GetODBCFieldCount()-1;//获得条件属性个数,(减掉ID,和决策属性)
iConNum=iAttNumber;//获得条件属性个数
if(iConNum!=m_iAttrNum)
{
AfxMessageBox("输入数据库文件条件属性数和\n规则的条件属性数不匹配!");
fout.close();//关闭文件
Rst.Close();//关闭数据表
pDb->Close();//关闭数据库
return;
}
else
{
AfxMessageBox("数据表连接成功");
}
int i;
CString *name=new CString [iConNum+1];
CODBCFieldInfo fieldinfo;
SWORD *style=new SWORD [iConNum+1];
for(i=0;i<iConNum+1;i++)
{
Rst.GetODBCFieldInfo(i,fieldinfo);
name[i]=fieldinfo.m_strName;
style[i]=fieldinfo.m_nSQLType;
}
iRecNum=0;
Rst.MoveFirst();
while(!Rst.IsEOF())
{
iRecNum++;
Rst.MoveNext();
}
recCount=iRecNum;
char TmpPath[_MAX_DIR],TmpFileNameIn[_MAX_DIR];
GetTempPath(_MAX_DIR,TmpPath);
/////////////输出到文本文件
//str="C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\"+strTableName+".txt";
str=TmpPath+strTableName+".txt";
strcpy(OutPath,str.GetBuffer(200));
fout.open(OutPath,ios::out|ios::trunc); //新建、打开文件
m_strFilePath=str;
int j;//循环变量
int tempcount=0; //以下写文件头
//输出文件头
if(m_bTest)
{
fout<<"Style:test"<<'\n'; //表示为规则文件
}
else
{
fout<<"Style:input"<<'\n'; //表示为规则文件
}
fout<<"Stage:0"<<'\n'; //为规则文件这个值无用
fout<<"Condition attributes number:"<<iAttNumber<<'\n';//条件属性个数
fout<<"Tests number: "<<iRecNum<<'\n';//行数
for(j=0;j<=iAttNumber;j++)
{
fout<<name[j]<<' ';
}
fout<<'\n';
for(j=0;j<iAttNumber;j++)
{
if((style[j]==-6)||(style[j]==3)||(style[j]==4)||(style[j]==5))
fout<<"Integer"<<' ';
else if ((style[j]==2)||(style[j]==6)||(style[j]==7)||(style[j]==8))
fout<<"Float"<<' ';
else fout<<"String"<<' ';
}
fout<<"Integer"<<' ';
fout<<'\n';
//以下写文件数据
Rst.MoveFirst();
CString strValue;
while(!Rst.IsEOF())
{
j=0;
while(j<Rst.GetODBCFieldCount())
{
Rst.GetFieldValue(j,strValue);
fout<<strValue<<" ";
j++;
}
fout<<'\n';
Rst.MoveNext();
}
//写入文件尾部 while(!fin)
fout.close();//关闭文件
Rst.Close();//关闭数据表
pDb->Close();//关闭数据库
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -