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ő műveletet és az operandusokat a felhasználó adja meg. A program a megadott művelettől függően végzi el a számítási feladatot. A művelet vizsgálatához használja a switch utasítást. Az osztás művelet végrehajtásakor ügyeljen az operandusok típusára, és ne engedje a 0-val való osztást. 31/2
Magyarázatok Programlogika: Kezdetben egész számokra írjuk meg a kódot! 1. Írjunk egy metódust (ReadInt), ami be tud olvasni egy ellenőrzött egész számot. Ellenőrzés: ha osztunk, a nevező nem lehet nulla! 2. Írjunk egy metódust (ReadOperation), ami be tud olvasni egy ellenőrzött műveletet (csak +, -, /, * lehet!) 3. Írjunk metódust (Calc), a műveletek elvégzésére 4. Írjunk metódust az eredmény kiírására (Print) 31/3
A ReadInt metódus kódja public static int ReadInt(boolean div) { int x; System.out.println("Enter a number: "); while (!sc.hasnextint()) { System.out.println("That's not a correct number! \nenter a number: "); sc.next(); x = sc.nextint(); if (div && x==0) { System.out.println("Can't divide by zero!"); x=readint(true); Rekurzió. Önmagát hívja a metódus. sc.nextline(); return x; Azért kell, mert a nextint() után a pufferben marad az Enter karakter, és azt onnan ki kell olvasni! 31/4
A ReadOperation metódus kódja public static String ReadOperation() { String sign=""; System.out.println("Enter operation sign: "); sign = sc.nextline(); if (sign.equals("+") sign.equals("-") sign.equals("/") sign.equals("*")) { else { System.out.println("That's not a correct operation sign!"); sign=readoperation(); Rekurzió. Önmagát hívja a metódus. return sign; 31/5
A Calc és a Print metódus kódja public static int Calc(int x, int y, String s) { int out=0; switch (s) { case "+": out=x+y; break; case "-": out=x-y; break; case "/": out=x/y; break; case "*": out=x*y; return out; public static void Print (int r) { System.out.println("Az eredmény: "+r); 31/6
A main metódus kódja static Scanner sc = new Scanner(System.in); public static void main(string[] args) { int x=readint(false); String sign=readoperation(); int y; if (sign.equals("/")) y=readint(true); else y=readint(false); Print(Calc(x, y, sign)); sc.close(); Enter a number: 3 Enter operation sign: - Enter a number: 5 Az eredmény: -2 31/7
Fejlesztés Egyetlen sztringként olvassa be az inputot space-el elválasztva a tagokat (pl.: 3 + 5). A beolvasott sztringet a space-ek mentén szét kell bontani tagokra a split metódussal, melynek paramétere a tagoló karaktersorozat. Az eredmény egy sztring tömb, melynek egyes elemeit a megfelelő típusra konvertálva kapjuk meg az operandusokat (a csomagoló osztály parsexxx metódusát használva) és az operátort. Programlogika: A ReadInt és a ReadOperation metódus helyett egyetlen ReadData metódust kell írni A program változóit adattagként kell deklarálni, nem lokális változóként 31/8
A ReadData és a main metódus kódja public static void ReadData() { System.out.println("Enter the term to calculate: "); String s = sc.nextline(); String[] st=s.split(" "); x=integer.parseint(st[0]); y=integer.parseint(st[2]); sign=st[1]; public class Calculator { static Scanner sc = new Scanner(System.in); static int x, y; Statikus adattagok static String sign; public static void main(string[] args) { ReadData(); Print(Calc(x, y, sign)); sc.close();... 31/9 Darabolás Szöveg számmá konvertálása
Házi feladat 1. Tegye a Kalkulátor programot folyamatos működésűvé. A számítás elvégzése után kérdezze meg a felhasználót, hogy akar-e új műveletet megadni. Olvassa be a választ. Amíg igennel válaszol, addig fusson a program. 2. Oldja meg a műveleti string (term) ellenőrzését. 3. Alakítsa át úgy a programot, hogy valós számokra is működjön. 31/10
31/11
Feladat Deklaráljon, majd foglaljon helyet egy 10 elemű int tömb számára. Töltse fel 1 és 50 közötti véletlenszámokkal a tömböt. Használja a java.lang.math osztály random() metódusát! Ez a metódus a [0,1) felülről nyitott intervallumból egy lebegőpontos véletlenszámot ad vissza. A számtartományt a C-ből ismert (felsőhatáralsóhatár+1)+alsóhatár képlettel adhatjuk meg. double random = (Math.random() * 50) + 1; Ha int típusú véletlenszámot szeretnénk: int random = (int)(math.random() * 50) + 1; 31/12
Feladat A következő műveleteket külön függvényekben valósítsa meg: 31/13 Tömbelemek kiírása foreach ciklussal (Print). Keresse meg a tömbben a legnagyobb páros számot. Figyelje meg mi a különbség, ha a for ciklust, illetve ha a foreach ciklust használja! (SearchLargestEvenNumber) Számolja meg, hány négyzetszám van a tömbelemek között (SquareQuantity). A négyzetszám vizsgálatot oldja meg algoritmikus úton és a Math.sqrt() metódus felhasználásával is. Ez a metódus egy double típusú argumentumot vár és double értéket ad vissza. Számítsa ki a tömbelemek mértani átlagát (GeometricMean): a tömbelemek szorzata annyiadik gyök alatt, ahány tagú a szorzat. Gyökvonáshoz használja a Math osztály pow() hatványozó metódusát, amelynek első paramétere a hatványalap (double), második paramétere a hatványkitevő (double) és double értéket ad vissza.
A Print metódus kódja public static void Print(int[] x) { for (int a : x) System.out.println(a); 31/14
A SearchLargestEvenNumber metódus kódja public static int SearchLargestEvenNumber(int[] x) { int index= -1; for (int i = 0; i < x.length; i++) if (x[i] % 2 == 0) if (index== -1) index=i; else if (x[i] > x[index]) index=i; return index; public static int SearchLargestEvenNumber2(int[] x) { int index= -1; int cv=0; for (int i : x) { if (i % 2 == 0) if (index== -1) index=cv; else if (i > x[index]) index=cv; cv++; return index; 31/15
A SquareQuantity metódus kódja public static int SquareQuantity(int[] x) { int q=0; for (int i : x) if (i % Math.sqrt(i) == 0) q++; return q; 31/16
A GeometricMean metódus kódja public static double GeometricMean(int[] x) { double gm=1.0; for (int i : x) gm*=i; gm=math.pow(gm, (double)1/x.length); return gm; 31/17
A main metódus kódja public static void main(string[] args) { int[] tomb = new int[10]; for (int i = 0; i < tomb.length; i++) tomb[i]=(int)(math.random()*50+1); Print(tomb); if (SearchLargestEvenNumber2(tomb)==-1) System.out.println("Nincs páros szám a tömbben!"); else System.out.println("A legnagyobb páros szám a tömbben: "+ tomb[searchlargestevennumber2(tomb)]); System.out.println("Négyzetszámok darabszáma: "+ SquareQuantity(tomb)); System.out.println("Mértani átlag: "+GeometricMean(tomb)); 31/18 7 4 28 13 27 26 1 2 18 33 A legnagyobb páros szám a tömbben: 28 Négyzetszámok darabszáma: 2 Mértani átlag: 9.838781067884801
31/19
Tömbkezelő extrák Javasolt metódusok: A java.util.arrays osztály metódusaival kényelmesen kezelhetők a tömbök. Például: Tömb rendezése (nem ad vissza értéket): Arrays.sort(myArray); Bináris keresés tömbben (a megtalált elem indexét adja vissza): Arrays.binarySearch(myArray, searchkey); Két tömb azonosságának a vizsgálata (boolean-el tér vissza): Arrays.equals(a1, a2); Próbálja ki a metódusokat int, double és char tömbökön is. 31/20
A main metódus kódja int[] tomb = new int[10]; for (int i = 0; i < tomb.length; i++) tomb[i]=(int)(math.random()*50+1); Print(tomb); Arrays.sort(tomb); Print(tomb); System.out.println("Keresett: 15, eredmény: "+ Arrays.binarySearch(tomb, 15)); int[] t2 = tomb; System.out.println("Egyforma 'tomb' és 't2'? Válasz: "+ Arrays.equals(tomb, t2)); 31/21 2 8 26 45 15 9 5 42 7 26 2 5 7 8 9 15 26 26 42 45 Keresett: 15, eredmény: 5 Egyforma 'tomb' és 't2'? Válasz: true Keresett: 30, eredmény: -8
31/22
Feladat Írja meg a másodfokú egyenlet valós gyökeit meghatározó Java programot. A másodfokú egyenlet konstansait a felhasználó adja meg. Beolvasáshoz használja a Scanner osztályt, a számításhoz pedig a Math osztály sqrt() metódusát, amely egy double típusú argumentumot vár és double értéket ad vissza. Az első feladathoz hasonlóan: 1) kérje be egyenként a 3 számot, majd 2) egyetlen sztringként, ahol vesszővel választja el a számokat. 31/23
Magyarázatok Programlogika: Másodfokú egyenlet alakja: ax 2 + bx + c = 0 Diszkrimináns számítása: D = b 2 4ac Diszkrimináns vizsgálata: D = 0 Egy valós gyök D > 0 Két valós gyök D < 0 Két komplex gyök Valós gyök(ök) számítása: Lépések: 1. Együtthatók bekérése 2. Diszkrimináns számítás 3. Gyökök meghatározása, kiírása 31/24
A main metódus kódja public static void main(string[] args) { Scanner sc = new Scanner(System.in); System.out.println("Adja meg az együtthatókat!"); System.out.println("Négyzetes együttható: "); int a=sc.nextint(); System.out.println("Elsőfokú együttható: "); int b=sc.nextint(); System.out.println("Konstans együttható: "); int c=sc.nextint(); double d=math.pow(b,2)-4*a*c; double x1, x2; 31/25
A main metódus kódja if (d==0) { x1=(-b+math.sqrt(math.pow(b, 2)-4*a*c))/(2*a); System.out.println("D=0, a gyök: "+x1); else if (d>0) { x1=(-b+math.sqrt(math.pow(b, 2)-4*a*c))/(2*a); x2=(-b-math.sqrt(math.pow(b, 2)-4*a*c))/(2*a); System.out.println("D>0, a gyökök: "); System.out.println("x1= "+x1); System.out.println("x2= "+x2); else System.out.println("Mivel D<0, a gyökök komplexek."); sc.close(); Adja meg az együtthatókat! Négyzetes együttható: 2 Elsőfokú együttható: 4 Konstans együttható: 2 D=0, 31/26 a gyök: -1.0 Adja meg az együtthatókat! Négyzetes együttható: 1 Elsőfokú együttható: 6 Konstans együttható: 5 D>0, a gyökök: x1= -1.0 x1= -5.0 Adja meg az együtthatókat! Négyzetes együttható: 2 Elsőfokú együttható: 2 Konstans együttható: 2 Mivel D<0, a gyökök komplexek.
A main metódus kódja public static void main(string[] args) { Scanner sc = new Scanner(System.in); int a=0, b=0, c=0; boolean ok; do { System.out.println("Adja meg az együtthatókat, vesszővel elválasztva:"); String ins=sc.nextline(); String[] sa=ins.split(","); ok=true; try { Felügyelt blokk kezdete a=integer.parseint(sa[0]); b=integer.parseint(sa[1]); Felügyelt utasítások c=integer.parseint(sa[2]); catch (NumberFormatException ex) { ok = false; Felügyelt blokk vége while (!ok); 31/27 Számformátum hiba esetén
Are you on the picture! 31/28
Feladat Egész és valós típusú tömbök deklarálása, inicializálása, feltöltése véletlen számokkal. Szöveges tömb deklarálása, inicializálása, adatok beolvasása Adatok kiíratása (esetleg fordított sorrendben) Alapalgoritmusok: Összegzés, átlagolás, megszámlálás Minimum, maximum keresés Keresés (van-e a tömbben x-értékű elem, melyik az) Rendezés Mátrixok deklarálása, feltöltése (beolvasás, véletlen, inicializálás) Adatok kiíratása Összegzés, átlagolás, megszámlálás Keresés (min, max, adott érték) 31/29
31/30
VÉGE VÉGE 31/31