• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

bledne wyswietlenie macierzy o det=1

Object Storage Arubacloud
0 głosów
116 wizyt
pytanie zadane 15 czerwca 2018 w C i C++ przez Mattryca Nowicjusz (160 p.)

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

 

komentarz 16 czerwca 2018 przez Sedi Stary wyjadacz (10,200 p.)
Co to znaczy wyznacznikiem była 1 metoda iteracyjna? PS. Musisz użyć C, czy C++? To dwa różne języki, a widzę biblioteki z C++ pomieszane z C
komentarz 16 czerwca 2018 przez Mattryca Nowicjusz (160 p.)
chcial w c wiec napisane jak w c ale wykorzystuje c++.

Ma wypisac i zapisac w pliku macierze o wyznaczniku rownym 1
komentarz 16 czerwca 2018 przez Sedi Stary wyjadacz (10,200 p.)
edycja 16 czerwca 2018 przez Sedi

Hmm, dziwny ten kod. Co np. oznacza :

A[i][j]=rand()%5

? Po co tam 5? I PS. Przebijanie się przez taki kod, w którym dominują same obliczenia nie jest proste. I powiem otwarcie, że raczej nikt Ci tego nie będzie analizował linijka po linijce, zwłaszcza że w kodzie widać takie niespójności jak np: 

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

Ustawiasz tablice dwuwymiarowe o elementach i i i na 1, a potem w tej samej funkcji mnożych w, które wynosi 1 z 1.Poza tym naprawdę musisz używać tablic dwuwymiarowych? Zawsze możesz użyć zapisu liczba kolumn * wierszy. I operować na nich.

komentarz 16 czerwca 2018 przez Mattryca Nowicjusz (160 p.)
A[i][j]=rand()%5  pseudolosowe liczby zakres i przypisanie

 

na probe dalem 5 zeby za duzego zakresu nie bylo

1 odpowiedź

0 głosów
odpowiedź 17 czerwca 2018 przez Mattryca Nowicjusz (160 p.)
znalazlem blad  poczatek funkcji wyznacznik powinno to tak byc zapisane

 

double w=1.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;
            }

 

 

Czy moglby ktos podpowiedziec albo wskazac blad w kodzie gdyz program sie zawiesza

Podobne pytania

0 głosów
1 odpowiedź 188 wizyt
pytanie zadane 1 maja 2019 w C# przez Krystek102 Bywalec (2,440 p.)
0 głosów
0 odpowiedzi 221 wizyt
0 głosów
1 odpowiedź 629 wizyt
pytanie zadane 19 lipca 2015 w C# przez Shreder67 Nowicjusz (120 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...