📄 keypathview.cpp
字号:
edgenode *p;
StepRun(10);
total = 0;
StepRun(11);
for(i = 0; i < citynumber; i++) {
StepRun(12);
ve[i] = 0;
StepRun(11);
}
StepRun(13);
for(i = 0; i < citynumber; i++)
{
StepRun(14);
if(graphicmap[i].id == 0)
{
StepRun(15);
topologystack[++rear] = i;
StepRun(16);
m++;
StepRun(13);
}
StepRun(13);
}
StepRun(19);
while(front != rear)
{
StepRun(20);
front++;
StepRun(21);
j = topologystack[front];
StepRun(22);
m++;
StepRun(23);
p = graphicmap[j].link ;
StepRun(24);
while(p)
{
StepRun(25);
k = p->adjvex ;
StepRun(26);
graphicmap[k].id--;
StepRun(27);
if(ve[j] + p->dut > ve[k]) {
StepRun(28);
ve[k] = ve[j] + p->dut ;
StepRun(27);
}
StepRun(30);
if(graphicmap[k].id == 0) {
StepRun(31);
topologystack[++rear] = k;
StepRun(30);
}
StepRun(32);
p = p->next ;
StepRun(24);
}
StepRun(19);
}
StepRun(35);
if(m < citynumber)
{
StepRun(36);
m_resultList.AddString("本程序所建立的交通网有回路不可计算出关键路径");
StepRun(37);
return 0;
}
StepRun(39);
total = ve[citynumber-1];
StepRun(40);
for(i = 0; i < citynumber; i++) {
StepRun(41);
vl[i] = total;
StepRun(40);
}
StepRun(42);
for(i = citynumber - 2; i >= 0; i--)
{
StepRun(43);
j = topologystack[i];
StepRun(44);
p = graphicmap[j].link ;
StepRun(45);
while(p)
{
StepRun(46);
k = p->adjvex ;
StepRun(47);
if((vl[k] - p->dut ) < vl[j]) {
StepRun(48);
vl[j] = vl[k] - p->dut ;
StepRun(49);
}
StepRun(49);
p = p->next ;
StepRun(45);
}
StepRun(42);
}
StepRun(52);
i = 0;
CString veStr = _T("最早发生时间:");
CString vlStr = _T("最迟发生时间:");
CString tmp;
for(j = 0; j < citynumber; j++)
{
tmp.Format("%d", ve[j]);
veStr += "(";
veStr += pointVec[j].name;
veStr += ",";
veStr += tmp;
veStr += ") ";
tmp.Format("%d", vl[j]);
vlStr += "(";
vlStr += pointVec[j].name;
vlStr += ",";
vlStr += tmp;
vlStr += ") ";
}
m_varList.AddString(veStr);
m_varList.AddString(vlStr);
for(j = 0; j < citynumber; j++)
{
StepSlowRun(53);
p = graphicmap[j].link;
StepSlowRun(54);
while(p)
{
StepSlowRun(55);
k=p->adjvex;
StepSlowRun(56);
e[++i]=ve[j];
StepSlowRun(57);
l[i]=vl[k]-p->dut;
StepSlowRun(58);
//最早开始时间 e[i]
//最迟开始时间 l[i]
//差值 l[i]-e[i]
if(l[i] == e[i]) {
StepSlowRun(59);
//计算关键路径
for (int kkk = 0; kkk < edgeVec.size(); kkk++) {
if (edgeVec[kkk].prevPoint->id == (graphicmap[j].trafficnetname + 1)
&& edgeVec[kkk].nextPoint->id == (graphicmap[k].trafficnetname + 1)
) {
edgeVec[kkk].isKey = 1;
}
}
pointVec[graphicmap[j].trafficnetname].isKey = 1;
pointVec[graphicmap[k].trafficnetname].isKey = 1;
} else {
StepSlowRun(61);
//非关键路径
for (int kkk = 0; kkk < edgeVec.size(); kkk++) {
if (edgeVec[kkk].prevPoint->id == (graphicmap[j].trafficnetname + 1)
&& edgeVec[kkk].nextPoint->id == (graphicmap[k].trafficnetname + 1)
) {
curPath = kkk;
}
}
}
StepSlowRun(63);
ReDrawAll();
p=p->next ;
StepSlowRun(54);
}
StepSlowRun(52);
}
StepSlowRun(66);
curPath = -1;
ReDrawAll();
return 1;
}
/************************************************************************/
/* 求直线与圆的交点坐标 */
/* (x1, y1)、(x2,y2) 直线上两点坐标 */
/* (cx1, cy1) 圆心坐标 */
/* radio 圆半径 */
/* (jx, jy) 计算出的在直线上且在(x1, y1)、(x2,y2) 两点之间的点坐标 */
/* dt沿直线进行平移的数值 */
/************************************************************************/
void CKeyPathView::GetJionPointCoor(int x1, int y1, int x2, int y2, int cx1, int cy1, int radio, int & jx, int & jy, int dt)
{
if (x1 == x2) {
//沿x轴线平行
} else if (y1 == y2) {
//沿y轴线平行
} else {
//任意直线
}
jx = cx1;
jy = cy1;
}
BOOL CKeyPathView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
void CKeyPathView::ShowProgram()
{
m_programList.AddString("01 ");
m_programList.AddString("02 int CKeyPathView::SearchKeyPath(vexnode* graphicmap,int citynumber,int activenumber,int& total) {");
m_programList.AddString("03 int i, j, k, m = 0;");
m_programList.AddString("04 int front = -1, rear = -1;");
m_programList.AddString("05 int* topologystack = (int*) malloc(citynumber * sizeof(int)); ");
m_programList.AddString("06 int* vl = (int*) malloc(citynumber * sizeof(int));");
m_programList.AddString("07 int* ve = (int*) malloc(citynumber * sizeof(int));");
m_programList.AddString("08 int* l = (int*) malloc(activenumber * sizeof(int));");
m_programList.AddString("09 int* e = (int*) malloc(activenumber * sizeof(int));");
m_programList.AddString("10 edgenode *p;");
m_programList.AddString("11 total = 0;");
m_programList.AddString("12 for(i = 0; i < citynumber; i++) ");
m_programList.AddString("13 ve[i] = 0;");
m_programList.AddString("14 for(i = 0; i < citynumber; i++) {");
m_programList.AddString("15 if(graphicmap[i].id == 0) {");
m_programList.AddString("16 topologystack[++rear] = i;");
m_programList.AddString("17 m++;");
m_programList.AddString("18 }");
m_programList.AddString("19 }");
m_programList.AddString("20 while(front != rear) {");
m_programList.AddString("21 front++;");
m_programList.AddString("22 j = topologystack[front];");
m_programList.AddString("23 m++;");
m_programList.AddString("24 p = graphicmap[j].link;");
m_programList.AddString("25 while(p) {");
m_programList.AddString("26 k = p->adjvex;");
m_programList.AddString("27 k = p->adjvex;");
m_programList.AddString("28 graphicmap[k].id--;");
m_programList.AddString("29 if(ve[j] + p->dut > ve[k])");
m_programList.AddString("30 ve[k] = ve[j] + p->dut;");
m_programList.AddString("31 if(graphicmap[k].id == 0)");
m_programList.AddString("32 topologystack[++rear] = k;");
m_programList.AddString("33 p = p->next;");
m_programList.AddString("34 }");
m_programList.AddString("35 }");
m_programList.AddString("36 if(m < citynumber) {");
m_programList.AddString("37 MessageBox(\"本程序所建立的交通网有回路不可计算出关键路径\");");
m_programList.AddString("38 return 0;");
m_programList.AddString("39 }");
m_programList.AddString("40 total = ve[citynumber-1];");
m_programList.AddString("41 for(i = 0; i < citynumber; i++)");
m_programList.AddString("42 vl[i] = total;");
m_programList.AddString("43 for(i = citynumber - 2; i >= 0; i--) {");
m_programList.AddString("44 j = topologystack[i];");
m_programList.AddString("45 p = graphicmap[j].link;");
m_programList.AddString("46 while(p) {");
m_programList.AddString("47 k = p->adjvex;");
m_programList.AddString("48 if((vl[k] - p->dut ) < vl[j])");
m_programList.AddString("49 vl[j] = vl[k] - p->dut;");
m_programList.AddString("50 p = p->next;");
m_programList.AddString("51 }");
m_programList.AddString("52 }");
m_programList.AddString("53 for(j = 0; j < citynumber; j++) {");
m_programList.AddString("54 p = graphicmap[j].link;");
m_programList.AddString("55 while(p) {");
m_programList.AddString("56 k=p->adjvex;");
m_programList.AddString("57 e[++i]=ve[j];");
m_programList.AddString("58 l[i]=vl[k]-p->dut;");
m_programList.AddString("59 if(l[i] == e[i]) {");
m_programList.AddString("60 //关键路径");
m_programList.AddString("61 } else {");
m_programList.AddString("62 //非关键路径");
m_programList.AddString("63 }");
m_programList.AddString("64 p=p->next;");
m_programList.AddString("65 }");
m_programList.AddString("66 }");
m_programList.AddString("67 return 1;");
m_programList.AddString("68 }");
m_programList.AddString("69 ");
}
/************************************************************************/
/* 模拟程序运行,时间值请自行设定 */
/************************************************************************/
void CKeyPathView::StepRun(int num)
{
m_programList.SetCurSel(num);
m_programList.Invalidate(FALSE);
step = false;
stepTime = 0;
while (stepTime < 5) {
Sleep(10);
stepTime++;
}
step = true;
}
/************************************************************************/
/* 模拟程序运行,时间值请自行设定 */
/************************************************************************/
void CKeyPathView::StepSlowRun(int num)
{
m_programList.SetCurSel(num);
m_programList.Invalidate(FALSE);
step = false;
stepTime = 0;
while (stepTime < 5) {
Sleep(40);
stepTime++;
}
step = true;
}
void CKeyPathView::OnTimer(UINT nIDEvent)
{
step = true;
KillTimer(1);
CFormView::OnTimer(nIDEvent);
}
int CKeyPathView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
m_keyPathStc.Create("", WS_CHILD|WS_VISIBLE, CRect(0,0, 580, 460), this, IDC_DRAW_STC);
m_programList.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL|WS_HSCROLL, CRect(582,0,1000,466), this, IDC_PROGRAM_LIST);
m_programList.SetHorizontalExtent(700);
ShowProgram();
StepRun(0);
//结果列表
m_resultList.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL|WS_HSCROLL, CRect(0,462,582,660), this, IDC_RESULT_LIST);
//结果列表
m_varList.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL|WS_HSCROLL, CRect(582,462,1000,660), this, IDC_VAR_NUM_LIST);
m_varList.SetHorizontalExtent(700);
return 0;
}
void CKeyPathView::OnFileNew()
{
drawType = 0;
prev = -1;
next = -1;
startCalPoint = 0;
endCalPoint = 0;
curPath = -1;
movePic = false;
pointVec.clear();
edgeVec.clear();
theApp.m_PathTitle = _T("");
theApp.m_PathTitleID = -1;
m_resultList.ResetContent();
m_varList.ResetContent();
ReDrawAll();
}
void CKeyPathView::OnFileOpen()
{
CProjectSelDlg dlg;
if (dlg.DoModal() == IDOK) {
if (theApp.m_PathTitle.GetLength() > 0) {
drawType = 0;
prev = -1;
next = -1;
curPath = -1;
movePic = false;
pointVec.clear();
edgeVec.clear();
ReDrawAll();
//获取当前程序所在物理路径
//程序所在目录全路径。
TCHAR exeFullPath[MAX_PATH];
CString theConnUdl;
GetCurrentDirectory(MAX_PATH, exeFullPath);
//数据库连接指针
_ConnectionPtr m_accessConn;
//数据库结果集指针
_RecordsetPtr m_accessRS;
//初始化数据库连接
theConnUdl.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\key_path.mdb;Jet OLEDB:Database Password=;", exeFullPath);
HRESULT hr;
try
{
hr = m_accessConn.CreateInstance("ADODB.Connection"); // 创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_accessConn->Open((_bstr_t) theConnUdl, "", "", adModeUnknown);
}
}
catch(_com_error e)// 捕捉异常
{
MessageBox("连接数据库失败");
return;
}
//初始化数据库
m_accessRS.CreateInstance(_uuidof(Recordset));
m_accessRS->CursorType = adOpenStatic;
m_accessRS->CursorLocation = adUseClient;
CString theSql;
int i = 0;
//获取顶点信息
theSql.Format("select id, point_id, name, memo, radius, x_axis, y_axis, project_id from point_info where project_id = %s order by point_id ASC", theApp.m_PathTitleID);
m_accessRS = m_accessConn->Execute(_bstr_t(theSql), NULL, adCmdText);
while (!m_accessRS->adoEOF) {
CPointInfo pInfo;
pInfo.pointID = atoi((LPCTSTR)(_bstr_t) m_accessRS->GetCollect("id"));
pInfo.xAxis = atoi((LPCTSTR)(_bstr_t) m_accessRS->GetCollect("x_axis"));
pInfo.yAxis = atoi((LPCTSTR)(_bstr_t) m_accessRS->GetCollect("y_axis"));
pInfo.color = pointColor;
pInfo.name = (LPCTSTR)(_bstr_t) m_accessRS->GetCollect("name");
pInfo.memo = (LPCTSTR)(_bstr_t) m_accessRS->GetCollect("memo");
int i = pointVec.size();
pInfo.id = ++i;
pointVec.push_back(pInfo);
m_accessRS->MoveNext();
}
//获取路径信息
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -