"swapping integers" - czym jest i jak działa?

0

Hej.
Od dosłownie kilku dni bawię się w naukę podstaw javy.
Korzystam z anglojęzycznego tutoriala i niestety nie wiem, jak sformułować po polsku problem w tytule wątku, tj. swapping integers, ale myślę, że łatwo zrozumieć o co chodzi.

http://www.programmr.com/practice/programr211_promo_228/node/565 - to jest zadanie, do którego mam już cudze rozwiązanie, jednak nie mogę tego rozwiązania zrozumieć. Wiem, że w miejscu przeznaczonym na wpisanie swojej części kodu powinno znajdować się to:

wkqv1g.jpg

Dla mnie - osoby obecnie na studiach humanistycznych, ale po matematycznej klasie w liceum - to rozwiązanie nie ma zupełnie sensu. Nie rozumiem, czemu wprowadzanie nowych elementów do równania rozwiązuje sprawę. Z tego kodu dla mnie wynika, że help = martiansAge = yourAge i to działa, w przeciwieństwie do zapisu yourAge = martiansAge.
Krótko mówiąc - dlaczego

int help;
help = yourAge;
yourAge = martiansAge;
martiansAge = yourAge;

działa, natomiast

yourAge = martiansAge;

już nie? Rozumiem, czemu nie można zastosować drugiego (bo po prostu zrównuje te wartości, a nie je zamienia), nie wiem jednak co w tym pierwszym sprawia, że działa, chociaż dla mnie to jest to samo, tylko napisane w inny sposób.

Mam nadzieję, że moje pytanie jest zrozumiałe.

poprawienie tytułu wątku, dodanie znaczników <code class="java"> i dodanie obrazka do załączników posta - Furious Programming

1

A korzystasz z Excela (Calca)? Jak byś wymieniła zawartość dwóch komórek?

0

Dlatego że masz błąd w ostatniej linijce w napisanym poście.

martiansAge = yourAge;

a według screena jest

martiansAge = help;

Powinno być:

int help;                      // linia 1
help = yourAge;        // linia 2
yourAge = martiansAge;   // linia 3
martiansAge = help;         // linia 4

Najlepiej sobie to rozpisać w ten sposób by dowiedzieć się jakie wartości znajdują się w zmiennych po wykonaniu każdej linijki np:

1. help=0 yourAge=20 martiansAge=21
2. help=20 yourAge=20 martiansAge=21
3. help=20 yourAge=21 martiansAge=21
4. help=20 yourAge=21 martiansAge=20

Gdybyśmy napisali yourAge = martiansAge; to po wykonaniu zostało by:

1. yourAge=21 martiansAge=21
Czyli stracimy wartość ze zmiennej yourAge

dodanie znaczników <code> - Furious Programming

0

@edycje mojego pierwszego postu - tytuł wydawał mi się dość jasny i wyczerpujący, za pozostałe niedociągnięcia przepraszam, zbyt się paliłam do uzyskania odpowiedzi, by poczytać więcej o zasadach pisania postów.

@bogdans - niestety nie.

@visembler to był mój błąd przy przepisywaniu, ale wcześniej próbowałam zrozumieć właściwie napisany kod ze screena i też się nie udawało, więc to nie ten błąd był powodem, dla którego nie mogłam zrozumieć rozwiązania. Ale powinnam była uważniej to napisać, fakt.

Twoje rozpisanie co ma jaką wartość na poszczególnych etapach bardzo mi pomogło, dzięki.
Czyli kolejność zapisu w kodzie ma znaczenie, nie jak w matematyce? Pytanie może głupie, ale jestem totalnym żółtodziobem. W matematyce, pisząc:

a=b
b=c
b=5

wyciągamy prosty wniosek, że w takim razie a=5 i c=5. Tymczasem mam wrażenie (prawidłowe?) że w programowaniu - a przynajmniej w javie - to tak nie działa i tego kodu

int help;
help = yourAge;
yourAge = martiansAge;
martiansAge = help;

nie można rozumieć jako równania help = yourAge = martiansAge? Bo tak to rozumiałam na początku.

0
margarita napisał(a):

[..]Tymczasem mam wrażenie (prawidłowe?) że w programowaniu - a przynajmniej w javie - to tak nie działa i tego kodu
[..] nie można rozumieć jako równania help = yourAge = martiansAge? Bo tak to rozumiałam na początku.

Tak, nie można rozumieć tego jak równania. Może bardziej Ci pomoże jak pomyślisz o zmiennych jak o pudełkach? W jednym pudełku(zmiennej) może być przechowywana w danym momencie czasu tylko jedna liczba. I teraz chcąc przenieść coś pomiędzy pudełkami musimy mieć jeszcze jedno pudełko do którego na chwile włożymy liczbę. (Oczywiście zakładamy że liczby nie możemy trzymać w ręce ani położyć - zawsze musi być w pudełku)

1

Zacznij od czegos prostego. Zalozmy ze mamy dwie liczby x i y. Na logike newbie zamieniasz tak:

x = y; // (1)
y = x; // (2)

Co sie stanie jak to zrobisz? jako ze program wykonuje sie sekwencyjnie (instrukcja po instrukcji) to w linii (1) stracisz wartosc x, a w linii drugiej przypiszesz y wartosc x, ktory teraz ma wartosc y, czyli tak na prawde nie zrobisz nic, a wartosc x poszla w nicosc.

Zalozmy ze jestes zapobiegawczy i nie chcesz na pewno nic stracic:

int ax = x; // (1)
int ay = y; // (2)
x = ay; // (3)
y = ax; // (4)

Czyli najpierw robisz kopie zapasowe a potem ich uzywasz. Tutaj mozesz zauwazyc ze tak na prawde w linii (3) nic sie nie moze wydarzyc, bo jeszcze nic nie zmienilismy i mozesz spokojnie usunac kopie ay i skorzystac bezposrednio z wartosci y.
Po usunieciu tego dochodzisz do kodu:

int ax = x;
x = y;
y = ax;

czyli dokladnie to co masz w pierwszym poscie. Mozesz to sobie obrazowac na komorkach Excela tak jak napisal @bogdans

0

OK, myślę że w takim razie wszystko jasne. Ogromne dzięki za cierpliwość, szybkie odpowiedzi i przede wszystkim skuteczną pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1