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;
}
****