Metódy vracajúce hodnoty - funkcie

<< Cykly | Obsah | Komentáre >>

Pri skúmaní metód korytnačiek sme mohli pozorovať, že niektoré metódy nielen niečo vykonajú, ale naviac aj vrátia (vypočítajú) nejakú hodnotu. Typickým príkladom takýchto metód sú getX(), ktorá vráti x-ovú súradnicu aktuálnej pozície korytnačky, či distanceTo(double x, double y), ktorá vráti vzdialenosť korytnačky k bodu na súradniciach (x, y). Takéto metódy vracajúce nejakú hodnotu sa zvyknú označovať aj ako funkcie. V predchádzajúcich častiach sme sa už naučili vytvárať vlastné metódy pre objekty tried rozširujúcich triedu Turtle. Tieto metódy však len vykonali nejakú postupnosť príkazov - žiadnu hodnotu nevypočítavali a nevracali.

Vytvorenie metód vracajúcich hodnotu

Spôsob, ako si vytvoriť vlastnú metódu, ktorá vracia nejakú hodnotu, je v Jave veľmi jednoduchý a skladá sa z 2 fáz:

  • definovanie, že metóda vracia hodnotu nejakého typu
  • použitie príkazu, ktorý vráti nejakú hodnotu ako výsledok vykonávania metódy

Na definovanie toho, že metóda vracia hodnotu nejakého typu, stačí zameniť slovíčko void za typ hodnoty, ktorú metóda vracia. Ak teda chceme mať metódu, ktorá vráti hodnotu typu double, jej hlavička bude vyzerať nasledovne:

public double stvorcovaSpirala()

Analogicky, hlavička metódy, ktorá by mala vrátiť počet deliteľov čísla n by mohla vyzerať takto:

public int pocetDelitelov(int n)

Ak to zosumarizujeme, tak slovíčko void za slovom public hovorí, že metóda nevracia žiadnu hodnotu. Naopak použite označenia nejakého typu (double, int, float, boolean, ...) za slovom public hovorí, že metóda vracia hodnotu daného typu.

Ostáva nám už len povedať, ako v Jave povieme, že nejaká hodnota je tou hodnotou, ktorú má vrátiť metóda. Na to, aby sme vrátili nejakú hodnotu sa používa príkaz return:

return hodnotaKtoruVraciame;

Prirodzene, ak nejaká hodnota má byť metódou vrátená, tak musí byť takého typu, ako sme povedali (definovali) v hlavičke metódy. O príkaze return je dôležité zapamätať si, že ukončuje vykonávanie metódy, t.j. žiadne ďalšie príkazy metódy sa po ňom už nevykonávajú.

Pozrime sa na niekoľko príkladov:

  • metóda, ktorá nakreslí štvorcovú špirálu a vráti, koľko toho korytnačka prešla:
public double stvorcovaSpirala() {
        double prejdene = 0;
        double dlzkaKroku = 150;


        while (dlzkaKroku > 1) {
                this.step(dlzkaKroku);
                prejdene = prejdene + dlzkaKroku;

                dlzkaKroku = dlzkaKroku * 0.9;
                this.turn(90);
                JPAZUtilities.delay(30);
        }

        return prejdene;
}
  • metóda, ktorá vráti menšiu z hodnôt parametrov (obe metódy vrátia to isté, ale pozor, obe sa nemôžu naraz nachádzať v tej istej triede lebo sa volajú rovnako a majú rovnaký počet a rovnaké typy parametrov):
public double min(double c1, double c2) {
        if (c1 < c2) {
                return c1;
        } else {
                return c2;
        }        
}

public double min(double c1, double c2) {
        if (c1 < c2) {
                return c1;
        }

        return c2;
}

Čo je dôležité si pamätať:

  • Vykonanie príkazu return ukončuje ďalšie vykonávanie príkazov metódy.
  • Každá metóda, ktorá nevracia void, musí každé svoje vykonanie skončiť príkazom return, t.j. vrátením hodnoty
  • Vrátená hodnota musí byť kompatibilná s definovaným typom návratovej hodnoty.
    • napr. metóda definovaná ako metóda vracajúca int nemôže vrátiť reálne číslo (double hodnotu)
  • Príkaz return; možno použiť v metódach vracajúcich void na okamžité ukončenie vykonávania metódy.

Rôzne matematické metódy

Metódy vracajúce (počitajúce) nejaké hodnoty môžeme celkom dobre využiť na výpočet rôznych matematicky motivovaných úloh pracujúcich s číslami. Pri riešení takýchto úloh si poväčšine vystačíme so šikovnou kombináciou pár fínt:

  • poslednú cifru čísla uloženého v premennej c dostaneme výrazom c % 10 (pripomíname, že % označuje zvyšok po delení)
    • 135 % 10 = 5
    • 12 % 10 = 2
  • ak chceme vytvoriť číslo, ktoré vznikne odstránením poslednej cifry čísla uloženého v premennej c, použijeme výraz c / 10 (pripomíname, že ak oba operandy sú celé čísla, tak / reprezentuje celočíselné delenie)
    • 135 / 10 = 13
    • 12 / 10 = 1
  • ak chceme vytvoriť číslo, ktoré vznikne pridaním cifry cifra za cifry čísla c, použijeme výraz c * 10 + cifra
    • cifra 8 a číslo 135: 135 * 10 + 8 = 1350 + 8 = 1358
  • ak chceme zistiť, či číslo a je deliteľom čísla b, tak otestujeme, či b % a == 0
  • počítače ľúbia (a vedia) počítať a preto sa niekedy na riešenie úloh používa metóda otestovania všetkých možností
    • na zistenie počtu deliteľov čísla n jednoducho otestujeme každé celé číslo medzi 1 a n, či náhodou nie je deliteľom čísla n

Typickou úlohou, ktorá využíva vyššie uvedené finty, je výpočet ciferného súčtu. Ciferný súčet čisla 154 je 10, lebo 1+5+4=10. Výpočet môže postupovať takto: postupne z čísla odtrhávame poslednú cifru (lebo tú dokážeme vybrať) a odtrhnutú cifru pripočítavame k aktuálne zapamätanému súčtu cifier. Tento postup opakujeme, kým sú nejaké cifry, t.j. kým je číslo rôzne od 0.

V Jave by sme to naprogramovali takto:

public int cifernySucet(int cislo) {
        // premenna, do ktorej budeme pocitat sucet
        int vysledok = 0;

        // kym sme z cisla "nevyhodili" vsetky cifry ...
        while (cislo > 0) {
                // vyberieme poslednu cifru
                int cifra = cislo % 10;
                // pridame cifru do suctu
                vysledok = vysledok + cifra;
                // skratime cislo o poslednu cifru
                cislo = cislo / 10;
        }

        // vratime vypocitany sucet
        return vysledok;
}

Trieda Math

Aritmetické výrazy naberajú na svojej sile, ak už vieme používať aj zložitejšie algebraické operácie ako sú napríklad sínus, odmocnina, mocnina, zaokrúhlenie, absolútna hodnota, logaritmus a podobne. Všetky tieto operácie sú už samozrejme vytvorené. Zoznam všetkých takýchto operácií si môžete pozrieť v dokumentácii triedy Math. Okrem metód tu môžeme nájsť aj dve konštanty: Ludolfovo číslo Math.PI a Eulerovo číslo Math.E. Použitie je jednoduché. Povedzme, že chceme vypočítať vzdialenosť dvoch bodov v dvojrozmernom priestore podľa Pytagorovej vety.

Použijeme metódu na odmocninu Math.sqrt a metódu na mocninu Math.pow.

double x1 = 5.0;
double y1 = 1.0;
double x2 = 2.0;
double y2 = -3.0;
double d = Math.sqrt( Math.pow( x2 - x1, 2 ) + Math.pow( y2 - y1, 2 ) );
System.out.print("Vzdialenosť je : ");
System.out.println(d); // vypíše 5.0

<< Cykly | Obsah | Komentáre >>