动态申请内存空间给数组出错
本人刚学矩阵,参考各方资料,自己写了一个雅克比迭代法求矩阵的程序,VC++6.0编译,运行到动态分配内存语句时出错不能继续往下运行,请高人指点程序的错误和不足之处!不胜感...
本人刚学矩阵,参考各方资料,自己写了一个雅克比迭代法求矩阵的程序,VC++6.0编译,运行到动态分配内存语句时出错不能继续往下运行,请高人指点程序的错误和不足之处!不胜感激!
#include<math.h>
#include<iostream.h>
#include <malloc.h>
#define MAX 100
#define EPS 1e-6
double **a, *x, *y;
int total_elem, i,j,l,c;
// 矩阵的创建与存储
double Create_Matrix()
{
cout<<"请输入所求方程组增广矩阵的行数和列数: ";
cin>>i>>j;
total_elem=i*j;
a = (double **)malloc(sizeof(double *)*(total_elem+1));//动态分配total_elem+1字节的内存空间而为数组
cout<<"根据您的输入,这是一个"<<i<<"行"<<j<<"列的增广矩阵;"<<endl
<<"下面,请顺序输入该增广矩阵中的每个元素(行优先):"<<endl;
for(c=0; c<=i; c++)
{
for(l=0; l<=j; l++)
cin>>a[l][c];
}
return **a;
}
// 显示增广矩阵
void Display_Matrix(double **a)
{
cout<<"增广矩阵的相关信息如下:"<<endl;
cout<<"行/列 ";
for(c=0; c<=i; c++)
{
cout<<" "<<i<<" "<<endl;
for(l=0; l<=j; l++)
cout<<a[l][c]<<" ";
}
}
// 采用雅克比(Jacobi)迭代法求值
double *Calculate_Jacobi()
{
double epsilon, s;
int k=0;
x = (double *)new double[i];
y = (double *)new double[i];
for(l=0;l<i;l++) x[l]=0;
{
epsilon=0;
k++;
s=0;
for(c=0;c<j;c++)
{
if(l==c) continue;
s+=a[l][c]*x[c];
}
y[l]=(a[l][c]-s)/a[l][c];
epsilon+=fabs(y[l]-x[c]);
}
if(epsilon<EPS) cout<<"迭代次数为:"<<k;
if(k>=MAX)
cout<<"此迭代不具有收敛性"<<endl;
for(l=0;l<i;l++) x[l]=y[l];
return y;
}
//主函数入口
void main()
{
Create_Matrix();
Display_Matrix(a);
Calculate_Jacobi();
cout<<"线性方程组的解为: ";
for(c=0; c<j; i++)
cout<<"x["<<c<<"]="<<y[i];
}
dongyue2008 :还想请问你有没有一次性分配的办法,不要分两步? 展开
#include<math.h>
#include<iostream.h>
#include <malloc.h>
#define MAX 100
#define EPS 1e-6
double **a, *x, *y;
int total_elem, i,j,l,c;
// 矩阵的创建与存储
double Create_Matrix()
{
cout<<"请输入所求方程组增广矩阵的行数和列数: ";
cin>>i>>j;
total_elem=i*j;
a = (double **)malloc(sizeof(double *)*(total_elem+1));//动态分配total_elem+1字节的内存空间而为数组
cout<<"根据您的输入,这是一个"<<i<<"行"<<j<<"列的增广矩阵;"<<endl
<<"下面,请顺序输入该增广矩阵中的每个元素(行优先):"<<endl;
for(c=0; c<=i; c++)
{
for(l=0; l<=j; l++)
cin>>a[l][c];
}
return **a;
}
// 显示增广矩阵
void Display_Matrix(double **a)
{
cout<<"增广矩阵的相关信息如下:"<<endl;
cout<<"行/列 ";
for(c=0; c<=i; c++)
{
cout<<" "<<i<<" "<<endl;
for(l=0; l<=j; l++)
cout<<a[l][c]<<" ";
}
}
// 采用雅克比(Jacobi)迭代法求值
double *Calculate_Jacobi()
{
double epsilon, s;
int k=0;
x = (double *)new double[i];
y = (double *)new double[i];
for(l=0;l<i;l++) x[l]=0;
{
epsilon=0;
k++;
s=0;
for(c=0;c<j;c++)
{
if(l==c) continue;
s+=a[l][c]*x[c];
}
y[l]=(a[l][c]-s)/a[l][c];
epsilon+=fabs(y[l]-x[c]);
}
if(epsilon<EPS) cout<<"迭代次数为:"<<k;
if(k>=MAX)
cout<<"此迭代不具有收敛性"<<endl;
for(l=0;l<i;l++) x[l]=y[l];
return y;
}
//主函数入口
void main()
{
Create_Matrix();
Display_Matrix(a);
Calculate_Jacobi();
cout<<"线性方程组的解为: ";
for(c=0; c<j; i++)
cout<<"x["<<c<<"]="<<y[i];
}
dongyue2008 :还想请问你有没有一次性分配的办法,不要分两步? 展开
1个回答
展开全部
二维数组动态分配内存要分两步,第一步用指向指针的指针生成一维的指针数组,第二步用一维数组中的各个指针分别生成一维数组,这样就得到二维数组。
a = (double **)malloc(sizeof(double *)*(total_elem+1));//动态分配total_elem+1字节的内
你只完成了第一步,当然出错了。
你看一下这里的讲解吧:
http://wenku.baidu.com/view/5d95951ea76e58fafab00368.html
a = (double **)malloc(sizeof(double *)*(total_elem+1));//动态分配total_elem+1字节的内
你只完成了第一步,当然出错了。
你看一下这里的讲解吧:
http://wenku.baidu.com/view/5d95951ea76e58fafab00368.html
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询