4. sada domácich zadaní

Najneskorší termín odovzdania: 25.10.2015 (nedeľa) o 21:00
Odovzdávané súbory: ZadanaKorytnacka.java, SpojovaciaDoska.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 SpojovaciaDoska, 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í (napr. neodporúčame použiť regulárne výrazy).

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.

Pomoc pre hendikepovaných (3 body)

Rôzne poruchy nervového a svalového systému výrazne zhoršujú používanie počítačov - zvyčajnými vstupmi sú totiž klávesnica alebo myš. Dôsledkom takýchto porúch (napr. svalový tras a chvenie) môže byť akási obdoba koktavosti. Používateľ vtedy namiesto slova Java napíše Jaaaavvaa. Naučte korytnačky triedy ZadanaKorytnacka metódu odstranDuplicitu, ktorá vráti referenciu na novovytvorený objekt triedy String, ktorého obsah vznikne odstránením duplicitných výskytov rovnakého znaku v rade za sebou.

public String odstranDuplicitu(String s)

Príklady:

  • odstranDuplicitu("Jaaavvaaa") = "Java"
  • odstranDuplicitu("IIIssiel") = "Isiel"
  • odstranDuplicitu("IIissiel") = "Iisiel"
  • odstranDuplicitu("Odddstran duuuupllicitu") = "Odstran duplicitu"

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."

HTML entity (2 body + 5 bodov)

Zobrazila sa vám niekedy webová stránka "divne"? Ak áno, možno bol dôvod ten, že tvorca stránky nekorektne uviedol kódovanie obsahu stránky. Okrem nastavenia kódovania zaujímavé riešenie priniesla aj HTML 4: znakové entity. Základná myšlienka spočívala v tom, že špeciálne znaky sa kódovali prostredníctvom sekvencie znakov. Napríklad znak < sa dá zapísať ako &lt; alebo ako &#60;. A práve tá druhá možnosť je pre nás zaujímavá. Konkrétne, akýkoľvek znak môžeme v HTML4 zapísať pomocou znakovej entity ako &#N;, kde N je kód tohto znaku v UNICODE kódovaní.

Viac o html znakových entitách nájdete tu:

Naučte korytnačky triedy ZadanaKorytnacka metódy znakyNaEntity a entityNaZnaky. Každá z metód vráti referenciu na novovytvorený reťazec (objekt triedy String), ktorý obsahuje výsledok prevodu zadaného reťazca.

public String znakyNaEntity(String s)
public String entityNaZnaky(String s)

Metóda znakyNaEntity (2 body) prevedie každý znak v zadanom reťazci na prislúchajúcu znakovú entitu. Výnimkou sú znaky anglickej abecedy (a-z, A-Z, 0-9), ktoré sa neprevádzajú.

Príklad:

  • znakyNaEntity("Počítač") = "Po&#269;&#237;ta&#269;"

Metóda entityNaZnaky (5 bodov) prevedie každý výskyt znakovej entity (kódovanej ako &#N;) na odpovedajúci znak. Môžete predpokladať korektný vstup, t.j., že prevádzaný reťazec nebude obsahovať znakové entity kódované iným spôsobom (hexadecimálne alebo pomenované znakové entity).

Príklad:

  • entityNaZnaky("Po&#269;&#237;t&#97;&#269;") = "Počítač"

Pomôcka:

  • na prevod číselného reťazca na číslo môžete použiť metódu Integer.parseInt():
int c = Integer.parseInt("123");
  • na prevod čísla na číselný reťazec môžete použiť metódu Integer.toString():
String s = Integer.toString(123);
  • na vytvorenie podreťazca zadaného reťazca môžete použiť metódu substring:

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

Spojovacia doska (4 body)

Naprogramujte triedu SpojovaciaDoska rozšírujúcu triedu WinPane, ktorá klikaním do plochy spája označené kotviace body. Kotviace body v ploche kreslí metóda kresliKotviaceBody.

Ako funguje spojovacia doska:

  • Prvým kliknutím (onMouseClicked) do plochy sa modrou bodkou (so stredom v kotviacom bode) s polomerom 3 označí kotviaci bod, ktorý je najbližšie k miestu kliknutia.
  • Druhým kliknutím (onMouseClicked) do plochy sa spojí kotviaci bod najbližší k miestu kliknutia s kotviacim bodom, ktorý bol označený pri prvom kliknutí. Počiatočný a koncový bod spojnice sa vyznačia bodkou s polomerom 3 so stredom v týchto kotviacich bodoch. Ak bol pri druhom kliknutí zatlačený Alt, kreslí sa červená spojnica a jej konce sa vyznačia červenou bodkou. Ak Alt nebol zatlačený, kreslí sa čierna spojnica a jej konce sa vyznačia čiernou farbou.
  • Ďalšie kliknutie do plochy funguje tak, akoby išlo o prvé kliknutie do plochy.

Systém kreslenia spojovacích čiar dedukujte zo screenshotu.

import java.awt.Color;
import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.*;

public class SpojovaciaDoska extends WinPane {

        public void kresliKotviaceBody() {
                Turtle kreslic = new Turtle();
                this.add(kreslic);

                int rozostup = 10;
                int pocetHorizontalnych = this.getWidth() / rozostup;
                int pocetVertikalnych = this.getHeight() / rozostup;

                kreslic.setFillColor(Color.gray);
                for (int j = 0; j <= pocetVertikalnych; j++) {
                        for (int i = 0; i <= pocetHorizontalnych; i++) {
                                kreslic.setPosition(i * rozostup + rozostup / 2, j * rozostup
                                                + rozostup / 2);
                                kreslic.dot(1);
                        }
                }

                this.remove(kreslic);
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                // ...
        }
}
public class Spustac {

        /**
         * @param args
         */

        public static void main(String[] args) {
                SpojovaciaDoska d = new SpojovaciaDoska();
                d.kresliKotviaceBody();        
        }
}

Poznámky k evaluácii 4. sady

"Odfajknutie" metódy v úlohe Spojovacia doska znamená, že sa podarilo zrealizovať všetky testy. Neznamená to, že korytnačka nakreslila to, čo mala.

Očakávané grafické výstupy evaluátora pre korektné riešenie (pozície jednotlivých bodov sa môžu líšiť):

Spojovacia doska

Všimnite si, že evaluátor ako grafické značky kreslí očakávané spojnice svetlejšou farbou.