Witam
Dostalismy projekt do wykonania:
wyznaczenie wyznacznika macierzy 4x4/8x8/16x16 o zadanym zakresie elementow calkowitych np od 0 do 100 tak aby wyznacznik byl ==1 metoda iteracyjna i za pomoca generatora licz pseudolosowych -zapisz uzyskanych rozwiazan do pliku bez powtorzen.
problem jest taki ze zalezy jaki zakres to roznie dziala czasem nic a czasem do jakiegos momentu zacina sie
#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;
//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=1; //wyznacznik
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++)
{
U[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;
}
// *** 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(int t=0;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()%5; //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;
}