4. sada domácich zadaní

Najneskorší termín odovzdania: 21.10.2013 (pondelok) 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),
  • 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."

Špeciálne znaky v Jave (3 body)

Z prednášky vieme, že v Jave niektoré znaky v znakových a reťazcových literáloch musíme zapisovať špeciálnym spôsobom - pomocou znaku \. Napríklad ak chceme niekde v reťazci použiť znak ", musíme ho zapísať ako \". Všetky špeciálne znaky nájdete na stránke: http://docs.oracle.com/javase/tutorial/java/data/characters.html v tabuľke "Escape Sequences". Okrem týchto špeciálnych znakov je znak \ využitý aj pri zápise znakov pomocou ich kódov v UNICODE. Postupnosť znakov \uXXXX reprezentuje znak v UNICODE s kódom (číslom) XXXX, kde XXXX je zápis kódu (čísla znaku) v šestnástkovej sústave: http://sk.wikipedia.org/wiki/%C5%A0estn%C3%A1stkov%C3%A1_s%C3%BAstava

Ukážka použitie \uXXXX v reťazcových literáloch:

System.out.println("Priklad: \u0041\u0068\u006f\u006a");

Do triedy ZadanaKorytnacka pridajte metódu naRetazec, ktorá vráti referenciu na novovytvorený reťazec, ktorý vznikne nahradením všetkých znakov kódovaných pomocou \ príslušnými znakmi.

public String naRetazec(String retazec)

Príklad:

  • naRetazec("Priklad: \'\u0041\u0068\u006f\u006a\\") = "Priklad: 'Ahoj\"

Pozor: Ak chcete v Jave zapísať reťazec "Priklad: \u0041\u0068\u006f\u006a" musíte ho zapísať ako "Priklad: \\u0041\\u0068\\u006f\\u006a", keďže \ je špeciálny znak a musí sa v Java programoch zapisovať ako \\.

Na prevod číselného reťazca v šestnástkovej sústave nie je dovolené využiť metódu Long.parseLong(String s, int radix) ani inú metódu podobnú tejto metóde (môžete si však napísať vlastnú metódu, ktorá tento prevod zrealizuje).

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();        
        }
}