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