4. sada domácich zadaní

Najneskorší termín odovzdania: 23.10.2016 (nedeľa) o 22:00
Odovzdávané súbory: ZadanaKorytnacka.java, KlikaciaPlocha.java

Cieľom tejto sady domácich zadaní je vytvoriť triedu ZadanaKorytnacka, ktorá rozširuje triedu Turtle a ktorá obsahuje nižšie predpísané metódy, a triedu KlikaciaPlocha, ktorá rozširuje triedu WinPane.

Doplňujúce požiadavky:

  • riešenia, ktoré nebude možné skompilovať (t.j. riešenia so syntaktickými chybami) nebudú hodnotené,
  • zdrojový kód správne naformátujte (CTRL+SHIFT+F),
  • očakáva sa vhodne okomentovaný zdrojový kód
  • pri riešení používajte len poznatky, ktoré boli súčasťou 4. prednášky a na ňu nadväzujúcich cvičení (ak napr. použijete regulárne výrazy, očakávame, že nám budete vedieť komplexne vysvetliť ako sa vytvárajú a používajú regulárne výrazy v Jave),
  • odoslané triedy musia obsahovať len metódy nevyhnutné pre fungovanie metód uvedených v zadaní.

Každé písmeno len raz (1 bod)

Naučte korytnačky triedy ZadanaKorytnacka metódu pismenoLenRaz, ktorá vráti referenciu na novovytvorený reťazec. Tento reťazec bude obsahovať všetky znaky nachádzajúce sa v zadanom reťazci avšak každý znak len raz. Znaky vo vytvorenom reťazci nech sú usporiadané podľa poradia ich prvého výskytu v zadanom reťazci.

public String pismenoLenRaz(String retazec)

Príklady:

  • pismenoLenRaz("Domace zadanie") = "Domace zdni"
  • pismenoLenRaz("pismenoLenRaz") = "pismenoLRaz"

Tip: metóda indexOf.

Korytnačka ovládaná príkazmi (2 body)

Iste by bolo pekné, ak by korytnačky rozumeli aj takým normálnejším príkazom v slovenčine. Do triedy ZadanaKorytnacka pridajte metódu vykonajPrikaz, ktorá ako parameter očakáva referenciu na reťazec obsahujúci príkaz. Korytnačka by mala podporovať tieto príkazy:

  • vpravo X - korytnačka sa otočí o zadaný uhol v smere hodinových ručičiek, ak uhol nie je zadaný, korytnačka sa otočí o 90 stupňov.
  • vlavo X - korytnačka sa otočí o zadaný uhol proti smeru hodinových ručičiek, ak uhol nie je zadaný, korytnačka sa otočí o 90 stupňov.
  • dopredu X - korytnačka spraví krok zadanej dĺžky, ak dĺžka kroku nie je zadaná, korytnačka spraví krok dĺžky 10.

Názov príkazu je od hodnoty parametra (ak je zadaný) oddelený aspoň jednou medzerou. Pozor: nadbytočné medzery sa môžu nachádzať aj na začiatku a konci reťazca.

Príklady príkazov: "vlavo 120", " vpravo", " dopredu ", " dopredu 100 ", "vlavo", "vlavo 90.5".

public void vykonajPrikaz(String prikaz)

Pomôcka:

  • na prevod číselného reťazca na číslo môžete použiť metódu Double.parseDouble():
double c = Double.parseDouble("100.5");

Tip: metódy indexOf, substring.

Tagy preč (2 body)

Základným prvkom HTML je značkovanie textu pomocou tagov. Tag je postupnosť znakov ohraničená znakmi < a >. Príklad textu s tagmi: Zakladnym prvkom <i>html</i> je <strong>tag</strong>.

Do triedy ZadanaKorytnacka pridajte metódu odstranTagy, ktorá vráti referenciu na novovytvorený reťazec, ktorý vznikne zo zadaného reťazca odstránením všetkých tagov.

public String odstranTagy(String retazec)

Príklad:

  • odstranTagy("Zakladnym prvkom <strong>html</strong> je <b>tag</b>.") = "Zakladnym prvkom html je tag."

Čísla v textoch (3 body)

Pri analýze textu sa z textu extrahujú kadejaké užitočné informácie. Medzi veľmi zaujímavé patria rôzne číselné informácie. Naučte korytnačky triedy ZadanaKorytnacka metódu pocetCisel, ktorá v zadanom reťazci zráta počet čísel, ktoré sa v ňom nachádzajú. Pod číslom rozumieme akúkoľvek súvislú postupnosť cifier 0, ..., 9 a znaku , (čiarka). Predpokladáme korektný (a zjednodušený) vstup, t.j., že čísla v texte obsahujú nanajvýš jednu čiarku ako oddeľovač desatinnej časti a v texte nie sú použité medzery ako oddeľovač tisícov.

public int pocetCisel(String s)

Príklady:

  • reťazec "NDS za tieto služby zaplatí namiesto predpokladaných 190 tis. eur len 88,16 tis. eur bez DPH." obsahuje 2 čísla (číselné podreťazce): 190 a 88,16;
  • reťazec "Ropná firma PK Orlen však klesla o 0,33 % na 44,79 PLN za akciu a operátor TPSA zlacnel o 0,54 % na 16,73 PLN za akciu." obsahuje 4 čísla;
  • reťazec "Hlavný index varšavskej burzy WIG20 stúpol o 0,46 % na 2416,37 bodu." obsahuje 3 čísla;
  • reťazec "120+30=150" obsahuje 3 čísla.

Jožkov šifrovač (2 body)

Existujú rôzne metódy, ako údaje „zmenšiť“ (kompresné algoritmy) alebo znemožniť ich prečítanie nežiadúcou osobou (šifrovacie algoritmy). V rámci tejto úlohy bude cieľom vytvoriť metódu, ktorá nepovolaným osobám trochu (ale naozaj iba trochu) sťaží prečítanie obsahu správy.

Do triedy ZadanaKorytnacka pridajte metódu zasifruj, ktorá zadaný reťazec transformuje na iný reťazec aplikovaním tzv. Jožkovho šifrovača. Nový reťazec zo zadaného reťazca vytvoríme preusporiadaním znakov. Prvý znak v novom reťazci bude prvý znak pôvodného reťazca, druhý znak v novom reťazci bude posledný znak pôvodného reťazca, tretí znak v novom reťazci bude druhý znak pôvodného reťazca, štvrtý znak v novom reťazci bude predposledný znak v pôvodnom reťazci, atď. Jednoducho nový reťazec vznikne striedavým pridávaním znakov zo začiatku reťazca a z konca reťazca, až kým sa „nestretneme“ v strede.

public String zasifruj(String retazec)

Príklady:

  • zasifruj("mama vari veceru") = "muarmeac evva ri"
  • zasifruj("ahoj svet") = "atheovjs "

Jožkov dešifrovač (3 body)

Samotný šifrovač nie je veľmi užitočný bez dešifrovača. Do triedy ZadanaKorytnacka pridajte metódu desifruj, ktorá vráti dešifrovaný reťazec, t.j. taký reťazec, ktorého zašifrovaním dostaneme reťazec s rovnakým obsahom ako je parametrom referencovaný reťazec.

public String desifruj(String retazec)

Má teda platiť, že s.equals(zasifruj(zakoduj(s)).

Mnohouholníky (4 body)

Naprogramujte triedu KlikaciaPlocha rozšírujúcu triedu WinPane, ktorá klikaním do plochy umožní kresliť mnohouholníky s očíslovanými vrcholmi.

Klikacia plocha funguje nasledovne:

  • vrcholy mnohouholníka sa vytvárajú zatlačením ľavého tlačidla myši (využite onMousePressed), pričom miesto kliknutia je stredom vrcholu
    • ak sa práve vytvára nejaký mnohouholník, vytvorený vrchol sa pridá medzi vrcholy tohto mnohouholníka spojením s naposledy pridaným vrcholom mnohouholníka,
    • ak sa žiaden mnohouholník nevytvára, vytvorený vrchol bude prvým vrcholom nového vytváraného mnohouholníka,
  • vrcholy sú znázornené oranžovou bodkou s polomerom 10, ktorá obsahuje poradové číslo bodky v rámci aktuálne naklikavaného mnohouholníka;
  • za sebou nasledujúce vrcholy mnohouholníka sú spojené čiarou
    • spojovacia čiara nezasahuje do vnútra bodiek znázorňujúcich spájané vrcholy,
    • spojovacia čiara leží na priamke určenej stredmi spájaných vrcholov,
  • kliknutie na prvý vrchol (prislúchajúcu bodku) práve vytváraného mnohouholníka ukončí jeho kreslenie, t.j. ďalšie kliknutie do plochy znamená, že ideme kresliť nový mnohouholník.

Pomôcka:

  • na kreslenie do stredu môžete použiť metódu printCenter:
jozko.setDirection(90);
jozko.printCenter("Ahoj");
  • na prevod čísla na číselný reťazec môžete použiť metódu Integer.toString():
String s = Integer.toString(123);

Poznámky k evaluácii 4. sady - Mnohouholníky

"OK" pri metóde znamená, že sa podarilo zrealizovať všetky testy a po skončení metódy ostala korytnačka v požadovanom stave. Neznamená to, že korytnačka nakreslila to, čo mala. Upozorňujeme, že evaluátor dokresľuje do grafických výstupov vizuálne značky (poloha korytnačky, významné body, podfarbenie, atď.), ktoré umožňujú rýchlu vizuálnu kontrolu riešenia.

Očakávané grafické výstupy evaluátora pre korektné riešenie: