Programovací jazyky 1

Informace o předmětu a semestrálních projektech naleznete na stránkách předmětu.
Rozdělení projektů naleznete zde.

Body na zápočet:

  • Průběžné testování na cvičení (5-10)
  • 1. Test (2-5)
  • 2. Test (5-10)
  • Semestrální projekt (10-20)
Minimum na zápočet je 23 bodů.

Rozvržení semestru

Modře jsou označeny týdny, kdy se budou konat realtime testy. Šedě jsou označeny týdny, kdy výuka odpadne z důvodů svátků nebo rektorského/děkanského volna.

1 2 3 4 5 6 7 8 9 10 11 12 13 14

Kliknutím na číslo týdne se dostanete na zadání cvičení pro daný týden.

Cvičení 13

Zdrojové soubory pro cvičení: 012_networking.zip
Úkoly na cvičení (Pro úkoly 1 – 3 upravujte třídu ImageDownloader):

  • Načtěte stránku na adrese http://www.boredpanda.com/best-wildlife-photos-from-national-geographic-traveler-photo-contest-2013 pomocí třídy URL.
  • V načtené stránce pomocí třídy Scanner nalezněte všechny odkazy na obrázky. Použijte regulární výraz "<img\\s.*src\\s*=\\s*\"([^\"]*)\".*>".
  • Obrázky stáhněte na disk – název souboru vytvořte pomocí metody URL.getFile() a z výsledného řetězce necháte část od posledního výskytu znaku "/" do konce. Ignorujte ty, které v tagu obsahují nopin a mají prázdný název souboru.
  • Upravte stahování tak, že se vytvoří pro stáhnutí každého souboru nové vlákno (nejprve implementujte jako vnitřní třídu a pak jako anonymní třídu).
  • Vytvořte "Server", který otevře serverový soket na portu "11111" a očekává připojení klienta. Po připojení zapíše jeden byte(náhodnou hodnotu).
  • Vytvořte klienta, který se připojí a načte jeden byte od serveru.
  • Předchozí program modifikujte tak, že server klientovi zasílá instanci třídy Prepravka.
  • Program modifikujte, že objekt třídy Prepravka zasílá klient, server data upraví a pošle zpět.
  • Doprogramujte "kecací" program - dle TODO 12_01-05

Cvičení 12

Toto cvičení vychází z výukového kurzu od fy Oracle - https://docs.oracle.com/javase/tutorial/essential/io/streams.html - takže pro hlubší vhled či samostudium můžete zavítat na stránky kurzu. Úkoly na cvičení:

  • Naprogramujte program, který zkopíruje zadaný soubor pomocí InputStream(FileInputStream) a OutputStream(FileOutputStream). Kopírování probíhá po bytech. Pro otestování použijte soubor Faust-Goethe.txt.
  • Předchozí příklad upravte tak, že se kopírování provádí pomocí bufferu (pole bytů velikosti 1024*1024B).
  • Naprogramujte předchozí příklad pomocí Writeru a Readeru. Kopírování probíhá po znacích a provádí se konverze na velká písmena.
  • U předchozího úkolu použijte při zápisu použijte metodu DEFLATE (výstup bude komprimován metodou GZIP – použije se GzipOutputStream). Výstupní soubor vhodně pojmenujte – bude obsahovat příponu gz. Soubor prozkoumejte zkuste dekomprimovat (umí to i Servant Salamander).
  • Naprogramujte načítání po řádcích (použijte BufferedReader) na výstup tiskněte očíslované řádky.
  • Pomocí třídy Scanner načítejte ze souboru slova a tiskněte je na konzoli.
  • Pomocí třídy Scanner načtěte ze souboru doubles.txt čísla double a spočítejte jejich aritmetický průměr.
  • Pomocí třídy DataOutputStream zapište do souboru trojice , které budou vycházet z dat: static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
    static final int[] units = { 12, 8, 13, 29, 50 };
    static final String[] descs = {
    "Java T-shirt",
    "Java Mug",
    "Duke Juggling Dolls",
    "Java Pin",
    "Java Key Chain"
    };
  • Prozkoumejte výsledný soubor.
  • Pomocí DataInputStream data načtěte a vytiskněte.

Cvičení 11

Toto cvičení vychází z výukového kurzu od fy Oracle - https://docs.oracle.com/javase/tutorial/java/generics/index.html - takže pro hlubší vhled či samostudium můžete zavítat na stránky kurzu. Vytvořte třídu Obalka, která::

  • obsahuje instanční proměné val typu Object
  • metody getVal a setVal pro získání hodnoty proměnné val
  • Vytvořte instanci třídy obálka a vložte a získejte řetězec „Ahoj světe\n“ a hodnotu 0.314 * 10^1.
  • Vytvořte třídu obálka jako generický typ.
  • Vytvořte generickou třídu Dvojice s parametry klic(typu K), hodnota (typu V).
  • Vytvořte proměnné, do které uložíte:
    • <“Petr Novák“, 23>
    • <”pi”, 3.14>.
  • Vytvořte proměnnou typu Dvojice, ve které je možno uložit <“prvočísla“, (2,3,5,7,11)> - (řetězec a seznam čísel).
  • Vytvořte generickou třídu Zlomek s vlastnostmi (instanční proměnná a odpovídající getXXX a setXXX metody) citatel a jmenovatel. Citatel a jmenovatel jsou generické. Vytvořte metodu hodnota, která spočítá reálnou hodnotu zlomku. Typ citatele a jmenovatele omezte na Integer, Long nebo Short.
  • Vytvořte generickou metodu tiskniSeznam, která vytiskne seznam jakýchkoliv hodnot.
  • Vytvořte generickou metodu generujČísla, která přidá do seznamu n celých čísel (Integer).
  • Vytvořte metodu secti, která vrací součet všech hodnot v seznamu.

Cvičení 10

  • Naimplementujte návrhový vzor dle vlastní volby (mimo Singleton)
  • Opakování na 2. test (bude probíhat v 14. týdnu): PJ1_pisemka2_2015_v2procvicovani.pdf
  • Cvičení 8

    Zdrojové soubory pro cvičení: 008_containers.zip
    Úkoly na cvičení:

    • Uložte slova do kolekce a spočítejte průměrnou délku.
    • Vytiskněte všechna slova s nadprůměrnou délkou.
    • Seřaďte slova lexograficky.
    • Seřaďte slova ze souboru podle délky.
    • Seřaďte slova ze souboru podle délky bez opakování.
    • Seřaďte slova podle četnosti.
    • Doprogramujte CanvasManager - registrace objektu pro vykreslování, zavolání metody paint na všechny objekty. (TODO 8.1 - 8.5)

    Cvičení 7

    Zdrojové soubory pro cvičení: 007_string_processing.zip
    Pracujte s textem ve třídě "Book":

    • Spočítejte četnost písmene „a“. Použijte metody „length“, „charAt“.
    • Spočítejte četnost malých samohlásek a velkých samohlásek. Použijte metody „length“, „charAt“.
    • Spočítejte četnost samohlásek bez ohledu na velikost písmen. Použijte metody „length“, „charAt“ a „toLowerCase“.
    • Nalezněte první výskyt slova „stařec“. Použijte metody „toLowerCase“ a „indexOf(String str)“
    • Spočítejte četnosti slov „stařec“ a „moře“ bez ohledu na velikost písmen. Použijte metody „toLowerCase“ a „indexOf(String str, int fromIndex)“.
    • Spočítejte celkový počet slov. Použijte metodu split a vhodný regulární výraz pro definici interpunkce mezi slovy.
    • Nalezněte všechny palindromy v textu, které jsou delší než jeden znak – použijte princip pro vyhledávání slov v textu a každé slovo testujte, zda je palindrom.
    Pracujte s textem ve třídě "Html":
    • Najděte všechny hypertextové odkazy v html. Použijte třídy Matcher a Pattern.
    • Načtěte definici bludiště v Pacmanovi. Děje se to v metodě Board.initBySchema. Zde můžete postupovat dle komentářů –TODO 7.11.1 – 4.

    Cvičení 6

    Zdrojové soubory pro cvičení (1. část): 006_1_class_extension.zip
    Úkoly na cvičení k první části:

    • Vytvořte abstraktní třídu AbstractShape v balíčku „shapes“ s privátním atributem „position“, „color“, parametrickými bezparametrickým konstruktorem a abstraktními metodami paint(MyGraphics), print(), getPerimeter() a getArea(). Třída bude implementovat rozhraní IPaintable.
    • Vytvořte třídu Rectangle, která bude dědit z třídy AbstractShape a bude obsahovat chráněné atribut sideA a sideB. V parametrickém konstruktoru nastavte všechny atributy a zavolejte konstruktor předka, ve kterému předáte parametr „position“ a „color“. Zděděné abstraktní metody doplňte o implementaci, tak aby správně spočítaly obvod a obsah. V metodě paint() vykreslete obdelník a v metodě print() vypište, že se jedná o obdélník a všechny jeho parametry.
    • Procvičování -Vytvořte třídu Ellipse, která bude dědit z třídy AbstractShape a bude obsahovat chráněné atribut radiusA, radiusB. Abstraktní zděděné metody doplňte o správnou implementaci. V metodě paint vykreslete elipsu a v metodě print() vypište, že se jedná o elipsu a všechny jeho parametry.
    • Z třídy Rectangle bude dále dědit třída Square, u které zajistěte, aby z ní nešlo již dále dědit. V jejím konstruktoru zavolejte konstruktor předka, kde předáte dvakrát hodnotu strany A. Překryjte pouze metodu print.
    • Poslední zděděnou třídou bude Circle, která bude dědit ze třídy Ellipse. V jejím konstruktoru zavolejte konstruktor předka, kde předáte dvakrát hodnotu poloměru A. Překryjte pouze metodu print.
    Zdrojové soubory pro cvičení (2. část): 006_2_class_extension.zip
    Úkoly na cvičení k druhé části:
    • Ve třídě „DelegatePaintableObject“ dodělejte to, že se proměnná delegate nainicializuce návratovou hodnotou metody constructDelagate(Position p, int sizeOfCell). Tato metoda bude pouze ve třídě deklarována nikoliv implementována(jaká bude?). Pozice bude pozice v globálním souřadnicovém systému.
    • Vytvořte potomky třídy „DelegatePaintableObject“ :
      • Wall – vykresluje modrý obdelník přes celou buňku a metoda isObstacle vrací „true“
      • Eat - vykresluje se jako bílý kruh velikosti 1/4*velikost buňky uprostřed této buňky (pozice (x_buňky – velikost/2 + velikost_buňky/2, y_buňky – velikost/2 + velikost_buňky/2))
      • SuperEat vykresluje se jako bílý kruh velikosti 1/2*velikost buňky uprostřed této buňky. SuperEat vytvořte ideálně jako potomka Eat, která překryje metodu computeSize, která vrací velikost kruhu v závislosti na velikosti buňky.
    • Doplňte konstrukce korektních objektů ve třídě Board v místech TODO: T06_2, T06_3 a T06_4.

    Opakování před testem

    Zdrojové soubory pro cvičení: 004_interface_extension.zip
    Úkoly na cvičení:

    • Prostudujte význam použití CanvasManageru.
    • Zajistěte spolupráci tříd Pacman a Ghost s CanvasManagerm.
    • Rozšiřte rozhraní IPaintable rozhraním IMovable. Aplikujte rozhraní IMovable.
    • V PacmanManipulation panelu upravte akce pro posun tak, že se používá třída Mover.
    • Vytvořte rozhraní ITransformable, které rozšiřuje rozhraní IMovable a IInflateable. Ghost a Pacman bude implementovat pouze toto rozhraní.
    • Vytvořte tlačítka pro zvětšování a zmenšování objektů. Pro přístup použijte rozhraní ITransformable(odkaz na aktivní tvar udržujte v proměnné tohoto typu) resp. můžete testovat pomocí operátoru instanceof.
    • Vytvořte třídu AbstractMovable, která bude předek všech základních tvarů - bude implementovat metody související s pozicí(rozhraní IMovable).

    Cvičení 3

    Zdrojové soubory pro cvičení: 003_interface.zip
    Úkoly na cvičení:

    • Nápovědy najdete na zde
    • Vytvoření tlačítka pro vytvoření čtverce.
    • Vytvořit tlačítka pro další tvary.
    • Vytvořit tlačítka pro posunutí.
    • Vytvoření rozhraní IMovable, které umožňuje posouvat i trojúhelníky, elipsy, čtverce. (Poslední vytvořený tvar je uložen v instanční proměnné.)
    • Vytvořit tlačítko pro zmenšení, zvětšení – vytvoření dalšího rozhraní, IInflatable.
    • Ošetření, že něčemu nelze změnit velikost – použití operátoru instanceof.

    Cvičení 2

    Zdrojové soubory pro cvičení: 002_kompozice.zip
    Úkoly na cvičení:

    • Vytvořte novou třídu „Dum.“
    • Vytvořte bezparametrický konstruktor, ve kterém se vytváří zelená střecha tvořená trojúhelníkem (objekt třídy Triangle) a šedé zdivo (objekt Rectangle).
    • Vytvořte parametrický konstruktor, který umožňuje nastavit umístění domu na konkrétní pozici.
    • Vytvořte metody moveRight a moveDown, které způsobí posunutí domu o určitý počet pixelů v požadovaném směru.
    • Vytvořte metody getX a getY, které vrátí pozici domu.
    • Pracujte na zadaných samostatných úkolech

    Cvičení 1

    Zdrojové soubory pro cvičení: 001_shapes_bug.rar
    Úkoly na cvičení:

    • Opravte kompilační chyby
    • Vytvořte třídu Main, která bude sloužit jako výchozí třída pro spouštění projektu (obsahuje metodu main)
    • Zavolejte v metodě main metodu printKnownNames a getColor na třídu MyColor s parametrem "modra". Výsledek volání metody getColor uložte do proměnné "blue" typu MyColor.
    • Vytvořte instanci třídy Rectangle - ve výchozí pozici a s výchozí velikostí a v pozici 50, 50 a s rozměry 100, 100.
    • Přesuňte libovolný čtverec doprava.
    • Vytvořte modrý čtverec.
    • Vyzkoušejte volání metod na čtverec - metody moveXXX, erase a paint (parametrickou a neparametrickou verzi).
    • Vytvořte třídu Tree, která při konstrukci instance v konstruktoru vytvoří kmen (hnědý Obdelník) a korunu (zelená Elipsa).