2012. október 18.
Ismétlés
El z órai anyagok áttekintése Ismétlés Specikáció Típusok, kifejezések, m veletek Adatok ábrázolása a memóriában Vezérlési szerkezetek Függvények Osztályok, objektumok Paraméterátadás Egyszer programozási tételek
Típusok Java Primitívek Primitív típusok boolean: Logikai típus byte: 8-bites el jeles egész short: 16-bites el jeles egész int: 32-bites el jeles egész long: 64-bites el jeles egész float: 32-bites lebeg pontos racionális szám double: 64-bites lebeg pontos racionális szám char: 16-bites Unicode karakter
Típusok Java Objektumok Object leszármazottjai String: Karakterlánc []: tömbök Csomagoló osztályok Boolean: boolean Byte: byte Short: short Integer: int Long: long Float: oat Double: double Character: char
Vezérlési szerkezetek Szekvencia, elágazás Szekvencia blokk Utasítások meghatározott sorrendje { } jelek között Elágazás if (logikai feltétel) utasítás else más utasítás switch (kifejezés) { case eset: utasítások break; default: utasítások break; }
Vezérlési szerkezetek Ciklus Ciklusok while (logikai feltétel) ciklusmag do ciklusmag while (logikai feltétel) for (inicializálás; logikai feltétel; léptetés) ciklusmag
Függvények, paraméterek, osztályok Függvények Függvényszignatúra visszatérésitípus függvénynév (paraméterdeklarációk ) Függvénytörzs Szekvencia, ami tartalmazza a függvény utasításait, valamint legalább egy return utasítást.
Függvények, paraméterek, osztályok Java osztály Java osztály public class osztálynév extends szül [és még más] { public int mezonév; private String mez név;... public osztálynév (paraméterek ) { // Konstruktor } public int függvényneve (paraméterek ) {...}... }
Függvények, paraméterek, osztályok Paraméterátadás Java nyelven, amikor függvényt hívunk, az aktuális paraméter értéke átmásolódik a formális paramétert jelent változóba. (Létrejön(nek) a függvényszignatúra szerinti új változó(k), és az értékük az lesz, ami a függvényhíváskor az aktuális paraméter volt.) Objektumok esetén ez a referencia lesz! Nem jön létre másolat az objektumról, hanem pontosan ugyanazon az objektumon dolgozunk, mint ami az aktuális paraméter. (Primitívek esetén létrejön másolat és a másolaton dolgozunk.) Csomagolók esetén nincs másolat, mivel azonban változtatáskor új jön létre, a tényleges hatás ugyanaz, mint a primitívek esetén.
Tételek Programozási tételek Összegzés Leszámlálás Lineáris keresés Maximum keresése
További Java eszközök
Foreach Foreach ciklus Az alábbi for ciklus egy tömb elemein lépked végig, a tömb elemeinek összegét kiszámolandó (összegzés tétele) For ciklus összegzés példa int [] tomb = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int osszeg = 0; for (int i = 0; i<tomb.length; i++) osszeg += tomb[i];
Foreach Foreach ciklus A foreach ciklus ezt lerövidíti. Arra való, hogy például egy tömb összes elemén végiglépkedjen. Foreach ciklus összegzés példa int [] tomb = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int osszeg = 0; for (int aktualis : tomb) osszeg += aktulis; (Nem használható, ha meg kell változtatni az értékeket.) Foreach ciklus for (elemek típusa változó : aminvégigkelllépni) ciklusmag;
Típuskonverzió Típuskonverzió Casting A különböz típusok között lehetséges konvertálni. A konvertálás történhet implicit explicit módon egyaránt.
Típuskonverzió Implicit típuskonverzió Amikor egy operátor kiértékelésénél különböz típusok vannak, ugyanakkor egyik sz kítése a másiknak, a nyelv automatikus b vít konverziót hajt végre. int i = 10; long l = 100; double d = 200; Double dd = 6.6; (i < l) (d > l) (dd = d) (d = i) Ugyanígy a csomagoló és primitív párok között is automatikus konverzió történik.
Típuskonverzió Explicit típuskonverzió Lehet ségünk van kézzel kényszeríteni a típuskonverziót ezt nevezzük explicit konverziónak. Explicit típuskonverzió (újtípus) kifejezés; Gyakran használatos eszköz az osztás pontosságánának beállítására: Osztás példa int i = 10; double d1 = i / 3; // = 3.0; double d2 = (double)i / 3; // = 3.33333;
Típuskonverzió További konverziók A beépített csomagoló típusok segítségével lehet ség van karakterlánc és számok közötti konverzióra is. Ezek azonban már függvényhívások. Egész karakterláncban String s = "20"; int i = Integer.parseInt(s); int i = Integer.parseInt(s, 16); // Hexadecimális Ugyanígy visszafelé is lehet konvertálni: Szám karakterlánccá String s1 = Double.toString(100); String s2 = Integer.toHexString(10);
Felsorolási típus Java Enum típus felsorolás Lehetséges olyan saját típus deniálása, ahol a lehetséges értékeket saját magunk deniáljuk. Enum enum Nap { HÉTFŽ, KEDD, SZERDA, CSÜTÖRTÖK, PÉNTEK, SZOMBAT, VASÁRNAP } Nap n = Nap.SZERDA; A felsorolási típus használható a többszörös elágazásban, mint eset, valamint a foreach ciklusokban is a bejárandó kifejezés helyén. További információ: http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html
Beolvasás Beolvasás konzolról és fájlból Az alábbiakban egy egyszer sített beolvasási technikát nézünk meg. A java.util.scanner osztállyal lehetséges a konzolról, valamint fájlokból sorokat, illetve meghatározott típusú elemeket beolvasni. A Scanner osztály példányosítása: Scanner Scanner sc = new Scanner(bemenet) A bemenet lehet: Fájl (File) IO Csatorna (Konzol, InputStream, FileReader) String
Beolvasás Beolvasás konzolról és fájlból Konzol esetén Scanner sc = new Scanner(System.in); Fájl esetén Scanner sc = new Scanner(new File(fájlneve)); A Scanner alkalmas speciális elválasztójelekkel írt fájlok olvasására, reguláris kifejezések értelmezésére is.
Beolvasás Beolvasás konzolról és fájlból Példák: Következ sor olvasása String s = sc.nextline(); Következ int olvasása int i = sc.nextint(); Van-e következ sor boolean b = sc.hasnextline(); Ha nem olyan típus következik a beolvasandó csatornán, amit kérünk, akkor hiba keletkezik.
Kiírás Kiírás konzolra Míg a System.in a konzolos bemenetet (billenty zetet) egyedül képviseli, addig kimenetb l hagyományosan kétféle áll rendelkezésre: System.out és System.err. Az els a szabványos kimenet, a második a szabványos hibakimenet. Mindkett a képerny re ír ki, a látványos különbség, hogy a hibakimenet pirossal jelenik meg. Használatuk: Szövegkiírás újsor jellel a végén System.out.println("Szervusz világ"); Szövegkiírás újsor jel nélkül System.out.print("Szervusz világ");
Kiírás Kiírás konzolra A print() paramétere bármi lehet, a primitíveket a csomagoló osztályon keresztül, a többi osztályt a tostring() tagfüggvény segítségével alakítja át a Java karakterlánccá. Saját osztály esetében célszer írni egy tostring() függvényt. tostring() példa public String tostring(); { return "Kutya, név: " + nev + " faj: " + fajta; } Ha nincs tostring() függvénye egy osztálynak, akkor a szül osztály (végs soron az Object) megfelel függvényét használja, de az legtöbbször nem informatív.
Kiírás Kiírás fájlba A System.out-hoz hasonló fájl-kimenetet létrehozni a következ képpen lehet: Fájlba írás példa PrintStream ps = new PrintStream( new FileOutputStream(filenév)); Más módszerek is léteznek a fájlok használatára a kimenet / bemenet iránytól, valamint az írni kívánt egységt l, illetve puer használatától függ en.
Megjegyzések, dokumentációk Megjegyzések kommentek Lehet ség van a kódban megjegyzések, kommentek elhelyezésére. Egysoros megjegyzés int i = 0; // számláló Többsoros megjegyzés /* Ez itt egy többsoros megjegyzés eleje közepe és vége */
Megjegyzések, dokumentációk Dokumentációs megjegyzések Lehet ség van a kódban függvények és osztályok el tt dokumentációs megjegyzések elhelyezésére. Ezeket a megjegyzéseket JavaDoc kommentnek hívjuk, segítségükkel az elkészített programról kóddokumentáció hozható létre pár kattintással. A JavaDoc-ban elhelyezhet ek hivatkozások, html kódok is. JavaDoc /** Ez itt egy JavaDoc függvény leírása @author Szerz Neve @param egy paraméter leírása @return visszatérési érték leírása */
Java a gyakorlatban
Hogyan m ködik? Java program futása A Java program a számítógépen egy Java Virtuális Gépen fut (JVM), ami lehet vé teszi, hogy ugyanaz a Java program tetsz leges operációs rendszeren (amire a JVM elkészült) és géparchitektúrán fusson. Az általunk elkészített forráskódból a fejleszt környezet egy Java bájtkódot készít, amit a JVM értelmez, és az adott rendszernek megfelel gépi kódú utasítás-sorozattá alakít át. Ennek megfelel en a Java környezet eleve két részb l áll: JVM virtuális gép, a JRE része (Java Runtime Environment) JDK Java Development Kit (a fejleszt i Java, tartalmaz egy JRE-t is) Jelenleg a 6-os verzió Update 16 a legfrissebb. JRE-t letölteni a http://www.java.com/ oldalról lehet, de ez csak a programok futtatására elég!
Hogyan m ködik? Java program fejlesztése A fejlesztésre alkalmas Java, ami tartalmaz példákat, forráskódokat, teljes JavaDoc-ot, az a JDK. Többféle verzió áll rendelkezésre: Java SE Standard Edition (Alap verzió, nekünk b ven elég) Java EE Vállalati verzió (Alap + további szolgáltatások) Java ME Mobil verzió (Például telefonokra) A Java SE-t a http://java.sun.com/javase/downloads/?intcmp=1281 oldalról lehet letölteni.
Hogyan m ködik? Java program fejlesztése Az el z ekben megismert eszközök pusztán a megírt forráskód fordítására, futtatására, (stb.) alkalmasak. Ez természetesen elég lehet, hiszen a kódot egy tetsz leges szövegszerkeszt vel is meg lehet írni (Jegyzettömb), de sokkal kényelmesebb eszközök is rendelkezésre állnak. A továbbiakban az Eclipse IDE (Integrated Development Environment) programot használjuk. (Az egyszer szövegszerkesztésnél sokkal bonyolultabb feladatok gyors elvégzésére is alkalmas.) A http://www.eclipse.org/downloads/ oldalról az Eclipse IDE for Java Developers választandó.
Eclipse IDE
Új Project
Új Project
Új Project
Új Project
Új Osztály
Új Osztály
Kód beírása
Kód beírása
Futtatás
Kód beírása
Kód beírása
Négyzetösszeg Próbáljuk ki Készítsünk el most egy olyan programot, ami beolvas a konzolról számokat és kiszámítja a négyzetösszegüket. Melyik tétel ez? Az új project neve legyen Négyzetösszeg. A main-t tartalmazó osztály pedig NegyzetOsszeg. Els ként egy egyszer bb változatot írjunk, ami egy tízelem tömbb l olvassa ki az értékeket.
Els verzió
Második verzió
Rekurzió
Rekurzió bevezetés Bevezetés Rekurzív egy függvény, ha a számítás során rész-számításokhoz önmagát hívja meg. Általában egy egyszer bb eset visszavezetésére használjuk, vagy a rész-esetek további kibontására. Például, ha egy faktoriálist szeretnénk kiszámolni, akkor rekurzív függvényhívással is meg lehet oldani a problémát. Adott n, az ehhez tartozó n! az nem más, mint n ((n 1)!). Azaz a problémát egy szorzássá alakítottuk át, most már csak az eggyel kisebb szám faktoriálisát kell kiszámolni. Ezt tudjuk folytatni tovább, egészen addig, amíg n = 0, mivel annak ismert a faktoriálisa.
Rekurzió bevezetés Bevezetés Rekurziós módszerek esetén, mivel a függvény saját magát hívogatja, nehéz követni, hogy hol tart. A faktoriális számítása esetén ez nem gond, mivel nincs benne elágazás. Azonban a legtöbb problémánál elágazások vannak a függvényben. Azt fontos megjegyezni, hogy egy függvény futása addig nem fejez dik be, amíg nem futtat egy return utasítást. Addig a bels változói deklaráltak, és van értékük. Amikor egy függvényt hív, akkor annak a függvénynek is lesz egy saját területe, és így tovább. (A rekurziós módszerek általában több memóriát használnak el, mint nem rekurzív párjaik.)
Rekurzió példa
Rekurzió példa Írjuk meg a ciklusos változatot!
Rekurzió példa
Összefoglalás
Összefoglaló Mir l volt szó Típus deníciója További Java eszközök Foreach ciklus Java fogalmak Eclipse környezet Els programunk Java-ban Rekurzív algoritmusok
Összefoglaló Házi feladat Egy program írása, amely egy tetsz leges zikával / kémiával / gazdaságtannal kapcsolatos problémát megold. 1 Megkérdezi a felhasználót, hogy akar-e feladatot oldani, vagy kilépni szeretne 2 Bekéri sorban a paramétereket 3 Egy függvénnyel kiszámolja az eredményt 4 Kiírja az eredményt és lép az 1. pontra Például: négyszög területének kiszámítása. (Többféle négyszög, többféle területképlet.) A felhasználó kiválaszthatja a számítás módját. A feladatot kérem beadni!
Felhasznált el adások Felhasznált el adások 1. el adás Nyékyné Gaizler Judit Programozás nyelvek és módszerek 1. gyakorlat anyaga Tornai Kálmán (Illetve új anyagok)