Programozás I. 3. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1
Primitív típusok Típus neve Érték Alap érték Foglalt tár Intervallum byte Előjeles egész 0 8 bit -128 127 short Előjeles egész 0 16 bit -32768 32767 int Előjeles egész 0 32 bit -2147483648-2147483647 long Előjeles egész 0 64 bit -9223372036854775808-9223372036854775807 float IEEE 754 lebegőpontos 0.0 32 bit +/-1.4E-45 - +/-3.40E+38, +/-infinity, +/-0, NaN double IEEE 754 lebegőpontos 0.0 64 bit +/-4.9E-324 - +/-1.8E+308, +/-infinity, +/-0, NaN char Unicode \u0000 16 bit \u0000 - \uffff boolean true, false false 1 bit (32 true, false Szegedi Tudományegyetem Természettudományi és Informatikai bitből) Kar Antal Gábor 2
Primitív típusok jellemzői Stack-en jönnek létre Mindig érték szerint tárolódnak minden más (objektumok) referencia szerint Csak előjeles típusok vannak pl.: nincs unsigned int, csak int Speciális osztályok: BigInteger - Akármekkora egész tárolására BigDecimal - Akármekkora szám tárolására Példaprogram: PrimitivTipusok.java (pub) Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 3
Csomagoló/Wrapper osztályok A primitív típusokat becsomagolhatjuk objektumokká, erre szolgálnak a wrapper osztályok Primitív típusokat objektumokként tudjuk kezelni stack helyett a heapen lesznek tárolva Implicit konverzió a wrapper osztály és a primitív típus között Minden primitív típusnak van csomagoló osztálya pl.: int a; primitív típus, stacken Integer a = new Integer(4); objektum, heapen http://en.wikipedia.org/wiki/primitive_wrapper_class Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 4
Csomagoló/Wrapper osztályok Integer a = new Integer(5); Integer b = new Integer(3); a = b; az a ugyanoda mutat, mint a b a = b.clone(); a b értéke a -ba másolódik Ha az a és b primitív típusú: int a = 5; int b = 3; a=b értékadás, a értéke b lesz Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 5
Operátorok Értékadás primitív típusoknál értékmásolás objektumoknál referenciamásolás tényleges másolás a clone() metódussal Unáris aritmetikai Előjelváltás (+, -) Növelés/Csökkentés (++, --) Bináris aritmetikai Összeadás (+), kivonás (-), szorzás (*), osztás (/), maradékképzés (%) Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 6
Operátorok Bitműveletek: Bitenkénti És (&), Bitenkénti Vagy ( ), Kizáró Vagy (^), Komplementer képzés (~) &=, =, ^= Háromoperandusú if-else (?: ) feltetel? ertek_ha_igaz : ertek_ha_hamis Értékadás, összevont értékadás (balhoz a jobb oldalit) =, +=, -=, *=, /= Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 7
Operátorok Logikai És (&&), Vagy ( ), Negálás (!), Csak boolean értékekre használhatóak! Összetett kifejezések addig értékelődnek ki, amíg egyértelműen ki nem derül a kifejezés értéke: lusta kiértékelés Relációk: pl.: if( arg1==0 arg2 == 1 arg3 == 0 )!=, ==, >=, <=, <, > logikai értékkel térnek vissza primitív típusoknál érték szerint hasonlít objektumoknál referencia összehasonlítás ( objektum összehasonlításra a.equals() metódus használatos ) Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 8
Operátorok Bitléptető operátorok Előjeltartó (>>,<<), Előjelléptető (>>>) balra (<<) : 2 n-edik hatványával szorozzuk a számot jobbra ( >>) : 2 n-edik hatványával osztjuk a számot Vessző csak for ciklusban használható (,) Típuskonverzió: (type) value primitívek között korlátozás nélkül engedélyezett objektumok között csak az öröklődési fán belül pl.: double c; c = 5/2; (c értéke 2.0 lesz) c = ((double)5/2); (c értéke 2.5 lesz) Nincs sizeof() operátor Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 9
Inkrementálás/dekrementálás int a = 5; b = ++a; (prefix operátor) a növelése, majd értékadás (b értéke 6) c = a++; (postfix operátor) c értéke 5 lesz, majd az értékadás után növelődik a Ugyanez a helyzet a --a, és a--" -nál is Példaprogram: Operatorok.java (pub) Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 10
Parancssori argumentumok minden parancssorból indított Java alkalmazásnak átadhatunk argumentumokat is ezeket a main függvény args nevezetű String tömbjében érjük el public static void main(string[] args) a tömbindexelés 0-tól kezdődik a 0. indexen lévő argumentum nem a program neve! De ez könnyen kideríthető a paraméterek darabszáma: args.length, egy egész értéket (int) ad vissza Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 11
Parancssori argumentumok int argumentum; if (args.length!= 0) { try { argumentum = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println("Can t parse to int"); System.exit(1); } } Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 12
Parancssori argumentumok Integer.parseInt(args[0]); az args tömb első elemét számmá alakítjuk az args tömb egy String tömb, nekünk viszont int-re van szükségünk, ezért át kell alakítani (Ez csak akkor működik, ha tényleg számokat adunk át paraméternek) általános alak: <Típus>.parse*( string ); <Típus> lehet: Integer, Double, Float, stb.. Integer.parseInt( 5 ); Double.parseDouble( 6.15 ); Viszont: String.valueOf(<bármi>); Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 13
Vezérlési szerkezetek Minden C-beli vezérlési szerkezetet támogat a Java Kivéve a goto-t a kulccszó létezik, de nincs implementálva soha ne használjuk! if, for, while, switch Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 14
Vezérlési szerkezetek If-else if - else, valamint switch Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 15
Vezérlési szerkezetek While, Do-While, For Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 16
Feladatok Írd ki a parancssori paramétereket a konzolra Írd ki a parancssori paramétereket a konzolra, fordított sorrendben Írd ki a parancssori paramétereket úgy, hogy az első sorba csak az elsőt, a másodikba az első kettőt szóközzel elválasztva, a harmadikba az első hármat, stb.. Írd ki a parancssori paraméterek közül a legnagyobbat, legkisebbet, valamint az értékek átlagát. Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 17
Szorgalmi feladat Számítsd ki a parancssoron kapott két időpont (óra perc óra perc) között eltelt időt, és írasd ki a konzolra (óra perc formában) A program elkészítése során ügyelj az adatok helyességére bemenő paraméterek száma az órák 0-23 intervallumba kell, hogy essenek a percek 0-59 intervallumba kell, hogy essenek Beadás: CooSpace, 2014.03.05 20:00-ig Beadásnál csak egy darab Java fájlt kell feltölteni, Main.java néven Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 18
Tömbök Egynél több érték tárolására vannak kitalálva, de az elemek száma rögzített. Adott számú, azonos típust tartalmazó adattípus Az indexelés 0-val kezdődik Tömböket dinamikusan, a new operátorral lehet létrehozni, mérete a length adatmezővel lekérdezhető A Java teljes körű indexhatár-ellenőrzést végez, kivétellel jelzi, ha alul- vagy túlindexelés történik Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 19
Egydimenziós tömbök Az egyetlen kiterjedéssel rendelkező tömböket szokás vektornak is nevezni Definíció: típus tömbnév[ ]; típus[ ] tömbnév; A tömböt futás során a new operátorral hozzuk létre new típus[ méret ]; a méret egy nemnegatív egész szám, értéke nem lehet nagyobb, mint az Integer.MAX_VALUE pl.: int[ ] x = new int[5]; elemei: x[0], x[1], x[2], x[3], x[4] Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 20
Egydimenziós tömbök A Java lehetővé teszi, hogy a tömböket a definiálás során konstans értékekkel töltsük fel. Ilyenkor a tömböt a fordító hozza létre típus[ ] tömbnév = { konstans1, konstans2 } int[ ] arr = { 1, 2, 3, 4, 5 }; Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 21
Többdimenziós tömbök Tömbhivatkozás definíciója: típus[ ] [ ]... [ ] tömbnév; típus tömbnév[ ][ ]... [ ]; 2D-s tömb létrehozása: new típus[ méret1 ][ méret2 ] Inicializálás konstans értékekkel: int[ ] matrix = { { 1, 2 }, { 3, 4 } }; Dinamikusan: int[ ] matrix = new int[ 2 ][ 2 ]; Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 22