Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Programozási nyelvek II.

Hasonló előadás


Az előadások a következő témára: "Programozási nyelvek II."— Előadás másolata:

1 Programozási nyelvek II.
Objektumorientált programozás a Java nyelv eszközeivel 2007/08

2 Objektum, osztály Objektum: Információkat tárol, és kérésre feladatokat hajt végre. Logikailag összetartozó adatok és rajtuk dolgozó algoritmusok összessége: adatok metódusok Az objektumot üzenetek (kérelmek) által lehet megkérni a feladatok elvégzésére. (Ez egy metódus végrehajtását jelenti.) Osztály (class): Objektumtípus, amely alapján példá-nyokat, azaz objektumokat hozhatunk létre.

3 OO nyelvek Simula-67 Smalltalk (70’ eleje, XEROX)
Hibrid nyelvek: C++, Turbo Pascal Java: ’91-96, SUN MicroSystem

4 A Java főbb jellemzői C++-- kevesebb nyelvi eszköz, szigorúbb, kötöttebb, kevesebb hibalehetőség Hordozható kód: egy virtuális gépen (JVM, Java Virtual Machine) futó ún. bájtkód. Nincsenek implementációfüggő elemek. Rohamos fejlődés kulcsa a JVM beépítése a Web böngészőkbe. Fejleszthető: Alkalmazás (application) Applet Servlet JSP (Java Server Pages)

5 JDK (Java Development Kit)
Fejlesztői és futtató környezet (java.sun.com) Részei: API (Application Programming Interface) – osztály-könyvtár (a Java egyik ereje a rengeteg kész osztály) Fordító Értelmező Appletnéző Help, stb Újabb neve: pl. J2SE (Java 2 Platform, Standard Edition) Csomag: logikailag összetartozó osztályok. Csomag struktúra – könyvtár struktúra.

6 A Hello nevű osztály publikus, más csomagokból is látni lehet.
public class Hello{ public static void main(String[] args){ System.out.println("Hello World!"); } } A Hello nevű osztály publikus, más csomagokból is látni lehet. A main metódus a program belépési pontja. Publikus A static kulcsszó azt jelenti, hogy ez osztálymetódus void: nincs visszatérési értéke, azaz eljárás String[] args: a parancssor paraméterek A System egy osztály, amelyben található egy out objektum, melynek a println egy metódusa.

7 Kiírás, beolvasás import extra.*;
//importálni kell azon osztályokat, csomagokat, //amelyekre hivatkozunk ... int egysegar, mennyiseg, ar; //4 b. egész típus egysegar=Console.readInt("Egységár: "); mennyiseg=Console.readInt("Mennyiség: "); ar=egysegar*mennyiseg; System.out.println("Ön " + mennyiseg + " l benzint tankolt összesen " + ar + "Ft értékben"); //a System osztály a java.lang csomagban van //benne, amit nem kell importálnunk

8 Kiírás, beolvasás A Console osztály metódusai (függvényei):
int readInt() int readInt(String str) Hasonlóan: readLong, readDouble, readChar, readLine A print és println metódusoknak egyetlen paramé-terük lehet, de az többféle típusú. Ha egyszerre több dolgot is ki szeretnénk íratni, akkor ezeket össze kell adnunk. A Java automatikusan szöveggé konvertál. Pl. print("a+b=" + a + b) Pl. print("a+b=" + (a + b))

9 A program alkotóelemei
Azonosítóban betűk, számjegyek, a _ jel és a valuta szimbólumok szerepelhetnek. Számjeggyel nem kezdőd-het. Akár ékezetes betűt is tartalmazhat (unikód), de ezt inkább kerüljük. Kulcsszó Literál: állandó, amely beépül a program kódjába. Lehet: egész, valós (pl: ), logikai (true, false), karakter (pl. '?', '\u1ac5' ), szöveg (pl. "valami"), null. Vezérlő szekvenciák: \n \t \" \' \\ pl. println("Egy idézet: \"Talpra magyar!\"")

10 Java típusok Primitív típusok: (numerikus vagy logikai)
byte 1 b short 2 b int 4 b. kb -2* *109 long 8 b. kb float 4 b. double 8 b. char 2 b. boolean Referencia típus: olyan mutató, mely egy objektum hivatkozását tartalmazza. Numerikus típusok

11 Változó deklarálás Deklaráló utasítás
Adható kezdőérték is (inicializálás). Pl: int a, b; double x, y = 2.4;

12 A char is numerikus típus
char c; int a; c=65; System.out.println(c); c='A'+1; a=c+1; System.out.println(a);

13 Forrásprogram szerkezete
A forrásállomány (fordítási egység) egy vagy több osztályból állhat. A forrásállomány neve a main metódust tartalmazó egyetlen publikus osztály neve lesz. Fordításkor több class kiterjesztésű állo-mány keletkezhet.

14 import java.utils.*; import extra.*; //Egy vagy több osztály deklarálása, a sorrend mindegy class C1{ ... } class C2{ public class Prog{ public static void main(String[] args){

15 Operátorok Unáris postfix és prefix operátorok [ ] tömbképző
. minősítő ( ) metódus képző ~, ! ld. később new példányosító (típus)kifejezés típuskényszerítő +, előjel ++, -- léptető, pl. i++ vagy ++i mindkettő növeli i értékét, de az első értéke i eredeti, míg a második i megnövelt értéke lesz.

16 ++, -- int a = 0, b, c; b = ++a; a = 0; c = a++; c = ++b + a++;
c = a+++++b; c = a b;

17 Multiplikatív operátorok
*, / % maradékos osztás Ha az operandusok egészek, akkor az eredmény is egész, ha legalább az egyik operandus valós, akkor az eredmény is valós. Pl. int ossz = 2 + 3; double atlag = ossz / 2;

18 Bitenkénti operátorok
Additív operátorok +, - Relációs operátorok <, <=, >, >=,==, != Logikai operátorok ! nem &, && és |, || vagy ^ kizáró vagy Bitenkénti operátorok ~ komplementálás &, |, ^ (<<,>>,>>> léptetések)

19 Feltételes operátorok Értékadó operátorok
(feltétel) ? kifejezés1: kifejezés2 pl. kamat = (fiz>200000)?10:0; Értékadó operátorok =, +=, -=, *=, /=, %= … Az összetett értékadás szintaktikája: változó operátor = kifejezés a += b szemantikája: változó = (típus) változó operátor kifejezés a = a + b ahol típus a változó típusa, amelyet rákényszerí-tünk a jobboldalra.

20 Értékadó operátorok Vigyázzunk az összetett ill. a „hagyományos értékadó utasítások nem minden esetben teljesen egyformák! int a=10; a+=5; megegyezik az a=a+5 ut.-al, mindkét oldal int a+=1.5; nem egyezik meg az a=a+1.5 ut.-al, mely szintaktikai hibás, hiszen a jobb oldal double Lehetséges a többszörös értékadás, pl: a=b=5;

21 Kiértékelés Egy kifejezés kiértékelési sorrendjét meg-határozzák:
zárójel prioritás asszociativitás (balról – jobbra vagy jobbról – balra szabály)

22 Java utasítások deklaráló; pl. int a; értékadó; pl. a = b * 2;
postfix és prefix növelő és csökkentő; pl. a++; metódushívás, pl. System.out.println("Hahó!"); példányosítás, pl. auto = new Auto("ABC123"); Programvezérlő, pl. elágazások, ciklusok üres: ;

23 Java utasítások Minden utasítást pontosvessző zár le.
Blokk (vagy összetett utasítás): { ... }

24 Értékadó utasítás, típuskonverziók
változó = kifejezés; A kifejezés típusának értékadás szerint kompatíbilisnek kell lenni a változó típusával: azonos típusok a jobb oldal szűkebb, akkor implicit bővítő konverzió a bal oldal byte, short vagy char, a jobb oldal int, és a fordító el tudja dönteni, hogy a jobboldal belefér a baloldalba, akkor implicit szűkítő konverzió. pl. byte b = 100; (az egész literál automatikusan int típusú). minden más esetben fordítási hiba keletkezik

25 Értékadó utasítás, típuskonverziók
int i; double d; d = i; //implicit bővítő konverzió i = d; //szintaktikai hiba i = (int)d; //explicit szűkítő konv.

26 Metódushívás Osztály.metódus(paraméterek) pl. y=Math.sin(x);
Objektum.metódus(paraméterek) pl. hossz=szoveg.length(); Saját osztályból elég csak a metódus neve: metódus(paraméterek) Egy metódus lehet eljárás- vagy függvényszerű. Túlterhelés (overloading): lehet több azonos nevű metódus, melyek a paraméterezésben és/vagy a visszatérési érték típusában térhetnek el egymástól. Pl. float max(float a, float b) illetve int max(int a, int b)

27 A java.lang.Math osztály
Java API (Application Programming Interface): rengeteg csomag, osztály Nem kell importálni. Konstansok: E, PI Függvények: abs, asin, sin, cos, atan, tan, exp, log, max, min, pow, sqrt, toDegrees, toRadians, random, round…

28 Java API dokumentum részlet
static int min(int a, int b)           Returns the smaller of two int values. static long min(long a, long b)           Returns the smaller of two long values. static double pow(double a, double b)           Returns of value of the first argument raised to the power of the second argument. random()           Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.

29 min public static int min(int a, int b) Returns the smaller of two int values. That is, the result the argument closer to the value of Integer.MIN_VALUE. If the arguments have the same value, the result is that same value. Parameters: a - an argument. b - another argument. Returns: the smaller of a and b. See Also: Long.MIN_VALUE

30 Szelekciók - if utasítás
if(feltétel) utasítás1; else utasítás2; feltétel: logikai kifejezés az else ág elhagyható a feltétel után nincs pontosvessző az utasítás esetén viszont van pontosvessző minden feltétel zárójelben egy ágban több utasítás: blokk {...} egymásba ágyazás if(a>b) c=a; else c=b;

31 Szelekciók - switch utasítás
switch(kifejezés){ case érték1: utasítások; break; case érték2: utasítások; break; default: utasítások; } akkor alkalmazható, ha egy kifejezés jól meghatározott, különálló értékeire szeretnénk bizonyos utasításokat végrehajtani kifejezés: byte, short, int vagy char a break hatására a switch blokk végére kerül a vezérlés, e nélkül a következő case ágra kerülne a vezérlés egy case kulcsszóhoz csak egy érték tartozhat

32 Szelekciók - switch utasítás
switch(pont){ case 1: case 2: case 3: System.out.println("Elégtelen"); System.out.println("Készüljön tovább!"); break; case 4: System.out.println("Elégséges"); case 5: System.out.println("Közepes"); case 6: System.out.println("Jó"); default: System.out.println("Jeles"); }

33 Iterációk - while utasítás
while(feltétel) utasítás; Amíg a feltétel igaz, újból végrehajtja az utasítást, ha hamis, akkor a ciklust követő utasításra lép. Több utasítás esetén: blokk { ... } Példa: Bankba tesszük a pénzünket kamatozni, és addig tartjuk bent, amíg milliomosok nem leszünk. A program számolja ki, hogy hány évet kell várnunk.

34 Iterációk - while utasítás
import extra.*; public class Milliomos1{ public static void main(String[]args){ final double KAMAT=8.5; //konstans int ev=0; int penz=Console.readInt("Összeg: "); while(penz< ){ penz*=1+KAMAT/100; //Ft-ra kerekít ev++; } System.out.println(ev+ " ev mulva leszunk milliomosok!");

35 Iterációk - do...while utasítás
do utasítás; while(feltétel) Amíg a feltétel igaz, újból végrehajtja az utasítást, ha hamis, akkor a ciklust követő utasításra lép. Több utasítás esetén: blokk { ... } Példa: Bankba tesszük a pénzünket kamatozni, és addig tartjuk bent, amíg milliomosok nem leszünk. A program számolja ki, hogy hány évet kell várnunk.

36 Iterációk - do...while utasítás
import extra.*; public class Milliomos2{ public static void main(String[]args){ final double KAMAT=8.5; //konstans int ev=0; int penz=Console.readInt("Összeg: "); do{ penz*=1+KAMAT/100; //Ft-ra kerekít ev++; }while(penz< ); System.out.println(ev " ev mulva leszunk milliomosok!"); }

37 Iterációk - for utasítás
for(inicializálás; feltétel; léptetés) utasítás; inicializálás: egy vagy több utasítás vesszővel elválasztva, mely(ek) egyszer hajtódik végre a ciklusmagba való első belépés előtt. Pl. ciklusváltozó deklarálása, inicializálása. A ciklusváltozó típusa tetszőleges. feltétel: amíg igaz, újból végrehajtja az utasítást, ha hamis, akkor a ciklust követő utasításra lép. léptetés: egy vagy több utasítás vesszővel elválasztva, mely(ek) a ciklusmag minden egyes lefutása után automatikusan végrehajtódik. Általában a ciklusváltozót szokás itt növelni vagy csökkenteni.

38 Iterációk - for utasítás
A while ciklus egy speciális esetének tekinthető: for(inicializálás; feltétel; léptetés) utasítás; inicializálás; while(feltétel){ utasítás; léptetés }

39 Iterációk - for utasítás példák
for(int i=1; i<=10; i++) System.out.print("*"); for(int i=1; i<=10; i++){ for(int j=1; j<=10; j++) System.out.print("*"); System.out.println(); }

40 for(char c='A'; c<='Z'; c++) System.out.print(c+" ");
//(c+' ') esetén a kódokat írja ki for(char n='A',k='a'; n<='Z'; n++,k++) System.out.print(n+" "+k+" "); for(double d=500000; d<= ; d*=1.1) System.out.println(d);

41 Kiugrás a ciklusból Break utasítás: az aktuális utasításblokk-ból (pl. ciklusból) való azonnali kiugrást eredményezi. Continue utasítás: hatására a vezérlés az utasításblokk (ciklus) végére kerül.

42 Metódusok írása A metódus fej szintaktikája: [módosítók] visszatérésitípus metódusneve( [paraméterlista] ) Néhány példa: public static int min(int a, int b) public void vonalhuz() public void vonalhuz(int hossz) long fakt(byte n)//csomag szintű láthatóság Módosítók lehetnek: public, private, protected: láthatóság static: osztálymetódus stb.

43 Függvény, eljárás A metódusoknak két fajtáját különböztetjük meg:
Eljárás–szerű metódus: visszatérési értékének típusa void, azaz üres típus, nem tér vissza értékkel Függvény–szerű metódus: visszatérési értéké-nek típusa valamilyen voidtól különböző típus, azaz igazi értékkel tér vissza A függvény eljárásként is hívható.

44 Metódusok jellemzői Túlterhelés (overloading): lehet két egyforma nevű, de különböző paraméterezésű metódus. pl. vonalhuz() ill. vonalhuz(int hossz) vagy min(int a, int b) ill. min(double a, double b) Paraméterátadás: érték szerinti. Az aktuális paraméter típusának értékadás szerint kompatíbilisnek kell lennie a formális paraméterrel. Visszatérés a metódusból: függvény esetén return után kötelezően meg kell adnunk egy értéket.

45 Metódusok jellemzői Az osztály metódusainak deklarálási sor-rendje tetszőleges. A main-t elsőnek vagy utolsónak célszerű megadni. A metódusok nem ágyazhatóak egymásba. Lehet rekurzív metódusokat is definiálni. A metódusban –mint egyébként is bármely blokkban– definiálhatunk lokális változót.

46 public class Metodusok{
public static void vonalhuz(int hossz){ for (int i=1; i<=hossz; i++) System.out.print("-"); System.out.println(); } public static void vonalhuz(){ vonalhuz(50); public static int abs(int n){ if (n>=0) return n; else return -n;

47 public static void main(String[] args){ int a=-10; int b=12345678;
public static int jegySzam(int n){ int jszam=0; do{ n/=10; jszam++; }while(n!=0); return jszam; } public static void main(String[] args){ int a=-10; int b= ; vonalhuz(); System.out.println(a+" abszolut erteke: "+abs(a)); vonalhuz(40); System.out.println(b+" jegyeinek szama: "+jegySzam(b));

48 A String osztály A String osztályú objektum olyan szöveg tárolására szolgál, amelynek értékét nem akarjuk megváltoztatni. (Ha mégis szeretnénk, akkor ne a String, hanem a Stringbuffer osztályt használ-juk, de ezzel nem foglalkozunk.)

49 Objektum létrehozása a new operátorral
Auto auto; //csak referencia auto = new Auto("GHJ123”); //a konstruktor hívásával létrejön az objektum, //az auto referencia erre mutat vagy Auto auto = new Auto("GHJ123”); Osztályazonosító objektum = new Osztályazonosító(paraméterlista);

50 String objektum létrehozása
String szoveg; //csak referencia szoveg = new String(”Ez a tartalma”); csak String esetén ez egyszerűsíthető: szoveg=”Ez a tartalma”;

51 A String osztály metódusai
Az eredeti objektumot nem változtatják, függvények, sokszor új String objektumot hoznak létre. Néhány metódus: char charAt(int index) tetszőleges indexű karakterét adja vissza, az indexelés 0-val kezdődik int compareTo(String str) összehasonlítja, értéke 0, ha egyenlő; –, ha kisebb; +, ha nagyobb, mint a paraméter

52 boolean equals(Object anObject)
igaz, ha az objektum String típusú, s karakterei ugyanazok int indexOf(String str) az adott sztring első előfordulásának pozíciója lesz az értéke, ha nincs benne, akkor érték –1 int indexOf(String str, int fromIndex) az adott sztring első előfordulásának pozíciója lesz az értéke, a keresést a második paraméterben megadott sorszámú karak-tertől kezdi, ha nincs benne, akkor az érték –1 int length() hosszát adja vissza

53 String replace(char oldChar, char newChar)
kicseréli a megadott karaktereket, s visszaadja az új sztringet (maga a sztring objektum nem változik meg) String substring(int beginIndex) a paraméterben megadott pozíciótól a szöveg végéig kimásol String substring(int beginIndex, int endIndex) a kezdő pozíciótól a végpozícióig kimásol, endIndex nem tartozik bele a részláncba, így a visszaadott sztring hossza endIndex- beginIndex String toLowerCase() kisbetűsre alakítottan adja vissza String toUpperCase() nagybetűsre alakítottan adja vissza

54 String trim() levágja a fehér szóközöket (space, tab, sorvégejel) az elejéről és végéről, s visszaadja Stb. Ezek példánymetódusok, hívásuk: objektumnév.metódusnév([paraméterlista]) pl: int hossz = szoveg.length(); Sztringet bekérni a billentyűzetről az extra csomagbeli Console osztály readLine() metódusával lehet. pl: String nev = Console.readLine("A neved: ");

55 1. példa String s = Console.readLine(); for(int i=s.length()-1; i>=0; i--) System.out.print(s.charAt(i)); System.out.println(); System.out.println(s.toUpperCase()); System.out.println(s.toLowerCase()); if(s.length()>=9) System.out.println(s.substring(0,9)); if(s.length()>=3) System.out.println(s.substring(s.length()-3)); System.out.println(s.replace(' ','-'));

56 2. példa String s=Console.readLine(); String elso=s; while(!s.equals("*")){ if(s.compareTo(elso)<0) elso=s; s=Console.readLine(); } System.out.println(elso);

57 Osztály készítése

58 Objektum, osztály Objektum: Információkat tárol, és kérésre feladatokat hajt végre. Logikailag összetartozó adatok és rajtuk dolgozó algoritmusok összessége: adatok metódusok Az objektumot üzenetek (kérelmek) által lehet megkérni a feladatok elvégzésére. (Ez egy metódus végrehajtását jelenti.) Osztály (class): Objektumtípus, amely alapján példá-nyokat, azaz objektumokat hozhatunk létre.

59 Előnyök, célok A szoftverfejlesztés során az együtt változó részek elkülöníthetők Projektek közötti újrahasznosíthatóság növelése

60 Konstruktor, példánytag, osztálytag
Az objektumot létre kell hozni, és inicializálni kell. Az inicializálást végző metódust konstruktornak nevezzük. További fogalmak: példányváltozó, példánymetódus, osztályváltozó (közös változó), osztálymetódus (objektum létrehozása nélkül is tud dolgozni, csak az osztályváltozókat manipulálhatja)

61 OOP jellemzők Bezárás, az információ elrejtése: az adatokat csak interfészeken (metódusok) keresztül lehet elérni. Öröklődés: az utód osztály örökli az ős adatait, metódusait, valamint tartalmazhat újakat, és felülírhat régi metódusokat. Polimorfizmus – többalakúság: ugyanarra az üzenetre (kérelemre), azaz metódus hívásra, különböző objektumok különbözőképpen reagál-hatnak.

62 Láthatóság Az osztály deklarálásakor megadhatjuk, hogy mely adatokat lehet az objektumon kívülről elérni Nyilvános (public): kívülről elérhető Védett (protected): hozzáférés csak saját és az örökös metódusok számára Privát (private): hozzáférés csak saját metó-dusok számára

63 OO program vezérlő objektum üzenet3 objektum3 fut üzenet1 üzenet2
Egy objektumorientált program egymással kommunikáló objektumok összessége, melyben minden objektumnak megvan a feladatköre vezérlő objektum üzenet3 objektum3 fut üzenet1 üzenet2 objektum1 objektum2 üzenet1

64 Példa - Ember osztály és példányai
pozíció(x,y) iránySzög megy(táv) elmegy(x,y) fordul(szög) Ember zsófi andor kati

65 Az OOP fontosabb definícióinak összefoglalása
Példánydeklaráció (példánytag): A példányonként (objektumonként) helyet foglaló változók a példányváltozók (példányadatok). Azon metódusokat, melyek példányadatokon dolgoznak, példánymetódusoknak nevezzük. Osztálydeklaráció (osztálytag) (static) Az osztályváltozó az osztály saját változója, az egyes példányokban nem szerepel, valamilyen közös adatot tárol. Az osztálymetódus az osztály saját metódusa, amely csak osztályváltozókon dolgozik.

66 Láthatóság Privát (private): csak az osztály saját metódusai fér-hetnek hozzá. Nyilvános (public): minden, az objektummal kapcsolat-ban álló kliens eléri, használhatja. Egy osztály adatai általában privát adatok. Egy fordítási egység (java fájl) több osztályt is tartalmaz-hat, de közülük csak egy lehet nyilvános (public). Ha valamelyik osztályban szerepel a main metódus, akkor az nyilvános kell hogy legyen.

67 A deklarálás sorrendje általában:
Egy osztályban ugyanazon a néven dekla-rálható metódus és változó, sőt a metódu-sok túlterhelhetőek. A deklarálás sorrendje általában: változók konstruktorok metódusok main metódus, ha van.

68 A lokális változók eltakarják az ugyanolyan nevű osztály-, illetve példányváltozókat.
Ha az osztály deklarációjára szeretnénk hivat-kozni, akkor osztályváltozó esetén az osztály nevével, példányváltozó esetén pedig a this referenciával kell azt minősítenünk. Változók alapértelmezés szerinti kezdeti értékei: osztályváltozó vagy példányváltozó esetén 0, lokális változó esetén határozatlan.

69 Konstruktorok Feladata az objektum new operátorral való létrehozásakor annak inicializálása. Auto auto = new Auto("GHJ123”); A konstruktor speciális metódus, a következő szabályok érvényesek rá: Neve kötelezően megegyezik az osztály nevével. Csak a new operátorral hívható. Túlterhelhető. Nincs visszatérési értéke, és nem is void. Ha az osztályban nem adunk meg explicit módon konstruktort, akkor az osztálynak lesz egy alapértelmezés szerinti (default), paraméter nélküli konstruktora. Ha az osztályban létezik egy explicit konstruktor, akkor nem lesz implicit, alapértelmezés szerinti konstruktora.

70 Példa - Raktárprogam Adott egy zöldségraktár, melyben pillanatnyilag egyetlen árut, paradicsomot raktározunk. A raktárba gyakran te-szünk be, illetve veszünk ki onnan paradicsomot. A para-dicsom pillanatnyi egységára 300 Ft, de ez változhat. Készítsünk olyan programot, mely segítségével rögzíteni tudjuk a megfelelő adatokat, és bármikor jelentést tudunk adni a paradicsom aktuális mennyiségéről, egységáráról és értékéről! Végezzük el a következő akciókat: Tegyünk a raktárba 125 kg paradicsomot, aztán vegyünk ki 25 kg-ot, majd szállítsuk le a paradicsom egységárát 210 Ft-ra! Mindhárom akció után írjuk ki, mennyi paradicsom van raktáron és milyen értékben!

71 Osztálydiagram Aru -nev: String -egysegar: double -menny: double
RaktarProgram +Aru(aNev:String,aEgysegar:double) +getNev(): String +getEgysegar(): double +setEgysegar(aEgysegar:double) +getMenny(): double +getAr(): double +hozzatesz(aMenny:double) +elvesz(aMenny:double) +toString(): String -aru +RaktarProgram() +akciok() +main(args)

72 Osztálydiagram Aru -nev: String -egysegar: double -menny: double
RaktarProgram +Aru(aNev:String,aEgysegar:double) +getNev(): String +getEgysegar(): double +setEgysegar(aEgysegar:double) +getMenny(): double +getAr(): double +hozzatesz(aMenny:double) +elvesz(aMenny:double) +toString(): String -aru +RaktarProgram() +akciok() +main(args)

73 Példányváltozók Konstruktor class Aru { private String nev;
private double egysegar; private double menny; public Aru(String aNev, double aEgysegar) { nev = aNev; egysegar = aEgysegar; menny = 0; } public String getNev() { return nev; Példányváltozók Konstruktor Osztálydiagram

74 public double getEgysegar() { return egysegar; }
public void setEgysegar(double aEgysegar) { if (aEgysegar >= 0) egysegar = aEgysegar; public double getMenny() { return menny; public double getAr() { return menny*egysegar; Osztálydiagram

75 public void hozzatesz(double aMenny) { if (aMenny>0)
menny += aMenny; } public void elvesz(double aMenny) { if (aMenny>0 && aMenny<=menny) menny -= aMenny; public String toString() { return nev+"\tEgysegar: "+egysegar+ "\tMenny: "+menny+"\tAr: "+getAr(); Osztálydiagram

76 Objektum létrehozása saját osztályából
public class RaktarProgram { private Aru aru; public RaktarProgram() { aru = new Aru("Paradicsom",300); } public void akciok() { aru.hozzatesz(125); System.out.println(aru); aru.elvesz(25); aru.setEgysegar(210); public static void main(String[] args) { RaktarProgram program = new RaktarProgram(); program.akciok(); Kapcsolat Objektum létrehozása saját osztályából Objek Osztálydiagram

77 7: setEgysegar(aEgysegar)
Együttműködési diagram 3: Aru(aNev,aEgysegar) 5: hozzatesz(aMenny) 6: elvesz(aMenny) 7: setEgysegar(aEgysegar) 1: main(args) 2: RaktarProgram() 4: akciok() RaktarProgram program: RaktarProgram aru:Aru

78 Készítsünk egy banki programot, mely az ügyfelek számláit kezeli.
Példa – Bankprogam Készítsünk egy banki programot, mely az ügyfelek számláit kezeli. Osztálydiagram Szamla -utolsoSzamlaSzam: int -szamlaSzam: int -tulajdonos: String -egyenleg: int Bank -szamla1 -szamla2 +Bank() +ugyfelKiszolgalas (szamla:Szamla) +menu() +main(args) +Szamla(tulajdonos:String,egyenleg:int) +Szamla(tulajdonos:String) +getTulajdonos(): String +setTulajdonos(Tulajdonos:String) +befizet(osszeg:int) +kivesz(osszeg:int): int +toString(): String

79 import extra.*; class Szamla{ private static int utolsoSzamlaSzam=0; private int szamlaSzam; private String tulajdonos; private int egyenleg; public Szamla(String tulajdonos, int egyenleg){ szamlaSzam=++utolsoSzamlaSzam; this.tulajdonos=tulajdonos; this.egyenleg=egyenleg; } public Szamla(String tulajdonos){ this(tulajdonos,0); public String getTulajdonos(){ return tulajdonos;

80 this.tulajdonos=tulajdonos; } public void befizet(int osszeg){
public void setTulajdonos(String tulajdonos){ this.tulajdonos=tulajdonos; } public void befizet(int osszeg){ if(osszeg>=0) egyenleg+=osszeg; public int kivesz(int osszeg){ if(osszeg>=0 && osszeg<=egyenleg) egyenleg-=osszeg; return egyenleg; public String toString() { return "Szamlaszam: "+szamlaSzam+" Tulajd.: "+tulajdonos+ " Egyenleg: "+egyenleg; }//Számla osztály vége

81 public class Bank { private Szamla szamla1, szamla2; public Bank() { szamla1 = new Szamla("Kiss Istvan", ); szamla2 = new Szamla("Nagy Peter"); } public void ugyfelKiszolgalas(Szamla szamla) { char valasz; do{ valasz=Character.toUpperCase(Console.readChar("B(efizet)/K(ivesz)")); }while(valasz!='B' && valasz!='K'); if (valasz == 'B') szamla.befizet(Console.readInt("Mennyit fizet be? ")); else{ int egyenleg = szamla.kivesz(Console.readInt("Mennyit vesz ki? ")); System.out.println("Maradek egyenleg "+egyenleg+" Ft");

82 System.out.println("\n\n"+szamla1); System.out.println(szamla2);
public void menu() { char valasz; do{ System.out.println("\n\n"+szamla1); System.out.println(szamla2); System.out.println("\n1: 1. ugyfel kiszolgalasa"); System.out.println("2: 2. ugyfel kiszolgalasa"); System.out.print ("V: Vege "); valasz = Character.toUpperCase(Console.readChar()); switch (valasz) { case '1': ugyfelKiszolgalas(szamla1); break; case '2': ugyfelKiszolgalas(szamla2); break; } }while (valasz!='V'); public static void main(String[] args) { Bank otp = new Bank(); otp.menu(); }//Bank osztály vége

83 Tömbök A tömb referencia típusú változó, melyet deklarál-nunk kell. Az elemtípus lehet akár primitív, akár referencia (osztály típusú vagy tömb típusú). Deklarálás: elemtípus [] tömbazonosító; vagy elemtípus tömbazonosító []; pl: int [] a; int b[];

84 Létrehozás (futás közben):
Az így deklarált változó képes egy, a megadott elemtípusú tömbre mutatni. Még csak a referenciának (memóriacímnek) foglaltunk helyet, a tömböt külön létre kell hoznunk. Létrehozás (futás közben): new elemtípus [méret] pl: a = new int[10]; b = new int[20]; Természetesen történhet rögtön a deklaráláskor is a létrehozás: String[] sTomb = new String[50];

85 Minden tömbnek van egy length konstansa.
Indexelés: 0 .. length-1 int[] iArray=new int[10]; for(int i=0; i<iArray.length; i++) iArray[i]=Console.readInt(i+1+". szam: "); System.out.println("Az elemek visszafele:"); for(int i=iArray.length-1; i>=0; i--) System.out.print(iArray[i]+" "); for(int i=0; i<10; i++)

86 Tömb inicializálása Inicializáló blokk: deklaráláskor a tömb elemeinek kezdeti értékek adhatók, pl: int[] iArray={2, 4, 6, 8, 10}; char[] szamjegyek={'0','1','2','3','4','5','6','7','8','9'} Ekkor nem kell a tömböt a new operátorral létrehozni, a {} blokk képző operátor megteszi ezt helyettünk. A tömb mérete pontosan akkora lesz, amennyi a felsorolt értékek száma.

87 Értékadás tömbök között
A t2 tömb értékadás szerint kompatibilis a t1 tömbbel (azaz t1=t2 megengedett), ha primitív elemtípus esetén t1 és t2 elemtípusa azonos; referencia elemtípus esetén t2 elemtípusa t1 elem-típusával azonos, vagy annak leszármazottja. Értékadáskor a tömb referenciája kap értéket, nem pedig az elemei (a tömb nem másolódik, hanem átíródik a mutatója), így különböző hosz-szúságú tömbök is értékül adhatók egymásnak.

88 Kétdimenziós tömb Deklarálás: elemtípus [][] tömbazonosító;
Teljes kétdimenziós tömb létrehozása: new elemtípus [méret0] [méret1] Pl: int[][] matrix Lépésenkénti (soronkénti) létrehozás. A sorok különböző méretűek lehetnek, pl: double[][] atlagok = new double[4][]; atlagok[0] = new double[20]; atlagok[1] = new double[18]; atlagok[2] = new double[25]; atlagok[3] = new double[22]; Analóg a helyzet a többdimenziós tömbök esetén. = new int[3][4];

89 Tömb paraméter Formális paraméterként egy tömbreferenciát kell deklarálnunk, amely fogadja az aktuális tömb referenciáját. Az aktuális tömbnek értékadás szerint kompatíbi-lisnek kell lennie a formális tömbbel. Példa: Írjunk osztályt, amelynek adata egy int tömb. Az objektum létrehozásakor a konstruktor paraméterében adhassuk meg a tömb hosszát. Tartalmazzon egy bekér, kiir és egy osszeg nevű metódust!

90 import extra.*; class Tomb{ private int[]t; public Tomb(int hossz){ t = new int[hossz]; } public void beker(){ for(int i=0; i<t.length; i++) t[i] = Console.readInt(i+1+". szam: "); public void kiir(){ for(int i=0;i<t.length;i++) System.out.print(t[i]+" "); System.out.println(); public int osszeg(){ int s=0; for(int i=0;i<t.length;i++) s+=t[i]; return s; }//Tomb

91 public class Tombok{ public static void main(String[] args){ Tomb t1=new Tomb(5); Tomb t2=new Tomb(7); System.out.println("Adja meg az 1. tomb elemeit (5):"); t1.beker(); System.out.println("Adja meg a 2. tomb elemeit (7):"); t2.beker(); System.out.println("Az elso tomb:"); t1.kiir(); System.out.println("Az elemek osszege: "+ t1.osszeg()); System.out.println("A masodik tomb:"); t2.kiir(); }

92 Konténerek A konténer olyan objektum, amely objektumokat tárol, és alkalmas különböző karbantartási, keresési és bejárási funkciók megvalósítására. A java.util csomagban helyet foglaló kollekció keretrendszer egy általános konténereket tartalmazó osztálygyűjtemény. Általánosan jellemző rájuk: ha bármilyen objektumot beteszünk egy konténerbe, az „elveszti az osztálytudatát”.

93 Vector osztály „Változtatható méretű tömb”, amely ren-delkezik a fenti funkciókkal. Mérete az elemek hozzáadásával automa-tikusan bővül. Elemei indexelhetőek. Elemei rendezetlenek (a Collections osztállyal lehet rendezni).

94 void add(int index, Object element)           Inserts the specified element at the specified position in this Vector.  boolean add(Object o)           Appends the specified element to the end of this Vector.  void clear()           Removes all of the elements from this Vector.  boolean contains(Object elem)           Tests if the specified object is a component in this vector. Object get(int index)           Returns the element at the specified position in this Vector. int indexOf(Object elem)           Searches for the first occurence of the given argument, testing for equality using the equals method.  int indexOf(Object elem, int index)           Searches for the first occurence of the given argument, beginning the search at index, and testing for equality using the equals method.  boolean isEmpty()           Tests if this vector has no components. Object remove(int index)           Removes the element at the specified position in this Vector.

95 boolean remove(Object o)           Removes the first occurrence of the specified element in this Vector
If the Vector does not contain the element, it is unchanged.  Object set(int index, Object element)           Replaces the element at the specified position in this Vector with the specified element.  int size()           Returns the number of components in this vector.  String toString()           Returns a string representation of this Vector, containing the String representation of each element.

96 TörpeProgram * Ember TorpeProgram -nev: String -magassag: int
+Ember(String,int) +Ember(String) +getNev(): String +getMagassag():int +setMagassag(int) +equals(Object): boolean +toString(): String TorpeProgram TorpeProgram() bevitel() lista() kereses() +main() * torpek {Vector}

97 import extra.*; import java.util.*; class Ember{ private String nev; private int magassag; public Ember(String nev, int magassag){ this.nev = nev; this.magassag = magassag; } public Ember(String nev){ this(nev,0); public String getNev(){ return nev; public int getMagassag(){ return magassag;

98 public void setMagassag(int mag){
if (mag>0) magassag = mag; } public boolean equals(Object obj){ return nev.equals(((Ember)obj).getNev()); public String toString(){ return Format.left(nev,10) + Format.right(magassag,3); }//Ember osztály vége

99 public class TorpeProgram {
private Vector torpek = new Vector(); // A torpék bevitele: void bevitel(){ Ember torpe; String nev = Console.readLine("\nTorpe neve: "); while (!nev.equals("")){ torpe = new Ember(nev); torpe.setMagassag(Console.readInt("magassaga : ")); torpek.add(torpe); nev = Console.readLine("Torpe neve: "); }

100 void bevitel(){ Ember torpe; String nev = Console.readLine("\nTorpe neve: "); while(!nev.equals("")){ if(torpek.contains(torpe = new Ember(nev))) System.out.println("Van mar ilyen torpe!"); else{ torpe.setMagassag(Console.readInt("magassaga : ")); torpek.add(torpe); } nev = Console.readLine("Torpe neve: "); torpe = new Ember(nev)); if(torpek.contains(torpe)) System.out.println("Van mar ilyen torpe!"); else{ torpe.setMagassag(Console.readInt("magassaga : ")); torpek.add(torpe); } nev = Console.readLine("Torpe neve: ");

101 // Egyszerű lista, beépített módon:
void lista1(){ System.out.println("\nBeepitett lista:"); System.out.println(torpek); } // torpek listázása index szerint, toString()-gel: void lista2(){ System.out.println("\nLista index szerint:"); for(int i=0; i<torpek.size(); i++){ System.out.println(torpek.get(i)); // Listázás toString() nélkül: void lista3(){ Ember e; System.out.println("\nEgyeni lista:"); e = (Ember)(torpek.get(i)); System.out.println("Nev: "+e.getNev()+ " Magassag: "+e.getMagassag());

102 // Egy törpe megkeresése:
void kereses() { System.out.println("\nKereses:"); Ember keresettEmber = new Ember( Console.readLine("Torpe neve: ")); int poz = torpek.indexOf(keresettEmber); if (poz >= 0) System.out.println("Van, magassaga:"+ ((Ember)(torpek.get(poz))).getMagassag()); else System.out.println("Nincs ilyen"); } public static void main(String[] args) { TorpeProgram tp = new TorpeProgram(); tp.bevitel(); tp.lista1(); tp.lista2(); tp.lista3(); tp.kereses();

103 Készítse el az alábbi metódusokat:
Készítsen egy KaveAutomata osztályt, melynek adatai: kávémárka, ár (Ft/dl), a tartályban lévő mennyiség, a tartály kapacitása. A konstruktor paramétereken keresztül inicializálja a fajtát, az árat és a kapacitást, a tartály legyen tele. Készítse el az alábbi metódusokat: - beállító és lekérdező metódusok az árra. - vesz: paraméterként adhatjuk meg, hogy hány dl-t veszünk, visszatérési érték a fizetendő összeg. Ha nincs a venni kívánt mennyiség a tartályban, akkor -1 legyen a visszatérési érték. - feltölt: tele tölti a tartályt, visszatérési értéke a betöltött mennyiség. - toString: az összes adat kiírására. A vezérlő KaveProgram osztályban hozzon létre egy KaveAutomata osztályú objektumot, majd szimulálja a működését.

104 import extra.*; class KaveAutomata{ private String marka; private double ar; private double mennyiseg; private double kapacitas; public KaveAutomata(String marka, double ar, double kapacitas){ this.marka = marka; this.ar = ar; this.kapacitas = kapacitas; mennyiseg = kapacitas; } public double getAr(){ return ar; public void setAr(double ar){

105 public double vesz(double menny){
if (menny<=mennyiseg){ mennyiseg-=menny; return menny*ar; } else{ return -1; public double feltolt(){ double kell=kapacitas-mennyiseg; mennyiseg=kapacitas; return kell; public String toString(){ return "Marka: "+marka+"Ar: "+ar+"Kapacitas: "+kapacitas+ " Mennyiseg: "+mennyiseg;

106 KaveAutomata automata = new KaveAutomata("Omnia",100,50);
double m=Console.readDouble("Hany decit: "); fiz = automata.vesz(m); if (fiz!=-1) System.out.println(fiz+" Ft-ot kell fizetnie"); else System.out.println("Nincs annyi"); System.out.println(automata); System.out.println("Feltoltes "+automata.feltolt()+" dl");


Letölteni ppt "Programozási nyelvek II."

Hasonló előadás


Google Hirdetések