Cvičenia: 4. týždeň

Cieľom cvičení štvrtého týždňa je:

  • práca s reťazcami (String, StringBuilder),
  • spracovanie "myšacích" udalostí vo WinPane (a tried rozšírujúcich WinPane) a
  • inštančné premenné.

Znakové reťazce

Na internete vyhľadajte zoznam metód objektov tried String a StringBuilder. Aké zaujímavé metódy ste našli?

Vytvorte triedu Znakarka rozširujúcu triedu Turtle s nasledujúcimi metódami:

  • sameZnaky vráti referenciu na novovytvorený reťazec, ktorý sa skladá len zo znakov znak o dĺžky dlzka (vyskúšajte variant so StringBuilder-om aj bez neho, variant bez použitia objektu triedy StringBuilder aj debugujte).
  • suSameZnaky vráti true, práve vtedy, keď zadaný reťazec obsahuje všetky znaky úplne rovnaké
  • zduplikujZnaky vráti referenciu na novovytvorený reťazec, ktorý vznikne zduplikovaním znakov v reťazci referencovanom parametrom s ("Ahoj" -> "AAhhoojj")
  • odstranZbytocneMedzery vráti referenciu na novovytvorený reťazec, ktorý vznikne odstránením zbytočných medzier v reťazci referencovanom parametrom s (zbytočné sú medzery na začiatku a konci reťazca, každú postupnosť 2 a viacerých medzier môžeme nahradiť jednou medzerou).
  • pocetSlov vráti počet slov v reťazci referencovanom parametrom s. Využite fintu, že každý koniec slova môžeme rozoznať tak, že je to vlastne medzera, pre ktorou je nemedzera. Inými slovami stačí nám spočítať počet medzier, pred ktorými je nemedzera. Týmto spôsobom ale nezarátame posledné slovo, ak za ním už nie je žiadna medzera. Toto vyriešime tak, že budeme počítať počet slov v reťazci, ktorý vznikne pridaním medzery na koniec pôvodného reťazca (s = s + " ";).
public String sameZnaky(char znak, int dlzka)
public boolean suSameZnaky(String s)
public String zduplikujZnaky(String s)
public String odstranZbytocneMedzery(String s)
public int pocetSlov(String s)

Generátor hesiel

Naučte objekty triedy Znakarka metódu na automatické generovanie hesiel zadanej dĺžky. Metóda okrem dĺžky dostane ako parameter 2 reťazce (2 referencie na objekty triedy String). Heslo je generované tak, že každé párne písmeno hesla je náhodné písmeno z prvého reťazca a každé nepárne písmeno je náhodné písmeno z druhého reťazca. Ak máme ako vstup reťazce "aioo" a "kjmjx", tak vygenerované heslo dĺžky 7 môže byť "kajajok".

public String generujHeslo(int dlzka, String s1, String s2)

Vypĺňanie mriežky

  • Vytvorte triedu MriezkovaPlocha rozširujúcu triedu WinPane. Naučte objekty triedy MriezkovaPlocha metódu mriezka, ktorá vyplní kresliacu plochu mriežkou, pričom každý zo štvorčekov mriežky má rozmer 50 x 50. Na testovanie môžete využiť ObjectInspector skúmajúci objekty tejto triedy.
public void mriezka()
V "spúšťači" pridajte volanie metódy mriezka hneď po vytvorení objektu triedy MriezkovaPlocha.
  • Do triedy MriezkovaPlocha pridajte metódu bodkaDoPolicka, ktorá nakreslí farebnú bodku s polomerom 20 v strede políčka so zadanými súradnicami. Súradnice nech sú podobné, ako pri kresliacej ploche, t.j. políčko v ľavom hornom rohu má súradnice (0, 0), políčko napravo od neho (1, 0), atď.
public void bodkaDoPolicka(int stlpec, int riadok, Color farba)
  • Do triedy MriezkovaPlocha pridajte metódu onMouseClicked na obsluhu kliknutia do kresliacej plochy. Pri kliknutí do kresliacej plochy, nech sa v políčku, do ktorého sa kliklo, namaľuje červená bodka s využitím metódy bodkaDoPolicka.
protected void onMouseClicked(int x, int y, MouseEvent detail)
  • Upravte metódu onMouseClicked tak, aby sa striedavo kreslili červené a modré bodky. (Návod: využite, že v inštančnej premennej si môžete zapamätať aká bodka sa kreslila ako posledná, resp. koľko bodiek sa doposiaľ nakreslilo).

A opäť reťazce

  • Vytvorte metódu, ktorá overí, či reťazec (objekt triedy String referencovaný z parametra s) obsahuje súvislú podpostupnosť aspoň limit za sebou idúcich znakov '.' (bodka). Napríklad reťazec "aaa....abda.asa..as.asnasa.....asasas" obsahuje súvislú podpostupnosť bodiek dĺžky 3, ale nie dĺžky 8.
public boolean dostBodiek(String s, int limit)

Korytnačky s pamäťou

  • Vytvorte triedu TachoKorytnacka rozširujúcu triedu Turtle. Korytnačky tejto triedy naučte metódu meranyKrok, ktorá spraví presne to isté, čo metóda step avšak s tým rozdielom, že korytnačka si bude pamätať celkovú dĺžku, ktorú prešla pomocou metódy meranyKrok.
  • Pre korytnačky triedy TachoKorytnacka pridajte metódu getPrejdenaDraha, ktorá vráti celkovú dĺžku, ktorú korytnačka prešla.
public void meranyKrok(double dlzka)
public double getPrejdenaDraha()

Pomôcka pre Java programátorov

Určite viete, že pre názvy premenných a metód v Jave platia isté pravidlá "slušnosti" (konvencie). V Jave sa používa tzv. lower-camel-case konvencia. V tejto konvencii platí, že názov je jedno slovo, v prípade viacslovného názvu jednotlivé slová zlepíme. Všetky písmena v názve sú písané malými písmenami s výnimkou tých písmen, ktoré zodpovedajú prvým písmenám slov vo viacslovných názvoch s výnimkou prvého slova. Príklady: nazovPremennej, premenna, sucetNaParnychPoziciach, platnostPodmienky, rozdielDvochCisel. Začiatočníci s týmto spôsobom pomenovávania premenných majú často ťažkosti. Našim cieľom je preto vytvoriť metódu, ktorá ako parameter dostane referenciu na jedno alebo viacslovný názov, v ktorom sú jednotlivé slová oddelené medzerami (aj viacerými). Metóda vráti správne naformátovaný názov premennej v lower-camel-case konvencii.

public String camelFormatovac(String nazov)

Príklady:

  • camelFormatovac(" PomoOne Pole korytnaciek "): "pomocnePoleKorytnaciek""
  • camelFormatovac("Nazov Premennej"): "nazovPremennej"
  • camelFormatovac(" ROZDIEL DVOCH CISEL "): "rozdielDvochCisel"

Užitočné metódy:

char znak = 'a';
char velkeA = Character.toUpperCase(znak);
char maleX = Character.toLowerCase('X');

Užitočné metódy objektov triedy String:

  • substring - vráti referenciu na nový reťazec, ktorý obsahuje podreťazec reťazca na zadaných indexoch
  • toLowerCase - vráti referenciu na nový reťazec, ktorý obsahuje reťazec zapísaný malými písmenami
  • toUpperCase - vráti referenciu na nový reťazec, ktorý obsahuje reťazec zapísaný veľkými písmenami

Pre fajnšmekrov

  • Do objektov triedy Znakarka, ktorá rozširuje triedu Turtle, pridajte metódu spravneZatvorky vráti či reťazec obsahujúci len znaky '{' a '}' predstavuje správne ozátvorkovaný výraz. Postupnosť "{{}}{}" je správne ozátvorkovaný, kým "{{{}" a "{}}{}{" nie.
public boolean spravneZatvorky(String s)
  • Pomocou operácie Double.parseDouble() dokážeme zistiť, aké reálne číslo je zapísané v reťazci:
double cislo = Double.parseDouble("3.14");
S využitím tejto operácie vytvorte metódu hybSaPodla, ktorá ako parameter dostane referenciu na reťazec obsahujúci príkazy, podľa ktorých sa má korytnačka hýbať. Reťazec je postupnosť dvojíc reálnych čísel oddelených medzerami. Vždy prvé číslo hovorí, aký dlhý krok má korytnačka spraviť, a druhé číslo, o koľko sa má korytnačka otočiť. Napríklad reťazec "100.5 120 30.8 90" zodpovedá príkazom step(100.5), turn(120), step(30.8), turn(90).