Macierz 4x4 – metoda iteracyjna

Macierz 4x4 – metoda iteracyjna
Wiktor Śmiech
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:6
0

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

Kopiuj
#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;
}
edytowany 3x, ostatnio: flowCRANE
flowCRANE
To jest C++, a nie C – zmieniam tagi i kolorowanie.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
2

Której części?

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


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
Wiktor Śmiech
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:6
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.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
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?


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Wiktor Śmiech
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:6
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.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
0

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


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
Wiktor Śmiech
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:6
0

Jest wywolywana.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

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

Defcer
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 lata
  • Postów:14
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ś.

edytowany 2x, ostatnio: Defcer
vpiotr
Plus za cierpliwość
Wiktor Śmiech
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:6
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ą.

Defcer
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 lata
  • Postów:14
0

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

Kopiuj
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.

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

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

edytowany 4x, ostatnio: Defcer
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Defcer
Tak widzę zią. Gość napisał, że proszę o wytłumaczenie nie ma nic o treści zadania czy czymkolwiek...
flowCRANE
Zapewne dorwał skądś gotowca i teraz usiłuje go zrozumieć, zanim odda go na zaliczenie. ;)
Defcer
Problemy studentów :P
CZ
no dobra, ale czy nie można inkrementować tego w jednej pętli a nie 16? O ile sie nie myle algorytmy na macierzach są rzędu n^3 a nie n^16 XDDD
enedil
@Czitels: pokaż mi algorytm generujące wszystkie możliwe macierze w O(n^3) czasu xD. Nie wspominając, że to n w n^3 jest innym n niż to w n^16.
Wiktor Śmiech
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:6
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.

edytowany 1x, ostatnio: Wiktor Śmiech
Defcer
Może się gościu z Ciebie śmieje? Masz użyć tylko techniki iteracyjnej? Albo po prostu chodzi mu o to żebyś poczekał dostał jakikolwiek wynik i go zapisał plus zobaczył ile to zajęło. Nie mam innego pomysłu.
CZ
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 dni
  • Postów:2287
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.

Defcer
Tam jest warunek. Wypełnia się, ale zanim jej wyznacznik będzie równy jeden to trochę potrwa.
CZ
@Defcer: odpaliłem go u siebie i zastanawiam się po co prowadzący coś takiego daje swoim studentom? Albo lepiej ... Komu się tak bardzo nudziło, że naklepał taki piękny kod?
WU
Będę zgadywał. Daje po to, aby potem pokazać, że ten sam efekt można uzyskać w znacznie prostszym kodzie rekurencyjnym. Pozdrawiam.
Defcer
@Czitels myślę, że faktycznie ten prowadzący chce pokazać bezsensowność tej metody w takich przypadkach. Tylko zastanawia czemu akurat tak? Przecież wystarczy pokazać i powiedzieć, że można to zrobić inaczej i rzucić hasłem "rekurencja", albo "programowanie dynamiczne".
WU
Potem powie studentom, zmieńcie to na macierz 3x4 i zobaczą ile motania jest przy rozwiązaniu bez rekurencji.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
wil
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 6 lat
0

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

flowCRANE
Jak nie rozumiesz tego co napisałem to nie komentuj.
vpiotr
W sumie to nie wiem jak można było przeoczyć ostatnią część zdania.
enedil
@furious programming: a skąd wniosek, że ten post odpowiada na Twój? Słuszna uwaga, że funkcja det jest O(n!), dla macierzy n na n, podczas gdy da się bez problemu osiągnąć O(n^3).
flowCRANE
@enedil: a skąd wniosek, że nie? Tylko ja w tym wątku napisałem o rekurencji, więc to oczywiste.
enedil
@furious programming: skoro pisze o eliminacji Gaussa, no to chyba wiadomo, że odwołuje się do tej fatalnej implementacji liczenia wyznacznika.
wil
Pisałem do autora tematu, a nie do ciebie. No, a redukcja macierzy do postaci trójkątnej, czyli inaczej: eliminacja Gaussa, to chyba opytmalna metoda na wyliczenie wyznacznika.
flowCRANE
„a nie jakieś te... rekurencyjne pierdoły z teorii.” – doprawy nie do mnie? OP ani raz nie wspomniał o rekurencji, więc jak – komentujesz wyimaginowane odpowiedzi, czy tłumaczysz się teraz, bo nie zrozumiałeś żartu?
wil
Niczego nie komentowałem - podałem tylko sensowną metodę na liczenie detA, która jest lepsza od tej rekurencyjnej - z rozwijania wg wiersza, itd.
enedil
Panie wściekły programisto, naprawdę nie ma się o co spinać. Przeczytaj raz jeszcze o co chodzi, przeczytaj raz jeszcze kod OP, zobaczysz że nie masz najmniejszej racji.
enedil
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 4 godziny
  • Postów:1027
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.

edytowany 1x, ostatnio: enedil
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)