B
Здравтвуйте. с такой проблемой ещё никогда не сталкивался: программа верновычисляет определитель любого порядка, если статический массив задан и совершенно неверно - если динамически. объявился все верно. посмотрите плиз! уже мысли не лезут. есть комментарии там - убери, чтобы понять в чём суть! заранее спасибо!)
Код:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
float Det(float *matrix, int size)
{
float *submatrix;
float det=0.0;
if (size>1)
{
submatrix=(float*)malloc((size-1)*(size-1)*sizeof(float));
for (int i=0;i<size;i++)
{
// создание нового массива submatrix
for (int j=0;j<size-1;j++)
for (int k=0;k<size-1;k++)
*(submatrix+j*(size-1)+k)=*(matrix+(j+1)*size+(k<i?k:k+1));
// вызов рекурсивной функции Det с параметром submatrix
det+=*(matrix+i)*(i/2.0==i/2?1:-1)*Det(submatrix,size-1);
}
free(submatrix);
} else det=*matrix;
return det;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Вычисление определителя квадратной матрицы А, размерностью n x n
//
// Описание метода:
// Метод основан на двух утверждениях:
// 1) det A = a11, где А - матрица размерностью 1 x 1
// 2) |a11 a12 a13 ... a1n| |a11 a12 .. a1(i-1) a1(i+1) .. a1n |
// |a21 a22 a23 ... a2n| n i+1 |a21 a22 .. a2(i-1) a2(i+1) .. a2n |
// det A=|a31 a32 a33 ... a3n| = SUM (-1) a1i * det |a31 a32 .. a3(i-1) a3(i+1) .. a3n |
// |...................| i=1 |................................ |
// |...................| |an1 an2 .. an(i-1) an(i+1) .. ann |
// |an1 an2 an3 ... ann|
/*int i;
float **matrix=(float**)malloc(n*sizeof(float*));
for(i=0;i<n;i++) matrix[i]=(float*)malloc(n*sizeof(float));*/
float matrix[4][4];
for (int k=0;k<4;k++)
for (int h=0;h<4;h++)
if (k==h) matrix[k][h]=1; else matrix[k][h]=0;
/*matrix[0][0]=3.0;
matrix[0][1]=2.0;
matrix[0][2]=-1.0;
matrix[0][3]=0.0;
matrix[1][0]=1.0;
matrix[1][1]=-2.0;
matrix[1][2]=0.0;
matrix[1][3]=1.0;
matrix[2][0]=2.0;
matrix[2][1]=3.0;
matrix[2][2]=4.0;
matrix[2][3]=9.0;
matrix[3][0]=2.0;
matrix[3][1]=2.0;
matrix[3][2]=1.0;
matrix[3][3]=5.0;*/
float opred=Det(matrix[0], 4);
ShowMessage(opred);
/*for(i=0;i<4;i++) free(matrix[i]);
free(matrix);*/
}
//---------------------------------------------------------------------------