September discount week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

6. diel - Cykly v Jave

V predchádzajúcom cvičení, Riešené úlohy k 5. lekcii Javy, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Riešené úlohy k 5. lekcii Javy , sme si vysvetlili podmienky. Teraz prejdeme k cyklom, po dnešnom tutoriálu už budeme mať takmer kompletnú výbavu základných konštrukcií a budeme schopní programovať rozumné aplikácie v Jave.

Cykly

Ako už slovo cyklus napovie, niečo sa bude opakovať. Keď chceme v programe niečo urobiť 100x, určite nebudeme písať pod seba 100x ten istý kód, ale vložíme ho do cyklu. Cyklov máme niekoľko druhov, vysvetlíme si, kedy ktorý použiť. Samozrejme si ukážeme praktické príklady.

For cyklus

Tento cyklus má stanovený pevný počet opakovaní a hlavne obsahuje tzv. Riadiace premennú (celočíselnú), v ktorej sa postupne počas behu cyklu menia hodnoty. Syntax (zápis) cyklu for je nasledovná:

for (premenna; podmienka; prikaz)
  • promenna je riadiaca premenná cyklu, ktoré nastavíme počiatočnú hodnotu (najčastejšie 0, pretože v programovaní všetko začína od nuly, nie od jednotky). Napr. teda int i = 0. Samozrejme si môžeme premennú i vytvoriť niekde nad tým a už nemusíme písať slovíčko int, býva ale zvykom používať práve int i.
  • podminka je podmienka vykonanie ďalšieho kroku cyklu. Akonáhle nebude platiť, cyklus sa ukončí. Podmienka môže byť napr (`i
  • prikaz nám hovorí, čo sa má v každom kroku s riadiacou premennou stáť. Teda či sa má zvýšiť alebo znížiť. K tomu využijeme špeciálnych operátorov ++ a --, tie samozrejme môžete používať aj úplne bežne mimo cyklus, slúži na zvýšenie alebo zníženie premenné o 1.

Poďme si urobiť jednoduchý príklad, väčšina z nás určite pozná Sheldona z The Big Bang Theory. Pre tých čo nie, budeme simulovať situáciu, kedy klope na dvere svojej susedky. Vždy 3x zaklope a potom zavolá: "Penny!". Náš kód by bez cyklov vyzeral takto:

System.out.println("Knock");
System.out.println("Knock");
System.out.println("Knock");
System.out.println("Penny!");

My ale už nič nemusíme otrocky opisovať:

for (int i=0; i < 3; i++)
{
    System.out.println("Knock");
}
System.out.println("Penny!");

Konzolová aplikácia
Knock
Knock
Knock
Penny!

Cyklus prebehne 3x, spočiatku je v premennej i nula, cyklus vypíše "Knock" a zvýši premennú i o jedna. Potom beží rovnako s jednotkou a dvojkou. Akonáhle je v i trojka, už nesúhlasí podmienka `i

Skúsme si teraz využiť to, že sa nám premenná inkrementuje. Vypíšme si čísla od jednej do desať a za každým medzeru.

for (int i = 1; i <= 10; i++)
{
    System.out.printf("%d ", i);
}
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

Vidíme, že riadiaci premenná má naozaj v každej iterácii (priebehu) inú hodnotu.

Ak vás zmiatlo použitie printf(), môžeme namiesto nej použiť iba print(), ktorá na rozdiel od println() po vypísaní neodřádkuje:

for (int i = 1; i <= 10; i++)
{
    System.out.print(i + " ");
}

Teraz si vypíšeme malú násobilku (násobky čísel 110, vždy do desať). Stačí nám urobiť cyklus od 1 do 10 a premennú vždy násobiť daným číslom. Mohlo by to vyzerať asi takto:

for (int i = 1; i <= 10; i++)
{
    System.out.print(i + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 2) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 3) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 4) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 5) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 6) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 7) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 8) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 9) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 10) + " ");
}

Konzolová aplikácia
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100

Program funguje pekne, ale stále sme toho dosť napísali. Ak vás napadlo, že v podstate robíme 10x to isté a len zvyšujeme číslo, ktorým násobíme, máte pravdu. Nič nám nebráni vložiť 2 cykly do seba:

System.out.println("Malá násobilka pomocou dvoch cyklov:");
for (int j = 1; j <= 10; j++)
{
    for (int i = 1; i <= 10; i++)
    {
        System.out.print((i * j) + " ");
    }
    System.out.println();
}

Pomerne zásadný rozdiel, že? Pochopiteľne nemôžeme použiť u oboch cyklov i, pretože sú vložené do seba. Premenná j nadobúda vo vonkajšom cykle hodnoty 110. V každej iterácii (rozumejte priebehu) cyklu je potom spustený ďalší cyklus s premennou i. Ten je nám už známy, vypíše násobky, v tomto prípade násobíme premennú j. Po každom behu vnútorného cyklu treba odřádkovat, to vykoná System.out.println().

Urobme si ešte jeden program, na ktorom si ukážeme prácu s vonkajšou premennou. Aplikácia bude vedieť spočítať ľubovoľnú mocninu ľubovoľného čísla:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Mocninátor");
System.out.println("==========");
System.out.println("Zadajte základ mocniny: ");
int a = Integer.parseInt(sc.nextLine());
System.out.println("Zadajte exponent: ");
int n = Integer.parseInt(sc.nextLine());

int vysledek = a;
for (int i = 0; i < (n - 1); i++)
{
    vysledek = vysledek * a;
}

System.out.println("Výsledok: " + vysledek);
System.out.println("Ďakujem za použitia mocninátoru");

Asi všetci tušíme, ako funguje mocnina. Pre istotu pripomeniem, že napríklad 2^3 = 2 * 2 * 2. Teda a^n spočítame tak, že n-1 krát vynásobíme číslo a číslom a. Výsledok si samozrejme musíme ukladať do premennej. Spočiatku bude mať hodnotu a a postupne sa bude v cykle pronásobovat. Ak ste to nestihli, máme tu samozrejme článok s algoritmom výpočtu ľubovoľnej mocniny. Vidíme, že naša premenná vysledek je v tele cyklu normálne prístupná. Ak si však nejakú premennú založíme v tele cyklu, po skončení cyklu zanikne a už nebude prístupná.

Konzolová aplikácia
Mocninátor
==========
Zadajte základ mocniny:
2
Zadajte exponent:
3
Výsledok: 8
Ďakujem za použitia mocninátoru

Už tušíme, na čo sa for cyklus využíva. Zapamätajme si, že je počet opakovaní pevne daný. Do premennej cyklu by sme nemali nijako zasahovať ani dosadzovať, program by sa mohol tzv. Zacykliť, skúsme si ešte posledný, odstrašujúci príklad:

// tento kód je zle
for (int i = 1; i <= 10; i++)
{
    i = 1;
}

Au, vidíme, že program sa zasekol. Cyklus stále inkrementuje premennú i, ale tá sa vždy zníži na 1. Nikdy teda nedosiahne hodnoty &gt; 10, cyklus nikdy neskončí. Program zastavíme tlačidlom Stop pri okne konzoly.

While cyklus

Cyklus while funguje inak, jednoducho opakuje príkazy v bloku kým platí podmienka. Syntax cyklu je nasledovné:

while (podmienka)
{
    // príkazy
}

Ak vás napadá, že možno cez while cyklus urobiť aj for cyklus, máte pravdu :) for je vlastne špeciálny prípad while cyklu. While sa ale používa na trochu iné veci, často máme v jeho podmienke napr. Metódu vracajúci logickú hodnotu true / false. Pôvodný príklad z for cyklu by sme urobili nasledovne pomocou while:

int i = 1;
while (i <= 10)
{
    System.out.print(i + " ");
    i++;
}

To ale nie je ideálne použitie while cyklu. Vezmeme si našu kalkulačku z minulých lekcií a opäť ju trochu vylepšíme, konkrétne o možnosť zadať viac príkladov. Program teda hneď neskončí, ale spýta sa užívateľa, či si praje spočítať ďalší príklad. Pripomeňme si pôvodnú verziu kódu (je to tá verzia sa switch, ale pokojne použite aj tú bez neho, záleží na vás):

System.out.println("Vitajte v kalkulačke");
System.out.println("Zadajte prvé číslo:");
float a = Float.parseFloat(sc.nextLine());
System.out.println("Zadajte druhé číslo:");
float b = Float.parseFloat(sc.nextLine());
System.out.println("Zvoľte si operáciu:");
System.out.println("1 - sčítanie");
System.out.println("2 - odčítanie");
System.out.println("3 - násobenie");
System.out.println("4 - delenie");
int volba = Integer.parseInt(sc.nextLine());
float vysledek = 0;
switch (volba)
{
    case 1:
        vysledek = a + b;
    break;
    case 2:
        vysledek = a - b;
    break;
    case 3:
        vysledek = a * b;
    break;
    case 4:
        vysledek = a / b;
    break;
}
if ((volba > 0) && (volba < 5))
{
        System.out.println("Výsledok: " + vysledek);
}
else
{
        System.out.println("Neplatná voľba");
}
System.out.println("Ďakujem za použitia kalkulačky.");

Teraz vložíme takmer celý kód do while cyklu. Našou podmienkou bude, že používateľ zadá "ano", budeme teda kontrolovať obsah premennej pokracovat. Spočiatku bude táto premenná nastavená na "ano", aby sa program vôbec spustil, potom do nej necháme načítať voľbu užívateľa:

Scanner sc = new Scanner(System.in, "Windows-1250");

System.out.println("Vitajte v kalkulačke");
String pokracovat = "áno";
while (pokracovat.equals("áno"))
{
    System.out.println("Zadajte prvé číslo:");
    float a = Float.parseFloat(sc.nextLine());
    System.out.println("Zadajte druhé číslo:");
    float b = Float.parseFloat(sc.nextLine());
    System.out.println("Zvoľte si operáciu:");
    System.out.println("1 - sčítanie");
    System.out.println("2 - odčítanie");
    System.out.println("3 - násobenie");
    System.out.println("4 - delenie");
    int volba = Integer.parseInt(sc.nextLine());
    float vysledek = 0;
    switch (volba)
    {
        case 1:
                vysledek = a + b;
        break;
        case 2:
                vysledek = a - b;
        break;
        case 3:
                vysledek = a * b;
        break;
        case 4:
                vysledek = a / b;
        break;
    }
    if ((volba > 0) && (volba < 5))
    {
        System.out.println("Výsledok: " + vysledek);
    }
    else
    {
        System.out.println("Neplatná voľba");
    }
    System.out.println("Prajete si zadať ďalší príklad? [áno/nie]");
    pokracovat = sc.nextLine();
}
System.out.println("Ďakujem za použitia kalkulačky.");

Všimnite si, že String y porovnávame pomocou metódy equals(), nie pomocou operátora == ! Je to dané tým, že String je referenčná dátový typ. Podmienka ("Text" == "Text") je zle, musíme písať ("Text".equals("Text")). V kapitole o objektovo orientovanom programovaní pochopíme prečo.

Konzolová aplikácia
Vitajte v kalkulačke
Zadajte prvé číslo:
12
Zadajte druhé číslo:
128
Zvoľte si operáciu:
1 - sčítanie
2 - odčítanie
3 - násobenie
4 - delenie
1
Výsledok: 140
Prajete si zadať ďalší príklad? [áno/nie]
áno
Zadajte prvé číslo:
-10.5
Zadajte druhé číslo:

Naši aplikáciu možno teraz používať viackrát a je už takmer hotová. V budúcej lekcii, Riešené úlohy k 6. lekcii Javy , si ukážeme prácu s poľami.

Už toho vieme celkom dosť, začína to byť zábava, že? :)

V nasledujúcom cvičení, Riešené úlohy k 6. lekcii Javy, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Stiahnuť

Stiahnuté 763x (52.04 kB)
Aplikácia je vrátane zdrojových kódov v jazyku java

 

Predchádzajúci článok
Riešené úlohy k 5. lekcii Javy
Všetky články v sekcii
Základné konštrukcie jazyka Java
Článok pre vás napísal David Čápka
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn university Autor sa informačné technológie naučil na Unicorn College - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity (1)

 

 

Komentáre

Avatar
kuba
Člen
Avatar
kuba:5. januára 19:45

podařilo se mi napsat kalkulačku:

package kalkulacka;
import java.util.Arrays;
import java.util.Scanner;

public class kalkulacka {

        public static void main(String[] args) {

                Scanner sc = new Scanner(System.in, "Windows-1250");


                        System.out.println("Zadejte číslo k vynásobení:");
                        String s = sc.nextLine();
                        int a = Integer.parseInt(s);
                        int c;
                        c = a * 2;
                        System.out.println(c);
                        int d;
                        d = a * 3;
                        System.out.println(d);
                        int e;
                        e = a * 4;
                        System.out.println(e);
                        int f;
                        f = a * 5;
                        System.out.println(f);
                        int g;
                        g = a * 6;
                        System.out.println(g);
                        int h;
                        h = a * 7;
                        System.out.println(h);
                        int i;
                        i = a * 8;
                        System.out.println(i);
                        int j;
                        j = a * 9;
                        System.out.println(j);
                        int k;
                        k = a * 10;
                        System.out.println(k);

        }

}
 
Odpovedať
5. januára 19:45
Avatar
Odpovedá na kuba
Matúš Olejník:5. januára 20:02

Jedna vec je, že sa ti to podarilo, ale píšeš to v lekcii o cykloch a pochváliš sa programom kde si žiadny cyklus nepoužil a namiesto toho si vytvoril x zbytočných premenných a zabil si čas písaním. Rovnako ak by si chcel násobiť číslami až napr. po 100 tak si nechcem predstaviť ako by si to napísal :D

Prejdi si ešte raz túto lekciu a možno prerobíš to násobenie do 4 riadkov :)

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadejte číslo k vynásobení:");

int scannedNumber = Integer.parseInt(sc.nextLine());
for (int i = 2; i < 11; i++){
    System.out.println(scannedNumber * i);
}
Odpovedať
5. januára 20:02
/* I am not sure why this works but it fixes the problem */
Avatar
Jindřich Pšeničný:18. januára 13:56

Ahoj těm zkušeným,
stačí mi když porozumím logice a potřebný kód si prostě z části, nebo celý někde zkopíruju, upravím a přizpůsobím, nebo je nutné "biflovat" zpaměti ?
Resp. chci se zeptat, dají se vůbec všechny třídy a metody naučit ?

 
Odpovedať
18. januára 13:56
Avatar
Jurajs
Člen
Avatar
Odpovedá na Jindřich Pšeničný
Jurajs:18. januára 18:33

Tohle se neda nabiflovat, musis to pochopit jak zakladni konstrukce jazyka viz. podminky, promenne, cykly atp... A co se tyka metod a tříd tak to pochopíš v dalších lekcich viz. OOP - objektově orientovane programovani.­....Nic se hlavne nebifluj ;) A hodne stesti ;)

 
Odpovedať
18. januára 18:33
Avatar

Člen
Avatar
:30. januára 14:10

No, zábava to teda není,zatím, ale musím zkonstatovat, že pan Čápka umí dobře vysvětlovat. To jo, slušná práce*****.
Herbert Schildt takhle názorný rozhodně není. Postupovat podle něj, tak zešedivím.

 
Odpovedať
30. januára 14:10
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
DarkCoder
Člen
Avatar
Odpovedá na
DarkCoder:30. januára 15:08

No jestli se bojíte zešedivění, tak to si raději ani žádné jiné knihy nekupujte. :-) Knihy Herberta Shildta patří k tomu nejlepšímu, co můžete, minimálně na našem trhu, získat. Mnoho z nich už bohužel ani nevychází. Knihy od tohoto autora jsou co se týká srozumitelnosti a návaznosti kapitol excelentní. Chápu, že pro nováčka nemusí být vše hned pochopitelné, ale jak si budete zkoušet různé příklady, bude Vám to připadat jednoznačné. :-)

Odpovedať
30. januára 15:08
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar

Člen
Avatar
Odpovedá na DarkCoder
:30. januára 21:53

Nemám v úmyslu polemizovat, pokud se váš názor liší od mého,je mi to jedno.
Až se budu chtít zeptat na něčí úsudek, tak to udělám, za mě konec debaty.

 
Odpovedať
30. januára 21:53
Avatar
Veronika Nováková:15. apríla 15:23

ahoj, prečo v cvičení mocninátor je zapísané
int vysledek = a;
neviem na to logicky prísť

 
Odpovedať
15. apríla 15:23
Avatar
Veronika Nováková:15. apríla 15:33

tak už som to pochopila :-)

 
Odpovedať
15. apríla 15:33
Avatar
Filip Kohout
Člen
Avatar
Filip Kohout:15. septembra 18:35

Ahoj

Editované 15. septembra 18:36
 
Odpovedať
15. septembra 18:35
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!