我的名字是Daniele,我是C++
初学者。在这个时期,我正在尝试改进指针,递归函数和动态内存分配。
出于这个原因,我写了一个代码来找到方阵的行列式。
这段代码似乎可以完成它的工作但是给我一些问题。当我完成代码时,使用5x5矩阵的测试程序崩溃了;然后我将函数的返回值和DET变量从int更改为double。事情似乎变得更好但是当我用5x5身份进行测试时,程序再次崩溃,我不知道为什么。
另一个问题,我必须首先纠正最后一个调用递归函数的if-else控制语句是
if (dyn_dim > 3)
{
DET = DET + coeff*funz_det (temp, (dyn_dim-1));
}
else
{
return (temp[0][0]*temp[1][1]-temp[0][1]*temp[1][0]);
}
我在网上看过这个,但是因为我的代码不起作用。 为什么如果我把DET变量作为外部变量,代码也不起作用? 最后但并非最不重要的。我以你能看到的方式递归调用函数,但是在if-else contro语句中编写递归函数体是否更好?或者它是否相同? 我不想为行列式本身编写此算法,而是针对涉及的技能。 非常感谢大家 (我提前为我的英语道歉)
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
double funz_det (int **a, int dyn_dim) // dyn_dim: the dynamic dimension created for sub-matrix
{
double DET = 0;
/*Create dynamically the new sub-matrix*/
int **temp;
temp = new int*[dyn_dim-1];
for(int i=0; i<dyn_dim; i++)
{
temp[i] = new int[dyn_dim-1];
}
//////////////////////////////////////
int coeff = 0;
int BR = 0;
int BC = 0;
int row_index = 0;
int column_index = 0;
for (BC = 0; BC != dyn_dim; BC++)
{
for (int i=0; i<dyn_dim; i++)
{
for (int j=0; j<dyn_dim; j++)
{
if (i==BR && j==BC)
{
coeff = a[i][j];
int esp = i+j;
coeff = pow(-1,esp)*coeff;
row_index--;
}
if (i!=BR && j!=BC)
{
temp[row_index][column_index] = a[i][j];
column_index++;
}
}
column_index = 0;
row_index++;
}
row_index = 0;
if (dyn_dim > 3)
{
DET = DET + coeff*funz_det (temp, (dyn_dim-1));
}
else
{
DET = DET + coeff*(temp[0][0]*temp[1][1]-temp[0][1]*temp[1][0]);
}
}
return DET;
}
int main()
{
int dimension = 0;
cout << "Please insert the matrix dimension: ";
cin >> dimension;
cout << endl << endl;
int **A;
A = new int*[dimension];
for(int d=0; d<dimension; d++)
{
A[d] = new int[dimension];
}
for (int i=0; i<dimension; i++)
{
for(int j=0; j<dimension; j++)
{
cout << "Please insert the element A[" << i << "][" << j << "] = ";
cin >> A[i][j];
}
}
cout << endl << endl;
for (int display_row=0; display_row<dimension; display_row++)
{
for(int display_column=0; display_column<dimension; display_column++)
{
cout << A[display_row][display_column] << " ";
}
cout << endl << endl;
}
cout << endl << endl;
cout << "Determinant Value = " << funz_det(A,dimension) << endl;
system ("PAUSE");
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
您的代码崩溃是C ++中的一个常见方面,并且通常在您启动时。问题是你没有删除动态指针。在功能开始时查看何时创建子矩阵?好吧,你在指针上使用'new',当然这是正确的,但你总是应该在指针离开范围之前使用'delete'来销毁你用'new'创建的任何指针。如果你不这样做,你将有内存泄漏,并且运行中崩溃错误是被遗忘的指针的正常症状......