Java gyakorlatok. Tartalomjegyzék

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "Java gyakorlatok. Tartalomjegyzék"

Átírás

1 Készítette: Subecz Zoltán, GAMF oktatási anyag felhasználásával Neumann János Egyetem, GAMF Informatikai és Műszaki Kar, Informatika tanszék Java gyakorlatok Tartalomjegyzék 1. gyakorlat Bevezetés Bevezető feladatok gyakorlat Bevezető feladatok Metódusok, fájlkezelés, adatszerkezetek gyakorlat Objektum orientált programozás gyakorlat - Objektum orientált programozás -2 metódus láncolás, Öröklődés, abstract osztály, equals(), compareto() gyakorlat - Objektum orientált programozás, Interfész, tömbök, gyűjtemények gyakorlat - Objektum orientált programozás, gyűjtemények folytatás, Generikus típus gyakorlat 1. ZH gyakorlat - Comparator használata, fájlkezelés részletesen gyakorlat - Szálkezelés, Lambda kifejezések, Stream, időkezelés gyakorlat Adatbázis-kezelés - JDBC gyakorlat - A - Adatbázis-kezelés gyakorlat - B - Java keretrendszerek - Java frameworks - Spring MVC, Hibernate, Struts, Jsf, Vaadin, Google Web Toolkit, Grails gyakorlat 2. ZH

2 1. gyakorlat Bevezetés Bevezető feladatok Már több tantárgynál tanultak programozást. Itt azokat az ismereteket felhasználjuk. A Java sok szempontból hasonlít a C nyelvhez, így az ott tanult ismereteket jól lehet alkalmazni. Ajánlott irodalom: - Nagy Gusztáv: - Nagy Gusztáv: - Angster Erzsébet: Objektumorientált tervezés és programozás, JAVA, 1-2. kötet - Spell, B.: Pro Java 8 Programming, Apress, ThirdEdition, California, Gyakorlati zh: első zh: 7. héten második zh: utolsó előtti (12.) héten 60 perc, 30 pont zh-ként a két gyakorlati zh-ból kell összesen 50%-ot teljesíteni zh-hoz nem használhatnak semmit csak a fejlesztőkörnyezetben található help-et pótlás az utolsó héten, ahol a zh 60 pontos (első és második anyagrészt is tartalmazza) Előadás zh: 40 pont 50%-ot kell teljesíteni 10. héten lesz az első, pótlás az utolsó héten teszt és kifejtős kérdések lesznek benne elméleti kérdéssor ki lesz adva, amiből a zh kérdések lesznek válogatva A következő fejlesztőkörnyezeteket használjuk: Eclipse, Netbeans. Én a feladatokat Eclipse-ben mutatom be az órán. Nem kötelező ezeket használni. Más fejlesztő környezetet is használhatnak, ami a gépen van, órai munkára és a Zh-n is. pl. NotePad++, Komodo edit, Eclipse: nem kell telepíteni! Zip fájlból kell csak egy mappába bemásolni. =>DownloadPackages =>Eclipse IDE for Java Developers Jobb, ha a ZIP fájlt töltik le, mert az EXE használatakor hibák jelentkeznek egyes gépeken. Netbeans: Kezdés Eclipse-ben: - Mappa készítése: pl. c:\eclipse-feladat vagy egy saját hálózati mappa, ami kikapcsolás után sem törlődik le - Eclipse indítása - Workspace megadása: Browse: c:\eclipse-feladat - File menü / New / Java Project Projectname: pl. Elso =>Finish - File menü / New /Package (nem kötelező, de nagy alkalmazásoknál hasznos) Name: pl. csomag1-2 -

3 - File menü / New /Class Name: pl. Foprogram publicvoidstatic main. legyen bejelölve - Kódkiegészítés beállítása ha szükséges Window /Preferences / Java / Editor / ContentAssist Autoactivationtriggersfor Java:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ Ha ez jelentősen lassítja az Eclipse használatát: Autoactivationdelay: 0-nál nagyobbra állítani. - A "{" karakter billentyűjét (Ctrl-Alt-B) lefoglalták más funkcióra. Ennek törlése: Window / Preferences / General / Keys Binding-nélCtrl-Alt-B kiválasztása / UnbindCommand A feladatokhoz több jó megoldás is lehetséges

4 Bevezető feladatok Néhány egyszerű feladat a Java szintaktikájának a megismeréséhez. 1.1 feladat Hozzon létre 4 változót, ebben a sorrendben: egész, hosszú egész, valós és byte! A változóknak adjon tetszőleges kezdőértéket is! Ugyanilyen sorrendben írja is ki a változók értékét! Keressük meg az elkészített.java és.class fájlokat. Új osztály létrehozása Eclipse-ben: New Java Class gomb, vagy File menü / New / Class Feladat.java package csomag1; public class Feladat { public static void main(string[] args) { int a = 3; long b = ; double c = 3.67; byte d = 110; System.out.println("a=" + a +" b=" + b + " c=" + c + " d=" + d); A kiíratást így is írhatjuk: System.out.println(String.format("a=%d b=%d c=%.2f d=%d",a,b,c,d)); vagy a paraméterek sorszámozásával: System.out.println(String.format("a=%1d b=%2d c=%3.2f d=%4d",a,b,c,d)); Ha rövidíteni szeretnénk ezt: System.out.println() A, Ezt érdemes használni: Eclipse-ben ha beírjuk, hogy sysout majd: Ctrl-Space => kiegészíti: System.out.println(); A sysout nál kevesebbet is írhatunk pl. syso de ebben az esetben válaaztanunk kell a felkínált lehetőségek közül. B, Ha az osztály elé ezt beírjuk: import static java.lang.system.out; akkor a System.out.println( ) helyett ez is elég: out.println( ) C, Létrehozunk egy PrintStream példányt PrintStream out = System.out; akkor a System.out.println( ) helyett ez is elég: out.println( ) D, Készítünk egy metódust az osztályon belül: static <T> void println(t arg) { System.out.println(arg); - 4 -

5 akkor a System.out.println( ) helyett ez is elég: println( ) 1.2 feladat Hozzon létre egy-egy változót a neve életkora szemüvegessége (igen vagy nem) magassága tárolására Használjon beszédes változóneveket! Adjon értékeket a változóknak! Amelyik változónál van értelme, állítsa véglegesre. Írassa ki a változók értékeit egy kis magyarázattal együtt! package csomag1; public class Feladat { public static void main(string[] args) { final String nev = "Kovács Ferenc"; int eletkor = 35; boolean szemuveges = true; double magassag = 178.5; System.out.println("nev=" + nev + " életkor=" + eletkor + " szemüveges=" + zemuveges + " magasság=" + magassag); 1.3 feladat Hozzon létre két egész változót tetszőleges értékkel. Hozzon létre egy logikai változót, amely igaz, ha két egész egyenlő, és hamis különben. Írassa ki a logikai változó értékét. package csomag1; public class Feladat { public static void main(string[] args) { int a=5, b=3; boolean egyenlo = a==b; System.out.println("Egyenlő-e a két változó?: " + egyenlo); 1.4 feladat Olvasson be a billentyűzetről egy pozitív egész értéket. A program állapítsa meg a szám jegyeinek számát! a, megoldás: package csomag1; - 5 -

6 import java.util.scanner; // Ezt nem kell magunknak beírni, az Eclipse beírja public class Feladat { public static void main(string[] args) { Scanner olvas = new Scanner(System.in); System.out.println("Adjon meg egy egész számot:"); int szam = olvas.nextint(); System.out.println("A számjegyek száma: " + Integer.toString(szam).length()); Scanner: jó billentyűzetről és fájlból való beolvasásra is. b, megoldás: Integer szam = olvas.nextint(); System.out.println("A számjegyek száma: " + szam.tostring().length()); int: primitív adattípus Integer: objektum. Az objektumoknak van tostring() metódusa c, megoldás: ciklussal int jegyekszáma = 0; // ékezetesváltozóneveket is használhatunk while (szam> 0) { jegyekszáma++; szam /= 10; //szam = szam / 10; System.out.println(jegyekSzáma + " jegyű"); 1.5 feladat Olvasson be két egész számot. Számítsa ki két szám legnagyobb közös osztóját. Például: lnko(12, 18) = 6, lnko(10, 5) = 5 a, megoldás, for ciklussal: package csomag1; import java.util.scanner; public class Feladat { public static void main(string[] args) { Scanner olvas = new Scanner(System.in); System.out.println("Adjon meg egy egész számot:"); int szám1 = olvas.nextint(); System.out.println("Adjon meg még egy egészet:"); int szám2 = olvas.nextint(); int lnko; - 6 -

7 for(lnko=math.min(szám1, szám2);lnko>0;lnko--) if(szám1%lnko == 0 && szám2%lnko == 0) break; System.out.println("Legnagyobb közös osztójuk="+lnko); b, megoldás, while ciklussal: lnko=math.min(szám1, szám2); while(szám1%lnko!= 0 szám2%lnko!= 0) lnko--; System.out.println("Legnagyobb közös osztójuk=" + lnko); c, megoldás: Euklideszi algoritmussal A két szám közül nézzük meg, melyik a nagyobb, és abból vonjuk ki a kisebbet. Ezt addig ismételjük, amíg a két szám egyenlő nem lesz. Ekkor megkapjuk a keresett lnko-t. while(szám1!= szám2){ if(szám1>szám2) szám1 -= szám2; else szám2 -= szám1; System.out.println("Legnagyobb közös osztójuk="+szám1); 1.6 feladat Olvasson be három valós számot. Döntse el a három számról, hogy mennyi a legnagyobb érték. Csak 3 változó és elágazások használhatók! package csomag1; import java.util.scanner; public class Feladat { public static void main(string[] args) { Scanner olvas = new Scanner(System.in); System.out.println("Adjon meg három számot:"); System.out.println("a="); double a = olvas.nextdouble(); System.out.println("b="); double b = olvas.nextdouble(); System.out.println("c="); double c = olvas.nextdouble(); System.out.print("Legnagyobb="); if(a>=b && a>=c) System.out.println(a); else { if (b>= c && b>= a) System.out.println(b); else System.out.println(c); - 7 -

8 1.7 feladat Olvasson be egy egész számot. Írjon programot, mely megmondja a számról, hogy prím-e. a. megoldás: package csomag1; public class Feladat { public static void main(string[] args) { Scanner olvas = new Scanner(System.in); System.out.println("Adjon meg egy számot:"); System.out.println("a="); int a = olvas.nextint(); boolean prim=true; // Elég a szám gyökéig elmenni for(int b=2; b<= (int) Math.sqrt(a); b++) // típuskényszerítés itt: tizedes részt levágja if(a%b==0){ prim=false; break; if(prim) System.out.println("Prím"); else System.out.println("Nem prím"); b. megoldás: A logikai változó nélkül. Itt is a szám gyökéig megy el. int b = 2; for (; b * b<= a; b++) if (a % b == 0) { System.out.println("Nem prím"); break; if (b * b>a) System.out.println("Prím"); 1.8 feladat Írja ki egy szöveges változó összes 3 betűs szeletét a substring metódus segítségével! Pl. "körte" esetén: kör örtrte package csomag1; - 8 -

9 public class Feladat { public static void main(string[] args) { String str="körte"; for(int i=0; i<str.length()-2; i++) System.out.println(str.substring(i, i+3)); 1.9 feladat A lehető legkevesebb objektumpéldány létrehozásával állítson elő egy olyan String objektumot, amely az angol abc betűit tartalmazza. (Ciklusban növeljen egy változót a következő karakterrel.) A String a Java nyelvben megváltozhatatlan. Ha már egyszer értéket kapott, akkor nem lehet megváltoztatni. Ha meg akarom változtatni, akkor egy új string változót hoz létre a memóriában. Ezért helyette a StringBuilder osztályt használjuk ilyen feladatra. package csomag1; public class Feladat { public static void main(string[] args) { StringBuilder sb = new StringBuilder(); for (char c = 'a'; c<= 'z'; c++) sb.append(c); for (char c = 'A'; c<= 'Z'; c++) sb.append(c); String str = sb.tostring(); System.out.println(str); 1.10 feladat Olvasson be a billentyűzetről egy szöveget (String). Számolja meg a szöveges változó szavainak számát. A szavakat a szóközök választják el egymástól. package csomag1; import java.util.scanner; public class Feladat { public static void main(string[] args) { System.out.println("Írjon be egy szöveget!"); Scanner olvas = new Scanner(System.in); String str = olvas.nextline(); String[] strtomb = str.split(" "); System.out.println("A szöveg szavainak a száma="+strtomb.length); - 9 -

10 Az utolsó három sor egy sorban megvalósítva: out.println("a szöveg szavainak a száma="+olvas.nextline().split(" ").length);

11 2. gyakorlat Bevezető feladatok Metódusok, fájlkezelés, adatszerkezetek További néhány egyszerű feladat a Java szintaktikájának a megismeréséhez. Metódusok, fájlkezelés, Adatszerkezetek: tömb, lista, halmaz, map A feladatoknál használjon több metódust is. 2.1 feladat Fájl és szövegfeldolgozás Egy számok.txt szövegfájlban van 10 égész szám egymás alatt. A forrásfájlt másolja abba a mappába, ahol az src és a bin mappa is van. Olvassa be a számokat egy tömbbe. Írja vissza a számokat a képernyőre és egy másik fájlba is egymás mellé szóközzel elválasztva. Számítsa ki az átlagot és írassa ki a képernyőre. a, megoldás Feladat.java package csomag1; import java.io.file; import java.io.filenotfoundexception; import java.io.printwriter; import java.util.scanner; public class Feladat { static void Megold() throws FileNotFoundException{ // throws FileNotFoundException: Ezt nem kell magunknak beírni, az Eclipse beírja Scanner olvas = new Scanner(new File("számok.txt")); int[] tomb = new int[10]; int i=0; while(olvas.hasnext()) tomb[i++] = Integer.parseInt(olvas.nextLine()); int összeg=0; PrintWriter kiir = new PrintWriter("számok2.txt"); for(i=0;i<10;i++){ System.out.print(tomb[i]+" "); kiir.print(tomb[i]+" "); összeg += tomb[i]; //összeg = összeg+tomb[i]; kiir.close(); System.out.println("\nA számok átlaga="+összeg/10.0); public static void main(string[] args) throws FileNotFoundException { Megold(); static: az osztály saját változója, metódusa. Az osztály példányosítása nélkül is elérhető. Minden osztály példánynál megegyezik. Érdemes már kezdő osztályt (itt: Feladat) példányosítani. Ilyenkor csak a main( ) metódusnál kell a static:

12 b, megoldás az osztály példányosításával. package csomag1; import java.io.file; import java.io.filenotfoundexception; import java.io.printwriter; import java.util.scanner; public class Feladat { Feladat() throws FileNotFoundException{ Megold(); void Megold() throws FileNotFoundException{ Scanner olvas = new Scanner(new File("számok.txt")); int[] tomb = new int[10]; String sor; int i=0; while(olvas.hasnext()) tomb[i++] = Integer.parseInt(olvas.nextLine()); int összeg=0; PrintWriter kiir = new PrintWriter("számok2.txt"); for(i=0;i<10;i++){ System.out.print(tomb[i]+" "); kiir.print(tomb[i]+" "); összeg += tomb[i]; //összeg = összeg+tomb[i]; kiir.close(); System.out.println("\nA számok átlaga="+összeg/10.0); public static void main(string[] args) throws FileNotFoundException { Feladat feladat = new Feladat(); Itt a Feladat() metódus a Feladat osztály konstruktora. 2.2 feladat Fájl és szövegfeldolgozás Az adatok.dat fájlban egészek vannak egymás alatt. Lehetnek köztük azonosak is. Írassa ki az egyedi elemeket és azok darabszámát. Set: halmaz. Mint a matematikai halmazban, egy elem csak egyszer szerepel. Több fajta Set van. Ezek közül egyik a HashSet. Az belső u.n. hash tábla segítségével gyorsan lehet vele műveleteket végrehajtani. package csomag1; import java.io.file; import java.io.filenotfoundexception; import java.util.hashset; import java.util.scanner;

13 import java.util.set; public class Feladat { Feladat() throws FileNotFoundException{ Megold(); void Megold() throws FileNotFoundException{ Scanner olvas = new Scanner(new File("adatok.dat")); Set<Integer>halmaz = new HashSet<Integer>(); // Így is jó: Set<Integer>halmaz = new HashSet<>(); while(olvas.hasnext()) halmaz.add(integer.parseint(olvas.nextline())); for(int szam:halmaz) System.out.println(szam); System.out.println("Az egyedi elemek száma="+halmaz.size()); public static void main(string[] args) throws FileNotFoundException { Feladat feladat = new Feladat(); 2.3 feladat Fájl és szövegfeldolgozás A számok.txt fájlban valós számok vannak egymás alatt. A számok beolvasása után határozza meg azok minimumát és írassa ki. Írassa ki a számokat fordított sorrendben egymás mellé a képernyőre. Mivel itt lehetnek azonos számok, azért nem érdemes halmazban tárolni azokat. Tömbben sem lenne érdemes tárolni, mert nem tudjuk, hogy hány szám van a fájlban. A lista jó lesz, mert bármikor új elemet adhatunk hozzá. List: lista. Több fajta lista van. Ezek egyike az ArrayList package csomag1; import java.io.file; import java.io.filenotfoundexception; import java.util.arraylist; import java.util.collections; import java.util.list; import java.util.scanner; public class Feladat { Feladat() throws FileNotFoundException{ Megold(); void Megold() throws FileNotFoundException{ Scanner olvas = new Scanner(new File("adatok.dat")); List<Double> lista = new ArrayList<>(); while(olvas.hasnext()) lista.add(double.parsedouble(olvas.nextline())); System.out.println("A lista legkisebb száma="+collections.min(lista)); // ciklussal is meghatározhatnánk

14 System.out.println("A lista elemei fordított sorrendben:"); for(int i=lista.size()-1;i>=0;i--) System.out.print(lista.get(i)+" "); public static void main(string[] args) throws FileNotFoundException { Feladat feladat = new Feladat(); 2.4 feladat Fájl és szövegfeldolgozás Dolgozatok eredményéről statisztikát kell készíteni. Az eredményeket(egészek) a jegyek.txt fájlban tároljuk egymás alatt. Készítsen programot, amely összeszámolja az 1-es, 2-es stb. dolgozatokat. Megszámolja a jegyeket és kiszámolja azok átlagát. Az eredményeket kiírja a képernyőre. Map: kulcs-érték párokat tartalmaz. A Map nem tud tárolni duplikált kulcsokat, egy kulcshoz csak egy érték rendelhető. HashMap: A Map-nak több fajtája lehet. Ezek közül az egyik a HashMap. Mint a HashSet-nél gyors elérést tesz lehetővé egy belső hash-tábla segítségével. package csomag1; import java.io.file; import java.io.filenotfoundexception; import java.util.hashmap; import java.util.map; import java.util.scanner; public class Feladat { Feladat() throws FileNotFoundException{ Megold(); void Megold() throws FileNotFoundException{ Scanner olvas = new Scanner(new File("jegyek.txt")); Map<Integer, Integer> jegyek = new HashMap<Integer, Integer>(); int jegy, összeg=0, db = 0; while(olvas.hasnextline()){ jegy = Integer.parseInt(olvas.nextLine()); összeg += jegy; db++; if(!jegyek.containskey(jegy)) jegyek.put(jegy, 1); else jegyek.put(jegy, jegyek.get(jegy)+1); System.out.println("Jegyek és azok darabszáma: "+jegyek); System.out.println("Két oszlopban:"); for(int j:jegyek.keyset()) System.out.println(j+"\t"+jegyek.get(j)); System.out.println("Jegyek átlaga= "+1.0*összeg/db);

15 public static void main(string[] args) throws FileNotFoundException { Feladat feladat = new Feladat(); 2.5 feladat Fájl és szövegfeldolgozás Egy cégnél a csoportok egy raktárban adják le az adott nap elkészített termékeiket. Nem minden csoport dolgozik minden nap. Egy szövegfájlban (csoportok.txt) két oszlopban tároljuk a csoportok által leadott termékék számát. A két oszlopot tabulátor választja el egymástól. Első oszlop a csoport azonosítója (szöveg), második oszlop a termékek száma (egész). A szövegfájl adatait feldolgozva írassa ki, hogy az adott időszakban: - hány csoport adott le terméket - melyik csoport hány terméket adott le (két oszlopban) Ezt a kiíratást három formában adja meg: - rendezés nélkül - A csoportok neve szerint csökkenő sorrendben - A leadott termékek szerint növekvő sorrendben - melyik csoport adta le a harmadik legtöbb terméket? package csomag1; import java.io.file; import java.io.filenotfoundexception; import java.util.hashmap; import java.util.map; import java.util.scanner; import java.util.set; import java.util.treemap; import java.util.treeset; public class Feladat { Feladat() throws FileNotFoundException{ Megold(); void Megold() throws FileNotFoundException{ Scanner olvas = new Scanner(new File("csoportok.txt")); Map<String, Integer> csoportok = new HashMap<String, Integer>(); String sor; String csoport; int db; while(olvas.hasnextline()){ sor = olvas.nextline(); csoport = sor.split("\t")[0]; db = Integer.parseInt(sor.split("\t")[1]); if(!csoportok.containskey(csoport)) csoportok.put(csoport, db); else csoportok.put(csoport, csoportok.get(csoport)+db); System.out.println("Csoportok száma="+csoportok.keyset().size()); System.out.println("Nem rendezve:"); for(string csop:csoportok.keyset())

16 System.out.println(csop+"\t"+csoportok.get(csop)); System.out.println(); //Helyfoglalás szempontjából nem ez a legjobb megoldás. Lásd CompareTo következő fejezet. // De ez egyszerűbb. Kisebb adathalmazokra elég. System.out.println("Csoportok szerint rendezve:"); Map<String, Integer> csoportok2 = new TreeMap<String, Integer>(csoportok); for(string csop:csoportok2.keyset()) System.out.println(csop+"\t"+csoportok2.get(csop)); System.out.println(); System.out.println("Darabszámok szerint rendezve:"); Set<Integer> dbrendezett = new TreeSet<Integer>(csoportok.values()); for(int darab:dbrendezett) for(string csop:csoportok.keyset()) if(csoportok.get(csop) == darab) System.out.println(csop+"\t"+csoportok.get(csop)); System.out.println(); public static void main(string[] args) throws FileNotFoundException { Feladat feladat = new Feladat(); 2.6 feladat List-ben, Set-ben, Map-ban tudunk tárolni különböző típusú adatokat is. Ez azonban biztonsági kockázatot jelent. Jobb tudni biztosan, hogy milyen típusú adatot tárolunk egy adott adatszerkezetben. package csomag1; import java.util.arraylist; import java.util.hashmap; import java.util.hashset; import java.util.list; import java.util.map; import java.util.set; public class Feladat { public static void main(string[] args) { List lista = new ArrayList(); lista.add(5); lista.add("szöveg"); System.out.println(lista); System.out.println((int)lista.get(0)*2); // Kell az (int), mert Object-ként tárolja Set halmaz = new HashSet(); halmaz.add(5); halmaz.add("szöveg"); System.out.println(halmaz.contains(5)); System.out.println(halmaz.contains("szöveg")); Map map = new HashMap(); map.put("szám", 5); map.put("szöv", "szöveg"); map.put(10, 30); map.put(20, "szöveg2"); System.out.println(map); for(object o: map.keyset()) System.out.println(map.get(o));

17 System.out.println(map.get("szöv")); System.out.println((int)map.get("szám")*2); System.out.println((int)map.get(10)*2);

18 3. gyakorlat Objektum orientált programozás Objektum orientált programozáshoz feladatok. Építünk arra, amit más trárgyakból már tanultak az Objektum orientált programozásról és az előadás anyagára. Azokat ismertnek vesszük. 3.1 feladat Készítsünk egy osztályt (main metódus!), amiben kiírunk egy szöveget. Egy másik osztályban példányosítjuk azt. Írjuk itt még a két osztályt egy.java fájlba. Foprogram.java package mappa1; class Osztály2{ public void Kiir(){ System.out.println("Hello"); public class Foprogram { public static void main(string args[]){ Osztály2 osztály2 = new Osztály2(); osztály2.kiir(); new Osztály2().Kiir(); Ha egy.java fájlba írhjuk a két osztályt, akkor nem lehet mind a két osztály public. A.java fájl neve lehet itt Foprogram.java vagy Osztály2.java is. Az az osztály amelyiknek a neve megegyezik a.java fájl nevével az lehet public, a másiknál ne írjuk oda, hogy public. (A másiknál sem fontos odaírni.) B megoldás A metódust a példányosításkor is megírhatjuk. Foprogram.java package mappa1; class Osztály2{ public class Foprogram { public static void main(string args[]){ new Osztály2(){ public void Kiir(){ System.out.println("Hello");.Kiir();

19 C megoldás Beágyazott osztállyal. Nem javasolt, mert könnyű nehezen olvashatóvá, bonyolultá tenni a programunkat vele. Foprogram.java package mappa1; public class Foprogram { public static void main(string args[]){ class Osztály2{ public void Kiir(){ System.out.println("Hello"); Osztály2 osztály2 = new Osztály2(); osztály2.kiir(); A B megoldás elvét beágyazott osztállyal is meg tudjuk csinálni feladat Film Készítsen egy Film osztályt, amely egy film cím, hossz (percekben) adatait tartalmazza. Lehet inicializálni (konstruktor), megadva ezeket az adatokat. Meg lehessen adni az adatokat külön-külön is. Ha a megadott cím egy üres String, akkor a cím legyen "Ismeretlen". Ha a megadott hossz negatív, akkor a hossz legyen 0. Meg lehet kapni az adatait egy Stringben (cím,hossz perc) alakban. Készítsen egy futtatható osztályt(main metódus!), amelyben az előző osztály próbájaként létrehoz 5 filmobjektumot.írassa ki a filmek adatait. Keresse meg a leghosszabb filmet és adja meg. Az osztályokat lehet egy fájlba is írni, vagy külön-külön fájlokba. Nagyobb programnál, ami több osztályt tartalmaz jobb minden osztályt külön fájlba írni. A fájl neve és az osztály neve megegyezik. Például a Film osztály a Film.java fájlban Ezzel olyan metódust jelzünk, amely a metódus egyik ősosztályának egyik metódusát írja felül. Ebben az esetben a fordítóprogram ellenőrzi, hogy az ősosztály tartalmazza-e a metódust. Amennyiben nem, akkor hibajelzést küld. Vagyis a program e nélkül is lefut. A felüldefiniált függvények elé írjuk oda annotációt, és segít a compilernek kiszűrni az elgépelésből adódó problémákat fordítási időben. Az Object osztálynak is van tostring metódusa. Ha egy osztályban írunk egy tostring metódust, akkor felülírjuk ezt a metódust. annotációval jelezzük a fordítónak, hogy valóban ezt akarjuk csinálni, nem véletlenül adtuk ezt a nevet. Ha elírjuk véletlenül a tostring nevet, akkor a fordító hibaüzenetet küld. Az Object osztály minden osztály közös őse, az osztályhierarchia tetején áll. Minden osztály közvetlen vagy közvetett módon utódja az Object osztálynak, így minden osztály rendelkezik az

20 Object osztály metódusaival. Vannak más Java annotációk is. Az jellel kezdődik, majd ehhez kapcsolódik a neve.az annotációk a programkód elemeihez rendelhetők, plusz információt hordoznak a Java fordító ill. speciális eszközök számára. Film.java package mappa1; public class Film { private String cím; private int hossz; public Film(String cím, int hossz) { // A Film osztály konstruktora // Ha a megadott cím üres string if (cím.length() == 0) this.cím = "Ismeretlen"; else this.cím = cím; // ha amegadott hossz negatív if (hossz< 0) this.hossz = 0; else this.hossz = hossz; // A cím megadása public void címe(string cím) { if (cím.length() == 0) this.cím = "Ismeretlen"; else this.cím = cím; // A hossz megadása public void hossza(int hossz) { if (hossz< 0) this.hossz = 0; else this.hossz = // Az osztály szöveges jellemzése (cím, hossz, perc) alakban public String tostring() { return"(" + cím + ", " + hossz + " perc)"; //A cím lekérdezése public String cím() { return cím; //A hossz lekérdezése public int hossz() { return hossz;

21 Feladat. java package mappa1; public class Feladat { // A Feladat osztály konstruktora Feladat(){ Megold(); void Megold(){ Film[] filmek = { // Az 5 Film példány létrehozása new Film("Saul fia", 123), new Film("Garfield", 69), new Film("Óz", 144), new Film("Gyűrűk Ura 3", 201), new Film("Hobbit 1", 211) ; // Értékadás tesztelése, új adatok megadása filmek[2].címe("óz, a csodák csodája"); filmek[1].hossza(79); // filmek adatainak kiíratása for (Film film : filmek) System.out.println(film); // leghosszabb film megkeresése és kiíratása Film leghosszabb = filmek[0]; for (Film film : filmek) if (film.hossz() >leghosszabb.hossz()) leghosszabb = film; System.out.println("A leghosszabb: " + leghosszabb); public static void main(string[] args){ // az osztály példányosítása Feladat feladat = new Feladat(); 3.3. feladat Tanuló Készítsen egy Tanuló osztályt, amely egy tanuló nevét és 10 jegyét tárolja. JEGYEKSZÁMA = 10: final, az osztály saját eleme(static). A 10 jegyet egy tömbben tároljuk. Jegyek tartománya: 0-5, azaz lehessen 0 is. LEGNAGYOBBJEGY = 5: final, az osztály saját eleme. (int LEGNAGYOBBJEGY = 5) Lehessen inicializálni megadva a tanuló nevét (a jegyeket nullával inicializálja). A Java lalpból 0-ra állítja Lehessen megadni a tanuló egy adott indexű jegyét. Ha az 0<= index<=jegyekszáma és 0<=jegy<=LEGNAGYOBBJEGY, akkor beírja a

22 jegyet, különben nem. A metódus visszatérési értéke legyen igaz, ha beírta a jegyet, különben hamis. Lehessen megkapni a jegyek számát. (nem nulla jegyek száma) Lehessen meghatározni a tanuló átlagát csak a nem nulla jegyeket figyelembe véve. Lehessen megkapni a tanuló jegyeit egy String-ben szóközzel elválasztva Lehessen stringben megkapni a tanuló nevét, jegyeinek számát, jegyeit és átlagát. Lehessen megkapni a tanuló egy adott jegyét Készítsen egy futtatható osztályt, amelyben létrehoz két tanulót beolvasva a nevüket a billentyűzetről ésvéletlenszerűen generálja a jegyeiket.majd írja ki mindkéttanuló adatait és hogy melyiknek jobb az átlaga. Tanuló.java package mappa1; public class Tanuló { private static final int JEGYEKSZÁMA = 10; private String név; private final int[] jegyek = new int[jegyekszáma]; private static final int LEGNAGYOBBJEGY = 5; // Tanuló osztály konstruktora public Tanuló(String név) { this.név = név; // adott indexű jegy beírása public boolean jegyetad(int hova, int mit) { // csak 0.. LEGNAGYOBBJEGY értékű jegyet fogad el. if (hova>= 0 && hova<jegyekszáma && mit>= 0 && mit<= LEGNAGYOBBJEGY) { jegyek[hova] = mit; return true; return false; // Nem 0 értékű jegyek számának megadása public int jegyekszáma() { int jegyekszáma = 0; for (int jegy: jegyek) if (jegy> 0) jegyekszáma++; return jegyekszáma; // Átlag kiszámítása a nem 0 értékű jegyekre public double átlag() { int jegyekszáma = 0; double összeg = 0.0; for (int jegy: jegyek) if (jegy> 0) { jegyekszáma++; összeg += jegy; if(jegyekszáma>0) return összeg / jegyekszáma; else

23 return 0; // Az osztály jellemzése egy public String tostring() { return "(" + név + ", jegyek száma: " + jegyekszáma() + " jegyei: " +jegyek() + ", átlaga: " + átlag() + ')'; // egy adott indexű jegy lekérdezése int adottjegy(int hányadik){ return jegyek[hányadik]; // jegyek megadása egy string-ben szóközzel elválasztva String jegyek(){ String str=""; for(int jegy: jegyek) str +=jegy+" "; return str; Feladat.java package mappa1; import java.util.random; import java.util.scanner; public class Feladat { // Feladat osztály konstruktora Feladat(){ Megold(); void Megold(){ Scanner beolv = new Scanner(System.in); // A két Tanuló példány létrehozása neveik beírásával System.out.println("Adja meg az első tanuló nevét"); Tanuló t1 = new Tanuló(beolv.nextLine()); System.out.println("Adja meg a második tanuló nevét"); Tanuló t2 = new Tanuló(beolv.nextLine()); // A két tanulónak véletlenszerűen generálja a jegyeit. Random vel = new Random(); for(int i=0;i<10;i++){ t1.jegyetad(i, vel.nextint(6)); t2.jegyetad(i, vel.nextint(6)); // a két tanuló adatainak kiíratása System.out.println("Első tanuló: "+t1); System.out.println("Második tanuló: "+t2); // kiírja melyiknek nagyobb az átlaga if(t1.átlag()>=t2.átlag()) System.out.println("Az első átlaga nagyobb"); else System.out.println("A második átlaga nagyobb");

24 public static void main(string[] args){ Feladat feladat = new Feladat();

25 4. gyakorlat - Objektum orientált programozás -2 metódus láncolás, Öröklődés, abstract osztály, equals(), compareto() 4.1. feladat Komplex számok Készítsen egy Komplex számokat reprezentáló osztályt. 1. Lehessen inicializálni a valós (és a képzetes) rész megadásával (1 és két paramétereskonstruktor) Alapesetben a képzetes rész = 0 2. Lehessen stringben megkapni a komplex számot valós+képzetes*i alakban (tostringmetódus) Például: 5+3*i 3. Lehessen megnövelni a komplex számot egy másik komplex számmal (hozzáad metódus, pl.a.hozzáad(b); hatására a értéke b értékével nő.) Lehessen láncolni ezt a műveletet! 4. Lehessen megnövelni a komplex számot egy valós számmal (hozzáad). Lehessen láncolni ezt a műveletet! 5. Lehessen összeadni a komplex számot egy másik komplex számmal (összead metódus, pl. a.összead(b); hatására a és b értéke ne változzon, hanem egy új objektum jöjjön létre.) 6. Lehessen összeadni a komplex számot egy valós számmal (összead, itt is egy új objektum jöjjön létre). Készítsen egy futtatható osztályt, amelyben az előző osztály kipróbálásaként létrehoz 10 véletlenszerűen generált valós és képzetes részű komplex számot. valós és képzetes rész is legyen a tartományban.majd kiírja őket, valamint az első kettő összegét. Próbálja ki a metódus-láncolást: Az első komplex számhoz adjon háromszor 5-öt. Ellenőrizze az eredményt. Metódus láncolás. Hasonlót eddig is csináltunk: osztaly.elso(): meghívja az adott osztály elso metódusát. Most ezt szeretnénk(láncolás): osztaly.elso().masodik(): meghívja az adott osztály elso metódusát, majd a masodik metódust Ehhez az kell, hogy az elso metódus ugyanazt az osztályt adja vissza. (return this) Komplex.java package mappa1; public class Komplex { private double valós; // képzetes rész alapesetben 0 private double képzetes = 0.0; // Két paraméteres konstruktor public Komplex(double valós, double képzetes) {

26 this.valós = valós; this.képzetes = képzetes; // Egy paraméteres konstruktor public Komplex(double valós) { this.valós = valós; // Az osztály jellemzése egy string-el. pl. 5+3*i public String tostring() { return"(" + valós + " + " + képzetes + "*i)"; // Komplex szám növelése egy másik komplex számmal. //Az eredeti komplex számot változtatja meg. Komplex hozzáad(komplex másik) { valós += másik.valós; képzetes += másik.képzetes; return this; // metódusláncolás // Komplex szám növelése egy valós számmal Komplex hozzáad(double másik) { valós += másik; return this; // metódusláncolás // két komplex szám összeadása. Egy új komplex szám lesz az eredmény Komplex összead(komplex másik) { return new Komplex(valós + másik.valós, képzetes + másik.képzetes); // Komplex szám összeadása egy valós számmal. Egy új komplex szám lesz az eredmény Komplex összead(double másik) { return new Komplex(valós + másik, képzetes); Foprogram.java import java.util.random; public class Foprogram { // A Foprogram osztály konstruktora Foprogram(){ Megold(); void Megold(){ // 10 komplex számhoz tömb létrehozása int dbkomplexek = 10; Komplex[] komplexek = new Komplex[dbKomplexek]; Random vel = new Random(); // 10 komplex szám létrehozása // a valós és a képzetes rész is közötti véletlen szám for(int i=0;i<dbkomplexek;i++) komplexek[i] = new Komplex(-10+vel.nextDouble()*20, - 10+vel.nextDouble()*20); // a komplexek kiíratása

27 for(komplex k:komplexek) System.out.println(k); // összeadja az első két komplex számot System.out.println("\nAz első két komplex szám összege:"); System.out.println(komplexek[0].összead(komplexek[1])); // metódusláncolás kipróbálása System.out.println("\nLáncolás:"); komplexek[0].hozzáad(5).hozzáad(5).hozzáad(5); System.out.println(komplexek[0]); public static void main(string[] args) { // A Foprogram példányosítása Foprogram fofoprogram = new Foprogram(); 4.2. feladat Öröklődés, abstract osztály Test Készítsünk megfelelő osztályhierarchiát a hasáb és a gömb felszínének és térfogatának reprezentálására. Közös ősosztályuk neve legyen Test (abstract). A Test osztály két abstract metódusa: felszín, térfogat. A testek jellemző adatai (élek, sugár - cm-ben megadva)egész típusúak legyenek, a számított értékek pedig double típusúak! Készítsük el a hasáb és a gömb osztályok konstruktorát. Írjuk felül a két leszármazott osztály tostring() metódusát úgy, hogy a példányaik adattagjai és a kétmetódusuk eredménye az alábbi formában jelenjenek meg (figyeljünk a Gömb osztálynál az 1 tizedeskerekítésre!): Hasáb (élei: 5, 10, 15 cm) Növekvő sorrendben! - felszíne 550 cm2 - térfogata 750 cm3 Gömb (sugara: 10 cm) - felszíne 1256,6 cm2 - térfogata 3141,6 cm3 Definiáljuk felül a Hasáb osztály equals() metódusát (lásd lentebb!) úgy, hogy két hasáb akkor legyen egyenlő,ha térfogatuk megegyezik. Tehát itt most nem kívánjuk meg az oldalak egyenlőségét. Definiáljuk felül a Gömb osztály equals() metódusát úgy, hogy két gömb csak akkor legyen egyenlő,ha sugaruk megegyezik. Adjunk meg tesztadatokat. Ellenőrizzük az equals() metódusok működését! Írassuk ki a hasáb és gömb objektumainkat. Egészítsük ki a gömb osztálynaka definícióját úgy, hogy példányaik - sugaruk nagysága alapján - összehasonlíthatók legyenek! (a rendezéshez kell: lásd köv. bekezdés) Vegyünk fel 7 gömböt egy tömbbe. Írassuk ki a feltöltés sorrendjében. Rendezzük a gömböket a sugár szerint növekvően. Így is írassuk ki a sorrendjüket. equals()

28 Két - azonos osztályhoz tartozó - objektum akkor egyenlő, ha az adattagjaik által reprezentált állapotuk megegyezik. Ezt összehasonlító operátorral nem tudjuk megállapítani, ugyanis a (<objektumnév1> == <objektumnév2>) logikai kifejezés az érintett objektumok mutatóját hasonlítja össze, ami természetesen csak akkor lesz azonos, ha egy objektumot önmagához hasonlítunk. Az equals() metódus viszont képes úgy összehasonlítani két objektumot, hogy az összehasonlítás alapját képező adattagok körét mi határozhatjuk meg a metódus felüldefiniálásával. Paraméterként itt egy másik java.lang.object típusú értéket kapunk. Emiatt már az nem biztos, hogy az értékek típusok szintén is megfelelnek egymásnak, ezért ilyenkor ezt is ellenőriznünk kell. Az Object osztálynak is van equals() metódusa. compareto() A Javás rendezések egyik alapja Comparable interface. A Comparable interface-t megvalósító osztályok nyilatkozni tudnak arról, hogy milyen szempont alapján hasonlíthatók össze egymással. Ha azt szeretnénk elérni, hogy egy osztály példányai valamely adattagjuk alapján összehasonlíthatók legyenek, akkor a compareto() metódust kell ehhez az osztályba implementálni. A metódus összehasonlítja az aktuális objektumot az átvett objektummal, és a visszatérési értéke attól függően, hogy az aktuális objektum kisebb, egyenlő, vagy nagyobb az átvettnél, rendre negatív egész, nulla ill. pozitív egész érték lesz. A compareto() metódust akkor érdemes - és kötelezően kell is - implementálni egy osztályba, ha célunk az osztály objektumainak sorba rendezése valamely adattagjuk alapján. Ilyenkor az osztálydefiníció fejrészét az implements Comparable utasítással kell kiegészíteni. Az Comparable interfésznek is van compareto() metódusa. public class NÉV implements Comparable<NÉV> NÉV: mindkét helyen ugyanaz kell álljon. Test.java //A két test ősosztálya. //Azért hozzuk létre, hogy a metódusokat meg kelljen valósítani a Hasáb és a Gömb osztályokban public abstract class Test { public abstract double felszín(); public abstract double térfogat(); Hasáb.java package mappa1; import java.util.arrays; //Hasáb osztály public class Hasáb extends Test{ private int a, b, c; // a hasáb élei //a Hasáb osztály konstruktora public Hasáb(int a, int b, int c) { //az oldalakat egy tömbbe is elhelyezzük, hogy növekvő sorrendben tudjuk tárolni. //A tostring-nél majd növekvő sorrendben kell kiíratni. (lásd: tostring()) int[] t = {a, b, c; Arrays.sort(t); //növekvő sorrenben olvassa ki: this.a = t[0]; this.b = t[1]; this.c = t[2]; //A Test osztály felszín() metódusát valósítja meg

29 @Override //ki kell majd számítani mindkét osztálynál public double felszín() { return 2 * (a * b + a * c + b * c); // a hasáb public double térfogat() { return a * b * c; // a hasáb //ki kell majd számítani mindkét osztálynál public String tostring() { //Növekvő sorrendben íratja ki az oldalakat, mert úgy tároltuk el azokat. //A megadott kiíratás szerint: return "Hasáb (élei: " + a + ", " + b + ", " + c + " cm)\n" + " felszíne " + felszín() + " cm2\n" + " térfogata " + térfogat() + " //Két hasáb egyenlőségének vizsgálata //akkor legexenek egyenlőek, ha térfogatuk megegyezik. public boolean equals(object obj) { //obj: egy másik hasábbal hasonlítja össze. //Lásd: if (getclass()!= obj.getclass()) return false; //itt nem lenne jó: (Hasáb obj). //Itt (Object obj) kell, mert felülírjuk az Object osztály equals metódusát. //Ott is így van: equals(object obj) // null érték esetén mindig hamis! if (obj == null) return false; // ha a kettő ugyanarra az objektumra hivatkozik a memóriában, akkor egyenlőek if (this == obj) return true; // Megnézzük, hogy a paraméterként kapott objektum a mi osztályunknak a példánya-e if (getclass()!= obj.getclass()) return false; // Létrehozunk egy Hasáb objektumot (az obj osztálya: Object) Hasáb other = (Hasáb) obj; if(this.térfogat()!=other.térfogat()) return false; return true; Gömb.java package mappa1; //Gömb osztály public class Gömb extends Test implements Comparable<Gömb>{ // implements Comparable<Gömb>: a compareto(gömb o) miatt kell //csak a sugár változót tartalmazza, mint tulajdonság private int sugár; //a Gömb osztály konstruktora public Gömb(int sugár) { this.sugár = sugár;

30 //A Test osztály felszín metódusát valósítja public double felszín() { return 4 * sugár * sugár * public double térfogat() { return 4 * sugár * sugár * sugár* Math.PI / 3; //a kívánalmak szerinti public String tostring() { return "Gömb (sugara: " + sugár + " cm)\n" + " felszíne " + felszín() + " cm2\n" + " térfogata " + térfogat() + " //a két gömb akkor egyenlő, ha a sugaruk megegyezik. //Lásd: if (this.sugár!= other.sugár).. public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass()) return false; Gömb other = (Gömb) obj; if (this.sugár!= other.sugár) return false; return //A két gömb összehasonlítása. A rendezéshez kell!! public int compareto(gömb o) { //a két sugár külömbségét adja eredményül return sugár - o.sugár; Foprogram.java package mappa1; import java.util.arrays; public class Foprogram { Foprogram(){ Megold(); void Megold(){ // 3 hasáb példány létrehozása Hasáb h1 = new Hasáb(2, 8, 4); Hasáb h2 = new Hasáb(1, 8, 8); Hasáb h3 = new Hasáb(2, 4, 15); // egyenlők-e? System.out.println(h1.equals(h2)); // h1=h2?

31 System.out.println(h1.equals(h3)); // h1=h3? System.out.println(h1); // kiíratja h1-et Gömb[] gömbök = { // 7 Gömb példány létrehozása new Gömb (3), new Gömb (5), new Gömb (6), new Gömb (2), new Gömb (1), new Gömb (4), new Gömb (3) ; // Kiíratás eredeti sorrendben: System.out.println("\n\nEredeti sorrend:"); for (Gömb gömb : gömbök) System.out.println(gömb); // Rendezi a gömböket. CompareTo metódust felhasználja Arrays.sort(gömbök); // Kiíratás rendezés után: System.out.println("Rendezés után:"); for (Gömb gömb : gömbök) System.out.println(gömb); public static void main(string[] args) { // Foprogram példány létrehozása Foprogram fofoprogram = new Foprogram(); 4.3 feladat Fájl és szövegfeldolgozás A számok.txt fájlban egész számok vannak egymás alatt. Ezeket kell beolvasni és feldolgozni. A példában minden tevékenységhez készítünk egy-egy osztályt. Egy nagyobb program is sok osztályból áll. Ez a módszer csökkenti a bonyolultságot és a nagyobb egységekre történő szétbontás áttekinthetőbbé teszi a programot. Készítse el a következő osztályokat: Foprogram: a main metódusban példányosítsa az osztályt. Elkészíti az Iranyito osztály példányát. Iranyito: Ez példányosítja a szükséges osztályokat és irányítja a feldolgozást. Adatok: Tartalmaz egy egész számokat tartalmazó listát. Egy-egy metódus a lista betöltésére és kiolvasására. Tartalmaz egy metódust, ami megadja a lista elemeinek az átlagát. Beolvas: Beolvassa a szövegfájlból az adatokat és betölti az Adatok osztály listájába. Az osztály konstruktorának bemeneti paramétere a szövegfájl neve és az Adatok példány. Feldolgozo: Változói: min, átlag metódusai: átlag: az Adatok osztály metódusával kiszámítja a lista elemeinek az átlagát. min: meghatározza a lista legkisebb elemét. getmin, getátlag Kiir: saját (static) metódusa: kiir: Kiírja a képernyőre a lista elemeit növekvő sorrendben egy sorba szóközzel elválasztva. Kiírja lista elemeinek az átlagát és a legkisebb elemet a Feldolgoz osztály segítségével. Az Irányító osztályból ezt a metódust példányosítás nélkül hívjuk meg. A fő lépések: beolvasás, feldolgozás, kiírás

32 Az osztályokat rakjuk funkciójuk alapján külön mappákba a következő formában: (A végén nézze meg a mappaszerkezetet.) src mappa1 Foprogram.java Iranyito.java adattar Adatok.java feldolg Feldolgozo.java io Beolvas.java Kiir.java Adatok.java package mappa1.adattar; import java.util.arraylist; import java.util.list; public class Adatok { // Adatok osztály private List<Integer> lista = new ArrayList<Integer>(); // lista betöltése (private!) public void setlista(list<integer> lista){ this.lista = lista; // lista kiolvasása (private!) public List<Integer> getlista(){ return lista; // elemek átlagának kiszámolása public double átlag(){ double összeg=0.0; for(int szam:lista) összeg += szam; return összeg/lista.size(); Beolvas.java package mappa1.io; import java.io.file; import java.io.filenotfoundexception; import java.util.arraylist; import java.util.list; import java.util.scanner; import mappa1.adattar.adatok;

33 public class Beolvas { // Beolvas osztály // Beolvasás // Adatok adatok: ebbe az osztályba olvassa ki public Beolvas(String fajlnev, Adatok adatok) throws FileNotFoundException{ Scanner beolvas = new Scanner(new File(fajlnev)); List<Integer>lista = new ArrayList<Integer>(); String sor; while(beolvas.hasnextline()){ sor = beolvas.nextline(); lista.add(integer.parseint(sor)); adatok.setlista(lista); Kiir.java package mappa1.io; import java.util.arraylist; import java.util.collections; import java.util.list; import feldolg.feldolgozo; import mappa1.adattar.adatok; // Kiíró osztály public class Kiir { // static: osztály saját metódusa: // nem kell példányosítani az osztályt, ha használni akarjuk a metódust. public static void kiir(adatok adatok, Feldolgozo feldolgozo){ List<Integer> lista = new ArrayList<Integer>(adatok.getLista()); Collections.sort(lista); System.out.println("A lista növekvő sorrendben: "); for(int szam:lista) System.out.print(szam+" "); System.out.println("\nA lista elemeinek átlaga= "+feldolgozo.getátlag()+" és minimuma= "+feldolgozo.getmin()); Feldolgozo.java package mappa1.feldolg; import java.util.collections; import mappa1.adattar.adatok; //Feldolgozó osztály public class Feldolgozo { private Adatok adatok; private double átlag; private int min; public void feldolgoz(adatok adatok){ this.adatok = adatok; átlag = átlag(); min = min(); double átlag(){

34 return adatok.átlag(); int min(){ return Collections.min(adatok.getLista()); public double getátlag(){ return átlag; public int getmin(){ return min; Iranyito.java package mappa1; import java.io.filenotfoundexception; import mappa1.adattar.adatok; import mappa1.feldolg.feldolgozo; import mappa1.io.beolvas; import mappa1.io.kiir; //Irányító osztály public class Iranyito { void iranyit() throws FileNotFoundException{ Adatok adatok = new Adatok(); // Adatok példány Beolvas beolvas = new Beolvas("számok.txt", adatok); // Beolvas példány Feldolgozo feldolgozo = new Feldolgozo(); // Feldolgozo példány feldolgozo.feldolgoz(adatok); Kiir.kiir(adatok, feldolgozo); // Kiir osztály kiir metódus Foprogram.java package mappa1; import java.io.filenotfoundexception; public class Foprogram { // Foprogram osztaly Foprogram() throws FileNotFoundException{ Megold(); // konstruktor void Megold() throws FileNotFoundException{ Iranyito iranyito = new Iranyito(); // Irányito példány létrehozása iranyito.iranyit(); public static void main(string[] args) throws FileNotFoundException { Foprogram fofoprogram = new Foprogram(); // Foprogram példány létrehozása

35 5 gyakorlat - Objektum orientált programozás, Interfész, tömbök, gyűjtemények Objektum orientált feladatok folytatás Tömbök, gyűjtemények. Minden faladatnál használjon több osztályt és metódusokat. 5.1 feladat Interfész használata. Készítsen egy interfészt SzamokInterfesz néven. Az interfész tartalmazza a következő metódusokat: Beolvas SzelsoKeres: visszatérési értéke egy egész szám Kiir Implementálja a Tomb és Lista osztályokat a SzamokInterfesz alapján. Tomb: Tartalmaz egy egészekből álló 5 elemű tömböt. A tömböt billentyűzetről beolvassa. SzelsoKeres: A tömb legkisebb elemét adja meg. Kiir: Kiírja a tömb elemeit a képernyőre. Lista: Tartalmaz egy egészekből álló listát. A listát fájlból olvassa be. SzelsoKeres: A lista legnagyobb elemét adja meg. Kiir: Kiírja a lista elemeit egy fájlba. Készítse el a következő osztályokat is: Feldolgoz: Konstruktora bemeneti paraméterként kapja a SzamokInterfesz interfészt. Meghívja egymás után a Beolvas és a Kiir metódusokat. Kiírja a tömb vagy lista adott szélső értékét a SzelsoKeres metódussal. Foprogr: A fő osztály. Példányosítja a Tomb és Lista osztályokat. Billentyűzetről beolvasással lehet választani a tomb és a lista módszerek közül. Létrehozza a Feldolgoz példányt a választás alapján a Tomb vagy a Lista példánnyal. Az osztályokhoz készítse el a következő mappaszerkezetet: mappa1 Foprogram.java adattár SzamokInterfesz.java Tomb.java Lista.java feldolgozó Feldolgoz.java File menü / New / Interface SzamokInterfesz.java

36 package mappa1; public interface SzamokInterfesz { public void Beolvas(); public int SzelsoKeres(); public void Kiir(); // Nem lehet benne az Interface szó Tomb.java package mappa1.adattár; import java.util.arrays; import java.util.collections; import java.util.scanner; // Tomb osztály: implementálja az interfészt public class Tomb implements SzamokInterfesz{ // egy tömbben tároljuk a számokat private Integer[] tomb = new Integer[5]; // Billentyűzetről beolvassa az 5 számot public void Beolvas(){ Scanner beolv = new Scanner(System.in); System.out.println("Adj meg 5 egész számot!"); for(int i=0;i<=4;i++){ System.out.print((i+1)+". elem="); tomb[i] = beolv.nextint(); // Megadja a tömb legkisebb elemét public int SzelsoKeres(){ return Collections.min(Arrays.asList(tomb)); // Kiírja a tömb elemeit public void Kiir(){ System.out.println("A tömb elmei:"); for(int szam:tomb) System.out.println(szam); Lista.java package mappa1.adattár; import java.io.file; import java.io.filenotfoundexception; import java.io.printwriter; import java.util.arraylist; import java.util.collections; import java.util.list; import java.util.scanner; // Lista osztály public class Lista implements SzamokInterfesz{ private List<Integer> lista = new ArrayList<Integer>(); public void Beolvas(){

37 Scanner beolvas = null; // Ha a try nélkül, a FileNotFoundException kivételt használjuk, akkor az beírja az interfészbe is. Ezért érdemes interfész használatnál a TRY-t használni try { beolvas = new Scanner(new File("számok.txt")); catch (FileNotFoundException e) { e.printstacktrace(); // Beolvassa fájlból az elemeket while(beolvas.hasnextline()) lista.add(integer.parseint(beolvas.nextline())); // Megyadja a legnagyobb elemet public int SzelsoKeres(){ return Collections.max(lista); // Kiírja a lista elemeit egy fájlba public void Kiir(){ PrintWriter kiir = null; try { kiir= new PrintWriter("szamokKi.txt"); catch (FileNotFoundException e) { e.printstacktrace(); kiir.println("a lista elmei:"); for(int szam:lista) kiir.println(szam); kiir.close(); Feldolgoz.java package mappa1.feldolgozó; import mappa1.adattár.szamokinterfesz; // Feldolgoz osztály public class Feldolgoz { // Paraméter lehet a tömn és a lista is! Bármi, ami implementálja az interfészt. public Feldolgoz(SzamokInterfesz szamok){ // Meghívja a metódusokat szamok.beolvas(); System.out.println("A számok egyik szélső értéke:"+szamok.szelsokeres()); szamok.kiir(); Foprogram.java package mappa1; import java.util.scanner; import mappa1.adattár.lista; import mappa1.adattár.tomb; import mappa1.feldolgozó.feldolgoz; // Fomprogram osztály

38 public class Foprogram { Foprogram() { int valaszt; Scanner beolv = new Scanner(System.in); // Kiválasztja a módszert System.out.println("Válassz! (1:tömb módszer, 2: lista módszer): "); valaszt = beolv.nextint(); Feldolgoz feldolgoz; Tomb tomb = new Tomb(); Lista lista = new Lista(); // A választás alapján a tomb-el, vagy a lista-val hozza létre a Feldolgoz példányt if(valaszt == 1) feldolgoz = new Feldolgoz(tomb); if(valaszt == 2) feldolgoz = new Feldolgoz(lista); public static void main(string[] args){ Foprogram fofoprogram = new Foprogram(); 5.2 feladat Fájl, szövegfeldolgozás Az adatok.txt fájlban egész számokat tárolunk több sorban. Minden sorban több szám lehet, egymástól szóközzel elválasztva. Az adatok beolvasása után írassa ki a képernyőre és a kimenet.txt fájlba: - sorok száma - számok átlaga - soronként a számok összege - legkisebb szám Alakítsa ki a következő mappaszerkezetet: mappa1 Foprogram.java adattár Tarolo.java feldolgozó Feldolgoz.java Tarolo.java package mappa1.adattár; import java.io.file; import java.io.filenotfoundexception; import java.util.arraylist; import java.util.list; import java.util.scanner; // Tarolo osztály az adatok tárolására + Beolvasás public class Tarolo { // Listát tartalmazó lista private List<List<Integer>> adatok = new ArrayList<List<Integer>>();

39 public void Beolvas(String fajlnev) throws FileNotFoundException{ Scanner beolvas = new Scanner(new File(fajlnev)); String[] stringtomb; List<Integer> szamok; String sor; while(beolvas.hasnextline()){ sor = beolvas.nextline(); // üres és csak szóközöket tartalmazó sorok nem kellenek if(!sor.trim().equals("")){ // Szóközök mentén daraboljuk a sort: stringtomb = sor.split(" "); szamok = new ArrayList<Integer>(); // Betöltjük a a sor számait egy listába for(string str:stringtomb) szamok.add(integer.parseint(str)); // A belső listát betöltjük a fő listába adatok.add(szamok); // A lista lekérése public List<List<Integer>> getadatok(){ return adatok; Feldolgoz.java package mappa1.feldolgozó; import java.io.filenotfoundexception; import java.io.printwriter; import java.util.arraylist; import java.util.collections; import java.util.list; // Feldolgoz osztály public class Feldolgoz { private Tarolo tarolo = new Tarolo(); public Feldolgoz() throws FileNotFoundException { // Az adatok beolvasása fájlból tarolo.beolvas("adatok.txt"); Feldolgozás(); void Feldolgozás() throws FileNotFoundException{ PrintWriter kiir = new PrintWriter("kimenet.txt "); List<List<Integer>> adatok = tarolo.getadatok(); // Sorok száma String szoveg = "Sorok száma ="+adatok.size(); String szoveg2="\nsorok összege:\n"; // monitorra és fájlba is kiírja System.out.println(szoveg); kiir.println(szoveg); double osszeg=0; int db=0, sorosszeg; List<Integer> legkisebbek = new ArrayList<Integer>(); // végig megy a sorokon for(list<integer> lista:adatok){ sorosszeg = 0; for(int szam:lista){

40 // számok összege: átlaghoz osszeg +=szam; // sorok összege sorosszeg += szam; // sorok összege egy string-ben szoveg2 += sorosszeg+"\n"; // összes darabszám: átlaghoz db += lista.size(); // soronként legkisebbek legkisebbek.add(collections.min(lista)); szoveg = "A számok átlaga="+(osszeg/db); // monitorra és fájlba is kiírja System.out.println(szoveg); kiir.println(szoveg); System.out.println(szoveg2); kiir.println(szoveg2); szoveg = "A legkisebb érték="+collections.min(legkisebbek); System.out.println(szoveg); kiir.println(szoveg); kiir.close(); Foprogram.java package mappa1; import java.io.filenotfoundexception; import mappa1.feldolgozó.feldolgoz; // Foprogram osztály public class Foprogram { Foprogram() throws FileNotFoundException { Feldolgoz feldolgoz = new Feldolgoz(); public static void main(string[] args) throws FileNotFoundException { Foprogram fofoprogram = new Foprogram(); 5.3 feladat HashSet, LinkedHashSet, TreeSet, ArrayList, LinkedList Az adatok.dat szövegfájlban sok egész szám van egymás alatt. Az adott feladatokhoz melyik adatszerkezetet használná? A számok között lehetnek azonosak is. Olvassa be a számokat. Oldja meg a feladatot a kiválasztott adatszerkezettel. a, Az azonosakat csak egyszer tárolja (Set). Írassa ki a számokat. A leggyorsabb (HashSet) módszert válassza. Választott adatszerkezet: HashSet package mappa1; import java.io.file; import java.io.filenotfoundexception; import java.util.hashset; import java.util.scanner;

41 import java.util.set; public class Foprogram { public static void main(string[] args) throws FileNotFoundException{ // HashSet: leggyorsabb: egy Hash táblával egy lépésben eléri a keresett elemet // // Set<Integer> szamok = new HashSet<Integer>(); Scanner beolvas = new Scanner(new File("adatok.dat")); while(beolvas.hasnextline()) szamok.add(integer.parseint(beolvas.nextline())); System.out.println(szamok); b, Az azonosakat csak egyszer tárolja (Set). Írassa ki a számokat a beolvasás sorrendjében (LinkedHashSet). Válaszott adatszerkezet: LinkedHashSet public class Foprogram { public static void main(string[] args) throws FileNotFoundException{ Set<Integer> szamok = new LinkedHashSet<Integer>(); Scanner beolvas = new Scanner(new File("adatok.dat")); while(beolvas.hasnextline()) szamok.add(integer.parseint(beolvas.nextline())); System.out.println(szamok); c, Az azonosakat csak egyszer tárolja (Set). Beolvasáskor rendezett sorrendben tárolja a számokat (TreeSet). A végén írassa ki rendezve azokat. Válaszott adatszerkezet: TreeSet public class Foprogram { public static void main(string[] args) throws FileNotFoundException{ Set<Integer> szamok = new TreeSet<Integer>(); Scanner beolvas = new Scanner(new File("adatok.dat")); while(beolvas.hasnextline()) szamok.add(integer.parseint(beolvas.nextline())); System.out.println(szamok); d, Az azonosakat csak egyszer tárolja (Set). Beolvasáskor még ne rendezze a számokat (HashSet). Írassa ki a számokat növekvő, majd csökkenő sorrendben (TreeSet). Válaszotott adatszerkezet: HashSet, majd TreeSet public class Foprogram {

42 public static void main(string[] args) throws FileNotFoundException{ Set<Integer> szamok = new HashSet<Integer>(); Scanner beolvas = new Scanner(new File("adatok.dat")); while(beolvas.hasnextline()) szamok.add(integer.parseint(beolvas.nextline())); System.out.println("Növekvő sorrendben:\n"+new TreeSet<>(szamok)); Set<Integer>szamok2 = new TreeSet<>(Collections.reverseOrder()); szamok2.addall(szamok); System.out.println("Csökkentő sorrendben:\n"+szamok2); e, Az azonosakat ne csak egyszer tárolja (List). Minden páros sorszámút írasson ki. A leggyorsabb módszert válassza (ArrayList). Válaszott adatszerkezet: ArrayList Search:ArrayList search operation is pretty fast compared to the LinkedList search operation. get(int index) in ArrayList gives the performance of O(1) while LinkedList performance is O(n). public class Foprogram { public static void main(string[] args) throws FileNotFoundException{ List<Integer>szamok = new ArrayList<Integer>(); Scanner beolvas = new Scanner(new File("adatok.dat")); while(beolvas.hasnextline()) szamok.add(integer.parseint(beolvas.nextline())); for(inti=0;i<szamok.size();i=i+2) System.out.println(szamok.get(i)); f, Az azonosakat ne csak egyszer tárolja (List). Törölje ki (LinkedList) a negatívakat a beolvasottak közül. A leggyorsabb módszert válassza. Deletion: LinkedList remove operation gives O(1) performance while ArrayList gives variable performance: O(n) in worst case (while removing first element) and O(1) in best case (While removing last element). Válaszott adatszerkezet: LinkedList A törlések miatt a for ciklus nem lenne jó. Az iterátorral ezt meg tudjuk csinálni. Iterators allow the caller to remove elements from the underlying collection during the iteration with welldefined semantics. This is the purpose behind the Iterator.remove() method, to be able to remove an element from the collection while iterating. public class Foprogram { public static void main(string[] args) throws FileNotFoundException{ List<Integer> szamok = new LinkedList<Integer>(); Scanner beolvas = new Scanner(new File("adatok.dat")); while(beolvas.hasnextline())

43 szamok.add(integer.parseint(beolvas.nextline())); Iterator<Integer> iter = szamok.iterator(); while (iter.hasnext()) { Integer szam = iter.next(); if(szam<0) iter.remove(); out.println("csak a pozitívok:"+szamok);

44 6. gyakorlat - Objektum orientált programozás, gyűjtemények folytatás, Generikus típus 6.1 feladat A személyek.txt szövegfájlban nevek és hozzá tartozóan pontszámok (egész) vannak egy sorban, a következő formában: Kovács Ferenc:23;45;126;67 Nagy István:56;89 Egy fájlban ugyanaz a név több sorban is szerepelhet. Egy sorban több szám is lehet. Olyan adatszerkezetet válasszon, amelyeikben személyenként tárolja az adott személyhez tartozó összes pontszámot. Ebben már minden személy csak egyszer szerepeljen. Ha egy személynek több azonos pontja van, mindegyiket külön tárolja. - Minden személyre adja meg a pontszámok összegét, átlagát és a legnagyobb pontszámot. - Adja meg, hogy melyik személynek van a második legtöbb pontja. Ha több ilyen személy is van, akkor írja ki mindegyiket. - A végén a páros értékű pontszámokat növelje meg 10-el és írassa ki személyenként a pontokat. Választott adatszerkezet: Map<String, List<Integer>> package mappa1; import java.io.file; import java.io.filenotfoundexception; import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.map; import java.util.scanner; public class Tarolo { // személyenként tárolja a pontokat private Map<String, List<Integer>> szemelyekmap = new HashMap<String, List<Integer>>(); void Beolvas(String fajlnev) throws FileNotFoundException{ Scanner beolvas = new Scanner(new File(fajlnev)); String sor; String nev; String[] stringtomb; List<Integer>pontok; // Beolvassa a személyekhez a pontokat while(beolvas.hasnextline()){ sor = beolvas.nextline(); nev = sor.split(":")[0]; stringtomb = sor.split(":")[1].split(";"); pontok = new ArrayList<Integer>(); for(string str:stringtomb) pontok.add(integer.parseint(str)); if(!szemelyekmap.containskey(nev)) szemelyekmap.put(nev, pontok); else

45 szemelyekmap.get(nev).addall(pontok); Map<String, List<Integer>> getszemelyekmap(){ return szemelyekmap; package mappa1; import java.io.filenotfoundexception; import java.util.arraylist; import java.util.collections; import java.util.hashmap; import java.util.list; import java.util.map; import java.util.treeset; public class Feladatok { private Tarolo tarolo; public Feladatok() throws FileNotFoundException { tarolo = new Tarolo(); tarolo.beolvas("személyek.txt"); Feldolgoz(); void Feldolgoz(){ // segédváltozó, többször hivatkozunk rá Map<String, List<Integer>> szemelyekmap = tarolo.getszemelyekmap(); Integer osszeg; List<Integer> pontok; Map<String, Integer> szemelyhezpont = new HashMap<String, Integer>(); // személyenként kiszámolja a pontok összegét, átlagát és a legnagyobbat for(string nev:szemelyekmap.keyset()){ osszeg = 0; // ezt is többször fel kell használni: pontok = szemelyekmap.get(nev); for(int pont:pontok) osszeg += pont; szemelyhezpont.put(nev, osszeg); System.out.println(nev+"\tösszeg="+osszeg+"\tátlag="+(1.0*osszeg/pontok.size())+"\tleg nagyobb="+collections.max(pontok)); // Második legtöbb pont megadása // Van erre gyorsabb módszer is, de ez a legegyszerűbb List<Integer> pontoknovekvoen = new ArrayList<Integer>(new TreeSet<Integer>(szemelyhezPont.values())); int masodiklegtobb = pontoknovekvoen.get(pontoknovekvoen.size()-2); System.out.println("\nMásodik legtöbb pont: "+masodiklegtobb); // Kiírja azon személyeket, akiknek a második legtöbb pontja van for(string nev:szemelyhezpont.keyset()) if(szemelyhezpont.get(nev).equals(masodiklegtobb)) System.out.println(nev); System.out.println(); // a páros értékű pontszámokat megnöveli 10-el for(string nev:szemelyekmap.keyset()){ // amit a pontok-ba írok, azt a szemelyekmap.get(nev)-be is írja pontok = szemelyekmap.get(nev); for(int i=0;i<pontok.size();i++) if(pontok.get(i)%2==0)

46 pontok.set(i,pontok.get(i)+10); // kiírja személyenként a pontokat System.out.println(nev+"\t"+szemelyekMap.get(nev)); package mappa1; import java.io.filenotfoundexception; public class Foprogram { public Foprogram() throws FileNotFoundException { Feladatok feladatok = new Feladatok(); public static void main(string[] args) throws FileNotFoundException{ Foprogram foprogram = new Foprogram(); 6.2 feladat A személyek.txt szövegfájlban nevek találhatóak és minden névhez a következő adatok: cím(szöveg), életkor(egész), magasság (valós). A következő formában: Kovács János:Szeged;35;178.4 Tóth Éva:Cegléd;29;172.3 Minden név csak egyszer szerepel. Olvassa be az adatokat. - Számítsa ki a magasságok átlagát és írassa ki. - Írassa ki azon személyek nevét és magasságát, akinek a magassága nagyobb, mint az átlag. - Írassa ki a két legalacsonyabb személy nevét és életkorát. // Ebben az osztályban tárolja egy személy címét és magasságát // Mivel különböző típusúak ezek az adatok, ezért egy külön osztályban érdemes tárolni ezeket package mappa1; public class Adatok { private String cím; private int kor; private double magasság; void setadatok(string cím, int kor, double magasság){ this.cím = cím; this.kor = kor; this.magasság = magasság; double getmagasság(){ return magasság; package mappa1; import java.io.file; import java.io.filenotfoundexception; import java.util.hashmap; import java.util.map; import java.util.scanner; // Ebben tárolja személyenként az adatokat public class Tarolo {

47 private Map<String, Adatok> szemelyek = new HashMap<String, Adatok>(); private Adatok adatok; void Beolvas(String fajlnev) throws FileNotFoundException{ Scanner beolvas = new Scanner(new File(fajlnev)); String sor, név, cím; String[] stringtomb; int kor; double magasság; // Beolvassa személyenként az adatokat while(beolvas.hasnextline()){ sor = beolvas.nextline(); név = sor.split(":")[0]; stringtomb = sor.split(":")[1].split(";"); cím = stringtomb[0]; kor = Integer.parseInt(stringTomb[1]); magasság = Double.parseDouble(stringTomb[2]); adatok = new Adatok(); adatok.setadatok(cím, kor, magasság); szemelyek.put(név, adatok); Map<String, Adatok> getszemelyek(){ return szemelyek; package mappa1; import java.io.filenotfoundexception; import java.util.iterator; import java.util.map; import java.util.set; import java.util.treeset; public class Feladatok { private Tarolo tarolo = new Tarolo(); public Feladatok() throws FileNotFoundException{ Feldolgoz(); void Feldolgoz() throws FileNotFoundException{ tarolo.beolvas("személyek.txt"); // többször hivatkozunk rá: Map<String, Adatok> szemelyek = tarolo.getszemelyek(); double magassagosszeg = 0, magassagatlag; // átlagmagasság meghatározása for(string nev:szemelyek.keyset()) magassagosszeg += szemelyek.get(nev).getmagasság(); magassagatlag = magassagosszeg/szemelyek.size(); System.out.println("A magasságok átlaga = "+magassagatlag); // az átlagnál magasabbak: System.out.println("\nAz átlagnál magasabbak: "); for(string nev:szemelyek.keyset()) if(szemelyek.get(nev).getmagasság()>magassagatlag) System.out.println(nev + "\t" + szemelyek.get(nev).getmagasság()); // magasságok növekvően // Ha vannak azonos magasságúak, akkor a két legalacsonyabbnál mindegyiket írja ki Set<Double> magassagoknovekvoen = new TreeSet<Double>(); for(string nev:szemelyek.keyset()) magassagoknovekvoen.add(szemelyek.get(nev).getmagasság()); System.out.println("\nA két legalacsonyabb: "); // Egy Set-ben ezzel tudunk egyesével végigmenni

48 // Iterator<Double> iterator = magassagoknovekvoen.iterator(); double magassag; for(int i=0;i<2;i++){ magassag = iterator.next(); for(string nev:szemelyek.keyset()) if(szemelyek.get(nev).getmagasság()==magassag) System.out.println(nev + "\t" + magassag); // így is lehetne: // for(int magassag: magassagoknovekvoen){ // db++; // if(db==3) break; package mappa1; import java.io.filenotfoundexception; public class Foprogram { public Foprogram() throws FileNotFoundException { Feladatok feladatok = new Feladatok(); public static void main(string[] args) throws FileNotFoundException{ Foprogram foprogram = new Foprogram(); 6.3 feladat Generikus típus Készítsen egy osztályt (Utils.java), amibe készítse el a következő metódusokat. A metódusok felhasználhatóak legyenek az osztály példányosítása nélkül is. - KiirIterableBol: kiíratja egy fájlba azon objektumok elemeit, melyek implementálják az Iterable interfészt (pl. lista, halmaz). - KiirIterableBolForditott: kiíratja egy fájlba fordított sorrendben azon objektumok elemeit, melyek implementálják az Iterable interfészt (pl. lista, halmaz). - MapKiir: Kiírja egy fájlba egy olyan Map adatait két oszlopba, amelyiknek a kulcsa és értéke tetszőleges típusú. - MapKiirNovekvo: Kiírja egy fájlba egy olyan Map adatait növekvő sorrendben két oszlopba, amelyiknek a kulcsa és értéke tetszőleges típusú. - MapValueAlapjanCsokkenoSorrenbenKiir: Kiírja egy fájlba egy olyan Map adatait érték alapján csökkenő sorrendben két oszlopba, amelyiknek a kulcsa és értéke tetszőleges típusú. Egy másik osztályból meghívva próbáljuk ki ezeket a metódusokat. package mappa1; import java.io.filenotfoundexception; import java.io.printwriter; import java.util.collections; import java.util.map; import java.util.set; import java.util.treemap; import java.util.treeset; public class Utils { // Iterable<T> elemek: például egy egészekből álló halmaz:

49 public static <T> void KiirIterableBol(Iterable<T> elemek, String fajlnev) throws FileNotFoundException{ PrintWriter kiir = new PrintWriter(fajlnev); for(t t:elemek) kiir.println(t.tostring()); kiir.close(); public static <T> void KiirIterableBolForditott(Iterable<T> elemek, String fajlnev) throws FileNotFoundException{ Set<T> FordítottSorrendben = new TreeSet<T>(Collections.reverseOrder()); for(t t:elemek) FordítottSorrendben.add(t); PrintWriter kiir = new PrintWriter(fajlnev); for(t t:fordítottsorrendben) kiir.println(t); kiir.close(); public static <T1,T2> void MapKiir(Map<T1, T2> map, String fajlnev) throws FileNotFoundException{ PrintWriter kiir = new PrintWriter(fajlnev); for(t1 t1:map.keyset()) kiir.println(t1.tostring()+"\t"+map.get(t1).tostring()); kiir.close(); public static <T1,T2> void MapKiirNovekvo(Map<T1, T2> map, String fajlnev) throws FileNotFoundException{ Map<T1, T2> MapAbcRendben = new TreeMap<T1, T2>(); for(t1 t1:map.keyset()) MapAbcRendben.put(t1, map.get(t1)); PrintWriter kiir = new PrintWriter(fajlnev); for(t1 t1:mapabcrendben.keyset()) kiir.println(t1.tostring()+"\t"+mapabcrendben.get(t1).tostring()); kiir.close(); public static <T1,T2> void MapValueAlapjanCsokkenoSorrenbenKiir(Map<T1, T2>map, String fajlnev) throws FileNotFoundException{ Set<T2> darabszamokdouble = new TreeSet<T2>(Collections.reverseOrder()); darabszamokdouble.addall(map.values()); PrintWriter kiir = new PrintWriter(fajlnev); for(t2 db:darabszamokdouble) for(t1 szo:map.keyset()) if(map.get(szo).equals(db)) kiir.println(db+"\t"+szo); kiir.close(); package mappa1; import java.io.filenotfoundexception; import java.util.arraylist; import java.util.hashmap; import java.util.hashset; import java.util.list; import java.util.map; import java.util.set; public class Foprogram { private List<Integer> lista = new ArrayList<Integer>();

50 private Set<String> halmaz = new HashSet<String>(); private Map<String, Integer> map = new HashMap<String, Integer>(); public Foprogram() throws FileNotFoundException{ Feltolt(); Teszt(); void Feltolt(){ for(int i=1;i<=10;i++) lista.add(i); halmaz.add("szöveg1"); halmaz.add("szöveg2"); halmaz.add("szöveg3"); map.put("szöveg7", 5); map.put("szöveg2", 20); map.put("szöveg3", 9); void Teszt() throws FileNotFoundException{ Utils.KiirIterableBol(halmaz, "KiirIterableBol.txt"); Utils.KiirIterableBolForditott(lista, "KiirIterableBolForditott.txt"); Utils.MapKiir(map, "MapKiir.txt"); Utils.MapKiirNovekvo(map, "MapKiirNovekvo.txt"); Utils.MapValueAlapjanCsokkenoSorrenbenKiir(map, "MapValueAlapjanCsokkenoSorrenbenKiir.txt"); public static void main(string[] args) throws FileNotFoundException{ Foprogram foprogram = new Foprogram();

51 7. gyakorlat 1. ZH Java nyelven kell programot írnia. A gépen lévő bármelyik fejlesztőkörnyezetet használhatja. (pl. Eclipse, NetBeans) Minden program több (legalább 3) osztályból álljon. (Szöveges adatfeldolgozásnál pl. Főprogram, Adatok, Feladatok) Alkalmazza az Objektum orientált programozás elveit. Minden részfeladathoz készítsen külön metódust. Minden feladatnál a legmegfelelőbb adatszerkezetet válassza. (pl. array, list, set, map) Fő témák: - Fájlkezelés, adatfeldolgozás, adatszerkezetek - Objektum orientált programozás oldalon találnak zh mintafeladatokat mind a két témára 8. gyakorlat - Comparator használata, fájlkezelés részletesen 8.1 feladat Comparator használata Készítsünk egy Date osztályt, amely tartalmazza az év, hónap, nap adatokat (egészek). Implementáljuk a Comparable<Date> interfészt, és ennek megfelelően valósítsuk meg a compareto() függvényt! Összehasonlítás: Először vizsgálja az éveket. Egyezőség esetén a hónapokat. Ha ez is egyezik, akkor a napokat. Kezelje le a következő kivételeket a konstruktor nem megfelelő paramétereire (IllegalArgumentException lásd lentebb): - Ha év ==0 => "Az év nem lehet 0" - Ha a hónap nem 1 és 12 között van: => "A hónap csak 1 és 12 között lehet." - Ha a nap nem 1 és 31 között van: => "A nap csak 1 és 31 között lehet." Hozzunk létre kódból 3 objektumot, és tároljuk el ezeket egy tetszőleges lista adatszerkezetben. Ezt aztán rendezzük kronológiai sorrend szerint a Collections.sort() függvénnyel, és írjuk ki az eredményt! Meg lehet kapni az osztály adatait egy Stringben alakban. IllegalArgumentException: Thrown to indicate that a method has been passed an illegal or inappropriate argument A java.util gyűjteményben is van egy gyakran használt Date osztály. Nem jelent problémát, hogy mi is készítünk egyet. Példányosításkor kiválaszthatjuk, hogy melyiket akarjuk használni. implementálja a Comparable interfészt. A CompareTo() metódus miatt kell public class NÉV implements Comparable<NÉV> NÉV: mindkét helyen ugyanaz kell álljon. package csomag1;

52 //Date osztály public class Date implements Comparable<Date>{ public final int év, hónap, nap; // konstruktor public Date(int év, int hónap, int nap) { if (év == 0) // kivételkezelés throw new IllegalArgumentException("Az év nem lehet 0"); this.év = év; if (hónap< 1 hónap> 12) throw new IllegalArgumentException("A hónap csak 1 és 12 között lehet."); this.hónap = hónap; if (nap< 1 nap> 31) // stb. throw new IllegalArgumentException("A nap csak 1 és 31 között lehet."); this.nap = nap; // az osztály szöveges public String tostring() { return év + "." + hónap + '.' + nap + '.'; // public int compareto(date o) { // ha az évek nem egyenlőek, akkor az évek különbsége if (év!= o.év) return év - o.év; if (hónap!= o.hónap) return hónap - o.hónap; return nap - o.nap; package csomag1; import java.util.arraylist; import java.util.collections; import java.util.list; // Foprogram osztály public class Foprogram { // konstruktor public Foprogram() { // dátumokat tartalmazó lista List<Date> dátumok = new ArrayList<>(); dátumok.add(new Date(1, 8, 25)); dátumok.add(new Date(2000, 8, 25)); dátumok.add(new Date(2000, 3, 8)); dátumok.add(new Date(2000, 8, 7)); dátumok.add(new Date(2001, 12, 21)); dátumok.add(new Date(2008, 5, 9)); Collections.sort(dátumok); // sorba rendez System.out.println(dátumok); // sorrendben írja ki public static void main(string[] args) { Foprogram foprogram = new Foprogram();

53 8.2 feladat Fájlkezelés Készítsen programot a következő feladathoz: - Hozza létre a feladat mappát a c: meghajtón. - Hozza létre benne a proba.txt fájlt. A fájlba írassa ki 1-től 100-ig az egészeket egymás alá. Zárja le a fájlt. - Nyissa meg újra a proba.txt fájlt és írja a végére 500-tól 600-ig az egészeket. - Írassa ki a következő adatokat a képernyőre: a fájl neve, elérési útja, fájl mérete, utolsó módosítás időpontja szabad terület mérete az adott partíción a c:\windows mappa hány almappát és hány fájlt tartalmaz Nem teljes mélységben. Olyan is lesz majd egy későbbi feladatban. a c:\windows mappában lévő exe fájlok neve és mérete - Módosítsa a mappa nevét feladat2-re és a fájl nevét proba2.txt-re. - Várjon billentyűleütésre, majd törölje a fájlt és a mappát. Ha sok írás művelet van, akkor érdemes a BufferedWriter osztályt is használni: (itt most ezt nem használjuk) PrintWriter kiir = new PrintWriter(new BufferedWriter(new FileWriter(mappaNev+fajlNev))); és kiir = new PrintWriter(new BufferedWriter(new FileWriter(mappaNev+fajlNev,true))) // (APPEND) package csomag1; import java.io.file; import java.io.filewriter; import java.io.ioexception; import java.io.printwriter; import java.util.date; import java.util.scanner; public class Foprogram { public Foprogram() throws IOException { String mappanev = "C:/feladat/", fajlnev = "proba.txt"; // File: fájl és mappaműveletekhez File mappa = new File(mappaNev); mappa.mkdir(); PrintWriter kiir = new PrintWriter(mappaNev+fajlNev); for(int i=1;i<=100;i++) kiir.println(i); kiir.close(); kiir = new PrintWriter(new FileWriter(mappaNev+fajlNev,true)); // APPEND for(int i=500;i<=600;i++) kiir.println(i); kiir.close(); File fajl = new File(mappaNev+fajlNev); System.out.println("A fájl neve: "+fajl.getname()); System.out.println("Elérési útja: "+fajl.getpath()); System.out.println("A fájl mérete: "+fajl.length()+" byte"); System.out.println("Utolsó módosítás ideje: "+new Date(fajl.lastModified())); // mertegész (long) eredményt ad vissza

54 System.out.println("Szabad terület mérete az adott partíción: "+fajl.getfreespace()+" byte"); String mappanev2 = "C:/Windows/"; mappa = new File(mappaNev2); String[] mappatomb = mappa.list(); int fajlokdb=0,mappakdb=0; for(string str:mappatomb){ fajl = new File(mappaNev2+str); if(fajl.isfile()){ fajlokdb++; // fájlok számolása if(str.endswith(".exe")) // exe fájlok számolása System.out.println(str +"\t" + fajl.length()+" byte"); else mappakdb++; // mappák számolása System.out.println("Fájlok száma= "+fajlokdb+" Mappák száma= "+mappakdb); String UjMappaNev = "C:/feladat2/"; String UjFajlNev = "proba2.txt"; System.out.println(mappaNev+fajlNev+"\t"+UjMappaNev+UjFajlNev); fajl = new File(mappaNev+fajlNev); System.out.println(fajl.length()); // fájl átnevezése if(fajl.renameto(new File(mappaNev+UjFajlNev))) System.out.println("Fájl átnevezve."); else System.out.println("Hiba a fájl átnevezésnél."); fajl = new File(mappaNev); // mappa átnevezése if(fajl.renameto(new File(UjMappaNev))) System.out.println("Mappa átnevezve."); else System.out.println("Hiba a mappa átnevezésnél."); / billentyű leütésre vár Scanner beolv = new Scanner(System.in); System.out.print("Press any key to continue..."); beolv.nextline(); // törli a fájlt és a mappát fajl = new File(UjMappaNev+UjFajlNev); fajl.delete(); fajl = new File(UjMappaNev); fajl.delete(); public static void main(string[] args) throws IOException { Foprogram foprogram = new Foprogram(); 8.3 feladat Készítsünk egy programot, amely megszámolja a parancssori argumentumként megadott fájl szavaira, hogy azokban hány fajta betű van (az egyéb karakterekkel ne foglalkozzunk)!nem csak szöveges fájlra akarjuk használni. A fájlneve adatok.txt legyen. Mivel nem csak szöveges fájlokra akarjuk alkalmazni, ezért nem a Scanner-t használjuk. FileInputStream: az InputStream osztály leszármazottja. InputStream: This abstract class is the superclass of all classes representing an input stream of bytes. Sok leszármazottja van. Pl. AudioInputStream, ByteArrayInputStream, FileInputStream,. Eredményül bájtokat ad

55 InputStreamReader: bájtokat karakterekké alakítja. An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified charset. package csomag1; import java.io.fileinputstream; import java.io.ioexception; import java.io.inputstreamreader; import java.io.reader; import java.util.set; import java.util.treeset; public class Foprogram { public static void main(string[] args) throws IOException { if (args.length == 0) { System.err.println("Nincs paraméter."); return; System.out.println("Fájl: " + args[0]); Reader olvasó = new InputStreamReader(new FileInputStream(args[0])); int karakter; Set<Character> halmaz = new TreeSet<>(); while ((karakter = olvasó.read())!= -1) if (Character.isAlphabetic(karakter)) halmaz.add((char) karakter); olvasó.close(); System.out.println(halmaz.size()); Java fájl futtatása parancssorból: Ellenőrizzük, hogy a java elérhető-e. Írjuk be a parancssorba: java Ha nem elérhető, akkor tegyük be a PATH változóba a java.exe mappáját. Például ha ebben a mappában van a Java: SET PATH=%PATH%;c:\Program Files\java\jdk1.8.0_111\bin Keressük meg a projektünk bin mappáját. Az osztály és így a.java fájl neve: Foprogram. A programunkat a csomag1 csomagba tettük. A bin mappában állva a program futtatása: java csomag1/foprogram A program futtatása szöveg.txt argumentummal: java proba/foprogram szöveg.txt A fájl a bin mappában legyen. Eclipse-ben is tudjuk futtatni a programot paraméterrel: Run mappa / Run Configurations / Arguments / Program arguments: bin/szöveg.txt ha a bin mappában van a fájl. A bemeneti fájl a bin mappában legyen, vagy abszolút útvonallal adjuk meg. Például: java Foprogram c:/mappa/program.exe 8.4 feladat Készítsünk egy programot, amely a parancssori argumentumként megadott szöveg fájl szavaira: kigyűjti kisbetűssé alakítja

56 eltávolítja a nem alfanumerikus karaktereket belőle abc rendben kiírja a képernyőre egymás alá, és el is menti egy (szintén parancssori argumentumkéntmegadott) fájlba! Az azonos szavakat csak egyszer írja ki. A program második paramétere annak a fájlnak a neve legyen, ahova írjuk a fájlt. StringBuilder: Mivel a szöveget többször változtatjuk, ezért a StringBuilder-t használjuk és nem a Stringet. package csomag1; import java.io.file; import java.io.filenotfoundexception; import java.io.printwriter; import java.util.scanner; import java.util.set; import java.util.stringtokenizer; import java.util.treeset; public class Foprogram { // konstruktor Foprogram(String[] args) throws FileNotFoundException{ Feldolgoz(args); void Feldolgoz(String[] args) throws FileNotFoundException{ if (args.length<2) { // ha nincs két paraméter System.err.println("Nincs 2 paraméter."); return; System.out.println("Fájl: " + args[0]); Scanner beolvas = new Scanner(new File(args[0])); String sor; StringTokenizer daraboló; // szavakra bontó StringBuilder strbuild; String szó; Set<String> halmaz = new TreeSet<String>(); while(beolvas.hasnextline()){ sor = beolvas.nextline(); daraboló = new StringTokenizer(sor); // a sort szavakra bontja while (daraboló.hasmoretokens()) { szó = daraboló.nexttoken().tolowercase(); // kisbetűssé alakítja // alfanumerikus karakterek kigyűjtése strbuild = new StringBuilder(); for(int i=0;i<szó.length();i++) if(character.isalphabetic(szó.charat(i))) strbuild.append(szó.charat(i)); // halmaz: az azonosakat csak egyszer kell kiírni halmaz.add(strbuild.tostring()); PrintWriter kiir = new PrintWriter(args[1]); for(string str:halmaz){ System.out.println(str); kiir.println(str); kiir.close();

57 public static void main(string[] args) throws FileNotFoundException{ Foprogram foprogram = new Foprogram(args); 8.5 feladat Készítsen olyan programot, mely a saját bájtkódjának hexa dump-ját írja ki a konzolra. Ezt már nem kell parancssorból futtatni! pl. bin/proba/foprogram.class Példa: : CA FE BA BE A F...4.Z : F F 46 6F F D 07 proba/foprogram : A F 6C 61 6E 67 2F 4F...java/lang/O : 62 6A C 69 6E E bject...<init> : B 4C 6A F 6C 61 6E 67 2F ([Ljava/lang/St : E 67 3B A ring;)v...except : 69 6F 6E A F 69 ions...java/i : 6F 2F 49 4F F 6E o/ioexception : 43 6F A C 0C D Code : F A F 69.()V...java/i : 6F 2F C E o/fileinputstrea : 6D E 2F F m...bin/proba : 2F 46 6F F D 2E 63 6C /Foprogram.class - Állomány végigolvasása 16 bájtonként (egy sorba 16 bájt kerül) A 16-os méret legyen változtatható - A bájtok kiírása hexa számként - A bájtok kiírása karakterként (a 32-nél kisebb kódú karakterek esetén a pontkaraktert szokás kiírni) - Állománykezelési hiba esetén hibaüzenet printf: a formattált kiíratáshoz. package csomag1; import java.io.fileinputstream; import java.io.ioexception; public class Foprogram { Foprogram(String[] args) throws IOException{ FileInputStream olvasó = new FileInputStream("bin/csomag1/Foprogram.class"); final int MÉRET = 16; byte[] puffer = new byte[méret]; int méret; int hely = 0; while ((méret = olvasó.read(puffer)) > 0) { // 8 karakteren írja ki az egészet 0, 16, 32, // lásd lentebb: hely += MÉRET; (MÉRET = 16) System.out.printf("%08d: ", hely); int i; for (i = 0; i<méret; i++) // "%02X ": hexaértékként 2 karakterenésszóköz System.out.printf("%02X ", puffer[i]); // Azutolsósorban 16 bájtraegészítiki,

58 // hogyegymásaláessen a karakterekkiíratása: for (; i<méret; i++) System.out.print(" "); // jobb oldali oszlop for (i = 0; i<méret; i++) // 32: a szóköz ASCII kódja. Ez előtt vannak a vezérlőkarakterek. // pl. CR: carriage return, BS: BackSpace System.out.print(puffer[i] >= 32? (char) puffer[i] : '.'); hely += MÉRET; System.out.println(); olvasó.close(); public static void main(string[] args) throws IOException{ Foprogram foprogram = new Foprogram(args); 8.6 feladat Készítsen programot, ami kiírja egy adott mappa minden al-mappáját és minden fájlját teljes mélységben. pl. C:/Eclipse-Java-gyakorlatok/Proba Teljes mélységben való kiíratást rekurzív módon tudjuk megoldani. file.getcanonicalpath(): az útvonalat kanonikus alakban adja meg. Például: C:\Eclipse-Java-gyakorlatok\Elso\ package csomag1; import java.io.file; import java.io.ioexception; public class Foprogram { // konstruktor Foprogram() throws IOException{ displaydirectorycontents(new File("C:/Eclipse-Java-gyakorlatok/Elso")); public void displaydirectorycontents(file dir) throws IOException { // mappa fájlneveit és mappaneveit kiolvassa File[] files = dir.listfiles(); for (File file : files) if (file.isdirectory()) { // ha ez mappa System.out.println("directory:" + file.getcanonicalpath()); displaydirectorycontents(file); // rekurzív hívás else System.out.println(" file:" + file.getcanonicalpath()); public static void main(string[] args) throws IOException{ Foprogram foprogram = new Foprogram();

59 9. gyakorlat - Szálkezelés, Lambda kifejezések, Stream, időkezelés 9.1 Feladat Írjunk egy progaramot, ami cíklusban, amíg meg nem állítjuk: kiír egy szöveget, majd 2 mp-et várakozik. package csomag1; public class Foprogram { public static void main(string args[]) throws InterruptedException{ while(true){ System.out.println("Szöveg"); Thread.sleep(2000); // késleltetés Thread.sleep: A Thread osztálynak a sleep metódusa az osztály saját metódusa (static), ezért látjuk, hogy a Thread osztály példányosítása nélkül is meg lehet hívni. Hatására az aktuális szál alszik a megadott milliszekundumig. 9.2 Feladat Írjunk egy programot, amiben két szál fut. A főszál két másodpercenként ír ki egy szöveget, a második szál pedig egy másodpercenként. Szálkezelés Egy egyszerű program, egyetlen szálon fut. Ha azonban több esemény is történik egyszerre, akkor szükségünk lehet több szálon futó programra. Szálakat alapvetően kétféle módon lehet létrehozni: Thread osztályból örökléssel, Runnable interfész implementálásával Mindkét esetben a run() metódusban implementált kód fog végrehajtódni a szál futtatásakor. Ha a run() a végére ér, akkor a szál meghal, újraindítani nem lehet. A szálat a start() metódussal lehet elindítani. A Thread osztály implementálja a Runable interfészt. A Runable interfészt más osztályok is imlemetálják. Pl. AsyncBoxView.ChildState, ForkJoinWorkerThread, FutureTask, RenderableImageProducer, SwingWorker, TimerTask

60 A Runnable interfészt kell implementélni minden osztálynak, amelyik egy szálon való futást akar megvalósítani. Egy ilyen osztálynak egy run metódust kell definiálnia. The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. The class must define a method of no arguments called run. Itt egyszerűség kedvéért egy.java fájlba írtam a programot. A. megoldás Olyan osztályt készítsünk, amit a Thread osztályból származtatunk. package csomag1; class Szal2 extends public void run(){ while(true){ System.out.println("Másik szál"); try { Thread.sleep(1000); catch (InterruptedException e) { e.printstacktrace(); public class Foprogram { public static void main(string args[]) throws InterruptedException{ Szal2 szal2 = new Szal2(); szal2.start(); // elindítja a szál végrehajtását while(true){ System.out.println("Egyik szál"); Thread.sleep(2000); A Szal2 osztálynál a Thread.sleep-hez a InterruptedException kivételkezelést azért kellett a try-catch szerkezettel elkészíteni, mert a Thread osztálynak is van egy run() metódusa. A mi run() metódusunk nem lenne kompatibilis azzal ilyen formában: public void run() throws InterruptedException{ szal2.start(): A Thread osztály start() metódusa. Elindítja a szál végrahajtását. A Java Virtual Machine meghívja a szál run() metódusát. Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread. The result is that two threads are running concurrently: the current thread (which returns from the call to the start method) and the other thread (which executes its run method). It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution. B. megoldás Ugyanaz, csak tömörebben. Lásd 3.0 feladat alesetei. package csomag1;

61 public class Foprogram { public static void main(string args[]) throws InterruptedException{ new Thread(){ // itt van a tömörítés public void run() { while(true){ System.out.println("Másik szál"); try{ Thread.sleep(1000); catch(interruptedexception ex){ e.printstacktrace();.start(); while(true){ System.out.println("Egyik szál"); Thread.sleep(2000); C megoldás Oldjuk meg a feladatot a Runnable interfész implementálásával. package csomag1; class Szal2 implements public void run(){ while(true){ System.out.println("Másik szál"); try{ Thread.sleep(1000); catch(interruptedexception e){ e.printstacktrace(); public class Foprogram { public static void main(string args[]) throws InterruptedException{ new Thread(new Szal2()).start(); while(true){ System.out.println("Egyik szál"); Thread.sleep(2000); Azért kell a new Thread(.) is, mert abban van a start() metódus. a Runnable-ban nincs. D megoldás Az előző tömörebben. Lásd 3.0 feladat alesetei. package csomag1;

62 public class Foprogram { public static void main(string args[]) throws InterruptedException{ // ezért rövidebb new Thread( new public void run(){ while(true){ System.out.println("Másik szál"); try{ Thread.sleep(1000); catch(interruptedexception e){ e.printstacktrace(); ).start(); while(true){ System.out.println("Egyik szál"); Thread.sleep(2000); 9.3 Feladat Lambda kifejezés Készítsünk egy-egy lambda kifejezést két szám összadására és kivonására. Ezt felhasználva írassuk ki tesztadatokkal az eredményeket. Lambda kifejezések A lambda kifejezésekkel tisztább, sokkal kifejezőbb és így karbantarthatóbb kódot írhatunk. A lambda kifejezések olyan névtelen metódusok, amiket ott írunk meg ahol ténylegesen használunk.a lambda kifejezéssel magát a viselkedést, a műveletet adjuk át, nem pedig egy olyan objektumot ami megvalósítja azt.programkódok, műveletek paraméterekként történő felhasználását teszi lehetővé a programokban. Ennek köszönhetően nagy mértékben egyszerűsíthető a Java nyelven írt programok szerkezete, rengeteg felesleges deklaráció lesz megspórolható és a kódok redundanciája is hatékonyan lesz csökkenthető. Ez sokkal szebb, olvashatóbb, és egyszerűbb megoldást ad. Példa lambda kifejezésekre: (int a, int b) -> { return a + b; () -> System.out.println("Hello World"); (String s) -> { System.out.println(s); () -> 42 () -> { return ; A lambda-kifejezés bal oldala a metódusnak a paramétere (a paraméter neve mindegy, hogy mi). A jobb oldal pedig az a kód, amit a Java lefuttat. Ahhoz, hogy lambda kifejezést tudjunk használni kell még egy funkcionális interfész és egy metódus: Funkcionális interfész: olyan interfész, amelynek csak egyetlen egy metódusa van. Ennek segítségével tudunk olyan metódusokat definiálni, amelyeknek átadhatók lambda-kifejezések. Tehát, ha írunk egy olyan metódust, aminek a paramétere egy funkcionális interfész, akkor a metódus paraméterének megadhatunk minden további nélkül egy lambda-kifejezést

63 A lamda kifejezést az interfészhez rendeljük. Azért fontos, hogy csak egy metódusa legyen az interfésznek, mert ha több lenne, akkor nem tudná a fordító, hogy melyik tartozik a lambda kifejezéshez, mert nem hivatkozunk az interfész metódusára semmilyen névvel. Először készítsük el csak a lambda kifejezéseket a hozzájuk tartozó interfésszel. // A funkcionális interfész: interface MatematikaiMűvelet { int muvelet(int a, int b); public class Foprogram { public static void main(string[] args) { // A lambda kifejezés: MatematikaiMűvelet összeadás = (a, b) ->a + b; MatematikaiMűvelet kivonás = (a, b) ->a - b; Így még nem csinál semmit, de ez már egy helyes kód. Hibaüzenetet kapnánk: - ha beírnánk egy új metódust az interface-be. - ha kitörölnénk az interfészt. (a, b) -> a + b; jelentése: a és b paraméterekre definiálja az a+b műveletet A feladat teljes megoldása: package csomag1; // A funkcionális interfész: interface MatematikaiMűvelet { int muvelet(int a, int b); public class Foprogram { // A metódus: static int megold(int a, int b, MatematikaiMűvelet matematikaimuvelet){ return matematikaimuvelet.muvelet(a, b); public static void main(string[] args) { // A lambda kifejezés: MatematikaiMűvelet összeadás = (a, b) ->a + b; MatematikaiMűvelet kivonás = (a, b) ->a - b; System.out.println(megold(10, 5, összeadás)); System.out.println(megold(10, 5, kivonás)); A megold metódusnak egy-egy műveletet adtunk át paraméternek. 9.4 Feladat Készítsen programot, amely tartalmaz egy stringekből álló listát. Ezt írassa ki lambda kifejezéssel. A lista :Alma, Ananász, Körte, Barack, Meggy, Cseresznye package csomag1;

64 import java.util.arrays; import java.util.list; public class Foprogram { public static void main(string[] args) { List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); gyumolcsok.foreach(valami -> System.out.println(valami)); A foreach metódus a Java 8-as verzióban jelent meg és a lambda kifejezéssel lehet használni. Láttuk, hogy a lambda kifejezésekhez szükség van egy funkcionális interfészre és egy metódusra. Itt a metódus: a List interfész foreach metódusa Itt a funkcionális interfész: A foreach metódus az Iterable része. Itt a foreach definíciója: foreach(consumer<? super T> action) Consumer: Ez a funkcionális interfész. funkcionális interfész <==> lambda kifejezés Ahol funkcionális interfész van, oda helyettesíthető lambda kifejezés. Amelyik metódusnak paramétere funkcionális interfész, oda lambda kifejezés írható! Ahol lambda kifejezés van, ott a háttérben van funkcionális interfész is. 9.5 Feladat 9.2-ben már megcsináltuk lamda kifejezés nélkül Szálkezelés Lambda kifejezéssel. Írjunk egy programot, amiben két szál fut. A főszál két másodpercenként ír ki egy szöveget, a második szál pedig egy másodpercenként.oldja meg Lambda kifejezéssel! package csomag1; public class Foprogram { public static void main(string[] args) throws InterruptedException { // Thread egyik konstruktora: // Thread (Runnable target) // Runnable: funkcionális interfész // new Thread( () -> { // lambda kifejezés while(true){ System.out.println("Másik szál!"); try { Thread.sleep(1000); catch (InterruptedException e) { e.printstacktrace(); ).start(); while(true){ System.out.println("Egyik szál"); Thread.sleep(2000);

65 Ezt többször kiemelem, hogy emlékezzünk, hogy mi van a háttérben. Láttuk, hogy a lambda kifejezésekhez szükség van egy funkcionális interfészre és egy metódusra. Itt a funkcionális interfész: A Thread egyik kostruktora: public Thread(Runnable target) Runnable: funkcionális interfész Itt a metódus: a Thread run metódusa Amelyik metódusnak paramétere funkcionális interfész, oda lambda kifejezés írható 9.6 Feladat Stream A Stream használata során sok funkcionális interfésszel találkozunk. így lambda kifejezésekkel jól használható! Készítsen programot, amely tartalmaz egy stringekből álló listát. A lista: Alma, Ananász, Körte, Barack, Meggy, Cseresznye Írassuk ki a lista első elemét, felhasználva a stream csomagot. A feladattal már találkoztunk. Most Stream-el oldjuk meg. Itt még nem használunk lambda kifejezést. A B megoldásban már igen. Stream: Ezt minden Java collectionon tudjuk használni, mivel a Collection interéfsz megköveteli az ehhez tartozó metódust. Akármilyen Collection osztályból létre tudunk hozni egy úgynevezett streamet. Ezt leginkább úgy lehet elképzelni, hogy ez a stream kezdetben az összes elemét tartalmazza a collectionnek, majd ezen a Stream objektumon végezhetjük el a különböző műveleteinket. package csomag1; import java.util.arrays; import java.util.list; import java.util.optional; import java.util.stream.stream; public class Foprogram { public static void main(string[] args) { List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); Stream<String> stream = gyumolcsok.stream(); Optional<String> opt = stream.findfirst(); String elso = opt.get(); System.out.println(elso);

66 Optional: a stream.findfirst() metódusnak Optional osztály az eredménye Az Optional egy újonnan bevezetett burkoló (wrapper type) típus Java-ban. Egyetlen létező vagy nem létező érték tárolására való.használata olyan függvények visszatérési értékeiként ajánlott, ahol egy nem feltétlenül létező érték szerepel. Az utolsó 4 sor rövidebben: out.println(gyumolcsok.stream().findfirst().get()); A stream() olyan típusú elemekből áll, mint a lista. A findfirst() olyan típusú Optional, mint a stream elemei. A get() olyan típusú elemet ad vissza, mint a findfirst(). Ha megnézzük a Stream és az Optional leírásait, akkor láthatjuk, hogy sok metódus paramétere funkcionális interfész. Így lambda kifejezésekkel használható lesz. Pl. funkcionális interfészek: Predicate, Supplier, BiConsumer, Function, Consumer B, megoldás Lambda kifejezéssel Láttuk, hogy a stream.findfirst() metódusnak Optional osztály az eredménye. Az Optional osztály sok metódusának paramétere funkcionális interfész. Ilyen például az ifpresent metódus is.: void ifpresent(consumer<? super T> consumer) If a value is present, invoke the specified consumer with the value, otherwise do nothing. Consumer: funkcionális interfész. Oldjuk meg az előző feladatot lambda kifejezéssel. gyumolcsok.stream().findfirst().ifpresent(aaa ->System.out.println(aaa)); 9.7 Feladat Készítsen programot, amely tartalmaz egy stringekből álló listát. A lista: Alma, Ananász, Körte, Barack, Meggy, Cseresznye Írassuk ki a lista elemeit, felhasználva a stream csomagot. Lambda kifejezés nélkül package csomag1; import java.util.arrays; import java.util.list; public class Foprogram { public static void main(string[] args) { List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); for(string str: gyumolcsok.stream().toarray(string[]::new)) System.out.println(str);

67 Átalakítottuk a stream-et stringekből álló tömbbé. Így még nincs értelme, de lambda kifejezéssel már van: B megoldás lambda kifejezéssel A legtöbb stream művelet valamilyen lambda kifejezést vár paraméterül, ahol a konkrét működést egy funkcionális interfész definiálja. A stream-ek egy újabb lépcsőfokát jelentik a funkcionális programozás behozatalának Java-ba. Egy stream elemek sorozatát reprezentálja és támogatja számos művelet végrehajtását ezeken az elemeken. A Stream API előtti időkben ha egy listát akartunk bejárni, akkor külső (external) iterációt alkalmaztunk, ami feleslegesen terjengőssé tette a kódot valamint a párhuzamosított végrehajtásra való átállás esetén az egészet újra kellett írnunk. A Stream API egy olyan fluent megoldást ad a kezünkbe, ahol nem kell külön for ciklusokat definiálnunk, az iteráció (internal) részleteit lekezeli az API. List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); gyumolcsok.stream().foreach(bbb -> System.out.println(bbb)); A stream foreach paramétere egy funkcionális interfész, ezért használni tudunk lambda kifejezést. foreach(consumer<? super T> action) Consumer: funkcionális interfész java.util.function.consumer Feladat Stream Készítsen programot, amely tartalmaz egy stringekből álló listát. A lista: Alma, Ananász, Körte, Barack, Meggy, Cseresznye A listát szűrjük le és írassuk ki az A betűvel kezdődőeket egymás alá! package csomag1; import java.util.arrays; import java.util.list; import java.util.stream.stream; public class Foprogram { public static void main(string[] args) { List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); Stream<String> szurt = gyumolcsok.stream().filter(aaa ->aaa.startswith("a")); szurt.foreach(bbb -> System.out.println(bbb)); A stream filter metódusának paramétere egy funkcionális interfész, ezért használni tudunk lambda kifejezést. filter(predicate<? super T> predicate)

68 Predicate: funkcionális interfész gyumolcsok.stream().filter(aaa -> aaa.startswith("a")); Mivel a stream elemei String-ek, ezért az aaa is String. A String osztály startswith("a") metódusa igaz, ha a String "A" vel kezdődik. A filter végig megy a stream minden elemén és leválogatja azokat, amelyek a feltételnek megfelelnek. A filter metódus eredménye is egy Stream. Az utolsó kettő egy utasítással: gyumolcsok.stream().filter(aaa -> aaa.startswith("a")).foreach(bbb -> System.out.println(bbb)); Feladat Változtassuk meg úgy a filter feltételt, hogy ne találjon megfelelő stringet, és írja ki ekkor, hogy Nem találtam ilyet!. Rossz megoldás. Hibaüzenettel kilép: public static void main(string[] args) { List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); Stream<String> szurt = gyumolcsok.stream().filter(aaa - >aaa.startswith("a")); // végső (terminal) művelet. Visszatérési értéke: long (nem stream) if(szurt.count()<1) System.out.println("Nincs A betűvel kezdődő"); else szurt.foreach(bbb -> System.out.println(bbb)); A hiba oka: Egy stream művelet lehet közbenső (intermediate) vagy végső (terminal) művelet. Egy közbenső művelet kimenete egy újabb stream. Ebből adódóan ezeket akár össze is láncolhatjuk (ezt nevezzük operation pipeline-nak). A terminális műveletek vagy void vagy valamilyen nem-stream visszatérési típussal rendelkeznek. Ha egy stream-el egy végső (terminal) műveletet hajtunk végre, akkor utána a stream már nem használható. After the terminal operation is performed, the stream pipeline is considered consumed, and can no longer be used; if you need to traverse the same data source again, you must return to the data source to get a new stream. A Stream-ek és a kollekciók (Collection) közötti egyik különbség, hogy a Stream-ek nem adattárolók, hanem adattárolókból szállítanak adatokat műveletek sorozatán keresztül. No storage. A stream is not a data structure that stores elements; instead, it conveys elements from a source such as a data structure, an array, a generator function, or an I/O channel, through a pipeline of computational operations. A Stream-ek elhasználhatóak: a Stream elemeit csak egyszer lehet felhasználni az élete során. Ha később is szükségünk van rá, akkor új stream-et kell létrehozni. Consumable. The elements of a stream are only visited once during the life of a stream

69 A példában a szurt.count() metódus a Stream-nek egy terminális művelete.visszatérési értéke nem stream (long). Így használata után a stream már nem elérhető. Jó megoldás: public static void main(string[] args) { List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); // listává alakítja a szűrés eredményét List<String> szurt = gyumolcsok.stream().filter((aaa) - >aaa.startswith("a")).collect(collectors.tolist()); if (szurt.isempty()) System.out.println("Nem találtam ilyet!"); else // lambda kifejezés: szurt.foreach(fruit -> System.out.println(fruit));.collect(Collectors.toList()); Egy listába válogattuk le a stream elemeit. Collectors: import java.util.stream.collectors; A collect egy végső(terminal) művelet. A filter egy közbenső (intermediate) művelet, eredménye stream. Ezért lehet hozzáfűzni egy másik stream műveletet Feladat Kombinálja a szűrőfeltételeket! Írassa ki azokat, amik A betűvel kezdődnek ÉS 4 betűsek! List<String> szurt = gyumolcsok.stream(). filter((aaa) ->aaa.startswith("a")). filter((bbb) ->bbb.length() == 4). collect(collectors.tolist()); A két filter egymás után ÉS kapcsolatot jelent Feladat Kombinálja a szűrőfeltételt! Írassa ki azokat, amik A betűvel kezdődnek vagy 5 betűsek! Láttuk, hogy a két filter egymás után ÉS kapcsolatot jelent. A VAGY kapcsolatot máshogy tudjuk megoldani. A stream filter metódusának paramétere Predicate interfész (funkcionális interfész) filter(predicate<? super T> predicate) Predicate: funkcionális interfész Predicate: import java.util.function.predicate;

70 A hivatkozott oldalon láthatjuk, hogy Predicate-ek között értelmezett a vagy kapcsolat (or metódus) List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); // funkcionális interfészek: lambda kifejezések: Predicate<String> pred1 = (aaa) ->aaa.startswith("a"); Predicate<String> pred2 = (bbb) ->bbb.length() == 5; Predicate<String> pred3 = pred1.or(pred2); List<String> szurt = gyumolcsok.stream().filter(pred3).collect(collectors.tolist()); Feladat Az előző szűrőfeltételt végeredményét rendeztesse ABC sorrendbe! // funkcionális interfész: lambda kifejezés: Predicate<String> pred = (aaa) ->aaa.startswith("a"); // összevonva List<String> szurt = gyumolcsok.stream(). filter(pred.or((bbb) ->bbb.length() == 5)). sorted().collect(collectors.tolist()); filter: eredménye stream: így kapcsolható utána a stream sorted metódusa Feladat Szűrőfeltétel: 5 karakternél hosszabb és hosszúság szerint csökkenő sorrenben legyen végül az eredménylistában. // leválogatja az 5 karakternél hosszabbakat List<String> szurt = gyumolcsok.stream(). filter((abc) ->abc.length() >5). sorted((f1, f2) ->f2.length() - f1.length()). collect(collectors.tolist()); A sorted metódus paramétere egy Comparator: elemek sorba rendezésére használjuk Stream<T> sorted(comparator<? super T> comparator) A comparator is egy funkcionális interfész: ezért lambda kifejezéssel használható A Comparator al már találkoztunk. Itt is hasonlóan kell használni. (f1, f2) -> f2.length() - f1.length() jelentése, mint Comparator: f1 és f2 paraméterek esetén a második hosszábó kivonja az alső hosszát. Ha az eredmény pozitív, akkor f2 a nagyobb, ha negyatív, akkor az f1, különben egyenlőek. Ezt a Comparator-t felhasználva a sorted metódusban: A sorted metódus eredménye egy stream, ami az eredeti stream elemeit tartalmazza és a Comparator szerint van rendezve. Returns a stream consisting of the elements of this stream, sorted according to the provided Comparator

71 9.8.6 Feladat Írjon predikátumot, amely az összes stringet kiíratja egyiket sem íratja ki azokat íratja ki, amik e -re végződnek // funkcionális interfész: Predicate<String> mind = (aaa) ->true; Predicate<String> semelyik = (bbb) ->false; Predicate<String> erevegzodik = (ccc) -> ccc.endswith("e"); Feladat Alakítsa át úgy a kiíratást úgy, hogy a stringek mellé odaírja a string hosszát is: Cseresznye (10) // 3 módszer a formázott kiíratásra szurt.foreach(aaa -> System.out.println(aaa + " (" + aaa.length() + ")")); vagy: szurt.foreach(aaa -> System.out.println(String.format("%s (%d)",aaa, aaa.length()))); vagy: szurt.foreach(aaa -> System.out.println((new StringBuilder(aaa)).append("(").append(aaa.length()).append(")").toString())); Feladat Írassa ki ABC sorrendben az összes gyümölcsöt. Collections.sort és Lambda kifejezéssel. Collections.sort metódussal már találkoztunk. pl. Collections.sort(lista) A sort metódusnak van egy 2 paraméteres változata is: sort(list<t> list, Comparator<? super T> c) Sorts the specified list according to the order induced by the specified comparator. Itt a 2. paraméter Comparator, ami láttuk, hogy egy funkcionális interfész. Ide egy lambda kifejezést is írhatunk arator) List<String> gyumolcsok = Arrays.asList("Alma", "Ananász", "Körte", "Barack", "Meggy", "Cseresznye"); // lambda kifejezés Collections.sort(gyumolcsok, (String f1, String f2) - >f1.compareto(f2)); // a String osztály compareto metódusa // Eredmény >0 ha f1 az f2 után van. f1 és f2:string gyumolcsok.foreach(aaa -> System.out.println(aaa));

72 A gyumolcsok itt egy lista, amin for ciklussal is végig tudnánk menni a foreach helyett Feladat Rendezze hosszúság szerinti csökkenő sorrendben az összes gyümölcsöt! Collections.sort és Lambda kifejezéssel. // lambda kifejezés Collections.sort(gyumolcsok, (String f1, String f2) -> f2.length() - f1.length()); // Collections.sort 2 paraméteres változata: // sort(list<t> list, Comparator<? super T> c) arator) // Comparator: interface

73 Java 8 dátum és időformátum kezelése Csak olvasmány Sok osztály sok metódussal. Az életben is sok fajta dátummal és idővel kapcsolazos feladat van. Egyegy ilyen feladat megoldásához gyakran létrehoztak egy új osztályt. Így az adott problémához nem kell külön kis programot írni, hanem csak egy meglévőt alkalmazni. Sok példát megnézünk, azért hogy ha majd később kell, akkor emlékezzenek rá. Írassuk ki az aktuális időt (Instant.now) Írassuk ki az aktuális helyi időt (LocalDateTime) Írassuk ki az aktuális helyi időt itt: Australia/South (ZoneId) Írassuk ki, hanyadika van (get...) Írassuk ki, milyen nap van (get...) Írassuk ki az aktuális dátumot és időt a következő formátumban: ÉÉÉÉ/HH/NN ÓÓ:PP (DateTimeFormatter...) Írassuk ki a mai nap nevét _magyarul_ (Locale...) Írassuk ki a hét napjait angolul/magyarul (DayOfWeek) Írassuk ki, hogy hány nap, hónap és év telt el március 15 óta (LocalDate.of, Period) Írassuk ki, hogy _összesen_ hány nap, hónap és év telt el március 15 óta (Duration - trükkös!) Írassuk ki, a 100 nappal ezelőtti és a 100 nap múlva esedékes dátumot (Period) Billentyűzetről kérjünk be egy dátumot "ÉÉÉÉ/HH/NN" formátumban Ellenőrizzük le, hogy megfelel-e ennek a formátumnak, ha nem adjunk hibaüzenetet Írassuk ki, hogy milyen nap volt akkor Írassuk ki a kapott dátumot USA formátumban (HH/NN/ÉÉÉÉ) Írassuk ki file-ba 1800 és 2100 között a szökőéveket egymás alá, a végére pedig a darabszámot. import java.io.filenotfoundexception; import java.io.printwriter; import java.time.*; import java.time.format.datetimeformatter; import java.time.format.textstyle; import java.time.temporal.chronounit; import java.util.locale; import java.util.scanner; public class Foprogram {

74 public static void main(string[] args) throws FileNotFoundException { // Írassuk ki az aktuális időt (Instant.now) Instant now = Instant.now(); System.out.println("Az aktuális idő: " + now); System.out.println(" "); // írassuk ki az aktuális helyi időt (LocalDateTime) LocalDateTime ldt = LocalDateTime.now(); System.out.println("Az aktuális helyi idő: " + ldt); System.out.println(" "); // írassuk ki az aktuális helyi időt itt: Australia/South (ZoneId) System.out.println("Az aktuális helyi idő itt: Australia/South: " + now.atzone(zoneid.of("australia/south"))); System.out.println(" "); // írassuk ki, hanyadika van (get...) System.out.println("Hányadika van ma: " + ldt.getdayofmonth()); System.out.println(" "); // írassuk ki, milyen nap van (get...) System.out.println("A mai nap: " + ldt.getdayofweek()); System.out.println(" "); // írassuk ki az aktuáli dátumot és időt a következő formátumban: ÉÉÉÉ/HH/NN ÓÓ:PP (DateTimeFormatter...) DateTimeFormatter timeformatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); System.out.println("ÉÉÉÉ/HH/NN ÓÓ:PP: " + timeformatter.format(ldt)); System.out.println(" "); // írassuk ki a mai nap nevét _magyarul_ (Locale...) Locale lochu = Locale.forLanguageTag("HU"); DateTimeFormatter dayformatter = DateTimeFormatter.ofPattern("EEEE"); // év 4 karakteren System.out.println("A mai nap neve _magyarul_: " + dayformatter.withlocale(lochu).format(ldt)); // Alter DayOfWeek dow = DayOfWeek.from(ldt); System.out.println("A mai nap neve _magyarul_: " + dow.getdisplayname(textstyle.full, lochu)); System.out.println(" "); // írassuk ki a hét napjait angolul/magyarul (DayOfWeek) System.out.println("A hét napjai angolul/magyarul:"); for (DayOfWeek dayofweek : DayOfWeek.values()) // dayofweek: angolul, lochu: magyarul System.out.println(dayOfWeek + "(" + dayformatter.withlocale(lochu).format(dayofweek) + ")"); System.out.println(" "); // Írassuk ki, hogy hány nap, hónap és év telt el március 15 óta (LocalDate.of, Period) LocalDate _15thOfMarch1848 = LocalDate.of(1848,03,15); Period diff = Period.between(_15thOfMarch1848, LocalDate.now()); System.out.println("1848. március 15 óta eltelt évek: "+diff.getyears()); System.out.println("Ezen kívül hónapok: "+diff.getmonths());

75 System.out.println("Ezen kívül napok: "+diff.getdays()); System.out.println(" "); // Írassuk ki, hogy _összesen_ hány nap, hónap és év telt el március 15 óta (Duration - trükkös!) // Így hibát kapunk, javítva lesz a Java9-ben: // Duration duration = Duration.between(_15thOfMarch1848, LocalDate.now()); Duration duration = Duration.between(_15thOfMarch1848.atTime(0,0), LocalDate.now().atTime(0,0)); System.out.println("Eltelt összes napok száma március 15 óta: "+duration.todays()); // alternatíva: System.out.println("Eltelt összes napok száma március 15 óta: "+ ChronoUnit.DAYS.between(_15thOfMarch1848, LocalDate.now())); System.out.println(" "); // Írassuk ki, a 100 nappal ezelőtti és a 100 nap múlva esedékes dátumot (Period) Period _100DaysLater = Period.ofDays(100); System.out.println("100 nappal ezelőtt: "+ LocalDate.now().minus(_100DaysLater)); System.out.println("100 nap múlva: "+ LocalDate.now().plus(_100DaysLater)); System.out.println(" "); // Billentyűzetről kérjünk be egy dátumot "ÉÉÉÉ/HH/NN" formátumban DateTimeFormatter dateformatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String datestr; Scanner olvas = new Scanner(System.in); System.out.println("Kérek egy dátumot \"ÉÉÉÉ/HH/NN\"formátumban:"); datestr = olvas.next(); // Ellenőrizzük le, hogy megfelel-e ennek a formátumnak, ha nema djunk hibaüzenetet try { // kivételkezelés: így magyarul írja ki a hibát. lásd: catch LocalDate parseddate = LocalDate.parse(dateStr, dateformatter); // Írassuk ki, hogy milyen nap volt akkor System.out.println("A nap ekkor: " + parseddate.getdayofweek()); // Írassukki a kapott dátumot USA formátumban (HH/NN/ÉÉÉÉ) DateTimeFormatter usaformatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); System.out.println("HH/NN/ÉÉÉÉ formátumban: " + parseddate.format(usaformatter)); catch (Exception ex) { System.out.println("Hibás dátum:" + datestr); // Írassukki file-ba 1800 és 2100 között a szökőéveketegymásalá, a végérepedig a darabszámot

76 PrintWriter kiir = new PrintWriter("szökőévek.txt"); int db = 0; for (int i = 1800; i<=2100; i++) { Year y = Year.of(i); if (y.isleap()) { kiir.println(y.getvalue()); db ++; kiir.printf("összesen: %d", db); kiir.close();

77 10. gyakorlat Adatbázis-kezelés - JDBC nethely.hu adatbázisa elérhető-e Java-ból? XAMPP indítása Hozzunk létre egy adatbázist feladat néven. Illesztés: utf8_hungarian_ci Importálják az adatbázisba a forrásoknál lévő DB.sql fájlt. JDBC Driver: ez teremti meg a kapcsolatot a Java és az adatbázis között JDBC MySQL driver letöltés: mysql-connector-java zip letöltés mysql-connector-java bin.jar fájl benne van A projektben létrehozunk egy lib mappát (az src mellett) Ide bemásoljuk a mysql-connector-java bin.jar fájlt. A main() be írjuk be: public static void main(string[] args) { Driver mydriver = new com.mysql.jdbc.driver(); Nem találja: com.mysql.jdbc.driver(); Keressük meg a Driver osztályt (Driver.class) a zip fájlban com/mysql/jdbc/driver.class Mivel nem találja, ezért, láthatóvá kell tenni a Project-ben: Eclipse-ben: Project menü / Properties / Java BuildPath / Libraries / Add ExternalJARs Ki kell választani a lib mappába másolt mysql-connector-java bin.jar fájlt. Most már nem jelez ott hibát. Bal oldalon a PackageExplorer-ben is látható a ReferencedLibraries csoportban. A Driver mydriver = newcom.mysql.jdbc.driver(); utasításban még aláhúzza a Driver-t. Nem tudja melyiket akarom használni. Egeret a Driver szóra mozgatva, kiválasztani: Import Driver (com.mysql.jdbc) Erre beírja az osztály elé: import com.mysql.jdbc.driver; Így már hibamentes: import java.sql.sqlexception; import com.sql.driver; public class Foprogram { public static void main(string[] args) throws SQLException{ Driver mydriver = new com.mysql.jdbc.driver(); 10.1 feladat Írassa ki a Hallgatok tábla sorainak a számát! Csinája meg több megoldással is

78 package csomag1; import java.sql.connection; import java.sql.driver; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; public class Foprogram { public static void main(string[] args) throws SQLException{ Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/feladat?user=root"); //Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/feladat?user=root"); // Ha adott jelszót a felhasználóhoz: //Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/feladat?user=root&password=rootpassword" ); Statement statement = connection.createstatement(); ResultSet rs = statement.executequery("select COUNT(*) FROM Hallgatok"); rs.next(); System.out.println("A tábla sorainak a száma:" + rs.getint(1)); rs = statement.executequery("select * FROM Hallgatok"); rs.last(); System.out.println("A tábla sorainak a száma:" + rs.getrow()); Connection: Ezzel alakítjuk ki a kapcsolatot. A connection (session) with a specific database. SQL statements are executed and results are returned within the context of a connection. Statement: Egy SQL utasítás elküldésére és az eredmény fogadására The object used for executing a static SQL statement and returning the results it produces. ResultSet: A Statement utasításának eredményét ebben az adattáblában táruljuk. A table of data representing a database result set, which is usually generated by executing a statement that queries the database. rs.next(); Az eredménytábla következő sorára lép. Moves the cursor forward one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on. rs.getint(1) Az 1. oszlop eredményét adja vissza Retrieves the value of the designated column in the current row of this ResultSet object as an int

79 the first column is 1, the second is 2,... Ez volt az SQL utasítás: SELECT COUNT(*) FROM Hallgatok Az SQL utasítás eredménye egy db szám (5) Ez egy sor-egy oszlop. A következő SQL utasítás ez volt: SELECT * FROM Hallgatok Eredménye a hallgatók táblája. rs.last(); Az utolsó sorra ugrik rs.getrow() Az adott sor számát adja meg. Retrieves the current row number. The first row is number 1, the second number 2, and so on

80 10.2 feladat Hozzon létre 1 új hallgatót! oldja meg az INSERT összeállítását normál String művelettel Ellenőrizze az adatbázisban, hogy valóban létrejött-e! Futtassa még egyszer a kódot sikerül-e az insert? Nézze meg a Hallgatok tábla szerkezetét. Mezőnevek: EHA, Keresztnev, Vezeteknev, , SzuletesiDatum, SzakId, OsszKreditek Nézze meg, hogy miket tárol az egyes oszlopkban. Ez alapján készítse el az SQL utasítást. package csomag1; import java.sql.connection; import java.sql.driver; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; public class Foprogram { public static void main(string[] args) throws SQLException{ Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/feladat?user=root"); Statement statement = connection.createstatement(); String insert = "INSERT INTO `hallgatok` (`EHA`, `Keresztnev`," + "`Vezeteknev`, ` `, `SzuletesiDatum`," + " `SzakId`, `OsszKreditek`) VALUES ('XXXXQQQ.KEFO'," + " 'Bobó', 'Nyomasek', 'bobo@nyomasek.hu'," + " ' ', '1', '100')"; boolean resinsert = statement.execute(insert); ResultSet rs = statement.executequery("select COUNT(*) FROM Hallgatok"); rs.next(); System.out.println("A tábla sorainak a száma:" + rs.getint(1)); Nem sikerült kétszer futtatni (hibaüzenet: Duplicate entry 'XXXXQQQ.KEFO' for key 'PRIMARY'), mert az EHA mező elsődleges kulcs a táblában. Nézze meg ezt az adatbázisban feladat Hozzon létre 1 új hallgatót! Oldja meg az INSERT összeállítását PreparedStatement-tel. Ellenőrizze az adatbázisban, hogy valóban létrejött-e! java.sql.preparedstatement a kifejezés cache-elődik majd így többször, hatékonyabban lehet futtatni. Preparált lekérdezések előnyei: A, Biztonság

81 Védelem az SQL injektálás támadás ellen lásd: Web-alkalmazások biztonsága fejezet B, Adatbázis-alkalmazásokban gyakori eset, hogy ugyanazt az utasítást kell többször vegrehajtani. A legtöbb RDBMS támogatja a preparált utasításokat, melyeket egyszer kell létrehozni az adatbázisban, majd újra meg újra használni az alkalmazásban. Ennek egy példánya már tartalmaz egy sql utasítást, és hogy ez az sql utasítás tartalmazhat bemenő paramétereket is. Az utasítás végrehajtása előtt minden bemenő paraméternek értéket kell adni a megfelelő set metódusok valamelyikével. Mivel ez az SQL utasítástípus előfordított, ezért gyorsabb a végrehajtás, mint a Statement objektumok esetén. A PreparedStatement konstruktora argumentumként egy SQL utasítást vesz át. Ezáltal a konstruktor az adatbázisban csak egyszer hozza létre a lekérdezést. Minden kérdőjel egy paraméter helyén áll, amely a lekérdezés végrehajtása előtt beállítható. Az adatbázis ezeket paraméterekkel helyettesíti be, mielőtt végrehajtja a prekompilált lekérdezést. A PreparedStatement nemcsak hatékonyabban van implementálva sok adatbázisban, de sokkal könnyebben használható is a programon belül. package csomag1; import java.sql.connection; import java.sql.date; import java.sql.driver; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.time.localdate; public class Foprogram { public static void main(string[] args) throws SQLException{ Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/feladat?user=root"); Statement statement = connection.createstatement(); ` `, " `OsszKreditek`) " PreparedStatement psinsert = connection.preparestatement( "INSERT INTO `hallgatok` (`EHA`, `Keresztnev`, `Vezeteknev`, + " `SzuletesiDatum`," + " `SzakId`, + "VALUES (?,?,?,?,?,?,?)"); psinsert.setstring(1, "QWERTYYY.KEFO"); psinsert.setstring(2, "Donald"); psinsert.setstring(3, "Trump"); psinsert.setstring(4, "donald@whitehouse.org"); psinsert.setdate(5, Date.valueOf(LocalDate.of(1946,6,14))); // Date: import java.sql.date; psinsert.setint(6, 1); psinsert.setint(7, 85); psinsert.execute();

82 ResultSet rs = statement.executequery("select COUNT(*) FROM Hallgatok"); rs.next(); System.out.println("A tábla sorainak a száma:" + rs.getint(1)); 10.4 feladat Írassa ki az összes nevet ABC-sorrendben. Egy nevet annyiszor írasson ki, ahányszor szerepel a táblában. a. oldja meg JAVA-ban a névösszefűzést és a rendezést b. oldja meg SQL-ben a névösszefűzést és a rendezést a, feladat package csomag1; import java.sql.connection; import java.sql.driver; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.util.arraylist; import java.util.collections; public class Foprogram { public static void main(string[] args) throws SQLException{ Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/feladat?user=root"); Statement statement = connection.createstatement(); Hallgatok"); ArrayList<String> nevek = new ArrayList<>(); ResultSet rs = statement.executequery("select Vezeteknev, Keresztnev FROM while (rs.next()) nevek.add(rs.getstring("vezeteknev")+" "+rs.getstring("keresztnev")); Collections.sort(nevek); for(string nev: nevek) System.out.println(nev); rs = statement.executequery("select COUNT(*) FROM Hallgatok"); rs.next(); System.out.println("A tábla sorainak a száma:" + rs.getint(1)); b, feladat package csomag1; import java.sql.connection; import java.sql.driver; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement;

83 import java.util.arraylist; public class Foprogram { public static void main(string[] args) throws SQLException{ Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/feladat?user=root"); Statement statement = connection.createstatement(); ArrayList<String> nevek = new ArrayList<>(); ResultSet rs; rs = statement.executequery( "SELECT CONCAT(Vezeteknev, ' ', Keresztnev) AS Nev " + "FROM Hallgatok ORDER BY Vezeteknev, Keresztnev"); while (rs.next()) System.out.println(rs.getString("Nev")); rs = statement.executequery("select COUNT(*) FROM Hallgatok"); rs.next(); System.out.println("A tábla sorainak a száma:" + rs.getint(1)); 10.5 feladat Írassa ki a Hallgatok táblából azoknak az EHA-kódját és születési dátumát, akik január 1. után születtek a. oldja meg a SELECT összeállítását normál String művelettel b. oldja meg a SELECT összeállítását PreparedStatement-tel (Preparált utasítás) A születési dátum a paraméter a feladat package csomag1; import java.sql.connection; import java.sql.driver; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; public class Foprogram { public static void main(string[] args) throws SQLException{ Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/feladat?user=root"); Statement statement = connection.createstatement(); ResultSet rs; rs = statement.executequery("select EHA, SzuletesiDatum " + "FROM Hallgatok WHERE SzuletesiDatum > ' '"); while (rs.next()) System.out.println(rs.getString("EHA")+ ": "+ rs.getstring("szuletesidatum"));

84 rs = statement.executequery("select COUNT(*) FROM Hallgatok"); rs.next(); System.out.println("A tábla sorainak a száma:" + rs.getint(1)); b feladat package csomag1; import java.sql.connection; import java.sql.date; import java.sql.driver; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.time.localdate; public class Foprogram { public static void main(string[] args) throws SQLException{ Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/feladat?user=root"); Statement statement = connection.createstatement(); ResultSet rs; PreparedStatement ps; ps = connection.preparestatement("select EHA, SzuletesiDatum FROM Hallgatok WHERE SzuletesiDatum >?"); // dátum típusú adat megadása ps.setdate(1, Date.valueOf(LocalDate.of(1990,1,1))); rs = ps.executequery(); while (rs.next()) System.out.println(rs.getString("EHA")+ ": "+ rs.getstring("szuletesidatum")); rs = statement.executequery("select COUNT(*) FROM Hallgatok"); rs.next(); System.out.println("A tábla sorainak a száma:" + rs.getint(1)); 10.6 feladat Kérje le az EHA-kódokat a Hallgatok táblából, tárolja ezeket egy tömbben. Listázza ki a tömb tartalmát sorszámozva 1-től. Válasszon a kiíratott kódok közül: Kérje be a billentyűzetről annak az EHA kódnak a sorszámát, amit listázni szeretne. Írja ki a választott hallgató szakjának a nevét és az ahhoz tartozó tantárgyakat! Preparált utasítással. Nézzük meg az adatbázisban, hogy melyik táblákra van szükség: hallgatok, szakok, tantargyak package csomag1; import java.sql.*; import java.util.arraylist;

85 import java.util.scanner; public class Foprogram { public static void main(string[] args) throws SQLException { Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); String url = "jdbc:mysql://localhost:3306/feladat?user=root"; Connection conn = DriverManager.getConnection(url); Statement statement = conn.createstatement(); ResultSet rs = statement.executequery("select * FROM Hallgatok"); // lista az EHA kódokhoz ArrayList<String>ehaCodes = new ArrayList<>(); int i = 1; String eha; while (rs.next()) { eha = rs.getstring("eha"); ehacodes.add(eha); // i: sorszám, eha: EHA kód System.out.println(String.format("%d. %s", i, eha)); i++; System.out.println("Kérem válasszon sorszámot:"); Scanner sc = new Scanner(System.in); // beolvassa a sorszámot int ehanr = sc.nextint(); // megkeresi a hozzá tartozó EHA kódot String selectedeha = ehacodes.get(ehanr - 1); System.out.println(String.format("Ezt választotta: %s", selectedeha)); // 2 táblás lekérdezés // szak lekérdezés, kiíratás PreparedStatement ps = conn.preparestatement("select Id, Megnevezes FROM Hallgatok " + "INNER JOIN Szakok ON Id = SzakId " + "WHERE Hallgatok.EHA =?"); ps.setstring(1, selectedeha); rs = ps.executequery(); rs.next(); System.out.println(String.format("A hallgató szakja: %s", rs.getstring("megnevezes"))); int szakid = rs.getint("id"); // szak azonosító // 2 táblás lekérdezés // SzakTantargy: kapcsoló tábla a szak és a tantárgy között // tantárgyak lekérdezése a szak alapján ps = conn.preparestatement("select Megnevezes FROM SzakTantargy " + "INNER JOIN Tantargyak ON Id = TantargyId WHERE SzakId =?"); ps.setint(1, szakid); rs = ps.executequery(); System.out.println("A szak tantárgyai:"); while (rs.next()) { String megnevezes = rs.getstring("megnevezes"); System.out.println(megnevezes); 10.7 feladat Kérje le az EHA-kódokat a Hallgatok táblából, tárolja ezeket egy tömbben. Listázza ki a tömb tartalmát sorszámozva 1-től. Kérje be a billentyűzetről annak az EHA kódnak a számát, amit módosítani szeretne a felhasználó. Írassa ki ezt az EHA-kódot ellenőrzésképpen. Ezután írassa ki a tábla oszlopainak a nevét (ResultSetMetaData), kivéve az EHA-kódot, szintén sorszámozva. Kérje be az oszlop sorszámát, amelyiket módosítani szeretné a felhasználó

86 Írassa ki az oszlop nevét és a cella jelenlegi értékét (itt állítson össze egy PreparedStatement-et, ami eredményként csak ezt a cellaértéket hozza vissza az adatbázisból!). Kérje be billentyűzetről az új értéket. Állítsa össze az UPDATE stringet PreparedStatement segítségével és írassa is ki azt! Módosítsa az adatbázisban a PreparedStatement segítségével. Ellenőrizze vissza az adatbázisban, hogy valóban megtörtént-e a módosítás: Futtassa le újból az első PreparedStatement-et és írassa ki a kapott értéket. Fontos! A PreparedStatement setxxx függvényeivel csak értékeket tud behelyettesíteni, oszlopnevet nem! A SELECT és UPDATE stringben az oszlopnév megadását normál stringművelettel oldja meg! package csomag1; import java.sql.*; import java.util.arraylist; import java.util.scanner; public class Foprogram { public static void main(string[] args) throws SQLException { Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); String url = "jdbc:mysql://localhost:3306/feladat?user=root"; Connection conn = DriverManager.getConnection(url); Statement statement = conn.createstatement(); ResultSet rs = statement.executequery("select * FROM Hallgatok"); // lista az EHA kódokról ArrayList<String> ehacodes = new ArrayList<>(); int i = 1; while (rs.next()) { String eha = rs.getstring("eha"); ehacodes.add(eha); // EHA kódok betöltése // i: sorszám, eha: kód System.out.println(String.format("%d. %s", i, eha)); i++; System.out.println("\nKérem válasszon sorszámot:"); // beolvassa a sorszámot Scanner sc = new Scanner(System.in); int ehanr = sc.nextint(); String selectedeha = ehacodes.get(ehanr - 1); System.out.println(String.format("Ezt választotta: %s", selectedeha)); // lista az oszlopoknak ArrayList<String> columns = new ArrayList<>(); System.out.println("\nKérem válasszon oszlopkódot:"); // a ResultSet-ből olvassuk ki // ResultSetMetaData: ezzel tudjuk lekérdezni az oszlopneveket ResultSetMetaData rsmd = rs.getmetadata(); i = 1; // kiírja az oszlopneveket (kivéke EHA) sorszámokkal for (int j = 1; j<= rsmd.getcolumncount(); j++) { String columnname = rsmd.getcolumnname(j); if (columnname.compareto("eha")!= 0) { columns.add(columnname); System.out.println(String.format("%d. %s", i, columnname)); i++; // oszlopsorszámot választ int columnnr = sc.nextint(); String columnname = columns.get(columnnr - 1);

87 System.out.println("Választott oszlop neve:" + columnname); // Kiírja az adott EHA-hoz tartozó választott oszlopértéket PreparedStatement psselect = conn.preparestatement("select " + columnname + " FROM Hallgatok WHERE EHA =?"); psselect.setstring(1, selectedeha); ResultSet rsselect = psselect.executequery(); rsselect.next(); System.out.println("A cella eredeti értéke:" + rsselect.getstring(1)); System.out.println("Kérem adja meg az új értéket:"); // beolvassa az új értéket String newvalue = sc.next(); // UPDATE utasítást készít // A válaszott oszlophoz és EHA kódhoz betölti az új értéket PreparedStatement psupdate = conn.preparestatement("update Hallgatok SET " + columnname + " =? WHERE EHA =?"); psupdate.setstring(1, newvalue); psupdate.setstring(2, selectedeha); System.out.println("PreparedStatement tartalma: " + psupdate); // végrehajtja az utasítást int res = psupdate.executeupdate(); System.out.println("Kész! Módosított sorok száma:" + res); // Újra meghívja a psselect-et: rsselect = psselect.executequery(); // visszaolvassa a táblából az értéket és kiíratja rsselect.next(); System.out.println("A cella új értéke:" + rsselect.getstring(1));

88 11. gyakorlat - A - Adatbázis-kezelés 11.1 Kosárlabda Egy kosárlabda-mérkőzés egyik csapatának játékosairól szóló adatok állnak rendelkezésünkre a jatekos.txt és a jegyzokonyv.txt állományokban. 1. Készítsen új adatbázist kosar néven! A mellékelt adatállományokat importálja az adatbázisba jatekos és jegyzokonyv néven! 2. Ajatekos táblába ne vegyen fel új mezőt! A jegyzokonyv táblába állítson be a rekordok azonosítására azon néven egy új mezőt! Táblák jatekos nev (szöveg), mez (szám), magassag (szám), poszt (szöveg) nev A játékos neve mez A játékos mezszáma (kulcs) magassag A játékos magassága poszt A játékos feladata a mérkőzésen jegyzokonyv azon (számláló), mez (szám), be (idő), ki (idő), bkis (szám), bjo (szám) azon A jegyzőkönyv egy bejegyzésének azonosítója (kulcs) mez A játékos mezszáma be A pályára lépés időpontja ki A lecserélés időpontja bkis Kosárra dobási kísérletek száma bjo A jó dobási kísérletek száma A két tábla kapcsolatát mutatja az ábra: Készítse el a következő feladatok megoldását! A zárójelben lévő néven mentse el azokat! 3. Lekérdezés segítségével sorolja fel a játékosok nevét, magasságát és mezszámát névsorban! (A) 4. Írassa ki, hogy Víg Péter a mérkőzés során mikor állt be és mikor cserélték le! (B) 5. Határozza meg lekérdezés segítségével, hogy Magas Viktornak hány jó dobási kísérlete volt a mérkőzésen! (C)

89 6. Listázza ki játékosonként az összes jó dobási és az összes kosárra dobási kísérletek számát! (D) 7. Lekérdezés segítségével adja meg annak a játékosnak a nevét, aki a 35 perc 0 másodperc 40 perc 0 másodperc időintervallumban irányító posztra állt be csereként! (E) import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.resultsetmetadata; import java.sql.sqlexception; import java.sql.statement; import com.mysql.jdbc.driver; public class Foprogram { String ut; Statement statement; ResultSet rs; Foprogram() throws SQLException{ f1(); f2(); A(); B1(); B2(); C(); D(); E(); void f1() throws SQLException{ System.out.println(" feladat "); Driver mydriver = new com.mysql.jdbc.driver(); DriverManager.registerDriver(myDriver); String url = "jdbc:mysql://localhost:3306/?user=root"; Connection conn = DriverManager.getConnection(url); statement = conn.createstatement(); ut = "CREATE DATABASE kosar DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci"; statement.execute(ut); ut ="use kosar"; statement.execute(ut); ut = "CREATE TABLE jatekos (" + "nev VARCHAR( 30 ) NOT NULL," + "mez INT NOT NULL," + "magassag INT NOT NULL," + "poszt VARCHAR(20) NOT NULL," + "PRIMARY KEY (mez))"; statement.execute(ut); ut = "CREATE TABLE jegyzokonyv (" + "mez INT NOT NULL," + "be TIME NOT NULL," + "ki TIME NOT NULL,"

90 "bkis INT NOT NULL," + "bjo INT NOT NULL)"; statement.execute(ut); ut = "LOAD DATA INFILE 'c:/ide/jatekos.txt' INTO TABLE jatekos " + "character set Latin2 " + "FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' IGNORE 1 LINES"; statement.execute(ut); ut = "LOAD DATA INFILE 'c:/ide/jegyzokonyv.txt' INTO TABLE jegyzokonyv " + "character set Latin2 " + "FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' IGNORE 1 LINES"; statement.execute(ut); void f2() throws SQLException{ System.out.println(" feladat "); ut = "ALTER TABLE jegyzokonyv ADD azon INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST"; statement.execute(ut); void A() throws SQLException{ System.out.println(" feladat "); ut = "SELECT nev, magassag, mez FROM jatekos ORDER BY nev"; rs = statement.executequery(ut); EredmenytablaKiiratas(rs); void B1() throws SQLException{ System.out.println("\n feladat "); ut = "SELECT be, ki FROM jatekos INNER JOIN jegyzokonyv ON jatekos.mez = jegyzokonyv.mez WHERE nev='víg Péter'"; rs = statement.executequery(ut); EredmenytablaKiiratas(rs); void B2() throws SQLException{ System.out.println("\n feladat "); ut = "SELECT be, ki FROM jatekos, jegyzokonyv WHERE jatekos.mez = jegyzokonyv.mez and nev='víg Péter'"; rs = statement.executequery(ut); EredmenytablaKiiratas(rs); void C() throws SQLException{ System.out.println("\n feladat "); ut = "SELECT Sum(bjo) FROM jatekos, jegyzokonyv WHERE jatekos.mez=jegyzokonyv.mez and nev='magas Viktor'"; rs = statement.executequery(ut); EredmenytablaKiiratas(rs); void D() throws SQLException{ System.out.println("\n feladat ");

91 ut = "SELECT nev, Sum(bjo), Sum(bkis) FROM jatekos, jegyzokonyv WHERE jatekos.mez=jegyzokonyv.mez GROUP BY nev"; rs = statement.executequery(ut); EredmenytablaKiiratas(rs); void E() throws SQLException{ System.out.println("\n feladat "); ut = "SELECT nev FROM jatekos,jegyzokonyv WHERE jatekos.mez = jegyzokonyv.mez and be>='0:35' And be<='0:40' AND poszt='irányító'"; rs = statement.executequery(ut); EredmenytablaKiiratas(rs); public static void main(string[] args) throws SQLException{ Foprogram foprogram = newfoprogram(); static void EredmenytablaKiiratas(ResultSet rs) throws SQLException{ ResultSetMetaData rsmd; rsmd = rs.getmetadata(); while (rs.next()){ for(int oszl=1;oszl<=rsmd.getcolumncount();oszl++) System.out.print(rs.getString(oszl)+"\t"); System.out.println();

92 11.2 Utazás A Napfény Tours utazási iroda internetes foglalási rendszere meghibásodott, így az irodában dolgozó munkatársak nem tudják elérni a központi adatbázist. Szerencsére a 2011-es tavaszi ajánlatok adatairól készült egy mentés, ami a tavasz.txt, a szalloda.txt és a helyseg.txt állományokban áll rendelkezésre. A központi rendszer helyreállításáig ezen állományok segítségével kell az iroda munkatársainak az érdeklődőket információval ellátni. 1. Készítsen új adatbázist utazas néven! Importálja az adattáblákat az adatbázisba tavasz, szalloda és helyseg néven! A három szöveg típusú, adatállományban az első sor tartalmazza a mezőneveket. 2. Atavasz táblához adjon hozzá sorszam néven egyedi azonosítót! Táblák: tavasz (sorszam, szalloda_az, indulas, idotartam, ar) sorszam Az út azonosítója (számláló), ez a kulcs szalloda_az A szálloda azonosítója (szöveg) indulas Az út kezdete (dátum) idotartam Az út hossza napokban megadva (szám) ar Az út Ft-ban megadott ára, egy főre számolva (szám) szalloda (az, nev, besorolas, helyseg_az, tengerpart_tav, repter_tav, felpanzio) az A szálloda azonosítója (szöveg), ez a kulcs nev A szálloda neve (szöveg) besorolas A szállodák minősítéseként használt csillagok száma 1-től 5-ig (1 csillag a legalacsonyabb minősítés, 5 a legnagyobb) (szám) helyseg_az A helység neve, ahol a szálloda található (szám) tengerpart_tav A szálloda távolsága a tengerparttól, m-ben kifejezve (szám) repter_tav A szálloda távolsága a repülőtértől, km-ben kifejezve (szám) felpanzio A szállodában biztosított ellátás. Igaz az értéke félpanziós ellátás, hamis teljes ellátás esetén (logikai) helyseg (az, nev, orszag) az A helység azonosítója (szám), ez a kulcs nev A helység neve (szöveg) orszag Az ország neve, ahol a szálloda található (szöveg) A három tábla kapcsolatát mutatja az alábbi ábra: Készítse el a következő feladatok megoldását! A zárójelben lévő néven mentse el azokat!

OOP: Java 8.Gy: Abstract osztályok, interfészek

OOP: Java 8.Gy: Abstract osztályok, interfészek OOP: Java 8.Gy: Abstract osztályok, interfészek 26/1 B ITv: MAN 2019.04.03 Abszrakt metódus és absztrakt osztály. Gyakran előfordul a tervezés során, hogy egy osztály szintjén tudjuk, hogy valamilyen metódus

Részletesebben

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN OOP: Java 11.Gy: Enumok, beágyazott osztályok 13/1 B ITv: MAN 2019.04.24 ArrayList Rugalmas tömb A tömbök korlátai Fix méret, nem lehet menet közben megnövelni Ha túl nagyra választjuk, fölösleges helyfoglalás

Részletesebben

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN Objektum Orientált Programozás 11. Kivételkezelés 44/1B IT MAN B IT v: 2016.05.03 MAN Pici elmélet A Java kivételkezelésének célja a programfutás során keletkezett hibák kiszűrése és megfelelő kezelése.

Részletesebben

OOP: Java 8.Gy: Gyakorlás

OOP: Java 8.Gy: Gyakorlás OOP: Java 8.Gy: Gyakorlás 43/1 B ITv: MAN 2019.04.10 43/2 Egy régebbi beszámoló anyaga 1. Feladat: Készítsen egy Szemely nevű osztályt a szokásos konvenciók betartásával, amely tárolja egy ember nevét

Részletesebben

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Java Programozás 1. Gy: Java alapok. Ismétlés ++ Java Programozás 1. Gy: Java alapok Ismétlés ++ 24/1 B ITv: MAN 2018.02.18 Feladat Készítsünk egy komplett konzolos alkalmazást, mely generál egy számot 0 és 100 között (mindkét határt beleértve), feladatunk

Részletesebben

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o Miért Java? széleskörben elterjedt Micro Edition - beágyazott rendszerek, régi telefonok Standard Edition - PC, android ezen alapul Enterprise Edition - vállalati programok, web service-ek multiplatform

Részletesebben

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN Objektum Orientált Programozás 5. JAVA osztályok 21/1B IT MAN B IT v: 2016.03.09 MAN Feladatok 1. Készítsen egy Alkalmazott osztályt - legyen név, kor és fizetés adata - legyen egy osztályszintű adattagja

Részletesebben

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java Függvények, csomagok Csomagok Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges számú osztályt tartalmazhat Pl.: java.util.scanner Könyvtárhierarhiát fed: Pl.: java/util/scanner.java Célja:

Részletesebben

és az instanceof operátor

és az instanceof operátor Java VIII. Az interfacei és az instanceof operátor Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 24. Java VIII.: Interface JAVA8 / 1 Az interfészről általában

Részletesebben

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán Java VIII. Az interfacei és az instanceof operátor Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 24. Java VIII.: Interface JAVA8 / 1 Az interfészről általában

Részletesebben

Java programozási nyelv 5. rész Osztályok III.

Java programozási nyelv 5. rész Osztályok III. Java programozási nyelv 5. rész Osztályok III. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2005. szeptember A Java programozási nyelv Soós Sándor 1/20 Tartalomjegyzék

Részletesebben

7. K: JAVA alapok Konzultáció

7. K: JAVA alapok Konzultáció Objektum Orientált Programozás 7. K: JAVA alapok Konzultáció 35/1B IT MAN B IT v: 2017.05.03 MAN Hiba, biztonságos program 01. Szintaktikai hiba imt i = 0; system.out.println( alma ); for (int i = 0, i

Részletesebben

4. Gy: JAVA osztályok

4. Gy: JAVA osztályok Objektum Orientált Programozás 4. Gy: JAVA osztályok 25/1B IT MAN B IT v: 2016.02.24 MAN Feladatok 1. Készítsen egy Teglalap osztályt - legyen adattagja a két oldal tárolására (egészek) - legyen konstruktora,

Részletesebben

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák Gelle Kitti 2017. 10. 25. Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 1 / 20 Hasítótáblák T 0 h(k 2)

Részletesebben

Programozás I. Első ZH segédlet

Programozás I. Első ZH segédlet Programozás I. Első ZH segédlet Ezen az oldalon: kiírás az alapértelmezett (hiba) kimenetre, sztring konkatenáció, primitív típusok, osztály létrehozás, példányosítás, adattagok, metódusok Kiíratás alapértelmezett

Részletesebben

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Programozási nyelvek II. JAVA EA+GY 1. gyakolat Programozási nyelvek II. JAVA EA+GY 1. gyakolat EÖTVÖS LORÁND TUDOMÁNYEGYTEM INFORMATIKAI KAR PROGRAMOZÁSI NYELVEK ÉS FORDÍTÓPROGRAMOK TANSZÉK 2017/2018. őszi félév Tartalom 1 Amit tudni kell a félévről

Részletesebben

Programozási nyelvek Java

Programozási nyelvek Java Programozási nyelvek Java Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 13. előadás Throwable Error Exception RuntimeException IOException Saját (általában) Nem ellenörzött kivételek (Unchecked

Részletesebben

Informatika terméktervezőknek

Informatika terméktervezőknek Informatika terméktervezőknek C# alapok Névterület (namespace) using Osztály (class) és Obejtumok Metódus (function, procedure, method) main() static void string[] arg Szintaxis // /* */ \n \t Névadások

Részletesebben

Programozási nyelvek Java

Programozási nyelvek Java Programozási nyelvek Java 2. gyakorlat Függvények Általános prototípus Módosítószavak Láthatóság: public, protected, private. Ha nem definiált, akkor úgynevezett package-private láthatóság. Lehet abstract

Részletesebben

Java gyakorlat feladatai e s megolda sai (2014.04.10)

Java gyakorlat feladatai e s megolda sai (2014.04.10) Java gyakorlat feladatai e s megolda sai (2014.04.10) 1. Feladat Számítsuk ki a Fibonacci sorozat első 20 tagját! / Fibonacci számsorozat tagjait kiszámoló, egyetlen osztályból álló program @author Bence

Részletesebben

OOP: Java 5.Gy: Osztály, referencia, konstruktor

OOP: Java 5.Gy: Osztály, referencia, konstruktor OOP: Java 5.Gy: Osztály, referencia, konstruktor 36/1 B ITv: MAN 2019.03.10 Osztály fogalma A Circle osztály definíciója: public class Circle { private int cx; private int cy; private int rad; public Circle(int

Részletesebben

Programozási nyelvek II.: JAVA, 4. gyakorlat

Programozási nyelvek II.: JAVA, 4. gyakorlat Programozási nyelvek II.: JAVA, 4. gyakorlat 2017. október 2-6. Programozási nyelvek II.: JAVA, 4. gyakorlat 1 / 32 A 4. gyakorlat tematikája Tömbök A java.util.arrays osztály A String osztály A StringBuffer

Részletesebben

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18 C# Nyelvi Elemei Tóth Zsolt Miskolci Egyetem 2013 Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei 2013 1 / 18 Tartalomjegyzék 1 Object 2 Típusok 3 String 4 RegEx Tóth Zsolt (Miskolci Egyetem) C# Nyelvi

Részletesebben

Programozási nyelvek II.: JAVA

Programozási nyelvek II.: JAVA Programozási nyelvek II.: JAVA 12. gyakorlat 2017. december 4-8. 12. gyakorlat Programozási nyelvek II.: JAVA 1 / 39 Az 12. gyakorlat tematikája equals és hashcode metódusok Comparable Set, Map Absztrakt

Részletesebben

Szoftvertechnolo gia gyakorlat

Szoftvertechnolo gia gyakorlat Szoftvertechnolo gia gyakorlat Dr. Johanyák Zsolt Csaba http://johanyak.hu 1. Dependency Injection (függőség befecskendezés) tervezési minta A tervezési minta alapgondolata az, hogy egy konkrét feladatot

Részletesebben

Osztályok. 4. gyakorlat

Osztályok. 4. gyakorlat Osztályok 4. gyakorlat Az osztály fogalma Az objektumok formai leírása, melyek azonos tulajdonsággal és operációkkal rendelkeznek. Osztályból objektum készítését példányosításnak nevezzük. Minden objektum

Részletesebben

Abstract osztályok és interface-ek. 7-dik gyakorlat

Abstract osztályok és interface-ek. 7-dik gyakorlat Abstract osztályok és interface-ek 7-dik gyakorlat Abstract metódusok és osztályok Az OO fejlesztés során olyan osztályokat is kialakíthatunk, melyeket csak továbbfejlesztésre, származtatásra lehet használni,

Részletesebben

.Net adatstruktúrák. Készítette: Major Péter

.Net adatstruktúrák. Készítette: Major Péter .Net adatstruktúrák Készítette: Major Péter Adatstruktúrák általában A.Net-ben számos nyelvvel ellentétben nem kell bajlódnunk a változó hosszúságú tömbök, listák, sorok stb. implementálásával, mert ezek

Részletesebben

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error Generics Egyszerűbb példák (java.util csomagból): public interface List { void add(e x); Iterator iterator(); public interface Iterator { E next(); boolean hasnext(); E - formális típusparaméter,

Részletesebben

Programozási nyelvek Java

Programozási nyelvek Java Programozási nyelvek Java Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 9. előadás Interface - típust vezet be, de osztálypéldány nem készíthető belőle (statikus típust ad) - több osztály is

Részletesebben

Java és web programozás

Java és web programozás Budapesti Műszaki Egyetem 2015. 02. 11. 2. Előadás Mese Néhány programozási módszer: Idők kezdetén való programozás Struktúrált Moduláris Funkcionális Objektum-orientált... Mese Néhány programozási módszer:

Részletesebben

3. Osztályok II. Programozás II

3. Osztályok II. Programozás II 3. Osztályok II. Programozás II Bevezető feladat Írj egy Nevsor osztályt, amely legfeljebb adott mennyiségű nevet képes eltárolni. A maximálisan tárolható nevek számát a konstruktorban adjuk meg. Az osztályt

Részletesebben

Szoftvertechnológia alapjai Java előadások

Szoftvertechnológia alapjai Java előadások Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz e-mail: fandrew@mit.bme.hu tárgy honlap: http://home.mit.bme.hu/~fandrew/szofttech_hu.html A mai előadás tartalma: Miért pont Java?

Részletesebben

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport 10-es Keressünk egy egész számokat tartalmazó négyzetes mátrixban olyan oszlopot, ahol a főátló alatti elemek mind nullák! Megolda si terv: Specifika cio : A = (mat: Z n m,ind: N, l: L) Ef =(mat = mat`)

Részletesebben

JAVA PROGRAMOZÁS 2.ELŐADÁS

JAVA PROGRAMOZÁS 2.ELŐADÁS Dr. Pál László, Sapientia EMTE, Csíkszereda JAVA PROGRAMOZÁS 2.ELŐADÁS 2014-2015 tavasz Tömbök, osztályok, objektumok, konstruktorok Tömbök 2 Referencia típusú változó Elemtípus Primitív Referencia: osztály,

Részletesebben

BME MOGI Gépészeti informatika 4.

BME MOGI Gépészeti informatika 4. BME MOGI Gépészeti informatika 4. 1. feladat önálló feladatmegoldás Generáljon két 1 és 10 közötti véletlen egész számot, majd kiírja ezekre a számokra a tízes szorzótáblákat! Ha az első generált szám

Részletesebben

OOP: Java 4.Gy: Java osztályok

OOP: Java 4.Gy: Java osztályok OOP: Java 4.Gy: Java osztályok. 36/1 B ITv: MAN 2019.03.02 Feladat Készítsen el egy Employee osztályt és egy Employee osztályt használó osztályt (EmpProgram). Az Employee osztálynak: van name és salary

Részletesebben

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni? A "java Villa -v" parancs jelentése: A java interpreter elindítja a Villa osztály statikus main metódusát, és átadja neki paraméterként a "-v" stringet. A java interpreter elindítja először a Villa osztály

Részletesebben

Programozási technológia

Programozási technológia Programozási technológia Bevezetés Dr. Szendrei Rudolf ELTE Informatikai Kar 2018. Információk Képzés Programtervező Informatikus BSc, nappali tagozat, C szakirány Tárgykód: IP-17cPROGT1EG Előfeltétel

Részletesebben

A C# programozási nyelv alapjai

A C# programozási nyelv alapjai A C# programozási nyelv alapjai Tisztán objektum-orientált Kis- és nagybetűket megkülönbözteti Ötvözi a C++, Delphi, Java programozási nyelvek pozitívumait.net futtatókörnyezet Visual Studio fejlesztőkörnyezet

Részletesebben

Segédanyag: Java alkalmazások gyakorlat

Segédanyag: Java alkalmazások gyakorlat Segédanyag: Java alkalmazások gyakorlat Készítette: Szabó Attila 2009/2010-2 félév, 2. gyakorlat 1 Osztályok és objektumok default, public, protected, private láthatóság a metódusokra és adattagokra (első

Részletesebben

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés OOP: Java 6.Gy: Java osztályok Definíció, static, túlterhelés 45/1 B ITv: MAN 2019.03.18 Feladat Készítsen egy Alkalmazott osztályt saját csomagban, név, kor és fizetés adatokkal. Legyen egy osztályszintű

Részletesebben

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása Tömbök kezelése Példa: Vonalkód ellenőrzőjegyének kiszámítása A számokkal jellemzett adatok, pl. személyi szám, adószám, taj-szám, vonalkód, bankszámlaszám esetében az elírásból származó hibát ún. ellenőrző

Részletesebben

Programozási technológia

Programozási technológia Programozási technológia Generikus osztályok Gyűjtemények Dr. Szendrei Rudolf ELTE Informatikai Kar 2018. Generikus osztályok Javaban az UML paraméteres osztályainak a generikus (sablon) osztályok felelnek

Részletesebben

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai): Python Változók Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai): Név Érték Típus Memóriacím A változó értéke (esetleg más attribútuma is) a program futása alatt

Részletesebben

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani Mi a legabsztraktabb típus a JAVA-ban? Object Mikor preferált interface-ek használata a konkrét típusok helyett? Ha egy osztály több interfacet is használhasson, vagy ha fvek implementálását a az osztályra

Részletesebben

Programozási nyelvek II.: JAVA

Programozási nyelvek II.: JAVA Programozási nyelvek II.: JAVA 13. gyakorlat 2017. december 11-15. 13. gyakorlat Programozási nyelvek II.: JAVA 1 / 32 Az 13. gyakorlat tematikája Generikus típusokés öröklődés Clone Comparator Névtelen

Részletesebben

BME MOGI Gépészeti informatika 8.

BME MOGI Gépészeti informatika 8. BME MOGI Gépészeti informatika 8. 1. feladat Készítse beosztottak és vezetők munkahelyi adatait kezelő alkalmazást! A feladat megoldásához hozza létre a következő osztályokat! Beosztott osztály: adatmező

Részletesebben

OOP: Java 1.Gy: Java alapok

OOP: Java 1.Gy: Java alapok OOP: Java 1.Gy: Java alapok Eclipse alapok O O P Objektum Orientált Programozás 31/1 B ITv: MAN 2019.02.25 Feladat Írja meg a 4 alapműveletet megvalósító Kalkulátor programot Java nyelven. Az elvégzendő

Részletesebben

Java II. I A Java programozási nyelv alapelemei

Java II. I A Java programozási nyelv alapelemei Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak

Részletesebben

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*; Java osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés. ( Előfeltétel 12. Tétel ) Az osztály egy olyan típus leíró struktúra, amely

Részletesebben

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Bánsághi Anna 2014 Bánsághi Anna 1 of 33 IMPERATÍV PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 7. ELŐADÁS - ABSZTRAKT ADATTÍPUS 2014 Bánsághi Anna 1 of 33 TEMATIKA I. ALAPFOGALMAK, TUDOMÁNYTÖRTÉNET II. IMPERATÍV PROGRAMOZÁS Imperatív

Részletesebben

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Programozási nyelvek II. JAVA EA+GY 1. gyakolat Programozási nyelvek II. JAVA EA+GY 1. gyakolat EÖTVÖS LORÁND TUDOMÁNYEGYTEM INFORMATIKAI KAR PROGRAMOZÁSI NYELVEK ÉS FORDÍTÓPROGRAMOK TANSZÉK 2017/2018. őszi félév Tartalom 1 Amit tudni kell a félévről

Részletesebben

Java programozási nyelv 4. rész Osztályok II.

Java programozási nyelv 4. rész Osztályok II. Java programozási nyelv 4. rész Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2005. szeptember A Java programozási nyelv Soós Sándor 1/17 Tartalomjegyzék

Részletesebben

Programozás I. gyakorlat

Programozás I. gyakorlat Programozás I. gyakorlat 1. gyakorlat Alapok Eszközök Szövegszerkesztő: Szintaktikai kiemelés Egyszerre több fájl szerkesztése pl.: gedit, mcedit, joe, vi, Notepad++ stb. Fordító: Szöveges file-ban tárolt

Részletesebben

Programozási nyelvek II.: JAVA, 4. gyakorlat

Programozási nyelvek II.: JAVA, 4. gyakorlat Programozási nyelvek II.: JAVA, 4. gyakorlat 2017. október 2-6. Programozási nyelvek II.: JAVA, 4. gyakorlat 1 / 29 A 4. gyakorlat tematikája Tömbök A java.util.arrays osztály A String osztály StringBuilder

Részletesebben

Bevezetés a programozásba I.

Bevezetés a programozásba I. Bevezetés a programozásba I. 6. gyakorlat C++ alapok, szövegkezelés Surányi Márton PPKE-ITK 2010.10.12. Forrásfájlok: *.cpp fájlok Fordítás: a folyamat, amikor a forrásfájlból futtatható állományt állítunk

Részletesebben

2018, Funkcionális programozás

2018, Funkcionális programozás Funkcionális programozás 6. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév Miről volt szó? Haskell modulok, kompilálás a

Részletesebben

BME MOGI Gépészeti informatika 1.

BME MOGI Gépészeti informatika 1. BME MOGI Gépészeti informatika 1. 1. feladat Végezze el a következő feladatokat! Olvassa be a nevét és írjon üdvözlő szöveget a képernyőre! Generáljon két 1-100 közötti egész számot, és írassa ki a hányadosukat

Részletesebben

Generikus osztályok, gyűjtemények és algoritmusok

Generikus osztályok, gyűjtemények és algoritmusok Programozási, gyűjtemények és algoritmusok bejárása Informatikai Kar Eötvös Loránd Tudományegyetem 1 Tartalom 1 bejárása 2 bejárása 2 Java-ban és UML-ben bejárása Az UML-beli paraméteres osztályok a Java

Részletesebben

Java programozási nyelv 6. rész Java a gyakorlatban

Java programozási nyelv 6. rész Java a gyakorlatban Java programozási nyelv 6. rész Java a gyakorlatban Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. október A Java programozási nyelv Soós Sándor 1/16 Tartalomjegyzék

Részletesebben

Segédanyag: Java alkalmazások gyakorlat

Segédanyag: Java alkalmazások gyakorlat Segédanyag: Java alkalmazások gyakorlat Készítette: Szabó Attila 2010/2011-2 félév, 11. gyakorlat (az előző 2 gyak közül az egyiken ZH volt, a másik szünet miatt elmaradt) 1 JAR fájl készítés A JAR (Java

Részletesebben

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió BME MOGI Gépészeti informatika 3. 1. feladat Végezze el a következő feladatokat! Kérjen be számokat 0 végjelig, és határozza meg az átlagukat! A feladat megoldásához írja meg a következő metódusokat! a.

Részletesebben

Java II. I A Java programozási nyelv alapelemei

Java II. I A Java programozási nyelv alapelemei Java2 / 1 Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2009. 02. 09. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve

Részletesebben

Java programozási nyelv

Java programozási nyelv Szoftvertechnológia sáv Java programozási nyelv Dirk Louis-Peter Müller: Java (Belépés az internet világába) Panem kiadó, Budapest, 2002. Webvilág sorozat Készítette: Gregorics Tibor Vázlatos áttekintés

Részletesebben

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő

Részletesebben

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar 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

Részletesebben

1. Egyszerű (primitív) típusok. 2. Referencia típusok

1. Egyszerű (primitív) típusok. 2. Referencia típusok II. A Java nyelv eszközei 1. Milyen eszközöket nyújt a Java a programozóknak Korábban már említettük, hogy a Java a C nyelvből alakult ki, ezért a C, C++ nyelvben járatos programozóknak nem fog nehézséget

Részletesebben

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN vizsgatételek 1. Az objektumorientált programozás szemlélete, az objektum fogalma 2. Az objektumorientált programozás alapelvei 3. A Java nyelv története, alapvető

Részletesebben

Programozás Minta programterv a 1. házi feladathoz 1.

Programozás Minta programterv a 1. házi feladathoz 1. Programozás Minta programterv a 1. házi feladathoz 1. Gregorics Tibor 1. beadandó/0.feladat 2008. december 6. EHACODE.ELTE gt@inf.elte.hu 0.csoport Feladat Egy osztályba n diák jár, akik m darab tantárgyat

Részletesebben

Java Programozás 3. Gy: Java GUI. Swing, AWT

Java Programozás 3. Gy: Java GUI. Swing, AWT Java Programozás 3. Gy: Java GUI Swing, AWT 35/1 B ITv: MAN 2018.02.25 Feladat Készítsük el az Emp osztály kezelő programját úgy, hogy ArrayList-et (listatömb, tömblista, rugalmas tömb) használunk. A java.util.arraylist

Részletesebben

Kalapácsvetés 2016 szöveges

Kalapácsvetés 2016 szöveges Kalapácsvetés 2016 Ebben a feladatban a 2016. évi nyári olimpiai játékokon az atlétika férfi kalapácsvetés döntőjének eredményeit kell feldolgoznia. A döntő 6 dobási sorozatból állt, de a 3. sorozat után

Részletesebben

Széchenyi István Egyetem. Programozás III. Varjasi Norbert varjasin@sze.hu

Széchenyi István Egyetem. Programozás III. Varjasi Norbert varjasin@sze.hu Programozás III. Varjasi Norbert varjasin@sze.hu 1 A java virtuális gép (JVM) Képzeletbei, ideális számítógép. Szoftveresen megvalósított működési környezet. (az op. rendszer egy folyamata). Feladata:

Részletesebben

BME MOGI Gépészeti informatika 7.

BME MOGI Gépészeti informatika 7. BME MOGI Gépészeti informatika 7. 1. feladat Írjon Windows Forms alkalmazást egy kör és egy pont kölcsönös helyzetének vizsgálatára! A feladat megoldásához hozza létre a következő osztályokat! Pont osztály:

Részletesebben

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat Kivételkezelés, beágyazott osztályok Nyolcadik gyakorlat Kivételkezelés Nem minden hibát lehet fordítási időben megtalálni Korábban (pl. C-ben) a hibakezelést úgy oldották meg, hogy a függvény hibakódot

Részletesebben

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar Programozás I. 5. gyakorlat 1 Objektumorientáltság Egységbezárás és információ elrejtése (absztrakt adattípus) Adatok és rajtuk végzett műveletek egységbezárása (osztályok írása, múlt hét) Öröklődés Polimorfizmus

Részletesebben

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások Osztálytervezés és implementációs ajánlások Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2006. 04. 24. Osztálytervezés és implementációs kérdések OTERV / 1 Osztály tervezés Egy nyelv

Részletesebben

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások Osztálytervezés és implementációs ajánlások Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2006. 04. 24. Osztálytervezés és implementációs kérdések OTERV / 1 Osztály tervezés Egy nyelv

Részletesebben

AWK programozás, minták, vezérlési szerkezetek

AWK programozás, minták, vezérlési szerkezetek 10 AWK programozás, minták, vezérlési szerkezetek AWK adatvezérelt szkriptnyelv text processing, adat kiterjesztés, tagolt adatok automatizált soronkénti feldolgozása a forrásállományt soronként beolvassa

Részletesebben

Java és web programozás

Java és web programozás Budapesti M szaki Egyetem 2015. 03. 18. 5. El adás Ismétlés: osztály, konstruktor, objektum public class Complex { private float repart_; private float impart_; public Complex(float repart, float impart)

Részletesebben

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos OOP I. Egyszerő algoritmusok és leírásuk Készítette: Dr. Kotsis Domokos Hallgatói tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendı anyag vázlatát képezik. Ismeretük

Részletesebben

Alkalmazott modul: Programozás

Alkalmazott modul: Programozás Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás Feladatgyűjtemény Összeállította: Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Frissítve: 2015.

Részletesebben

2011.11.29. JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

2011.11.29. JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése Tartalom Integrált fejlesztés Java platformon JUnit JUnit használata Tesztelési technikák Demo 2 A specifikáció alapján teszteljük a program egyes részeit, klasszikus V-modell szerint Minden olyan metódust,

Részletesebben

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK, Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás OE-NIK, 2013 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk

Részletesebben

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás: 2006. 03. 07.

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás: 2006. 03. 07. Java VI. Öröklődés Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2006. 03. 07. Java VI.: Öröklődés JAVA6 / 1 Egy kis kitérő: az UML UML: Unified Modelling Language Grafikus eszköz objektum

Részletesebben

Programozási nyelvek JAVA EA+GY 1. gyakolat

Programozási nyelvek JAVA EA+GY 1. gyakolat Programozási nyelvek JAVA EA+GY 1. gyakolat EÖTVÖS LORÁND TUDOMÁNYEGYTEM INFORMATIKAI KAR PROGRAMOZÁSI NYELVEK ÉS FORDÍTÓPROGRAMOK TANSZÉK 2018/2019. tavaszi félév Tartalom 1 A Java alapjai 2 Java program

Részletesebben

OOP: Java 7.Gy: Öröklődés, referenciák

OOP: Java 7.Gy: Öröklődés, referenciák OOP: Java 7.Gy: Öröklődés, referenciák 37/1 B ITv: MAN 2019.03.26 Öröklődés Egységbezárás (az egyik OOP alapelv) : az adatokat és rajtuk végzett műveleteket egy egységként kezeljük, ez az egység az osztály.

Részletesebben

Objektumorientált programozás C# nyelven

Objektumorientált programozás C# nyelven Objektumorientált programozás C# nyelven 2. rész Öröklés és többalakúság Nemvirtuális metódusok, elrejtés Virtuális metódusok, elrejtés Típuskényszerítés, az is és as operátorok Absztrakt osztályok, absztrakt

Részletesebben

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1 Java VI. Öröklődés Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2006. 03. 07. Java VI.: Öröklődés JAVA6 / 1 Egy kis kitérő: az UML UML: Unified Modelling Language Grafikus eszköz objektum

Részletesebben

C#, OOP. Osztályok tervezése C#-ban

C#, OOP. Osztályok tervezése C#-ban C#, OOP Osztályok tervezése C#-ban OOP Létrehozás (creating) Megszüntetés (destroying) Túlterhelés (overlading) Felsorolás típus (enumerated types) 2 Hajó osztály Sailboat class using System; class Sailboat

Részletesebben

1. Alapok. #!/bin/bash

1. Alapok. #!/bin/bash 1. oldal 1.1. A programfájlok szerkezete 1. Alapok A bash programok tulajnképpen egyszerű szöveges fájlok, amelyeket bármely szövegszerkesztő programmal megírhatunk. Alapvetően ugyanazokat a at használhatjuk

Részletesebben

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ Dinamikus adatszerkezetek 2D generikus tömb: C++ template class CArray2D protected: TYPE **m_array; long m_row, m_col; public: CArray2D(long row, long col) // konstruktor m_array = new TYPE*[row];

Részletesebben

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java. 2D generikus tömb: C++ Dinamikus adatszerkezetek template class CArray2D protected: TYPE **m_array; long m_row, m_col; public: CArray2D(long row, long col) // konstruktor m_array = new TYPE*[row];

Részletesebben

Objektum orientált kiterjesztés A+ programozási nyelvhez

Objektum orientált kiterjesztés A+ programozási nyelvhez Szegedi Tudományegyetem Informatikai Tanszékcsoport Objektum orientált kiterjesztés A+ programozási nyelvhez Diplomamunka terve Készítette: Bátori Csaba programtervező matematikus hallgató Témavezető:

Részletesebben

Programozási nyelvek II.: JAVA

Programozási nyelvek II.: JAVA Programozási nyelvek II.: JAVA 5. gyakorlat 2017. október 9-13. 5. gyakorlat Programozási nyelvek II.: JAVA 1 / 34 Az 5. gyakorlat tematikája Kivételkezelés alapjai Be és kimenet BufferedReader, Scanner

Részletesebben

Programozási nyelvek II.: JAVA

Programozási nyelvek II.: JAVA Programozási nyelvek II.: JAVA 6. gyakorlat 2017. október 16-20. 6. gyakorlat Programozási nyelvek II.: JAVA 1 / 1 Az 6. gyakorlat tematikája Túlterhelés - összefoglalás statikus adattagok és metódusok

Részletesebben

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés Kivételek kezelése (exception handling) Hibakezelés old style class Szamolo { void szamol( String s, int i ) { int d; if (i!= 0) d = (i+1)/i; else if (s!= null) d = s.length(); else if (i > 10) // applikációs

Részletesebben

Felvételi tematika INFORMATIKA

Felvételi tematika INFORMATIKA Felvételi tematika INFORMATIKA 2016 FEJEZETEK 1. Természetes számok feldolgozása számjegyenként. 2. Számsorozatok feldolgozása elemenként. Egydimenziós tömbök. 3. Mátrixok feldolgozása elemenként/soronként/oszloponként.

Részletesebben

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai Kémiai elemek felfedezése A kémiai elemek kémiailag tovább már nem bontható, egyszerű anyagok. Jelenleg 118 különböző kémiai elemet ismerünk, közüliik a Földön 94 található meg a természetben, ezeket természetes

Részletesebben

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük. Függvények A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük. Mint egy dzsinn: Hogyan is "használunk" egy dzsinnt? megszólítjuk megmondjuk,

Részletesebben