Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zagnieżdzanie pętli

Ostatnio zmodyfikowano 2018-04-15 22:13
Autor Wiadomość
Pawełek
Temat założony przez niniejszego użytkownika
Zagnieżdzanie pętli
» 2018-04-15 21:15:57
Dlaczego w tym kodzie
C/C++
#include <iostream>
using namespace std;

int main()
{ int a = 1;
    int b = 1;
    int c = 1;
    int d = 1;
    int e = 1;
    for( a = 1; a <= 3; a++ )
    { cout << a << " " << b << " " << c << " " << d << " " << e << endl;
        for( b = 1; b <= 3; b++ )
        { cout << a << " " << b << " " << c << " " << d << " " << e << endl;
            for( c = 1; c <= 3; c++ )
            { cout << a << " " << b << " " << c << " " << d << " " << e << endl;
                for( d = 1; d <= 3; d++ )
                { cout << a << " " << b << " " << c << " " << d << " " << e << endl;
                    for( e = 1; e <= 3; e++ )
                         cout << a << " " << b << " " << c << " " << d << " " << e << endl;
                   
                } } } }
    return 0;
   
}
 ostatnia zmienna (zmienna "e") dochodzi do wartości 4 podczas gdy w ostatniej pętli jest wyrażnie zaznaczone "e<=3" zresztą wszystkie pętle są zrobione identycznie a tylko w ostatniej zmienna dochodzi do wartości 4. Zresztą zauważyłem że to nie pierwszy taki przypadek w historii moich kontaktów z pętlą for gdy jakaś zmienna mając warunek (zmienna<=x) dostaje wartość x+1. Czy to może być jakiś błąd ze strony kompilatora?
P-170707
Pawełek
Temat założony przez niniejszego użytkownika
» 2018-04-15 21:22:07
W drugim zadaniu jest podobnie
C/C++
#include <iostream>
using namespace std;

int main()
{ int a = 1;
    int b = 1;
    int c = 1;
   
    for( a = 1; a <= 5; a++ )
    { cout << a << " " << b << " " << c << endl;
        for( b = 1; b <= 5; b++ )
        { cout << a << " " << b << " " << c << endl;
            for( c = 1; c <= 5; c++ )
            { cout << a << " " << b << " " << c << endl;
               
            } } }
    return 0;
   
}

Zmienna c dochodzi do wartości 6 zamiast 5.
P-170708
Luq
» 2018-04-15 21:37:36
Po ostatnim obiegu najbardziej wewnętrznej pętli c będzie miało wartość 6. Przy kolejnym obiegu bardziej zewnętrznej pętli ta wartość się nie zmieni, zanim program nie wejdzie znowu do tej wewnętrznej pętli. A zanim to się stanie, wykonuje się wypisanie podczas którego c == 6.
P-170709
YooSy
» 2018-04-15 21:39:55
Napisz może jaki jest cel takiego zagnieżdżenia, bo wydaje mi się kod mocno przekombinowany.
Używaj debugera.
P-170710
Pawełek
Temat założony przez niniejszego użytkownika
» 2018-04-15 21:42:04
Zadanie do pierwszego kodu
Wyobraź sobie, że masz pięć pudełek. W każdym pudełku możesz umieścić jedną liczbę całkowitą z przedziału od 1 do 3 włącznie. Napisz program, który wypisze na ekranie wszystkie możliwe kombinacje w jaki sposób można zapełnić pudełka. Fragment danych wypisywanych na ekranie:

zadanie do drugiego kodu
Wyobraź sobie, że masz pięć piłek i chcesz wylosować trzy z nich. Napisz program, który wypisze na ekranie wszystkie możliwe kombinacje piłek jakie można wylosować. Dane jakie powinny zostać wypisywane na ekranie:
P-170711
Pawełek
Temat założony przez niniejszego użytkownika
» 2018-04-15 21:43:48
Po ostatnim obiegu najbardziej wewnętrznej pętli c będzie miało wartość 6. Przy kolejnym obiegu bardziej zewnętrznej pętli ta wartość się nie zmieni, zanim program nie wejdzie znowu do tej wewnętrznej pętli. A zanim to się stanie, wykonuje się wypisanie podczas którego c == 6.

Rozumiem że się nie zmieni, ale zastanawia mnie tylko dlaczego zmienna c przyjmuje wartość 6 skoro wyraźnie w warunku napisałem 'c<=5'. Skąd więc ta 6? Maxymalną wartość jaka zmienna c powinna dostać to 5. Podobnie w pierwszym kodzie zmienna e max wartość powinna dostać 3 nie 4 bo przecież też jest warunek "e<=3" i teraz niewiem czyja to jest wina, moja czy kompilatora/środowiska.
P-170712
Luq
» 2018-04-15 22:01:13
Pętla wykonuje się tak długo, dopóki warunek jest spełniony. Skoro program wyszedł z tej pętli, to warunek nie był spełniony.
c = 5 spełnia warunek pętli i w związku z tym kod pętli jest wykonywany. W kolejnej iteracji następuje inkrementacja ++c, po której c ma wartość 6 i następuje sprawdzenie warunku, który tym razem nie jest spełniony i następuje przeskoczenie pętli. Najlepiej sobie prześledź działanie tego programu w debuggerze.
P-170713
YooSy
» 2018-04-15 22:13:10
Zmienne użyte do iteracji w pętlach zdefiniowane są przed pętlami, więc każda zmiana jest ważna
do zakończenia ich zasięgu. Zmienna 'c' jak pisał @Luq zmienia wartość na 6 przed wyjściem z
tej pętli. Gdy 'c' jest pięć wypisuje, pętla dochodzi do końca swojego bloku, inkrementuje 'c'
i ponownie sprawdza wartość 'c'. Teraz wynosi ona 6, więc warunek jest niespełniony i pętla kończy działanie.

Wystarczy wypisywanie wartości w najbardziej zagnieżdżonej pętli, a zmienne iteracyjne
zadeklaruj w nagłówkach pętli.
P-170714
« 1 »
  Strona 1 z 1