Cvičenie 4 – Znaky, reťazce, myšacie udalosti
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úcichWinPane) a - inštančné premenné.
Korytnačka vo svete znakových reťazcov
- Na čo slúžia objekty triedy
String? Akou metódou nám objekt triedyStringvie povedať dĺžku reťazca, ktorý uchováva? Akým spôsobom sa vieme objektov triedyString„pýtať“ na jednotlivé znaky reťazca? - Čo je to referencia? Čo znamená, že parametrom metódy je referencia na objekt nejakej triedy (napr.
String)? - Vytvorte triedu
StringTurtlerozširujúcu trieduTurtles nasledujúcimi metódami:countCharvráti počet výskytov znakucv reťazci referencovanom parametromsisPalindromevráti, či reťazec referencovaný parametromsje palindróm, t.j. číta sa rovnako zľava doprava ako aj sprava doľava: abcba, accaacca sú palindrómycontainsDoubleSpacevráti, či reťazec referencovaný parametromsobsahuje 2 za sebou idúce medzery
- Porovnajte nasledujúce fragmenty kódu a diskutujte aký výpis bude realizovaný a prečo.
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 StringTurtle rozširujúcu triedu Turtle s nasledujúcimi metódami:
unicharStringvráti referenciu na novovytvorený reťazec, ktorý sa skladá len zo znakovco dĺžken(vyskúšajte variant soStringBuilder-om aj bez neho, variant bez použitia objektu triedyStringBuilderaj debugujte).isUnicharStringvrátitrue, práve vtedy, keď zadaný reťazec obsahuje všetky znaky úplne rovnakéduplicateCharsvráti referenciu na novovytvorený reťazec, ktorý vznikne zduplikovaním znakov v reťazci referencovanom parametroms(„Ahoj“ -> „AAhhoojj“)removeExtraSpacesvráti referenciu na novovytvorený reťazec, ktorý vznikne odstránením zbytočných medzier v reťazci referencovanom parametroms(zbytočné sú medzery na začiatku a konci reťazca, každú postupnosť 2 a viacerých medzier môžeme nahradiť jednou medzerou).countWordsvráti počet slov v reťazci referencovanom parametroms. Využite fintu, že každý koniec slova môžeme rozoznať tak, že je to vlastne medzera, pred 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 + " ";).
Generátor hesiel
Naučte objekty triedy StringTurtle 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".
Vypĺňanie mriežky
- Vytvorte triedu
GridPanerozširujúcu trieduWinPane. Naučte objekty triedyGridPanemetódudrawGrid, ktorá vyplní kresliacu plochu mriežkou, pričom každý zo štvorčekov mriežky má rozmer50 x 50. Na testovanie môžete využiť ObjectInspector skúmajúci objekty tejto triedy.
1 public void drawGrid()
V „spúšťači“ pridajte volanie metódy drawGrid hneď po vytvorení objektu triedy GridPane.
- Do triedy
GridPanepridajte metódudrawDot, 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ď.
1
- Do triedy
GridPanepridajte metóduonMouseClickedna 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ódydrawDot.
1
- Upravte metódu
onMouseClickedtak, 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
Stringreferencovaný z parametras) obsahuje súvislú podpostupnosť aspoňlimitza 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.
1
Korytnačky s pamäťou
- Vytvorte triedu
OdoTurtlerozširujúcu trieduTurtle. Korytnačky tejto triedy naučte metódumeasuredStep, ktorá spraví presne to isté, čo metódastepavšak s tým rozdielom, že korytnačka si bude pamätať celkovú dĺžku, ktorú prešla pomocou metódymeasuredStep. - Pre korytnačky triedy
OdoTurtlepridajte metódugetTrajectoryLength, ktorá vráti celkovú dĺžku, ktorú korytnačka prešla.
1
2 public void measuredStep(double length)
public double getTrajectoryLength()
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.
Príklady:
camelFormat(" Pomocne Pole korytnaciek "): "pomocnePoleKorytnaciek"camelFormat("Nazov Premennej"): "nazovPremennej"camelFormat(" ROZDIEL DVOCH CISEL "): "rozdielDvochCisel"
Užitočné metódy:
Character.toLowerCase– vráti malé písmeno k zadanému znakuCharacter.toUpperCase– vráti veľké písmeno k zadanému znaku
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 indexochtoLowerCase– vráti referenciu na nový reťazec, ktorý obsahuje reťazec zapísaný malými písmenamitoUpperCase– vráti referenciu na nový reťazec, ktorý obsahuje reťazec zapísaný veľkými písmenami
Pre fajnšmekrov
- Do objektov triedy
StringTurtle, ktorá rozširuje trieduTurtle, pridajte metóduvalidateParenthesisvrá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.
1
- Pomocou operácie
Double.parseDouble()dokážeme zistiť, aké reálne číslo je zapísané v reťazci:
1
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).
- Pozrite si poslednú úlohu z bloku „Znakové reťazce“, kde sa porovnávali dva fragmenty kódu. Porovnajte ich s nasledujúcim fragmentom a rozhodnite aký výpis sa vykoná. Svoje rozhodnutie zdôvodnite a následne vyskúšajte aký výpis naozaj prebehne.
- Vyhľadajte, čo je java string pool a načo slúži.
