textové údajové typy a riadiace štruktúry

39
Textové údajové typy a riadiace štruktúry textové údajové typy trieda String trieda StringBuffer viacnásobné vetvenie – case prerušenie behu riadiacej štruktúry

Upload: fineen

Post on 21-Jan-2016

67 views

Category:

Documents


0 download

DESCRIPTION

Textové údajové typy a riadiace štruktúry. textové údajové typy trieda String trieda StringBuffer viacnásobné vetvenie – case prerušenie behu riadiacej štruktúry. Znaky. ak chceme pri programovaní použiť znak, použijeme jednoduchý údajový typ char: char znak = 'a'; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Textové údajové typy a riadiace štruktúry

Textové údajové typy a riadiace štruktúry

textové údajové typy trieda String trieda StringBuffer viacnásobné vetvenie – case prerušenie behu riadiacej štruktúry

Page 2: Textové údajové typy a riadiace štruktúry

Znakyak chceme pri programovaní použiť znak,

použijeme jednoduchý údajový typ char:

char znak = 'a';

char uniZnak = '\u039A';

// veľké grécke písmeno omega

// v kódovaní Unicode

Page 3: Textové údajové typy a riadiace štruktúry

Znak ako objekt existujú však i prípady, keď sa potrebujeme k znaku

správať inak – napr. argument funkcie, ktorú chceme použiť vyžaduje

nie char, ale objekt a má aj niekoľko zaujímavých metód– objekt vytvárame prostredníctvom konštruktora

Character ch = new Character('a');

– alebo necháme konverziu na kompilátor:

Character ch = 'a';

Page 4: Textové údajové typy a riadiace štruktúry

Užitočné metódy pre char isLetter(char ch)– je písmeno isDigit(char ch) – je číslica isWhiteSpace(char ch) – je medzera isUpperCase(char ch) – je veľké písmeno isLowerCase(char ch) – je malé písmeno toUpperCase(char ch) – zmeň na veľké písmeno toLowerCase(char ch) – zmeň na malé písmeno toString(char ch) – zmeň na objekt String

Page 5: Textové údajové typy a riadiace štruktúry

Príklad Character Napíšte program, ktorý zadaný reťazec vypíše tak, že v reťazci zmení malé písmená

na veľké, veľké na malé a namiesto číslice vloží bodku.

char ch; String ret; ret = JOptionPane.showInputDialog("text:");for(int i=0;i<ret.length();i++) { ch = ret.charAt(i); if (Character.isLowerCase(ch)) { ch = Character.toUpperCase(ch); } else { if (Character.isUpperCase(ch)) { ch = Character.toLowerCase(ch); } else { if (Character.isDigit(ch)) ch = '.'; }} System.out.print(ch); }

Page 6: Textové údajové typy a riadiace štruktúry

Escape sekvencie \t – vloží do textu tabulátor. \b – vloží do textu backspace. \n – vloží do textu nový riadok. \r – vloží do textu znak pre návrat vozíka. \f – vloží do textu vertikálny tabulátor. \' – vloží do textu apostrof. \" – vloží do textu úvodzovky. \\ – vloží do textu spätné lomítko.

Page 7: Textové údajové typy a riadiace štruktúry

Príklad escape sekvencie Vypíšte text: Povedala mi: “Vypadni!“.

System.out.println

("Povedala mi: \"Vypadni!\".");

Page 8: Textové údajové typy a riadiace štruktúry

Textové reťazce sú pri programovaní často používané sú sekvenciami znakov v programovacom jazyku Java sú reťazce objekty a reprezentuje ich

trieda String

najrýchlejší spôsob na vytvorenie reťazca už poznáme:

String pozdrav = "Ahoj svet!";

"Ahoj svet!" je textový literál — zoskupenie znakov uzatvorené do úvodzoviek

vždy, keď do kódu napíšeme takýto textový literál, kompilátor vytvorí objekt typu String s príslušnou hodnotou.

Page 9: Textové údajové typy a riadiace štruktúry

Textové reťazcetrieda String je nemenná, akonáhle je vytvorený objekt triedy String,

nemôže byť zmenenýtrieda String má niekoľko metód, ktoré môžu

reťazec meniť, ale vzhľadom na to, že reťazce sú nemenné, tieto metódy v skutočnosti vytvoria nový reťazec s výsledkom zadanej operácie a vrátia ho namiesto pôvodného.

Page 10: Textové údajové typy a riadiace štruktúry

Spájanie reťazcovretazec1.concat(retazec2);

– táto metóda vráti nový reťazec, ktorý vznikne tak, že na koniec prvého reťazca je pripojený druhý reťazec.

Metódu concat() tiež môžeme použiť s textovým literálom, takto:

"Moje meno je ".concat("HruškoMrkvová");

namiesto concat()sa používa aj „+“:

Page 11: Textové údajové typy a riadiace štruktúry

Spájanie reťazcov – príkladPre zadané meno a priezvisko vložte do premennej spolu celé meno a vypíšte ho.

String meno, priezvisko, spolu="pa";

meno = JOptionPane.showInputDialog("meno");

priezvisko = JOptionPane.showInputDialog("pr.");

spolu = meno +" "+ priezvisko;

System.out.print(spolu);

Page 12: Textové údajové typy a riadiace štruktúry

StringTrieda String má množstvo metód na:

– skúmanie obsahu reťazcov, – hľadanie znakov alebo častí reťazcov v iných reťazcoch, – zmenu veľkosti písmen a pod.

Page 13: Textové údajové typy a riadiace štruktúry

Znaky v reťazcizískanie znaku na zadanej pozícii už poznáme:

String Palindrom = "Kobyla má malý bok.";

char znak = Palindrom.charAt(8);

Page 14: Textové údajové typy a riadiace štruktúry

Substringmá dve verzie:

String substring(int beginIndex, int endIndex) – vracia reťazec, ktorý je časťou pôvodného reťazca. Prvý

argument určuje index prvého znaku, druhý je index posledného znaku + 1.

String substring(int beginIndex)

– vracia reťazec, ktorý je časťou pôvodného reťazca. Argument určuje index prvého znaku. Koncový znak je totožný s koncovým znakom pôvodného reťazca.

String iPalindrom = "Kobyla má malý bok.";

String cast = iPalindrom.substring(10, 14);

Page 15: Textové údajové typy a riadiace štruktúry

Ďalšie metódy trim() – vracia kópiu reťazca, z ktorého odstráni medzeru z konca a

začiatka.

toLowerCase() – vracia kópiu reťazca konvertovaného na malé písmená. Ak konverzia nie je potrebná, metóda vráti pôvodný reťazec.

toUpperCase() – vracia kópiu reťazca konvertovaného na veľké písmená. Ak konverzia nie je potrebná, metóda vráti pôvodný reťazec.

Napr.

spolu = meno.toLowerCase() +" "+ priezvisko;

Page 16: Textové údajové typy a riadiace štruktúry

Vyhľadávanie reťazcov indexOf(String str) lastIndexOf(String str) – vracia index prvého (posledného) výskytu zadanej časti reťazca

indexOf(String str, int fromIndex) lastIndexOf(String str, int fromIndex) – vracia index prvého (posledného) výskytu zadanej časti reťazca,

za (pred) zadanou pozíciou (fromIndex).

Napr.: String text="mama ma Emu";

int prva = text.indexOf("ma"); int posledna = text.lastIndexOf("ma"); System.out.print(prva + "." + posledna);

Page 17: Textové údajové typy a riadiace štruktúry

Porovnávanie reťazcov compareTo(String anotherString) compareToIgnoreCase(String anotherString)

– porovná dva reťazce lexikograficky. – vracia celočíselnú hodnotu indikujúcu či je reťazec:

väčší (výsledok je > 0), zhodný (výsledok je = 0), menší (výsledok < 0) ako anotherstring.

napr. výsledkom príkladu je záporná hodnota:

String meno1="mama", meno2="tata" ;

int i = meno1.compareTo(meno2);

System.out.print(i);

Page 18: Textové údajové typy a riadiace štruktúry

Trieda StringBuilder, StringBuffer operáciu „sčítavania“ stringov sme použili, avšak jej

použitie bolo nehospodárne trieda StringBuffer zodpovedá triede String s tým, že

obsah jej objektov môže byť menený

Na rozdiel od reťazcov má každá inštancia triedy StringBuffer aj kapacitu, predstavujúcu počet alokovateľných miest pre znaky.

Kapacita, ktorú vráti metóda capacity(), je vždy väčšia alebo rovná dĺžke (zvyčajne je väčšia), a ak je to potrebné, automaticky sa rozširuje, aby v objekte bolo možné nahromadiť spojenia.

Page 19: Textové údajové typy a riadiace štruktúry

Príklad// vytvorí prázdny buffer s kapacitou 16 prvkov

StringBuffer sb = new StringBuffer();

// pridá 9 znakov reťazca na začiatok

sb.append("Zdravíčko");

System.out.println(sb);

System.out.println(sb.capacity());

Page 20: Textové údajové typy a riadiace štruktúry

Operácie triedy StringBufferv triede String nie sú dostupnésú preťažené, takže akceptujú dáta rôznych typov

– každá metóda konvertuje svoj argument na reťazec, a potom pripojí alebo vloží znaky toho reťazca do sekvencie znakov StringBuffera– append() – pridá znaky na koniec jestvujúcej

sekvencie znakov– insert() – vkladacia metóda pridá znaky na určené

miesto

Page 21: Textové údajové typy a riadiace štruktúry

Operácie triedy StringBuffer insert(int offset, String s)

– vloží druhý argument do stavbára reťazcov. Prvý celočíselný argument určuje pozíciu, pred ktorú majú byť dáta vložené. Dáta sa pred vložením skonvertujú na reťazec.

delete(int start, int end)– maže z reťazca znak od pozície start po end-1

Napr.StringBuffer sb = new StringBuffer();sb.append("Zdravíčko"); sb.delete(5,9);sb.insert(0,"Na ");

System.out.print(sb); // vráti „Na Zdrav“

Page 22: Textové údajové typy a riadiace štruktúry

Viacnásobné vetvenievetvenie zabezpečuje štruktúra if

– k dispozícii má jednu (if) až dve vetvy (else)

existuje štruktúra, ktorá umožňuje viacnásobné vetvenie– načo? – napr. matematické operácie sú až 4 a

rozpisovanie do 4 podmienok zneprehľadňuje kód

Page 23: Textové údajové typy a riadiace štruktúry

Viacnásobné vetvenie - štruktúra

switch (premenná) {

case 1:

prikaz1;

prikaz2;

break;

case 2:

prikaz1;

prikaz2;

break;...

default:

prikaz1;

prikaz2;

break;...

}

Každý príkaz obsiahnutý v switch bloku môže byť označený jedným alebo viacerými návestiami case (prípad) alebo návestím default (predvolený prípad). Príkaz switch vyhodnotí výraz a vykoná príkazy s prislúchajúcim návestím case.

Page 24: Textové údajové typy a riadiace štruktúry

Switch - príkladint body = 90;switch(body){case 100:

System.out.println( "Excellent!" );break;

case 90:System.out.println("Good job!" );break;

case 80:System.out.println("Study harder!" );break;

default:System.out.println("Sorry, looser.");

}

Page 25: Textové údajové typy a riadiace štruktúry

Ako pracuje switchswitch kontroluje hodnotu premennej a

porovnáva ju s hodnotami uvedenými za case dôležitý je tiež príkaz break, ktorý sa nachádza

za každým návestím case a zabezpečí, aby vykonávanie príkazov pokračovalo až prvým príkazom za switch blokom

bez príkazov break by vykonávanie programu pokračovalo postupne cez jednotlivé podsekvencie príkazov case

Page 26: Textové údajové typy a riadiace štruktúry

Break - vynechaťint mesiac = 2; int pocetDni = 0;

switch (mesiac) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:

pocetDni = 31;

break;

case 4: case 6: case 9: case 11: pocetDni = 30; break; case 2: pocetDni = 28; break; default:

System.out.println("Zlý mesiac.");

break; }

System.out.println("Počet dní = " + pocetDni);

Page 27: Textové údajové typy a riadiace štruktúry

Diskusia k príkladuposledný príkaz break nie je potrebný,

pretože program aj tak dôjde na koniec príkazu switch

napriek tomu, odporúčame príkaz break použiť, vyhnete sa tak chybe, ktorá môže vzniknúť následnou úpravou kódu

návestie default zahrňuje všetky hodnoty, ktoré nie sú explicitne zahrnuté v návestiach case

Page 28: Textové údajové typy a riadiace štruktúry

Diskusia ku switchu či použiť príkaz if-then-else alebo príkaz switch je

na uvážení programátora. môže sa rozhodnúť na základe lepšej čitateľnosti

kódu a iných faktorov– pre príkaz if-then-else sa môže rozhodnúť, ak ide o

rozsah hodnôt alebo viacero podmienok– pre príkaz switch sa môže rozhodnúť, iba ak ide o celé

čísla alebo vymenované hodnoty

Page 29: Textové údajové typy a riadiace štruktúry

Breakmá dve podoby:

– bez návestia (v prípade switch, na ukončenie cyklu)

– s návestím

Page 30: Textové údajové typy a riadiace štruktúry

Break a forchar hladane = 'a';String txt="Mama ma Emu";boolean najdene = false;int i;

for (i = 0; i < txt.length(); i++) { if (txt.charAt(i) == hladane) { najdene = true; break; }}if (najdene) {System.out.println(“Je na pozícii "+i); } else {System.out.println("nenachádza sa");}

Príkaz break preruší opakovanie for v prípade, keď je hodnota nájdená. Spracovávanie programu sa presunie za cyklus na príkaz výpisu na konci programu.

Page 31: Textové údajové typy a riadiace štruktúry

Break s návestímPríkaz break bez návestia preruší

vykonávanie vo vnútri príkazov switch, for, while, or do-while, ale príkaz break s návestím preruší i vonkajšie príkazy.

Page 32: Textové údajové typy a riadiace štruktúry

Príklad – zatiaľ celkom nechápeme ...search: for (i = 0; i < poleCisel.length; i++) { for (j = 0; j < poleCisel[i].length; j++) { if (poleCisel[i][j] == hladane) { najdene = true; break search;

}

} }if (najdene) {System.out.println(“Je na pozícii "+i); } else {System.out.println("nenachádza sa");}

príkaz break preruší označený príkaz. Nepresúva riadenie programu k označeniu, ale na najbližší príkaz, ktorý nasleduje za označeným (prerušeným) príkazom.

návestie musí byť pred cyklom, medzi návestím a cyklom nesmie byť žiaden príkaz

Page 33: Textové údajové typy a riadiace štruktúry

Príkaz continuePríkaz continue (pokračuj) preskočí

aktuálny prechod opakovania v príkazoch for, while , or do-while.

Forma bez návestia preskočí na koniec tela najvnútornejšieho opakovania a vyhodnotí výraz zabezpečujúci pokračovanie alebo ukončenie cyklu.

Page 34: Textové údajové typy a riadiace štruktúry

Príkaz continuepostupuje cez String, spočítava písmená "p„

– ak aktuálny znak nie je "p", príkaz continue preskočí zvyšok príkazov v cykle a zameria sa na dalšie písmeno

– ak je to ale "p", program zvýši hodnotu vyjadrujúcu počet ich výskytov.

Page 35: Textové údajové typy a riadiace štruktúry

Príkaz continue String prehladat = "pukance popukali na panvici";

int max = prehladat.length();

int pocetPcok = 0;

for (int i = 0; i < max; i++) {

// zaujímam sa iba o p-čka

if (prehladat.charAt(i) != 'p')

continue; // skocim na koniec/zaciatok

// ak som neodskocil zvýšim počet p-čok

pocetPcok++;

}

System.out.println("Našiel som " + pocetPcok+" p-čok.");

Page 36: Textové údajové typy a riadiace štruktúry

Príkaz continue s návestím outerLoop:

for( int i=0; i<5; i++ ){ for( int j=0; j<5; j++ ){

System.out.println(j); //message1if( j == 2 ) continue outerLoop;

} System.out.println(i); //message2

}

– keď j nadobudne hodnotu 2 ukončí cyklus a skočí na cyklus bežiaci pod definovaným návestím – t.j. na i, kde v ňom pokračuje

Page 37: Textové údajové typy a riadiace štruktúry

Príkaz return Príkaz return odíde z aktuálnej metódy a spracovanie

programu sa vráti tam, odkiaľ bola metóda vyvolaná. má dve formy: – jednu, ktorá vracia hodnotu – jednu, ktorá ju nevracia.

aby bola vrátená hodnota, stačí napísať hodnotu (výraz) za kľúčové slovo return (return ++pocet;)– dátový typ vrátenej hodnoty musí súhlasiť s typom, ktorý

je pre danú metódu deklarovaný. Ak je metóda deklarovaná ako void, použite formu

return bez návratovej hodnoty (return;)

Page 38: Textové údajové typy a riadiace štruktúry

Príkaz return v prípade pokusu delenia nulou aplikácia bez výstrahy

končí

int a=10, b=0;

if (b == 0)

return;

else

System.out.print(a/b);

Page 39: Textové údajové typy a riadiace štruktúry

Príklady Napíšte program, ktorý v reťazci zmení malé písmená na veľké, veľké na malé a

namiesto číslice vloží bodku. Zistite či zadané priezvisko je mužské alebo ženské. Predpokladajte, že všetky

ženské priezviská končia na „ová“. Napíšte program, ktorý ore zadanú číselnú hodnotu slovne vypíše mesiac, ktorý

jej zodpovedá. Riešte matematický výraz zadaný prostredníctvom dvoch čísel a operácií medzi

nimi. Využite štruktúru switch, informácie zadávajte postupne (t.j. najprv prvé číslo, potom operácia a následne druhé číslo.

Riešte predchádzajúcu úlohu tak, že na vstupe zadáte celý reťazec naraz (napr. 43+8).

„Rozoberte“ zadané číslo na cifry a poskladajte z nich čo najväčšie číslo. Zistite, ktorá cifra sa v zadanom čísle vyskytuje najčastejšie a ktorá najmenej ráz

(ale viac ako 0). Zistite, ktoré cifry sa v zadanom čísle nevyskytujú vôbec. Pre zadanú cestu na pevnom disku vypíšte pod seba zoznam adresárov, ktoré sa

v nej nachádzajú. Predpokladajte, že adresáre sú oddelené znakom „\“.