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

Preview:

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

Citation preview

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

textové údajové typy trieda String trieda StringBuffer viacnásobné vetvenie – case prerušenie behu riadiacej š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

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';

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

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

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.

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

System.out.println

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

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.

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.

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 „+“:

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

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.

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

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

char znak = Palindrom.charAt(8);

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

Ď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;

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

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

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.

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

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

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“

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

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.

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

}

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

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

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

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

Breakmá dve podoby:

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

– s návestím

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.

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.

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

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.

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.

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

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

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

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

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 „\“.

Recommended