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

📄 minedabseview.cpp

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

#include "stdafx.h"
#include "mineDabse.h"

#include "mineDabseDoc.h"
#include "mineDabseView.h"
extern CMineDabseApp theApp;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMineDabseView
IMPLEMENT_DYNCREATE(CMineDabseView, CView)

BEGIN_MESSAGE_MAP(CMineDabseView, CView)
	//{{AFX_MSG_MAP(CMineDabseView)
	ON_COMMAND(ID_MENU_NETINPUT, OnMenuNetinput)	
	ON_COMMAND(ID_GAS_DETECT, OnGasDetect)
	ON_COMMAND(ID_MAINBLOWER, OnMainblower)
	ON_COMMAND(ID_LOCALBLOWER, OnLocalblower)
	ON_COMMAND(ID_JueJinFengLiang, OnJueJinFengLiang)
	ON_COMMAND(ID_HuiCaiFengLiang, OnHuiCaiFengLiang)
	ON_COMMAND(ID_AUTODETECT, OnAutodetect)
	ON_COMMAND(ID_MENUITEMJIESUAN, OnMenuitemjiesuan)
	ON_COMMAND(ID_KNOWLEGEBASE, OnKnowlegebase)
	ON_BN_CLICKED(IDC_BUTTONPRE, OnButtonpre)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMineDabseView construction/destruction
CMineDabseView::CMineDabseView()
{
	// TODO: add construction code here
   ruleChain=new RuleChain();
   factChain=new CFactChain();
  // showResultDlg.m_editShow="";
   str_showText="";
}

CMineDabseView::~CMineDabseView()
{
	delete ruleChain;
}

BOOL CMineDabseView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMineDabseView drawing

void CMineDabseView::OnDraw(CDC* pDC)
{
	CMineDabseDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
//	pDC->TextOut(0,0,"诊断结果");
    //pDC->TextOut(10,10,str_showText);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMineDabseView printing

BOOL CMineDabseView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMineDabseView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMineDabseView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMineDabseView diagnostics

#ifdef _DEBUG
void CMineDabseView::AssertValid() const
{
	CView::AssertValid();
}

void CMineDabseView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMineDabseDoc* CMineDabseView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMineDabseDoc)));
	return (CMineDabseDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMineDabseView message handlers

void CMineDabseView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
;
}

void CMineDabseView::OnMenuNetinput() 
{
	// TODO: Add your command handler code here
	mineWindDlg=new CMineWindDlg();
	mineWindDlg->DoModal();

}

void CMineDabseView::OnAutodetect() 
{
	// TODO: Add your command handler code here	
	//  读取rule
	CString ruleName,rulePre,ruleCon;
//	_variant_t vRuleName,vRulePre,vRuleCon;
	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 i=0;
	try
	{
		m_pRecordset.CreateInstance("ADODB.Recordset");
		m_pRecordset->Open("SELECT * FROM fact",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);		
		CString fact;//factName,
		while(!m_pRecordset->adoEOF)
		{
			//factName[i]=(char*)(_bstr_t)m_pRecordset->GetCollect("id");
			fact=(char*)(_bstr_t)m_pRecordset->GetCollect("fact");		
			factChain->appendFact(fact);		
			showResultDlg.m_editShow+=fact+"\r\n";
			//	i++;
			m_pRecordset->MoveNext();
		}
		m_pRecordset->Close();	
	}
	catch(_com_error e)///捕捉异常
	{
		CString	str=e.ErrorMessage();
		str=str+"读取数据库失败!";
		AfxMessageBox(str);///显示错误信息
	}
	//推理
	RuleNode* node=ruleChain->getFirstRule();
	while (node!=NULL){
		ruleName=node->name;
		rulePre=node->premise;
		ruleCon=node->conclusion;
		if(!findCon(ruleName,rulePre,ruleCon)){
			//该规则没有触发,查找下一条规则
			node=node->next;
		//	if(NULL==node)//没有任何规则匹配,结束推理
		//		break;					
		}		
		else{
			//findCon在事实列表中查找,有匹配的规则,该规则标志为真,
			//删除匹配事实并且把结论加入事实列表中,
			//	重新检查,是否有匹配的事实和规则
			node=ruleChain->getFirstRule();		
		}
	}//while

////推理完毕,输出事实列表中的结论
	//showResultDlg.m_listCtr
	CFact* nodeFact=factChain->getHead();
	
	while(nodeFact!=NULL){//只显示推理结论
		// showResultDlg.m_editShow+=nodeFact->fact;
		//str_showText+="\r\n"+nodeFact->fact;
		showResultDlg.m_showResult+=nodeFact->fact+"\r\n";
		nodeFact=nodeFact->next;
	}
	UpdateData(false);
	showResultDlg.DoModal();
    showResultDlg.m_showResult="";
	showResultDlg.m_editShow="";
}

bool CMineDabseView::findCon(CString ruleName,CString rulePre,CString con)
{
	CString pre_str[10],pre_str1[10],rulePreTemp;//存放规则前提, pre_str1[10]存放or的前提条件
	int i,j,temp_int,findAndFlag,findOrFlag,matchResult;
	bool loopEnd=false;
	findAndFlag=0;
	findOrFlag=0;
	j=i=-1;//只能是-1;为了和matchResult=-2相对应
	rulePreTemp=rulePre;
	findAndFlag=rulePreTemp.Find("and");
	findOrFlag=rulePreTemp.Find("or");
	if (findOrFlag!=-1)
		matchResult=-2;//每次匹配初始化,有or关键字,需要匹配前提or一次
	else matchResult=-1;
//	if ((findAndFlag>0)||(-1==findOrFlag)){	
		while (!loopEnd){		
			findAndFlag=rulePreTemp.Find("and");//分离多个前提,findAndFlag记录and的位置
			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 {			
				if(-1==findOrFlag){//前提中无论有没有and,都要执行这句
					i++;
					pre_str[i]=rulePreTemp;
					pre_str[i].TrimLeft();
					pre_str[i].TrimRight();
					loopEnd=true;      
				}
				else{            
					rulePreTemp.TrimLeft();
					rulePreTemp.Delete(0,rulePreTemp.Find("(")+1);
					findOrFlag=rulePreTemp.Find("or");
					while(!loopEnd){	//提取or的关键字			
						if(findOrFlag!=-1){
							j++;
							pre_str1[j]=rulePreTemp.Left(findOrFlag);
							pre_str1[j].TrimLeft();
							pre_str1[j].TrimRight();
							//rulePreTemp.TrimLeft();
							rulePreTemp.Delete(0,findOrFlag+2);
							findOrFlag=rulePreTemp.Find("or");
						}
						else{
							j++;
							pre_str1[j]=rulePreTemp;
							pre_str1[j].TrimLeft();
							pre_str1[j].TrimRight();
							int temp_int=pre_str1[j].Find(")");
							pre_str1[j].Delete(temp_int);
							loopEnd=true;						
						}						
					}
			}					
		}
	}//	while (!loopEnd)
	/*}//if(findAndFlag>0)
	else{
	
	
	
	
	}*/
///在事实列表中匹配该规则前提
	temp_int=i;	
	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=-1;//没有匹配规则的事实,匹配结束
		}		
	}//while(node!=NULL)	
	}//for(;i>=0;i--)	
	int temp_intJ=j;
	for(;j>=0;j--){
	CFact* node=factChain->getHead();	
	while (node!=NULL){
	//	CString	factName=node->name;
	//	fact=node->fact;	
		if(0==node->fact.Compare(pre_str1[j])){			
		    matchResult++;//匹配成功
			j=-1;//or关键字中有一个匹配,则匹配结束
		}
		else{
			//找出下一个事实			
			node=node->next;
			if(NULL==node)//没有匹配的事实
				j=-1;//没有匹配规则的事实,匹配结束
		}		
	}//while(node!=NULL)	
	}//for(;i>=0;i--)	

	if(matchResult==temp_int){//相等则表示and匹配成功
		//从事实列表中删出匹配成功的事实
		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(pre_str[temp_int]);
				//	break;
			//	}
			//	else{
					//找出下一个事实			
			//		node=node->next;
				//	if(NULL==node)//没有匹配的事实
				//		break;
				//}		
			//}//while		
		}//if(matchResult==temp_int)
		for(;temp_intJ>=0;temp_intJ--){
			factChain->deleteFact(pre_str1[temp_intJ]);		
		}

		//把结论加入事实列表中		
		factChain->appendFact(con);
	    //showResultDlg.m_editShow+=con+"\r\n";//显示推理过程 
	//	str_showText+=con;
	//	RuleNode *nodep;
//		InvalidateRect(NULL);
        setRuleFlag(*ruleChain->getFirstRule(),ruleName);
		return true;
	}
	else return false;
}


void CMineDabseView::OnGasDetect() 
{
	// TODO: Add your command handler code here
	
}

void CMineDabseView::OnMainblower() 
{
	// TODO: Add your command handler code here
	
}

void CMineDabseView::OnLocalblower() 
{
	// TODO: Add your command handler code here
	
}

void CMineDabseView::OnJueJinFengLiang() 
{
	// TODO: Add your command handler code here
	
}

void CMineDabseView::OnHuiCaiFengLiang() 
{
	// TODO: Add your command handler code here
	
}

void CMineDabseView::setRuleFlag(RuleNode &head, CString ruleName)
{
   RuleNode *pRule=&head;
   while (pRule!=NULL){
	   if(0==pRule->name.CompareNoCase(ruleName))
	   {
		   pRule->flag=true;
		   break;
	   }	   
	   else
		   pRule=pRule->next;
   }
}

void CMineDabseView::OnMenuitemjiesuan() 
{
	// TODO: Add your command handler code here
	////////////////////////////////////////////////////////////////////////////////  
   //找出回路
  // if (m_intArcNum>0)//弧的个数
	   inputWeight.DoModal();
}

void CMineDabseView::OnKnowlegebase() 
{
	// TODO: Add your command handler code here
	ruleMaintenance.DoModal();
}

void CMineDabseView::OnButtonpre() 
{
	// TODO: Add your control notification handler code here
	//	multiPreDlg.DoModal();
}

⌨️ 快捷键说明

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