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

📄 mysource.cpp

📁 给定一个布线的要求
💻 CPP
字号:
// mysource.cpp : implementation file
//

#include "stdafx.h"
#include "SwitchBox.h"
#include "mysource.h"

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

/////////////////////////////////////////////////////////////////////////////
// CInputDlg dialog


CInputDlg::CInputDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CInputDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CInputDlg)
	m_sSequence = _T("");
	m_nDown = 0;
	m_nLeft = 0;
	m_nRight = 0;
	m_nUp = 0;
	//}}AFX_DATA_INIT
	m_strDir="\0";
}


void CInputDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CInputDlg)
	DDX_Control(pDX, IDC_LIST1, m_list);
	DDX_Text(pDX, IDC_ARR, m_sSequence);
	DDX_Text(pDX, IDC_DOWN, m_nDown);
	DDX_Text(pDX, IDC_LEFT, m_nLeft);
	DDX_Text(pDX, IDC_RIGHT, m_nRight);
	DDX_Text(pDX, IDC_UP, m_nUp);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CInputDlg, CDialog)
	//{{AFX_MSG_MAP(CInputDlg)
	ON_BN_CLICKED(IDC_LOAD, OnLoad)
	ON_BN_CLICKED(IDC_CHECKANDSAVE, OnCheckAndSave)
	ON_BN_CLICKED(IDC_FINDDIR, OnFindDir)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInputDlg message handlers
/////////////////////////////////////////////////////////////////////////////
// CTimeSet dialog


CTimeSet::CTimeSet(CWnd* pParent /*=NULL*/)
	: CDialog(CTimeSet::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTimeSet)
	m_time = 0.0;
	//}}AFX_DATA_INIT
	m_time=0.0;
}


void CTimeSet::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTimeSet)
	DDX_Text(pDX, IDC_TIME, m_time);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTimeSet, CDialog)
	//{{AFX_MSG_MAP(CTimeSet)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTimeSet message handlers
/////////////////////////////////////////////////////////////////////////////
// CSeqStack

IMPLEMENT_DYNCREATE(CSeqStack, CCmdTarget)

CSeqStack::CSeqStack()
{
}

CSeqStack::~CSeqStack()
{
}


BEGIN_MESSAGE_MAP(CSeqStack, CCmdTarget)
	//{{AFX_MSG_MAP(CSeqStack)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSeqStack message handlers

CSeqStack::SeqStack(int x)
{
	height = 0; 
	top = -1; 
	maxsize = x;  
	elements = new int[x];
	arr=new int[x];
	arr2=new int[x];
}

void CSeqStack::PushStack(int x)	//出栈
{
	if(IsFullStack()) 
		AfxMessageBox("The stack is full!"); 
	else 
	{	elements[++top] = x; height++;  }
}

int CSeqStack::PopStack()	//入栈
{
	int x;
	x= elements[top]; 
	top--; 
	height--; 
	return x; 
}

void CSeqStack::ClearStack()	//清空堆栈
{
	top = -1;
}

bool CSeqStack::IsFullStack()	//堆栈是否为空
{
	return(top==maxsize-1)?true:false;
}

bool CSeqStack::IsEmptyStack()	//堆栈是否已满
{
	return(height==0)?true:false ;  
}

int CSeqStack::GetStackTop()	//获取栈顶数据
{
	return elements[top];
}

void CSeqStack::SetStack(int x)	//设置堆栈,作用类似于构造函数
{
	height = 0; 
	top = -1; 
	maxsize = x;  
	elements = new int[x];
	arr=new int[x];
	arr2=new int[x];
}

void CInputDlg::OnOK() 
{
	// TODO: Add extra validation here
	UpdateData(TRUE);
	if(Judge()==1)
	{
		CDialog::OnOK();
	}
	else
		AfxMessageBox("不可布线!");	
	
}

void CInputDlg::OnLoad() //将数据库中某项记录读出来并加载到程序中去
{
	// TODO: Add your control notification handler code here
	int i;
	CString str;
	char* st;
	if(m_list.GetSelectedCount()<1)
		return ;
	for(i=m_list.GetItemCount()-1;i>=0;i--)
	{
		if(m_list.GetItemState(i,LVIS_SELECTED))
		{
			//CString GetItemText( int nItem, int nSubItem )			
			str=m_list.GetItemText(i,1);		
			st=str.GetBuffer(str.GetLength());
			m_nUp=int(st[0]-'0');
			str=m_list.GetItemText(i,2);		
			st=str.GetBuffer(str.GetLength());
			m_nRight=int(st[0]-'0');
			str=m_list.GetItemText(i,3);		
			st=str.GetBuffer(str.GetLength());
			m_nDown=int(st[0]-'0');
			str=m_list.GetItemText(i,4);		
			st=str.GetBuffer(str.GetLength());
			m_nLeft=int(st[0]-'0');
			m_sSequence=m_list.GetItemText(i,5);

			UpdateData(FALSE);
		}
	}			
}

void CInputDlg::OnCheckAndSave() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	if(m_strDir=="\0")
	{
		AfxMessageBox("请打开一个数据库!");
		OnFindDir();	
	}
	CString str,strup,strdown,strleft,strright,strresult,strSerNum;
	COleVariant vUp,vDown,vLeft,vRight,v,var;

	if(Judge()==1)
		AfxMessageBox("可布线,\n并将布线结果存入数据库。");
	else
		AfxMessageBox("不可布线,\n并将布线结果存入数据库。");
//将判断的结果保存回数据库中
	CDaoDatabase* pDb=new CDaoDatabase;
	try{
		pDb->Open(m_strDir);
	}
	catch(CDaoException* e){
		AfxMessageBox(e->m_pErrorInfo->m_strDescription,MB_OK,0);
		pDb->Close();
		delete pDb;return;
	}
	CDaoTableDef td(pDb);
	td.Create("bbbb");
	td.Open("filelst");
	CDaoRecordset rs;
	rs.Open(&td);

	rs.MoveFirst();

	vUp.vt=VT_I4;
	vRight.vt=VT_I4;
	vDown.vt=VT_I4;
	vLeft.vt=VT_I4;
	v.vt=VT_I4;	
	while(!rs.IsEOF())
	{
		vUp=rs.GetFieldValue("上边个数");
		vRight=rs.GetFieldValue("右边个数");
		vDown=rs.GetFieldValue("下边个数");
		vLeft=rs.GetFieldValue("左边个数");
		var=rs.GetFieldValue("布线次序");
		str=(LPCSTR)var.bstrVal;
		v.intVal=10;	
		if((vUp.intVal==m_nUp)&&     
			(vRight.intVal==m_nRight)&&
			(vDown.intVal==m_nDown)&&
			(vLeft.intVal==m_nLeft)&&
			(str==m_sSequence))
		{
			rs.Edit();
			str.Format("%d",Judge());
			rs.SetFieldValue("是否可布线",(LPCTSTR)str);
			rs.Update();
			rs.Close();
			td.Close();
			pDb->Close();
			delete pDb;
			DisplayDatabase();
			return ;
		}
		rs.MoveNext();
	}
	rs.Close();
	td.Close();
	pDb->Close();
	delete pDb;
	AfxMessageBox("此为新记录,并将其加入数据库");
	AddDatabase();
	DisplayDatabase();		
}

void CInputDlg::OnFindDir()		//寻找并保存数据库存放的路径
{
	// TODO: Add your control notification handler code here
	int i,j;
	char str[128]="\0";
	char str2[128]="\0";
	CFileDialog fileDlg(true);
	if(fileDlg.DoModal()==IDOK)	
	{
		::GetCurrentDirectory(127,str);//m_strDir[i]
	}
	//处理路径==============================
	for(i=0,j=0;j<128&&str[i]!='\0';i++,j++)
	{
		str2[j]=str[i];
		if(str[i]=='\\')
		{
			j++;
			str2[j]='\\';
		}
	}
	str2[j]=str2[j+1]='\\';
	m_strDir=str2;
	m_strDir=m_strDir+"route.mdb";
	//=====================================
//	AfxMessageBox(m_strDir);
	DisplayDatabase();	
}

void CTimeSet::OnOK() 
{
	// TODO: Add extra validation here
	
	CDialog::OnOK();
}

BOOL CInputDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	for(int i=0;i<100;i++)
		m_Arr[i]=0;
	m_nNum=m_nUp+m_nDown+m_nLeft+m_nRight;
	switchbox.maxsize=m_nNum;
	switchbox.height=m_nNum;

	m_list.InsertColumn(0,"序号",LVCFMT_LEFT,50,-1);	
	m_list.InsertColumn(1,"上",LVCFMT_LEFT,40,-1);
	m_list.InsertColumn(2,"右",LVCFMT_LEFT,40,-1);
	m_list.InsertColumn(3,"下",LVCFMT_LEFT,40,-1);
	m_list.InsertColumn(4,"左",LVCFMT_LEFT,40,-1);
	m_list.InsertColumn(5,"布线次序",LVCFMT_LEFT,240,-1);
	m_list.InsertColumn(6,"是否可布线",LVCFMT_LEFT,100,-1);	
	if(m_strDir!="\0")
		DisplayDatabase();
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CInputDlg::DisplayDatabase()	//将数据库中内容显示到对话框列表控件中
{
	UpdateData(TRUE);
	
	CString str;
	int n=0,i=0;
	COleVariant var;
	if(m_strDir=="\0")
	{		
		AfxMessageBox("请打开一个数据库!");
		OnFindDir();
	}

	CDaoDatabase* pDb=new CDaoDatabase;
	try{
		pDb->Open(m_strDir);
	}
	catch(CDaoException* e){
		AfxMessageBox(e->m_pErrorInfo->m_strDescription,MB_OK,0);
		pDb->Close();
		delete pDb;return;
	}
	CDaoTableDef td(pDb);
	td.Create("bbbb");
	td.Open("filelst");
	CDaoRecordset rs;
	rs.Open(&td);

	rs.MoveFirst();
	m_list.DeleteAllItems();

	while(!rs.IsEOF())		//显示数据库过程
	{
		var=rs.GetFieldValue("序号");
		str.Format("%d",var.intVal);
		i=m_list.InsertItem(n,str);
		var=rs.GetFieldValue("上边个数");
		str.Format("%d",var.intVal);
		m_list.SetItemText(i,1,str);
		var=rs.GetFieldValue("右边个数");
		str.Format("%d",var.intVal);
		m_list.SetItemText(i,2,str);
		var=rs.GetFieldValue("下边个数");
		str.Format("%d",var.intVal);
		m_list.SetItemText(i,3,str);
		var=rs.GetFieldValue("左边个数");
		str.Format("%d",var.intVal);
		m_list.SetItemText(i,4,str);
		var=rs.GetFieldValue("布线次序");
		m_list.SetItemText(i,5,(LPCSTR)var.bstrVal);
		var=rs.GetFieldValue("是否可布线");
		str.Format("%d",var.intVal);
		m_list.SetItemText(i,6,str);
		n++;
		rs.MoveNext();
	}
	rs.Close();
	td.Close();
	pDb->Close();
	delete pDb;
}

void CInputDlg::GetSeq() //将布线次序从相应的编辑栏中提取出来并以数据形式存放
{
	int i,j;
	char* s;
	s =m_sSequence.GetBuffer(m_sSequence.GetLength());
		int temp;
	//(1,2)(3,4)(8,5)(7,6)格式
	temp=0;
	for(i=0,j=0;i<m_sSequence.GetLength();i++)//只提数字,以“,”“(”“)”为隔开标记
	{
		if(s[i]!=')'&&s[i]!=','&&s[i]!='(')
			temp=temp*10+int(s[i]-'0');
		if(s[i]==',')
		{
			m_Arr[j]=temp;
			temp=0;
			j++;
		}
		if(s[i]==')')
		{
			m_Arr[j]=temp;
			temp=0;
			j++;
		}
	}
}

int CInputDlg::Judge()		//判断此种布线方案是否可行
{
	int len_arr;
//	UpdateData(TRUE);			为什么在此加入这句语句会出错
	m_nNum=m_nUp+m_nDown+m_nLeft+m_nRight;	
//	CString str,str2,str3;
	for(int i=0;i<100;i++)
		m_Arr[i]=0;
	GetSeq();
	for(len_arr=0;len_arr<100&&m_Arr[len_arr]!=0;len_arr++)
		;
	if(len_arr!=m_nNum||m_nNum==0)
	{
		return -1;
	}
	switchbox.SetStack(m_nNum);
	switchbox.ClearStack();

	for(i=0;i<m_nNum;i++)
	{
		if(switchbox.IsEmptyStack())
		{
			switchbox.PushStack(i+1);	//switchbox.arr2[i]
		}
		else
		{	
			if(Match(i+1,switchbox.GetStackTop()))
			{	
			//	OnTimer(1);		
				switchbox.PopStack();
			}
			else 
			{
				switchbox.PushStack(i+1);
			}
		}
	}
	if(switchbox.IsEmptyStack())
	{
		return 1;

	}
	else
	{
		return -1;
	}
}

bool CInputDlg::Match(int num_a, int num_b)//判断当前数是否可堆栈栈顶的数相同
{
	for(int j=0;j<m_nNum;j=j+2)
		if((num_a==m_Arr[j]&&num_b==m_Arr[j+1])||(num_a==m_Arr[j+1]&&num_b==m_Arr[j]))
			return true;
	return false;
}

void CInputDlg::AddDatabase()//将某项记录加到数据库中
{
	if(m_strDir=="\0")
		OnFindDir();
	CString strup,strdown,strleft,strright,strresult,strSerNum;
	int count=0;

	CDaoDatabase* pDb=new CDaoDatabase;
	try{
		pDb->Open(m_strDir);
	}
	catch(CDaoException* e){
		AfxMessageBox(e->m_pErrorInfo->m_strDescription,MB_OK,0);
		pDb->Close();
		delete pDb;return;
	}

	CDaoTableDef td(pDb);
	td.Create("aaaa");
	td.Open("filelst");

	CDaoRecordset rs;
	rs.Open(&td);
	rs.MoveFirst();

	strup.Format("%d",m_nUp);
	strdown.Format("%d",m_nDown);
	strleft.Format("%d",m_nLeft);
	strright.Format("%d",m_nRight);
	strresult.Format("%d",Judge());
	for(count=0;(rs.IsEOF()!=TRUE)&&(count<20);count++)
	{
		rs.MoveNext();
	}
	strSerNum.Format("%d",count+1);

	rs.MoveLast();	
	rs.AddNew();

	rs.SetFieldValue(0,(LPCTSTR)strup);
	rs.SetFieldValue(1,(LPCTSTR)strright);
	rs.SetFieldValue(2,(LPCTSTR)strdown);
	rs.SetFieldValue(3,(LPCTSTR)strleft);
	rs.SetFieldValue(4,(LPCTSTR)m_sSequence);
	rs.SetFieldValue(5,(LPCTSTR)strresult);
	rs.SetFieldValue(6,(LPCTSTR)strSerNum);

	rs.Update();
	rs.Close();
	td.Close();
	pDb->Close();
	delete pDb;
}

⌨️ 快捷键说明

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