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

Nie rozumiem zasady działania pętli

VPS Starter Arubacloud
+1 głos
466 wizyt
pytanie zadane 22 stycznia 2019 w C# przez Borekdb Nowicjusz (130 p.)

Witajcie

Próbuję rozszyfrować poniższy kod z książki z której uczę się C#

W odpowiedzi, na pytanie ile razy wykona się instrukcja q = p - q mam odpowiedź, że 8. Za żadne skarby nie mogę dojść dlaczego 8 razy. Mój to myślenia jest taki:

na początku zmienne q i p przyjmują wartość 2, czyli   p = q = 2

W związku z powyższym pętla while nie wykonuje działania p = p *2, tylko przechodzi do działania q = p - q = 2 - 2, tym samym nadając wartości q = 0 a p = 2.

Dalszą czynnością jest powrót do wiersza z pętlą for i wykonanie działania q = q * 2 = 0 * 2 tym samym q = 0

Następnie przechodzi do pętli while i znowu warunek p < q nie jest spełniony bo 2 nie jest mniejsze od 0, więc przechodzi do działania q = p - q; tym samym q = 2 - 0

 

{
            int p = 2;
            for (int q = 2; q < 32; q = q*2)
            {
                while (p < q)
                {
                    p = p * 2;
                }
                q = p - q;
            }
        }

1
komentarz 22 stycznia 2019 przez m4sk1n Pasjonat (16,750 p.)
Polecam rozpisać sobie na kartce i analizować każdą iterację

1 odpowiedź

+1 głos
odpowiedź 23 stycznia 2019 przez Chess Szeryf (76,710 p.)
edycja 24 stycznia 2019 przez Chess
1.   q=2     2 < 2      p=2     q=0
2.   q=0     2 < 0      p=2     q=2
3.   q=4     2 < 4      p=4     q=0
4.   q=0     4 < 0      p=4     q=4
5.   q=8     4 < 8      p=8     q=0
6.   q=0     8 < 0      p=8     q=8
7.   q=16    8 < 16     p=16    q=0
8.   q=0     16 < 0     p=16    q=16
9.   q=32    16 < 32    p=32    q=0
10.  q=0     32 < 0     p=32    q=32

Odpowiedź do zadania: Instrukcja q = p - q wykona się dziesięć (10) osiem (8) razy.

Gdy q osiąga wartość 32 pętla for dalej się nie wykonuje.

Zauważ, że na początku pętla for (wartość q) inicjalizowana jest na 2. Dalej, gdy wykonuje dalsze iteracje nie nadpisuje sobie tej wartości dwójką, tylko pomija pierwszą część z trzech w pętli for i sprawdza dalej kolejno instrukcje. Czyli po pierwszej iteracji, pętla nie wykonuje tej instrukcji q = 2, ona wypada z obiegu. Dla zwizualizowania:

for(int q=2; q<32; q=q*2) ...

Nie wiem, czemu masz napisane w książce, że wskazana instrukcja wykona się ośmiokrotnie, ponieważ mi wyszło, że dziesięciokrotnie.

Przepraszam za wprowadzenie w błąd. Pętla wykona instrukcję ośmiokrotnie, nie dziesięciokrotnie.

komentarz 23 stycznia 2019 przez Borekdb Nowicjusz (130 p.)

Dzięki Chess, ale nie potrafię wyjaśnić sobie dlaczego wykonywane jest działanie p = p *2 w pętli while, skoro p < q

Operacja p = p * 2 jest wykonywana tylko wówczas gdy spełniony jest warunek pętli while czyli p < q. Jeżeli ten warunek nie jest spełniony wykonywane jest działanie q = p - q . Spójrz na swój plai- text , w każdym wierszu jest, że p < q, więc dlaczego wykonywane jest działanie p = p *2 Nie kumam tego

komentarz 23 stycznia 2019 przez Borekdb Nowicjusz (130 p.)

jeszcze słowo Chess

cytując Ciebie, po pierwszej pętli wracamy z powrotem do for:

for(int q=2; q<32; q=q*2) ...

ale z wartością q = 0 więc działanie q = q * 2 to wynik 0

komentarz 24 stycznia 2019 przez Chess Szeryf (76,710 p.)
edycja 24 stycznia 2019 przez Chess

Zauważ, że to nie instrukcja if, tylko pętla while.

W tym przykładzie równie dobrze mógłby stać if, ponieważ w pętli while po pierwszym obiegu pętli, to zawsze będzie fałszywe.

if (p < q) { 
   p = p * 2; 
}

q = p - q;

Musisz zrozumieć, że ta pętla while zawsze wykona się raz, więc jest pętlą, ale możesz w tym akurat przypadku zastąpić ją if'em.

Operacja p = p * 2 jest wykonywana tylko wówczas gdy spełniony jest warunek pętli while czyli p < q. Jeżeli ten warunek nie jest spełniony wykonywane jest działanie q = p - q .

Źle rozumiesz, instrukcja q=p-q wykonuje się za każdym obiegiem pętli for, a pętla while wykonuje się, jeżeli został spełniony warunek, te dwie instrukcje są od siebie niezależne całkowicie. Ty to tak rozumiesz zapewne:

if (p < q) { 
   p = p * 2; 
} else {
   q = p - q;
}

Gdyby było tak napisane, to wtedy byś dobrze chyba rozumował, ale tak nie jest w kodzie napisane, więc niepoprawnie myślisz na temat tych pętli.

ale z wartością q = 0 więc działanie q = q * 2 to wynik 0

Tak, ale już w drugiej iteracji q ma wartość 2, więc to się mnoży w pętli i jest 4.

Zobacz, w drugiej iteracji jest dwa odjąć zero równa się dwa. Dlatego, więc w trzeciej iteracji q osiąga wartość cztery.

Zamist pisać: q = q*2, możesz napisać q *= 2; I analogicznie zmienną p: p *= 2.

Zedytowałem odpowiedź, pętla wykona się ośmiokrotnie, nie dziesięciokrotnie. Za wprowadzenie w błąd przepraszam. Moje niedopatrzenie.

komentarz 24 stycznia 2019 przez Borekdb Nowicjusz (130 p.)
Oczywiście, że masz rację.

Skumałem..... cztery ostatnie zdania uświadomiły mi, gdzie tkwił problem w moim podejściu.

Podpowiedz mi jeszcze jedną kwestię, jeśli mogę Cię prosić

Analizuję Twoją odpowiedź co do 10 razy  i tutaj faktycznie można łatwo popełnić błąd. Z ósmego wiersza q = 16 a więc warunek q < 32 jest spełniony i można pomyśleć że pętla powinna wykonać się jeszcze raz. Ale tak naprawdę w całej pętli for - q nie może być nawet równe 32. Tak więc wartość ta nie może istnieć w tej pętli, dobrze myślę ??
komentarz 24 stycznia 2019 przez Chess Szeryf (76,710 p.)
edycja 24 stycznia 2019 przez Chess
Po ósmej iteracji pętli for, pętla ta się przerywa (break) kończy swój bieg. Na tej ósmej iteracji na samym dole tak jakby, żeby to zrozumieć q zostaje pomnożone przez właśnie dwa, bo taka została zastosowana reguła i później sprawdzany jest warunek q < 32, a że q ma wartość 32, to ten warunek się nie spełni, bo 32 < 32. To jest nieprawdziwe, pętla się przerywa po ósmej iteracji i dlatego w odpowiedzi jest, że pętla wykona się osiem razy.

Podobne pytania

0 głosów
2 odpowiedzi 119 wizyt
pytanie zadane 27 listopada 2016 w C i C++ przez Hvosz Początkujący (410 p.)
0 głosów
1 odpowiedź 178 wizyt
pytanie zadane 1 września 2017 w Java przez niezalogowany
+1 głos
1 odpowiedź 175 wizyt
pytanie zadane 25 grudnia 2020 w PHP przez skoku Nowicjusz (210 p.)

92,452 zapytań

141,262 odpowiedzi

319,074 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...