学生党~做课设~求帮忙~
mfc吧
全部回复
仅看楼主
level 2
红果ono 楼主
基于Dijkstra算法的最短路径问题求解
,请问大家有没有人可以帮忙教教我怎么做这个的MFC我有代码,请问有人帮忙做嘛?
2015年12月28日 00点12分 1
level 2
红果ono 楼主
下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。
①将class文件,重新命名为class.h,并将其加入MFC工程。
②修改class文件具体包括:
将显示矩阵PrintM()函数和显示方程PrintL()函数注释掉,因为在图形界面的程序上已经不需要连个函数承担输出功能了;
将输出方程组的解ShowX()函数加入参数double x[]变成ShowX(double x[]),以实现将所求的解输出至参数x中,并最终完成在对话框界面上的显示;
将全选主元高斯法求解函数Solve()中的两处cout语句去掉,因为不需要也不能够使用cout流实现输出。
③在对话框类的实现文件GuassLineGUIDlg.cpp中加入#include "Linequ.h",以实现在该文件中可使用Linequ类。
④在GuassLineGUIDlg.cpp文件中加入以下全局变量的定义,以实现GuassLineGUIDlg类和Linequ类之间的通信,具体代码如下:
double a[]=//系数矩阵
{
0.2368,0.2471,0.2568,1.2671,
0.1968,0.2071,1.2168,0.2271,
0.1581,1.1675,0.1768,0.1871,
1.1161,0.1254,0.1397,0.1490
};
double b[4]={ 1.8471,1.7471,1.6471,1.5471};//方程右端项
double *X;//存放方程组的解
⑤编写读入数据按钮的消息处理函数,实现将矩阵和右端项的数据刷新到界面上,具体代码如下:
void CGuassLineGUIDlg::OnBUTTONRead()
{
// TODO: Add your control notification handler code here
m_A00=a[0]; m_A01=a[1]; m_A02=a[2]; m_A03=a[3];
m_A10=a[5]; m_A11=a[6]; m_A12=a[7]; m_A13=a[8];
m_A20=a[9]; m_A21=a[10]; m_A22=a[11]; m_A23=a[12];
m_A30=a[13]; m_A31=a[14]; m_A32=a[15]; m_A33=a[16];
m_b0=b[0]; m_b1=b[1]; m_b2=b[2]; m_b3=b[3];
UpdateData(FALSE);
}
⑥编写计算求解按钮的消息处理函数,实现将方程求解,具体代码如下:
void CGuassLineGUIDlg::OnButtonCalc()
{
// TODO: Add your control notification handler code here
Linequ equ1(4);//定义一个四元方程组对象
equ1.SetLinequ(a,b);//设置方程组
X=new double[4];
if(equ1.Solve())//求解方程组
{
equ1.ShowX(X);//输出方程组的解
m_X0=X[0];
m_X1=X[1];
m_X2=X[2];
m_X3=X[3];
UpdateData(FALSE);
}
else
MessageBox("求解失败");//求解失败
}
⑦退出按钮比较简单,代码如下:
void CGuassLineGUIDlg::OnBUTTONExit()
{
// TODO: Add your control notification handler code here
OnOK();
}
2015年12月28日 00点12分 2
level 2
红果ono 楼主
还有这个编程的程序是基于Dijkstra算法的最短路径问题求解
进行类的设计与实现,解决最短路径问题。具体要求如下:
采用图的邻接矩阵或邻接表实现最短路径问题中图的存储;
采用Dijkstra算法求从某个源点到其余各顶点的最短路径;
将上述功能作为类的成员函数实现,编写主函数测试上述功能。
#include<iostream>
using namespace std;
const int MAX=1000;
const int INF=1000000000;
class SPFA
{
public: int n;//表示图里面的点数
public: int path[MAX][MAX];//定义链接矩阵最多是1000个点
public: int dis[MAX];//定义源点到其他点的距离
public: int src;//定义源点经过公有派生
public:void Cal()
{
int i,j,k;
bool used[MAX]={false};//定义点是否访问过了,初始化为未访问
for(i=0;i<n;i++)//初始化一下到各个点的距离
{
dis[i]=path[src][i];
}
dis[src]=0;
int min_=INF;
for(i=0;i<n;i++)
{
k=-1;
min_=INF;
for(j=0;j<n;j++)
{
if(dis[j]<min_&&!used[j])
{
min_=dis[j];
k=j;
}
}
if(k==-1)//已经找不到有路可走的点
{
return;
}
used[k]=true;
for(j=0;j<n;j++)
{
if(!used[j]&&dis[j]>min_+path[k][j])//如果从k点走到j点的路很比原来的要短,那么更新
{
dis[j]=min_+path[k][j];
}
}
}
}
};
int main()
{
SPFA* a=new SPFA();
cout<<"请输入点数:";
cin>>a->n;
int i,j;
for(i=0;i<a->n;i++)
{
for(j=0;j<a->n;j++)
{
cin>>a->path[i][j];
if(a->path[i][j]==-1)
{
a->path[i][j]=INF;
}
}
}
a->src=0;//源点暂时定为0,你自己改吧
a->Cal();
for(i=0;i<a->n;i++)
{
cout<<"dis[i]="<<i<<a->dis[i]<<endl;
}
return 0;
}
2015年12月28日 00点12分 3
level 2
红果ono 楼主
求求大神,帮忙做一下~
2015年12月28日 00点12分 4
level 6
还需要?
2015年12月31日 17点12分 5
1