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

📄 rulemaintenance.cpp

📁 基于专家系统应用的程序代码 使用vc编程,access为数据库的程序
💻 CPP
字号:
// RuleMaintenance.cpp : implementation file
//

#include "stdafx.h"
#include "minedabse.h"
#include "RuleMaintenance.h"
#include "ircleDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CMineDabseApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CRuleMaintenance dialog


CRuleMaintenance::CRuleMaintenance(CWnd* pParent /*=NULL*/)
: CDialog(CRuleMaintenance::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRuleMaintenance)
	m_editAnd = _T("");
	m_editOr = _T("");
	factChain=new CFactChain();
	ruleChain=new RuleChain();
	//}}AFX_DATA_INIT
}


void CRuleMaintenance::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRuleMaintenance)
	DDX_Control(pDX, IDC_EDITOR, m_editor);
	DDX_Control(pDX, IDC_EDITAND, m_editand);
	DDX_Control(pDX, IDC_RADIOAND, m_radioAnd);
	DDX_Control(pDX, IDC_LISTRule, m_listRule);
	DDX_Text(pDX, IDC_EDITAND, m_editAnd);
	DDX_Text(pDX, IDC_EDITOR, m_editOr);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRuleMaintenance, CDialog)
//{{AFX_MSG_MAP(CRuleMaintenance)
ON_BN_CLICKED(IDC_RADIOOR, OnRadioor)
ON_BN_CLICKED(IDC_RADIOAND, OnRadioand)
ON_BN_CLICKED(IDC_BUTTONPRE, OnButtonpre)
ON_BN_CLICKED(IDC_BUTTONINSERT, OnButtoninsert)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRuleMaintenance message handlers

BOOL CRuleMaintenance::OnInitDialog() 
{
	CDialog::OnInitDialog();
	preCount=0;	
	for(int i=0;i<10;i++)
	{
		strPre[i]="";
		detectFlag[i]=0;
	}
	// TODO: Add extra initialization here
	m_listRule.InsertColumn(0,"规则名称",LVCFMT_LEFT,90);
	m_listRule.InsertColumn(1,"前提",LVCFMT_LEFT,55);
	m_listRule.InsertColumn(2,"结论",LVCFMT_LEFT,55);
	m_listRule.InsertColumn(3,"类型",LVCFMT_LEFT,60);
	int nItem;	
	try
	{
		m_pRecordset.CreateInstance("ADODB.Recordset");
		m_pRecordset->Open("SELECT * FROM rule",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
		while(!m_pRecordset->adoEOF)
		{
			vRuleName=m_pRecordset->GetCollect("ruleName");
			vPre = m_pRecordset->GetCollect("pre");
			vCon = m_pRecordset->GetCollect("con");
			vType = m_pRecordset->GetCollect("type");
			
			nItem=m_listRule.InsertItem(0xffff,(_bstr_t)vRuleName);	
			m_listRule.SetItem(nItem,1,1,(_bstr_t)vPre,NULL,0,0,0);
			m_listRule.SetItem(nItem,2,1,(_bstr_t)vCon,NULL,0,0,0);
			m_listRule.SetItem(nItem,3,1,(_bstr_t)vType,NULL,0,0,0);			
			m_pRecordset->MoveNext();
		}
		m_pRecordset->Close();
		m_listRule.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
	}
	catch(_com_error e)///捕捉异常
	{
		CString	str=e.ErrorMessage();
		str=str+"读取数据库失败!";
		AfxMessageBox(str);///显示错误信息
	}
	
	CheckRadioButton(IDC_RADIOAND,IDC_RADIOOR,IDC_RADIOAND);
	m_editAnd="";
	m_editOr="";
	UpdateData(false);
	
	
	return TRUE;  // return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}

void CRuleMaintenance::OnRadioor() 
{
	// TODO: Add your control notification handler code here
	CheckRadioButton(IDC_RADIOAND,IDC_RADIOOR,IDC_RADIOOR);
	m_editor.EnableWindow(true);
	m_editand.EnableWindow(false);	
}

void CRuleMaintenance::OnRadioand() 
{
	// TODO: Add your control notification handler code here
	CheckRadioButton(IDC_RADIOAND,IDC_RADIOOR,IDC_RADIOAND);
	m_editor.EnableWindow(false);
	m_editand.EnableWindow(true);
}

void CRuleMaintenance::OnButtonpre() 
{
	// TODO: Add your control notification handler code here	
	//multiPreDlg.OnInitDialog();
	int intRadio=GetCheckedRadioButton(IDC_RADIOAND,IDC_RADIOOR);
	if (IDC_RADIOAND==intRadio){
		multiPreDlg.DoModal();   
		showPre();
		for(int i=preCount;i>0;i--){
			m_editAnd+=" and "+strPre[i];
		}
		UpdateData(false);
	}
	else{
		multiPreOr.DoModal();
	}
}

void CRuleMaintenance::showPre(){
	
	UpdateData(true);	
	strPre[preCount]=m_editAnd;
	if (multiPreDlg.m_edit1.CompareNoCase("")!=0)
	{
		preCount++;
		strPre[preCount]=multiPreDlg.m_edit1;		
	}
	if (multiPreDlg.m_edit2.CompareNoCase("")!=0)
	{
		preCount++;
		strPre[preCount]=multiPreDlg.m_edit2;	
	}
	if (multiPreDlg.m_edit3.CompareNoCase("")!=0)
	{
		preCount++;
		strPre[preCount]=multiPreDlg.m_edit3;		
	}
	if (multiPreDlg.m_edit4.CompareNoCase("")!=0)
	{
		strPre[preCount]=multiPreDlg.m_edit4;
		preCount++;
	}
	if (multiPreDlg.m_edit5.CompareNoCase("")!=0)
	{
		preCount++;
		strPre[preCount]=multiPreDlg.m_edit5;
	}
	if (multiPreDlg.m_edit6.CompareNoCase("")!=0)
	{
		preCount++;
		strPre[preCount]=multiPreDlg.m_edit6;
	}
	if (multiPreDlg.m_edit7.CompareNoCase("")!=0)
	{
		preCount++;
		strPre[preCount]=multiPreDlg.m_edit7;
	}
	if (multiPreDlg.m_edit8.CompareNoCase("")!=0)
	{
		preCount++;
		strPre[preCount]=multiPreDlg.m_edit8;
	}		
	
}
void CRuleMaintenance::OnButtoninsert() 
{
	// TODO: Add your control notification handler code here		
	//////////////////////////////////////
	CString ruleName,rulePre,ruleCon;
	//	_variant_t vRuleName,vRulePre,vRuleCon;
	showPre();
	bool equalFlag=false;
	try
	{
		m_pRecordset.CreateInstance("ADODB.Recordset");
		m_pRecordset->Open("SELECT * FROM rule",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);		
		while(!m_pRecordset->adoEOF)
		{
			ruleName=(char*)(_bstr_t)m_pRecordset->GetCollect("ruleName");
			rulePre=(char*)(_bstr_t)m_pRecordset->GetCollect("pre");
			ruleCon=(char*)(_bstr_t)m_pRecordset->GetCollect("con");
			ruleChain->appendRule(ruleName,rulePre,ruleCon,false);
			m_pRecordset->MoveNext();
		}
		m_pRecordset->Close();	
	}
	catch(_com_error e)///捕捉异常
	{
		CString	str=e.ErrorMessage();
		str=str+"读取数据库失败!";
		AfxMessageBox(str);///显示错误信息
	}
	
	int recordCount=0;
	RuleNode* node=ruleChain->getFirstRule();	
	while (node!=NULL){
		ruleName=node->name;
		rulePre=node->premise;
		ruleCon=node->conclusion;
		recordCount++;
		///	///////////////			
		CString pre_str[10],rulePreTemp;//存放规则前提,
		int findAndFlag,i=-1;
		bool loopEnd=false;
		rulePreTemp=rulePre;
		findAndFlag=rulePreTemp.Find("and");
		//if (findAndFlag>0){	
		while (!loopEnd){						
			if (findAndFlag!=-1){
				//	while(rulePre->GetLength()>0){
				i++;
				pre_str[i]=rulePreTemp.Left(findAndFlag);
				pre_str[i].TrimLeft();
				pre_str[i].TrimRight();
				//	rulePreTemp.TrimLeft();
				rulePreTemp.Delete(0,findAndFlag+3);				
				//}
			}
			else {						
				i++;
				pre_str[i]=rulePreTemp;
				pre_str[i].TrimLeft();
				pre_str[i].TrimRight();
				loopEnd=true;      				
			}		
			findAndFlag=rulePreTemp.Find("and");//分离多个前提,findAndFlag记录and的位置
		}//	while (!loopEnd)
		 /*}//if(findAndFlag>0)
		 else{
		 i++;
		 pre_str[i]=rulePreTemp;
		 pre_str[i].TrimLeft();
		 pre_str[i].TrimRight();
	}*/
		//////////////////////////////
		int equalNum=-1;
		if (preCount==i){///规则等价判断
			for(int j=preCount;j>=0;j--){
				for(int k=i;k>=0;k--){
					if(0==detectFlag[i])
						if (strPre[j].CompareNoCase(pre_str[k])==0){
							detectFlag[k]=1;			
							equalNum++;
							break;
						}
				}							
			}		
			if (equalNum==preCount)
			{//输出等价
				//CString messageStr,str="该规则和规则库中第%d条冲突!";
				//	messageStr.Format(str,recordCount);
				PreEqualError preEqualError;						
				preEqualError.m_edit1.Format("%d",recordCount);
				preEqualError.m_edit2.Format("%d",recordCount);						
				preEqualError.DoModal();
				equalFlag=true;
				break;
			}
		}//	if (preCount==i	)///规则等价判断					
		/////////////////////	
		factChain->appendFact(rulePre);	
		node=node->next;
	}
	
    	CircleDlg circleDlg;
	   circleDlg.m_eidt1="6";
	   circleDlg.DoModal();

	///////////////////////////////////////////////////////////////////
	if (!equalFlag){//不等价,则判断有无循环
		CString ruleCon1;
		RuleNode* nodeRule=ruleChain->getFirstRule();	
		recordCount=0;
		while (nodeRule!=NULL){
			CString pre_str[10],rulePreTemp;//存放规则前提,
			int findAndFlag,i=-1;
			bool loopEnd=false;
			rulePreTemp=nodeRule->premise;
			ruleCon1=nodeRule->conclusion;
			findAndFlag=rulePreTemp.Find("and");		
			while (!loopEnd){						
				if (findAndFlag!=-1){
					//	while(rulePre->GetLength()>0){
					i++;
					pre_str[i]=rulePreTemp.Left(findAndFlag);
					pre_str[i].TrimLeft();
					pre_str[i].TrimRight();
					//	rulePreTemp.TrimLeft();
				rulePreTemp.Delete(0,findAndFlag+3);				
				//}
			}
			else {						
				i++;
				pre_str[i]=rulePreTemp;
				pre_str[i].TrimLeft();
				pre_str[i].TrimRight();
				loopEnd=true;      				
			}		
			findAndFlag=rulePreTemp.Find("and");//分离多个前提,findAndFlag记录and的位置
			}//	while (!loopEnd)
		//推理	
			int temp_int=i;
			int matchResult=-1;//每次匹配初始化0
			for(;i>=0;i--){
				CFact* node=factChain->getHead();	
				while (node!=NULL){
					//	CString	factName=node->name;
					//	fact=node->fact;	
					if(0==node->fact.Compare(pre_str[i])){			
						matchResult++;//匹配成功
						break;
					}
					else{//找出下一个事实			
						node=node->next;
						if(NULL==node)//没有匹配的事实
							i=-2;//没有匹配规则的事实,匹配结束,i值取除-1的负数
					}		
				}//while(node!=NULL)	
			}//for(;i>=0;i--)
			
			if(matchResult==temp_int){//相等则表示匹配成功
				//从事实列表中删出匹配成功的事实
				for(;temp_int>=0;temp_int--){
					CFact*	node=factChain->getHead();
					while (node!=NULL){
						//	CString	factName=*node->name;
						if(0==node->fact.CompareNoCase(pre_str[temp_int])){			
							factChain->deleteFact(node->fact);
							break;
						}
						else{
							//找出下一个事实			
							node=node->next;
							if(NULL==node)//没有匹配的事实
								break;
						}		
					}//while		
				}//for(;temp_int>=0;temp_int--)
				//把结论加入事实列表中				
				factChain->appendFact(ruleCon1);			
			}//if(matchResult==temp_int)
		}///while (nodeRule!=NULL)
       CircleDlg circleDlg;
	   circleDlg.m_eidt1="6";
	   circleDlg.DoModal();

	}
	
	////////////////

	////////////////////////////////////////////////////////////////
	
	
}

⌨️ 快捷键说明

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