OOP: Java 1.Gy: Java alapok Eclipse alapok +INFOMATRIX O O P Objektum Orientált Programozás 50/1 B ITv: MAN 2019.02.08
Info Mátrix 50/2
Rólam 50/3 Szűcs Miklós Alias: BitMan Mesteroktató Informatika épület, 108-as szoba szucs@iit.uni-miskolc.hu +36 46 565111 2106 bitman.uw.hu users.iit.uni-miskolc.hu/~szucs/ Szakterület: Programozás Adatbázisok
A Java program A számítógépes program megmondja egy számítógépnek, hogy mit csináljon, jellemző módon azt, hogy az adatokkal milyen műveleteket végezzen. A számítógépes program egy programnyelven írt algoritmus, azaz bizonyos egzakt feltételeket, követelményeket (előre definiáltság, egyértelmű végrehajthatóság, stb.) kielégítő utasítássorozat. A Java program logikailag egy vagy több osztályból áll. Fizikailag: 50/4 Az elkészítés szempontjából.java kiterjesztésű fájlok, melyek megfelelnek a nyelvi követelményeknek A fordító (compiler) szempontjából.java kiterjesztésű forrás fájl(ok), melyekből egy vagy több.class fájlt készít A végrehajtás szempontjából (VM).class file-okból áll. A class file-ok lehetnek egy mappában, de jar vagy zip fájlba tömörítve, sőt adatbázisban tárolva is.
A Java program felépítése package sajat; import java.lang.*; public class Hello { public static void main(string[ ] args) { System.out.println("Helló világ"); # include <stdio.h> int main ( ) { printf ("Helló Világ! \n"); return 0; Kötelezően egy Hello.java nevű fájlban kell lennie! 50/5
Fejlesztési lépések 1. Forrásfájl (Hello.java) megírása egy tetszőleges szövegszerkesztővel 2. Fordítás: javac Hello.java Abban a könyvtárban célszerű kiadni, ahol a forrásfájl van A fordítás eredménye a Hello.class bájtkód 3. Futtatás: java Hello A Hello.class fájlt futtatja Parancs: javac Hello.java java Hello public class Hello { public static void main(string args[]) { System.out.print("Hello "); if (args.length == 0) System.out.println("World!"); else System.out.println(args[0] + "!"); CAFE BABE 37DA 4107 FAC4 660D 00F1 300BD 1FF0 35BB 337DD 239C Java VM 01001 Hello BitMan! Fájl neve: 50/6 Hello.java Hello.class
Fejlesztési lépések Fordítás, futtatás Forrásfájl Konzol ablak 50/7
Hárombetűsek: JDK, JVM, JRE Ha Java programot akarunk írni, kell a JDK. F.java Ha csak futtatni akarjuk a Java programokat, elég a JRE. SZ SZ F.class 50/8 F Fájl SZ Szoftver H Hardver SZ H
Otthoni környezet kialakítása Le kell tölteni, és telepíteni a JDK-t (Java fejlesztő csomag) Az Eclipse fejlesztő környezetet csak le kell tölteni, kicsomagolni, és elindítani, nem kell telepíteni. 50/9
Letöltése oracle.com 50/10
Telepített JDK ellenőrzése A letöltött JDK-t telepíteni kell Egygombos telepítés A program a Program Files \ Java mappába kerül 50/11
Fontos beállítás: keresési útvonal 50/12
Fontos beállítás: keresési útvonal Hozzá kell adni a JDK\bin könyvtárat! 50/13
Telepítés, beállítás ellenőrzése: Parancssorban: java -version Ha kiírja a verziót, akkor eléri a JRE könyvtárát, és lehet Java programokat futtatni. Parancssorban: javac -version Ha kiírja a verziót, akkor eléri a JDK könyvtárát, és lehet Java programokat lefordítani. 50/14
Alkossunk Java programot! 1. A Dokumentumok mappába hozzunk létre egy Hello.java nevű szöveges fájlt. 2. Írjuk bele a fájlba a kódot, aztán mentsük le. public class Hello { public static void main(string[ ] args) { System.out.println("Helló világ"); 3. Fordítsuk le: javac Hello.java 4. Futtassuk: java Hello 50/15
Nézzünk bele a fájlba Indítsuk el a Total Commandert Keressük ki a Hello.class fájlt, F3 (nézőke) Beállítások: Hexa 50/16
A fejlesztő környezet telepítése Az Eclipse egy több platformon (Windows mellett Linux, Solaris, AIX, HP-UX, Mac OS-X) rendelkezésre álló, több programozási nyelvet (Java, PHP, C/C++, stb.) támogató és többfajta fejlesztői környezetben (asztali alkalmazásfejlesztés, webfejlesztés, mobil alkalmazásfejlesztés, UML2 szerkesztés, vizuális szerkesztés stb.) alkalmazható nyílt forrású szoftverfejlesztő projekt. Letöltés az eclipse.org helyről Kicsomagolás, indítás 50/17
eclipse.org 50/18
50/19
Programozás Eclipse-ben 1. Létre kell hozni egy Java project-et File\New\Java Project Project name: ora1 aztán Finish Create module-info java file? Don't Create 2. A projektben létre kell hozni egy osztályt File\New\Class Name: Hello public static void main(string[ ] args) aztán Finish 3. Meg kell írni a programot 4. Fordítás, futtatás 50/20
Az első Java program 2 1 3 50/21
A második Java program Olvassuk be, hogy hányszor írjuk ki a képernyőre a Helló Világ szöveget! package ora1; import java.util.scanner; public class Hello { public static void main(string[] args) { Scanner sc= new Scanner(System.in); int db, i; System.out.println("Hányszor írjuk ki a szöveget?"); db = sc.nextint(); for (i=0; i<db; i++) System.out.println("Helló világ"); sc.close(); 50/22
PI π: περίμετρος, kerület a kör kerületének és átmérőjének hányadosa 3,1415926535 8979323846 2643383279 5028841971 Chuck Norris tudja a π utolsó számjegyét!.( ) 8 Egyiptom: π= 4 9 3,1605 2 Leibniz: 50/23
Feladat Adjon közelítést Pi értékére (3,1415926535), az alábbi sorozatok első 1000 tagjának kiszámításával. Melyik sor konvergál gyorsabban? Leibniz-féle sor: Vallis-formula: 50/24
Hogy lehetne algoritmizálni? Elemzésünk megállapításai: 50/25 A művelet felváltva kivonás, aztán összeadás A számok kettesével nőnek Megoldás: Legyen pip4 alapértéke: 1 (Fontos: valós szám legyen!) A ciklus 2-esével növekedjen Egy változót egyesével növelve vizsgálhatjuk, hogy értéke páros vagy páratlan, ettől függhet a és a + művelet A ciklus után pip4-et megszorozzuk 4-el, és kiírjuk
Első közelítés Kell egy új Class: File\New\Class (Name: Program) Kell egy scanner Scanner sc= new Scanner(System.in); 50/26 Jobbklikk\Source\Organize imports (java.util.scanner) Változók: double pip4=1.0; int i, m, x; Olvassuk be, hogy meddig fusson a ciklus System.out.println("Meddig fusson a ciklus?"); m = sc.nextint(); Egyelőre for ciklust használjunk (pont olyan, mint C-ben!) for (i=3,x=0; i<m; i=i+2, x++) { if (x % 2 == 0) pip4-=1/(double)i; else pip4+=1/(double)i;
Első közelítés Írjuk ki az eredményt: System.out.println("PI= "+pip4*4.0); Zárjuk le a scannert: sc.close(); Futtassuk a kódot! Meddig fusson a ciklus? 100 PI= 3.121594652591011 Meddig fusson a ciklus? 1000 PI= 3.139592655589785 50/27 Meddig fusson a ciklus? 10000 PI= 3.141392653591791
Módosítás Írjuk át a kódot while ciklusra! Scanner sc= new Scanner(System.in); double pip4=1.0; int i, m, x; System.out.println("Hány darab taggal számoljunk?"); m = sc.nextint(); while ( ) { Meddig fusson a ciklus? <m-1 System.out.println("PI= "+pip4*4.0); sc.close(); 50/28
Módosítás Írjuk át a kódot while ciklusra! Scanner sc= new Scanner(System.in); double pip4=1.0; int i, m, x; System.out.println("Hány darab taggal számoljunk?"); m = sc.nextint(); while ( <m-1) { Melyik változó vezérelje a ciklust? x System.out.println("PI= "+pip4*4.0); sc.close(); 50/29
Módosítás Írjuk át a kódot while ciklusra! Scanner sc= new Scanner(System.in); double pip4=1.0; int i, m, x; System.out.println("Hány darab taggal számoljunk?"); m = sc.nextint(); while (x<m-1) { 50/30 Milyen értékről induljon az x? Kell hogy legyen kezdőértéke! System.out.println("PI= "+pip4*4.0); sc.close(); x=0
Módosítás Írjuk át a kódot while ciklusra! Scanner sc= new Scanner(System.in); double pip4=1.0; int i, m, x=0; System.out.println("Hány darab taggal számoljunk?"); m = sc.nextint(); while (x<m-1) { if (x % 2 == 0) pip4-=1/(double)i; else pip4+=1/(double)i; x Mennyivel kell növelni x-et? x++; System.out.println("PI= "+pip4*4.0); sc.close(); 50/31
Módosítás Írjuk át a kódot while ciklusra! Scanner sc= new Scanner(System.in); double pip4=1.0; int i, m, x=0; System.out.println("Hány darab taggal számoljunk?"); m = sc.nextint(); while (x<m-1) { if (x % 2 == 0) pip4-=1/(double)i; else pip4+=1/(double)i; x++; i Mennyivel kell növelni i-t? System.out.println("PI= "+pip4*4.0); sc.close(); i=i+2; 50/32
Módosítás Írjuk át a kódot while ciklusra! Scanner sc= new Scanner(System.in); double pip4=1.0; int i, m, x=0; System.out.println("Hány darab taggal számoljunk?"); m = sc.nextint(); while (x<m-1) { if (x % 2 == 0) pip4-=1/(double)i; else pip4+=1/(double)i; x++; i=i+2; Milyen értékről induljon az i? System.out.println("PI= "+pip4*4.0); sc.close(); i=3; 50/33
Módosítás Írjuk át a kódot while ciklusra! Scanner sc= new Scanner(System.in); double pip4=1.0; int i=3, m, x=0; System.out.println("Hány darab taggal számoljunk?"); m = sc.nextint(); while (x<m-1) { if (x % 2 == 0) pip4-=1/(double)i; else pip4+=1/(double)i; x++; i=i+2; System.out.println("PI= "+pip4*4.0); sc.close(); 50/34
Tesztelés Itt vannak az előző verzió futtatási eredményei. Tudjuk valahogyan ellenőrizni, hogy ugyanolyan eredményt ad-e ez a verzió is?0 Az előző verzióban a for ciklusban elért maximális értéket kellett megadni, itt a tagok darabszámát! Hány taggal számoljunk, hogy az előző 100-as futási eredményt kapjuk? 50 Meddig fusson a ciklus? 100 PI= 3.121594652591011 Meddig fusson a ciklus? 1000 PI= 3.139592655589785 Meddig fusson a ciklus? 10000 PI= 3.141392653591791 50/35
50/36
Hogy lehetne algoritmizálni? Elemzésünk megállapításai: 50/37 Mintha két független sorozat lenne benne, és mindkettő egyesével növekedne Megoldás: Legyen pip2 alapértéke: 1 (Fontos: valós szám legyen!) A ciklus 1-ről indulva 1-esével növekedjen, ekkor a képlet: Ha i páratlan, akkor pip2*=(i+1)/(double)i, Ha i páros, akkor pip2*=i/(double)(i+1) Végül pip2*2-t kell kiírni! Max. 5 percet kap mindenki a kód megírására!
Ellenőrzés Futtatási eredmények: Hány darab taggal számoljunk? 100 PI= 3.126078900215409 Hány darab taggal számoljunk? 1000 PI= 3.140023818600586 double pip2=1.0; int i=1, m, x=0; System.out.println("Hány darab taggal számoljunk?"); m = sc.nextint(); while (x<m) { if (x % 2 == 0) pip2*=(i+1)/(double)i; else pip2*=i/(double)(i+1); i++; x++; System.out.println("PI= "+pip2*2.0); 50/38
1 2 4 6 8 9 10 12 14 15 16 18 20 21 22 23 24 25 26 27 28 30 32 33 34 35 36 37 38 39 40 42 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 25 65 66 67 68 69 70 72 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 (Pl.: 50/39 5 és 7). Ikerprímek Olyan prímszámok, melyek különbsége 2.
Ikerprímek feladat Állítsa elő az 1 és 100 közé eső számokból készíthető összes számpárt (a számpárok különböző számokból állnak). Számolja meg, hogy ezek közül hány számpárra igaz, hogy ikerprímek és írja ki ezeket a számpárokat a konzolra. Megoldás: 9 ilyen számpár van. Az ikerprímek olyan prímszámok, melyek különbsége 2 (pl. 5 és 7 ikerprímek). HF! 50/40
Ikerprímek public class IkerPrim { public static void main(string[] args) { for (int i=2; i<100; i++) for (int j=i+1; j<100; j++) if (Prim(i) && Prim(j) && j==i+2) System.out.println("Ikerpímek: "+i+", "+j); public static boolean Prim(int x) { boolean ok=true; int i=2; while (i<=math.sqrt(x) && ok) { if (x % i == 0) ok=false; i++; return ok; 50/41 Ikerpímek: 3, 5 Ikerpímek: 5, 7 Ikerpímek: 11, 13 Ikerpímek: 17, 19 Ikerpímek: 29, 31 Ikerpímek: 41, 43 Ikerpímek: 59, 61 Ikerpímek: 71, 73
Tömbkezelő algoritmusok 34 16 91 23 65 44 50/42
Tömbkezelő algoritmusok Deklaráljon és inicializáljon egy 10 elemű int tömböt és valósítsa meg az alábbi algoritmusokat külön függvényként: tömbelemek kiírása tömbelemek kiírása fordított sorrendben páros számok átlagának kiszámítása minimumkeresés monotonitás vizsgálat (monoton növekvő-e a számsor) közvetlen kiválasztásos rendezés (növekvő rendezettség minimum kiválasztással) 50/43
A kód public class Tomb { public static void main(string[] args) { int[] t = {14, 66, 5, 91, 43, 22, 37, 54, 80, 11; kiir(t); public static int tombmeret(int[] x) { return x.length; public static void kiir(int[] x) { System.out.print("A tömb elemei: "+x[0]); for (int i=1; i<tombmeret(x); i++) System.out.print(", "+x[i]); System.out.println(); 50/44 A tömb elemei: 14, 66, 5, 91, 43, 22, 37, 54, 80, 11
A kód public class Tomb { public static void main(string[] args) { int[] t = {14, 66, 5, 91, 43, 22, 37, 54, 80, 11; kiir(t); kiirforditva(t); public static void kiirforditva(int[] x) { int n=tombmeret(x); System.out.print("Elemek fordítva: "+x[n-1]); for (int i=n-2; i>=0; i--) System.out.print(", "+x[i]); System.out.println(); Elemek fordítva: 11, 80, 54, 37, 22, 43, 91, 5, 66, 14 50/45
A kód public class Tomb { public static void main(string[] args) { int[] t = {14, 66, 5, 91, 43, 22, 37, 54, 80, 11; kiir(t); kiirforditva(t); System.out.println("A páros számok átlaga: "+parosatlag(t)); public static double parosatlag(int[] x) { double atl=0; int pdb=0; for (int i=0; i<tombmeret(x); i++) if (x[i] % 2 ==0) { pdb++; atl+=x[i]; return atl/(double)pdb; 50/46 A páros számok átlag: 47.2
A kód public class Tomb { public static void main(string[] args) {... System.out.println("A legkisebb elem: "+t[minelemindex(t)]); public static int minelemindex(int[] x) { int mini=0; for (int i=1; i<tombmeret(x); i++) if (x[i]<x[mini]) mini=i; return mini; A legkisebb elem: 5 50/47
A kód public class Tomb { public static void main(string[] args) {... System.out.println("A rendezett tömb: "); kiir(rendez(t)); public static int[] rendez(int[] x) { int n=tombmeret(x); for (int i=0; i<n-1; i++) for (int j=i+1; j<n; j++) if (x[j]<x[i]) { int c=x[i]; x[i]=x[j]; x[j]=c; return x; A rendezett tömb: A tömb elemei: 5, 11, 14, 22, 37, 43, 54, 66, 80, 91 50/48
Magyarázatok Figyeljék meg, hogy most minden metódus static! Magyarázat: csak egy osztályunk van, ami futtatható (van benne main függvény) és ebben az osztályban hívjuk a metódusokat anélkül, hogy az osztályt példányosítanánk. Azaz: a static metódusok nem objektumokhoz kötődnek, hanem az osztályhoz. Amikor tömböt adunk át függvénynek argumentumként, a tömb méretét nem kell átadjuk, mert a tömb méretét a tömbnév.length adattag mindig megadja. 50/49
VÉGE VÉGE 50/50