Вычисление детерминанта матриц на основе рекурсивного алгоритма - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите с написанием программы для вычисления детерминанта матриц на основе рекурсивного алгоритма. Находил подобную программу на Delphi, Pascal и отрывками на C++, а вот на С нету

Решение задачи: «Вычисление детерминанта матриц на основе рекурсивного алгоритма»

textual
Листинг программы
#include <conio.h> 
#include <stdio.h> 
#define n 4
 
 
 
int main (void)
{
    int Minor (int *ptr, int *ptr2, int nn, int row, int col);
    long int Determinant (int *ptr, int nn);
 
    long int det;
    //int i, j;
    int M[n][n] = {
        {3, 5, 7, 8},
        {-1, 7, 0, 1},
        {0, 5, 3, 2},
        {1, -1, 7, 4}
    };
    int *ptr;
 
    ptr = &M[0][0];
    
    det = Determinant (&M[0][0], n);
    printf("\n\t Determinant = %d", det);
    
    printf("\n\n Press any key: ");
    _getch();
    return 0;
 
}
 
 
 
int Minor (int *ptr, int *ptr2, int nn, int row, int col)
{
    int ki, kj, di = 0, dj;
 
    for (ki = 0; ki < nn - 1; ki++)
    {
        if (ki == row)
            di = 1;
        dj = 0;
 
        for (kj = 0; kj < nn - 1; kj++)
        {
            if (kj == col)
                dj = 1;
            *(ptr2 + ki*nn + kj) = *(ptr +(ki + di)*nn + (kj + dj)); 
        }
    }
 
}
 
 
long int Determinant (int *ptr, int nn)
{
    long int i, j, d = 0, k = 1;
    int R[n][n] = {0};
    int *ptr2, **ptr3;
 
    ptr2 = &R[0][0];
    ptr3 = &ptr;
 
    if (nn < 1)
        return 1;
    else if (nn == 1)
        d = *ptr;
    else if (nn == 2)
        d = *ptr * *(ptr + nn + 1) - *(ptr + nn) * *(ptr + 1);
    else 
        for (i = 0; i < nn; ++i)
        {
            Minor (*ptr3, &R[0][0], nn, i, 0);
            d += k * *(ptr + i*nn) * Determinant (&R[0][0], nn - 1);
            k = -k;
            
        }
 
    return d;
 
}

Объяснение кода листинга программы

В этом коде реализован алгоритм вычисления определителя матрицы. Определитель вычисляется путем последовательного применения операций элементарного преобразования матрицы. Список действий:

  1. Ввод матрицы M. Матрица M размером 4x4 заполняется значениями.
  2. Вычисление определителя. Вызывается функция Determinant, которая возвращает определитель матрицы.
  3. Вывод определителя. Результат вычисления определителя выводится на экран.
  4. Ввод ключа. Программа ожидает нажатия любой клавиши, чтобы продолжить выполнение. Функция Minor используется внутри функции Determinant и рекурсивно вызывает себя для вычисления миноров матрицы R. Вот список действий в функции Determinant:
  5. Базовый случай. Если размер матрицы меньше или равен 1, то определитель равен 1.
  6. Случай размера 2. Если размер матрицы равен 2, то определитель вычисляется как произведение диагональных элементов матрицы.
  7. Рекурсивный случай. Если размер матрицы больше 2, то для каждого элемента в первом столбце матрицы R вызывается функция Minor, которая вычисляет минор этого элемента.
  8. Сложение и умножение. К полученному значению d добавляется произведение текущего элемента матрицы и определителя матрицы R, уменьшенного на 1.
  9. Меняем знаки. Знак k меняется на противоположный, чтобы обеспечить циклическое перебор строк.
  10. Рекурсивный вызов. Вызывается рекурсивный случай для следующей строки.
  11. Возврат результата. Результат вычисления определителя возвращается из функции.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.5 из 5
Похожие ответы