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)
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
- 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)
- 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.
- 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.
- 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.
- 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.
- 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).
- 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.
- 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
- 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).
Cvičení 8
Zdrojové soubory pro cvičení: 008_containers.zip Úkoly na cvičení:
Cvičení 7
Zdrojové soubory pro cvičení: 007_string_processing.zip Pracujte s textem ve třídě "Book":
Cvičení 6
Zdrojové soubory pro cvičení (1. část): 006_1_class_extension.zip Úkoly na cvičení k první části:
Opakování před testem
Zdrojové soubory pro cvičení: 004_interface_extension.zip Úkoly na cvičení:
Cvičení 3
Zdrojové soubory pro cvičení: 003_interface.zip Úkoly na cvičení:
Cvičení 2
Zdrojové soubory pro cvičení: 002_kompozice.zip Úkoly na cvičení:
Cvičení 1
Zdrojové soubory pro cvičení: 001_shapes_bug.rar Úkoly na cvičení: