1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

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

    BattleMage Гость

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

    Код:
    #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);*/ 
    } 
    //---------------------------------------------------------------------------
     
Загрузка...
Статус темы:
Закрыта.

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