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

📄 weightinput.cpp

📁 基于专家系统应用的程序代码 使用vc编程,access为数据库的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	    strSql.Format(str,m_strVexTail);
		m_pRecordset->Open(strSql.AllocSysString(),_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
		_variant_t vOrderNum;
		
		while(!m_pRecordset->adoEOF)
		{		
			vOrderNum = m_pRecordset->GetCollect("id");	
			strId=vOrderNum.iVal;			
			m_pRecordset->MoveNext();
		}
		m_pRecordset->Close();
		m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
	}
	catch(_com_error e){
		AfxMessageBox(e.ErrorMessage());
	}*/
    int row1=locateVex(Net,m_strVexTail);
	int column1=locateVex(Net,m_strVexHead);
	
    if(row1!=-1&&column1!=-1)	  
	{
		Net.arcs[row1][column1].fengZu=m_fengZu;
		Net.arcs[row1][column1].fengLiang=m_fengLiang;
		G.arcs[row1][column1].fengZu=G.arcs[column1][row1].fengZu=1;
		Net.arcs[row1][column1].xieLv=m_xieLv;
		Net.arcs[row1][column1].fengYa=m_fengYa;
	}
	else {             //输入点有不是图中的节点;报错  
		return;
	}
	int intfzlxRadio=GetCheckedRadioButton(IDC_RADIOFJ,IDC_RADIOYB);
	if(IDC_RADIOFJ==intfzlxRadio)//分支类型,风机 
	{
		Net.arcs[row1][column1].intArcType=0;
        G.arcs[row1][column1].intArcType=0; 
		m_leiXing=0;
	}
	else
		if(intfzlxRadio==IDC_RADIOGD)//分支类型,固定
		{
			Net.arcs[row1][column1].intArcType=1;
			G.arcs[row1][column1].intArcType=1;
			m_leiXing=1;
		}
		else //分支类型,一般
		{
			Net.arcs[row1][column1].intArcType=2;	
			G.arcs[row1][column1].intArcType=2;
			m_leiXing=2;
		}
}


void CWeightInput::OnInsert() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	//在图中查找头结点和尾结点 
	////应该判断插入的巷道是否存在????????????????????
	/*if(listCount=Net.arcNum)
	{
	//CDialog::OnOK();
	AfxMessageBox("巷道信息已经输入完毕!\r\n不能再输入!",MB_OK);
	return;
}*/
	
	initNet();	//插入记录
	CString str,strSql;	
	str="insert into netDiagram(arcTail,arcHead,fengZu,fengLiang,leiXing,fengYa,xieLv) values (%s,%s,%f,%f,%f,%d,%f)";
	strSql.Format(str,m_strVexTail,m_strVexHead,m_fengZu,m_fengLiang,m_leiXing,m_fengYa,m_xieLv);
	theApp.m_pConnection->Execute(strSql.AllocSysString(),NULL,adOptionUnspecified);
    //插入的记录显示到list中
	/* try  {
	  	m_pRecordset->Open("SELECT * FROM netDiagram",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
		
		  int nItem;
		  m_list.DeleteAllItems();
		  while(!m_pRecordset->adoEOF)
		  {
		  vArcTail = m_pRecordset->GetCollect("arcTail");
		  vArcHead = m_pRecordset->GetCollect("arcHead");
		  vFengLiang = m_pRecordset->GetCollect("fengLiang");
		  vFengYa = m_pRecordset->GetCollect("fengYa");
		  vFengZu=m_pRecordset->GetCollect("fengZu");
		  vLeiXing = m_pRecordset->GetCollect("leiXing");
		  vXieLv=m_pRecordset->GetCollect("xieLv");
		  nItem=m_list.InsertItem(0xffff,(_bstr_t)vArcTail);		
		  m_list.SetItem(nItem,1,1,(_bstr_t)vArcHead,NULL,0,0,0);
		  m_list.SetItem(nItem,2,1,(_bstr_t)vFengZu,NULL,0,0,0);
		  m_list.SetItem(nItem,3,1,(_bstr_t)vFengLiang,NULL,0,0,0);
		  m_list.SetItem(nItem,4,1,(_bstr_t)vFengYa,NULL,0,0,0);			
		  m_list.SetItem(nItem,5,1,(_bstr_t)vLeiXing,NULL,0,0,0);
		  m_list.SetItem(nItem,6,1,(_bstr_t)vXieLv,NULL,0,0,0);
		  m_pRecordset->MoveNext();
		  }
		  m_pRecordset->Close();
		  }
		  catch(_com_error e)///捕捉异常
		  {
		  CString	str=e.ErrorMessage();
		  str=str+"读取数据库失败!";
		  AfxMessageBox(str);///显示错误信息
}*/
	int nItem;
	vHDName=m_hdmc;
	vArcTail =m_strVexTail;
	vArcHead =m_strVexHead;
	vFengLiang =m_fengLiang;
	vFengYa =m_fengYa;
	vFengZu=m_fengZu;
	vLeiXing=long(m_leiXing);
	vXieLv=m_xieLv;	//vId.lVal=vId.lVal+1;
	
	nItem=m_list.InsertItem(0xffff,(_bstr_t)vHDName);	
	m_list.SetItem(nItem,1,1,(_bstr_t)vArcTail,NULL,0,0,0);
	m_list.SetItem(nItem,2,1,(_bstr_t)vArcHead,NULL,0,0,0);
	m_list.SetItem(nItem,3,1,(_bstr_t)vFengZu.fltVal,NULL,0,0,0);
	m_list.SetItem(nItem,4,1,(_bstr_t)vFengLiang,NULL,0,0,0);
	m_list.SetItem(nItem,5,1,(_bstr_t)vFengYa,NULL,0,0,0);			
	m_list.SetItem(nItem,6,1,(_bstr_t)vLeiXing,NULL,0,0,0);
	m_list.SetItem(nItem,7,1,(_bstr_t)vXieLv,NULL,0,0,0);
	
	m_strVexTail="";
	m_strVexHead="";
	m_fengYa=0;
	m_xieLv=0;
	m_fengZu=0;
	m_fengLiang=0;
	m_hdmc="";
	
	UpdateData(false);
	int listCount=m_list.GetItemCount();
	if(listCount>=Net.arcNum)
	{
		m_insert.EnableWindow(false);
		m_caculate.EnableWindow(true);
	}
	//  inputCount++; //输入弧值的个数
	/*	if(m_list.GetItemCount()>=Net.arcNum)
	{
	CDialog::OnOK();
	return;
}*/
	m_vexTail.SetFocus();
}

CString CWeightInput::NameToId(CString name)
{
	int  intId;
	CString strId="";
	try{
		CString str="SELECT * FROM vexTable where vexName='%s'",strSql;
	    strSql.Format(str,name);
		m_pRecordset.CreateInstance("ADODB.Recordset");	
		m_pRecordset->Open(strSql.AllocSysString(),_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
		_variant_t vOrderNum;		
		while(!m_pRecordset->adoEOF)
		{		
			vOrderNum = m_pRecordset->GetCollect("id");	
			intId=vOrderNum.iVal;			
			m_pRecordset->MoveNext();
		}
		m_pRecordset->Close();
		m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
	}
	catch(_com_error e){
		AfxMessageBox(e.ErrorMessage());
	}
//	CString str="";;
    strId.Format("%d",intId);
    return strId;
}
void CWeightInput::OnCaculate() 
{
	 //arcNum=m_intArcNum;
	//arcNum=getArcNum();//得到弧的个数
	//vexNum=getVexNum();//得到头结点的个数
	int countLine,row_int,column_int,type,intRoad=0;//intRoad表示回路数;
	CString strName,tailHead[MAX_VERTEX_NUM/2][2];//存放余树枝,[][0]放尾结点,[][1]放头结点
	//countLine=m_inputVexValue.GetLineCount();  //顶点的值,IDC_INPUTVEX中的行数
	// Dump every line of text of the edit control.	
	////////////////////////////////////////////////////////////////////
	//初始化NET,G
	try
	{
		m_pRecordset.CreateInstance("ADODB.Recordset");
		m_pRecordset->Open("SELECT * FROM netDiagram",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
		//	m_bSuccess = TRUE;	
		while(!m_pRecordset->adoEOF)
		{
			vHDName=m_pRecordset->GetCollect("laneWayName");
			vArcTail = m_pRecordset->GetCollect("arcTail");
			vArcHead = m_pRecordset->GetCollect("arcHead");
			vFengLiang = m_pRecordset->GetCollect("fengLiang");
			vFengYa = m_pRecordset->GetCollect("fengYa");
			vFengZu=m_pRecordset->GetCollect("fengZu");
			vLeiXing = m_pRecordset->GetCollect("leiXing");
			vXieLv=m_pRecordset->GetCollect("xieLv");		
			//////////////////			
		//	row_int=locateVex(Net,NameToId((BSTR)vArcTail.pbstrVal));
			row_int=locateVex(Net,(BSTR)vArcTail.pbstrVal);
			column_int=locateVex(Net,(BSTR)vArcHead.pbstrVal);	
			/////////////////////
			if(row_int>=0 && column_int>=0){
				Net.arcs[row_int][column_int].fengZu=vFengZu.fltVal;
				Net.arcs[row_int][column_int].fengLiang=vFengLiang.fltVal;
				G.arcs[row_int][column_int].fengZu=G.arcs[column_int][row_int].fengZu=1;
				Net.arcs[row_int][column_int].xieLv=vXieLv.fltVal;
				Net.arcs[row_int][column_int].fengYa=vFengYa.fltVal;
				Net.arcs[row_int][column_int].intArcType=vLeiXing.iVal;
				Net.arcs[row_int][column_int].hdmc=vHDName.bstrVal;////
			}
			m_pRecordset->MoveNext();
		}
		m_pRecordset->Close();
		m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
	}
	catch(_com_error e)///捕捉异常
	{
		CString	str=e.ErrorMessage();
		str=str+"读取数据库失败!";
		AfxMessageBox(str);///显示错误信息
	}
	//////////////////////////////////////
	//找回路个数		
	for( row_int=0;row_int<m_vexNum;row_int++)
		for(column_int=0;column_int<m_vexNum;column_int++){
			type=getType(row_int,column_int);
			if(0==type)
			{//如果分支为风机分支
				tailHead[intRoad][0]=getVex(row_int);
				tailHead[intRoad][1]=getVex(column_int);
				setNull(row_int,column_int);//设置图的对应边为空
				intRoad++;
			}
			else 
				if (1==type){//如果分支为固定分支			  
					tailHead[intRoad][0]=getVex(row_int);
					tailHead[intRoad][1]=getVex(column_int);
					setNull(row_int,column_int);//设置图的对应边为空
					intRoad++;
				}
		}
		
		int intTemp=m_arcNum-m_vexNum+1-intRoad;//arcNum-vexNum+1 回路数
		for(int k=0;k<intTemp;k++) 
		{//找一般分支中分阻大的直到找够回路数;剩下的分支构成生成树
			int rowTemp=-1,columnTemp=-1;
			float maxTemp=0;
			for( row_int=0;row_int<m_vexNum;row_int++)
				for(column_int=0;column_int<m_vexNum;column_int++)
				{
					if (getGraghValue(row_int,column_int)==1)
					{//
						//if (rowTemp!=-1)
						//{
						if(getFuZu(row_int,column_int)&&getFuZu(row_int,column_int)>maxTemp)
						{
							rowTemp=row_int;
							columnTemp=column_int;
							maxTemp=getFuZu(row_int,column_int);
						}
						// }
						//else
						//{
						//   rowTemp=row_int;
						//   columnTemp=column_int;
						//}			
					}
				}
				tailHead[intRoad][0]=getVex(rowTemp);
				tailHead[intRoad][1]=getVex(columnTemp);
				setNull(rowTemp,columnTemp);//设置无向图的对应边为空
				intRoad++;
		}
		
		//////////////加边生成回路
		//TailHead存放余树枝[][0]放尾结点,[][1]放头结点
		CString headNodestr,tailNodestr;
		for(int i=0;i<intRoad;i++)
		{
			headNodestr=tailHead[i][1];
			tailNodestr=tailHead[i][0];
			findRoad(headNodestr,tailNodestr,i);
		}
		
		//////////////////////////////////////////////////////
		//网络解算			
		int loopNum=m_arcNum-m_vexNum+1;
		//loopNum回路个数
		float fengLiang=0,fenZi=0,fenMu=0,fengZu=0,fengLiangXiuZheng=1;
		int index=loopNum-1;
		row_int=0;
		column_int=0;
		while (fabs(fengLiangXiuZheng)>=0.001){				
			//char *aa=new char[];
			//	aa[0]='0';
			//	aa="sdfasd";
			//	aa[0]='d';//出错!!!
		//	loopColumn=0;
			//loopColumn=loop[index][1].GetLength();
			for(int j=0;j<loopColumnNum[index];j++){
				row_int=locateVex(Net,loop[index][j]);		
				column_int=locateVex(Net,loop[index][j+1]);
				//取[row_int][column_int]弧的信息
				//风阻初始化为负值,根据分支风阻值的正负可判断分支流向和回路流向是否相同				
				if(getFuZu(row_int,column_int)>=0){
					fengLiang=getNetFengLiang(row_int,column_int);
					fengZu=getFuZu(row_int,column_int);
				}
				else{
					fengLiang=getNetFengLiang(column_int,row_int);
					fengZu=-getFuZu(column_int,row_int);
				}
				fenZi+=fengZu*fengLiang*fengLiang;
				fenMu+=fabs(fengZu*fengLiang);
			}
			if(getFengYa(row_int,column_int))//风机分支
			{
				fengLiangXiuZheng=-(fenZi-getFengYa(row_int,column_int))/(2*fenMu-getXieLv(row_int,column_int));//风量修正值				
				
			}
			else
				fengLiangXiuZheng=-fenZi/(2*fenMu);//风量修正值
			//分子和分母初始化
			fenZi=fenMu=0;
			//计算回路中各分支的风量修正值
			for(j=0;j<loopColumnNum[index];j++){
				row_int=locateVex(Net,loop[index][j]);		
				column_int=locateVex(Net,loop[index][j+1]);
				//取[row_int][column_int]弧的信息
				//风阻初始化为负值,根据分支风阻值的正负可判断分支流向和回路流向是否相同
				if(getFuZu(row_int,column_int)>=0){
					setNetFengLiang(row_int,column_int,fengLiangXiuZheng);
				}
				else{
					setNetFengLiang(column_int,row_int,-fengLiangXiuZheng);
				}
			}		
			index--;
			if(index<0)
				index=loopNum-1;
			if (getFengYa(row_int,column_int)){
				float fFengYa=5488+getXieLv(row_int,column_int)*getNetFengLiang(row_int,column_int);
                setFengYa(row_int,column_int,fFengYa);				
			}			
		}//	while (fabs(fengLiangXiuZheng)>=0.001)
		////////////////
		///输出网络计算结果
		showNetResult.m_showEdit="";
		CString strTemp;
		float fTemp;
		for( row_int=0;row_int<m_vexNum;row_int++)
			for(column_int=0;column_int<m_vexNum;column_int++)
			{
				if(Net.arcs[row_int][column_int].hdmc!="")
				if(Net.arcs[row_int][column_int].fengZu>0){
					strTemp="";
					showNetResult.m_showEdit+="巷道"+Net.arcs[row_int][column_int].hdmc+"的风量值:";
					fTemp=Net.arcs[row_int][column_int].fengLiang;
					strTemp.Format("%f",fTemp);
					showNetResult.m_showEdit+=strTemp;
                    //if(Net.windDirection[row_int]){					
						showNetResult.m_showEdit+="  风流的方向是从"+Net.vexs[row_int]+"到"+Net.vexs[column_int]+"\r\n\r\n";
					//}
					//else
					//	showNetResult.m_showEdit+="  风流的方向是从"+Net.vexs[column_int]+"到"+Net.vexs[row_int]+"\r\n\r\n";

			}
				
			}
		showNetResult.DoModal();
			
} 
 
 
void CWeightInput::findRoad(CString headNode, CString tailNode, int index)
{//index表示回路序号0,1,2......
	 int row_int,column_int,loopColumn=0,loop_column=-1;
	 CString tempNode;
	 CStack* stack=new CStack();
	 stack->push(headNode);
	 row_int=locateGVex(headNode);
	 Net.visited[row_int]=true;
	 bool popFlag=true;
	 while(!stack->empty()||!popFlag)//栈为空和出栈标志为真时,结束 
	 {	   
		 if (popFlag)
		 {
			 tempNode=stack->pop();
			 loop_column++;
			 loop[index][loop_column]=tempNode;			 
		 }
		 else {			 
			 loop[index][loop_column]="";
			 loop_column--;
			 tempNode=loop[index][loop_column];  
		 }
		// int j=loop[index].GetLength();
		 if(tempNode.Compare(tailNode)==0)
		 {//构成回路,函数结束
			 loop_column++;
			 loop[index][loop_column]=headNode;
			 loopColumnNum[index]=loop_column;
			 stack->destroyStack();
			 for (row_int=0;row_int <m_vexNum;row_int++)
				 Net.visited[row_int]=false;
			 return;
		 }
		 row_int=locateGVex(tempNode);
		 //在无向图中查找结点headNode的位置
		 bool findFlag=false;
		 //   findFlag标志表示当headNode有邻结点时为真,
		 //	   否则为假该节点不是回路中的,loop清除该节点
		 for(column_int=0;column_int<m_vexNum;column_int++)
		 {		  
			 if (getGraghValue(row_int,column_int)==1&&!Net.visited[column_int])
			 {
				 stack->push(getVex(column_int));
				 Net.visited[column_int]=true;
				 findFlag=true;
				 break;
			 }
		 }
		 if(!findFlag)
		 {
			 ///	   loopColumn++;
			 // }
			 // else
			 // //{						
			 popFlag=false;
			 // loopColumn--;		   		  	   		   
		 }
		 else{
			 popFlag=true;
		 }
	 }
	 
	 
}

⌨️ 快捷键说明

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