problemy z algorytmem projekt na aisd

0

Witam mam problem z projektem (kolega wczesiej pisal o wyjasnienie jego kodu mamy ten sam projekt inne grupy cw)
Zadanie brzmi
Wyznaczenie wyznacznika macierzy 4x4/8x8/16x16 zadanym zakresie elementow calkowitych np od 0 do 100(moze byc inny) tak aby wyznacznik byl rowny 1-metoda iteracyjna i za pomoca generatora licz pseudolosowych-zapis uzyskanych rozwiazan do pliku bez powtorzen.

zauwazylem ze po jakims czasie sie zacina w 2x2/4x4 nie idzie dalej
jak dam petle nieskonczona to znajdzie tylko dana liczbe macierzy jak np do 10m wygenerowanych macierzy
gdzies cos sypie sie w algorytmie tzn jest dobry ale np zauwazylem ze wypisuje macierze o wyznaczniku 2 rowniez bo widzi ze to jest det 1

ten blad zauwazylem na 2x2 np 28 27 29 27 ale 30 27
1 1 to wychodzi det 0 1 1 det=1 1 1 det=3

czyli roznica pomiedzy liczbami 1 lub 2 zaniza det o 1 mnie ale juz przy 3 jest ok. Oczywscie w innych przypadkach dziala ok, ale trace duuuzo macierz jak roznica jest 1. Przy wiekszych stopniach np 5x5 1 macierz na 100 ma det.

no i zawiesza sie albo nie wazne ile ma wygenerowac macierzy to i tak liczba ta sama tzn 10m tyle samo co w petli nieskończonej.

Jestem poczatkujacy w tym wszystkim

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

// *** Macierze prostok¹tne typu double (liczby zmiennoprzecinkowe)
double ** L;
double ** U;
// *** Macierz prostok¹tna typu int (liczby ca³kowite)
int ** A;
// *** Pojedyncza zmienna int
int N;
int i,t;


//funkcje pomocnicze do obliczenia wyznacznika
// *** Przyjmuje numer wiersza (i) oraz kolumny (j).
// *** Iteruje w pêtli po wierszu macierzy L i kolumnie macierzy U mno¿¹c aktualne wspó³czynniki (liczby typu double).
// *** Ka¿dy obieg pêtli dodaje uzyskan¹ liczbê do wyniku (ret typu double).
// *** Zwraca wynik (ret).
double suma1(int i, int j) {
	double ret=0;

	for(int k=0;k<i;k++){

		ret+=L[i][k]*U[k][j];

	}
	return ret;
}

// *** Identyczne jak funkcja suma1, ale parametry s¹ zamienione; j to wiersz macierzy L, i to kolumna macierzy U.
double suma2(int i, int j) {
double ret=0;

	for(int k=0;k<i;k++){

		ret+=L[j][k]*U[k][i];

	}
	return ret;
}


double wyznacznik(int ** A){ //funkcje liczaca wyznacznik z podanej macierzy metoda LU
	int w=U[0][0];

	for(int i=0;i<N;i++){
	for(int j=0;j<N;j++){

	U[i][j]=0;
	L[i][j]=0;
}
            for (int i=0;i<N;i++)
            {
                L[i][i]=1;
            }
}

		for(int i=0;i<N;i++){

			for(int j=i;j<N;j++){



				U[i][j]=A[i][j]-suma1(i,j);

			}


			for(int j=i+1;j<N;j++){


				L[j][i]=(1/U[i][i])*(A[j][i]-suma2(i,j));

			}

		}
		for(int i=0;i<N;i++)w*=U[i][i]; // wyznacznik = iloczynowi elementów na przek¹tnej macierzy U


		return w;
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stdio.h>
#include <stdlib.h>
}

// *** Struktura która w sumie nic nie wnosi, mog³oby jej nie byæ
struct powtorzenie{// element przechowujacy macierze zapisane do pliku
	int **A;
};


bool sprawdz(int **A,powtorzenie *B,int k){//funkcja sprawdza czy macierz sie nie powtorzyla

		for(int x=0;x<k;x++)
        {

			bool c=true;
			for(int i=0;i<N;i++){

			for(int j=0;j<N;j++){
				if(B[x].A[i][j]!=A[i][j])c=false;
			}
		}
		if(c)return true;
		}
		return false;
	}


int main(){
	 printf ("Podaj rozmiar tablicy(4,8,16):");

	 // *** Wprowadzenie liczby ca³kowitej do zmiennej N
	 scanf("%i",&N);


	// *** Utworzenie macierzy L o rozmiarze NxN (double)
	L=new  double*[N];
	for(int i=0;i<N;i++)L[i]=new double[N];

	// *** Utworzenie macierzy U o rozmiarze NxN (double)
	U=new double*[N];
	for(int i=0;i<N;i++)U[i]=new double[N];

	// *** Utworzenie macierzy A o rozmiarze NxN (int)
	A=new int*[N];
	for(int i=0;i<N;i++)A[i]=new int[N];

	powtorzenie *B=new powtorzenie[1000];
	int k=0;

	// *** Uchwyt do pliku
	FILE *f;

   // *** Sprawdza czy obok pliku wykonywalnego ca³y ten kod (tak podana œcie¿ka...) znajduje siê plik pl_wynik.txt, jeœli nie to wywala b³¹d
   if ((f=fopen("p1_wynik.txt", "w"))==NULL) {
     printf ("Nie mogê otworzyæ pliku test.txt do zapisu!\n");
     exit(1);
     }


	fprintf (f, "Wygenerowane macierze ktorych wyznacznik wynosi 1: \n \n ");

	for(t=1;t<100000000;t++)
    {// liczba obrotów oznacz ilosc wygenerowanych i sprawdzonych tablic

		for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			A[i][j]=rand()%10; //zakres od zera do podanej liczby
		}
	}

	if(wyznacznik(A)==1 ){

		if(!sprawdz(A,B,k)){

			B[k].A=new int*[N];
			for(int i=0;i<N;i++) B[k].A[i]=new int[N];
			fprintf (f, "\n ");
			printf ( "\n ");

			for(int i=0;i<N;i++) {
				for(int j=0;j<N;j++) {

					fprintf (f, "%i ", A[i][j]);
					printf ( "%i ", A[i][j]);


					B[k].A[i][j]=A[i][j];
				}

				fprintf (f, "\n ");
				printf ( "\n ");
			}

			fprintf (f, "\n ");
			printf ( "\n ");
			k++;
		}
		}

    }

fclose (f);

	return 0;
}

****
0

jeden problem rozwiazany w funkcji wyznacznik zamiast int w=U[0][0]; powinno byc double w=1.0; czy ktos ma pomysl dlaczego moze program sie wieszac zacinac albo wyszukuje bardzo malo macierzy ??

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