Pawełek Temat założony przez niniejszego użytkownika |
Zagnieżdzanie pętli » 2018-04-15 21:15:57 Dlaczego w tym kodzie #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? |
|
Pawełek Temat założony przez niniejszego użytkownika |
» 2018-04-15 21:22:07 W drugim zadaniu jest podobnie #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. |
|
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. |
|
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.
|
|
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: |
|
|
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. |
|
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. |
|
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. |
|
« 1 » |