390 likes | 606 Views
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';
E N D
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'; 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)– jeveľ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 objektya 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ťazce • trieda 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ťazcov • retazec1.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íklad • Pre 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);
String • Trieda 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ťazci • získanie znaku na zadanej pozícii už poznáme: String Palindrom = "Kobyla má malý bok."; char znak = Palindrom.charAt(8);
Substring • má 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 StringBuffer • v triede Stringnie 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, intend) • 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é vetvenie • vetvenie 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 • 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 (premenná) { case 1: prikaz1; prikaz2; break; case 2: prikaz1; prikaz2; break;... default: prikaz1; prikaz2; break;... }
Switch - príklad int 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 switch • switch 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 switchblokom • bez príkazovbreakby vykonávanie programu pokračovalo postupne cez jednotlivé podsekvencie príkazov case
Break - vynechať 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); 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;
Diskusia k príkladu • posledný 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
Break • má dve podoby: • bez návestia (v prípade switch, na ukončenie cyklu) • s návestím
Break a for char 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ím • Prí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 continue • Prí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 continue • postupuje 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); //message1 if( 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 „\“.