Macierz 4x4 – metoda iteracyjna

0

Witam. Prosiłbym o wytłumaczenie działania programu.

#include <iostream>
#include <cstdlib>
#include <fstream>
#define N 4

using namespace std;

int zapisz(int mat1[4][4])
{
    fstream plik;
    plik.open("plik.txt", ios::out | ios::app);
    int i,j,k;
    if(!plik.good())
    {
        cout << "Blad wczytywania pliku" << endl;
        return 0;
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            plik << mat1[i][j] << " ";
        }
        plik << endl;
    }
    plik << endl;
    plik.close();
    return 0;
}


void dop(int mat2[N][N], int temp1[N][N], int p, int q, int n)
{
    int i=0,j=0,w,k;
    for (w=0;w<n;w++)
    {
        for (k=0;k<n;k++)
        {
            if (w!=p && k!=q)
            {
                temp1[i][j++]=mat2[w][k];
                if (j==n-1)
                {
                    j=0;
                    i++;
                }
            }
        }
    }
}

int det(int mat1[N][N], int n)
{
    if(n==1)
    {
        return mat1[0][0];
    }
    int temp[N][N];
    int znak=1,d=0;
    for(int f=0;f<n;f++)
    {
        dop(mat1,temp,0,f,n);
        d+=znak*mat1[0][f]*det(temp,n-1);
        znak=-znak;
    }

    return d;
}

int main()
{
    int i,j,k,tab[16];
    int mat[N][N];
    for(tab[0]=1;tab[0]<=100;tab[0]++)
    {
        for(tab[1]=1;tab[1]<=100;tab[1]++)
        {
            for(tab[2]=1;tab[2]<=100;tab[2]++)
            {
                for(tab[3]=1;tab[3]<=100;tab[3]++)
                {
                    for(tab[4]=1;tab[4]<=100;tab[4]++)
                    {
                        for(tab[5]=1;tab[5]<=100;tab[5]++)
                        {
                            for(tab[6]=1;tab[6]<=100;tab[6]++)
                            {
                                for(tab[7]=1;tab[7]<=100;tab[7]++)
                                {
                                    for(tab[8]=1;tab[8]<=100;tab[8]++)
                                    {
                                        for(tab[9]=1;tab[9]<=100;tab[9]++)
                                        {
                                            for(tab[10]=1;tab[10]<=100;tab[10]++)
                                            {
                                                for(tab[11]=1;tab[11]<=100;tab[11]++)
                                                {
                                                    for(tab[12]=1;tab[12]<=100;tab[12]++)
                                                    {
                                                        for(tab[13]=1;tab[13]<=100;tab[13]++)
                                                        {
                                                            for(tab[14]=1;tab[14]<=100;tab[14]++)
                                                            {
                                                                for(tab[15]=1;tab[15]<=100;tab[15]++)
                                                                {
                                                                    mat[0][0]=tab[0];
                                                                    mat[0][1]=tab[1];
                                                                    mat[0][2]=tab[2];
                                                                    mat[0][3]=tab[3];
                                                                    mat[1][0]=tab[4];
                                                                    mat[1][1]=tab[5];
                                                                    mat[1][2]=tab[6];
                                                                    mat[1][3]=tab[7];
                                                                    mat[2][0]=tab[8];
                                                                    mat[2][1]=tab[9];
                                                                    mat[2][2]=tab[10];
                                                                    mat[2][3]=tab[11];
                                                                    mat[3][0]=tab[12];
                                                                    mat[3][1]=tab[13];
                                                                    mat[3][2]=tab[14];
                                                                    mat[3][3]=tab[15];
                                                                    if(det(mat,N)==1)
                                                                    {
                                                                        zapisz(mat);
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}
2

Której części?

Szczerze mówiąc, to wolałbym poznać wytłumaczenie autora, dlaczego wyprodukował takiego drabiniastego crapa. ;)

0

z tego co rozumiem to program ma obliczyc wyznacznik macierza 4x4 a nastepnie zapisac do pliku. Problem w tym, ze program jest ok a nic sie nie dzieje.

0
Wiktor Śmiech napisał(a):

Problem w tym, ze program jest ok a nic sie nie dzieje.

Opisz problem sensownie – ten program działa prawidłowo, czy nie działa? Wypisuje prawidłowe wyniki, czy błędne?

0

Program ma obliczyc i zapisac macierz w pliku. Problem w tym, ze nic nie zapisuje. Nie wyskakuja zadne bledy w kompliatorze. Nic sie nie dzieje.

0

Funkcja zapisz jest w ogóle wywoływana? Sprawdź pod debuggerem – postaw na niej breakpoint.

0

Jest wywolywana.

0

Wytłumaczenie jest takie, że ktoś (autor programu) robi sobie z Ciebie jaja.

1

Czy Ty wgle wiesz o co tu chodzi i co to za zadanie? Przecież to wchodzi w pętle nieskończoną albo masakrycznie długo będziesz czekać na wynik. Jakie wartości przyjmuje ta macierz czy jakie ma przyjmować? Też chciałbym poznać tego kogoś.

0

Zadanie polega na wyznaczeniu macierzy 4x4 o zadanym zakresie elementów całkowitych (przyjete od 1 do 100) tak, aby wyznacznik był równy 1 – metodą iteracyjną.

0

Pewnie da się to zrobić taką pętlą. Tylko pomyśl nad warunkami:

for(int i=0;i<4;i++)
{
	for(int j=0;j<4;j++)
	{
	if(...)
	tab[i][j]=...
	}
}

A to sobie poczekasz po prostu. Chyba że znasz jakieś triki z algebry.
Poza tym magii tu nie ma po prostu zwiększa się liczba w danym polu macierzy i za każdym razem liczy wyznacznik i sprawdza czy jest równe jeden. Można na 100% napisać to prościej plus na wynik pewnie poczekasz. A nie zapisuje nic bo nie ma czego zapisać. Dopiero jak dostaniesz wynik to zapisze. Wpisz sobie napis w każdej linijce np.

cout << "Wyswietlam linijke" << i << j << tab[i][j] << endl; 

i moze wtedy zrozumiesz jak to działa. Totalne podstawy.

0
Defcer napisał(a):

Jakie wartości przyjmuje ta macierz czy jakie ma przyjmować?

To jest klasyczny brute force, w którym iteratorami pętli są elementy tablicy. Tak więc zawartość tablicy determinowana jest w pętlach, gdzie po spełnieniu zadanych kryteriów tablica jest zapisywana do pliku.

0

W tym wszystkim chodzi o to, ze mam zrobic z tego projekt. Dostalem taki program na macierz 4x4, dobrze wiem, ze troche to potrwa... Moj wykladowca kazal mi przeksztalcic go na macierz 6x6 i zostawic go na kilka godzin xD ja sam juz zgupialem.

@Edit rowniez program wykorzystujacy liczby pseudolosowe.

0

Złożoność obliczeniowa tego to chyba n^16. Nie wierzę, żeby ktoś to na poważnie pisał.
Skoro się wywołuje funkcja to czemu nie zapisuje do pliku? Sprawdź w co siedzi w "mat1" czy tablica jest wypełniona.

0

Można by było spróbować zastąpić tę drabinkę pętli, dlatego że w niej są hardkodowane indeksy komórek. Można by tu zastosować rekurencję – ot na złość prowadzącemu.

0

Do wyliczania wyznaczników służy eliminacja Gaussa, a nie jakieś te... rekurencyjne pierdoły z teorii.

0

Nie doczekasz się, bo zajmie to wszytsko Tobie jakieś 100^16 = 10^32 = 2^100 operacji. Ktoś sobie z Ciebie robi jaja.

Jeśli natomiast musisz wygenerować jedną macierz o wyznaczniku 1, no to nic prostszego, macierz jednostkowa spełnia ten warunek.

Zakładając jednak, że nie jest, to kilka obserwacji:
Można też znacznie skrócić czas działania zauważając, że

  • wyznacznik macierzy o elementach całkowitych jest całkowity
  • jeśli przemnożymy kolumnę lub wiersz przez stałą, to wyznacznik nowej macierzy będzie iloczynem tej stałej i starego wyznacznika

Z tego wynika, że jeśli w którejś kolumnie lub wierszu istnieje wspólny dzielnik wyższy niż 1, to z pewnością wyznacznik nie będzie równy 1.

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