pr1j_06_textove_udajove_typy_a_riadiace_struktury.ppt
Stiahnuť PPT · 225 kBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
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)
– 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ť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 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é 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
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í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 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í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 „\“.
Document Outline
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky