Syntax jazyka Java - riadiace príkazy
Základy informatiky - jazyk Java
Úvod do programovania v jazyku Java
- >Syntax jazyka Java
>Syntax jazyka Java - dátové typy, operátory
>Syntax jazyka Java - riadiace príkazy
>Syntax jazyka Java - základné triedy
>Java - polia
>Java - vstup a výstup údajov
Java - objektovo orientovaný prístup
Vzorové príklady:
Java - implementácia numerických algoritmov
Java - triedy geometrických tvarov
Pokročilé témy:
Obsah
Príkazy, bloky, cykly a vetvenie algoritmov
Program možno chápať ako "návod" podľa ktorého počítač zostaví postupnosť príkazov, ktoré sa budú vykonávať, aby sa zrealizovala nejaká úloha. Jeden príkaz vykoná jednu konkrétnu úlohu (môže to ale byť aj zložený príkaz, ktorý pozostáva z ďalších podpríkazov). Príkaz v Jave je potrebné ukončiť bodkočiarkou (;). Skupina príkazov logicky k sebe patriacich a vykonávaných naraz býva zoskupená do bloku. Ten je uzatvorený v zložených zátvorkách: {blok;}.
Aby nebolo nutné písať príkaz po príkaze za sebou (čo v prípade častých opakovaní operácií a zložitosti algoritmov ani nie je možné), existujú v programe príkazy pre riadenie vykonávania kódu programu.
Cyklus for, while
Cykly riadia opakovanie časti kódu, pri ktorom niektoré parametre sa menia, iné nie, ale robí sa "tá istá vec" Základným typom je výraz for, zložitejšie sú do..while a while
...
for(i=0;i<10;i++) {
System.out.println("Hodnota premennej i: "+i);
}
...
Posledný cyklus možno ekvivalentne zapísať pomocou cyklu while:
...
i=0;
while(i<10) {
System.out.println("Hodnota premennej i: "+i);
i++;
}
...
V obidvoch prípadoch vyššie uvedených príkladoch sa vypíše 10 čísel: 0...9
Príklad - Cyklus for
class MalaNasobilka1 {
public static void main(String[] args) {
int i, j;
for(i=1;i<10;i++) {
for(j=1;j<10;j++) {
System.out.println(i+" * "+j+" = "+(i*j));
}
System.out.println();
}
}
}
Daný príklad vypíše tabuľku malej násobilky. System.out.println(); je použitý na vynechanie riadku (vypíše nič a odriadkuje - po konci každej tabuľky pre jedno číslo).
Príklad - Cyklus do .. while
Príklad ilustruje cyklus s použitím while a podmienkou na konci.
class hladanie {
public static void main(String[] args) {
String s = "Veta na hladanie pismen.";
char hladany_znak = 'l', c;
int i = 0;
do {
c = s.charAt(i);
i++;
} while ((c != hladany_znak) && (i < s.length()));
if (c == hladany_znak){
System.out.println(hladany_znak + " je na mieste " + i);
} else {
System.out.println("Znak sa nenašiel");
}
}
}
Vetvenie if
Vetvenie umožňuje podmienkové vykonávanie časti kódu podla postupu ak (podmienka_1) pokračuj príkaz_1, ak (podmienka_2) pokračuj príkaz_2 atď. Základným typom vetvenia je výraz if-else , zložitejší je switch-case
...
if(i>=3) {
System.out.println("i = "+i+" je vacsie alebo rovne 3");
} else if(i>2) {
System.out.println("i = "+i+" je medzi 2 a 3");
} else {
System.out.println("i = "+i+" je mensie alebo rovne ako 2");
}
...
Príklad - Riešenie kvadratickej rovnice
Budeme potrebovať premenné a, b, c - koeficienty v rovnici ax2 + bx + c = 0. Ďalej si ešte môžeme deklarovať premenné D, x1, x2 (diskriminant, korene). Výpočet je priamočiary, jediné na čo si je potrebné dávať pozor je, či nie je diskriminant záporný. Najjednoduchšia verzia programu môže vyzerať takto:
class kvadr_rovn {
public static void main(String[] args) {
double a = 1, b = 2, c = 1, x1, x2, D;
D = b*b - 4*a*c;
if(D>=0) {
x1 = (-b + Math.sqrt(D))/(2*a);
x2 = (-b - Math.sqrt(D))/(2*a);
System.out.println("Koren x1 : "+x1);
System.out.println("Koren x2 : "+x2);
}
}
}
V prípade záporného diskriminantu sa nevypíše nič. Prečo sa nedá skompilovať tento príklad?
V prípade, že D<0 sa nepriradia hodnoty premenným x1, x2, ale pokúšame sa ich vypísať. Kompilátor takýto kód neskompiluje a sťažuje sa na túto skutočnosť (že by sa vypísali nedefinované čísla - to čo by na danom mieste v pamäti bolo, čo nedáva zmysel a bývalo často zdrojom chýb, preto je to neprípustné).
Ak chceme zahrnúť aj prípad komplexných koreňov, pomôžeme si takto (úplný if):
class kvadr_rovn {
public static void main(String[] args) {
double a = 1, b = 0, c = 1, x1, x2, D;
double re, im;
D = b*b - 4*a*c;
if(D>=0) {
x1 = (-b + Math.sqrt(D))/(2*a);
x2 = (-b - Math.sqrt(D))/(2*a);
System.out.println("Koren x1 : "+x1);
System.out.println("Koren x2 : "+x2);
} else {
re = -b/(2*a);
im = Math.sqrt(-D)/(2*a);
System.out.println("Koren x1 : ("+re+") + ("+im+") * i");
System.out.println("Koren x2 : ("+re+") - ("+im+") * i");
}
}
}
Vetvenie switch
Príklad - použitie vetvenia switch-case
V príklade ukážeme jednoduchý postup na konverziu reťazca s hexadecimálnymi číslami na numerickú hodnotu.
class prikl1 {
public static void main(String[] args) {
String hex = "b9eD";
int k, vysledok = 0;
for(int i = 0; i < hex.length(); i++) {
char znak = hex.charAt(i);
switch(znak) {
case('0'):
case('1'):
case('2'):
case('3'):
case('4'):
case('5'):
case('6'):
case('7'):
case('8'):
case('9'): k = znak - '0'; break;
case('a'):
case('b'):
case('c'):
case('d'):
case('e'):
case('f'): k = znak - 'a' + 10; break;
case('A'):
case('B'):
case('C'):
case('D'):
case('E'):
case('F'): k = znak - 'A' + 10; break;
default: k = 0;
}
vysledok = 16 * vysledok + k;
}
System.out.println("Cislo v retazci je " + vysledok);
}
}
Ako možno vidieť, reťazce (String) nie sú primitívnym dátovým typom, ale sú to relatívne komplikované objekty, preto sa môžeme opýtať na ich dĺžku pomocou hex.length() a na znak na i-tom mieste získame pomocou hex.charAt(i).
Tento príklad využíva vetvenie switch na konvertovanie hexadecimálneho čísla v reťazci na jeho číselnú hodnotu. Java automaticky chápe znak ako číslo - jeho poradie v UNICODE tabuľke. Skupiny znakov '0'..'9','a'..'f' a 'A'..'F' sú v tabuľke za sebou, s pomocou ich poradových čísel im potrebujeme priradiť hodnoty 0..15. V príkaze switch je využité "prepadávanie", takto sa dosahuje, že sa vykoná rovnaká akcia pre viaceré hodnoty c. Pre každú zo skupín vždy odčítame prvý znak od daného znaku (tým v každej skupine máme lokálne číslovanie od 0), a pripočítame požadovanú hodnotu prvého znaku. Príkaz n = 16 * n + k; postupne vytvorí číslo v šestnástkovej sústave. Chybné znaky sú považované za 0.