Přehození dvou proměných

October 1, 2006 on 6:00 pm | In Programing |

Jedna z prvních věcí, kterou se jako začínající programátor musíte naučit je přehození dvou proměných. V naprosté většině případů se k tomu používá třetí proměná, ale co když už v zadání máte, že ji nesmíte použít? Je to vůbec možné?

Jasně, že je to možné - kdyby nebylo, tak bych o tom přeci ani nemluvil (=nepsal). Takže jak na to?

Původně jsem nad tímto problémem strávil docela dost času a nepřišel jsem na to jak - nedokázal jsem se odprostit od třetí proměné. Nakonec mě trknul kamarád, který prohlásil, že to třeba půjde přes nějaké jejich operace (sčítáním či odčítáním). Teď když už jsem začal uvažovat, řekněme volněji, jsem docela rychle složil následující 4 řádky:

// Prohozeni dvou promenych bez pristupu k treti
x += y;
y -= x;
y = -y;
x -= y;

A voilá máme je prohozené. Ještě dodám, že daný postup funguje jak u kladných čísel, tak i u záporných či kombinace kladného a záporného čísla.
Zde Vám ještě nabízím vysvětlení step-by-step:

1.png Takže na začátku je situace jednoduchá - mám dvě proměné se dvěmi hodnotami. Nezáleží na to jaké jsou či jaká proměná je vyšší - jen by asi měly být stejného typu.
2.png Druhým krokem je přičtení “Y” k “X”, tedy v “X” mám uloženy hodnoty obou proměných pohromadě.
3.png Jako třetí odečtu od “Y” “X”. Fígl je v tom, že pokud v “Y” je původní hodnota a já od ní odečítám jak tuto původní hodnotu tak i hodnotu “X” - tedy to co je navíc, tak mi v ní zbyde pouze “X”, Akorát s opačným znaménkem kvůli odčítání.
4.png V dalším kroku změním “Y” znaménko, abych obnovil jeho hodnotu.
5.png No a teď již jen chybí od “X” odečíst “Y”, kde je vlastně již původní hodnota “X”. No a zbude mi původní hodnota “Y”. To je celé, právě jsem vyměnil obsahy obou proměných a při tom nepoužil žádnou třetí…

5 Comments »

RSS feed for comments on this post. TrackBack URI

  1. no, trochu nechápu, proč tam dávaš to y=-y, to je imho dost zbytečné, stačí “obrátit” tu operaci na konci, ne? já jsem to tedy vždy řešil jen třemi příkazy… jinak nějaké neordinální proměnné tímto postupem asi zas tak dobře neprohodíš ;) Šel by sice float, ale výsledky by nemusely být přesně takové, jako byly původní proměnné…

    Comment by JR — 2006-10-12 #

  2. Mohu se zeptat jakpak by jsi chtel “obratit tu operaci na konci”? Tedy jak prehodis hodnotu Y aniz bys ji zmenil znamenko?

    Jinak souhlasim - postup bude fungovat jen pro nektere datove typy. Vzhledem k tomu, ze float je “ztratovy” pri operacich scitani i odcitani, takze ten presun nebude zcela presny, souhlasim :-)

    Comment by jarcec — 2006-10-12 #

  3. Velice zajímavé, díky, žes na to přišel za mne.

    Comment by ozzy — 2006-11-02 #

  4. Viděl jsem i prohození proměných pomocí bitových operací. To funguje u úplně všech typů proměných (ale v pascalu máš jako obvykle smůlu). Bohužel si nepamatuji postup, bylo to v knížce z vědárny. Pokud ho někde najdu můžu zaslat…

    Comment by DRoman — 2007-01-26 #

  5. Jo to je myslim s postupnymi XORy. a ^= b; b ^= a; a ^= b; Ale ted si nejsem jist.

    Comment by jarcec — 2007-01-26 #

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^