📄 mysource.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 + -