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

Тема в разделе "Общие вопросы по С и С++", создана пользователем BattleMage, 6 май 2009.

Статус темы:
Закрыта.
  1. BattleMage

    BattleMage Гость

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

    Код (Text):
    #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);*/
    }
    //---------------------------------------------------------------------------
     
Загрузка...
Похожие Темы - статический динамический массивы
  1. xbeetle
    Ответов:
    15
    Просмотров:
    927
  2. WingmanIX
    Ответов:
    2
    Просмотров:
    1.450
  3. Marazm
    Ответов:
    0
    Просмотров:
    1.292
  4. Mitya
    Ответов:
    6
    Просмотров:
    2.056
  5. Ruslan737
    Ответов:
    0
    Просмотров:
    1.106
Статус темы:
Закрыта.

Поделиться этой страницей