Základy programování (IZAPR, IZKPR) Přednáška 5 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky Příkazy cyklu - dokončení Úvod do tříd a objektů jednorozměrná vícerozměrná Druhy chyb v programech 2 Příkaz for neúplný Neúplný příkaz for lze ze syntaktického hlediska používat Neúplné cykly for nepodporují dobrou čitelnost a pochopení zdrojového kódu V takových případech je v takových případech využít jiný typ cyklu for (int i = 0; i < 10) { System.out.println(i); i++; int i = 0; while (i < 10 ) { System.out.println(i); i++; Příkaz for příklady for (int i = 0, j = 0; ( i < 10 ) && (j < 1 0); i+ +, j+ +) { System.out.println("i = " + i + " j = " + j); for ( ; ; ) { // je to mozne, ale nepouzivat System.out.println(" nekonecny cyklus"); int i = 3; for ( ; i < 10 ; ) { // podobne jako cyklus while System.out.println(" i = " + i++); 3 4 Příkaz for příklady Inkrementace nemusí být vždy o hodnotu jedna for (int i = 0; i < 21; i += 5 ) { System.out.println("i = " + i); Cyklus for each (enhanced for loop) O d Java 1.5 Usnadňuje průchod kolekcemi, poli apod. Pouze dvě části v deklaraci cyklu, nikoliv tři for (deklarace : vyraz) { Deklarace 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í 5 6 1
Vnořování cyklů Lze používat cykly v cyklech a jedná se o poměrně běžnou záležitost Příklad: Vytiskněte tabulku malé násobilky for (int i = 1; i < 16; i++) { for (int j = 1; j < 16; j++) { System.out.format("%6d", i * j); System.out.println(""); Příkazy break, continue Použití: např. práce s maticemi 7 8 Příkazy break, continue Příkaz break umožňuje ukončit cyklus v libovolném místě těla cyklu 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.) for (int i = 1; i < 16; i++) { for (int j = 1; j < 16; j++) { System.out.format("%6d", i * j); if (j == 5) { break; System.out.println(""); 9 Příkazy break, continue Příkaz continue ukončí aktuální iteraci cyklu Pokračuje se iterací další v y nucení nového v y hodnocení podmínky for (int i = 0; i < 9; i ++) { if (i == 5) { continue; System.out.println("i = " + i); 10 Break, continue Continue v cyklech s nezn. počtem opakování přechod na podmínku cyklu V cyklu for se provede inkrementace a poté se testuje podmínka 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) while (true) { if ( cislo == 13) { break; Formátovaný výstup 11 12 2
Formátovaný výstup System.out.print("text"); V ý pis textu, kurzor zůstáv á na stejném řádku System.out.println("text"); V ý pis textu + odřádkování, kurzor se přesouv á na další řádek System.out.printf(format, polozky); format text se znaky pro formátov ání textu polozky hodnoty pro dosazení Formátovaný výstup System.out.printf("Cislo Pi = %6.3f", Další možnosti formátování %[modifikator][sirka][.presnost]konverze konv erze pov inný parametr 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 13 14 Formátovaný výstup - příklady System.out.printf("Cislo Pi = %6.3f %n", System.out.printf("Cislo Pi = %8.3f %n", System.out.printf("Cislo Pi = %6.5e %n", Třídy, objekty System.out.printf("Cislo = %d %n", cislo); System.out.printf("Cislo = %d %n", -33); 15 16 Třídy 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 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) Java třídy, objekty Jazyk Java je objektově orientovaný Až na výjimky je vše v jazyce jazyce objekt (jednou výjimkou jsou již uvedené prim. datové typy) Objekty jsou pokročilejší datový typ než primitivní datové typy Objekty interně využívají prim. datové typy a jiné objekty pro uchování dat atributy objektů (instanční proměnné) Metody vykoná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 aplikacích 17 18 3
Java třídy, objekty Je nezbytné odlišovat třídy a objekty Třída obsahuje kód napsaný programátorem Třída je předpis (šablona) pro vytváření objektů JVM na základě definované třídy vytváří při běhu programu objekty (instance třídy) Mnoho objektů může být vytvořeno na základě jedné třídy Třídy, objekty příklad Deklarace referenční proměnné a vytváření objektů Jakého typu má být referenční proměnná Student objekt Deklarace referenční proměnné Student studentnovak Vytvoření objektu = new Student(); Příklad: Třída: Student O bjekty (ref. prom.): studentnovak, studentnovy... studentnovak referenční proměnná Vazba mezi referenční proměnnou a objektem 19 20 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í ukazatele) Promě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) Třídy, atributy, metody syntaktická pravidla 21 22 Syntaxe třídy Příklad: [modifikator] class <JmenoTridy> { <atributy> <konstruktory> <metody> publi c cl ass Stud ent { i nt z namk apro gram ovan i = 1; 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... Atributy Základní syntaxe [modifikator] <typ> <identifikator> [ = < inic. hodnota>]; public c lass Obdelnik { int delka ; int sirka ; boolean jezobrazen; String oznaceni ; Přístup k atributům tečková notace obdelnik1.delka = 5; 23 24 4
Metody Základní syntaxe [modifikator] <navratovy_typ> <nazev> ([parametry]) { prikaz1; prikaz2;... public v oid nastavznamku(int znamka) { znamkaprogramovani = znamka; Volání metod tečková notace, argumenty studentnovak.nastavznamku(1); 25 26 Jednorozměrného pole Referenční proměnné - alokace místa pro referenční proměnnou primitivních datových typů double[] polerealnychcisel; char[] poleznaku; referenčních datových typů Student[] polestudentu; je objekt Vytvoříme jej pomocí operátoru new Počet prvků pole nelze měnit Jednorozměrné pole double[] pole = new double[10]; pole pole[3] pole[4] pole[5] pole[0] pole[1] pole[6] pole[2] pole[7] pole[8] pole[9] 5.5 4.5 3.3 4 34.3 34 45.5 124 85.2 1 Prvek na indexu 5 Vytvoření objektu a alokace místa pro prvky Hodnota prvku 27 28 Jednorozměrné pole Deklarace ref. proměnné typu pole datovytyp[] pole; datovytyp pole[]; //povoleno, ale nedoporucuje se Vytváření objektů typu 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 Jednorozměrné pole datovytyp[] pole = new datovytyp[pocetprvku]; Příklad: double[] pole = new double[10]; datovytyp pole[] = new datovytyp[pocetprvku]; // tento styl neni doporuceny Příklad: double pole[] = new double[10]; Počet prvků pole musí být stanoven při vytváření pole. 29 30 5
Vytvoření objektu typu pole Pev ně daný počet prv ků Počet prv ků nelze měnit Počet prvků pole Zjištění pomocí atributu objektu length Standardní hodnoty prvků pole Č íselné primitiv ní typy 0 C har '\u0000' Boolean false double[] pole = new double[10]; pole.length 31 32 indexy Zabezpečují přístup k prvkům První prvek pole Index 0 Poslední prvek pole (pole.length 1) Proměnná typu pole s indexem Stejný způsob práce jako s jakoukoliv jinou proměnnou pole[2] = pole[0] + pole[1]; double pole[] = new double[10]; Indexy prv ků 0 9 Přístup k prvkům pole indexy pole[index]; 33 34 deklarace i inicializace v jednom kroku double[] pole ={1.9, 2.9, 3.4, 3.5; Musí bý t v jednom kroku, ekvivalentní k násl. kódu double[] pole = new double[4]; inicializace Inicializace hodnot při průchodu polem Scanner sc = new Scanner(System.in); System.o ut.pr int("napis " + pole.length + " hodnot: "); pole [i] = input.nextdouble (); pole[0] = 1.9; pole[1] = 2.9; pole[2] = 3.4; pole[3] = 3.5; Inicializace hodnot pole náhodnými čísly pole [i] = Math.random() * 100; 35 36 6
zákl. algoritmy Součet všech prvků pole double soucet = 0; soucet = soucet + pole[i]; //soucet += pole[i] Vyhledání prvku s největší hodnotou double m ax = pole[0]; for (int i = 1; i < pole.length; i++) { if ( pole[i] > max) { max = pole[i]; zákl. algoritmy Náhodné promíchání prvků // generovani nahodneho indexu j int index Nah = (int)(math.random() * pole.length ); // zamena prvku pole [i] za pole [j] double docasny = pole[i]; pole [i] = pole[indexnah]; pole [indexnah] = temp; 37 38 Vícerozměrná pole Deklarace datovyty p[][] refpromenna; Vytvoření objektu refprome nna = new datovytyp[10][10]; Kombinace dekl. a inicializace datovyty p[][] refpromenna = new datovytyp [10][10]; Alternativa (nedoporučuje se) datovyty p refpromenna[][] = new datovytyp [10][10]; Vícerozměrná pole matice int[][] matice = new int [3][]; matice[0 ] = new int [2]; matice[0 ][0] = 6; matice[0 ][1] = 7; matice[1 ] = new int [3]; matice[1 ][0] = 9; matice[0 ] 6 7 0 1 null 0 1 2 9 8 5 0 1 2 matice[1 ] 39 40 7