4.4.2012
Obsah přednášky
Základy programování (IZAPR, IZKPR) Přednáška 5
Přík azy cy k lu - dok ončení
Úv od do tříd a objek tů Pole jednorozměrná Pole v ícerozměrná
Druhy chy b v programech
Ing. Michael Bažant, Ph.D. Katedra softwarových technologií
Kancelář č. 03 022, Náměstí Čs. legií
[email protected]
KST, FEI – IZAPR, IZKPR přednáška 5
Příkaz for – neúplný
2
19. března 2012
Příkaz for – příklady
Neúplný příkaz for lze ze syntaktického hlediska použív at Neúplné cy k ly for nepodporují dobrou čitelnost a pochopení zdrojového k ódu V tak ov ý ch případech je v tak ov ých případech v yužít jiný typ cyklu for (int i = 0; i < 10) {
for (int i = 0, j = 0; ( i < 10 ) && (j < 1 0); i+ +, j+ +) { Syst em.ou t.prin tln(" i = " + i + " j = " + j );
} for ( ; ; ) { // je to m ozne, ale n epouzi vat Syst em.ou t.prin tln(" nekone cny c yklus" ); }
int i = 0; int i = 3;
Syst em.ou t.prin tln(i ); i++;
while (i < 10 ) { Syst em.ou t.prin tln(i );
}
i++;
for ( ; i < 1 0 ; ) { // podobn e jak o cykl us whi le Syst em.ou t.prin tln(" i = " + i++ ); }
} KST, FEI – IZAPR, IZKPR přednáška 5
3
19. března 2012
Příkaz for – příklady
KST, FEI – IZAPR, IZKPR přednáška 5
4
19. března 2012
Cyklus for each (enhanced for loop)
Inkr ementace nemusí být vždy o hodnotu jedna
O d Java 1.5 U snadňuje průchod kolekcemi, poli apod.
P ouze dvě části v deklaraci cyklu, nikoliv tři
for (int i = 0; i < 21; i += 5 ) { Syst em.ou t.prin tln(" i = " + i); }
for (dek larac e : vy raz) { }
D eklarace
KST, FEI – IZAPR, IZKPR přednáška 5
5
19. března 2012
Nová proměnná kompatibilního typu s prvky pole platná v bloku
V ýraz Musí představovat pole nebo kolekci pro procházení
P říklad – při probírání polí
KST, FEI – IZAPR, IZKPR přednáška 5
6
19. března 2012
1
4.4.2012
Vnořování cyklů
Lze používat cykly v cyklech a jedná se o poměrně běžnou záležitost
Příklad: Vy tisk něte tabulk u malé násobilk y for (int i = 1; i < 16; i++) {
Příkazy break, continue
for (int j = 1; j < 16; j+ +) { Syste m.out. forma t("%6d ", i * j); }
Syst em.ou t.prin tln(" "); }
Použití: např. práce s maticemi
KST, FEI – IZAPR, IZKPR přednáška 5
7
Příkazy break, continue
KST, FEI – IZAPR, IZKPR přednáška 5
19. března 2012
Příkazy break, continue
P ř íkaz break umožňuje ukončit cyklus v libovolném místě těla cyklu
8
19. března 2012
Pokračuje se dalším příkazem po ukončeném cyklu V případě vnořených cyklů ukončí jen nejbližší cyklus Standardně nepoužívat tímto způsobem (špatně napsaná podm.)
Příkaz continue ukončí aktuální iteraci cyklu P okračuje se iterací další – v y nucení nového v y hodnocení podmínky
for (int i = 0; i < 9; i ++) { if ( i == 5) {
for (int i = 1; i < 16; i++) {
conti nue;
for (int j = 1; j < 16; j+ +) {
}
Syste m.out. forma t("%6d ", i * j); if (j == 5) {
Syst em.ou t.prin tln(" i = " + i); }
b reak; } } Syst em.ou t.prin tln(" "); } KST, FEI – IZAPR, IZKPR přednáška 5
9
19. března 2012
KST, FEI – IZAPR, IZKPR přednáška 5
10
19. března 2012
Break, continue
Continue v cy k lech s nezn. počtem opak ov ání – přechod na podmínku cyklu V cy k lu for se prov ede ink rementace a poté se testuje podmínk a Ty to příkazy použív at v e v ýjimečných a opodstatněný ch případech Rozhodně nepoužív at následujícím sty lem (minulý ak. rok - studenti)
Formátovaný výstup
while (t rue) { if ( cislo == 13 ) { break ; } } KST, FEI – IZAPR, IZKPR přednáška 5
11
19. března 2012
12
KST, FEI – IZAPR, IZKPR přednáška 5
19. března 2012
2
4.4.2012
Formátovaný výstup
System.out.print("text");
Formátovaný výstup
System.out.println("text");
System.out.printf("Cislo Pi = %6.3f", Math.PI);
Další možnosti formátování
V ý pis textu, kurzor zůstáv á na stejném řádku V ý pis textu + odřádkování, kurzor se přesouv á na další řádek
%[modifikator][sirka][.presnost]konverze
konv erze – pov inný parametr
System.out.printf(format, polozky);
format – text se znaky pro formátov ání textu polozky – hodnoty pro dosazení
KST, FEI – IZAPR, IZKPR přednáška 5
13
19. března 2012
celé číslo – d, o, x (dekadicky, oktalově, hexa) desetinný zápis – f, e – vědecký zápis s exponentem
šířka – počet sázený ch míst, zarov nání v pravo .přesnost – počet desetinný ch míst modifikátor – další v lastnosti, např. + (znaménko), - (zarov nání v levo), 0 (doplnění čísla zlev a nulami) %n- přechod na další řádek
KST, FEI – IZAPR, IZKPR přednáška 5
14
19. března 2012
Formátovaný výstup - příklady
System.out.printf(" Cislo Pi = %6.3f %n", Math.PI); System.out.printf(" Cislo Pi = %8.3f %n", Math.PI); System.out.printf(" Cislo Pi = %6.5e %n", Math.PI);
Třídy, objekty
System.out.printf(" Cislo = %d %n ", cislo); System.out.printf(" Cislo = %d %n ", -33);
KST, FEI – IZAPR, IZKPR přednáška 5
15
Třídy
16
19. března 2012
Třída je popisem strukturovaného datového typu
obsahuje datov é prv ky potřebné pro objekt (stav objektu) množinu metod pro práci s datov ými prvky (mění stav objektu)
KST, FEI – IZAPR, IZKPR přednáška 5
19. března 2012
Java – třídy, objekty
Třída je programová jednotka tvořená množinou identifikátorů, které mají třídou definovaný význam Třída je zdrojem metod popisujících řešení problému rozkladem na podproblémy
KST, FEI – IZAPR, IZKPR přednáška 5
17
19. března 2012
Jazyk Java je objektově orientovaný Až na v ý jimk y je v še v jazy ce jazy ce objek t (jednou v ý jimk ou jsou již uv edené prim. datov é ty py ) Objekty jsou pok ročilejší datov ý ty p než primitiv ní datov é ty py Objek ty interně v y užív ají prim. datov é ty py a jiné objek ty pro uchování dat – atributy objektů (instanční proměnné) Metody v y k onávají operace nad daty Správně navržené třídy by měly být jasně definované a snadno využitelné i v jiných aplik acích
KST, FEI – IZAPR, IZKPR přednáška 5
18
19. března 2012
3
4.4.2012
Java – třídy, objekty
Třídy, objekty – příklad
Je nezby tné odlišov at třídy a objekty
Třída obsahuje k ód napsaný programátorem Třída je předpis (šablona) pro v y tv áření objek tů JVM na zák ladě definov ané třídy v y tv áří při běhu programu objekty (instance třídy) Mnoho objek tů může bý t v y tv ořeno na zák ladě jedné třídy
Příklad:
Třída: Student O bjekty (ref. prom.): studentNovak, studentNovy...
KST, FEI – IZAPR, IZKPR přednáška 5
19
19. března 2012
Deklarace referenční proměnné a vytváření objektů Jakého typu má být referenční proměnná
Deklarace referenční proměnné
Student stude ntNova k
Student – objekt
Vytvoření objektu
= new Stud ent() ;
Vazba mezi referenční proměnnou a objektem
studentNovak – referenční proměnná
KST, FEI – IZAPR, IZKPR přednáška 5
20
19. března 2012
Java – referenční datový typ
Referenční datový typ odkazuje na objekt v paměti (nepracujeme přímo s pamětí, proto nepoužív áme označení uk azatele)
P roměnná, která slouží pro přístup k objektu P ři deklaraci proměnné tohoto ty pu definujeme, na objekty jakého typu může proměnná odkazovat (nelze dále měnit)
KST, FEI – IZAPR, IZKPR přednáška 5
21
Třídy, atributy, metody syntaktická pravidla
22
19. března 2012
Syntaxe třídy
KST, FEI – IZAPR, IZKPR přednáška 5
19. března 2012
Atributy
[modifik ator] class <Jme noTrid y> {
Zák ladní sy ntaxe [modifik ator] [ = < inic. hodno ta>];
<met ody>
}
public c lass Obdeln ik { int delka ;
P říklad:
int sirka ; bool ean j eZobra zen;
publi c cl ass Stud ent { i nt z namk aPro gram ovan i = 1;
Stri ng oz naceni ; v oid vyho dnot Znam ku() {
}
i f (z namk aPro gram ovan i == 1) { S yste m.ou t.pr intl n("S tud ent ma z namk u vy born e"); } els e...
Přístup k atributům – tečk ov á notace
}
obdelnik1.delka = 5;
} KST, FEI – IZAPR, IZKPR přednáška 5
23
19. března 2012
KST, FEI – IZAPR, IZKPR přednáška 5
24
19. března 2012
4
4.4.2012
Metody
Zák ladní sy ntaxe [modifik ator] ([p aramet ry]) { prik az1; prik az2; ... }
Pole
public v oid n astavZ namku (int z namka ) { znam kaPro gramov ani = znamk a; }
Volání metod – tečk ov á notace, argumenty
studentNovak.nastavZnamku(1);
KST, FEI – IZAPR, IZKPR přednáška 5
25
Jednorozměrného pole
double[] pole = new double[10];
pole
Pole primitivních datových typů double[] pole Realny chCis el; char[] p oleZn aku;
pole[2]
pole[3]
pole[4]
pole[5]
pole[6]
pole[7]
pole[8]
pole[9]
4.5
3.3
4
34.3
34
45.5
124
85.2
1
Prvek na indexu 5 Hodnota prvku
27
datovyTyp[] pole; datovyTyp pole[];
pole = new datovyTyp[pocetPrvku]; pole = new double[10]; pole[0] odkazuje na prv ní prv ek pole pole[9] odkazuje na poslední prv ek pole
KST, FEI – IZAPR, IZKPR přednáška 5
29
19. března 2012
datovyTyp[] pole = new datovyTyp[pocetPrvku];
Přík lad:
//povoleno, ale nedoporucuje se
Vy tv áření objek tů ty pu pole
28
Jednorozměrné pole
Dek larace ref. proměnné ty pu pole
KST, FEI – IZAPR, IZKPR přednáška 5
19. března 2012
Jednorozměrné pole
pole[1]
5.5
Vytvoříme jej pomocí operátoru new Počet prvků pole nelze měnit
KST, FEI – IZAPR, IZKPR přednáška 5
Vytvoření objektu a alokace místa pro prvky
pole[0]
P ole je objekt
19. března 2012
Pole referenčních datových typů Student[ ] pol eStude ntu;
KST, FEI – IZAPR, IZKPR přednáška 5
Jednorozměrné pole
Referenční proměnné - alokace místa pro referenční proměnnou
26
19. března 2012
19. března 2012
double[] pole = new double[10];
datovyTyp pole[] = new datovyTyp[pocetPrvku];
// tento styl neni dopor uceny
Přík lad:
double pole[] = new double[10];
Počet prv k ů pole musí bý t stanov en při v y tv áření pole.
KST, FEI – IZAPR, IZKPR přednáška 5
30
19. března 2012
5
4.4.2012
Pole
Pole
Vy tv oření objek tu ty pu pole
P ev ně daný počet prv ků P očet prv ků nelze měnit
Standardní hodnoty prv ků pole
Počet prv k ů pole
Zjištění pomocí atributu objektu – length
double[] pole = new double[10];
pole.length
KST, FEI – IZAPR, IZKPR přednáška 5
31
19. března 2012
Pole – indexy
19. března 2012
Proměnná ty pu pole s indexem
S tejný způsob práce jako s jakoukoliv jinou proměnnou
Index 0
pole[2] = pole[0] + pole[1];
(pole.length – 1)
Indexy prv ků 0–9
Přístup k prv k ům pole – indexy
pole[index];
KST, FEI – IZAPR, IZKPR přednáška 5
33
19. března 2012
Pole
32
double pole[] = new double[10];
Poslední prv ek pole
KST, FEI – IZAPR, IZKPR přednáška 5
Pole
Zabezpečují přístup k prvkům Prv ní prv ek pole
Č íselné primitiv ní typy – 0 C har – '\u0000' Boolean – false
KST, FEI – IZAPR, IZKPR přednáška 5
34
19. března 2012
Pole – inicializace
Pole – dek larace i inicializace v jednom k rok u
double[] pole ={1.9, 2.9, 3.4, 3.5};
M usí bý t v jednom kroku, ekvivalentní k násl. kódu double[] pole = new doub le[4];
pole[0] = 1.9 ;
Inicializace hodnot při průchodu polem
Scanner sc = new Sc anner (Syste m.in) ; System.o ut.pr int("N apis " + po le.le ngth + " hod not: "); for (int i = 0; i < pole .lengt h; i+ +) { pole [i] = input .next Double (); }
Inicializace hodnot pole náhodný mi čísly
pole[1] = 2.9 ; for (int i = 0; i < pole .lengt h; i+ +) { pole [i] = Math. rando m() * 100; }
pole[2] = 3.4 ;
pole[3] = 3.5 ;
KST, FEI – IZAPR, IZKPR přednáška 5
35
19. března 2012
KST, FEI – IZAPR, IZKPR přednáška 5
36
19. března 2012
6
4.4.2012
Pole – zákl. algoritmy
Pole – zákl. algoritmy
Součet v šech prv k ů pole
double s oucet = 0;
Náhodné promíchání prv k ů
for (int i = 0; i < pole .lengt h; i+ +) {
// g enero vani n ahodn eho in dexu j
for (int i = 0; i < pole .lengt h; i+ +) { souc et = soucet + po le[i]; //so ucet + = pole [i] }
int index Nah = (int) (Math. rando m() * pole.l ength );
// z amena prvku pole [i] za pole [j]
Vy hledání prv k u s nejv ětší hodnotou
doub le do casny = pol e[i];
double m ax = pole[0 ];
pole [i] = pole[ index Nah]; pole [inde xNah] = tem p; }
for (int i = 1; i < pole .lengt h; i+ +) { if ( pole[ i] > m ax) { max = pole[ i]; } } KST, FEI – IZAPR, IZKPR přednáška 5
37
19. března 2012
Vícerozměrná pole
38
Vícerozměrná pole
datovyTy p[][] refPr omenn a;
Vytvoření objektu
6
7
0
1
matice[0 ]
0 —
—
null
0
1
2
Kombinace dek l. a inicializace
9
refProme nna = new d atovy Typ[10 ][10] ; matice
19. března 2012
Deklarace
KST, FEI – IZAPR, IZKPR přednáška 5
datovyTy p[][] refPr omenn a = ne w dat ovyTyp [10][1 0];
8
5
1
2
matice[1 ]
int[][] matic e = ne w int [3][]; matice[0 ] = n ew int [2];
Alternativ a (nedoporučuje se)
datovyTy p ref Promen na[][ ] = ne w dat ovyTyp [10][1 0];
matice[0 ][0] = 6; matice[0 ][1] = 7; matice[1 ] = n ew int [3]; matice[1 ][0] = 9;
KST, FEI – IZAPR, IZKPR přednáška 5
39
19. března 2012
KST, FEI – IZAPR, IZKPR přednáška 5
40
19. března 2012
7