• 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

VPS Starter Arubacloud
0 głosów
235 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ź 250 wizyt
pytanie zadane 11 grudnia 2017 w Android, Swift, Symbian przez Kubs Mądrala (5,190 p.)
0 głosów
1 odpowiedź 700 wizyt
pytanie zadane 15 grudnia 2017 w Java przez Kubs Mądrala (5,190 p.)
+1 głos
2 odpowiedzi 9,838 wizyt
pytanie zadane 18 listopada 2017 w Java przez Kubs Mądrala (5,190 p.)

93,078 zapytań

142,041 odpowiedzi

321,445 komentarzy

62,422 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...