Řídicí struktury: větvení, cykly. Obsah Příkazy v Jávě ............................................................................................................2 Příkazy v Jávě ....................................................................................................................2 Přiřazení....................................................................................................................2 Přiřazení v Jávě ..................................................................................................................2 Přiřazení primitivní hodnoty..................................................................................................2 Přiřazení odkazu na objekt ....................................................................................................3 Volání metod a návrat z nich .........................................................................................3 Volání metody....................................................................................................................4 Návrat z metody .................................................................................................................4 Řízení toku uvnitř metod - větvení, cykly.........................................................................4 Řízení toku programu v těle metody .......................................................................................4 Cyklus s podmínkou na začátku .............................................................................................5 Doporučení k psaní cyklů/větvení...........................................................................................5 Příklad použití "while" cyklu.................................................................................................6 Cyklus s podmínkou na konci................................................................................................6 Příklad použití "do-while" cyklu ............................................................................................7 Cyklus "for" .......................................................................................................................7 Příklad použití "for" cyklu ....................................................................................................8 Doporučení k psaní forWlKIPFMA cyklů (1)......................................................................8 fTir tni- Fifa ■■ l-iBih i Doporučení k psaní forWlKIPFMA cyklů (2)......................................................................9 Tri r rni- r íl i. u n n k ■ Vícecestné větvení "switch - case - default"..............................................................................9 Vnořené větvení................................................................................................................10 Vnořené větvení (2) ...........................................................................................................10 Řetězené "if - else if - else" .................................................................................................11 Příkazy "break".................................................................................................................11 Příkaz "continue" ..............................................................................................................12 "break" a "continue" s návěštím ...........................................................................................13 Doporučení k příkazům break a continue ...............................................................................13 Příkazy a řídicí struktury v Jávě • Příkazy v Jávě Přiřazení Volání metod a návrh z nich • Řídicí příkazy (větvení, cykly) 1 Řídicí struktury: větvení, cykly. Příkazy v Jávě Příkazy v Jávě V Jávě máme následující příkazy: • Přiřazovací příkaz = a jeho modifikace (kombinované operátory jako je += apod.) • Řízení toku programu (větvení, cykly) • Volání metody • Návrat z metody - příkaz return Příkaz je ukončen středníkem ; • v Pascalu středník příkazy odděluje, v Jávě (C/C++) ukončuje P-\rm -\r r nrazeni Přiřazení v Jávě Operátor přiřazení: • Operátor přiřazení = (assignment) • na levé straně musí být proměnná • na pravé straně výraz přiřaditelný (assignable) do této proměnné • Rozlišujeme přiřazení primitivních hodnot a odkazů na objekty Přiřazení primitivní hodnoty Na pravé straně výraz vracející hodnotu primitivního typu číslo, logická hodnotu, znak (ale ne např. řetězec) Na levé straně proměnná téhož typu jako přiřazovaná hodnota nebo typu širšího např. intWlKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=int] lze přiřadit do longWlKIPFiJlA ííi r priT r ik i. l-iint i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=long] 2 Řídicí struktury: větvení, cykly. Při zužujícím přiřazení se také provede konverze, ale může dojít ke ztrátě informace např. intWlKIPEľJlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=int] - Ti r tni1 Fih ■■ l-aiifa i > shortWlKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=short] li r tni- riL i. . ■■■■ ^ ■ Přiřazením primitivní hodnoty se hodnota zduplikuje ("opíše") do proměnné na levé straně. Přiřazení odkazu na objekt Konstrukci =WlKIPFniA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search==] Tip ppii" Fil i. l-aiib i lze použít i pro přiřazení do objektové proměnné: Živočich zl = new Živočich (); WlKtlPT.TJlA ill r priT rib i. LniL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Zivocich zl = new Zivo-cich();] Co to udělalo? 1. vytvořilo nový objekt typu Živočich WnílPF.ÍllA íli r r n t rib i. u n n L ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Zivocich] ( new Živočich () WmPEMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= *T>ir l-'n-i- Fil i. Ljv-iLi new Zivocich() ]) 2. přiřadilo jej do proměnné zlWlKlPFDlA flip pni1 Pík ■■ LniBi [http://cs. wikipedia. org/wiki/Speci%C3 %A 1 ln%C3 %AD: Search?search=z 1] typu Živočich VťlKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Zivocich] Tpip Fpit Fil i. [■■-!■■ Nyní můžeme odkaz na tentýž vytvořený objekt znovu pňřadit - do z2WlKIPFrilA Tip Fpii1 Fil i. l-aiifc ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=z2]: Živočich z2 = zl ;WlKIPFI)lA Tpip F'n-i- Fia h L-^b-ib ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Zivocich z2 = zl;] Proměnné zlWlKIPFfllA "Tpip F'pit Fil. i. L-a^-iLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=zl] a z2Wllí:iPFniA TV,rkn,l-,t ,. L-n.,L, [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=z2] ukazují nyní na stejný objekt typu živočich!!! Proměnné objektového typu obsahují odkazy (reference) na objekty, ne objekty samotné!!! Volání metod a návrat z nich 3 Řídicí struktury: větvení, cykly. Volání metody Metoda objektu je vlastně procedura/funkce, která realizuje svou činnost primárně s proměnnými objektu. Volání metody určitého objektu realizujeme: identifikaceObjektu.názevMetody(skutečné parametry) • identifikaceObjektu, jehož metodu voláme • . (tečka) • názevMetody, jíž nad daným objektem voláme • v závorách uvedeme skutečné parametry volání (záv. může být prázdná, nejsou-li parametry) Návrat z metody Návrat z metody se děje: 1. Buďto automaticky posledním příkazem v těle metody 2. nebo explicitně příkazem return návsra li r priT r ik i. l-iinb i [http://cs. wikipedia. org/wiki/Speci%C3 %A 1 ln%C3 %AD: Search?search=return ] způsobí ukončení provádění těla metody a návrat, přičemž může být specifikována návratová hodnota typ skutečné návratové hodnoty musí korespondovat s deklarovaným typem návratové hodnoty Řízení toku uvnitř metod - větvení, cykly Řízení toku programu v těle metody Příkaz (neúplného) větvení ifWlKlPFMA "íkr ľni- Fil i. L-jiibi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=if] if (logický výraz) přikazWllCIPFniA íi r pnT Fík i. uniii [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=if (logický výraz) příkaz] platí-li logický výraz (má hodnoty true), provede se příkaz Příkaz úplného větvení if - elseWlKIPFTJlA Hli r rriT Fib n Lnami 4 Řídicí struktury: větvení, cykly. [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=else]WnriPEniA flip tni" FlL I. 1'BB^h I [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=if-] if (logický výraz) přikazl else přikaz2 platí-li logický výraz WlKlPFMA ľlír tni1 pil u Lniki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= logický výraz ] (má hodnoty trueWlKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=true]), provede se přikazl WlKlPFľllA Hli r priT riii i. Laanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= přikazl ] neplatí-li, provede se při kaz 2 WlKlPFľllA flip pni1 pil i. unibi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=příkaz2] Větev elseWlKIPFhlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=else] íli p p pi t Fib i. Ľ ■■!■ ■ se nemusí uvádět Cyklus s podmínkou na začátku Tělo cyklu se provádí tak dlouho, dokud platí podmínka obdoba whileWllCIPFniA Ihr FŤit Fib i. L-^a-ik i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=while] v Pascalu v těle cyklu je jeden jednoduchý příkaz ... while (podminka) přikaž; ... nebo příkaz složený while (podminka) { přikazl; přikaz2; přikaz3; } Tělo cyklu se nemusí provést ani jednou - pokud už hned na začátku podmínka neplatí Doporučení k psaní cyklů/větvení 5 Řídicí struktury: větvení, cykly. Větvení, cykly: doporučuji vždy psát se složeným příkazem v těle (tj. se složenými závorkami)!!! jinak hrozí, že se v těle větvení/cyklu z neopatrnosti při editaci objeví něco jiného, než chceme, např.: while (i < a.length) System.out.println(a[i]); i++; Provede v cyklu jen ten výpis, inkrementaci ne a program se zacyklí. Pišme proto vždy takto: while (i < a.length) { System.out.println(a[i]); i++; } Příklad použití "while" cyklu Dokud nejsou přečteny všechny vstupní argumenty: int i = 0; while (i < args.length) { "přečti argument args[i]" i++; } Dalším příkladem je použití whileWlKIPFľJlA ITir tni" Fib k Lniki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=while] pro realizaci celočíselného dělení se zbytkem: Příklad: Celočíselné dělení se zbytkem [http://www.fi.mum.cz/~tomp/java/ucebmce/javasrc/tomp/ucebmce/rizeni/DeleniOdcitanim.java] Cyklus s podmínkou na konci Tělo se provádí dokud platí podmínka (vždy aspoň jednou) obdoba repeatWlKIPFDlA Tip p pit Fil i. l-aiifc i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=repeat] v Pascalu (podmínka je ovšem interpretována opačně) Relativně málo používaný - je méně přehledný než whileWlKIPFTllA llir Fni- Fil u L-f»bi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=while] Syntaxe: do { 6 Řídicí struktury: větvení, cykly. přikazl; přikaz2; přikaz3; } while (podmínka); Příklad použití "do-while" cyklu Dokud není z klávesnice načtena požadovaná hodnota: String vstup = ""; float cislo; boolean načteno; // vytvoř reader ze standardního vstupu BufferedReader in = new BufferReader(new InputStream(System.in)); // dokud neni zadáno čislo, čti do { vstup = in.readLine(); try { cislo = Float.parseFloat(vstup) ; načteno = true; } catch (NumberFormatException nfe) { načteno = false; } } while(!načteno); System.out.println("Načteno cislo "+cislo); Příklad: Načítej, dokud není zadáno číslo [http://www.fi.munixz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/DokudNeniZadano.java] Cyklus "for" obecnější než forWlKIPFMA íli p p pit Fib u Lniki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=for] v Pascalu, podobně jako v C/C++ De-facto jde o rozšíření whileWlKIPFľllA ill p p pit Fík u Lniii [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=while], lze jím snadno nahradit Syntaxe: for(počáteční op.; vstupní podm.; přikaž po každém průch.) přikaž; anebo (obvyklejší, bezpečnější) for (počáteční op.; vstupní podm.; přikaž po každém průch.) { 7 Ridici struktury: vetvení, cykly. přikazl; přikaz2; přikaz3; } Příklad použití "for" cyklu Provedení určité sekvence určitý počet krát for (int i = 0; i < 10; i++) { System.out.println(i ) ; } Vypíše na obrazovku deset řádků s čísly postupně 0 až 9 1. Příklad: Pět pozdravů [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/PetPozdravu.java] 2. Příklad: Výpis prvků pole objektů "for" cyklem [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/PolozkyForCyklem.java] Doporučení k psaní f or?™™í [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=for] cyklů (1) Používejte asymetrické intervaly (ostrá a neostrá nerovnost): • podmínka daná počátečním přiřazením i = OWlKlPFTJlA íli r priT r ik i. u n n L ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=i = 0] a inkrementací i++ WlKIPFDlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=i++] je ne- Tri p rni- r íl i. u n n L ■ ostrou nerovností, zatímco opakovací podmínka i < ÍOWIKIPEUIA 'Ihr ľni- Fib i. L-ja-iki [http://es.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=i < 10 ] WlKIPRMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=] je os- Flip hni- Fib ■■ LbbiI i trou nerovností -> i už nesmi hodnoty 10 dosáhnout! Vytvarujte se složitých příkazů v hlavičce (kulatých závorkách) forWlTClPEDlA Pi r Pni1 pil i. LniBi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=for] cyklu- Řídicí struktury: větvení, cykly. • je lepší to napsat podle situace před cyklus nebo až do jeho těla Doporučení k psaní f orK^PJi [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=for] cyklů (2) Někteří autoři nedoporučují psát deklaraci řídicí proměnné přímo do závorek cyklu for (int i = 0; ...WlKlNiDíA íli r priT rit i. Laanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=for (int i = 0;...] ale rozepsat takto: int i; for (i = 0; ... potom je proměnná *TTir Fni- Fil ■■ LfiiLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=i] přístupná ("viditelná") i mimo cyklus - za cyklem, což se však ne vždy hodí. Vícecestné větvení "switch - case - default" Obdoba pascalského select - case elseWlKIPEniA Ti r hni" Fík ■■ l-ainb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=select - case - else] Větvení do více možností na základě ordinální hodnoty Syntaxe: switch(výraz) { case hodnotal: prikazla; prikazlb; prikazlc; break; case hodnota2: prikaz2a; prikaz2b; break; default: prikazDa; prikazDb; } 9 Řídicí struktury: větvení, cykly. Je-li výraz roven některé z hodnot, provede se sekvence uvedená za příslušným caseWlKIPEDlA ľlír r m* Fi« ■■ Lnni [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=case]. Sekvenci obvykle ukončujeme příkazem breakWlKIPEDlA TTir Tni- Fil ■■ L^biL ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=break], který předá řízení ("skočí") na první příkaz za ukončovací závorkou příkazu switch WlfCIPEľllA ľiir pm" Fib i. LniBi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=switch]. Příklad: Vícecestné větvení [http://www.fi.mumxz/~tomp/java/ucebmce/javasrc/tomp/ucebnice/rizeni/VicecestneVetveni.java] Vnořené větvení Větvení if - elseWlKlPFTllA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=if - else] můžeme samozřejmě vnořovat do sebe: if(podmínka vnější) { if(podmínka vnitřní 1) { } else { } } else { if(podmínka vnitřní 2) { } else { } } Vnořené větvení (2) Je možné "šetřit" a neuvádět složené závorky, v takovém případě se elseWlTCIPEľllA TTir F*ni- Fil i. L-fiiLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=else] vztahuje vždy k nejbližšímu neuzavřenému ifVťHilPFľJlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=if], např. znovu předchozí příklad: if(podmínka vnější) if(podmínka vnitřnil) else // vztahuje se k nejbližšímu if // s if (podmínka vnitřní 1) 10 Řídicí struktury: větvení, cykly. else // vztahuje se k prvnímu if, // protože je v tuto chvili // nejbližší neuzavřené if (podmínka vnitřní 2) else // vztahuje se k if (podmínka vnitřní 2) Tak jako u cyklů - tento způsob zápisu nelze v žádném případě doporučit!!! Příklad: Vnořené větvení [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/VnoreneVetveni.java] Řetězené "if - else if - else" Někdy rozvíjíme pouze druhou (negativní) větev: if (podminkal) { } else if (podminka2) { } else if (podminka3) { } else { } Neplatí-li podminkal, testuje se podmínka2, neplatí-li, pak podmínka3... neplatí-li žádná, provede se příkaz za posledním - samostatným - elseWlKIPFMA "Rir Fn-i- Fík ■■ L-bb-iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=else]. Opět je dobré všude psát složené závorky!!! Příklad: Řetězené if [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/VicecestneVetveniIf.java] Příkazy "break" Realizuje "násilné" ukončení průchodu cyklem nebo větvením switchWltCIPEfllA ílir tni1 Fii u Lniki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=switch] Syntaxe použití breakWlKlPFľllA Ihr ľni- Fík ■■ L-BB-iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=break] v cyklu: 11 Řídicí struktury: větvení, cykly. for (int i = 0; i < a.length; i++) { if(a[i] == 0) { break; // skoci se za konec cyklu } } if (a[i] == 0) { System.out.println("Našli jsme 0 na pozici "+i); } else { System.out.println("0 v poli neni"); } použití u [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=switch] viděli,,Vícecestné větvení "switch - case - default"" Příkaz "continue" Používá se v těle cyklu. Způsobí přeskočení zbylé části průchodu tělem cyklu for (int i = 0; i < a.length; i++) { if (a[i] == 5) continue; System.out.println (i) ; } switchWllCIPFrilA Tif Fpit Fil i. Ln^ki jsme Jiz Výše uvedený příklad vypíše čísla [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=l], [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=2], [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=3], [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=4], [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=6], [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=7], [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=8], [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=9], nevypíše hodnotu 5 WlKlPFhlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=5]. Tlir Pni- Fn. ■ L^iL! Příklad: Řízení průchodu cyklem pomocí "break" a "continue" [http://www.fi.mum.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/BreakContinue.java] lWlřCIPFTJlA íli r priT riii i. ĽaanL i 2WIKIPFMA 3WnflPFniA T i r rnn1 Pil i. uniii 4WiK:iPFriiA r i r rnn1 Pil i. L nabi ôWlICIPFniA Ti r r m- Pil i. l-iinb i 7WiK:iPFniA Pi r pňa- Pil i. uniii 8WlTCIPFrilA íli r p n t Pil i. ľmiii 9WIKIPFMA íli r hm- Pil i. LnaBi 12 Řídicí struktury: větvení, cykly. "break" a "continue" s návěštím Umožní ještě jemnější řízení průchodu vnořenými cykly: • pomocí návěští můžeme naznačit, který cyklus má být příkazem breakWlKlPFDlA "Inr Fni- Fib u L-jaiki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=break] přerušen nebo tělo kterého cyklu má být přeskočeno příkazem continueWlKIPFFHA Tli r Fn i ■ Fib i ■ I ■ ■ ■ i k i [http://cs.wikipedia.org/wiki/Speci%C3 %Alln%C3%AD:Search?search=continue]. Příklad: Návěští [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/Navesti.java] Doporučení k příkazům break a continue Poznámka Raději NEPOUŽÍVAT, ale jsou menším zlem než by bylo gotoWlKIPFFUA lir p ni1 pil i. l-BBib ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=goto] (kdyby v Jávě existovalo...), protože nepředávají řízení dále než za konec struktury (cyklu, větvení). Poznámka Toto však již neplatí pro breakWlKIPFľllA m p p pit r ik i. l-iinh i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=break] a conti-nueWlťlPFDlA íl i p p pi i ■ pil ■■ I ■ ■ ■ n h i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=continue] na návěští! Poznámka Poměrně často se používá breakWlKIPFfllA Tip tni1 pil i. Lnibi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=break] při sekvenčním vyhledávání prvku. 13