Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Cvičení k 5. - 8. lekci OOP v Javě

Java Objektově orientované programování Cvičení k 5. - 8. lekci OOP v Javě

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Následující 3 cvičení vám pomohou procvičit znalosti objektově orientovaného programování v Javě z minulých lekcí. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulých tutoriálů a pokuste se na to přijít.

Jednoduchý příklad

Angry bird

Fotografie: Mohamed Raoof.p.m / Rex features

V aplikaci vytvořte třídu Ptak s atributy:

  • hlad = výchozí hodnota 100 jednotek
  • vaha = výchozí hodnota 50 gramů

Třídě dodejte metodu snez(), která přijímá kolik gramů potravy má pták sníst. Váha ptáka se po snědení potravy zvýší o váhu potravy a hlad se o toto množství sníží.

Následně přidejte třídu AngryPtak, který ptáka rozšiřuje o atribut vztek s výchozí hodnotou 50 a metodu provokuj(). Tato metoda přijímá jako parametr míru provokace, která zvýší vztek ptáka. Pokud je pták hladový, naštve se 2x rychleji (přičte se mu tedy dvojnásobek míry provokace, než kolik bylo metodě předáno). Třídy nemusí pro zjednodušení vůbec obsahovat konstruktory.

  • Nejprve ve své aplikaci vytvořte instanci ptáka a vypište ji.
  • Následně ji nechte sníst 20g potravy a opět ji vypište.
  • Dále vytvořte instanci angry ptáka a vypište ji.
  • Instanci angry ptáka provokujte s mírou provokace 5 a vypište.
  • Dále ji nechte sníst 100g potravy a opět provokujte s mírou provokace 5. Výslednou instanci opět vypište.

Ukázka obrazovky programu:

Konzolová aplikace
Jsem pták s váhou 50 a hladem 100.
Jsem pták s váhou 70 a hladem 80.
Jsem angry-pták s váhou 50 a hladem 100, míra mého vzteku je 50.
Jsem angry-pták s váhou 50 a hladem 100, míra mého vzteku je 60.
Jsem angry-pták s váhou 150 a hladem 0, míra mého vzteku je 65.

    public class Ptak
    {
    }
    public class AngryPtak extends Ptak
    {
    }

Středně pokročilý příklad

Rozšiřte třídu Clovek z Cvičení k 3. lekci OOP v Javě. Pokud cvičení nemáte zakoupené, kód třídy je následující:

public class Clovek {

    /**
     * Celé jméno
     */
    private String jmeno;
    /**
     * Věk
     */
    private int vek;
    /**
     * Únava
     */
    private int unava = 0;

    /**
     * Inicializuje novou instanci
     * @param jmeno Celé jméno
     * @param vek Věk
     */
    public Clovek(String jmeno, int vek)
    {
        this.jmeno = jmeno;
        this.vek = vek;
    }

    /**
     * Spí danou dobu
     * @param doba Doba v hodinách
     */
    public void spi(int doba)
    {
        unava -= doba * 10;
        if (unava < 0)
            unava = 0;
    }

    /**
     * Uběhne danou vzdálenost
     * @param vzdalenost Vzdálenost v Km
     */
    public void behej(int vzdalenost)
    {
        if (unava + vzdalenost <= 20)
            unava += vzdalenost;
        else
            System.out.println("Jsem příliš unavený");
    }

    /**
     * Vrátí textovou reprezentaci člověka
     * @return textová reprezentace člověka
     */
    @Override
    public String toString()
    {
        return String.format("%s (%d)", jmeno, vek);
    }
}

Třídu Clovek poděďte ve třídě Javista. Javista člověka rozšiřuje o atribut IDE, kde je uložen název vývojového prostředí, ve kterém programuje. Atribut se zadává spolu s dalšími atributy Javisty v konstruktoru. Javista dále disponuje metodou programuj(), která přijímá v parametru počet řádků, která má napsat. Za každých 10 řádku přidejte jednotku únavy a zároveň únavu nenechte vzrůst nad 20 jednotek. V případě příliš vysoké únavy metoda vypíše "Jsem příliš unavený, abych programoval".

  • V aplikaci vytvořte Javistu jménem "Karel Nový" s věkem 25 let a vypište ji do konzole.
  • Karla nechte uběhnout 2x 10 km.
  • Nechte jej naprogramovat 5 řádků.
  • Dále běhat 10 km.
  • Spát 8 hodin.
  • Naprogramovat 100 řádků.

Ukázka obrazovky programu:

Konzolová aplikace
Karel Nový (25)
Jsem příliš unavený, abych programoval
Jsem příliš unavený

Třídu musíte drobně upravit, aby bylo rozšíření možné. Nezapomeňte zavolat konstruktor předka.

    public class Javista extends Clovek
    {
    }
    public class Clovek
    {
    }

Pokročilý příklad

Vytvořte třídu Tvar, která slouží jako předek pro všechny geometrické útvary a která definuje jejich společné vlastnosti. Všechny tvary mají nějakou barvu (String), kterou lze nastavit konstruktorem.

Od této třídy následně odvoďte třídy Trojuhelnik a Obdelnik, které budou schopny spočítat svůj obsah. Hierarchie tříd je znázorněna následujícím UML diagramem:

UML diagram

K výpočtu obsahu trojúhelníku využijte Heronova vzorce.

Heronův vzorec umožňuje vypočítat obsah libovolného trojúhelníku pomocí délek jeho stran. Při výpočtu nejprve spočítáme s (malé es). Celkový obsah spočítáme pomocí tohoto s a to takto:

Heronův vzorec

S využitím těchto tříd vypočítejte obsah tohoto obrazce:

Cvičení k OOP v PHP – Strom

Ukázka obrazovky programu:

Konzolová aplikace
Obsah stromu je 492.578098794425 cm^2

    public class Obdelnik extends Tvar
    {
    }
    public class Trojuhelnik extends Tvar
    {
    }
    public class Tvar
    {
    }

Třídu Tvar by bylo vhodné označit jako abstraktní, aby jazyk chápal, že slouží pouze k dědění a nemá od ní smysl vytvářet instanci (vytvořit obecný tvar nedává smysl). Jak to udělat se dozvíte dále v Java kurzu.


 

Stáhnout

Staženo 15x (62.36 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

 

Článek pro vás napsal Samuel Kodytek
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
Miniatura
Následující článek
Statika
Aktivity (6)

 

 

Komentáře

Avatar
Michal Navrátil:11. listopadu 18:09

Ahoj, mám dotaz na jednoduchý příklad (odevzdal jsem a funguje, ale...):
Když v main() založím:

Ptak kodo = new Ptak();
AngryPtak aKodo = new AngryPtak();

...pak vše funguje, jak má. AngryPtak je potomek třídy Ptak, takže na objektu aKodo můžu volat např. metodu snez(), která je ve třídě Ptak. Když ale v main() založím:

Ptak kodo = new Ptak();
Ptak aKodo = new AngryPtak();

... tak na objektu aKodo nemůžu volat metodu, která je uvnitř třídy AngryPtak, přestože AngryPtak je potomek třídy Ptak.
Proč tomu tak je???
V tahovém boji bez problémů můžeme napsat:

Bojovnik gandalf = new Mag(....);

... a vše funguje... Co mi uniká?

Díky!

 
Odpovědět 11. listopadu 18:09
Avatar
zitekv
Člen
Avatar
Odpovídá na Michal Navrátil
zitekv:11. listopadu 23:29

Tvůj příklad s Gandalfem je stejný jako s AngryPtakem ;-)

Ptak aKodo = new AngryPtak()
Bojovnik gandalf = new Mag(....);

Ty můžeš do typu předka vložit potomka, protože ten má všechny metody z předka, ale v okamžiku kdy to uděláš, nevidíš ty další metody, které má potomek navíc.

 
Odpovědět 11. listopadu 23:29
Avatar
Odpovídá na zitekv
Michal Navrátil:11. listopadu 23:48

Ok. Díky!

 
Odpovědět 11. listopadu 23:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.