vc++程序逻辑错误:

hotgsk 2009-05-04 11:01:45
不信这个邪了,难道就找不出来这个错误?哪个高手给找找哪.无语中^我可以把源程序发给你,找到为什么还随机数还会出现1!!!!
...全文
175 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hotgsk 2009-05-05
  • 打赏
  • 举报
回复
14楼和11楼贴重复了.这个是DLL产生文件程序.
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
没找到哪里使用了CEdge,你是不是把CNode当作CEdge了?
[/Quote]
代码没有贴全,刚刚论坛提示我,怀疑我是恶意刷屏,不能发言了.
cnzdgs 2009-05-04
  • 打赏
  • 举报
回复
没找到哪里使用了CEdge,你是不是把CNode当作CEdge了?
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
// Edge.h: interface for the CEdge class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_EDGE_H__7DA4D413_150C_4C94_AAE6_A5C1C4BA80AC__INCLUDED_)
#define AFX_EDGE_H__7DA4D413_150C_4C94_AAE6_A5C1C4BA80AC__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CEdge
{
public:
bool m_red; // used to draw the result (if an edge it is a part of the shortest path it is drawn in red)
double m_cost; // the cost of an edge (picked randomly )
long m_secondNode; // the second node number
long m_firstNode; // the first node number
POINT m_secondPct; // graphical elements for drawing the edges
POINT m_firstPct;
CEdge();
virtual ~CEdge();

};
// the graph is oriented from the first node to the second node

#endif // !defined(AFX_EDGE_H__7DA4D413_150C_4C94_AAE6_A5C1C4BA80AC__INCLUDED_)
// Edge.cpp: implementation of the CEdge class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Edge.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CEdge::CEdge()
{
m_red = false;
srand( (unsigned)time( NULL ) );//随机数发生器的初始化函数,常常使用系统时间来初始化
m_cost = rand()%10+4;//rand函数配合使用,产生随机数的起始发生数据
}

CEdge::~CEdge()
{

}
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

typedef vector < long > VTYPE_NODE_P;

class CNode
{
public:
CNode Copy();
double m_cost; // not used yet
long m_NodeNr; // node number
POINT m_p; // graphical point for that node
CNode();
virtual ~CNode();
};

#endif // !defined(AFX_NODE_H__8243C025_02CF_4AD7_B2AC_A5BE86912FA4__INCLUDED_)
// Node.cpp: implementation of the CNode class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Node.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CNode::CNode()
{
m_cost = 1;
}

CNode::~CNode()
{
}

CNode CNode::Copy()
{
CNode ret;
ret.m_cost = m_cost;
ret.m_NodeNr = m_NodeNr;
ret.m_p.x = m_p.x;
ret.m_p.y = m_p.y;

return ret;
}
// Graph.h: interface for the CGraph class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_GRAPH_H__0A20F055_21B0_4D48_A1F0_E916CFF57053__INCLUDED_)
#define AFX_GRAPH_H__0A20F055_21B0_4D48_A1F0_E916CFF57053__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "StdAfx.h"

class CGraph
{
public:
long GetNrNodes();
CGraph();
virtual ~CGraph();
VTYPE_NODE m_nodes; // array of nodes
VTYPE_EDGE m_edges; // array of edges
VTYPE_NODE_P d; // array of longs that contain the shortest path at every step
VTYPE_NODE_P pi; // array of longs that contain the predecessor of each node for the shortest path
};

#endif // !defined(AFX_GRAPH_H__0A20F055_21B0_4D48_A1F0_E916CFF57053__INCLUDED_)
// Graph.cpp: implementation of the CGraph class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Graph.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGraph::CGraph()
{

}

CGraph::~CGraph()
{
m_nodes.clear();
m_edges.clear();
d.clear();
pi.clear();
}

long CGraph::GetNrNodes()
{
return m_nodes.size();
}
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
算法是关于最短路径的.
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
代码是一个DLL程序,文件比较多,贴不过来.....
wutaihua 2009-05-04
  • 打赏
  • 举报
回复
我这里没有出现1的情况啊。你把你的代码整个贴出来吧。

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
srand( (unsigned)time( NULL ) );//Ëæ»úÊý·¢ÉúÆ÷µÄ³õʼ»¯º¯Êý,³£³£Ê¹ÓÃϵͳʱ¼äÀ´³õʼ»¯

while(1)
{
int nRand = rand()%10+4;//randº¯ÊýÅäºÏʹÓ㬲úÉúËæ»úÊýµÄÆðʼ·¢ÉúÊý¾Ý
cout<<nRand<<endl;
if(nRand == 1)
{
int k = 0;
}
}

};
gis07053256 2009-05-04
  • 打赏
  • 举报
回复
~
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
srand( (unsigned)time( NULL ) );//随机数发生器的初始化函数,常常使用系统时间来初始化
m_cost = rand()%10+4;//rand函数配合使用,产生随机数的起始发生数据
cnzdgs 2009-05-04
  • 打赏
  • 举报
回复
LZ贴这么多代码,都不知道该看哪里了,说一下哪里使用了CEdge类,怎么确定不正常的?
lzh9955 2009-05-04
  • 打赏
  • 举报
回复
UP
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 niuxiaojia09 的回复:]
你的程序中
VTYPE_NODE 就是 CNode类
VTYPE_EDGE 就是 CEdge类
g应该是CGraph类

不知道我看错没有。
你的VTYPE_NODE和VTYPE_EDGE是不是定义成了vector?把你的这两个定义发下,晚上我抽时间写个测试程序,看能不能复现你的问题。
[/Quote]

是的.
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
include "stdafx.h"
#include "AnimAlg.h"
#include "Dijkstra.h"
#include "Node.h"
#include <math.h>
// The Dijkstra's algorithm
STDMETHODIMP CDijkstra::ShortestPath(long node1, long node2)
{
ReleaseGraph();
// init d and pi
InitializeSource(g, g.m_nodes[node1-1]);
// Set S empty
VTYPE_NODE S;
// Put nodes in Q
VTYPE_NODE Q;
VTYPE_NODE::iterator kl;
for(kl=g.m_nodes.begin(); kl <g.m_nodes.end(); kl++)
{
CNode node = (*kl).Copy();
Q.push_back(node);
}
// Algorithm
while(Q.size())
{
CNode nod = ExtractMin(Q); // the minim value for the shortest path up to this step
S.push_back(nod);
// each vertex v which is a neighbour of u
VTYPE_NODE::iterator kl;
for(kl=g.m_nodes.begin(); kl <g.m_nodes.end(); kl++)
{
if(ExistEdge(nod, (*kl)))
{
bool gasit = false;
VTYPE_NODE::iterator kll;
for(kll=Q.begin(); kll <Q.end(); kll++)
{
if((*kll).m_NodeNr == (*kl).m_NodeNr)
gasit = true;
}
if(gasit)
Relax(nod, (*kl), GetEdgeVal(nod, (*kl)));
}
}
}



RefreshDone(node1, node2);
//::MessageBox(this->m_hWndCD, (LPCSTR)ss, "Result", MB_OK);

return S_OK;
}

void CDijkstra::InitializeSource(CGraph& g, CNode s)//
{
VTYPE_NODE::iterator kl;
for(kl=g.m_nodes.begin(); kl <g.m_nodes.end(); kl++)
{
long d, pi;
d = (long)MAXLONG;
if((*kl).m_NodeNr == s.m_NodeNr)
d = 0;
g.d.push_back(d);
pi = 0;
g.pi.push_back(pi);
}
}

CNode CDijkstra::ExtractMin(VTYPE_NODE& Q)// the minim value for the shortest path up to this step
{
CNode node;
double min = (double)MAXDOUBLE;//fffffffffffffffe
long elem;
VTYPE_NODE::iterator kl;
for(kl=Q.begin(); kl <Q.end(); kl++)
{
long xx = g.d[(*kl).m_NodeNr-1];
//if(g.d[(*kl).m_NodeNr-1] <min)
if(log(g.d[(*kl).m_NodeNr-1]) <log(min))
{
min = g.d[(*kl).m_NodeNr-1];
//min = log(g.d[(*kl).m_NodeNr-1]);
elem = (*kl).m_NodeNr;
}
}
node = g.m_nodes[elem-1].Copy();
for(kl=Q.begin(); kl <Q.end(); kl++)
{
if(elem == (*kl).m_NodeNr)
{
Q.erase(kl);
break;
}
}
return node;
}

void CDijkstra::Relax(CNode u, CNode v, double w)
{
long i;//暂时存放
if(log(g.d[v.m_NodeNr-1])>log(g.d[u.m_NodeNr-1])+log(w))
//if(g.d[v.m_NodeNr-1]>g.d[u.m_NodeNr-1]+w)
{
//log(g.d[v.m_NodeNr-1]) = log(g.d[u.m_NodeNr-1])+log(w);
i= log(g.d[u.m_NodeNr-1])+log(w);
g.d[v.m_NodeNr-1]=(long)pow(2,i);

//g.d[v.m_NodeNr-1] = g.d[u.m_NodeNr-1]+w;
g.pi[v.m_NodeNr-1] = u.m_NodeNr;
}
}

double CDijkstra::GetEdgeVal(CNode u, CNode v)
{
VTYPE_EDGE::iterator kl;
for(kl=g.m_edges.begin(); kl <g.m_edges.end(); kl++)
{
if(((*kl).m_firstNode == u.m_NodeNr && (*kl).m_secondNode == v.m_NodeNr))/* ||
((*kl).m_firstNode == v.m_NodeNr && (*kl).m_secondNode == u.m_NodeNr))*/
return (*kl).m_cost;

}
return 0;
  • 打赏
  • 举报
回复
你的程序中
VTYPE_NODE 就是 CNode类
VTYPE_EDGE 就是 CEdge类
g应该是CGraph类

不知道我看错没有。
你的VTYPE_NODE和VTYPE_EDGE是不是定义成了vector?把你的这两个定义发下,晚上我抽时间写个测试程序,看能不能复现你的问题。
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
上面是调用的关键代码,已经贴出来了.
能不能换个思路,在GetEdgeVal(CNode u, CNode v)
时,如果出现了1,就让它再重新取一次值.
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "AnimAlg.h"
#include "Dijkstra.h"
#include "Node.h"
#include <math.h>
// The Dijkstra's algorithm
STDMETHODIMP CDijkstra::ShortestPath(long node1, long node2)
{
ReleaseGraph();
// init d and pi
InitializeSource(g, g.m_nodes[node1-1]);
// Set S empty
VTYPE_NODE S;
// Put nodes in Q
VTYPE_NODE Q;
VTYPE_NODE::iterator kl;
for(kl=g.m_nodes.begin(); kl<g.m_nodes.end(); kl++)
{
CNode node = (*kl).Copy();
Q.push_back(node);
}
// Algorithm
while(Q.size())
{
CNode nod = ExtractMin(Q); // the minim value for the shortest path up to this step
S.push_back(nod);
// each vertex v which is a neighbour of u
VTYPE_NODE::iterator kl;
for(kl=g.m_nodes.begin(); kl<g.m_nodes.end(); kl++)
{
if(ExistEdge(nod, (*kl)))
{
bool gasit = false;
VTYPE_NODE::iterator kll;
for(kll=Q.begin(); kll<Q.end(); kll++)
{
if((*kll).m_NodeNr == (*kl).m_NodeNr)
gasit = true;
}
if(gasit)
Relax(nod, (*kl), GetEdgeVal(nod, (*kl)));
}
}
}



RefreshDone(node1, node2);
//::MessageBox(this->m_hWndCD, (LPCSTR)ss, "Result", MB_OK);

return S_OK;
}

void CDijkstra::InitializeSource(CGraph& g, CNode s)//
{
VTYPE_NODE::iterator kl;
for(kl=g.m_nodes.begin(); kl<g.m_nodes.end(); kl++)
{
long d, pi;
d = (long)MAXLONG;
if((*kl).m_NodeNr == s.m_NodeNr)
d = 0;
g.d.push_back(d);
pi = 0;
g.pi.push_back(pi);
}
}

CNode CDijkstra::ExtractMin(VTYPE_NODE& Q)// the minim value for the shortest path up to this step
{
CNode node;
double min = (double)MAXDOUBLE;//fffffffffffffffe
long elem;
VTYPE_NODE::iterator kl;
for(kl=Q.begin(); kl<Q.end(); kl++)
{
long xx = g.d[(*kl).m_NodeNr-1];
//if(g.d[(*kl).m_NodeNr-1]<min)
if(log(g.d[(*kl).m_NodeNr-1])<log(min))
{
min = g.d[(*kl).m_NodeNr-1];
//min = log(g.d[(*kl).m_NodeNr-1]);
elem = (*kl).m_NodeNr;
}
}
node = g.m_nodes[elem-1].Copy();
for(kl=Q.begin(); kl<Q.end(); kl++)
{
if(elem == (*kl).m_NodeNr)
{
Q.erase(kl);
break;
}
}
return node;
}

void CDijkstra::Relax(CNode u, CNode v, double w)
{
long i;//暂时存放
if(log(g.d[v.m_NodeNr-1])>log(g.d[u.m_NodeNr-1])+log(w))
//if(g.d[v.m_NodeNr-1]>g.d[u.m_NodeNr-1]+w)
{
//log(g.d[v.m_NodeNr-1]) = log(g.d[u.m_NodeNr-1])+log(w);
i= log(g.d[u.m_NodeNr-1])+log(w);
g.d[v.m_NodeNr-1]=(long)pow(2,i);

//g.d[v.m_NodeNr-1] = g.d[u.m_NodeNr-1]+w;
g.pi[v.m_NodeNr-1] = u.m_NodeNr;
}
}

double CDijkstra::GetEdgeVal(CNode u, CNode v)
{
VTYPE_EDGE::iterator kl;
for(kl=g.m_edges.begin(); kl<g.m_edges.end(); kl++)
{
if(((*kl).m_firstNode == u.m_NodeNr && (*kl).m_secondNode == v.m_NodeNr))/* ||
((*kl).m_firstNode == v.m_NodeNr && (*kl).m_secondNode == u.m_NodeNr))*/
return (*kl).m_cost;

}
return 0;
}
hotgsk 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 niuxiaojia09 的回复:]
大概看了一下,不是随机数出现了1,是你的程序在初始化的时候赋的1。如果不想出现1,你需要修改一下你程序的逻辑,确保每次都会执行产生随机数的操作。
CNode::CNode()
{
m_cost = 1;
}
[/Quote]
这个地方之前我改成2了,这里复制错了.
  • 打赏
  • 举报
回复
大概看了一下,不是随机数出现了1,是你的程序在初始化的时候赋的1。如果不想出现1,你需要修改一下你程序的逻辑,确保每次都会执行产生随机数的操作。
CNode::CNode()
{
m_cost = 1;
}

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧