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

Jak dokładnie wykonuje się ten kod?

Object Storage Arubacloud
0 głosów
619 wizyt
pytanie zadane 15 sierpnia 2017 w Android, Swift, Symbian przez Kubs Mądrala (5,190 p.)

Witajcie,

jak dokładnie wykonuje się ten kod dając wynik

 

0 4

0 3

1 4

1 3

3 4

3 3

 

class PetleFor {


public static void main (String[] args {


for (int x = 0, x<4; x++) {


    for (int y = 4; y>2; y--) {


      System.out.println ( x+ " " + y);


}


 if (x==1) {


     x++;


        }


     }


  }


}

 

3 odpowiedzi

+1 głos
odpowiedź 15 sierpnia 2017 przez wawszczur Użytkownik (610 p.)
wybrane 15 sierpnia 2017 przez Kubs
 
Najlepsza
W pętli wewnętrznej for wyświetlane są wartości x i y rozdzielone spacją. Ta pętla ma zawsze 2 przebiegi dla y=4 i y=3, bo dla y=2 wyrażenie y>2, będące wyrażeniem o wartości typu boolean (true or false) daje fałsz co powoduje zakończenie działania pętli. Wyrażenie y-- to jest post-dekrementacja (analogicznie jak post-inkrementacja) i powoduje zmniejszanie aktualnej wartości y o 1 w kolejnym przebiegu pętli.

Gdyby nie było instrukcji if w ciele pętli zewnętrznej to wynikiem programu byłoby 8 par liczb x y tj. 04 03 14 13 24 23 34 33, gdyż pętla zewnętrzna przyjmuje kolejne wartości x od 0 do 3. Działa tu analogiczny mechanizm co w pętli wewnętrznej tylko mamy post-inkrementację, bo przecież x rosną od 0 do 3 a y maleją od 4 do 3.

Instrukcja if dla x==1 powoduje w drugim przebiegu pętli zewnętrznej zwiększenie wartości x do 2 więc w zewnętrznej pętli for (init; wyr; upd) wyrażenie upd zamiast x=1 inkrementuje x=2, co powoduje przeskok w wynikach do wartości x=3.

Notabene w obu pętlach zastosowanie operatora pre zamiast post - inkrementacji / dekrementacji dałoby te same wyniki.
komentarz 15 sierpnia 2017 przez Kubs Mądrala (5,190 p.)
Super! Nie rozumiem tylko jeszcze dlaczego w wyniku jest dwa razy  '0 0' , dwa razy  '1 1' i  dwa razy  '3 3'
komentarz 15 sierpnia 2017 przez wawszczur Użytkownik (610 p.)
Wyniki są takie:

0 4
0 3
1 4
1 3
3 4
3 3

Chodzi Ci o to dlaczego powtarza się 0,1,3? Bo w każdym przebiegu pętli zewn wykonywane są 2 przebiegi pętli wewn. a wyświetlanie jest zakodowane w pętli wewn (tzw. ciele pętli). Więc w sumie mamy 3 przebiegi p.zewn. to daje 6 przebiegów p.wewn. a więc 6 wyświetleń
komentarz 15 sierpnia 2017 przez Kubs Mądrala (5,190 p.)
Tak. Nie wiem tylko dlaczego po pierwszym wyniku 0 4 jest znow w drugim wyniku 0, skoro po pierwszej petli jest x++ czyli kolejna petla powinna zaczac sie od x=1
komentarz 15 sierpnia 2017 przez wawszczur Użytkownik (610 p.)
public class PetleFor {
	public static void main(String[] args) {
		for (int x = 0; x < 4; x++) {
			for (int y = 4; y > 2; y--) {
				System.out.println(x + " " + y);
			}
			if (x == 1) {
				x++;
			}
		}
	}
}

Dlatego bo dla x=0 2 razy wykonywana jest pętla wewn. (linie od 4 do 6), wtedy y przyjmuje kolejno wartości 4, 3 i następnie wyświetlane są pary x, y, Przy czym x pozostaje nie zmienione bo instrukcja w linii 3 (zmieniająca wartość x) wykonywana jest dopiero po wyjściu z pętli wewnętrznej i sprawdzeniu warunku w instrukcji if.

komentarz 15 sierpnia 2017 przez Kubs Mądrala (5,190 p.)
Dziekuje Ci serdecznie. Nie moge tylko jeszcze dopatrzec w tym kodzie dlaczego  dla x=0 ta druga petla wykonywana jest dwa razy. I potem dwa razy dla x=1 i x=3
komentarz 15 sierpnia 2017 przez wawszczur Użytkownik (610 p.)
edycja 15 sierpnia 2017 przez wawszczur

 

Instrukcja for ma następującą postać. for (init; wyr; upd) ins gdzie:

init - deklaracja zmiennej (int y = 4)

wyr - wyrażenie o wartości typu boolean (y > 2)

upd - wyrażenie aktualizujące wartość zmiennej (y--)

ins - instrukcja wykonywaną w pętli (System.out.println(x + " " + y))

To ile razy wykona się pętla zależy od zdefiniowanych części: init, wyr, upd. Gdyby np. w części init:  int y=6 to byłyby 4 przebiegi pętli w kt. zmienna y przyjmowałaby wartości odpowiednio 6, 5, 4, 3. Natomiast 5 przebieg by nie wystąpił bo wtedy y=2 i warunek określony w części wyr (y>2) daje fałsz (bo 2 nie jest > od 2) więc w tym momencie następuje zakończenie działania pętli. 

Co istotne wykonanie instrukcji ins następuje po sprawdzeniu warunku w części wyr i dopiero potem jest wyliczane (opracowywane) wyrażenie upd. Jeśli warunek w części wyr da fałsz wówczas instrukcja (pętla) for kończy działanie.

komentarz 15 sierpnia 2017 przez Kubs Mądrala (5,190 p.)
Dziękuję. Klarowne przedstawienie sprawy. Głos w górę.

Ps. Czy również jesteś biegły w Androidzie? Próbuje napisać aplikację i mam kilka zagwostek.
komentarz 15 sierpnia 2017 przez wawszczur Użytkownik (610 p.)
Jeszcze nie znam Androida ale za jakiś czas chciałbym go poznać.
komentarz 17 sierpnia 2017 przez Kubs Mądrala (5,190 p.)

Witaj, czy mógłbyś proszę zerknąć jeszcze na ten temat https://forum.pasja-informatyki.pl/277789/jak-wykonuje-sie-ten-kod-polimorfizm ?

Mam problem ze zrozumieniem tego (łatwego na pewno) kodu.

Z góry dziękuje.

0 głosów
odpowiedź 15 sierpnia 2017 przez ziemjok Gaduła (4,160 p.)
pętla z linii 7 przyjmuje wartości od 0 do 3 i dla każdej tej wartości wykonywane są polecenia od linii 10 aż do zakończenia tej pętli w linii 31

wynik jest wypisywany tylko w linii 13 i dla każdego x z pierwszej pętli wypisuje x i y, gdzie y pochodzi z wewnętrznej pętli for, przyjmującej wartości 4 i 3

w linii 19 mamy ifa, który jeśli x == 1 to zwiększa go o 1, czyli na 2, ale że jest potem koniec obiegu pierwszej pętli for, to ponownie zwiększamy go o 1 , czyli na 3. Tak więc przez tego ifa pomijamy  z zewnętrznej pętli wartość 2
komentarz 15 sierpnia 2017 przez Kubs Mądrala (5,190 p.)
Dziekuje. A czy moglbys dopowiedziec jak dokladnie wykonuje sie ten kod wyniku '0 4' lub ten  '1 4'?  Tak dla przykladu.
0 głosów
odpowiedź 15 sierpnia 2017 przez rusk Obywatel (1,640 p.)
prześledź sobie te pętle zapisując poszczególne stany x i y oraz wyniki na kartce. Wtedy zobaczysz jak to działa.

Podobne pytania

0 głosów
0 odpowiedzi 296 wizyt
pytanie zadane 27 października 2017 w Android, Swift, Symbian przez Kubs Mądrala (5,190 p.)
0 głosów
1 odpowiedź 638 wizyt
pytanie zadane 17 sierpnia 2017 w Java przez Kubs Mądrala (5,190 p.)
0 głosów
0 odpowiedzi 150 wizyt
pytanie zadane 10 marca 2017 w JavaScript przez Miles Nowicjusz (170 p.)

92,555 zapytań

141,402 odpowiedzi

319,553 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...