статический и динамический массивы

  • Автор темы BattleMage
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

BattleMage

Гость
#1
Здравтвуйте. с такой проблемой ещё никогда не сталкивался: программа верновычисляет определитель любого порядка, если статический массив задан и совершенно неверно - если динамически. объявился все верно. посмотрите плиз! уже мысли не лезут. есть комментарии там - убери, чтобы понять в чём суть! заранее спасибо!)

Код:
#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);*/ 
} 
//---------------------------------------------------------------------------
 
Статус
Закрыто для дальнейших ответов.