OOP: Java 1.Gy: Java alapok

Hasonló dokumentumok
OOP: Java 1.Gy: Java alapok

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

Programozás alapjai 9.Gy: Struktúra 2.

OOP: Java 8.Gy: Gyakorlás

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

Java I. A Java programozási nyelv

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

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

Programozás I. gyakorlat

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Adatbázis rendszerek Gy: Algoritmusok C-ben

Programozási nyelvek JAVA EA+GY 1. gyakolat

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

Java I. A Java programozási nyelv

OOP: Java 4.Gy: Java osztályok

4. Gy: JAVA osztályok

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

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.

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

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

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

10. gyakorlat Tömb, mint függvény argumentum

Programozási nyelv Java

Programozási technológia I.

Felvételi tematika INFORMATIKA

Hardver és szoftver követelmények

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

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

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

Programozási nyelvek Java

7. K: JAVA alapok Konzultáció

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

INFORMATIKA javítókulcs 2016

Szoftvertechnológia alapjai Java előadások

Programozás III A JAVA TECHNOLÓGIA LÉNYEGE. Többlépcsős fordítás JAVA PLATFORM. Platformfüggetlenség

Segédanyag: Java alkalmazások gyakorlat

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

INFORMATIKAI ALAPISMERETEK

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

Programzás I gyakorlat

A Java programozási nyelv

Android alapok. Android játékfejlesztés

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

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

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

Programozási segédlet

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

Programozási technológia

Objektum orientáltság alapjai A Java nyelv Fordítás - futtatás

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Javac és Eclipse útmutató

A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat:)!

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

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

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

Szoftvertechnolo gia gyakorlat

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

Programozási nyelvek Java

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

hiányzott szeptemberben vagy A tanuló nem hiányzott szeptemberben szöveget

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

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

JAVA ALKALMAZÁSOK 1. ELŐADÁS 2/22/2017 1

Kalapácsvetés 2016 szöveges

Java Programozás 2. Ea: Java alapok. Ismétlés ++

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

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Mobil Informatikai Rendszerek

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Távolléti díj kezelése a Novitax programban

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

KIRA. KIRA rendszer. Telepítési útmutató v1

Objektum Orientált Programozás. 6. JAVA öröklődés 30/1B IT MAN

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

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

INFORMATIKAI ALAPISMERETEK

1. feladat Készítse el szövegszerkesztővel, majd mentse osztály.txt néven a következő tartalmú szöveges fájlt:

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

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

A Novitax ügyviteli programrendszer első telepítése

Programozás I. Első ZH segédlet

Programozás alapjai 8.Gy: Program struktúra

Adatszerkezetek és algoritmusok

I. Bevezetés. 1. ábra A Java "logója"

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

A MATLAB alapjai. Kezdő lépések. Változók. Aktuális mappa Parancs ablak. Előzmények. Részei. Atomerőművek üzemtana

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

Hatékonyság 1. előadás

és az instanceof operátor

Java és web programozás

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

TÖMÖRÍTÉS, DARABOLÁS ELSŐ TÉMAKÖR: FÁJLKEZELÉS FÁJLOK BECSOMAGOLÁSA

Bevezetés a programozásba I.

Átírás:

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