Wyznacznik macierzy

0

Witam.
Mam pewien problem z wyznacznikiem macierzy kwadratowej. Problem występuje przy macierzy >=4. Prosiłbym o pomoc. Z góry dziękuje.

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int **Wczytywanie(int *rozmiar);
int Wyznacznik(int rozmiar, int **buffor);
int Sarusa(int rozmiar, int **buffor);
int Tworz_Minor(int rozmiar, int **buffor, int ktory_minor);

int _tmain()
{
    int rozmiar = 0;                                                             // rozmiar macierzy kwadratowej
    int **buffor = Wczytywanie(&rozmiar);
    printf("Wyznacznik tej macierzy to: %d", Wyznacznik(rozmiar, buffor));
    free(buffor);
    getchar();
    return 0;
}

int **Wczytywanie(int *rozmiar)
{
    FILE *plik;
    if ((plik = fopen("macierz.txt", "r")) == NULL)
    {
        printf("Nie mozna otworzyc pliku\n");
        getchar();
        exit(1);
    }

    fscanf(plik, "%d\n", rozmiar);
    int **tab = NULL;
    tab = (int**)malloc(*rozmiar * sizeof(int *));

    int i, j = 0;
    for (i = 0; i < *rozmiar; i++)
    {
        tab[i] = (int*)malloc(*rozmiar * sizeof(int));

        for (j = 0; j < *rozmiar; j++)
        {
            fscanf(plik, "%d", &tab[i][j]);
            printf("%3d ", tab[i][j]);
        }
        printf("\n");
    }

    return tab;
}

int Sarusa(int rozmiar, int **buffor)
{
    int wyznacznik = 0;
    wyznacznik += buffor[0][0] * buffor[1][1] * buffor[2][2];
    wyznacznik += buffor[1][0] * buffor[2][1] * buffor[0][2];
    wyznacznik += buffor[2][0] * buffor[0][1] * buffor[1][2];
    wyznacznik -= buffor[2][0] * buffor[1][1] * buffor[0][2];
    wyznacznik -= buffor[2][1] * buffor[1][2] * buffor[0][0];
    wyznacznik -= buffor[2][2] * buffor[1][0] * buffor[0][1];

    return wyznacznik;
}

int Tworz_Minor(int rozmiar, int **buffor, int ktory_minor)
{
    int wyznacznik_minora = 0;
    int **minor = (int**)malloc(rozmiar*sizeof(int*));                  //alokowanie pamieci dla minora
    for (int z = 0; z < rozmiar; z++)
    {
        minor[z] = (int*)malloc(rozmiar*sizeof(int));
    }

    for (int q = 0; q < rozmiar; q++)                                   //wymelnienie minora
    {
        for (int w = 0; w < rozmiar; w++)
        {
            int flaga = 0;
            if (w == ktory_minor) flaga++;
            minor[q][w] = buffor[q + 1][flaga];                         //q+1 bo pierwszy wieesz usuwamy
            flaga++;
        }
    }
    int potega = 1 + ktory_minor + 1;                                   // 1 i k_m + 1 bo macierze numeruje sie od 1 

    wyznacznik_minora = pow(-1.0, potega) * buffor[0][ktory_minor] * Wyznacznik(rozmiar, buffor);

    return wyznacznik_minora;
}

int Wyznacznik(int rozmiar, int **buffor)
{
    if (rozmiar == 1) return 1;
    else if (rozmiar == 2)
    {
        return (buffor[0][0] * buffor[1][1]) - (buffor[0][1] * buffor[1][0]);
    }
    else if (rozmiar == 3)
    {
        return Sarusa(rozmiar, buffor);
    }
    else if (rozmiar >= 4)
    {
        int suma_wyznacznikow = 0;
        int wyznacznik_minora;
        for (int i = 0; i < rozmiar; i++)
        {
            wyznacznik_minora = 0;
            wyznacznik_minora = Tworz_Minor(rozmiar - 1, buffor, i);
            suma_wyznacznikow += wyznacznik_minora;

        }

        return suma_wyznacznikow;
    }
} 
0

Inaczej wychodzi w excelu , gdzie już jest gotowa funkcja i inaczej z tego programu. Gdzieś musi być błąd, tylko nie bardzo wiem gdzie.

0

No to odpal debuggera i prześledź działanie krok po kroku.

0

jak biore start debuging to od razu program się włącza.

0

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0