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

Prośba o wyjaśnienie wyniku wykonania kodu

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

Witajcie,

wynik tego kodu to    13   15   x = 6

Skąd wziął się wynik  15  oraz  x =6 ?

Dziękuje.

 

                                     
class Wyniki {

public static void main (String [] args)   {

Wynik w = new Wynik();
w.doDziela();

}

void doDziela() {

int y = 7;

for (int x=1; x<8; x++) {

y++;

if (x>4) {

System.out.print (++y + " ");
}

if (y>14) {

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

break;

      } 
    }
  }
}

 

2 odpowiedzi

+1 głos
odpowiedź 15 sierpnia 2017 przez jeremus Maniak (59,720 p.)
1. dla x=5 y=12 ale wyświetlasz ++y czyli 13

2. dla x=6 y=14 wyświetlasz 15 , a że 15>14 to wyświetlasz tez x=6
komentarz 15 sierpnia 2017 przez Kubs Mądrala (5,190 p.)
edycja 15 sierpnia 2017 przez Kubs
Jedynie co rozumiem (chyba) to skąd wzięło się 13.

13  wzięło się stąd bo pętla `for` wykonuje działanie 6 razy i inkrementuje y o  1  za każdym razem działania pętli. Czyli skoro y było na początku 7 to wartość y musi być 13 (wartość początkowa 7 + wartość dodana z pętli która od 1 do 8 przeleciała 6 razy)

Zagubiłem się już totalnie :( Mogłbyś jeremus wytłumaczyć mi jeszcze dokładniej skąd wzięły się te wszystkie wartości?
komentarz 15 sierpnia 2017 przez jeremus Maniak (59,720 p.)
wydawało mi się że jasno wytłumaczyłem :)

chcesz jednak dokłądniej, no to proszę..

dla x od 1 do 4  warunki if nie sa spełnione - czyli po 4 razach y=7+4 czyli 11

dla x=5  y się zwiększa do 12 i wchodzi w pierwszego if-a bo x>4  - wypisujesz na ekran ++y  - czyli 13  i tyle wynosi y , y nie jest większy od 14 - drugi if nie jest wykonywany

lecimy dalej czyli dla x=6

zwiększamy y    y=14

x>4 czyli znowy pierwszy if jest spełniony

wypisujemy zatem ++y czyli 15   y=15 w tym momemcie

skoro y>14  wykonywany jest drugi if a tam wypisujemy "x=6"

no i instrukcje break , czyli  pętla dla x=7 nie jest wykonywana

koniec
komentarz 15 sierpnia 2017 przez Kubs Mądrala (5,190 p.)
edycja 15 sierpnia 2017 przez Kubs
Super. Książka napisana właśnie takim językiem by się przydała dla początkujących programistów :) Głos w górę.

Ps. czyli jak tylko if (y>14)... jest spełniony po raz PIERWSZY to następuje przejście do kolejnego wiersza i wykonywany jest 'break'?

Jeśli  'if'  nie jest spełniony kompilator nie przepuszcza dalej?
+1 głos
odpowiedź 15 sierpnia 2017 przez wawszczur Użytkownik (610 p.)
edycja 15 sierpnia 2017 przez wawszczur

Ty chyba nie rozróżniasz pre od post-inkrementacji.

++i - operator pre-inkrementacji, zwiększa wartość zmiennej i o jeden, następnie pobiera jej wartość

i++ - operator post-inkrementacji, pobiera wartość zmiennej i, następnie zwiększa jej wartość o jeden

Dlatego w 5 przebiegu pętli (przed instrukcjami if) y=12 ale ponieważ w 1-ym if-ie  jest ++y więc wyświetla się 13 (gdyby było y++ pojawiłoby się 12).

W 6 przebiegu pętli (przed instrukcjami if)  y=14 (bo 13+1 <- instrukcja y++ pod for-em). W tym przebiegu analogicznie y jest zwiększony operatorem preinkrementacji do 15 i dlatego ta wartość jest wyświetlona a jednocześnie spełniony zostaje 2 warunek (y>14) co powoduje wyświetlenie x=6 i zatrzymanie pętli for instrukcją break.

w załączeniu kod z dodaną instrukcją System.out.println(x + "__x=" + x + "__y=" + y); w 12 linii która wyświetla informacje o każdym przebiegu pętli. To powinno Ci rozjaśnić wszystko. Poprawiłem też nazwę klasy w instrukcji tworzenia obiektu w (Wyniki zamiiast Wynik).

public class Wyniki {
	public static void main(String[] args) {
		Wyniki w = new Wyniki();//poprawiona nazwa tj. Wyniki zamiast Wynik
		w.doDziela();
	}

	void doDziela() {
		int y = 7;
		for (int x = 1; x < 8; x++) {
			y++;
			//dodatkowa linia kodu
			System.out.println(x + "__x=" + x + "__y=" + y);
			if (x > 4) {
				System.out.print(++y + " ");
			}
			if (y > 14) {
				System.out.println(" x = " + x);
				break;
			}
		}
	}
}

Radzę przed wklejaniem tu kodu najpierw go sformatować aby był czytelny. W Eclipsie np. można to osiągnąć Ctrl+Shift+F.

Poniżej wynik wyświetlenia zmodyfikowanego kodu. Kolejne liczby n__ oznaczają kolejne przebiegi pętli.

1__x=1__y=8
2__x=2__y=9
3__x=3__y=10
4__x=4__y=11
5__x=5__y=12
13 6__x=6__y=14
15  x = 6
 

 

 

komentarz 15 sierpnia 2017 przez Kubs Mądrala (5,190 p.)
Dziękuję serdecznie. Tak, masz zupełną rację. Nie rozumiałem jak ten operator preinkrementacji działa. Głos w górę.

Podobne pytania

0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 11 grudnia 2017 w Android, Swift, Symbian przez Kubs Mądrala (5,190 p.)
0 głosów
1 odpowiedź 629 wizyt
pytanie zadane 15 grudnia 2017 w Java przez Kubs Mądrala (5,190 p.)
+1 głos
2 odpowiedzi 9,496 wizyt
pytanie zadane 18 listopada 2017 w Java przez Kubs Mądrala (5,190 p.)

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 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!

...