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

📄 lietestdlg.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				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 + -