You are on page 1of 505

ANGSTER ERZSBET

OBJEKTUMORIENTLT TERVEZS S PROGRAMOZS

Java
ELS KTET

A knyv kt ktetnek kzs elektronikus mellklete megtallhat itt: http://4kor.hu


Angster Erzsbet, 2001

Harmadik, tdolgozott kiads, 2003

Minden jog fenntartva. A szerz elzetes rsbeli engedlye nlkl a knyvet


semmilyen formban sem szabad reproduklni.

Kiadja: 4KR Bt.

Szakmai lektor: Zsembery goston


Nyelvi lektor: Honffy Pl
Szerkeszt: Angster Erzsbet
Bortterv: Brczi Zsfia

ISBN 963 00 6262 3


ISBN 963 00 6263 1

Akadmiai Nyomda, Martonvsr


Felels vezet: Reisenleitner Lajos

ii
Elsz

A Java nyelv igazn korszer, objektumorientlt programozsi nyelv. Szinte minden informati-
khoz kzel ll cg keres Java fejlesztket.

J szoftverfejleszt kpzse rvid id alatt


Ha a programozs oktatsnak clja a mai elvrsoknak eleget tev szoftverfejlesztk kineve-
lse, akkor be kell ltnunk: mindenekeltt az objektumorientlt (OO) szoftverfejlesztsi ksz-
sget s gondolkodsmdot kell kialaktani a programozst tanulkban. A feladat nem egy-
szer: a rendelkezsre ll id bizonyos kpzsi formkban mindssze kt v, s ez id alatt a
mindenkori piaci ignyeknek megfelel programozkat kell kpezni. Egy programoz ma
ltalban OO fejleszteszkzzel dolgozik, s egyre inkbb elvrjk az OO CASE eszkz isme-
rett is. A hallgatt a nulla programozi tudsrl odig kell eljuttatnunk, hogy objektumorien-
tlt mdszert alkalmazva tervezze, kdolja, tesztelje s dokumentlja rendszert. Az a tanr,
aki mr megprblta mindezen ismereteket elsajtttatni a hallgatkkal, tudja, hogy ez milyen
nehz feladat. Egszen bizonyos, hogy nincs vesztegetni val idnk: nem tehetjk mr meg,
hogy az id harmadt-felt strukturlt alapozssal tltsk el. Nem tehetjk ezt meg azrt sem,
mert a hallgatnak az anyanyelvi szemllete ily mdon a strukturlt lesz, s ez rengeteg
felesleges energijt emszti fel. Biztos vagyok benne, hogy azok a hallgatk, akik az objek-
tumorientlt paradigmn (szemlletmdon) nnek fel, sokkal otthonosabban fognak mozogni
a mai elvrsoknak megfelel szoftverfejlesztsi projektekben.

Elzetes tapasztalatok
Ez a knyv 20 ves oktati s programozi munkm fontos lpcsfoka. Az utbbi t vben sok
konferencin voltam jelen a programozs oktatsnak tmjban; 1999-ben magam is szervez-
tem egy munkamegbeszlst Lisszabonban az ECOOP konferencin (European Conference on
OO Programming) Az OO tervezs s programozs bevezetse cmmel.
1999 szn egy ksrletet kezdtnk el a SZMALK-ban a szmtstechnikai programoz kp-
zs hallgatinak egy csoportjval. A programozst tiszta objektumorientlt mdszerrel kezdtk
el tantani. A hatodik hten a hallgatk mr kpesek voltak egyszer feladatok OO tervt
(egyttmkdsi s osztlydiagramjt) megrteni s mdostani. Az osztlydiagram trstsi
kapcsolatokat s rklseket is tartalmazott. Bebizonyosodott, hogy az OO paradigma nem
knny ugyan, de az emberhez kzel ll, s elsajtthat.

iii
A knyv clja
A knyv els ktetnek clja, hogy az Olvas elsajttsa az objektumorientlt szemlletet,
megismerje a Java nyelv s osztlyknyvtr alapelemeit, s biztonsggal hasznljon egy fej-
leszti krnyezetet. Az I. s II. rsz elmleti bevezet; a III-VI. rszekben Java programokat
runk konzolos krnyezetben. A kt rsz prhuzamosan is elsajtthat. A knyv nem felttelez
semmifle programozsi elismeretet, mindssze a szmtgp hasznlatban szksges kis
jrtassg. Krem, tanulmnyozza t a Tanulsi s jellsi tmutatt!
A programok ksztshez a JBuilder 8.0 Personal integrlt fejleszti krnyezetet, benne a
JDK1.4 fejleszti kszletet hasznljuk.
A knyv msodik ktetben majd klnbz objektumorientlt technikkkal bvtjk ismerete-
inket, ekkor mr igazn lvezetes, esemnyvezrelt programokat fogunk rni grafikus krnye-
zetben, s adatainkat is el tudjuk mr menteni a lemezre.

Ksznetnyilvntsok
Elssorban ksznm frjemnek s lnyaimnak, hogy trelemmel s szeretettel vettek krl.
Ksznm szleimnek, akik egy-egy htre igazi alkoti lgkrt biztostottak szmomra Pcsett,
az si hzban. Zsfi lnyomnak kln ksznm azt a figyelmet s lelkesedst, amellyel lete
els knyvbortjt elksztette.
Zsembery goston tbb volt egyszer lektornl: sokat vitztunk, hasznos elkpzelseit rm-
mel ptettem knyvembe. Ksznm kollgimnak, elssorban Andor Gergnek s Seres
Ivnnak, akik folyamatosan mellettem lltak, s tancsaikkal hozzjrultak knyvem csiszo-
lshoz; valamint Keszthelyi Zsoltnak s Vrs Benak, hogy elsknt csatlakoztak a Java
programhoz.
Hallgatim kzl ten idt s fradsgot nem kmlve olvastk kszl knyvemet annak tk-
letestse cljbl, nv szerint: Ztnyi Emese, Mrocz Tams, Auer Nomi, Nagy Tibor s
Szkiva Zsolt. Ksznm nekik is.

Kiadsok trtnete
2. kiads: kisebb javtsok; a 20 fejezet nhny j feladattal bvlt.
3. kiads: kisebb javtsok; a III. rszbe bekerlt a JBuilder krnyezet.

Kedves Olvas! A knyvvel kapcsolatos szrevteleit szvesen fogadom a kvetkez cmen:


angster@okk.szamalk.hu

2003. janur 5.

iv
Tartalomjegyzk

I. RSZ. BEVEZETS A PROGRAMOZSBA 1


1. A szmtgp s a szoftver ................................................................................................ 3
1.1. Objektum, adat, program ......................................................................................... 3
1.2. Programozsi nyelv ................................................................................................. 5
1.3. A program szerkesztse, fordtsa, futtatsa .......................................................... 11
1.4. A szoftverek osztlyozsa ...................................................................................... 14
1.5. Szoftverkrzis ......................................................................................................... 15
1.6. A szoftver minsgnek jellemzi ......................................................................... 17
1.7. Modulris programozs ......................................................................................... 18
1.8. Mdszertanok ........................................................................................................ 20
Tesztkrdsek ........................................................................................................ 21
2. Adat, algoritmus .............................................................................................................. 23
2.1. Az algoritmus fogalma........................................................................................... 23
2.2. Vltoz, tpus ......................................................................................................... 25
2.3. Tevkenysgdiagram ............................................................................................. 27
2.4. Pszeudokd ............................................................................................................ 33
2.5. Az algoritmus tulajdonsgai .................................................................................. 39
Tesztkrdsek ........................................................................................................ 40
Feladatok ............................................................................................................... 41
3. A szoftver fejlesztse ....................................................................................................... 43
3.1. A szoftverfejleszts alkotmunka .......................................................................... 43
3.2. Az Egysgestett Eljrs ........................................................................................ 44
3.3. Kvetelmnyfeltrs .............................................................................................. 50
3.4. Analzis .................................................................................................................. 50
3.5. Tervezs ................................................................................................................. 51
3.6. Implementls (kdols) ........................................................................................ 51
3.7. Tesztels ................................................................................................................ 52
3.8. Dokumentls ........................................................................................................ 53
Tesztkrdsek ........................................................................................................ 54

II. RSZ. OBJEKTUMORIENTLT PARADIGMA 55


4. Mitl objektumorientlt egy program? ........................................................................ 57
4.1. A vals vilg modellezse ..................................................................................... 57
4.2. Az objektumorientlt program fbb jellemzi ....................................................... 59
Tesztkrdsek ........................................................................................................ 66

v
5. Objektum, osztly ........................................................................................................... 67
5.1. Az objektum ........................................................................................................... 67
5.2. Az objektum llapota ............................................................................................. 69
5.3. Az objektum azonossga ........................................................................................ 70
5.4. Osztly, pldny ..................................................................................................... 70
5.5. Kliens zen a szervernek ........................................................................................ 73
5.6. Objektum ltrehozsa, inicializlsa ...................................................................... 74
5.7. Pldnyvltoz, pldnymetdus ........................................................................... 76
5.8. Osztlyvltoz, osztlymetdus ............................................................................. 79
5.9. Bezrs, az informci elrejtse ............................................................................. 81
5.10. A kd jrafelhasznlsa ......................................................................................... 82
5.11. Objektumok, osztlyok sztereotpusai.................................................................... 83
Tesztkrdsek ......................................................................................................... 84
Feladatok ................................................................................................................ 84
6. Trstsi kapcsolatok ...................................................................................................... 85
6.1. Objektumok kztti trstsi kapcsolatok .............................................................. 85
6.2. Osztlyok kztti trstsi kapcsolatok .................................................................. 89
6.3. A trstsi kapcsolat megvalstsa ........................................................................ 94
Tesztkrdsek ......................................................................................................... 98
Feladatok ................................................................................................................ 99
7. rklds ....................................................................................................................... 101
7.1. Az rklds fogalma, szablyai ......................................................................... 101
7.2. Az utd osztly pldnynak adatai s a kldhet zenetek ................................ 105
7.3. Egyszeres, tbbszrs rkls ............................................................................. 106
7.4. Az interfsz fogalma ............................................................................................ 106
7.5. Lthatsg (hozzfrsi md, vdelem) ............................................................... 108
Tesztkrdsek ....................................................................................................... 110
8. Egyszer OO terv Esettanulmny ............................................................................ 111
8.1. A fogalmak tisztzsa .......................................................................................... 111
8.2. Gyuszi jtka fejlesztsi dokumentci ............................................................ 120
Tesztkrdsek ....................................................................................................... 129

III. RSZ. JAVA KRNYEZET 131


9. Fejlesztsi krnyezet Els programunk.................................................................... 133
9.1. A JBuilder letltse, indtsa................................................................................ 134
9.2. A knyv mellklete .............................................................................................. 134
9.3. A JBuilder alkalmazsbngszje........................................................................ 136
9.4. JBuilder-projekt fordtsa s futtatsa .................................................................. 139
9.5. nll program fordtsa, futtatsa ...................................................................... 140
9.6. A javalib knyvtr konfigurlsa ......................................................................... 144
9.7. A javaprog projekt ltrehozsa............................................................................. 146
9.8. Mintaprogram Hurr ......................................................................................... 149
9.9. A JBuilder szvegszerkesztje ............................................................................. 151
9.10. JDK Java Fejleszti Kszlet .............................................................................. 153
9.11. Az API csomagstruktrja ................................................................................... 159
9.12. Fordts s futtats tbb osztly esetn ................................................................ 161
9.13. Integrlt fejleszti krnyezetek ............................................................................ 163

vi
Tesztkrdsek ...................................................................................................... 165
Feladatok ............................................................................................................. 167
10. A Java nyelvrl.............................................................................................................. 169
10.1. Az OO programozsi nyelvek trhdtsa ........................................................... 169
10.2. A Java nyelv trtnete.......................................................................................... 172
10.3. Az Internet, a World Wide Web s a Java ........................................................... 173
10.4. A Java nyelv jellemzi ......................................................................................... 176
Tesztkrdsek ...................................................................................................... 177

IV. RSZ. JAVA PROGRAMOZSI ALAPOK 179


11. Alapfogalmak ................................................................................................................ 181
11.1. Mintaprogram Krumpli ..................................................................................... 181
11.2. ASCII s unikd karakterek ................................................................................. 183
11.3. A program alkotelemei ...................................................................................... 185
11.4. Vltoz, tpus ....................................................................................................... 192
11.5. Primitv tpusok ................................................................................................... 195
11.6. A forrsprogram szerkezete ................................................................................. 197
11.7. Metdushvs (zenet) ......................................................................................... 201
11.8. rtkad utasts .................................................................................................. 203
11.9. Adatok bevitele a konzolrl ................................................................................. 204
11.10. Megjelents a konzolon ...................................................................................... 206
Tesztkrdsek ...................................................................................................... 209
Feladatok ............................................................................................................. 211
12. Kifejezsek, rtkads .................................................................................................. 213
12.1. A kifejezs alkotelemei ...................................................................................... 213
12.2. Opertorok ........................................................................................................... 215
12.3. Tpuskonverzik .................................................................................................. 221
12.4. rtkads, rtkadsi kompatibilits .................................................................... 223
12.5. Kifejezsek kirtkelse - pldk......................................................................... 226
12.6. Felttel ................................................................................................................. 227
12.7. Paramtertads, tlterhelt metdusok ................................................................ 229
12.8. java.lang.Math osztly ......................................................................................... 231
Tesztkrdsek ...................................................................................................... 233
Feladatok ............................................................................................................. 235
13. Szelekcik ...................................................................................................................... 237
13.1. Egyg szelekci if ........................................................................................... 237
13.2. Ktg szelekci if..else ................................................................................... 240
13.3. Egymsba gyazott szelekcik ............................................................................ 241
13.4. Tbbg szelekcik else if s switch ................................................................ 243
13.5. Fggetlen felttelek vizsglata ............................................................................. 247
Tesztkrdsek ...................................................................................................... 248
Feladatok ............................................................................................................. 250
14. Itercik ......................................................................................................................... 251
14.1. Elltesztel ciklus while ................................................................................... 251
14.2. Htultesztel ciklus do while ............................................................................ 253
14.3. Lptet ciklus for .............................................................................................. 256

vii
14.4. Ciklusok egymsba gyazsa, kiugrs a ciklusbl ............................................... 260
14.5. Adatok feldolgozsa vgjelig ............................................................................... 264
14.6. Megszmlls ....................................................................................................... 266
14.7. sszegzs, tlagszmts ..................................................................................... 267
14.8. Minimum- s maximumkivlaszts ..................................................................... 268
14.9. Menkszts........................................................................................................ 270
Tesztkrdsek ....................................................................................................... 271
Feladatok .............................................................................................................. 272
15. Metdusok rsa ............................................................................................................ 277
15.1. A metdus fogalma, szintaktikja ........................................................................ 277
15.2. Paramtertads ................................................................................................... 283
15.3. Visszatrs a metdusbl ..................................................................................... 285
15.4. Metdusok tlterhelse ........................................................................................ 286
15.5. Loklis vltozk ................................................................................................... 289
15.6. Nhny plda ....................................................................................................... 290
15.7. Hogyan tervezzk meg metdusainkat? ............................................................... 292
Tesztkrdsek ....................................................................................................... 294
Feladatok .............................................................................................................. 296

V. RSZ. OSZTLYOK HASZNLATA, KSZTSE 299


16. Objektumok, karakterlncok, csomagolk ................................................................. 301
16.1. A fejezet osztlyainak rendszerezse ................................................................... 301
16.2. Primitv tpus referenciatpus ............................................................................ 304
16.3. Objektum ltrehozsa, deklarlsa ....................................................................... 305
16.4. rtkads az objektumok krben........................................................................ 307
16.5. Az objektum lete, automatikus szemtgyjts ................................................... 308
16.6. String osztly ....................................................................................................... 309
16.7. StringBuffer osztly ............................................................................................. 316
16.8. Objektum tadsa paramterknt ......................................................................... 322
16.9. Primitv tpusok csomagolsa .............................................................................. 325
16.10. StringTokenizer osztly ....................................................................................... 329
Tesztkrdsek ....................................................................................................... 332
Feladatok .............................................................................................................. 333
17. Osztly ksztse ............................................................................................................ 337
17.1. OO paradigma Emlkeztet .............................................................................. 337
17.2. Els mintaprogram Raktrprogram ................................................................... 339
17.3. Msodik mintaprogram Bank s a Jszerencse ............................................. 345
17.4. Az osztly felptse, az osztly deklarcii ........................................................ 351
17.5. Osztlytag, pldnytag ......................................................................................... 353
17.6. Azonost, hivatkozsi kr, takars ..................................................................... 355
17.7. Vltozk alaprtelmezs szerinti kezdeti rtkei ................................................. 357
17.8. A this objektumreferencia .................................................................................... 357
17.9. Konstruktorok ...................................................................................................... 358
17.10. Inicializlk.......................................................................................................... 360
Tesztkrdsek ....................................................................................................... 363
Feladatok .............................................................................................................. 364

viii
VI. RSZ. KONTNEREK 367
18. Tmbk .......................................................................................................................... 369
18.1. A tmb ltalnos fogalma .................................................................................... 369
18.2. Egydimenzis tmb ............................................................................................. 372
18.3. A tmb szekvencilis feldolgozsa ...................................................................... 377
18.4. Gyjts ................................................................................................................. 379
18.5. Ktdimenzis tmb .............................................................................................. 385
18.6. Tbbdimenzis tmb ........................................................................................... 390
18.7. A tmb tadsa paramterknt ............................................................................. 392
18.8. A program paramterei ........................................................................................ 393
18.9. Feladat Szavazatkirtkels .............................................................................. 395
Tesztkrdsek ...................................................................................................... 399
Feladatok ............................................................................................................. 401
19. Rendezs, keress, karbantarts .................................................................................. 405
19.1. Rendezs .............................................................................................................. 406
19.2. Keress................................................................................................................. 408
19.3. Karbantarts ......................................................................................................... 411
19.4. Primitv elemek rendezse, keresse.................................................................... 415
19.5. String objektumok rendezse, keresse ............................................................... 420
19.6. Sajt osztly objektumok rendezse, keresse ................................................... 423
19.7. Szvegek rendezett karbantartsa ........................................................................ 429
Tesztkrdsek ...................................................................................................... 433
Feladatok ............................................................................................................. 434
20. A Vector s a Collections osztly ................................................................................. 437
20.1. A kontner funkcii ltalban .............................................................................. 437
20.2. Vector osztly ...................................................................................................... 439
20.3. Az equals metdus szerepe .................................................................................. 446
20.4. A kontner elhagysa az UML diagramrl .......................................................... 452
20.5. Interfszek Collection, List, Comparable ......................................................... 452
20.6. Collections osztly ............................................................................................... 456
20.7. Feladat Nobel djasok ....................................................................................... 463
20.8. Feladat Vrosok ................................................................................................ 467
20.9. Feladat Autelads............................................................................................ 470
Tesztkrdsek ...................................................................................................... 475
Feladatok ............................................................................................................. 476

FGGELK 479
A tesztkrdsek megoldsai ............................................................................................ 481
Irodalomjegyzk ............................................................................................................. 483
Trgymutat .................................................................................................................... 485

ix
x
Tanulsi s jellsi tmutat

Tanulsi tmutat
A tanknyv teljesen kezdk szmra kszlt, nem felttelez semmifle programozsi el-
ismeretet; csak a szmtgp s az opercis rendszer hasznlatban szksges egy kis jrtas-
sg elsajttshoz kb. fl v szksges. A knyv tvoktatsi clra is hasznlhat, vagyis a
tananyagot nllan is meg lehet tanulni. Termszetesen egy tanfolyam mindenkppen fel-
gyorstja a tanulsi idt.
A knyvn kvl nnek szksge lesz a kvetkezkre:
JBuilder 8.0 Personal fejleszti krnyezet: Internetrl letlthet s ingyenesen hasz-
nlhat. A krnyezet tartalmazza a JDK1.4 fejleszti kszletet.
A knyv elektronikus mellklete (javaprog.zip): Itt vannak a kt ktetben trgyalt
feladatok forrskdjai, a fejezetek vgn tallhat feladatok megoldsai, valamint a
programok futtatshoz szksges egyb mappk s fjlok. A mellklet letlthet az
Internetrl, cmt a knyv htn megtallja.

Lapozzon a 9. fejezetre, s teleptse e kt szoftvert az ott lertak szerint!

Ajnlott tanulsi sorrend tugorhat rszek


Kezdje a 9. fejezettel! Alaktsa ki azt a szoftverkrnyezetet, amelyben dolgozni fog, s ismer-
kedskppen futtassa a knyv kt ktetnek programjait! Jobban rthet az elmlet, ha van
nmi elkpzelse a programrl s a programkszts mdjrl.
A knyvnek vannak olyan rszei, melyek elsajttsa elengedhetetlen, s vannak olyan rszei,
melyek tugorhatk, illetve halaszthatk. Rszletesebben:
I. s II. rsz (Bevezets a programozsba s Objektumorientlt paradigma): E kt rsz
(1-8. fejezetek) elmleti bevezet. Nem baj, ha az elmlet nem tisztul le teljesen, az itt
trgyalt fogalmak ismtelten visszatrnek majd. A 8. fejezet csak hab a tortn ha ezt
is tkletesen rti, akkor nagyon eredmnyes volt eddigi munkja (vagy mr voltak
nmi elismeretei). Ne keseredjen el, ha Gyuszika jtknak megoldst nem rti kris-
tlytisztn a III. rsztl majdnem ellrl kezddik minden... Fontos azonban, hogy

xi
majd a gyakorlati tuds megszerzsvel egytt vissza-visszalapozzon ezekre a fejeze-
tekre.
III. rsz (Java krnyezet): A 9. fejezet ismerete elengedhetetlen a Java programok
futtatshoz. A 10. fejezet a Java nyelv ismertetje, erre a ksbbiekben nem plnek
kzvetlenl anyagrszek.
IV-VI. rszek (Java programozsi alapok, Osztlyok hasznlata s ksztse, Kontne-
rek): Itt kezddik a programozs java, a 11. fejezettl konkrt, hs-vr Java prog-
ramokat runk igaz, mg csak konzolos krnyezetben. Az esemnyvezrelt, grafikus
krnyezetre majd a 2. ktetben kerl sor, de azt hiszem, itt tipikusan igaz a monds:
Lassan jrj, tovbb rsz!.
Rszletesebben az egyes fejezetekrl:
11. Alapfogalmak: Alapvet ismeretanyag.
12. Kifejezsek, rtkads: Alapvet ismeretanyag, de a konverzis szablyok alapos
ismerete nlkl is folytathat a tanuls.
13.-15. Szelekcik, Itercik, Metdusok rsa. Alapvet ismeretanyagok.
16. Objektumok, karakterlncok, csomagolk: A fejezet alapveten fontos, de a 16.7.
StringBuffer s a 16.9., Primitv tpusok csomagolsa kevsb hangslyos tmk. A
16.10. StringTokenizer osztly teljesen tugorhat.
17. Osztlyok ksztse: Alapvet ismeretanyag.
18. Tmbk: A kt- s tbbdimenzis tmbknek elegend csak az elmlett elsajt-
tani, vagyis a 18.5., s 18.6 pontok tugorhatk. A 18.9., Szavazatkirtkels egy
haladbb szint programozsi feladat, ennek tanulmnyozsa is elhagyhat.
19. Rendezs, keress, karbantarts: Az 19.1., 19.2. s 19.3. elmleti pontokat nzze t.
A 19.419.7. pontok tugorhatk.
20. A Vector s a Collections osztly: Alapvet ismeretanyag. Ez a fejezet mutat r leg-
inkbb a programozs lnyegre, innen kezdve oldhatk meg a krlmnyekhez
kpest rdekesebb, sszetettebb feladatok.

Ellenrizze tudst!
Minden egyes fejezet vgn tesztkrdseket s feladatokat tall, melyekkel ellenrizni tudja
tudst. A tesztkrdsek megoldsait a knyv fggelkben, a gyakorlati feladatok megoldsait
a knyv mellkletben tallja meg. Ha a teszteket meg tudja oldani, akkor mlytse el tudst a
feladatok megoldsval! A feladatokat nehzsgi szintjk szerint osztlyoztuk:
(A) Rutinfeladat. Ha ezt nem tudja megoldani, ne menjen tovbb!
(B) Knny feladat. Nhny alapfogst kombinlni kell, de nem okozhat sok fejtrst.
(C) Nehezebb feladat. Komolyabb gondolkodst ignyl vagy sszetettebb feladat.

xii
A feladatok tbbsge Java program ksztse. Ha a feladatot megoldotta, vagyis megtervezte
(egyszerbb programok esetn fejben) s lekdolta, vesse ssze azt a mellkletben szerepl
megoldssal!

Jellsi tmutat
A tanknyv a kvetkez jellseket hasznlja:

Ilyen dobozokban tallhatk az elmleti ismeretanyagok, tmr formban. Ha a dobo-


zok tartalmval mr tkletesen tisztban van, s az elmlet alapjn a megfelel Java prog-
ramokat is meg tudja rni, akkor tegye fel a knyvet a polcra, s vegye le a knyv msodik
ktett!

A norml szvegben magyarzatok vannak. Erre azrt van szksg, mert a doboz tlsgosan
tmny.
Megjegyzs: Ez csak megjegyzs, sokkal kevsb fontos, mint a tbbi informci. De azrt
ezt sem rt elolvasni.
Ha ilyen jellst tall, akkor itt valami bomba van elrejtve, rdemes rsen lenni!

Szintaktika
A Java deklarcik, utastsok szintaktikai szablyait gy adjuk meg:
<tpus> <vltoz1> =<kifejezs1> ,<vltoz2>=<kifejezs2>... ;

A <> kacsacsrben kitltend dolgok vannak; a nagy zrjelben lv rszeket nem k-


telez megadni. Ahol hrom pontot lt, ott folytathat a felsorols. A fenti szintaktika egy el-
fordulsa pldul:
int a=b=12*Math.PI, c=1, d;

Java metdusok
A Java szintaktika szerinti metdusokat (pldul a Java osztlyknyvtr metdusait) gy adjuk
meg, hogy a metdusok fejt egy kis hromszggel jelljk meg, ezt kveti a metdus lersa:
void metodus(int par) // ez egy metdusfej
Itt tallhat a metdus magyarzata.

Feladatok s megoldsok
Feladat
Az itt megfogalmazott feladatot meg is oldjuk...

Ha szksges, akkor megtervezzk a programot a feladatspecifikci alapjn. A megolds tel-


jes forrskdjt mindenkppen megadjuk:

xiii
Forrskd
// Ez egy Java program els sora:
import java.util.*; // 1
//...

Ha szksges, akkor a programot elemezzk. A magyarzatban a forrskd megjegyzseiben


megadott szmokra hivatkozunk. A feladathoz sok esetben megadjuk a futsi eredmnyt is
(amit a konzolon lthatunk):

A program egy lehetsges futsa


Adja meg az letkort: 69
n egsz fiatal!

J tanulst, rmteli programozst!

xiv
I. BEVEZETS A PROGRAMOZSBA
1. A szmtgp s a szoftver
2. Adat, algoritmus
3. A szoftver fejlesztse I.
II. OBJEKTUMORIENTLT PARADIGMA
4. Mitl objektumorientlt egy program?
5. Objektum, osztly
6. Trstsi kapcsolatok
7. rklds
8. Egyszer OO terv Esettanulmny

III. JAVA KRNYEZET


9. Fejlesztsi krnyezet Els programunk
10. A Java nyelvrl

IV. JAVA PROGRAMOZSI ALAPOK


11. Alapfogalmak
12. Kifejezsek, rtkads
13. Szelekcik
14. Itercik
15. Metdusok rsa

V. OSZTLYOK HASZNLATA, KSZTSE


16. Objektumok, karakterlncok, csomagolk
17. Osztly ksztse

VI. KONTNEREK
18. Tmbk
19. Rendezs, keress, karbantarts
20. A Vector s a Collections osztly

FGGELK
A tesztkrdsek megoldsai
Irodalomjegyzk
Trgymutat
2 I. RSZ. BEVEZETS A PROGRAMOZSBA
1. A szmtgp s a szoftver 1.1. Objektum, adat, program 3

1. A szmtgp s a szoftver

A fejezet pontjai:
1. Objektum, adat, program
2. Programozsi nyelv
3. A program szerkesztse, fordtsa, futtatsa
4. A szoftverek osztlyozsa
5. Szoftverkrzis
6. A szoftver minsgnek jellemzi
7. Modulris programozs
8. Mdszertanok

A programoznak tudnia, de legalbbis sejtenie kell, mi trtnik odabent a szmtgpben,


amikor a program fut, s mi trtnik addig, amg a program futtathat llapotba kerl. Ismernie
kell tovbb a minsgi szoftver kritriumait, s tudnia kell, hogy milyen eszkzk llnak a
programoz, illetve a szoftverfejleszt rendelkezsre a szoftver elksztshez. E fejezet clja
a szoftverrel kapcsolatos alapvet ismeretek bemutatsa programozi szemszgbl.

1.1. Objektum, adat, program

Objektum
A vals vilgban elfordul dolgokat objektumoknak nevezzk. Egy objektumnak rengeteg
olyan mrhet s nem mrhet jellemzje van, amelyek alapjn az objektum felismerhet. Az
objektumnak vannak adatai (tulajdonsgai), s van valamilyen, algoritmusokkal lerhat visel-
kedsmdja. Az autnak pldul van mrkja s rendszma, s kpes haladni. Az aut az
objektum, a mrka s a rendszm az aut adatai, a halad pedig az aut viselkedsmdja.

Gpi brzols
A szmtgp csodlatos, de buta anyaghalmaz, melyet az ember tallt ki. A gp nem tud
nllan gondolkodni. A szmtgp csak azokat az adatokat tudja megjegyezni, s azokat az
4 I. RSZ. BEVEZETS A PROGRAMOZSBA

utastsokat tudja vgrehajtani, melyeket az ember beltpllt. A vals vilg objektumainak


adatait az ember betpllja a szmtgpbe. Mivel a szmtgp elemi szinten mindssze kt
llapotot kpes megjegyezni (0 vagy 1), az adatokat s viselkedsmdokat valamilyen mdon
brzolni kell. Az adatok s algoritmusok trolshoz egyezmnyes jelek szksgesek. Ismert
adatbrzolsi szabvnyok a kvetkezk:
Karakterek kdolsra alapveten ktfle szabvny ismeretes:
ASCII karakterkszlet (American Standard Code for Information Interchange; az
informcicsere amerikai szabvnyos kdjai), amely egy bjton hatrozza meg min-
den egyes karakter kdjt. A 9-es szmjegy kdja pldul 57, a @ kdja 64, az A
bet kdja 65. A 256 darab ASCII karakter ma mr nem elegend a klnbz nem-
zetek betinek, szmjegyeinek s egyb specilis karaktereinek brzolsra.
Unikd (unicode) karakterkszlet, mely mr 2 bjton brzolja a lehetsges karakte-
reket. A lehetsgek szma gy 256-rl 65536-ra emelkedik, s ez bven elegend az
angol, magyar, orosz, knai, szanszkrit vagy hottentotta betk megklnbztetsre
is. (Pillanatnyilag mintegy 35000 karaktert hasznlnak a vilg szmtgpein.) Az
unikd karakterbrzolsrl a 11. fejezetben lesz sz.
Egsz szmok kdolsra a fixpontos szmbrzolst szoks alkalmazni. Negatv szm
esetn a szm 2-es komplemenst troljk.
Vals szmok kdolsra a lebegpontos szmbrzolst szoks alkalmazni az IEEE
754 szabvny szerint.
Logikai rtkek kdolsa: ltalban a hamis rtk gpi reprezentnsa a 0, az igaz pedig
az 1.

Az algoritmus gpi brzolsa a gpi kd, vagyis a program. A szmtgpen trolt program-
nak tudnia kell, hogy egy adatnak pontosan mi az brzolsi mdja, hiszen ugyanaz a bitkom-
binci mst jelent akkor, ha a trolt adat karakter, s megint mst, ha az vals szm, logikai
rtk, szveg vagy kp.

Program, szoftver
Egy szmtgpes rendszer hardverbl s szoftverbl ll (hardware, software). Hardvernek
nevezzk a szmtgp kzzelfoghat fizikai komponenseit. Szoftveren ltalban a szmtg-
pes rendszer meg nem foghat, nem fizikai sszetevit rtjk. A szoftver fogalma gyakorlatilag
egybeesik a szmtgpen mkd programok s az azokhoz tartoz adatok fogalmval.
A program a szmtgp szmra rthet instrukcik sorozata, mely az adatok megfelel
szmtsaival s mozgatsaival egy feladat megoldst clozza. A szmtgpes program arra
kpes, hogy adatokat fogadjon (pldul a felhasznltl vagy egy szmtgphez csatolt msik
gptl), azokat trolja, pakolgassa, mveletekkel megvltoztassa, tovbbadja, illetve a felhasz-
nl szmra a krt formban megjelentse. A programkszts clja azonban nem puszta adat-
szolgltats, hanem a felhasznl informlsa, azaz olyan ismeretek eljuttatsa a felhasznl-
1. A szmtgp s a szoftver 1.2. Programozsi nyelv 5

hoz, amelyekre neki az adott pillanatban szksge van. A felhasznl nem rti a gpi
adatpakolgatsokat, t a gptl elrugaszkodva, emberi mdon kell informlni. A program fela-
data, hogy a gp s az ember kztti hidat felptse. S mivel a programoz is ember, nemcsak a
programok, hanem a klnbz programksztsi mdszerek is megprblnak elrugaszkodni a
gpkzeli valsgtl, hogy a szmtgpet az emberi gondolkodshoz hasonl utastsokkal
vezrelhessk. A programoz az adatokat s az instrukcikat klnbz mdszerekkel
csoportostja, s a valsghoz hasonlan megprblja ezeket a programmodulokat letre
lehelni. Az ember igyekszik a szmtgpes objektumokat az llnyek mintjra "megsze-
mlyesteni", hogy kzelebb kerlhessen hozzjuk, s knnyebben beprogramozhassa ket. A
mr ksz, beprogramozott objektumokat aztn, ha lehet, jra felhasznlja, bepti ms progra-
mokba. Minl bonyolultabb vlik a szmtgp mkdse, ez a tendencia annl ersebb
vlik.

Objektum: A vals vilgban elfordul dolog, melynek vannak adatai s van viselkeds-
mdja.
Program: A szmtgp szmra rthet instrukcik sorozata, mely az adatok megfelel
szmtsaival s mozgatsaival egy feladat megoldst clozza.
Szoftver: Egy szmtgpes rendszer meg nem foghat, nem fizikai sszetevi.

1.2. Programozsi nyelv

Gpi kd, natv kd


A szmtgp memrija olyan cmezhet tr, amely memriarekeszekbl, bjtokbl (byte) ll.
A memria tartalma a program mkdse (futsa) kzben llandan vltozhat. Futtatskor a
gpi kd program betltdik a szmtgp memrijba. A gpi kd (gpi nyelv) program
a gp szmra vgrehajthat utastsok sorozata, ezrt ezt futtathat programnak (executable
program) is nevezik. A gpi kd ms elnevezse mg: natv kd vagy trgykd ez a nv a
kd "termszetes" helyre (clhelyre) utal. Egy gpi kd program adatokat s gpi kd
utastsokat egyarnt tartalmaz. Az 1.1. brn egy kpzeletbeli, primitv szmtgp
memrijnak a modellje lthat egy gpi kd programmal. A cmzs 8 bites (ily mdon csak
egy 256 bjtos tr cmezhet). A memriarekeszek szintn egybjtosak, ezek cmt s tartalmt
hexadecimlis szmokkal adtuk meg. Az egyes utastsok mell n. mnemonikokat (meg-
jegyzst elsegt szavakat, mint HLT, JMP, LDA stb.) rtunk ezek azonban csak a mi
tjkozdsunkat segtik, a memriban lev program igazbl egy bitsorozat (az als sor a
bitsorozat hexadecimlis formja, a sorozatot bjtonknt tagoltuk):

00000010 00010010 00000111 00000000 00100000 ...


0 2 1 2 0 7 0 0 2 0 ...
6 I. RSZ. BEVEZETS A PROGRAMOZSBA

Egy gpi kd utasts (mvelet, opertor) az utasts kdjval kezddik, melyet az utasts
paramterei (argumentum, operandus) kvetnek. Hogy egy utastskd hny bjtbl ll, az a
processzorra jellemz adat (pldnkban 1 bjtos utastsok vannak). Egy utasts egyrtelmen
meghatrozza az t kvet paramterek szmt, valamint azt, hogy azok egyenknt pontosan
hny bjtot foglalnak le, s mit jelentenek. Van olyan utasts, amelynek nincs paramtere;
ilyen pldul az, amelyik a program azonnali lellsra utast (HLT). A paramter lehet pldul
egy rtk vagy egy olyan memriacm, amelyben egy rtk vagy egy tovbbi cm van eltrolva.
Fiktv utastskszletnk a kvetkez utastsokbl ll (az els kt oszlop a gpi kd utasts
1. s 2. bjtja):

utasts kdja utasts paramtere (ha van)

1. 2. Mnem. Angolul Magyarul


01 - HLT Halt llj meg!
02 cm JMP Jump Ugorj a cmre!
03 cm JNZ Jump on Not Zero Ugorj a cmre, ha nem nulla volt az rtk!
20 rtk LDA Load accumulator Tltsd az akkumultorba az rtket!
30 cm STA Store accumulator Trold le a cmre az akkum. tartalmt!
40 cm DEC Decrement Cskkentsd 1-gyel a cmen lev rtket!
50 cm ADD Add Add az akk.-hoz a cmen lev rtket!

Feladat
rjunk egy gpi kd programrszletet, mely a 0012 cmen lev egsz rtket
(a 7-et) megszorozza 5-tel! Az eredmny a 0012 cmen keletkezzk!

A megolds az 1.1. brn lthat. A program az 10 (hexadecimlis szm, ejtsd: egy nulla)
cmen kezddik egy ugr utastssal (02 14), ahol a 02 az utasts (JMP), az 14 pedig az utas-
ts paramtere (erre a cmre ugorj). Az utasts hatsra a program vezrlse az 14 cmen foly-
tatdik. Ezzel a program az adatterletet tugorja. Ha ezt nem tenn, akkor a processzor az
adatterletet programnak nzn, s biztosan furcsa dolgok trtnnnek. A kvetkez, 20 05
gpi kd utastsban a 20 az utasts (LDA), a 05 pedig az utasts paramtere, ezt az rtket
fogja betlteni az akkumultorba. A 30 13 utasts letrolja az akkumultor tartalmt az 13
cmre (STA) stb. A program mkdsnek lnyege, hogy az 13 cmre leteszi az 5 rtket, s
annak minden egyes cskkentsekor az akkumultorhoz adja az 12 cmen lev 7-es rtket. gy
az akkumultorban vgl ott lesz az 5*7 rtk, amelyet a program vgl letesz a 12 memria-
cmre.

Megjegyzs: Nem szksges, hogy a programot lpsrl lpsre megrtse! Elegend, ha kap
egy elkpzelst a gpi kd programrl.
1. A szmtgp s a szoftver 1.2. Programozsi nyelv 7

Memriacmek Utastsok, adatok Mnemonikok Adatterlet Programterlet

00 10 02 JMP 20 30 STA 30
01 11 14 21 12 A 31
02 12 07 A 22 01 HLT 32
03 13 00 I 23 33
04 14 20 LDA 24 34
05 15 05 25 35
06 16 30 STA 26 36
07 17 13 I 27 .
08 18 20 LDA 28 .
09 19 00 29 .
0A 1A 50 ADD 2A
0B 1B 12 A 2B
0C 1C 40 DEC 2C
0D 1D 13 I 2D
0E 1E 03 JNZ 2E
0F 1F 1A 2F

1.1. bra. Gpi kd egy fiktv szmtgp memrijban

A gpi kd nem emberi olvassra val. Az elbbi program csak egyjegy szmokat szoroz,
s mg nem is jelenti meg az eredmnyt a felhasznl szmra. Kt darab 3 jegy szm ssze-
szorzsa esetn a program ennek sokszorosra bvlne, melyben az tvitelt s a tlcsordulst is
kezelni kellene.

Assembly nyelv
Az utasts kdja egy szm, melyet az ember nehezen jegyez meg. Ezrt minden utastsnak
van egy emlkeztetje (mnemonik), mgpedig az utastsra jellemz rvidts.
A processzor csak gpi kd utastsokat kpes vgrehajtani, az emlkeztetket nem rti.
Ahhoz, hogy emlkeztetket hasznlhassunk, meg kell tantani a szmtgpet arra, hogy
azokat felismerje. A programoz az utastsokat teht nem szmokkal, hanem emlkeztetkkel
rja meg egy szveges llomnyban ez az assembly nyelv forrsprogram. Van egy prog-
ram, amely elemzi s gpi kdd alaktja, lefordtja ezt a forrsprogramot. A fordtst vgz
programot assemblernek nevezzk.
Az assemblert szintn programozk rtk meg, vagy gpi kdban, vagy egy msik assembler
segtsgvel. Az assemblernek termszetesen az is a feladata, hogy informcit adjon a forrs-
programban elfordul esetleges hibkrl. Hiba esetn a fordts sikertelen, a programon jav-
tani kell. Az assemblyben rt program htrnya, hogy mr messzebb kerltnk a gptl, az
8 I. RSZ. BEVEZETS A PROGRAMOZSBA

assembler esetleges hibinak akr ldozatai is lehetnk. De ha j assemblert vlasztunk, akkor


a megrt program ettl olvashatbb, javthatbb s dokumentlhatbb lesz. Ez risi elny.
Nzzk az elz, gpi kd programunkat assembly nyelven:

Feladat
rjunk egy assembly programrszletet, mely az A cmen lev egsz rtket (a 7-et)
megszorozza 5-tel! Az eredmny az A cmen keletkezzk!

Egy assembly forrsprogramban az utastsokon kvl a cmeknek is nevet adhatunk (A,


BELEP stb.). Ezzel a forrskd rthetbb vlik, s sokkal knnyebben javthat. A // utni
megjegyzsben az adott sor rvid magyarzata tallhat:

JMP BELEP // Ugorj a BELEP cmre!


A: BYTE 7 // 1 byte-os adatterlet, A kezdeti rtke 7.
I: BYTE 0 // Adatterlet, I kezdeti rtke 0.
BELEP: LDA 5 // Tltsd az akkumultorba az 5-t!
STA I // Trold el az I cmre!
LDA 0 // Tltsd az akkumultorba a 0-t!
UJRA: ADD A // Add az akkumultorhoz az A cmen lev rtket!
DEC I // Cskkentsd az I-t eggyel!
JNZ UJRA // Ha ez nem 0, akkor ugorj az UJRA cmre!
STA A // Trold le az akkumultor tartalmt az A cmre!
HLT // llj! Vge a programnak.

A szmtgphez kzel ll programnyelveket mint amilyen az assembly nyelv, alacsony


szint nyelveknek nevezzk. Az alacsony szint nyelveknek vannak elnyei s htrnyai:
Elnyk: 1. Sokkal gyorsabb s kisebb helyfoglals program rhat vele; 2. Vannak
olyan ersen hardverhez ktd feladatok, amelyeket csak gy lehet megoldani.
Htrnyok: 1. A programoznak sokat kell dolgoznia; 2. Nehezen rthet s mdost-
hat; 3. Gpenknt kln meg kell rni.

Alacsony szint nyelven klnbz processzorokra ltalban klnbz programokat kell rni.
Ez termszetes, hiszen a szmtgpeket s a processzorokat is tervezik elkpzelhet, hogy
ugyanazt a problmt az egyik processzorral egszen mskpp lehet megoldani, mint a msik-
kal. Az ilyen programok nem hordozhatk, vagyis az egyik processzoron megrt programot
nem tudjuk egy msik tpusn mkdtetni.

Magas szint nyelv


A magas szint nyelvek kzelebb llnak az emberi gondolkodshoz, mint az alacsony szin-
tek. Egy magas szint forrsprogrambl mr rnzsre is sokat ki lehet olvasni, sejteni lehet,
hogy mit fog csinlni, ha azt gpi kdd alaktjuk t. Nzzk, hogyan oldjuk meg az elbbi,
assemblyben megadott feladatot Javban:
1. A szmtgp s a szoftver 1.2. Programozsi nyelv 9

Feladat
rjunk egy Java programrszletet, mely az a cmen lev egsz rtket (a 7-et) meg-
szorozza 5-tel! Az eredmny az a cmen keletkezzk!

{
int a = 7; // az a vltoz egy 4 byte-os egsz (integer)
a = a * 5; // legyen a rtke az eredeti tszrse
}

Az elbbiekhez hasonlan ez sem teljes program, hiszen nem sok rtelme van egy trolt rtket
ttel megszorozni, ha azt utna nem hasznljuk semmire. Az azonban lthat, hogy ezt a
rszfeladatot mennyivel egyszerbben, elegnsabban oldjuk meg magas szint nyelven. Az
a-nak itt is le kell foglalnunk egy trhelyet, de a szorzst egyetlen utastssal elvgezhetjk. Ha
4 bjtosnl nagyobb szmot akarunk szorozni, akkor nincs ms teendnk, mint az int tpust
pldul egy long tpusra kicserlni, ami egy 8 bjtos egsz szm manipullsra alkalmas. Egy
nagyobb szmot szorz assembly forrsprogram terjedelme sokszorosa az ugyanezt a feladatot
vgrehajt magas szint forrsprogramnak, hiszen darabonknt kell pakolgatni az eredmnyt,
s kzben figyelni a helyi rtkeket, a tlcsordulst (elfr-e a kiszmolt rtk a megadott
regiszterben) stb. A magas szint nyelv erre fel van ksztve, ezt elre kidolgoztk azok a prog-
ramozk, akik a nyelv rtelmezjt, fordtjt megrtk. A magas szint nyelven programozk-
nak csak hasznlniuk kell a felknlt magas szint utastsokat, a fordt behelyettesti azokat
gpi kd utastsokkal.
A magas szint nyelvek tbb-kevsb hasonltanak az emberi nyelvre. Ezek a nyelvek a prog-
ramoz munkjt nagymrtkben megknnytik, hiszen a rszletek tlalva vannak, csak be kell
ket helyezni programunkba. Persze ahhoz, hogy ilyen knnyedn, emberkzelien tudjunk
programot rni, ahhoz meg kellett egyszer rni azt a programot, amely ezeket az emberkzeli
utastsokat rtelmezi, s gpi kdra lefordtja. Az ilyen programot fordtnak (compiler)
nevezik. Egy magas szint utasts tbb szz vagy tbb ezer gpi kd utastst is jelenthet
egyszerre. Egy magas szint forrsprogram mr hordozhat, vagyis knnyen tvihet ms plat-
formra (ms hardverrel s opercis rendszerrel rendelkez gpekre) is. A fordtprogram per-
sze tovbbra sem hordozhat. A forrsprogramot az adott szmtgpre megrt fordtprog-
rammal a szmtgp gpi kdjv kell alaktani.
Sok magas szint nyelv ltezik a vilgon. A klnbz nyelvek ms s ms clra kszlnek: az
egyik a logikai feladatok megoldsban ers, a msik adatfeldolgozsra vagy tvoli (vilgh-
ls) adatelrsre van kihegyezve. A nyelvek ersen eltrhetnek egymstl akr koncepcio-
nlisan, akr gyorsasgban vagy megbzhatsgban. A legismertebb magas szint programo-
zsi nyelvek ma a Java, C#, C++, C, Pascal, Basic, Smalltalk, Eiffel, Modula, Ada, PL/I,
Cobol, Fortran, Prolog, CLOS, APL, Clipper, s mg sorolhatnnk. Mindegyik nyelvnek
megvannak a klnbz szempontok szerinti sajtossgai, erssgei s gyengi. Hogy melyik
nyelv terjed el egy adott helyen s idben, az sok mindenen mlik hasznlhatsgn kvl
pldul azon, hogy melyiknek van nagyobb irodalma, reklmja, presszija.
10 I. RSZ. BEVEZETS A PROGRAMOZSBA

Bjtkd
Vannak fordtprogramok (ilyen a Java compiler), melyek nem fordtjk le teljesen gpi kdra
a magas szint forrsprogramot, hanem egy kzbens, n. bjtkdot (bytecode) lltanak el.
A bjtkd az ember szmra olvashatatlan utastskdokat s hivatkozsokat tartalmaz gpk-
zeli kd, mely mindssze annyira rugaszkodik el a gptl, hogy platformfggetlen (gp- s
opercis rendszer fggetlen) lehessen. Ezt a bjtkdot aztn kzvetlenl a futs eltt egy
msik fordt vagy rtelmez natv kdd alaktja. A bjtkd teht a magas szint nyelv s a
gpi kd kztti platformfggetlen kzbens kd. Azrt talltk ki, hogy gy a mr majd-
nem lefordtott kd hordozhat (portable) legyen, vagyis knnyszerrel t lehessen azt vinni
klnbz platformokra (szmtgpes krnyezetekre).
A bjtkd elnyei:
Hordozhat, azaz platformfggetlen, elvileg tvihet brmilyen platformra (gpre).
A bjtkdot sokkal knnyebb natv kdd alaktani. gy a platformspecifikus fordt,
illetve futtat rendszer mr sokkal egyszerbb program lehet.

A Java fordt is bjtkdot llt el. A Java fordt szabvnyos, azaz brmely krnyezetben
ugyanabbl a szabvnyos forrsprogrambl ugyanazt a bjtkdot lltja el (sajnos csak elvi-
leg, mert van olyan szoftverhz, amelyik nem tartja be a szabvnyt). Ezt a bjtkdot az adott
szmtgpen a JVM (Java Virtual Machine, Java virtulis gp, futtatrendszer) futtatja gy,
hogy azt utastsonknt rtelmezi s natv kdd alaktja.

Gpi kd (natv kd, trgykd): A gp szmra vgrehajthat utastsok sorozata. A gpi


kd program csak a megadott clgpen futtathat.
Programozsi nyelv: Szmtgpes programok pontos lersra hasznlt jellsrendszer.
A jellsrendszer szablyait betartva a programoz egy szveges llomnyt kszt, melyet
a programozsi nyelv fordtprogramjval fordt le a szmtgphez kzelebb ll kdra.
Alacsony szint nyelv: Olyan programozsi nyelv, melyben a vezrls s az adatstrukt-
rk kzvetlenl visszatkrzik a gpi architektrt.
Magas szint nyelv: Olyan programozsi nyelv, melyben a vezrls s az adatstruktrk
inkbb a programoz szempontjaihoz igazodnak, semmint a hardver ltal nyjtott lehets-
gekhez.
Assembly nyelv, assembler: Az assembly nyelv a gphez kzel ll, alacsony szint prog-
ramozsi nyelv, amelyben a programoz a gpi utastsokat mnemonikokkal adja meg. Az
assembly nyelv forrsprogramot az assembler fordtja gpi kdra.
Bjtkd: A magas szint forrskd s a gpi kd kztti platformfggetlen kzbens kd.
1. A szmtgp s a szoftver 1.3. A program szerkesztse, fordtsa, futtatsa 11

1.3. A program szerkesztse, fordtsa, futtatsa


A program teht gpi kd utastsok sorozata, melyet betpllhatunk a szmtgpbe. Ami-
kor egy program fut, adatokat olvas be a beviteli eszkzkrl, manipullja az adatokat, majd
kirja ket valamilyen kiviteli eszkzre. Ezek kzl persze brmelyik elhagyhat, a lnyeg az,
hogy a program rtelmes legyen. Nem fontos manipullni az adatokat, elkpzelhet, hogy a
billentyzetrl beolvasott karaktereket vltoztats nlkl nyomtatra kldjk. Az is elkpzel-
het, hogy egy program kiszmol bizonyos adatokat, de azokat semmilyen kiviteli eszkzre
nem kldi ki. Ekkor azonban felmerl a krds: mirt rtuk a programot?
A szmtgp bekapcsolsakor automatikusan elindul egy program, a szmtgp opercis
rendszere. Ez a rendszerprogram teremti meg a gp s a felhasznl kzti alapvet kommuni-
kcis lehetsgeket, s addig fut, amg a gpet ki nem kapcsoljuk. Az opercis rendszer egy
megfelel utastsra a megadott programot a memriba tlti s elindtja. Egy adott program-
nak lehetnek bemen (input) adatai, amelyeket a program felhasznl, s kimen (output)
adatai, amelyeket a program produkl.

Szvegszerkeszt program
A fejleszts alatt ll programot annak megtervezse utn egy szvegszerkeszt program
(editor) segtsgvel meg kell rni (1.2. bra). A szvegszerkeszt inputja a bettt megjelent-
het karakterek (pl. i, n, =, ;) s vezrlkarakterek (pl. F1, Ctrl+le vagy Backspace), outputja a
ksz forrskd. A magas szint forrsprogram egy ASCII kdokat tartalmaz szveg (az ope-
rcis rendszerek legtbbje mg nincs felkszlve az unikd karakterekre). Ezt a szveget egy
olyan szvegszerkesztvel kell szerkesztennk, amely nem alkalmaz formz karaktereket. A
Word ltal ksztett szveg pldul tele van tzdelve a fordtprogram szmra rtelmezhetet-
len vezrlkarakterekkel (a stlus, karaktertpus, nyelv, sortvolsg, lbjegyzet stb. jellse
miatt). MS-Windows krnyezetben a forrskd szerkesztsre pldul a Notepad vagy az Edit
program megfelel. Az 1.2. brn az int a=7; programsort visszk be inputknt gy, hogy
kzben a t bett trljk, majd jra bevisszk.

Lettt billentyk Szvegszerkeszt program Forrskd

int a=7;
i, n, t, Backspace, t, ...
Space, a, =, 7, ;, ... Notepad.exe

1.2. bra. A forrskd szerkesztse


12 I. RSZ. BEVEZETS A PROGRAMOZSBA

Fordtprogram
A forrskdot egy fordtprogrammal (compiler) le kell fordtanunk. Minden magas szint
nyelvnek megvan a maga fordtprogramja, melyet futtatunk: a fordtprogram inputja az lta-
lunk megrt forrsprogram (source code), outputja pedig az adott nyelvtl, illetve az ahhoz
tartoz fordtprogram tpustl fggen bjtkd vagy trgykd (object code). Ha a fordt a
forrsprogramban szmra rtelmetlen szveget tall, akkor a lefordtott kd helyett outputknt
a fordtsi (szintaktikai) hibk listjt kapjuk. Ez utbbi eset termszetesen valamilyen progra-
mozi tveds eredmnye.

Windows krnyezetben a Java nyelv fordtprogramja a javac.exe (java compiler). A Java


fordt a java kiterjeszts forrskdbl bjtkdot generl. A bjtkd llomnynak kiter-
jesztse class (1.3. bra).

Bjtkd
Forrskd (App.class)
(App.java) Fordtprogram
00971CDF
... 0000F3F1
int a=7;
a=a*5; javac.exe vagy
... Fordtsi hibk
App.java:7: Class
int not found

1.3. bra. Java program fordtsa

A fordtprogram teht a forrsnyelven megrt programot a gphez kzeli kdd alaktja. A


fordt legtbb esetben kptelen arra, hogy minden informcit rgtn megrtsen, ilyenkor a
fordts tbb menetben kszl. Elszr elemzi a szveget, s kiemeli belle a felesleges infor-
mcikat, mint pldul a megjegyzseket, szkzket stb. Aztn ellenrzi az utastsok helyes-
sgt, hiba esetn figyelmeztet. Van olyan fordt, mely az els tallt hibnl lell, abbahagyja
a fordtst. Ms fordtk egy egsz listt ksztenek a szvegben tallt hibkrl. Ez utbbi eset-
ben termszetesen elfordulhatnak generlt hibk is (amikor egy hiba generlja a tbbit),
ilyenkor a hibalista (klnsen annak vge) nem teljesen relis.
Egyes fordtk optimalizljk a kdot, vagyis kiemelik belle a felesleges lpseket, s lehet-
sg szerint tmrtik. Vannak olyan fordtk, amelyek gyorsan fordtanak, de a lefordtott kd
lassan fog futni, msok viszont ugyanabbl a forrsnyelv szvegbl lassan ugyan, de villm-
gyorsan fut programkdot produklnak. J s gyors fordtprogramot nehz dolog rni.
1. A szmtgp s a szoftver 1.3. A program szerkesztse, fordtsa, futtatsa 13

Programszerkeszt program
Az opercis rendszerbl indthat program sok esetben tbb, kln lefordtott modulbl
(trgykdbl) ll, melyeket futs eltt vagy alatt ssze kell kapcsolni, szerkeszteni. Az ssze-
szerkesztst a programszerkeszt program (linker) vgzi. A lefordtott trgykd teht mg
sszeszerkesztsre vr, az nllan nem kpes futni; a benne lev hivatkozsi cmek relatv
cmek, a trgykd a memriban thelyezhet (relocatable code). Egy trgykd sok esetben
futs kzben kapcsoldik a hv programhoz (Windows krnyezetben pldul a dll llo-
mny).
Csak a programszerkeszt ltal sszelltott program futtathat. Az sszeszerkesztend trgy-
kdok szma nincs korltozva, s termszetesen egy is lehet. Az exe llomny a programszer-
keszt ltal tbb trgymodulbl sszeszerkesztett trgykd.
Java esetben az sszeszerkesztsre vrakoz modulok a flig lefordtott bjtkdok (kiterjesz-
tsk class). Ezeket mg sszeszerkeszts eltt egszen le kell fordtani. Mindez a java
futtatrendszer (JVM = Java Virtual Machine) feladata.

A programszerkeszt (linker) nem tvesztend ssze a szvegszerkesztvel (editor)!

Interpreter
Az interpreter (rtelmez) olyan program, amely a forrsprogramnak egyszerre egyetlen uta-
stst rtelmezi, azt natv kdd alaktja, rgtn vgrehajtja, majd a lefordtott kdot elfelejti.
Ha a vezrls megint erre az utastsra kerl, az rtelmezs jbl megtrtnik. Interpreterrel
rendelkezik pldul a Basic s a Java nyelv. Java esetn az rtelmez a JVM (Windows
krnyezetben a java.exe), amely a bjtkdot utastsonknt rtelmezi s futtatja.

Az rtelmezk ltalban lassak, ezrt sok fejleszt s felhasznl a program teljes fordtst
rszesti elnyben. A Java bjtkdnak ltezik egy olyan fordtja/rtelmezje, mely a leford-
tott utastst a program futsa alatt megjegyzi, s csak a legkzelebbi betltskor fordtja jra.
Ez a JIT (Just In Time compiler), mely egyre inkbb kezd elterjedni. Specilis krnyezetekben
(pl. Oracle adatbzisban) ltezik valdi Java fordtprogram is, amely a Java forrskdbl
eltrolhat natv kdot kszt.

A program futtatsa
Lttuk, hogy bizonyos fordtk s programszerkesztk egyttesen elksztik a natv kdot. Az
ilyen kdot egyszer elindtani: Windows krnyezetben pldul kattintsunk kettt az ikonjra
vagy az exe llomny nevre!

Java esetben egy program tbb, class kiterjeszts modulbl (bjtkdbl) ll, melyek kztt
van egy megklnbztetett, belpsi ponttal rendelkez modul. A virtulis gp ezt a f modult
indtja el, s ebbl trtnik a tbbi modul hvsa.
14 I. RSZ. BEVEZETS A PROGRAMOZSBA

Van teht egy program, amelyet elksztettnk, s mkdik legyen az jtkprogram, ford-
tprogram, szvegszerkeszt, alkatrsz-nyilvntart vagy knyvel program. Hogy mit hasznl
fel inputknt a program, az a program rjtl fgg. Termszetesen brmely program futtathat
egy msik programot is, de a legltalnosabb az, hogy egy program inputknt adatokat hasznl,
s az outputja is adat. A programbl persze olyasmik is kijhetnek, amiket a programoz
nem akart, hiszen tvedni programozi dolog. Ilyenkor a program kiszmthatatlan dolgokat
produklhat. A futs kzben elfordul hibk legtbbszr a program lellshoz vezetnek
ezek a futs alatti hibk (runtime error).

Forrskd (forrsprogram): A fordtprogram ltal lefordtand szveg, illetve szveges


llomny.
Forrsprogram szerkesztse: A forrskd megrsa, javtsa szvegszerkeszt program
(editor) segtsgvel.
Program fordtsa: A forrskd talaktsa a szmtgp ltal rthet trgykdd, illetve
egy kzbens bjtkdd. A fordtst a fordtprogram (compiler) vgzi.
Programszerkeszt (linker): Program, amely a lefordtott trgykdokat sszeszerkeszti,
futtathat llapotba hozza.
Interpreter: rtelmez program, mely a forrsprogramot vagy a bjtkdot utastsonknt
rtelmezi, fordtja le, s hajtja vgre.
Program futtatsa: Egy adott szmtgpen a trgykd, illetve bjtkd vgrehajtsa. Bjt-
kd esetn a tnyleges futtats eltt mg egy fordts, illetve rtelmezs szksges.

1.4. A szoftverek osztlyozsa


A fut programokat (szoftvereket) funkcijuk szerint osztlyozni lehet. A legtbb program
besorolhat a kvetkez csoportok valamelyikbe:

Opercis rendszerek
(Operating systems)
pl. DOS, OS/2, Unix, Linux, Windows XP, Mac OS

Szoftverfejleszt rendszerek
(Software development systems)
A szoftverfejleszt rendszerek a programok fejlesztst, elksztst szolgljk. Ilyen eszkzk
segtsgvel lehet akr opercis rendszereket, akr alkalmazi programokat, akr jabb szoft-
verfejleszt rendszereket kszteni.
1. A szmtgp s a szoftver 1.5. Szoftverkrzis 15

Programnyelvi fordtprogramok, keretrendszerek pl. JDK, JBuilder, JCreator,


JDeveloper, Borland C++, Visual C++, Delphi, Macro Assembler, Turbo Pascal
Adatbziskezelk pl. Oracle, Borland InterBase, Microsoft SQL Server, IBM DB2,
Sybase, ObjectStore
CASE eszkzk (Computer-Aided Software Engineering = Szmtgppel tmogatott
szoftvertechnolgia) pl. Rational Rose, Enterprise Architect, Together

Alkalmazi (felhasznli) programok, programcsomagok


(Application programs, application packages)
Alkalmazi programnak nevezzk azt a programot, mely egy specilis feladat elvgzsre
kszlt, s amely kzvetlenl hozzjrul a feladat megoldshoz.
Szvegszerkesztk pl. Word, NotePad
Tblzatkezelk pl. Excel
Kiadvnyszerkeszt programok pl. Pagemaker, Ventura
Tervez programok pl. 3D Design, ArchiCAD, ORCAD, Home Design
Kommunikcis programok pl. Internet Explorer, OutLook, WinFax
Vllalatirnytsi, pnzgyi rendszerek pl. SAP, MS Money, BookKeeper
Tudomnyos programok pl. Mathematica, Maple
Segdprogramok pl. WinZip, Calculator, Clock
Oktat programok pl. Java Tutorial
Szrakoztat programok pl. CD lejtsz, jtkok

1.5. Szoftverkrzis
Az orvos, a mrnk s a programoz vitatkozik, melyikk mestersge a rgebbi:
Orvos: va dm bordjbl val ehhez Istennek orvosi beavatkozsra volt szksge.
Nyilvnval teht, hogy az orvosi mestersg a legrgebbi.
Mrnk: Csakhogy Isten elbb teremtette a Fldet, mgpedig a koszbl, s ez ktsgk-
vl mrnki bravr volt.
Programoz: Na ja, de ki teremtette a koszt?

A szoftverek bonyolultak
A szoftverek segtsgvel az ember a vals vilgot prblja modellezni annak rdekben, hogy
munkjt knnyebb, lett knyelmesebb tegye. S minthogy az ember folyamatosan jabb s
jabb tletekkel ll el, s a piacot is meg szeretn hdtani, a szoftverek lland fejldsben
vannak, egyre bonyolultabbakk vlnak. A multimdia betrt letnkbe: termszetes
szmunkra, hogy a szmtgp beszl, zenl s filmeket jtszik mindezekkel a bonyolult
vilgot szeretnnk minl valsghbben visszaadni. De menjnk egy kicsit tvolabb a szmt-
16 I. RSZ. BEVEZETS A PROGRAMOZSBA

gpek szemlyi hasznlattl. Egy lgiirnyt rendszer olyan bonyolult, hogy mkdst
teljes egszben senki sem kpes tltni. Kifejlesztshez rengeteg szakembert kell bevonni: a
szoftverkszts tudomnyn kvl rteni kell a replgpekhez, a radarokhoz, a meteorolgi-
hoz s mg szmos egybhez. Egy-egy ilyen rendszer sok ember sokves munkjnak ered-
mnye lehet, melyre horribilis sszegeket fordtanak a megrendelk.

Minsgi szoftver kell!


Termszetes, hogy minden megrendel minsgi szoftvert szeretne. A felhasznl a minsget
kls jegyekben mri le: szmra az a fontos, hogy a program helyesen s gyorsan mkd-
jk, legyen megbzhat, felhasznlbart s tovbbfejleszthet. Ha ez nem gy van, akkor a
megvsrolt szoftver az embert inkbb htrltatja, mintsem segti munkjban. Ilyen esetben a
megrendel lemond a szoftverrl, s visszakveteli a pnzt. A szoftver minsgt a kls
jegyek hatrozzk meg: amikor hasznlok egy programot, akkor az a fontos, hogy az a legtelje-
sebb mrtkben kiszolgljon, s soha ne hagyjon cserben hogy milyen a program bellrl, az
engem mint felhasznlt nem nagyon rdekel. Tudjuk viszont, hogy a szoftverfejleszt a kvl-
rl lthat s mrhet minsget csak egy bels rend megteremtsvel rheti el. Ezrt a bels
minsg kialaktsa a szoftverfejlesztk lland trekvse.

Szoftverkrzis
A szoftverkrzis fogalmt egy 1968-as NATO szoftverfejlesztsi konferencin vezettk be. A
szoftverfejlesztk szmra vilgoss vlt, hogy a programok bonyolultsga kvetkeztben a
rgi strukturlt mdszer felmondta a szolglatot, ily mdon a minsget nem lehet fenntartani.
Egyfajta kosz kezdett eluralkodni: a rendszereket ksve szlltottk, elkpeszten sokba
kerltek, mkdsk megbzhatatlan volt, s az tvevnek ezer kifogsa akadt. A strukturlt
mdszerekkel trtn szoftverkszts teht vlsgba kerlt, az mr nem volt kpes kezelni a
bels rendet: a szoftverfejleszt trsadalom valamilyen jabb szemlletet, mdszert kvetelt. A
vlsgbl kivezet t az objektumorientlt paradigma (szemlletmd), ennek segtsgvel
gyorsabban s biztonsgosabban rhetnk clt a szoftverfejleszts terletn.
Nem valszn termszetesen, hogy az objektumorientlt mdszertan egyszer s mindenkorra
megoldotta a szoftverfejlesztsi gondokat. Az ember a szoftverrel szemben egyre magasabb
ignyeket tmaszt, s ezt az ppen aktulis technika s mdszertanok nem tudjk egyenletesen
kvetni. Ilyenkor knnyen keletkezhet jabb krzis, amelybl kivezet utat kell keresni. A
szoftverkrzis teht folyamatosan jra s jra elllhat.

Szoftverkrzis: A szoftverfejleszts vlsga, amikor egy hagyomnyos mdszer mr nem


kpes az ignyeknek megfelel minsgi szoftver ellltsra.
1. A szmtgp s a szoftver 1.6. A szoftver minsgnek jellemzi 17

1.6. A szoftver minsgnek jellemzi


Mieltt a minsgi szoftver ellltsnak lehetsgeit boncolgatnnk, nzzk meg a minsgi
szoftver kritriumait! Ezek a kvetkezk:
Helyessg: A szoftver helyes, ha egyrszt a feladat specifikcija helyes (megfelel a
felhasznli ignyeknek), msrszt a szoftver a feladat specifikcija szerint mkdik.
Nyilvnval dolog, hogy a helyessg az elsdleges minsgi kvetelmny, hiszen ha a
program nem gy mkdik, ahogyan azt a megrendel krte, akkor nincs rtelme
tovbb minsgrl beszlni.
Hibatrs: A szoftver hibatr, ha az abnormlis esetekben is a lehetsgekhez
kpest normlisan mkdik. A feladat specifikcija pldul ltalban nem taglalja a
teendket kevs memria esetre. Ez azonban nem jelentheti azt, hogy ha nincs elg
memria, akkor a program minden figyelmeztets nlkl egyszeren abortl, flbe-
hagyva az adatfelvitelt s egyb fontos teendket.
Karbantarthatsg, bvthetsg: Egy szoftver karbantarthat, ha az knnyen javt-
hat, illetve mdosthat. Egy szoftver bvthet, ha azon az jabb felhasznli ignyek
knnyen tvezethetk. Rosszul megtervezett program esetn elfordulhat, hogy a prog-
ram egyik rszn elvgzett vltoztats kvethetetlenl befolysolja a program egyb
rszeit. Csak a knnyen ttekinthet programot tudjuk knnyedn karbantartani, illetve
tovbbfejleszteni.
jrafelhasznlhatsg: Egy szoftver jra felhasznlhat, ha az vagy annak rszei
jabb szoftverekben hasznosthatk. A fejlesztknek sokszor kell olyan feladatot meg-
oldaniuk, melyet mr egyszer pontosan gy vagy hasonlkppen megoldottak. rthet,
hogy ezeket a mr jl bevlt, alaposan tesztelt elemeket jra fel szeretnk hasznlni
annak rdekben, hogy az j program egyedi rszeire koncentrlhassanak.
Kompatibilits: Egy szoftver kompatbilis egy msikkal, ha egyttmkdhet vele.
Gondoljunk pldul a rengeteg file- s kpformtumra: az egyik szoftver csak akkor
tudja hasznlni a msik szoftver ltal ellltott adatokat, ha az adatformtumok megfe-
leltethetk egymsnak.
Felhasznlbartsg: A szoftver felhasznlbart, ha a megjelense kellemes, haszn-
lata knyelmes, egyrtelm, logikus, s minden lehetsges mdon segti a felhasznlt.
Hordozhatsg: Egy szoftver hordozhat, ha az knnyedn tvihet ms hardver-,
illetve szoftverkrnyezetbe.
Hatkonysg: A szoftver hatkony, ha az a rendelkezsre ll hardver- s szoftver-
erforrsokat a legteljesebb mrtkben kihasznlja, a lehet legkisebbre cskkentve
ezzel a futsi idt.
Ellenrizhetsg: Egy szoftver ellenrizhet, ha a tesztelsi adatok s eljrsok kny-
nyedn sszellthatk.
18 I. RSZ. BEVEZETS A PROGRAMOZSBA

Integrits (srthetetlensg): A szoftver srthetetlen, ha a klnbz rendszerhibk


nem okoznak helyrehozhatatlan hibkat (adatokban, programokban, szmtgpben
stb.).
Szabvnyossg: A szabvny valamely egyezmny eredmnyekppen ltrejtt, nyilv-
nosan elrhet definci. Egy szoftver szabvnyos, ha az mkdsben, klalakjban s
dokumentlsban megfelel a szabvnynak (pldul F1-re jn a help, a szvegmezben
a delete gombra karaktert lehet trlni, a felhasznli lers tartalmazza a biztonsgi
elrsokat stb.). Az ISO (International Standard Organization) nemzetkzi szabvnyo-
kat megllapt testlet, amelynek fennhatsga mindenre kiterjed. Egyelre azonban a
szoftverek terletn mg kevs dolog van az ISO ltal szabvnyostva, ezrt a szabv-
nyokat hallgatlagosan a nagyobb szoftverhzak diktljk.

1.7. Modulris programozs


Egy szoftver bonyolultsga csak gy ttekinthet, ha az az ember szmra rthet, kezelhet
modulokbl ll (1.4. bra). A szoftver bonyolultsgnak kezelsre az embernek alapveten kt
eszkz ll a rendelkezsre: az absztrakci s a dekompozci. Az absztrakci segtsgvel
kiemeljk a feladat szempontjbl lnyeges dolgokat, a tbbit pedig figyelmen kvl hagyjuk.
A dekompozci segtsgvel a feladatot rszekre, modulokra bontjuk, mivel az egszet egy-
szerre nem tudjuk ttekinteni. A rszfeladatokat meg kell oldani, majd a modulokat jra ssze
kell lltani, hogy egytt mkdhessenek. A krds az, hogyan bontsuk rszekre a nagy felada-
tot, a rszekre bonts utn hogy fogjunk hozz a megoldshoz, vgl hogy trtnjk az ssze-
raks. Szmos programtervezsi mdszer szletett mr ezek mindegyiknek kivtel nlkl az
a clja, hogy az ember munkjt megknnytsk, mdszert adjanak arra vonatkozlag, hogyan
lehet egy feladatot a legrvidebb id alatt szmtgpre vinni gy, hogy az a legjobb, a leg-
szebb s a legmegbzhatbb legyen, valamint nyitott legyen a bvtsre, tovbbfejlesztsre. Az
eddig megalkotott tervezsi mdszerek egy dologban hasonltanak egymsra: mindegyik
igyekszik betartani a modulokra bonts alapvet szablyait. A modulris programozs olyan
programozsi md, amelyben a teljes program modulokbl ll. Az egyes modulok kezelhet
mretek, egyrtelm cljuk van, s jl definiltan csatlakoznak krnyezetkhz.
A modulris programozs irnyelvei a kvetkezk:
Oszd meg s uralkodj elv: A feladatokat egyrtelmen le kell bontani modulokra. A
modulok mkdsbe ms modul nem szl bele, de elvrhat, hogy minden modul a
sajt feladatt tkletesen elvgezze: a modul felels a feladata elvgzsrt. Nagyon
fontos, hogy a modulok amennyire lehetsges egymstl fggetlenek legyenek.
Tartsuk szem eltt a kt irnyelvet:
Laza kls kts: minl kevesebb legyen a modulok kztti kapcsolatok szma;
Ers bels kts: az egy modulba csak azokat a dolgokat tegyk, amelyek szoros
kapcsolatban llnak egymssal (1.4. bra).
1. A szmtgp s a szoftver 1.7. Modulris programozs 19

gy a hibk egyszerbben kiszrhetk, a feladat tlthatbb, knnyebben mdosthat.


Ha a tkletesen mkd modulokat, programrszeket vgl pontosan egymshoz
illesztjk, akkor sokkal nagyobb ttekintsnk lehet a program egszrl.
Az adatok (az informci) elrejtsnek elve: A megfelel programrszek lehetleg
csak a sajt adataikon dolgozzanak. A rszek csak akkor hasznljanak kzs adatokat,
ha az felttlenl szksges. Kzs lnak tros a hta: sokkal knnyebb egy hibt
felderteni, ha egy programrsz csak a maga adatairt felels, s azok vltoztatsba
ms programrsz nem is nylhat bele. Az a j, ha a programrszek csak a ksz adatokat
adjk t egymsnak.
A dntsek elhalasztsnak elve: Csak akkor hozzunk meg egy dntst, ha az elen-
gedhetetlenl szksges. Azokat a dntseket, amelyekhez mg nincs elegend ismere-
tnk, halasszuk ksbbre egybknt elfordulhat, hogy a megolds egy ksbbi sza-
kaszban fell kell brlnunk eddigi dntseinket.
A dntsek kimondsnak elve: A feladat megoldsa sorn ne hallgassunk el egyetlen
dntst sem. Ha mr meghoztunk egy dntst, akkor azt meg kell fogalmazni, le kell
rgzteni mert ksbb megfeledkezhetnk rla, s gy ellentmondsos dntseket
hozhatunk.

Modul

Rendszer

Modulok kztti
kapcsolat

1.4. bra. Modulris programozs

A modulokra bonts irnya ktfle lehet:


A fellrl lefel (top-down) tervezs esetn a megoldst fellrl lefel, fokozatosan,
lpsenknt finomtjuk (stepwise refinement), s gy a kis feladatokat csak a vgs fzi-
sokban oldjuk meg.
Az alulrl felfel (bottom-up) tervezs lnyege, hogy mr ksz modulokbl ptkeznk.
Erre akkor kerl sor, amikor bizonyos rszfeladatokat egy elz feladat kapcsn mr
megoldottunk, vagy amikor egy modulgyjtemnyt (osztlyknyvtrat, rutingyjte-
mnyt) vsrolunk. A meglv modulok kztti vlogats s azok pontos illesztse csak
nagy programozi tapasztalattal lehetsges.
20 I. RSZ. BEVEZETS A PROGRAMOZSBA

Egy feladat megoldsnak tervezsekor rendszerint fellrl lefel indulunk. Amikor a feladatot
mr sikerlt kellen kis modulokra lebontani, akkor a technikai rszletek kidolgozsban mr
az alulrl felfel trtn ptkezs is fontos szerepet jtszik.

Modulris programozs: Olyan programozsi md, amelyben a teljes program modulok-


bl ll. Az egyes modulok kezelhet mretek, egyrtelm cljuk van, s jl definiltan
csatlakoznak krnyezetkhz. A modulris programozs irnyelvei:
- Oszd meg s uralkodj!
- Az adatok elrejtse
- A dntsek elhalasztsa, illetve kimondsa.
A modulokra bonts irnya lehet fellrl lefel (top-down), s lehet alulrl felfel
(bottom-up).

1.8. Mdszertanok
Programot azrt runk, mert a szmtgp nagy segtsg, s egy jl megrt program segtsgvel
az elvgzett munka mennyisge s minsge a sokszorosra nvelhet. Az letben meg kell
oldani bizonyos feladatokat, lehetsg szerint gyorsan s jl. A lehetsg adott: oldjuk meg a
feladatot szmtgppel! Az els programnyelv tanulsakor az ember azt gondoln, hogy egy
feladat szmtgpre vitelben a legnehezebb dolog az utastsok kivlasztsa egy adott prog-
ramnyelvbl. De ez nem gy van. A legnehezebb dolog a megoldsi mdszer megtallsa, ez
viszont majdnem nyelvfggetlen. Ha megvan a mdszer, akkor mr gyerekjtk azt megfo-
galmazni brmely programozsi nyelven, legyen az Java, Pascal vagy C++.
Egy j szoftver sohasem szletik vletlenszeren. Mg a legegyszerbb program rshoz is
hatrozott elkpzels szksges. Egy szmtgpen megoldand feladat felvetdsnek pilla-
natban mris ers a csbts, hogy az ember leljn a szmtgp el, s mr sse is be az
utastsokat, melyek remnynk szerint a feladat megoldshoz vezetnek. Miutn kszen
vagyunk a begpelssel, a fordt ltal jelzett hibkat tbb-kevesebb id alatt kijavtjuk. Az
ilyen sszedobott program azonban a legritkbb esetben mkdik helyesen. s akkor elkezd-
dik a javtgats. A program bizonyos adatokkal mkdik, msokkal nem. Ha valamit kijav-
tunk, helyette valami ms hiba jelentkezik. Elbb-utbb gy sszekeverednk, hogy mr azt
sem tudjuk, mi is volt a feladat tulajdonkppen. A toldozs-foltozs nem a j programoz
mestersge , megbzhat programot kizrlag mdszeres tervezssel kszthetnk!
A klnbz programtervezsi mdszertanok leginkbb abban klnbznek egymstl, hogy
az adatokat s az adatokon dolgoz programrszleteket milyen modulokra bontjk le, s a
dekompozcit milyen mdon vgzik el. Egy mdszertanhoz szksgkppen valamilyen grafi-
kus jellsrendszer (modellez nyelv) is tartozik. Ezenkvl manapsg egy mdszertan mr
CASE eszkz nlkl is elkpzelhetetlen. Egy CASE (Computer-Aided Software Engineering =
1. A szmtgp s a szoftver 1.8. Mdszertanok 21

szmtgppel tmogatott rendszertervezs) eszkz segtsgvel szmtgpen tervezhetjk


meg programunkat, s a terv alapjn forrskdot is generlhatunk.
A programtervezsi mdszereket illeten hossz ideig a strukturlt programozs, program-
tervezs volt a jelsz , a klnbz mdszerek ilyen szellemben szlettek. Lnyege, hogy a
programot fellrl lefel, funkcionlisan, vagyis mkds szerint egyre kisebb lpsekre
(modulokra, eljrsokra) bontjk. A Jackson fle programtervezsi mdszer olyan specilis
strukturlt mdszer, amelyben a programszerkezetet a bemen s kimen adatszerkezetek
sszefslsbl lltjk fel.
A strukturlt fejlesztssel jr szoftverkrzist az objektumorientlt (OO) szemllet hivatott fel-
oldani. Napjainkban mr szinte kizrlag objektumorientlt szoftverfejlesztsi mdszereket
s szoftvereket hasznlnak a fejlesztk. Az objektumorientlt mdszertanokban a dekompoz-
ci alapja az objektum, melyben az adatok s programrszek egyarnt fontos szerepet jtsza-
nak. Itt az informci elrejtsnek elve minden eddiginl jobban rvnyesl: az egyes objek-
tumok (modulok) adataikkal s viselkedskkel egytt teljes mrtkben felelsek a rjuk bzott
feladatokrt. Objektumorientlt szoftverfejlesztsi mdszer alkalmazsval kisebb energia
befektetsvel s sokkal biztonsgosabban tudunk elkszteni egy, a mai kvetelmnyeknek
megfelel programot.
Knyvnkben a legelterjedtebb objektumorientlt modellez nyelvet, az UML-t (Unified
Modeling Language, Egysgestett Modellez Nyelv) s a hozz tartoz szoftverfejlesztsi
mdszertant, az Egysgestett Eljrst (Unified Process) fogjuk alkalmazni. Az UML-t s az
Egysgestett Eljrst CASE eszkzk is tmogatjk, ilyen pldul a Rational Rose. CASE
eszkzzel azonban knyvnk nem foglalkozik, az UML-t s az Egysgestett Eljrst pedig
csak alapjaiban rintjk.

Egy programfejlesztsi mdszertan tmutatst ad a program elksztsnek mdjra


vonatkozan. A mdszertan segtsget nyjt az adatok (objektumok) s algoritmusok meg-
hatrozsban, a program modulokra bontsban, a modulok elksztsben, majd a mo-
dulok sszeraksban.
Egy mdszertanhoz rendszerint tartozik valamilyen grafikus jellsrendszer. A mdszer-
tanokat s a grafikus jellsrendszereket klnbz CASE eszkzk tmogatjk.

Tesztkrdsek

1.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) Az objektumnak vannak tulajdonsgai s van viselkedse.
b) A szoftver a szmtgp kzzelfoghat rsze.
c) A programkszts clja pusztn adatok szolgltatsa a felhasznl szmra.
d) A program a szmtgp szmra rthet instrukcik sorozata.
22 I. RSZ. BEVEZETS A PROGRAMOZSBA

1.2. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) A gpi kd program a hardver szerves rsze.
b) A natv kd az ember szmra knnyen rtelmezhet programkd.
c) Az assembler fordtprogram.
d) Az alacsony szint nyelv a szmtgphez kzelebb ll nyelv, mg a magas szint
nyelv emberkzeli nyelv.
1.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A programozsi nyelv olyan program, amely az ember ltal ksztett szveges lerst
rtelmezi.
b) A Java fordt platformfggetlen kzbens kdot, bjtkdot generl.
c) Az interpreter a trgykdot visszaalaktja forrskdd.
d) A forrskd egy szveg, melyet a fordtprogram rtelmez, illetve fordt le.
1.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A forrskd a szmtgp ltal rtelmezhet, futtathat kd.
b) A fordtprogram a forrskdbl a szmtgphez kzelebb ll kdot kszt.
c) A trgykd a gp ltal rtelmezhet, futtathat kd.
d) A programszerkeszt a forrsprogram szvegszerkesztje.
1.5. Melyik ngy fogalom llthat prba a kvetkez ngy fogalommal? Jellje meg az
egyetlen j vlaszt!
bjtkd interpreter compiler linker
a) programszerkeszt fordt rtelmez platformfggetlen kzbens kd
b) fordt rtelmez platformfggetlen kzbens kd programszerkeszt
c) platformfggetlen kzbens kd programszerkeszt rtelmez fordt
d) platformfggetlen kzbens kd rtelmez fordt programszerkeszt
1.6. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A modulris programozs lnyege, hogy a programot ksz modulokbl lltsuk
ssze.
b) A szoftverkrzis a hagyomnyos szoftverfejlesztsi mdszer vlsga.
c) A modulris programozs egyik alapelve, hogy a modulok kztt minl ersebb
kts legyen.
d) A modulokra bontst minden esetben fellrl lefel kell elvgezni.
1.7. Mely szavak jellemzik a szoftver minsget? Jellje meg az sszes j vlaszt!
a) Hatkonysg
b) Helyessg
c) Szabvnyossg
d) Gyors fejleszts
1.8. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A strukturlt programozs az objektumorientlt programozs tovbbfejlesztse.
b) A programfejlesztsi mdszertan egy grafikus jellsrendszer.
c) Az objektumorientlt mdszertanokban a dekompozci alapja az objektum.
d) Az UML nem mdszertan, hanem egy modellez nyelv.
2. Adat, algoritmus 2.1. Az algoritmus fogalma 23

2. Adat, algoritmus

A fejezet pontjai:
1. Az algoritmus fogalma
2. Vltoz, tpus
3. Tevkenysgdiagram
4. Pszeudokd
5. Az algoritmus tulajdonsgai

Egy program alapveten adatokbl s az adatok kezelsre szolgl instrukcik (utastsok)


sorozatbl ll. A szoftverfejleszts clja a vgs adatok s algoritmusok megadsa. Egy nagy
feladatot nem lehet egyszerre megoldani, azt kisebb rszekre kell bontani. A dekompozci azt
clozza, hogy a rendszer adatait s instrukciit (mveleteit) gy csoportostsuk, hogy a rend-
szer tlthat s knnyen programozhat legyen. Nagyon fontos, hogy egyszerre csak egy tte-
kinthet adathalmazon dolgozzunk, s az adathalmazon ttekinthet mveletsort alkalmazzunk,
mskpp a program bonyolultt s rthetetlenn vlik. Objektumorientlt lebonts esetn a
rendszer adatait s algoritmusait objektumokra bontjuk szt; minden objektum az adatoknak s
algoritmusoknak egy jl meghatrozott, nem tl nagy rszt kpviseli. Egy objektumorientlt
rendszerben a rendszer moduljai objektumok, melyeken jabb algoritmusok definilhatk,
megadva ezzel az objektumok egyttmkdst.
Brmilyen lebontsi mdszert kvetnk is, adatainkat (objektumainkat) s algoritmusain-
kat meg kell tervezni! E fejezetben tisztzzuk az adat s az algoritmus fogalmt, majd megis-
mernk kt algoritmustervez eszkzt, az UML tevkenysgdiagramjt s egy pszeudokdot.

2.1. Az algoritmus fogalma


Az algoritmus az adatokat mozgat, manipull lpsek, instrukcik sorozata, mely egy feladat
megoldshoz vezet. Algoritmusokkal a htkznapokban is lpten-nyomon tallkozunk: egy
algoritmus sokflekppen adhat meg, pldul: szban, rajzban, rsban vagy egy programo-
zsi nyelven. Egy szmtgp ltal rthet algoritmust programnak neveznk. Ezrt hvjk a
24 I. RSZ. BEVEZETS A PROGRAMOZSBA

szmtgpes program ler nyelvt programozsi nyelvnek. Mi a Java nyelvet hasznljuk


majd adataink s algoritmusaink vgs megadshoz.
Az algoritmus megtervezse eltt meg kell hatroznunk a feladatban szerepl adatokat, adat-
szerkezeteket. (Ennek analgijra a magasabb szint objektumorientlt programtervezsi
mdszer esetn majd objektumokat hatrozunk meg, s az azokat mozgat egyttmkdsi
algoritmust.)
Az adat s algoritmus fogalmt egy feladat segtsgvel tisztzzuk.

Feladat A legfiatalabb lny kivlasztsa


Hannibl tanr r azt kapja feladatul: hatrozza meg a legfiatalabb lnytanult az
osztlyban. Meg kell adnia a krdses lny nevt s szletsi dtumt.

Hannibl tanr r egy feladatspecifikcit kapott. Elszr meg kell vizsglnia (analizlnia
kell), hogy egyltaln kpes-e a feladat megoldsra. Hogyan gondolkodik Hannibl tanr r?
Ahhoz, hogy megoldja a feladatot, bemen adatokra van szksge, mgpedig az osztly sszes
tanuljnak nevre, nemre s szletsi dtumra. Ha ez adva van, akkor a feladat egyrtelm,
s a tanr minden bizonnyal produklni tudja az eredmnyt.
Honnan szerzi be Hannibl tanr r az algoritmus bemen adatait? Kt vlasztsa van: vagy
bemegy az osztlyba, s begyjti az adatokat, vagy az osztlynaplbl kinzi ket. Hannibl
tanr r ez utbbit vlasztja, mert a feladat srgs, s az osztly mr rgen hazament. Nmi
gondolkods utn veszi teht az osztlynaplt, s elkezdi lapozni. Az az elkpzelse, hogy
vgignzi a naplt, s folyamatosan megjegyzi, ki az addigi legfiatalabb lny. A napl vgigla-
pozsa utn az utoljra megjegyzett lny lesz a keresett. Elkezdi teht lapozni a naplt, s min-
den egyes tanulnl megll. Elszr azt nzi meg, hogy a tanul fi-e vagy lny. Ha fi, akkor
tovbblapoz. Ha lny, akkor megnzi a szletsi dtumot. Ha ez ksbbi, mint az utoljra
megjegyzett lny szletsi dtuma, akkor az elz helyett most ezt a lnyt jegyzi meg.
A tanul neme nem szerepel a naplban, azt a tanr a nvbl tallja ki. A szmtgp szmra
azonban csak az egyrtelm utak jrhatk: vagy szerepelnie kell ennek az adatnak a naplban,
vagy kap a tanr egy listt a keresztnevekrl, amelyben minden egyes keresztnv mellett szere-
pel a nemre vonatkoz informci.

Megjegyzs: A feladat megoldshoz nem kellenek programozi ismeretek, elg a jzan


paraszti sz. A feladat szmtgpes megoldshoz termszetesen mr nmi programozsi
tuds is szksges.

Az algoritmus akkor egyrtelm, ha minden egyes lpsnl vilgos, mivel mit kell csinlni.
Az algoritmust valamilyen mdon formalizlni kell. Meg kell hatrozni az algoritmusban
rsztvev, megjegyzend, illetve karbantartand adatokat, s pontosan le kell rni, hogy mitl
fggen milyen lpst kell tenni.
2. Adat, algoritmus 2.2. Vltoz, tpus 25

Egy algoritmusban a kvetkez vezrlszerkezetek lehetnek:


Szekvencia: egyms utn vgrehajtand tevkenysgek sorozata
Szelekci: vlaszts megadott tevkenysgek kzl
Iterci: egy vagy tbb tevkenysg feltteltl fgg, ismtelt vgrehajtsa
Felttel nlkli ugrs: vezrls tadsa az algoritmus egy megadott pontjra

Egy bonyolultabb algoritmust nem lehet fejben megtervezni, ahhoz eszkzk kellenek. Ha
tleteinket sajt, egyni mdszerrel vetjk paprra, azt msok nem fogjk megrteni. Olyan
eszkzre van szksg, amely ltalnosan elfogadott, s a krnyezetnkben ms emberek is
ismerik, hasznljk. A kvetkezkben tisztzzuk a vltoz s a tpus fogalmt, majd ttekintjk
a tevkenysgdiagram s a pszeudokd algoritmusler eszkzket. Mindkt eszkzzel meg-
adjuk A legfiatalabb lny kivlasztsa algoritmust.

Algoritmus: Utastsok (tevkenysgek) sorozata, amely egy feladat megoldshoz vezet.

2.2. Vltoz, tpus


Az algoritmus folyamn Hannibl tanr rnak kt tanul adatlapjt kell megjegyeznie: az aktu-
lisat, s a legfiatalabb lnyt. Vesz teht kt dobozt, az egyikre rrja, hogy aktTanul,
ebben tartja annak a tanulnak az adatlapjt, amelyiknl ppen tart. A msik dobozra felrja,
hogy legTanul, ebben tartja az addigi legfiatalabb lnytanul adatlapjnak msolatt. A
dobozokban egyforma, Tanul tpus adatlapok vannak. A dobozok tartalmt a tanr r llan-
dan cserlgeti, a feladat megoldst majd az utols llapot adja.

Vltoz
Az aktulis tanul adatlapja gy fest (a legtanul adatlapja ugyanilyen, csak a doboz neve ms):

aktTanul:Tanul
nv: String lny: boolean szlDtum: Date

Szv Zsazsa v: number h: number nap: number


true
1976 02 01

A dobozokban lev rtkek vltozhatnak, ezrt a dobozokat vltozknak nevezzk. A vltoz-


kat logikailag csoportostottuk: vannak elemi s sszetett vltozk. Az aktulis tanul adatlapja
sszetett vltoz, mely hrom vltozbl ll: nv, lny s szletsi dtum. A szletsi dtum
hrom tovbbi vltozra bonthat: vre, hnapra s napra. Minden egyes vltoznak nevet
26 I. RSZ. BEVEZETS A PROGRAMOZSBA

adunk (azonostjuk), hogy ksbb egyrtelmen hivatkozhassunk rjuk (aktTanul, nv,


lny, szlDtum, v, h, nap).

Az sszetett vltoz egy elemre a . (pont) minst segtsgvel hivatkozhatunk. Pldnkban


helyes vltozhivatkozsok a kvetkezk:
aktTanul
aktTanul.nv
aktTanul.lny
aktTanul.szlDtum
aktTanul.szlDtum.v
aktTanul.szlDtum.h
aktTanul.szlDtum.nap

Egy programban a vltozk olyan memriaterletek, amelyek klnbz rtkeket vehetnek


fel. Egy vltoznak az algoritmus vgrehajtsa sorn vltozhat az rtke. Az aktTanul.nv
vltoz rtke pldul "Szv Zsazs"-rl knnyen kicserldhet "Egri Kat"-ra, a hozz tartoz
szletsi dtum pedig (1978,06,20)-ra.

Tpus
Minden vltoznak van egy jl meghatrozott tpusa. A vltoz csak a tpusnak megfelel
rtkeket veheti fel, pldul egy szveg tpus vltozba csak szveget tehetnk, dtum tpu-
sba dtumot stb. Szinte minden programozsi nyelvben megtallhatk a kvetkez tpusok:
number (szm). Pldul 45, 99.9, -1.2, 1000000000.
boolean (logikai), rtke true (igaz) vagy false (hamis).
String (szveg). Pldul: "Szv Zsazsa", "Egri Kata".
Date (dtum), sszetett tpus, 3 szmbl ll: v, h s nap. Pldul (1978,06,20).

A number s boolean tpus adatok primitv adatok, a String s Date objektumok (ssze-
tett tpusak). Az UML s Java szabvny szerint a primitv tpusokat kisbetvel, mg az ssze-
tett, objektum tpusokat nagybetvel szoks rni. Ezt a szokst kvetjk most mi is.

Pldnkban a nv vltoz String tpus, a lny vltoz boolean tpus, a szlDtum


Date tpus, az v, h s nap pedig number tpusak.

Egy vltozt az algoritmus csak tpusnak megfelelen kezelhet. Egy szveget nem lehet meg-
szorozni egy szmmal, de le lehet pldul vgni belle kt karaktert. Kt szmot ssze lehet
adni, szorozni stb. Kt szveget, kt dtumot s kt szmot ssze lehet hasonltani egymssal
(melyikk a nagyobb), de egy dtum s egy vals szm mr nem hasonlthat ssze.
Az algoritmusban hasznlt vltozkat deklarlnunk kell: meg kell adnunk azok neveit s
tpusait. Pldul:
legTanul: Tanul
aktTanul: Tanul
2. Adat, algoritmus 2.3. Tevkenysgdiagram 27

rtkads
Egy vltoznak rtkadsi utastssal (mvelettel, tevkenysggel) adhatunk rtket. Az rtk-
adsi utasts (=) baloldaln egy vltoz szerepel, jobboldaln pedig egy rtk, amely lehet
akr egyetlen vltoz aktulis rtke, akr egy vltozkat is tartalmaz kifejezs, pldul:
legTanul = aktTanul
aktTanul.nv = "Egri Kata"
aktTanul.szlDtum = (1976,02,01)
aktTanul.szlDtum.v = aktEv-25

A vltoz olyan memriaterlet, melynek vltozhat az rtke. Minden vltoznak van egy
jl meghatrozott tpusa. A vltoz csak tpusnak megfelelen kezelhet, s abba csak
olyan rtkek tehetk, melyek beletartoznak az adott tpus rtkkszletbe. Az algoritmus
vltozit deklarlni kell: meg kell adni azok neveit s tpusait. Egy vltoznak
rtkadsi utastssal adhatunk rtket.

2.3. Tevkenysgdiagram

A tevkenysgdiagram (aktivitsdiagram, activity diagram) algoritmus lersra szolgl


grafikus jellsrendszer. Segtsgvel a program dinamikus viselkedst tudjuk brzolni.

A diagrambl kiolvashat, hogy adott felttelek mellett mely tevkenysgek kerlnek vgre-
hajtsra egyms utn. A program folysnak irnyt nyilak mutatjk. A tevkenysgek egy-
msutnjnak mindig egyrtelmnek kell lennie, vagyis nem fordulhat el olyan eset, hogy egy
elgazsnl nem lehet eldnteni, merre kell menni.

Megjegyzs: A tevkenysgdiagram az UML diagramja (az llapotdiagram egy specilis


formja), s nagyon hasonlt a sokak szmra jl ismert folyamatbrhoz.

A tevkenysgdiagram alapelemei
A tevkenysgdiagram alapelemeit a 2.1. bra mutatja. Az alapelemek magyarzata:
Kezdpont, vgpont: Az algoritmus bemenete a kezdpont, itt kezddik az algoritmus
vgrehajtsa (pldaknt tekintse a 2.2. brt). A vgpontnl az algoritmus befejezdik.
Egy algoritmusnak egyetlen kezdpontja (belpsi pontja) van, de lehet tbb vgpontja
(kilpsi pontja) is.
Tevkenysg: Az adatokon dolgoz utasts vagy utastssorozat, amely vges id alatt
lezajlik (a tevkenysg jelenthet egy begyazott, sszetett algoritmust is).
Haladsi irny (tmenet): A nyl mindig a haladsi irnyt mutatja idben (tmenet az
egyik tevkenysgbl a msikba). Ha egy tevkenysg vgrehajtsa befejezdtt, akkor
ezt kveten a belle kiindul nyl ltal mutatott tevkenysg kerl vgrehajtsra.
28 I. RSZ. BEVEZETS A PROGRAMOZSBA

Felttel: Ha a nyl mellett egy felttel tallhat, akkor a mutatott tevkenysg csak
akkor kerl vgrehajtsra, ha a felttel igaz. Ha nincs felttel, akkor a mutatott tev-
kenysg mindenkppen vgrehajtdik. Ha tbb nyl indul ki a tevkenysgbl, akkor
azok mindegyikre r kell rni egy felttelt: a felttelek kztt nem lehet tfeds, s le
kell fednik minden lehetsges esetet, mskpp a program vgrehajtsa nem egyr-
telm.
Csompont (elgazsi pont, gyjtpont): Szksg esetn a diagramra csompontokat
tehetnk. Egy elgazsi pontbl a program tbb irnyba mehet, egy gyjtpontba a
program tbb irnybl rkezhet. Egy csompont lehet elgazsi s gyjtpont is egy-
szerre.

Kezdpont: Vgpont: Tevkenysg:

tevkenysg

Csompont
Haladsi irny (tmenet): Felttel: (elgazsi pont, gyjtpont):

[felttel]

2.1. bra. A tevkenysgdiagram alapelemei

Megjegyzsek:
- Rszalgoritmus esetn a kezdpontot nem mindig brzoljk.
- Az aktivitsdiagram prhuzamos (egy idben fut) algoritmusok brzolsra is alkalmas,
de errl ebben a knyvben nem lesz sz.

Az aktivitsdiagramon brmely tevkenysg lehet sszetett tevkenysg is, vagyis az algorit-


musban brmely tevkenysg helyettesthet egy rszalgoritmussal.

Egy felttel rtke true vagy false lehet, ezek ltalban rtkek sszehasonltsbl, vala-
mint felttelek logikai sszekapcsolsbl addnak. A felttelek megadsakor mi elssorban a
Java sszehasonlt s logikai mveleteit alkalmazzuk, de elfogadhatk a jl rthet, term-
szetes megfogalmazsok is:
sszehasonlt mveletek: == (egyenl-e), != (nem egyenl-e), > (nagyobb-e), >=
(nagyobb vagy egyenl-e), < (kisebb-e), <= (kisebb vagy egyenl-e)
Logikai mveletek: & (and/s); | (or/vagy); ! (not/nem)
2. Adat, algoritmus 2.3. Tevkenysgdiagram 29

A kvetkez felttel azt fogalmazza meg, hogy az a vltoz rtke 5 s 10 kz esik, belertve
a hatrokat is: (a>=5)&(a<=10). Ha a=7, akkor a felttel rtke true, azaz teljeslt a felttel.
Egy algoritmusban vannak jellegzetes vezrlsi struktrk, ilyenek a szekvencia, a szelekci s
az iterci (az ugr utastsokkal most nem foglalkozunk). Nzzk most sorra ezeknek a tev-
kenysgdiagramjt!

Szekvencia
A szekvencia egyms utni tevkenysgek sorozata. A szekvencit a nyilak irnyban felso-
rolt egyms utni tevkenysgek alkotjk:

tevkenysg1

tevkenysg2

Szelekcik
A szelekci programelgazst jelent; egy adott ponton a tevkenysgek vgrehajtsa felt-
telektl fgg. Szelekci esetn a tevkenysgbl vagy az elgazsi pontbl kifel vezet
nyilak (programgak) mindegyikn szerepel egy felttel. Ha igaz egy adott felttel, akkor a
felttel vonalnak irnyban halad tovbb a vezrls, s a mutatott tevkenysg hajtdik vgre.
Megadhat egy egybknt (else) g: ha a tbbi felttel nem teljesl, akkor erre az gra kerl a
vezrls. Az egybknt gra az [else] felttelt rjuk.
A felttelek kztt nem lehet tfeds, s le kell fednik minden lehetsges esetet. Minden eset-
ben pontosan egy gra kerl a vezrls. A felttelesen vgrehajtand tevkenysgek szmtl
fggen szoks egyg, ktg s tbbg szelekcirl beszlni. Az egyg s tbbg szelek-
ci tevkenysgdiagramja a kvetkez:

Egyg szelekci: Tbbg szelekci:

[else]

[felttel1] [felttel2] [else]


[felttel]

tevkenysg1 tevkenysg2 ... tevkenysgN


tevkenysg
30 I. RSZ. BEVEZETS A PROGRAMOZSBA

Itercik
Az iterci bizonyos tevkenysg(ek) ismtelt vgrehajtsa. Az ismtlend tevkeny-
sge(ke)t ciklusmagnak nevezzk. Az itercit kiss pongyoln ciklusnak is szoks nevezni,
br a ciklus szoros rtelemben a ciklusmagot jelenti. Iterci esetn a vezrls ismtelten visz-
szatr a ciklusmag el, de az jbli vgrehajts eltt egy elgazsi pont tallhat, mely megen-
gedi a ciklus elhagyst. Ha a vezrls nem tudja elhagyni a ciklust, vgtelen ciklusrl besz-
lnk. Azt a ciklust, melynek nincsen magja (nincs benne utasts), res ciklusnak nevezzk.
Ktfajta iterci ltezik: az egyik a ciklusmag eltt tesztel, a msik a ciklusmag utn, htul. A
htultesztel iterci egyszer mindenkppen vgrehajtdik:

Elltesztel ciklus: Htultesztel ciklus:

[else]
tevkenysg
[felttel]

tevkenysg
[felttel]
[else]

Az itercikat aszerint is szoks osztlyozni, hogy belpsi vagy kilpsi felttelt adunk-e
meg (a felttel megfordthat, ekkor az igaz s hamis gak felcserldnek). Az brn lev
mindkt ciklus belpsi felttelt fogalmaz meg.

Lptet (szmll, nvekmnyes) ciklus:


A lptet ciklus azt jelenti, hogy a ciklusmag minden egyes vgrehajtsakor egy n. ciklus-
vltoz automatikusan lp egyet (megvltozik, pldul nvekszik vagy cskken). A ciklusvl-
tozt, annak kezdeti rtkt, a ciklusba val belps felttelt s a lptetsi utastst (lpskzt)
a ciklus fejben adhatjuk meg. A ciklusmag hasznlhatja ciklusvltozt. A lptet ciklust a
tevkenysgdiagramon elltesztel ciklussal tudjuk megvalstani:

[cvlt=kezd; cvlt<=vg; cvlt=cvlt+lpskz]

tevkenysg
2. Adat, algoritmus 2.3. Tevkenysgdiagram 31

A legfiatalabb lny kivlasztsa


Ksztsk most el A legfiatalabb lny kivlasztsa feladat megoldsnak tervt! Elszr meg-
hatrozzuk az adatokat, melyeken az algoritmus dolgozik majd:

Adatok:

Mindssze kt Tanul tpus vltozt (adatlapot) kell felvennnk:


aktTanul: Tanul (nv:String, lny:boolean, szlDtum:Date)
legTanul: Tanul (nv:String, lny:boolean, szlDtum:Date)

Az aktTanul vltozba tesszk majd mindig az aktulis tanul adatlapjt. Az algoritmus


egyszerre csak egy aktTanul adatlapot rhet el. A legTanul vltozba tesszk az addigi
legfiatalabb lny adatlapjt, ez adja majd az sszes adatlap feldolgozsa utn a feladat megol-
dst.

Algoritmus:
Az algoritmus tevkenysgdiagramja a 2.2. brn lthat. Elemezzk az algoritmust:

Els tevkenysgknt a legTanul adatlap szlDtum vltozjba egy olyan dtumot


tesznk, amelynl brmely lnytanul szletsi dtuma biztosan ksbbi: (1900,01,01). Felt-
telezzk, hogy a lnyok kztt van 100 vesnl fiatalabb; ha nem gy lenne, algoritmusunk
nem mkdnk helyesen. Msodik tevkenysgknt bekrjk a felhasznltl a kvetkez
tanul adatlapjt, melyet az aktTanul vltozban helyeznk el (az in=be adatbevitelt jelez).
Ha van mg tanul a naplban, akkor a bevitel sikerl, s feldolgozzuk az adatlapot, egyb-
knt az iterci befejezdik.

A ciklusmagban megnzzk, hogy az aktTanul lny-e, s fiatalabb-e, mint az eddigi legfia-


talabb. Ha mindez teljesl, akkor az eddigi legfiatalabb lny adatlapjt (a legTanul-t) kicse-
rljk az aktTanul adatlapjnak egy msolatra. A ciklus vgn bekrjk a kvetkez tanul
adatlapjt. A ciklus addig tart, amg maradt mg tanul, vagyis sikerlt a bekrs. Hogy egy
tanul fiatalabb-e, mint a msik, azt gy dnthetjk el, hogy sszehasonltjuk szletsi dtu-
maikat. Kt dtum sszehasonltsa nem termszetes, azt vagy tudja egy adott programnyelv,
vagy nem. Az sszehasonlts lehet egy jabb algoritmus, melyben az vet, a hnapot s a
napot egyenknt ssze kell hasonltani. Ezt az algoritmust a kvetkez pontban, a
pszeudokdnl meg fogjuk adni.
Vgl kirjuk az eredmnyt. Elfordulhat, hogy a felhasznl egyetlen tanult sem vitt be, vagy
pedig nem volt a tanulk kzt lny (a programoznak minden lehetsgre fel kell kszlnie),
ezrt ezt az esetet kln kezeljk. Ha volt lny, akkor kirjuk az eredmnyt (out=ki), egyb-
knt kirjuk, hogy Nincs lny.
32 I. RSZ. BEVEZETS A PROGRAMOZSBA

legTanulo.szlDatum = (1900,01,01)

in: aktTanul

[else]
[sikerlt]
[aktTanul.lny & [else] Ha lny s
aktTanul.szlDtum > fiatalabb, akkor
legTanul.szlDtum] megjegyezzk
legTanul = aktTanul

in: aktTanul

[legTanulo.szlDatum !=
(1900,01,01)] [else]

out: legTanul.nv, out: "Nincs lny"


legTanul.szlDtum

2.2. bra. Tevkenysgdiagram A legfiatalabb lny kivlasztsa

A tevkenysgdiagramban a nyilak elvileg akrhova hzhatk, ezrt nagyon knny teljesen


ttekinthetetlen diagramot kszteni. A tevkenysgdiagramnak legyen mindig tiszta a
szerkezete: egyrtelmen lehessen ltni benne a vezrlszerkezeteket! A kvetkez pontban
trgyaland pszeudokdnak sokkal ktttebb formja van, gy sok esetben knnyebb azt
ttekinteni. Egy aktivitsdiagramnak akkor tiszta a szerkezete, ha knnyedn meg tudjuk adni
annak pszeudokdos vltozatt.
2. Adat, algoritmus 2.4. Pszeudokd 33

2.4. Pszeudokd
A pszeudokd lnyege, hogy a programot az emberi gondolkodshoz kzel ll mondatszer
elemekbl ptjk fel. Annyiban tr el a folyamatos magyar rstl, hogy itt be kell tartanunk
bizonyos szablyokat a vezrlszerkezetek kpzsre megllapods szerinti formkat s
szavakat vesznk ignybe. A tevkenysgek (utastsok) szabad formban is megadhatk. Az
adatok deklarlsa a pszeudokd rsze. Adatok bekrsre/megjelentsre szoks az in/out
kulcssz hasznlata:
in: vltoz1, vltoz2, ...
out: kifejezs1, kifejezs2, ...

A knnyebb rthetsg kedvrt elre sszefoglaljuk az itt trgyalt angol szavak jelentst
bcrendben:
do csinld if ha
else egybknt, klnben in be
end vge out ki
for -ra, -re while amg

Knyvnk egy olyan egyni pszeudokdot alkalmaz, amelyben a vezrlszerkezeteket meg-


ad kulcsszavak ersen hasonltanak a legtbb programozsi nyelvben alkalmazott kulcssza-
vakhoz. Amikor szksg van r, ezt a pszeudokdot fogjuk hasznlni.
Nzzk most sorra a vezrlszerkezetek pszeudokdjait! Elrebocstjuk, hogy ahol a vezrl-
szerkezetben egy tevkenysg szerepel, oda tbb tevkenysg is beilleszthet.

Szekvencia
tevkenysg1
tevkenysg2
...
tevkenysg1, tevkenysg2 stb. egyms utn kerlnek vgrehajtsra.

Pldul hrom szm bekrse egyms utn:


in: szam1
in: szam2
in: szam3

Szelekcik

Egyg szelekci
if felttel
tevkenysg
end if
34 I. RSZ. BEVEZETS A PROGRAMOZSBA

Ha a felttel teljesl, akkor a tevkenysg vgrehajtsra kerl, egybknt nem. A prog-


ram az end if utn folytatdik.
Pldul: ha az letkor 100-nl tbb, kirjuk az "ids" szveget:
...
if eletkor>100
out: "ids"
end if

Tbbg szelekci
if felttel1
tevkenysg1
else if felttel2
tevkenysg2
else if felttel3
tevkenysg3
...
else
tevkenysgN
end if

A felttelI teljeslse esetn a tevkenysgI kerl vgrehajtsra. Ha egyik felttel sem


teljesl, akkor az else gra kerl a vezrls. Az else g elhagyhat; ilyenkor ha egyik felttel
sem teljeslt, nem hajtdik vgre semmi. A program minden esetben az end if utni tev-
kenysggel folytatdik.
Pldul: bekrnk egy letkort, s kirjuk a kornak megfelel jellemzst:
letkor: number
in: letkor
if letkor<14
out: "gyerek"
else if letkor<18
out: "fiatal"
else
out: "felntt"
end if

Ciklusok
Egy tevkenysg a megadott felttel fggvnyben ismtelten vgrehajtdik.

Elltesztel ciklus
while felttel
tevkenysg
end while

A felttel itt belpsi felttel. Megengedett az res ciklus is.


2. Adat, algoritmus 2.4. Pszeudokd 35

Pldul: ngyzetszmok kirsa 1000-ig:


szam: number
szam=1
while szam*szam<=1000
out: szam*szam
szam=szam+1
end while

Htultesztel ciklus
do
tevkenysg
end do while felttel

Az jbli belpsrl a ciklus vgn szletik dnts. A ciklusmag egyszer mindenkppen vg-
rehajtdik. A ciklus vgn belpsi felttelt adunk meg.
Pldul: szm bekrse, amg nem tnek be egy 10 s 20 kztti rtket (hatrokat is bele-
rtve):
szam: number
do
in: szam
end do while szam<=10 | szam>=20

Lptet (szmll, nvekmnyes) ciklus


for cvlt=kezd; cvlt<=vg; cvlt=cvlt+lpskz
tevkenysg
end for

A tevkenysg a ciklusvltoz kezd s vgrtke kztt minden olyan rtkre vgrehajt-


dik, amelyik a lptetsi utasts hatsra elll.
Pldul szmok kirsa 200-tl 250-ig:
i:number
for i=200; i<=250; i=i+1
out: i
end for

Rutin (eljrs, fggvny)


A rutin egy kln nvvel elltott sszetett tevkenysg. A rutin meghvhat a nevre trtn
hivatkozssal. A rutinnak lehetnek paramterei, melyek a rutin vgrehajtsakor felhasznlha-
tk, s lehet visszatrsi rtke, amely a hvs helyn hasznlhat fel. A visszatrsi rtk nl-
kli rutint eljrsnak, mg a visszatrsi rtkkel rendelkez rutint fggvnynek nevezzk.
36 I. RSZ. BEVEZETS A PROGRAMOZSBA

Megjegyzs: A C++ nyelv szerint minden rutin fggvny, amelyek kzl egyeseknek a visz-
szatrsi rtke void (semleges), azaz nincs visszatrsi rtkk. A Java terminolgia hasonlt
ehhez, de ott nem fggvnyekrl, hanem metdusokrl beszlnk. Ettl fggetlenl fogalmi
szinten eljrs s fggvny egyarnt ltezik.

Eljrs
Az eljrs egy visszatrsi rtkkel nem rendelkez rutin. Egy eljrst a kvetkezkppen
runk meg (definilunk):
eljrsnv(par1:Tpus1, par2:Tpus2, ...)
tevkenysg(ek)
end eljrsnv

Az eljrs meghvhat a nevre hivatkozssal:


eljrsnv(rtk1, rtk2, ...)

A hvskor megadott paramterek szmnak meg kell egyeznie az eljrs defincijban meg-
adott paramterek szmval, s a paramterek tpusainak is rendre meg kell egyeznik. Vgre-
hajtskor par1 rtke rtk1 lesz, par2 rtke rtk2 stb. Az eljrs a paramterl kapott
rtkekkel dolgozik. Elfordulhat, hogy az eljrsnak nincsen paramtere; a nyit-csuk zr-
jelprost ilyenkor is le kell rnunk mind a deklarciban, mind a hvs helyn.

Eljrs pldul:
Megadott kt szm sszeadsa, s az eredmny kirsa. Az sszead eljrsban megh-
vunk egy kiir(n) eljrst, amely a paramterben megadott szmot 4 karakterhelyen
jobbra igaztva rja ki:

sszead(a:number, b:number)
kiir(a)
kiir(b)
out:"----"
kiir(a+b)
end sszead

Az eljrs hvsa:
sszead(986,45)
Az eljrs vgrehajtsakor a konzolon ez fog megjelenni:
986
45
----
1031
2. Adat, algoritmus 2.4. Pszeudokd 37

Fggvny
A fggvny olyan rutin, amely visszatrsi rtkkel rendelkezik. Egy fggvny belsejben
a visszatrsi rtket egy return utastssal adjuk vissza:
fggvnynv(par1: Tpus1, par2: Tpus2, ...): Tpus
tevkenysg(ek)
return rtk // a fggvny visszatrsi rtke
end fggvnynv

Ahol egy adott tpus rtk lerhat, ott fggvnyt is hvhatunk. A fggvny hvsa trtnhet
pldul az rtkads jobboldaln:
vltoz = fggvnynv(rtk1, rtk2, ...)

Fggvnyek pldul:
Ngyzetfggvny (egy szm ngyzett adja vissza):
sqr(x:number): number
return x*x
end sqr

A fggvny hvsa pldul:


out: sqr(15) // 225-t r ki

Maximumfggvny (kt szm kzl a nagyobbikat adja vissza):


max(a:number, b:number): number
if a>b
return a
else
return b
end if
end max

A fggvny hvsa pldul:


n,x: number
n = 5
x = max(n,17) // x == 17

A kd strukturlsa
A pszeudokdban, illetve a program forrskdjban a vezrlszerkezetek (szekvencia,
szelekci s iterci) jelenltt a forrsszveg vzszintes eltolsval fejezzk ki. Ha egy tev-
kenysg beljebb kezddik, mint egy valamelyik felette ll elem, az minden esetben egy vezr-
lszerkezet jelenltt mutatja. A vezrlszerkezetek bels alrendelt egysgeit a forrskd-
ban jobbra toljuk. A szp, strukturlt forrskd olvashatv teszi a programot. A struktu-
rls szablyai a programozra nzve ktelezek!
A pszeudokd sokkal ktttebb forma, mint a tevkenysgdiagram. Minden pszeudokd
knnyen talakthat tevkenysgdiagramm, de ez fordtva nem igaz. Egy tevkenysgdia-
38 I. RSZ. BEVEZETS A PROGRAMOZSBA

gramban knny olyan tmenetet ltrehozni kt tevkenysg kztt, hogy az bra bizonyos
rszei a hrom strukturlt vezrlszerkezet felhasznlsval nem alakthatk t pszeudokdd!

A legfiatalabb lny kivlasztsa


Most megadjuk A legfiatalabb lny kivlasztsa feladat algoritmusnak pszeudokdjt:
Adatok (mint a tevkenysgdiagramnl)
aktTanul: Tanul(nv:String, lny:boolean, szlDtum:Date)
legTanul: Tanul(nv:String, lny:boolean, szlDtum:Date)

Algoritmus
A nagyobb fggvny megadja, hogy az els dtum ksbbi-e, mint a msodik:
nagyobb(dtum1:Date, dtum2:Date): boolean
nagy : boolean = false
if (dtum1.v>dtum2.v)
nagy = true
else if (dtum1.v==dtum2.v) & (dtum1.h>dtum2.h)
nagy = true
else if (dtum1.v==dtum2.v) & (dtum1.h==dtum2.h) &
(dtum1.nap>dtum2.nap)
nagy = true
end if
return nagy
end nagyobb

A kiir eljrs kirja a megadott tanul adatait:


kiir(tanulo: Tanul)
out: tanul.nv, tanul.szlDtum.v, tanul.szlDtum.h,
tanul.szlDtum.nap
end kiir
A f algoritmus:
legfiatalabbLny()
legTanul.szlDtum = (1900,01,01)
in: aktTanul
while sikerlt
if (aktTanul.lny &
nagyobb(aktTanul.szlDtum,legTanul.szlDtum))
legTanulo = aktTanulo
end if
in: aktTanulo
end while
if legTanulo.szulDatum != (1900,01,01)
out: "Legfiatalabb lny:"
kiir(legTanul)
else
out: "Nincs lny"
end if
end legfiatalabbLny
2. Adat, algoritmus 2.5. Az algoritmus tulajdonsgai 39

Pszeudokd: algoritmus lersra szolgl, mondatszer elemekbl felpl szveges


jellsrendszer. Segtsgvel a program dinamikus viselkedst tudjuk lerni. A vezrl-
szerkezetek (szekvencia, szelekci s iterci) bels alrendelt egysgeit a forrskdban
jobbra toljuk. A szp, strukturlt forrskd olvashatv teszi a programot.

A rutin egy kln nvvel elltott sszetett tevkenysg, amelynek lehetnek paramte-
rei. A rutin lehet eljrs vagy fggvny. Az eljrsnak nincs visszatrsi rtke, a fgg-
vnynek van.
Mieltt hozzltunk az algoritmus megtervezshez, meg kell hatroznunk azokat az
adatokat, objektumokat, melyeken az algoritmus dolgozni fog! gyeljnk a kvetkezkre:
- Az adatok tbbnyire fnevek, a tevkenysgek pedig igk vagy igbl kpzett fnevek!
- A megtervezett algoritmus legyen ttekinthet, olvashat s egyrtelm! A tervezshez
lehetleg szabvnyos jellsrendszert alkalmazzunk!
- A hossz s bonyolult algoritmusokat osszuk rszekre!

2.5. Az algoritmus tulajdonsgai


Az algoritmus leglnyegesebb tulajdonsgait a kvetkez pontokban foglalhatjuk ssze:
Az algoritmus lpsekbl (elemi tevkenysgekbl, instrukcikbl, utastsokbl) ll.
Minden lpsnek egyrtelmen vgrehajthatnak kell lennie. Az algoritmus lers-
ban a vgrehajtt minden lehetsges esetre elre fel kell kszteni. A vgrehajt egysg
minden lps utn eldnti, mi lesz a kvetkez lps.
Egy algoritmusban hivatkozhatunk sszetett lpsekre is, ezek rszletezst kln
megadhatjuk.
A vgrehajtand instrukcinak valamilyen clja van. A vgrehajts sorn valamilyen
vltozs kvetkezik be. ltalban megvltoznak az adatok rtkei.
Az algoritmus vges szm lpsbl ll. Ez azt jelenti, hogy az algoritmizl ember a
feladat megoldsval, vagyis az algoritmus lersval elbb-utbb vgez. A vgrehajts,
vagyis a program is ltalban vges szm lps utn befejezdik, de vannak esetek,
amikor a megoldsnak nem az a lnyege, hogy valahonnan valahov eljussunk, hanem a
megolds maga az algoritmus. Tekintsk a MALV szmtgpes rendszert! Mikor
llhat le a program? J lenne, ha nem ppen akkor sznne meg a szmtgpes irnyts,
amikor mi lnk egyik gpk fedlzetn.
Az algoritmusnak ltalban vannak bemen (input) adatai, melyeket felhasznl. A
bemen adatok pldnkban a tanulk adatlapjai.
Az algoritmusnak legalbb egy kimen (output) adatot eredmnyeznie kell. Az a
folyamat, amely brilins dolgokat mvel, de nem kommunikl a klvilggal, definci
szerint nem algoritmus. Pldnkban a kimen adat a legfiatalabb lny adatlapja.
40 I. RSZ. BEVEZETS A PROGRAMOZSBA

Strukturlt algoritmus
Bebizonytottk, hogy minden olyan algoritmus, amelynek egy belpsi s egy kilpsi pontja
van, a szekvencia, a szelekci s az iterci segtsgvel felpthet (Bhm s Jacopini ttele).
A strukturlt programozs ltalnos mdszert E. W. Dijkstra dolgozta ki. A strukturlt prog-
ramozsban ismeretlen a felttel nlkli ugrs fogalma, gy pldul nem ugorhatunk ki egy
ciklusbl. Ebbl kvetkezik, hogy a program minden szekvencijnak s gy az egsz prog-
ramnak is egyetlen belpsi s egyetlen kilpsi pontja van.
Megjegyezzk, hogy ebben a knyvben mi az objektumorientlt programozs elveit fogjuk
kvetni. Az objektumorientlt programozsban az algoritmusok kicsik, s gy az azokbl val
kiugrs nem rontja az ttekinthetsget. Ok nlkl termszetesen nem ugrunk ki sem ciklusbl,
sem rutinbl. Az objektumorientlt programozs alapelvei a strukturlt s a modulris
programozs tapasztalataira plnek.

Strukturlt algoritmus: Olyan algoritmus, amely csak szekvencikbl, szelekcikbl s


itercikbl ptkezik.

Tesztkrdsek

2.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) Minden algoritmusnak kell, hogy legyen bemen adata.
b) Az algoritmus olyan instrukcik sorozata, amely egy feladat megoldshoz vezet.
c) Az algoritmus akrhny lpsbl llhat.
d) A program a szmtgp ltal rthet algoritmus.
2.2. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A vltoz olyan memriaterlet, mely a program futsa sorn vltozhat.
b) Egy vltoznak tbbfle tpusa is lehet.
c) A tevkenysgdiagram olyan diagram, amelynek segtsgvel kvetni lehet a prog-
ramban tallhat tevkenysgek egymsutnisgt.
d) A szelekci egyms utni tevkenysgek sorozata.
2.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A pszeudokd programozsi nyelv.
b) A pszeudokd strukturlsa a programozra nzve ktelez.
c) Az iterci a ciklusmagot egy elre megadott szmszor hajtja vgre.
d) A lptet ciklus ms elnevezse nvekmnyes ciklus.
2.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Szekvencia esetn feltteltl fggen egy vagy tbb tevkenysg kzl vlasztha-
tunk.
b) A lptet ciklus htul tesztel.
c) A htultesztel ciklus megengedi, hogy a ciklusmag egyszer se hajtdjk vgre.
d) Azt a ciklust, melynek nincsen magja, res ciklusnak nevezzk.
2. Adat, algoritmus 2.5. Az algoritmus tulajdonsgai 41

2.5. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) A rutin egy kln nvvel elltott sszetett tevkenysg.
b) Az eljrsnak nincs visszatrsi rtke.
c) Egy strukturlt algoritmusban nem lehet a ciklusbl kiugrani.
d) Ajnlatos a tevkenysgeket fnevekkel azonostani.

Feladatok
Tervezze meg mindkt algoritmusler eszkz (tevkenysgdiagram s pszeudokd) segtsg-
vel a kvetkez algoritmusokat (egyeztesse a terveket, hogy megfelelnek-e egymsnak!)

2.1. (A)1 Egy adott napon trtn vsrlsokrl az sszes szmla a hziasszony asztaln
hever. Minden szmln szerepel az elklttt sszeg. Segtsnk a hziasszonynak, s
ksztsnk olyan algoritmust, amely meghatrozza az aznap elklttt sszeget! Jelent-
sk meg szmra ezt az informcit! A feladatot ktflekppen is oldjuk meg:
a) Tegyk fel, hogy sszesen 10 darab szmla van az asztalon, s ezt elre tudjuk.
b) Nem tudjuk elre a szmlk szmt.
(Szamlak.html) 2

2.2. (A) Az olimpiai jtkok idejn sorban jnnek a hrek az rmekrl. Ksztsnk egy olyan
algoritmust, amely jegyzi a hreket, s az olimpia vgn megmondja, hny arany-,
ezst-, illetve bronzrmnk szletett sszesen! (Olimpia.html)
2.3. A program krje be sorban a hallgatk nevt s tanulmnyi tlagt! Hogy nincs tbb
hallgat, azt a nv="*"-gal jelezzk. A program rja ki a legjobb s a legrosszabb tlag
hallgat nevt! (Tanulmny.html)
a) (B) Tbb egyforma hallgat esetn elegend csak egyikket kirni.
b) (C) Tbb egyforma hallgat esetn rjuk ki az sszes hallgat nevt!

Csoportmunka
2.4. (B) Alaktsunk ki hrom, egyenknt 3 fs csoportot!
a) Az els csoport ksztsen egy feladatspecifikcit! gyeljenek a feladatspecifikci
egyrtelmsgre s a megoldhatsgra!
b) A msodik csoport ellenrizze a feladatspecifikcit, majd ksztse el a feladat ter-
vt tevkenysgdiagramban!
c) A harmadik csoport ksztse el a terv alapjn a pszeudokdot!
A csoportok vgl beszljk meg, mire kell gyelni a feladat megfogalmazsakor s a
tervezsben, hogy a feladat s a megolds menete ms szmra is rthet legyen!

1
A feladat nehzsgi szintjt ABC-vel jelljk: (A) rutinfeladat; (B) knny feladat; (C) nehezebb
feladat. (Lsd Tanulsi s jellsi tmutat)
2
A megoldsok a knyv mellkletben megtallhatk.
42 I. RSZ. BEVEZETS A PROGRAMOZSBA
3. A szoftver fejlesztse 3.1. A szoftverfejleszts alkotmunka 43

3. A szoftver fejlesztse

A fejezet pontjai:
1. A szoftverfejleszts alkotmunka
2. Az Egysgestett Eljrs
3. Kvetelmnyfeltrs
4. Analzis
5. Tervezs
6. Implementls (kdols)
7. Tesztels
8. Dokumentls

Egy adott feladat megoldsa szmtgp segtsgvel hossz s bonyolult munka. Egy prog-
ram, illetve programrendszer fejlesztse heteket, hnapokat, st veket vehet ignybe
gondoljuk csak el, mekkora lehet pldul egy nemzetkzi biztost trsasg szmtgpes rend-
szere. A szmtstechnika fejldsvel a munka egyre nagyobb rsze van ugyan gpestve, de a
lnyegi rszt mgiscsak embernek kell elvgeznie, hiszen a szmtgp nem tud gondolkodni,
nincsen akarata, zlse. A munka ember ltal ksztett rszei azonban mindig hibagcok lehet-
nek, mert az ember termszetnl fogva meglehetsen pontatlan. A szmtgpnek persze
knny pontosnak lennie, az csak a betpllt szablyok szerint dolgozik. De az ember ppen
azrt ms, mint a gp, hogy olyan problmkkal is meg tud birkzni, amilyeneket mg nem
tplltak bel. Az az ember, aki sszer szablyok szerint dolgozik, nemcsak okos lehet, hanem
pontos is. Ez a fejezet a szoftverfejlesztssel kapcsolatos alapvet ismereteket, szablyokat
trgyalja.

3.1. A szoftverfejleszts alkotmunka


A szoftverfejlesztk hamar rjttek, hogy egy rendszer csak akkor lesz knnyen karbantart-
hat, illetve tovbbfejleszthet, ha a rendszer fejlesztse megadott szablyok szerint trtnik. A
feladatot pontosan definilni kell, a megoldst pedig mdszeresen modulokra kell bontani,
hogy minl rvidebb id alatt ttekinthet, hibamentes s jrafelhasznlhat szoftvert fejleszt-
hessnk.
44 I. RSZ. BEVEZETS A PROGRAMOZSBA

Ha nagyon kicsi a program, s nem szksges a programot dokumentlni (ksbbi felhasznls


cljbl rtheten lerni), akkor elkpzelhet, hogy az ember lel a gp el, s rgtn elkezdi
rni a forrsprogramot; de csak akkor szabad ilyent tenni, ha a program terve a fejnkben mr
teljes egszben sszellt. Van, aki knnyebben t tud gondolni bizonyos programokat, msnak
paprra s ceruzra van szksge mindehhez. Egy a lnyeg: a programozs nem improviz-
ci, hanem felelssgteljes alkots, mivel felelsek vagyunk mind a program mkds-
rt, mind annak olvashatsgrt s javthatsgrt. J s megbzhat programot kszteni
csak tervezssel, alapos rkszlssel lehet. Nagyon fontos, hogy egy leend programoz mr
az els lpseket is ilyen szellemben tegye meg.
A rendszerfejlesztssel, illetve a fejleszts lpseivel kapcsolatban mr rengeteg elkpzels,
mdszer szletett. A szoftverekkel szemben tmasztott nvekv ignyek minduntalan jabb s
jabb szoftverfejlesztsi mdszereket szlnek.
E knyv clja, hogy megismertesse az Olvast a szoftverfejleszts s programkszts alapjai-
val. Szoftvereink elksztshez a ma szleskren elfogadott legmodernebb szoftverfejlesztsi
eszkzket hasznljuk:
UML (Unified Modeling Language, Egysgestett Modellez Nyelv): Grafikus jells-
rendszer a szoftver klnbz nzeteinek modellezsre. Segtsgvel tervezni s
dokumentlni tudjuk programjainkat.
Egysgestett Eljrs (Unified Process): Mdszertan a fejleszts mdjra vonatkozan.
Java: Magas szint programnyelv programjaink implementlshoz (kdolshoz).

3.2. Az Egysgestett Eljrs


Az UML, majd a hozz tartoz Egysgestett Eljrs annak a hrom eljrsnak (OMT, Booch
s OOSE) az egysgestseknt jtt ltre 1997-ben, amelyek a vilgon legelterjedtebb objek-
tumorientlt szoftverfejlesztsi mdszerek voltak. A szoftverfejlesztssel kapcsolatos alapisme-
reteket erre az eljrsra alapozva mutatjuk meg.
Egy szoftver elksztsnek folyamatt a felmerl problmtl a ksz, eladhat termk tad-
sig szoftverfejlesztsnek (software development) nevezzk. Kisebb szoftverek esetn prog-
ramfejlesztsrl (program development), sszetettebb, a vals folyamatokkal is foglalkoz
szoftverek esetn pedig rendszerfejlesztsrl (system development) szoks mg beszlni. A
szoftvert a megrendel rendeli meg, a szoftverfejleszt kszti el, s a ksz szoftvert a
felhasznl hasznlja. A szoftverfejleszts olyan projekt (feladat, munka), melyet a szoftver-
fejleszt vgez el a megrendelvel, illetve a felhasznlval folytatott megbeszls, illetve a
vele kttt szerzds alapjn. Amikor a szoftver elkszl, azt a fejleszt tadja a megrendel-
nek. A felhasznl a szoftvert a fejleszt tmutatsai alapjn hasznlja.
3. A szoftver fejlesztse 3.2. Az Egysgestett Eljrs 45

Megjegyzs: Elkpzelhet olyan eset is, hogy a szoftverfejleszt maga a megrendel vagy a
felhasznl (ha valaki a sajt rszre kszt programot).

A szoftver lete, fejlesztsi ciklus, szoftver verzi


A szoftverkszts tlettl egy ksz szoftver tadsig a szoftverfejleszts egy ciklusrl
beszlnk. A fejlesztsi ciklus vgn a szoftverfejleszt tadja a megrendelnek a szoftver egy
verzijt (3.1. bra). A szoftver tadsval azonban legtbbszr nem fejezdik be a szoftver
gondozsa, hiszen a felhasznl leginkbb a szoftver les hasznlata kzben veszi szre a
szoftverben rejl hibkat, knyelmetlensgeket, s termszetesen jabb tletekkel is elllhat:
ahogy mondani szoktk: evs kzben jn meg az tvgy. A tovbbi trdsnek teht ktfle
oka lehet:
A szoftver hibs: Egy szoftver hibs, ha az szemantikai (tartalmi) hibkat tartalmaz,
vagyis
nem a megllapods szerint mkdik;
nem logikusan mkdik;
a futs alatti hiba kvetkeztben a program egyszeren hasznlhatatlann vlik.
Vannak alattomos, rejtett hibk , a szmtstechnika zsargonjval kifejezve bugok
(bogr), ezek ltalban a programoz figyelmetlensgbl erednek. A hibkat term-
szetesen a szoftverfejleszt a szerzdsben foglaltak szerint kteles garancilisan
kijavtani.
A szoftvert tovbb kell fejleszteni: Ha a felhasznl az eredeti megllapodshoz
kpest j vagy ms funkcikat szeretne bepttetni a szoftverbe, akkor nyilvnvalan j
szerzds szksges. Ilyenkor a szoftver tovbbfejlesztsrl beszlnk, s a szoftver-
fejleszts egy jabb ciklusa kezddik.

A ksz verzi tadsa A ksz verzi tadsa

Fejlesztsi ciklus Fejlesztsi ciklus ...

Id

3.1. bra. A szoftver lete


46 I. RSZ. BEVEZETS A PROGRAMOZSBA

Egy vglegesen tadott (eladott) szoftver javtott, illetve tovbbfejlesztett vltozatait verzi-
szmmal szoks elltni. Kisebb javtsok esetn a verziszm csak egy tizeddel vagy szzaddal
nvekszik, nagyobb vltoztatsok esetn a verziszm egsz rsze vltozik. Erre vonatkozlag
ltalnos szably nincsen, a fejlesztk, illetve a gyrtk a verziszmot sajt beltsuk szerint
adjk meg. A JDK (Java Development Kit, Java fejlesztkszlet) verziszmai pldul az 1.0,
1.1, ... 1.1.8, 1.2, ..., 1.3 stb. Nagy vltoztats esetn j nv megadsa sincs kizrva.

Aktorok, hasznlati esetek


Aktornak nevezzk a felhasznlt (a rendszert hasznl embert), vagy brmilyen ms, a rend-
szerhez csatlakoz kls egysget, trgyat (pldul mreszkzt vagy modemet). A rendszert
az aktorok hasznljk. A hasznlatnak egy rtelmes, kerek egysgt hasznlati esetnek (use
case) nevezzk. Az egyes hasznlati eseteknek lehetnek elfelttelei. Pldul:
Egy szvegszerkeszt program aktora brki, aki szveget szerkeszt. A program jelleg-
zetes hasznlati esetei:
az aktor betlt egy ltala kivlasztott szveget. Elfelttel, hogy a szveg ltezzk,
vagyis betlthet legyen.
az aktor kinyomtat egy szveget. Elfelttel, hogy legyen betltve egy szveg.
Egy vllalatirnytsi rendszernek aktora tbbek kztt a knyvel vagy az igazgat. A
knyvel knyvel. Az igazgat egszen ms dolgokra hasznlja a rendszert: olyan
informcikat kr a rendszertl, amelyek az tlagdolgoz szmra elrhetetlenek; ilyen
lehet pldul egy fizetsi lista.
Az Egysgestett Eljrsban a hasznlati esetek vgigksrik a rendszert: a fejleszts elejn
sszegyjttt hasznlati esetek alapjn trtnik a teljes rendszer fejlesztse, s ugyanezek a
hasznlati esetek szolgltatjk a ksz rendszer kiprblsnak, tesztelsnek az alapjt is.

A szoftver architektrja
A szoftver, illetve a rendszer architektrjnak nevezzk a rendszer szerkezeti vzt s fbb
jellemzit, amelyek meghatrozzk a rendszer lnyegt. Az architektra rszei a rendszer f
moduljai, a modulok kztti kapcsolatok, valamint a szoftver mkdsnek s fizikai megva-
lstsnak alapkoncepcii, mint pldul a hardver- s szoftverkrnyezet megvlasztsa, a
hlzati kipts stb. A szoftverfejleszts sorn az egyik legels trekvs a rendszer architekt-
rjnak kialaktsa.

A fejlesztsi ciklus munkafzisai


Egy szoftverfejlesztsi ciklus alapveten ngy, idben egymst kvet munkafzisbl ll (3.2.
bra):
Felmrs (inception): A projekt indtsa: a feladat elkezdse, elkpzelse. Nagy vona-
lakban meg kell hatrozni a feladat nagysgt, f funkciit, s a szoftver elksztshez
3. A szoftver fejlesztse 3.2. Az Egysgestett Eljrs 47

szksges erforrsignyeket (pnz, ember, tuds, szmtgp, szoftver stb.). Ebben a


kezdeti fzisban elssorban azt kell elhatrozni, hogy legyen-e projekt.
Kidolgozs (elaboration): Ebben a fzisban lnyegben kialaktjuk a rendszer archi-
tektrjt, s elksztjk a rendszer tervt. Megtervezzk a rendszerben szerepl modu-
lokat s a modulok kzti egyttmkdseket. Eldntjk, hogy a leend szoftver milyen
fizikai egysgekre bomlik, s azokat milyen hardver egysgekre teleptjk majd.
Konstrukci (construction): Az elz fzisokban elksztett tervek alapjn ekkor
kvetkezik a rendszer ptsnek lnyegi rsze. Br a fzisba jcskn tnylik a terve-
zs is, itt fleg implementcis (kdolsi) munka folyik. A fzis vgre elkszl egy
fut program, a rendszer bta verzija.
tads (transition): Ebben a fzisban a fejlesztk fokozatosan tadjk a rendszert a fel-
hasznlnak, s szksg esetn betantjk a rendszer hasznlatra. A felhasznl elkezdi
hasznlni a rendszert, s kzben jelzi a hibkat s a tovbbi ignyeket. A fejleszt a
hibkat kijavtja, s megllapods szerint kielgti azokat a kisebb ignyeket, amelyek
nem bortjk fel a rendszer architektrjt.

3.2. bra. A fejlesztsi ciklus munkafzisai, itercii s munkafolyamatai


48 I. RSZ. BEVEZETS A PROGRAMOZSBA

Egy iterci fbb munkafolyamatai


A fejlesztsi ciklus munkafzisai kisebb rszfeladatokbl llnak (egy ilyen rszfeladat lehet
pldul a szoftver ltalnos klalakjnak megtervezse). A szoftver fejlesztse iteratv tev-
kenysg, amelynek sorn a rszfeladatok megoldsval egyre kzelebb kerlnk a teljes meg-
oldshoz. Egy rszfeladat megoldsi folyamatt itercinak nevezzk. Egy iterciban a
kvetkez munkafolyamatokon kell vgigmenni (3.2. bra):
Kvetelmnyfeltrs: A problma feltrsa, a feladattal szemben tmasztott alapkve-
telmnyek megfogalmazsa. A kvetelmnyfeltrs eredmnye a feladatspecifikci.
Szmos esetben a programoz ksz feladatspecifikcit kap ekkor a feladat megfo-
galmazja vgezte el a kvetelmnyfeltrst (pldul a tanr, aki kiadja a hallgatnak a
feladatot). Sok esetben a kvetelmnyfeltrs ignyli a legnagyobb szakmai gyakorlatot.
Analzis: A megoldhatsg feltrkpezse, elemzse, a feladat pontostsa, irnyvona-
lak, nagyvonal tervek megadsa. Megoldsi eszkzk, mdszerek kivlasztsa.
Tervezs: A megolds elvi megadsa, krvonalazsa. Egy olyan elkpzels dokumen-
tlsa, mely mr egyrtelmen kdolhat egy szmtgpes nyelv segtsgvel.
Implementls: A forrskd ellltsa.
Tesztels: A fut szoftver (programkd) kiprblsa tudatosan sszelltott tesztadatok-
kal.

A teljes fejleszts sorn kptelensg a klnbz munkafolyamatokat idben elhatrolni. Nem


tehetjk meg, hogy elszr minden kvetelmnyt feltrunk, majd a pontos feladatspecifikci
alapjn analizlunk, majd terveznk, kdolunk, s vgl a teljes rendszert teszteljk. Elfor-
dulhat pldul, hogy a felmrs sorn programfejleszt eszkzket kell kiprblnunk, kdols-
sal meg kell gyzdnnk arrl, hogy bizonyos feladatok megoldhatk-e egy adott szoftver
segtsgvel. Sok esetben mkd prototpusokat kell ksztennk, hogy a felhasznl el tudja
kpzelni a leend szoftvert. A prototpusok a tovbbi megbeszlsek alapjt is kpezhetik.
A munkafolyamatok rszfeladatonknt rtendk, s a rszfeladat jellegtl fggen ms-ms
munkafolyamatok dominlhatnak. Ahogy az a 3.2. brn lthat dombocskkbl kiderl, a
felmrs sorn elssorban kvetelmnyeket trunk fel, de mr egy pici kdols s tesztels is
jelen van. A kidolgozsi fzisban az analzis jtszik dnt szerepet, de lnyegben mindegyik
munkafolyamat megtallhat. Elvileg teht minden fzisban mindent csinlhatunk, de
a felmrsi szakaszban fleg kvetelmnyeket trunk fel;
a kidolgozsi fzisban fleg analizlunk s terveznk;
a konstrukcis fzisban fleg implementlunk;
az tadsi fzisban pedig fleg tesztelnk.
3. A szoftver fejlesztse 3.2. Az Egysgestett Eljrs 49

Az Egysgestett Eljrs fbb jellemzi

Az Egysgestett Eljrs fbb jellemzi a kvetkezk:


Hasznlatieset-vezrelt: A rendszer fejlesztsnek elejn meghatrozott hasznlati
esetek vgigksrik a teljes fejlesztst.
Architektrakzpont: A teljes fejlesztst meghatrozza a rendszer architektrja.
Iteratv s inkrementlis: A rendszert iteratv mdon fejlesztjk. Minden egyes rsz-
munka (iterci) esetn kvetelmnyeket trunk fel, analizlunk, terveznk, implemen-
tlunk s tesztelnk. Minden egyes iterci sorn a rendszer nvekszik, illetve logikai-
lag tisztul.

Megjegyzs: Az Egysgestett Eljrsnak tovbbi munkafolyamatai is lehetnek, pldul:


zleti modellezs, menedzsment jelleg munkafolyamatok stb. Kisebb munka esetn a
kvetelmnyfeltrs s az analzis egybemosdhat.

Kis szoftver (program) fejlesztse


Egy kisebb feladat megoldshoz sokszor elegend egyetlen iterci:
Feltrjuk a kvetelmnyeket, ennek sorn elksztjk a feladatspecifikcit;
Ha a megolds nem evidens, akkor analizljuk a feladatot;
Megtervezzk a feladatot (egsz pici program esetn fejben is lehet);
Implementlunk, vagyis lekdoljuk a tervet (a forrskdba megjegyzseket tesznk);
Teszteljk a fut programot.

Egy iterci hiba nlkl trtn vgigvezetshez nagy tapasztalatra van szksg. Termszetes,
hogy a programoz a kdols kzben nha visszanyl tervhez, s kijavtja az esetleges hib-
kat. Az is elfordulhat, hogy tesztels kzben derl ki, hogy nem trtunk fel minden kvetel-
mnyt. Nagyon fontos, hogy minden egyes munkafzis dokumentlva legyen, hogy adott eset-
ben knnyen javthassuk, illetve tovbbfejleszthessk a programot.
Knyvnkben mi kizrlag kis szoftvereket fogunk fejleszteni. A fbb munkafolyamatokat a
kvetkez pontokban egyenknt, rszletesebben trgyaljuk.

Szoftverfejleszts: A szoftver elksztsnek folyamata a felmerl tlettl a ksz, elad-


hat termk tadsig.
Szoftverfejleszt: Aki elkszti a szoftvert.
Felhasznl: A szoftvert hasznl szemly.
Aktor: Aki vagy ami a szoftvert hasznlja. Felhasznl, vagy egy rendszerhez csatlakoz
hardveregysg.
50 I. RSZ. BEVEZETS A PROGRAMOZSBA

Hasznlati eset: A hasznlatnak egy rtelmes, kerek egysge.


A szoftver lete, fejlesztsi ciklus, szoftververzi: A szoftver lete fejlesztsi ciklusokbl
ll. Egy fejlesztsi ciklus vgn tadnak egy verzit. Az tads utn jabb fejlesztsi ciklus
kvetkezhet.
Munkafzis: Egy fejlesztsi ciklus idben jl elhatrolhat szakasza. A ciklus ngy, egy-
mst kvet munkafzisbl ll: felmrs, kidolgozs, konstrukci s tads.
Munkafolyamat: Egy rszfeladat megoldst clz munka. Alapvet munkafolyamatok:
kvetelmnyfeltrs, analzis, tervezs, kdols s tesztels.
Iterci: A szoftverfejleszts rszfeladatok megoldsainak itercija. Egy rszfeladat fej-
lesztse munkafolyamatokon megy keresztl.

3.3. Kvetelmnyfeltrs
Amikor felmerl egy problma, sokszor nem is tudjuk pontosan, mi a feladat, azt pedig kl-
nsen nem tudjuk, hogy elvgzse mennyi munkval fog jrni, s egyltaln meg tudjuk-e
oldani. A munkt azzal kezdjk, hogy sszegyjtjk, feltrjuk a feladattal kapcsolatos kve-
telmnyeket, vagyis megfogalmazzuk azokat a fontos dolgokat, amelyeket mindenkppen meg
akarunk valstani. Ebben a munkafolyamatban egytt kell mkdni a szoftver megrendelj-
vel, azzal a szakemberrel, aki a szoftvert hasznlni fogja majd. A kvetelmnyek gyjtemnyt
kvetelmnyspecifikcinak vagy feladatspecifikcinak nevezzk. Egy j feladatspecifikci
teljes, rthet, egyrtelm, pontos, tmr, szemlletes, elrelt, jl felptett s tagolt.

Kvetelmnyfeltrs: A feladattal szemben tmasztott kvetelmnyek sszegyjtse. A


kvetelmnyfeltrs dokumentcija a kvetelmnyspecifikci (feladatspecifikci),
mely egyrtelmen lerja a feladattal szemben tmasztott kvetelmnyeket.

3.4. Analzis
Az analzis sorn meg kell vizsglnunk, hogy a feladat megoldhat-e, meg kell becslnnk a
feladat nagysgt, a szksges erforrsokat (pnz, ember, id, hardver, szoftver stb.). A meg-
oldshoz irnyvonalakat kell kijellni, eszkzket, mdszereket kell vlasztani. A szoftver
megrendeljvel, hasznljval ebben a munkafzisban is egytt kell mkdni. Az analzis
sorn ksztnk egy nagyvonal megoldsi tervet, egy n. szakterleti objektummodellt
(adatfeldolgozsi feladat esetn ez lnyegben egy adatmodell), melyet a szmtgphez nem
rt szakember is rt lehetsg szerint kerljk a szmtgppel kapcsolatos szakkifejezse-
ket. Ebben a munkafolyamatban ssze kell gyjteni a fontosabb hasznlati eseteket, vagyis el
3. A szoftver fejlesztse 3.5. Tervezs 51

kell dnteni, mire akarjuk hasznlni ezt a programot vagy programrszt (modult). Minden
egyes hasznlati esetnl t kell gondolni, milyen adatokat vr a program, s milyen adatokat
kell produklnia. Csak gy vlhat vilgoss, rthetv a feladat.
Az analzis dokumentcija a szakterleti modell s a hasznlati esetek.

Analzis: A megoldhatsg s az erforrsigny feltrkpezse; a feladat elemzse, ponto-


stsa; irnyvonalak, nagyvonal tervek megadsa; megoldsi eszkzk, mdszerek kiv-
lasztsa. Az analzis dokumentcija a szakterleti objektummodell s a hasznlati
esetek.

3.5. Tervezs
A programtervezs feladata, hogy az analzis sorn kialaktott elkpzelseket tovbbfejlesztve,
az ott flvzolt tervet rszletesen kidolgozza. A szakterleti modellbl programterv lesz, amely
mr tartalmaz szmtgppel kapcsolatos elemeket is, s amelyet mr csak a tapasztalattal ren-
delkez szoftverfejleszt kpes tltni. A tervezsi szakasz dokumentcija a programterv. A
programtervet ltalban valamilyen grafikus jellsrendszer alkalmazsval ksztjk el. Mi az
UML diagramjait (osztlydiagramot, egyttmkdsi diagramot) fogjuk alkalmazni egyszer
programjaink megtervezshez. Egy j programterv alapjn egyrtelmen el lehet kszteni a
forrskdot.
A program megtervezsvel a problma lnyegileg meg van oldva. Nagyon fontos, hogy a terv
minl tkletesebb legyen, mert a hibk javtsa a ksbbi munkk sorn egyre drgbb.

Tervezs: A feladat lnyegi megoldsa, egy olyan dokumentci ellltsa, amelynek


alapjn a forrskd mr elkszthet. A tervezsi szakasz dokumentcija a programterv.

3.6. Implementls (kdols)


Ha a terv elkszlt, akkor jhet annak implementlsa (kivitelezse). Az implementci a
programterv kdolsa egy adott programnyelven, vagyis a forrsprogram elksztse. Ez a
szakasz egy rutinos programoz szmra elgg mechanikus, hiszen az elz szakaszokban a
feladat logikai megoldsa elkszlt. A programnyelv, amelyen kdolunk, sokfle lehet mi
ebben a knyvben a Javt fogjuk hasznlni. A szmtgpes program megrshoz jl kell
ismerni az adott programnyelvet, hiszen most csak olyan instrukcikat adhatunk, amelyeket a
fordt ismer. A kdolsi szakasz dokumentcija a megjegyzsekkel elltott forrsprogram.
Egy forrsprogram akkor j, ha az
pontosan a feladatspecifikci, illetve a programterv alapjn kszl;
ttekinthet, olvashat;
52 I. RSZ. BEVEZETS A PROGRAMOZSBA

tmr s egyrtelm megjegyzsekkel van megtzdelve;


nem tartalmaz sem formai (szintaktikai), sem logikai (szemantikai) hibt.

Kdols: Forrskd (forrsprogram) elksztse a programterv alapjn.

3.7. Tesztels
A forrsprogram begpelsvel termszetesen mg nem vagyunk kszen, hiszen brmilyen
gondosan terveztnk, s brmilyen jl gpeltnk is, a kd mg tele lehet hibkkal. A tesztels a
program tudatos ellenrzse, figyelse hibakeress cljbl.
A forrskdban ktfle hiba lehetsges:
Szintaktikai (formai) hiba: A forrskd rsze, melyet a fordtprogram nem tud rtel-
mezni. Ez lehet elgpelstl, vagy fakadhat abbl, hogy nem ismerjk elgg a prog-
ramnyelvet.
Szemantikai (logikai, tartalmi) hiba: A program nem logikusan vagy nem a lers
szerint mkdik, vagy egyszeren hasznlhatatlann vlik.
A szintaktikai hibkat a fordtprogram segtsgvel szrjk ki. A szemantikai hiba sokkal
kellemetlenebb, mert ekkor a problma mlyen gykerezhet az is elkpzelhet, hogy a hibt a
problma analizlsnak fzistl kezdve hurcoljuk, ez azonban csak felletes munka esetn
kvetkezik be. Termszetesen minl alaposabbak voltak az elz fzisok, annl nagyobb a
valsznsge, hogy a programrsz elbb vagy utbb gy fog mkdni, ahogyan szeretnnk.
A program tesztelsnek kln tudomnya van nem is egyszer dolog elre feltrni a majd
bekvetkezhet szlssges eseteket, s kezelni ket. A tesztels folyamn klnbz prba-
adatokkal futtatjuk a programot. A tesztadatokat gy kell sszelltani, hogy azok minden
lehetsges esetet lefedjenek
Egy programot szrazon is lehet tesztelni: ilyenkor a forrskdot bngszve az elkpzelt
krnyezetben s adatokkal fejben futtatjuk a programot. Az ilyen tesztet szraztesztnek
nevezzk. Ugyangy ajnlatos a programtervet s ms dokumentcikat is tesztelni, mieltt
azokat ksznek nyilvntjuk.
A program tesztelsekor a kvetkezkre kell figyelni:
Pontosan gy mkdik a program, ahogy az a feladat lersban szerepel?
Nem lehet elrontani?
Elg hatkony?
Biztonsgos a hasznlata?
Felhasznlbart? (Teljes mrtkben szolglja a program a felhasznlt? Szp a prog-
ram? Sehol sem idegest?)
3. A szoftver fejlesztse 3.8. Dokumentls 53

A tesztelsi fzis dokumentcija a ksz program s a tesztadatok.

Tesztels: A program mkdsnek ellenrzse tudatosan sszelltott tesztadatokkal.


Szintaktikai hiba: Forrskdrszlet, melyet a fordt nem tud rtelmezni.
Szemantikai hiba: A program nem logikusan vagy nem a lers szerint mkdik.
Szrazteszt: A program mkdsnek ellenrzse fejben, a program futsa nlkl.

3.8. Dokumentls
Ahogy az egyes munkafolyamatok lersban lthattuk, minden munkafolyamatnak megvan a
maga termke, dokumentcija. Nagyobb szoftverfejlesztsi munkk esetn az egyes munka-
fzisok vgn ksztenek egy sszefoglal, tbb modellbl ll dokumentcit. A dokument-
cit meg kell rizni, mert csak annak birtokban lehet ksbb a programon vltoztatni.
Lnyegben ktfle dokumentcirl szoks beszlni:
Fejleszti dokumentci: A program fejlesztst vgigksr s a megoldst definil
dokumentcik sszessgt fejleszti dokumentcinak nevezzk.
A fejleszti dokumentci rszei:
Analzismodell (feladatspecifikci, szakterleti modell, hasznlati esetek)
Tervezsi modell (programterv, kpernytervek, listatervek)
Implementcis modell (forrsprogram)
Teleptsi modell (megmondja, hogy milyen programot milyen gpre teleptnk)
Tesztelsi modell (tesztadatok, teszteredmnyek)
Teleptsi s tesztelsi modellt ltalban csak nagyobb szoftverek esetn adnak meg.
Felhasznli dokumentci: A ksz rendszerhez tartozik mg egy dokumentci,
melyet a felhasznl kap meg, s amely a program hasznlatval kapcsolatos tudnival-
kat tartalmazza. A felhasznli dokumentci rszei:
A feladat lersa (kiknek a rszre, milyen clbl kszlt a program, a hasznlati
esetek megadsa)
Szksges hardver- s szoftverkrnyezet (a szmtgp tpusa, a minimlisan szk-
sges konfigurci; az opercis rendszer, a futtatshoz szksges kiegszt szoft-
verek)
A program betltse, indtsa
A program ltalnos hasznlatnak lersa: billentyk hasznlata, mkdsi lers
minden rszletre kitren, a segtsgkrs lehetsgei
A program menfunkciinak rszletes lersa
Kpernykpek, listakpek
54 I. RSZ. BEVEZETS A PROGRAMOZSBA

Hibazenetek felsorolsa, tmutats, teendk


Biztonsgi elrsok (pl. adatok idszakos mentse)

Dokumentls: A szoftver fejlesztsnek, illetve mkdsnek lersa megrzsi s


megrtsi clbl.
- Fejleszti dokumentci: A fejlesztknek szl dokumentci, mely az egyes fejlesz-
tsi szakaszok eredmnyeit rgzti.
- Felhasznli dokumentci: A felhasznlknak szl dokumentci, mely tmutatst
ad a szoftver hasznlatra.

Tesztkrdsek

3.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) Az UML szoftverfejlesztsi mdszertan.
b) Az Egysgestett Eljrs szoftverfejlesztsi mdszertan.
c) Egy fejlesztsi ciklus alatt a szoftvernek tbb verzijt is tadjk.
d) A fejlesztsi ciklus munkafzisai: felmrs, kidolgozs, konstrukci s tads
3.2. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Egy iterci munkafolyamatai: kvetelmnyfeltrs, analzis, tervezs, kdols s
tesztels.
b) A szoftver architektrja a programterv.
c) A szoftverfejleszts kezdeti fzisa a felmrs.
d) Az aktor az, aki teszteli a programot.
3.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A hasznlati eset a program hasznlatnak egy rtelmes egysge.
b) Egy iterci tbb munkafzisbl ll.
c) Egy munkafzis tbb itercibl ll.
d) A felmrsi fzisban tbb analzis van, mint tervezs.
3.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A hasznlatieset-vezrelt kifejezs azt jelenti, hogy a hasznlati esetek vgigks-
rik a szoftver fejlesztst.
b) A szemantikai hiba a fordtprogram ltal kiszrhet hiba.
c) A szakterleti modell a kvetelmnyfeltrs munkafolyamat dokumentcija.
d) A tesztels a program mkdsnek ellenrzse hibakeress cljbl.
3.5. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az implementls dokumentcija a programterv.
b) A forrskdot a programterv alapjn kell ellltani.
c) A szoftver elksztse utn a fejleszti dokumentcit meg kell rizni.
d) A fejleszti dokumentcik az egyes fejlesztsi szakaszok eredmnyeinek lersai.
56 II. RSZ. OBJEKTUMORIENTLT PARADIGMA
4. Mitl objektumorientlt egy program? 4.1. A vals vilg modellezse 57

4. Mitl objektumorientlt egy program?

A fejezet pontjai:
1. A vals vilg modellezse
2. Az objektumorientlt program fbb jellemzi

Az objektumorientlt mdszertanok amennyire lehet megprbljk becsempszni a term-


szetes emberi gondolkods szablyait a szoftverkszts menetbe. A kvetkez fejezet elszr
ttekintst ad arrl, milyen gondolatok vezrlik az embert a vals vilg modellezsekor, majd
egy, az letbl mertett plda segtsgvel megprblja rzkeltetni az objektumorientlt rend-
szer fbb jellemzit.

4.1. A vals vilg modellezse


Az objektumorientlt gondolkodsmd nagyon hasonlt a termszetes emberi gondolkodshoz.
Ahhoz, hogy ezt belthassuk, vizsgljuk meg az emberi gondolkods alapvet jellemzit. Az
ember a krltte lv trgyakat (objektumokat) szreveszi, leegyszersti, megklnbzteti s
rendszerezi gy tudja ezt a vgtelenl bonyolult vilgot a maga szmra tbb-kevsb rthe-
tv tenni. Az embert a vals vilg modellezsekor a kvetkez gondolatok vezrlik:
Absztrakci
A vals vilg vgtelen s bonyolult. Minl mlyebbre hatolunk az elemzsben, annl
bonyolultabb. A lebontsban teht valahol meg kell llnunk, illetve szelektlnunk kell.
Az absztrakci a vals vilg leegyszerstse a lnyegre koncentrls rdekben.
Az egyes objektumoknak csak azon tulajdonsgait s viselkedsmdjt vesszk figye-
lembe, melyek clunk elrse rdekben felttlenl szksgesek. Egy embernek pldul
mrhetetlen sok tulajdonsga van, s rengeteg dologra kpes mgis, amikor az utcn
megltunk egy embert, adott esetben csak arra figyelnk, hol tartzkodik, s hogy ppen
mozog-e. Taln esznkbe sem jut, hogy milyen a szeme szne s mi van a zsebben.
Megklnbztets
Rengeteg objektum van krlttnk, s ezek mind-mind kln ltez, konkrt, egyedi
objektumok. Az objektumokat a szmunkra lnyeges tulajdonsgok alapjn meg-
58 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

klnbztetjk (magas ember alacsony ember; piros labda kk labda; az n piros


labdm a te piros labdd). Elfordulhat persze, hogy kt objektum kztt kptelenek
vagyunk klnbsget tenni pldul kt hangya kztt, de ez csak a mi gyengesgnk,
attl mg a hangyk nem ugyanazok.
Osztlyozs
Az ember az objektumokat automatikusan rendszerezi, s azokat a szmra fontos
tulajdonsgok alapjn kategrikba, osztlyokba sorolja: Ez az objektum ugyano-
lyan, mint az, teht ugyanahhoz az osztlyhoz tartozik. (Lsd 4.1. bra.) Az egy
osztlyba sorolhat objektumokat az osztly pldnyainak szoks nevezni:
Dorka s Csonti kutya Dorka s Csonti a Kutya osztly pldnyai;
Ricsi s Ropi papagj Ricsi s Ropi a Papagj osztly pldnyai.
ltalnosts, specializls
Az ember az objektumok kztt llandan keresi a hasonlatossgokat s klnbzs-
geket, ezek alapjn bvebb, illetve szkebb kategrikat llt fel (lsd 4.1. bra):
Ez az objektum olyan, mint az, de r ez is jellemz ... ,
Ez az objektum egy ..., de ... ,
A kutya hzillat, de olyan, amelynek ngy lba van.,
Az oroszln vadllat, de van srnye, s nagyon aranyos.
A kutya, a papagj s az oroszln mind llat.
Elza llat.

ltalnosts
llat Bvebb kategria
Osztly

Dorka Hzillat Vadllat

Csonti Specializls
Kutya Papagj Oroszln
Szkebb kategria

Leo
Ropi Elza
Ricsi
Pldny

4.1. bra. Objektumok osztlyba sorolsa


4. Mitl objektumorientlt egy program? 4.2. Az objektumorientlt program fbb jellemzi 59

Kapcsolatok felptse, rszekre bonts


Az ember az objektumok kztt llandan keresi a kapcsolatokat:
A stemny alkotelemei a kvetkezk: 50 dkg liszt, 10 tojs ...
Jancsi s Juliska ismeri egymst.
A kutynak van feje, teste, ngy lba s egy farka.
A kutya rzi a hzat.
Alapveten kt fajta kapcsolat ltezik:
ismeretsgi, ms nven hasznlati kapcsolat;
tartalmazsi, ms nven egszrsz kapcsolat.
Ismeretsgi kapcsolat akkor ll fenn kt objektum kztt, ha azok egymstl fg-
getlenl is ltezhetnek, vagyis egyik lte sem fgg a msiktl. Ilyen a kutya s a hz,
hiszen ha a kutya elpusztul, attl mg a hz megmarad, legfeljebb nem rzi azt senki.
Ha pedig a hz pusztul el, akkor a kutya egy j hzat fog rizni.
Egszrsz kapcsolatrl akkor beszlnk, ha az egyik objektum hatrozottan rsze
a msiknak, mgpedig gy, hogy ha az egsz objektum elpusztul, akkor pusztul vele a
rsz is. Ilyen a kutya s annak ngy lba.
A kapcsolat jellegnek megllaptsa termszetesen nem minden esetben egyszer.
Milyen kapcsolatban van pldul az aut s a kereke? A roncstelepre szlltott aut
kerekt, ha kell, nyugodtan tszerelhetjk egy j autra.
Az objektumorientlt paradigma az emberi gondolkodst igyekszik utnozni; errl az Olvas
maga is meggyzdhet, hiszen e paradigma trgyalsakor ugyanezekkel a fogalmakkal fog
majd tallkozni.

4.2. Az objektumorientlt program fbb jellemzi


Ahhoz, hogy egy program objektumorientlt legyen, nem elg az OO nyelv,
OO szellem is szksges!
Egy objektumorientlt (OO) program egymssal kommunikl objektumok sszessge, mely-
ben minden objektumnak megvan a jl meghatrozott feladatkre (4.2. bra). Egy objektum
szolgltatsokat ad, mgpedig olyan szolgltatsokat, amelyekre t beprogramoztk. A kper-
nyn lev ablak objektumot pldul beprogramoztk arra, hogy menjen odbb valamekkora
tvolsggal ezrt, ha ezt a szolgltatst krjk tle, megteszi. Ahhoz, hogy egy objektum
vgrehajthassa feladatt, bizonyos adatokat meg kell jegyeznie. Ezek az adatok legtbbszr az
objektum privt adatai, azokat a szolgltatst kr objektum nem ismeri. Egy embernek is
mondhatjuk, hogy menjen arrbb egy mterrel anlkl, hogy tudnnk, hol van. A szolgltatst
krnek csak tudnia kell, mire lehet egy objektumot megkrni, valamint meg kell tudni
szltania az objektumot. A feladat vgrehajtsnak hogyan-ja az objektum belgye. Minden
objektumnak van egy interfsz rsze, amelyen keresztl kommuniklni lehet vele. Ha az ember
szbl rt, akkor az ember interfsznek rsze a fl, s ha az ember be van programozva a
60 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

megy szolgltatsra, akkor az ember gy mozgatja a lbait, ahogy azt beltplltk, ebbe a
szolgltatst kr mr nem avatkozhat bele.

zenet3
fut vezrl objektum3
objektum

zenet1
zenet2
objektum1 objektum2

zenet1

4.2. bra. Objektumorientlt rendszer

Egy OO rendszer tervezsekor a feladatspecifikci alapjn meg kell hatrozni a rendszerben


szerepl objektumokat, s az objektumok kztt szt kell osztani a feladatokat. A program
ltalban egy kivlasztott (vezrl) objektum megszltsval indul, ez az objektum felels
az egsz program vgrehajtsrt (a 4.2. brn a fut zenettel indul a program). Egy objektum
aztn megkrhet ms objektumokat bizonyos rszfeladatok elvgzsre ilyenkor az objektum
deleglja feladatnak, illetve felelssgnek egy rszt. A rendszerben minden objektumnak
megvan a jl meghatrozott feladatkre. Egy objektum felels feladatnak elvgzsrt, akkor
is, ha bizonyos feladatokat mssal csinltat meg. A 4.2. brn a szrke tglalapok az objek-
tumokat, a nyilak a krelmeket jellik. A krelmet zenetnek is szoks nevezni (st, ez az elter-
jedtebb neve): az egyik objektum zen a msiknak, hogy vgezze el a megadott feladatot.

Objektum: Az objektum informcit trol, s krsre feladatokat hajt vgre. Az objektum


felels feladatainak korrekt elvgzsrt. Az objektum logikailag sszetartoz adatok s
rajtuk dolgoz algoritmusok (rutin, metdus, programkd) sszessge.
Objektumorientlt program: Egy objektumorientlt program egymssal kommunikl
objektumok sszessge, melyben minden objektumnak megvan a jl meghatrozott fela-
datkre (felelssgi kre).

Kszl a hsleves
Nhny objektumorientlt fogalom elzetes megvilgtsra most vegynk az letbl egy pl-
dt (4.3. bra). Adva van egy csald: Laci, Erzsbet, s kt fzni tud lenygyermek: Zsfi s
Kati. Lacinak ma ebdre hslevest kell ksztenie, megkrte erre a nagymama:
laci.elkszt(hsleves)
4. Mitl objektumorientlt egy program? 4.2. Az objektumorientlt program fbb jellemzi 61

zenetkldskor a megszltott objektum s az zenet neve kz pontot tesznk. Az zenetnek


lehetnek paramterei. Az zenet nem ms, mint egy az objektumba beprogramozott rutin (elj-
rs vagy fggvny) hvsa. Az OO paradigmban a rutint metdusnak nevezzk.
Egy objektum csak akkor kldhet zenetet egy msik objektumnak, ha azzal kapcsolatban ll,
vagyis ismeri vagy tartalmazza az zenetet fogad objektumot. Pldnkban Laci ismeri a
hrom hlgyet, a hlgyek pedig ismerik a boltokat (a hlgyeknek nem kell ismernik Lacit, s
lehet, hogy Laci nem is tudja, mi az a bolt).

Megjegyzsek:
- Az objektum nevt megllapods szerint kis kezdbetvel rjuk, a nv tagolshoz mr
hasznlhatk nagybetk is.
- A plda egy rgimdi csaldkpet sugall. Krem az Olvast, tekintsen el most ettl. A
szerzt semmilyen ironikus gondolat nem vezette, a plda egyszeren gy sikerlt.

nyitva?
van(...)? hsBolt1
elad(...)
vanKedv? zsfi hsBolt2
elkszt(hsleves)

elkszt (hsleves) zldsgBolt1


laci kati

zldsgBolt2
elkszt(hsleves)
erzsbet zldsgBolt3

4.3. bra. Kszl a hsleves

Pldnkban a megszltott objektum a laci, az zenet az elkszt, melynek van egy para-
mtere, a hsleves. Az elkszt zenetre Laci csak akkor reagl, ha az elkszt algorit-
mus bel van programozva. Laciba szerencsre ez a rutin be van programozva, de gy, hogy a
feladatot tovbbadja (deleglja): sorban megkrdezi csaldja hrom hlgytagjt, van-e kedvk
hslevest kszteni. Aki elszr vlaszol igennel, az fogja elkszteni a hslevest. Ha Zsfi s
Kati egyarnt nemmel vlaszolnak, akkor Erzsbet kszti el, hsleves teht mindenkppen
lesz. Laci elkszt rutinja a kvetkezkppen fest:
62 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

elkszt(hsleves)
if zsfi.vanKedv()
zsfi.elkszt(hsleves)
else if kati.vanKedv()
kati.elkszt(hsleves)
else
erzsbet.elkszt(hsleves)
end if
end elkszt

Az elkszt zenetre Zsfi mskppen reagl, mint Laci. Hogy egyltaln reagl-e, azt Laci-
nak tudnia kell, mert egybknt a program kudarcra van tlve. Ez az letben csak annyit
jelentene, hogy nincs hsleves, de egy programban a sket flek fordtsi vagy futsi hibt
eredmnyeznek (a Javban ez fordtsi hiba). A zsfi.vanKedv szintn krelem, s nem ms,
mint a megszltott objektum pillanatnyi llapotnak lekrdezse.

zenet (krelem): Az objektumokat zeneteken keresztl krjk meg klnbz feladatok


elvgzsre. Az zenet nem ms, mint egy az objektumba beprogramozott rutin hvsa.
Egy objektum csak akkor kldhet zenetet egy msik objektumnak, ha azzal kapcsolatban
ll, vagyis ismeri vagy tartalmazza ezt a msik objektumot.

Az ebd elksztse a hlgyek esetn hrom rszfeladatbl ll:


elkszt(hsleves)
vsrol(...)
fz()
mosogat()
end elkszt

Tegyk fel, hogy a rszfeladatok kzl a fzshez s a mosogatshoz nem kell ms objektum-
tl segtsget krni, a vsrlshoz viszont klnbz boltokhoz kell fordulni.
A hlgyek mindent egyformn csinlnak, kivve a fzst. Zsfi tlagosan fz, Erzsbetnek
nagy gyakorlata van, egy kicsit jobban fz, mint az tlag, Kati elszza az telt. A hrom
hlgy kzl valamelyik mindenkppen megkapja a feladatot: tegyk fel, hogy Zsfinak most
nincs kedve, Katinak pedig van (gy aztn ss lesz a hsleves).
Katinak elszr is be kell szereznie a hst s a zldsgeket. A krnyken kt hsbolt s hrom
zldsges tallhat, remljk, ezekben kaphatk a szksges kellkek. Bemegy teht Kati a
hsBolt1 azonostj boltba. Tegyk fel, hogy rgtn kap szp marhahst. Ezutn megnzi
zldsgBolt1-et, de az zrva van, ezrt elmegy zldsgBolt2-be. Ott megkapja a hozz-
valk felt, zldsgBolt3-ban pedig megkapja a mg hinyz dolgokat. A boltokban gy
vsrol (rszletek):
if hsBolt1.nyitva() s hsBolt1.van(marhahs)
hsBolt1.elad(marhahs,1.5 kg)
...
if zldsgBolt3.nyitva() s zldsgBolt3.van(srgarpa)
zldsgBolt3.elad(srgarpa,1 kg)
...
4. Mitl objektumorientlt egy program? 4.2. Az objektumorientlt program fbb jellemzi 63

Vgl hazamegy a hozzvalkkal, fz s mosogat.


A rendszer objektumait s az objektumok kztti zeneteket a 4.3. brn lthat egyttmk-
dsi diagram tnteti fl. Az UML diagram neve azt fejezi ki, hogy a feladat elvgzse rdek-
ben az objektumok egyttmkdnek. Figyeljk meg, hogy a rendszerben minden objektumnak
megvan a jl meghatrozott feladata. Minden objektum felels sajt feladatainak elvgzsrt:
A frfi feladata:
Elkszti a hslevest (a mdszer nem szmt, a lnyeg az, hogy legyen hsleves)
A hlgyek feladatai a kvetkezk:
Megmondja, van-e kedve
Elkszti a hslevest
Vsrol
Fz
Mosogat
Ezek kzl a feladatok kzl a hlgyeket csak kettre krjk meg (vanKedv s elkszt). A
tbbi feladat vsrol, fz, mosogat az elkszt feladat automatikus velejrja, az
objektum belgye.
Egy hsbolt feladatai:
Megmondja, nyitva van-e
Megmondja, van-e hs
Eladja a hst

Egy zldsgbolt feladatai:


Megmondja, nyitva van-e
Megmondja, van-e zldsg
Eladja a zldsget

Felelssg: Minden objektumnak megvan a jl meghatrozott felelssgi kre. Az objek-


tum felels feladatai elvgzsrt.

Az objektumok zrtak; ez azt jelenti, hogy a ms objektumok szmra lnyegtelen informci-


kat elrejtik. Minden objektum a sajt dolgval trdik, s amirt felels, azt az erejhez kpest
a legjobban prblja vgrehajtani. Egyik objektum sem szlhat bele a msik dolgba. Laci nem
szl Katira, hogy ne melegvzben mossa a hst, s Kati sem szl a zldsgesnek, hogy tartsa
tisztn a rekeszeket. Kati csak kr, kap s fizet.

Bezrs, informci elrejtse: A feladatok elvgzsnek hogyan-ja az objektum bel-


gye. Az objektum belseje srthetetlen. Az objektummal csak az interfszen keresztl lehet
kommuniklni.
64 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Az elkszt operci ngy objektumba is be van programozva. Mind a ngyen reaglnak


teht erre az zenetre, csakhogy nem egyformn. Laci egszen mskpp reagl, mint a hrom
hlgy, de a hlgyek sem teljesen egyformn, hiszen a fz operci mindegyikkbe mskpp
van beprogramozva. Az zenetet kldnek nem kell tudnia, hogy mi lesz a megszltott ob-
jektum reakcija, neki csak azt kell tudnia, megkrheti-e t egyltaln az zenetben foglaltak
vgrehajtsra.

Polimorfizmus (tbbalaksg): Ugyanarra a krelemre a klnbz objektumok kln-


bzkppen reaglhatnak.

Prbljuk osztlyokba sorolni a program objektumait (hogy az egyforma objektumokat csak


egyszer kelljen beprogramozni). laci, erzsbet, zsfi s kati mind ember ugyan, de
laci nagyon kilg a sorbl. A feladatok szempontjbl semmi kzs nincs benne s a hrom
hlgyben. A hrom hlgy azonban nagyon hasonlt egymsra, mindegyik tud hslevest ksz-
teni, vsrolni, fzni stb. De nem teljesen egyformk, mert mskpp fznek, ezrt vgl is
mindegyikk ms osztlyhoz tartozik. A 4.4. brn lthat mdon a hslevesksztket ngy
osztlyba soroltuk van egy Frfi osztly s hromfle Hlgy osztly: (tlagos) Hlgy,
Szerelmes Hlgy s GyakorlottHlgy (ellenttben az objektumokkal, az osztlyokat
nagy kezdbetvel rjuk). Mindhrom osztlyhoz elvileg akrhny pldny tartozhat, pldnk-
ban mindegyikbl pontosan egy van. A kt hsbolt ugyanabba az osztlyba sorolhat, hiszen
azok hasonlkppen viselkednek (mindegyik ad hst, ha nyitva van s van hs). A hrom zld-
sgbolt a ZldsgBolt osztlyhoz tartozik. A ktfle bolt kztt az a klnbsg, hogy az
egyik hst tart, illetve szerez be, a msik pedig zldsget (4.5. bra).

Osztlyozs: Az objektumpldnyokat viselkedsk szerint osztlyokba soroljuk.

Az osztlyok egyms al, illetve fl rendelhetk. A szerelmes hlgy s a gyakorlott hlgy


mindent ugyangy csinl, mint az tlagos hlgy, csak a fz operci van mskpp beljk
programozva. A szerelmes hlgy is hlgy, csak elszza az telt. Az rkls teht logikai s
kdolsi knnyebbsg. Amikor a szerelmes hlgyet beprogramozzuk, nem kell mindent ell-
rl megadnunk, hiszen majdnem mindent ugyangy csinl, mint egy tlagos hlgy. A
SzerelmesHlgy rkli a Hlgy sszes tulajdonsgt s viselkedsi normjt, s ilyenkor
nem kell mst csinlni, mint megadni a viselkedsbeli klnbsgeket megadhatunk jabb
viselkedseket, rgieket pedig tdefinilhatunk, illetve letakarhatunk. A szerelmes hlgy a
hlgy egy specializcija: A SzerelmesHlgy is Hlgy.. Azt mondjuk, hogy a Szerelmes-
Hlgy osztlya a Hlgy osztlybl szrmazik. A Hlgy az sosztly, a SzerelmesHlgy
pedig az utd, vagy ms szavakkal: kiterjesztett, leszrmazott vagy szrmaztatott osztly (4.4.
bra). Ahogy az brn is lthat, az sosztly rklsi kapcsolatban ll az utdosztllyal (ezt
res fej nyllal jelljk), az egyes objektumok pedig fggsgi viszonyban llnak a maguk
osztlyval (ezt a szaggatott nyl jelzi).
4. Mitl objektumorientlt egy program? 4.2. Az objektumorientlt program fbb jellemzi 65
Trstsi kapcsolat

Pldnya
Frfi Hlgy
laci (fggsgi kapcsolat)
elkszt(...) vanKedv?
elkszt(...)
vsrol(...) zsfi
fz()
rklsi kapcsolat mosogat()

SzerelmesHlgy GyakorlottHlgy
kati erzsbet
fz() fz()

4.4. bra. A hslevesksztk osztlyai

Bolt
ruk (nv, mennyisg, r)
nyitva?
van(...)?
elad(...)

zldsgBolt1

hsBolt1 HsBolt ZldsgBolt zldsgBolt2


hsBolt2 beszerez(...) beszerez(...)
zldsgBolt3

4.5. bra. A boltok osztlyai

Most nzzk meg a boltok osztlyozst (4.5. bra). A Bolt osztlynak kt utdosztlya van: a
HsBolt s a ZldsgBolt. A kt bolt abban klnbzik egymstl, hogy azok mskpp
szerzik be az rut. Pldnkban az sosztlybl nincsen pldny, az utdokbl viszont oszt-
lyonknt tbb is van (kt hsbolt s hrom zldsgbolt).

rklds: Egy osztly rklhet tulajdonsgokat s viselkedsformkat egy msik


osztlytl. Az utdosztlyban csak az sosztlytl val eltrseket kell megadni.
66 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Van az objektumorientlt programozsnak mg egy fontos jellemzje: a ksi vagy ms nven


futs alatti kts. Amikor egy objektum beprogramozsakor megszltunk egy msik
objektumot, nem mindig tudjuk, hogy pontosan milyen operci(k) fog(nak) vgrehajtdni.
Pldnkban az elkszt opercit a Hlgy osztly beprogramozsakor rjuk meg, amely
operci hrom msik operci hvsbl ll (vsrol, fz, mosogat). De a fz operci
melyik hlgyhz kapcsoldik vgl is? Van szs, vagy nincs? Amikor a Hlgyet programoz-
zuk, akkor mg nem tudjuk, hogy lesz szerelmes hlgy is. Hogy ki fzi majd az ebdet, az csak
futskor derl ki. Ha Kati kszti az ebdet, lesz szs, ha ms, akkor nem. A fz operci
csak ksbb, futskor ktdik hozz a programhoz mindig annak az objektumnak az ope-
rcija, amelyik ppen dolgozik. Ha Kati dolgozik, akkor sz. A Hlgy osztly kdjt (az
elkszt rutinnal egytt) mr korbban lefordtottuk, esetleg ksz szoftverknt megvettk.
De ha abba a fz cmt fordtskor belegettk volna, akkor a SzerelmesHlgy programo-
zja nem definilhatn t a fz opercit. Ez a krds teht fordtskor nyitva marad, a ktst
ksbbre, a futsi idre halasztjuk.

Futs alatti (ksi) kts: Hogy egy zenet pontosan melyik metdus hvst jelenti, az sok-
szor csak a program futsakor derlhet ki. Ezt a jelensget futs alatti ktsnek nevezzk.

Tesztkrdsek

4.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) Az absztrakci az objektumok kztti hasonlatossgok figyelse, sszegyjtse.
b) Az osztlyozs a vilg objektumainak rendszerezse.
c) Az ltalnosts a vilg objektumainak leegyszerstse.
d) A specializls egy szkebb kategria meghatrozsa az objektumok klnbzsge
alapjn.
4.2. Mely llts jellemz egy objektumorientlt programra? Jellje meg az sszes j vlaszt!
a) Az OO program egymssal kommunikl objektumok sszessge, ahol minden
objektumnak megvan a jl meghatrozott feladatkre.
b) Az objektumoknak nagyjbl egyenl szm felelssgk van.
c) Az objektum felels feladatainak elvgzsrt, s a feladatokat nem is adhatja t ms
objektumoknak.
d) Az objektum pldnyokat tulajdonsgaik s viselkedsk alapjn osztlyokba
soroljuk.
4.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Csak akkor kldhet zenet egy objektumnak, ha a kld s a fogad objektum kap-
csolatban ll egymssal.
b) A futs alatti kts azt jelenti, hogy csak futskor derl ki, melyik metdus hajtdik
vgre.
c) A polimorfizmus azt jelenti, hogy ugyanarra az zenetre a klnbz objektumok
egyformn reaglnak.
d) Az informci elrejtse azt jelenti, hogy az objektum feladatai kdolva vannak.
5. Objektum, osztly 5.1. Az objektum 67

5. Objektum, osztly

A fejezet pontjai:
1. Az objektum
2. Az objektum llapota
3. Az objektum azonossga
4. Osztly, pldny
5. Kliens zen a szervernek
6. Objektum ltrehozsa, inicializlsa
7. Pldnyvltoz, pldnymetdus
8. Osztlyvltoz, osztlymetdus
9. Bezrs, az informci elrejtse
10. A kd jrafelhasznlsa
11. Objektumok, osztlyok sztereotpusai

Ebben a fejezetben tisztzzuk az objektum s az osztly fogalmt. Sz lesz az osztly szerke-


zetrl, az UML-ben val megadsnak mdjrl, s arrl, hogyan lehet egy osztlybl objek-
tumokat ltrehozni, s azokat hasznlni.

5.1. Az objektum

Az objektum (object) informcit trol, s krsre feladatokat hajt vgre. Az objektumot


zenetek ltal lehet megkrni a feladatok elvgzsre. Az objektum felels feladatainak
korrekt elvgzsrt.

Minden objektum valamilyen viselkedsminta szerint mkdik. Egy objektumnak vannak


adatai s metdusai (opercii):
Adatok: Az objektum az informcit adatok, attribtumok formjban trolja.
Metdusok: A metdus olyan rutin (eljrs vagy fggvny), amely az objektum adatain
dolgozik. Az objektumot a feladatokra zenetek ltal lehet megkrni. Egy zenet hat-
sra vgrehajtsra kerl az objektumnak egy, az zenettel azonos nev metdusa, s
ezltal az objektum adatai megvltozhatnak.
68 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Pldaknt legyen az objektum egy andor nev ember, aki menni s fordulni tud (5.1. bra).
Egy absztrakci eredmnyeknt ennek az embernek csak az(x,y) pozcijt s az aktulis
irnyszgt troljuk. sszesen hrom zenet kldhet neki, a megy(tv), az elmegy(x,y)
s a fordul(szg). Embernk teht, ha megkrik, a kvetkezkre kpes:
megy(tv): Megy egy adott tvolsgnyit. Hogy milyen irnyban? Az llapotnak
megfelel pillanatnyi irnyba. s mi lesz az j pozcija? Ennek kiszmolsa az objek-
tum feladata.
elmegy(x,y): Elmegy egyenesen a megadott (x,y) pozcira. Eredeti irnyt most
mr termszetesen nem tudja tartani, ettl az opercitl megvltozik az irnya.
fordul(szg): Irnyszghez kpest elfordul a megadott szggel.

andor
zenetek

megy(tv)
andor
elmegy(x,y) (100,50) pozci(x,y)
fordul(szg) 30 irnyszg

Adatok (attribtumok)

5.1. bra. Ember objektum

Mivel ugyanarra az zenetre tbb objektum is be lehet tantva, meg kell mondani, melyik
objektumnak sznjuk az zenetet. Az objektumnak gy kldjk az zenetet, hogy az zenet el
tesszk az objektum nevt, egy ponttal elvlasztva: andor.megy(8), andor.elmegy(3,7),
andor.fordul(180). Katinak gy kldhetnk zenetet: kati.megy(20).

Msik pldaknt (5.2. bra) vegynk a kpernyn egy ablakot, melynek neve: aFrame (egy
ablakkeret). Az ablakra jellemz annak helyzete (location), mrete (size), cme (title),
valamint az a tny, hogy lthat-e vagy sem (visible=true vagy false). Az objektumnak eze-
ket az adatokat kell megjegyeznie ahhoz, hogy el tudja vgezni a r szabott feladatokat:
setVisible(visible): Az ablak lthatv/lthatatlann ttele (visible=true/false).
setLocation(x,y): Az ablak elmozgatsa a megadott pozciba.
setSize(width,height): Az ablak tmretezse (szlessg, magassg)-ra.
setTitle(title): Az ablak cmnek megvltoztatsa.
5. Objektum, osztly 5.2. Az objektum llapota 69

zenetek aFrame Adatok


aFrame

setVisible(true) (20,16) location(x,y)


setLocation(40,8) (100,80) size(width,height)
setSize(20,16) "Ablak" title
setTitle("Ablak") true visible

5.2. bra. Ablak objektum

5.2. Az objektum llapota

Az objektumnak mindig van valamilyen llapota (state) ez megfelel az adatok pillanat-


nyi rtkeinek. Egy feladat elvgzse utn az objektum llapota megvltozhat.

Az objektum mindig emlkszik az llapotra: Lehet, hogy az 5.1. brn lthat ember sokig
nem csinl semmit, de ha kap egy zenetet, hogy megy(5), akkor onnan indul, ahol elzleg
megllt. Feladata elvgzse utn ms lesz a pozcija, s legkzelebb ugyanilyen utastsra
errl a pozcirl indul, mgpedig a megjegyzett irnyban. Ez persze csak akkor lehetsges, ha
az ember mindig tisztban van a maga attribtumaival.
Az 5.2. bra ablaknak llapott egytt hatrozza meg az ablak ngy adata. Ha az ablakot
elmozdtjuk, tmretezzk, vagy megvltoztatjuk a cmt, akkor az ablaknak mris megvlto-
zik az llapota. Az ablak is csak akkor tud korrekt mdon elmozdulni, ha tudja sajt helyzett,
mrett stb.
Kt azonos osztlyhoz tartoz objektumnak akkor s csak akkor ugyanaz az llapota, ha az
adatok rtkei rendre megegyeznek.
70 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

5.3. Az objektum azonossga

Az objektumok egyrtelmen azonosthatk. Az objektum azonossga (identity) fgget-


len a trolt rtkektl.

Az letben is minden objektum azonosthat, br elfordulhat, hogy az azonosts kisebb-


nagyobb fejfjst okoz. Ha egy ikerpr pldul nagyon egyforma, akkor ember legyen a talpn,
aki eldnti, melyikk rja ppen vizsgafeladatt Programozsbl. Az res A/4-es paprlapokat
sem tudjuk megklnbztetni, de erre ltalban nincs is szksg. A valsgban kt objektum
llapota sohasem egyezhet meg, hiszen ha ms nem is, a pontos tartzkodsi helyk biztosan
klnbzik. Absztrakci rvn azonban kt objektum llapota mgis megegyezhet (ha pldul
egy embernek csak a nevt s szletsi vt troljuk). Az objektumokhoz ki kell tallni egy-
egy minden ms azonosttl klnbz azonostt. Programjainkban ezt a problmt knnyen
meg fogjuk oldani, hiszen az objektumot egy vltoznvvel (andor, zsfi), illetve
memriacmmel azonostjuk majd.
Kt objektum akkor sem azonos, ha llapotaik megegyeznek!

Az objektumot lehetleg ne azonostsuk egyik adatval se, mert az adat megvltozhat!

5.4. Osztly, pldny


Az osztlyozs a termszetes emberi gondolkods szerves rsze. Az ugyanolyan adatokat tar-
talmaz s ugyanolyan viselkedslerssal jellemezhet objektumokat egy osztlyba soroljuk.

Ha katirl ugyanazokat az adatokat tartjuk nyilvn, mint andorrl, valamint ha azonos lla-
pot mellett a kt ember ugyanazokat a feladatokat ugyangy tudja vgrehajtani, akkor kati s
andor ugyanahhoz az osztlyhoz tartozik: kati olyan, mint andor. Kati s Andor ember.

Az osztly (class) olyan objektumminta vagy tpus, amelynek alapjn pldnyokat (objek-
tumokat) hozhatunk ltre. Minden objektum egy jl meghatrozott osztlyhoz tartozik.

Az osztlyban definiljuk
az objektum adatait (hogy az egyes objektumok milyen adatokat jegyeznek meg),
az objektum ltal elvgzend mveleteket (metdusokat). A metdus tulajdonkppen
rutin (eljrs, fggvny), mely az adott objektum adatain dolgozik. Az zenet nem ms,
mint egy rutin hvsa.
5. Objektum, osztly 5.4. Osztly, pldny 71

Egy feladat elvgzsnek eredmnye fgg egyrszt az objektum osztlytl (tpustl),


msrszt attl, hogy az objektum milyen llapotbl "indul". A fenti kt ember pldul
ugyanazon megy(tv) operci szerint mkdik de mivel pozcijuk s irnyszgk
aktulis rtke klnbz lehet, a kt ember valsznleg ms pozciba rkezik.

Az Ember: osztly; ennek az osztlynak az alapjn "kszlt" Andor, Kati s Zsfi (5.3. bra).
Mindhrman az Ember osztly pldnyai, k ltez, hs-vr objektumok. A pldnyt szoks
elfordulsnak vagy egyszeren objektumnak is nevezni. Az brn az Ember osztlybl hrom,
mg a Frame osztlybl kt pldnyunk van. Az objektumot a programban azonostani kell.
Pldnkban az embereknek kati, andor s zsfi az azonostjuk, az ablakok pedig
aFrame s bFrame:
andor, zsfi, kati: Ember
aFrame, bFrame: Frame

Az osztlyobjektum viszony a hagyomnyos tpusvltoz viszony objektumorientlt megfe-


lelje. Ahogyan egy (hagyomnyos) vltozhoz hozztartozik a tpusa, amely meghatrozza a
vltoz rtkkszlett s a rajta vgezhet mveleteket, ppen gy az objektumhoz is hozz-
tartozik annak osztlya (azaz a tpusa), amely lerja a benne trolt adatokat s a vele vgezhet
mveleteket.

Ember Frame
pozci(x,y) location(x,y)
irnySzg size(x,y)
title
megy(tv)
visible bFrame
elmegy(x,y)
setVisible(visible)
fordul(szg)
setLocation(x,y)
setSize(width,height)
setTitle(title)

andor zsfi
kati aFrame

5.3. bra. Osztlyok, pldnyok


72 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Knyvnk az objektumorientlt paradigmk jellsben az UML (Unified Modeling


Language, Egysgestett Modellez Nyelv) eszkztrt alkalmazza. Eszerint az osztlyokat s
pldnyokat a kvetkezkppen adjuk meg (5.4. bra):
Az osztlyt egy hrom rszre osztott tglalappal jelljk (a msodik s harmadik rsz
elhagyhat):
a fels rszbe, kzpre rjuk az osztly nevt, vastag betvel;
a kzpsbe kerlnek az osztly adatai;
egy adat nevt, tpust s kezdrtkt a kvetkez formban adjuk meg:
vltoznv:Tpus=rtk (a tpus s rtk elhagyhatk);
a legalsba tesszk az osztlyban szerepl metdusokat;
egy metdust gy adunk meg (csak a metdusnv ktelez, a tbbi elhagyhat):
metdusnv(paramter:Tpus, ... ):Tpus
Az adat-, illetve a metdusrsz kzl brmelyik elhagyhat. A szba jhet tpusok s
rtkek programozsi nyelvenknt msok s msok lehetnek.
A pldnyt szintn tglalappal jelljk:
A pldnyba berjuk annak azonostjt s osztlyt kettsponttal elvlasztva, al-
hzva (nem kell vastag betvel): pldny:Osztly. A pldny- vagy osztlyazonos-
tk egyike elhagyhat; ekkor a jells gy fest:
Csak pldny megadsa esetn: pldny
Csak osztly megadsa esetn: :Osztly (Az osztly eltt egy kettspont van.)
Szksg esetn egy vonallal elvlasztott rszben megadhatjuk az objektum lla-
pott vagy brmit, ami a feladat szempontjbl kvnatos.
A pldnyt egy szaggatott nyllal az osztlyhoz kthetjk, ha az segti a megr-
tst. A nyl mindig az osztly fel irnyul: a pldny fgg az osztlytl.

Pldny (Objektum)
Osztly neve Frame
location(x,y) Pldny neve
Adatok/ aFrame:Frame
size(width,height) s osztlya
Attribtumok/
title: String location=(10,6)
Informcik/
visible: boolean size=(20,12) Pldny adatai
Vltozk/
title="Ablak" (csak ritkn
Mezk setVisible(visible) visible=true adjuk meg)
Metdusok/ setLocation(x,y)
Opercik/ setSize(width,height)
Rutinok setTitle(title) Osztly

5.4. bra. Osztly s pldny jellse UML-ben


5. Objektum, osztly 5.5. Kliens zen a szervernek 73

Megjegyzsek:
- A pldnyt csak e knyv sttti a jobb kiemels rdekben.
- Az osztlyokba, illetve objektumokba nem kell minden informcit berni mindig csak
annyit, amennyit a feladat ppen megkvn.
- Az UML ajnlsa, hogy az osztly nevt nagybetvel, az adatok s a metdusok nevt
pedig kisbetvel kezdjk.
- Az osztly megfelel rszeit ajnlatos akkor is megrajzolni, ha azok trtnetesen resek.
Csak az egyik rszbl ugyanis nem mindig lehet megllaptani, hogy az adatokat vagy
metdusokat tartalmaz.
- Az osztlyokba, ha kell, kapcsos zrjelek kz megjegyzst rhatunk.

Egy objektum szletsekor annak osztlya egyrtelmen meg van hatrozva. Ettl
kezdve az objektum a szablyoknak megfelelen l, egsz letben tudja, hova tartozik.

Az osztly s a pldny sszetartozst a rendszer felgyeli, arra a programoznak nem kell


figyelnie.
Ha kt azonos osztlyhoz tartoz objektumnak ugyanaz az llapota, akkor ugyanarra a
krsre pontosan ugyangy reaglnak.
Egy objektum mindig a sajt osztlyban megadott metdusok szerint mkdik. Tegyk fel,
hogy van kt osztlyunk: Ember s Aut, s mindkt osztlyban van olyan metdus, hogy
megy. Az egyEmber az Ember osztly, az egyAut pedig az Aut osztly egy pldnya. Az
egyEmber.megy zenet az embernek szl, nyilvn az Ember osztlyban megadott mdon
fog menni. Az egyAut.megy az autnak szl. Az ember sosem fog vletlenl ngy ker-
ken, az aut pedig sosem fog vletlenl kt lbon menni. Az ember, amg csak l, tudja,
hogy ember, az aut pedig tudja, hogy aut.

5.5. Kliens zen a szervernek


Egy objektum felkrhet ms objektumokat klnbz feladatok elvgzsre. A felkrst
zenetkldsnekvagy krelemnek nevezzk. Az egyes objektumok teht zenetek rvn
szltjk meg egymst, s ebben a szereposzts a kvetkez (5.5. bra):
Kliens: a feladatot elvgeztet objektum (gyfl, kr, zenetet kld)
Szerver: a feladatot elvgz objektum (kiszolgl, vgrehajt, vlaszt ad, zenetet
fogad)
Amikor egy szerverobjektumot felkrnk egy feladat elvgzsre, akkor az objektumnak ze-
netet kldnk a kvetkez formban: objektum.metdus. Itt a metdus szksgszeren az
objektum osztlyban deklarlt metdus. Az objektum.metdus zenet hatsra mindig az
objektum osztlynak megfelel metdus hajtdik vgre.
74 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Az zenet (message) nem ms, mint egy kvlrl elrhet metdus hvsa. Az zenetet a
kliens (client) kldi, s a szerver (server) fogadja.

Az objektumnak vannak bels, kvlrl elrhetelten metdusai is. Az aFrame objektum kvl-
rl elrhet metdusai pldul a setVisible, a setTitle stb. Az ablak keretrajzol met-
dusa bels metdus, hiszen a keret rajzolsra az ablakot nem szoks s nem is ajnlatos kln
megkrni.
Ugyanaz az objektum lehet egyszer kliens, mskor szerver. ltalnos dolog, hogy egy objek-
tum a szmra kiszabott feladat bizonyos rszeit ms objektumokkal (az arra legalkalmasab-
bakkal) vgezteti el. Vannak tipikus kliensobjektumok (pldul egy vezrl objektum), illetve
tipikus szerverobjektumok (pldul printer vagy adatbzis objektumok). Szoksos elnevezsek
mg: az aktor (actor) csak kr, az gynk (agent) kr s vgrehajt.

Az zenetet a megszltand objektum azonostjval minstjk, s az zenetnek lehetnek


paramterei: objektum.zenet(paramterek). Ha a megszltott objektumtl vlaszt
(informcit) is krnk, akkor azt paramterek rvn, illetve a fggvny visszatrsi rt-
keknt kaphatjuk meg. Egy objektum nmagnak is kldhet zenetet.

zenet
(krelem)
kliens szerver

5.5. bra. Szereposzts az zenetkldsben

5.6. Objektum ltrehozsa, inicializlsa


Az objektumnak letciklusa van. Minden objektum egyszer megszletik, aztn l, vgl
meghal. Szletskor az objektumba be kell tpllnunk a kezdeti adatait amg egy objek-
tumnak nincsen llapota, addig azt semmilyen feladatra nem lehet rbrni.
Az objektumot ltre kell hozni, majd azonnal inicializlni kell:
be kell lltani kezdeti adatait;
vgre kell hajtani azokat a tevkenysgeket, amelyek az objektum mkdshez feltt-
lenl szksgesek.
Az inicializlst vgz metdust konstruktornak nevezzk. A konstruktornak lehetnek para-
mterei, amelyek segtsgvel az objektumba kvlrl betlthetnk bizonyos kezdeti rtke-
5. Objektum, osztly 5.6. Objektum ltrehozsa, inicializlsa 75

ket. Vannak olyan adatok, amelyeket az objektumot letre lehel egyn nem hatrozhat meg:
ezek rtkt az osztly tervezje elre eldnti, s a konstruktorban bellrl belltja. Ha a
konstruktor egyetlen adatot sem kr kvlrl, akkor egyltaln nem kellenek neki paramterek.
A Javban a konstruktor neve megegyezik az osztly nevvel.

Pldaknt nzzk meg, hogyan rtk meg az Ember osztly konstruktort:

Ember(x:number,y:number)
// Egy metdus hivatkozhat osztlynak brmelyik adatra:
pozci.x = x
pozci.y = y
irnySzg = 0 // kezdetben minden ember irnyszge 0.
end Ember

Az objektumot ltre kell hozni, s inicializlni kell. Az inicializlst elvgz metdust


konstruktornak (constructor) nevezzk.

A Javban az objektumot a new (j) opertorral hozzuk ltre. Az opertor utn meg kell adni az
osztly nevt (milyen osztlybl kvnjuk ltrehozni az objektumot). Mivel az osztly neve
egyben a konstruktor neve is, az objektum automatikusan inicializldik.

Pldaknt hozzunk ltre egy Ember osztlyhoz tartoz objektumot, kati-t (5.6. bra).
kati = new Ember(100,50)

Ember
pozci(x:number,y:number)
kati:Ember kati =
irnySzg:number
new Ember(100,50)
pozci=(100,50)
Ember(x:number,y:number)
irnySzg=0
megy(tv:number)
elmegy(x:number,y:number)
fordul(szg:number)

5.6. bra. Objektum inicializlsa

Egy Ember szletsekor teht megadjuk annak pozcijt. Az irnyszget nem adjuk meg
kvlrl. Az osztly megalkotja gy dnttt, hogy szletskor minden ember irnyszge 0.
76 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Ha az objektumra mr nincs szksgnk, akkor meg kell szntetnnk, el kell puszttanunk. A


Javban nem kell foglalkozni az objektumok megszntetsvel, memriahelyk felszabadt-
sval; azok automatikusan megsznnek, ha nincs rjuk semmifle hivatkozs.

5.7. Pldnyvltoz, pldnymetdus


Az objektum mindig a sajt adatain dolgozik, az opercikat (metdusokat) pedig az osztly
lersbl nzi ki. Az 5.7. brn az a s b pldny ugyanahhoz az osztlyhoz tartozik a
pldnyok ssze vannak ktve osztlyukkal. Mindkt pldnyban megtallhatjuk az osztly
lersban szerepl sszes adatot, azok pldnyonknt ms-ms rtkeket vehetnek fel. A
metdusokat azonban elegend csak egyszer, az osztlyban trolni, s azok majd tekintetbe
veszik a megfelel objektum adatait (llapott).

Osztlydefinci
metdus1
a s b osztlya
metdus2
Pldnymetdusok
.
. vltoz1: tpus1
.
vltoz2: tpus2
metdusI .
.
. .
.
.
vltozM: tpusM
metdusN

Pldnyvltozk (rtkek)

a (pldny) b (pldny)

vltoz1=artk1 vltoz1=brtk1
vltoz2=artk2
.
vltoz2=brtk2
.
a.metdusI .
.
.
.

(zenet) vltozM=artkM vltozM=brtkM

5.7. bra. A pldny az osztlybl nzi ki viselkedslerst


5. Objektum, osztly 5.7. Pldnyvltoz, pldnymetdus 77

Kvessk most vgig egy zenet vgrehajtst: krjk fel az a pldnyt a metdusI feladat
elvgzsre (a.metdusI)! Mivel az a pldnyt krtk fel, azrt
a program az a osztlyban tallhat metdusI-t fogja vgrehajtani;
metdusI az a pldny adatain fog dolgozni.

A pldnyonknt helyet foglal vltozk a pldnyvltozk (instance variable), ms nven


pldnyadatok. Az osztlynak azokat a metdusait, amelyek pldnyokon (pldnyvltoz-
kon) dolgoznak, pldnymetdusoknak (instance method) nevezzk.

Nzzk meg most az Ember osztly teljes defincijt! Pszeudokdban az osztly defincijt a
class s az end class kulcsszavak kz tesszk. Az osztlyban meg kell adnunk az sszes
adatot s metdust.

Az Ember osztly pszeudokdja


90
class Ember y pozci=(20,10)
// Adatok: irnySzg=30
pozci(x:number,y:number)
irnySzg: number
(0,0) x
// Konstruktor:
0
Ember(x:number,y:number)
pozci.x = x
pozci.y = y
irnySzg = 0
end Ember

// Megy valamekkora tvolsgot. Megvltozik a pozcija:


megy(tv:number)
pozci.x = pozci.x + tv*cos(irnySzg)
pozci.y = pozci.y + tv*sin(irnySzg)
end megy

// Elmegy az (x,y) pozcira. Megvltozik az irnyszge is:


elmegy(x:number,y:number)
pozci(x,y) kiszmtsa a paramterben megadott x s y
rtkekbl.
irnyszg kiszmtsa.
end elmegy

// Elfordul egy adott szggel:


fordul(szg:number)
irnySzg = irnySzg + szg
end fordul
end class Ember
78 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Megjegyzs: Az elmegy metdusban az j irnyszg kiszmtsa implementcis rszlet.


Mivel a pszeudokdot csak nagyvonal tervezsre szoktk hasznlni, itt elegend az
irnyszg kiszmtsa tevkenysg megadsa. A rszletes megoldst majd kdolskor
dolgozzuk ki.

Az osztly tesztelseknt hozzunk ltre egy jnos azonostj Embert, s adjunk t neki ze-
neteket! Ksrjk figyelemmel jnos letnek egy rszt: vizsgljuk meg, mi az llapota
megszletsekor s minden tovbbi zenet kldse utn! Az eredmnyt a kvetkez tblzat
mutatja:

Jnos llapota
Konstruktor s tovbbi zenetek pozci(x,y) irnyszg
jnos = new Ember(20,10) (20,10) 0
jnos.fordul(30) (20,10) 30
jnos.fordul(60) (20,10) 90
jnos.megy(6) (20,16) 90
jnos.elmegy(5,16) (5,16) 180
jnos.megy(5) (0,16) 180
jnos.fordul(-150) (0,16) 30

Feladat
rjunk egy olyan eljrst, amelyben egy ember tzszer fel-al stl egy megadott
tvolsgon!

Az eljrs egyik paramtere az ember, a msik a tvolsg. Elszr elkldjk a szban forg
embert az adott tvolsgra amilyen irnyban ll, arra fog menni: ember.elmegy(tv),
majd egy 180 fokos fordulatot tesz: ember.fordul(180). Ezutn ismt megteszi a megadott
tvolsgot, ismt megfordul stb. Ahhoz, hogy az ember a tvolsgot n-szer oda-vissza meg-
tegye, a megy-fordul algoritmust 2*n-szer kell vgrehajtania. Eljrsunkban n=10.

A megolds pszeudokdja
y
stl(ember: Ember, tv: number)
for i=1; i<2*10; i=i+1
ember.megy(tv)
ember.fordul(180) tv x
end for 0
end stl
5. Objektum, osztly 5.8. Osztlyvltoz, osztlymetdus 79

Feladat
Hozzuk ltre Srt s Jnost, s az elbbi eljrst felhasznlva stltassuk meg
ket! Sra tvolsga 10, Jnos pedig 15 legyen! Felvltva stljanak amg az
egyik stl, a msik pihenjen!

Az elbbi, stl eljrst brmilyen emberre alkalmazhatjuk, s az embert brmilyen tvolsg


stlsra megkrhetjk. Elszr is ltrehozzuk Srt s Jnost: hogy hova, milyen pozciba
szletnek, az most teljesen mindegy brhol voltak is eltte, most mindenkppen stlni
fognak. Stls utn llapotuk mindig visszall az eredetibe.
sra, jnos: Ember
sra = new Ember(50,20)
jnos = new Ember(100,60)
stl(sra,10)
stl(jnos,15)
stl(sra,10)
stl(jnos,15)

5.8. Osztlyvltoz, osztlymetdus


Vannak adatok, amelyek nem egy konkrt pldnyra, hanem az egsz osztlyra jellemzek.
Ilyen pldul az adott osztlyhoz tartoz, l pldnyok szma, vagy egy olyan tulajdonsg,
rtk, amely minden objektumra egyformn jellemz (pldul az egy slycsoportba tartoz
birkz objektumok esetn a slycsoport). Az ilyen kzs, osztlyonknt egyszer elfordul
vltozt osztlyvltoznak (osztlyadatnak) nevezzk. Az osztlyvltoz rtke az osztly
sszes pldnyra ugyanaz, teljesen felesleges lenne teht ezt az rtket pldnyonknt elt-
rolni. Az osztly vltozjt az osztly sszes objektuma ismeri s elri.
Osztlymetdusnak nevezzk az olyan metdust, amely objektumok nlkl is tud dolgozni.
Az osztlymetdus a pldnyadatokat nem ri el, az csak az osztlyvltozkat manipullhatja.
Egy osztlymetdus meghvhat az osztlynak kldtt zenettel:
Osztly.osztlyMetdus

Egy osztlyban az osztlyvltoz s pldnyvltoz lersai egyarnt szerepelnek. Az osztly-


vltoz az osztly szletsekor keletkezik, s az osztlyban kap helyet; a pldnyvltoz az
objektum szletsekor keletkezik az osztlyban tallhat lers alapjn, s az a megszletett
pldnyban kap helyet.
A pldnyvltozkat csak a pldnymetdusok rik el, mg az osztlyvltozt egyarnt elrik a
pldnymetdusok s az osztlymetdusok. Ennek az az egyszer oka, hogy egy objektumhoz
mindig tartozik osztly, de ez fordtva nem mindig igaz: elfordulhat, hogy egy osztlynak az
adott pillanatban nincsen egyetlen elfordulsa sem. Az osztlyvltoz, illetve osztlymetdus
nevt az UML-ben alhzzuk (5.8. bra).
80 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Pldaknt nzznk egy Aut osztlyt, ahol minden autnak van egy (x,y) pozcija, egy irnya
s egy sebessge (5.8. bra). Az aut kpes egy adott tvolsgra s egy adott pozcira
menni, s tud fordulni. Minden autnak ms a pozcija, s ms sebessggel megy; ezek az
adatok teht pldnyadatok. Ltezik ezenkvl az autkra vonatkozan egy sebessgkorltozs
(maxSebessg), s a maximlis sebessget az osztly egyetlen pldnya sem lpheti tl. A
maxSebessg adat minden autra ugyanaz; ez teht osztlyadat. A maximlis sebessget a
setMaxSebesseg osztlymetdussal lehet belltani, pldul:
Aut.setMaxSebesseg(100) // bellts 100-ra
Aut.setMaxSebesseg(Aut.maxSebesseg+10) // 10-zel tbbre

Az aut konstruktorban (vagyis egy egyedi pldny ltrehozsakor) a programoznak term-


szetesen figyelnie kell a kvlrl megadott sebessget, s ha az az osztlyban trolt rtket
meghaladja, vissza kell utastania.

Aut bor144:Aut
pozci(x:number, y:number) Aut(5,93,85)
pozci=(5,93) megy(60)
irnySzg: number
irnySzg=0
sebessg: number fordul(45)
sebessg=85
maxSebessg: number=100 setMaxSebessg(50)

Aut(x,y,sebessg)
bit079:Aut
megy(tv)
elmegy(x,y) pozci=(28,8) Aut(28,8,50)
fordul(szg) irnySzg=0 megy(10)
sebessg=50 elmegy(25,5)
setMaxSebessg(sebessg)

megy(60)
fordul(45)
setMaxSebessg(100)

5.8. bra. Osztlyvltoz, osztlymetdus

Az aut pldnyt meg lehet szltani pldnymetdussal s osztlymetdussal egyarnt (ez


utbbi ltalban felesleges, s kerlend). Egy osztlymetdus sosem dolgozhat pldny-
adaton. A bor144 rendszm autnak szl setMaxSebessg(50) zenet az osztly
maxSebessg vltozjt lltja be 50-re. Arra az objektumoknak maguknak kell figyelnik,
5. Objektum, osztly 5.9. Bezrs, az informci elrejtse 81

hogy ha valaki tlltja az osztly maxSebessg vltozjt, akkor ne menjenek ennl tbbel.
Az osztly sosem figyeli a hozz tartoz objektumokat, hiszen nem is ismeri ket.
Egy osztlyt csak annak osztlymetdusval szlthatjuk meg. Lehet, hogy az osztlynak nincs
egyetlen pldnya sem.

Az osztlyvltoz (class variable) az osztly sajt vltozja, az az egyes pldnyokban


nem szerepel.
Az osztlymetdus (class method) az osztly sajt metdusa, amely csak osztlyvltoz-
kon dolgozik. Egy osztlyt csak osztlymetdussal lehet megszltani; egy objektumot meg
lehet szltani pldnymetdussal s osztlymetdussal egyarnt.

5.9. Bezrs, az informci elrejtse


Az objektum egyik legnagyobb ereje abban ll, hogy zrt s srthetetlen. Ezt gy tudja meg-
valstani, hogy az adatokat s a hozz tartoz metdusokat sszezrja, s a kliens szmra
felesleges informcikat egyszeren elrejti. Vannak olyan adatok, metdusok, amelyeknek
lltsval, meghvsval knnyen elromolhat az objektum llapotnak egysge, logikja,
konzisztencija. Ezrt az objektum csak azokat az adatokat, metdusokat engedi elrni,
amelyeknek az elrsvel a kliens biztosan nem okozhat bajt errl a szerver osztlyt elkszt
programoznak kell gondoskodnia. Egy kliens csak azt tudhatja, hogy a szerver MIT csinl a
viselkeds HOGYAN-ja az objektum mhelytitka. Egy j objektumorientlt nyelv megfelel
vdelem beptsvel elsegti e szablyok betartst. Mirt nagyon j ez?
Mert ms programrsz nem tudja elrontani az objektum belsejt.
Mert az objektumban esetlegesen keletkezett hiba nem tud tterjedni ms programr-
szekre.
Az informci elrejtsvel a hibk mennyisge lnyegesen cskkenthet. De hogyan rjk el,
hogy egy objektum zrt legyen? A kvetkez szablyok (5.9. bra) azt szolgljk, hogy ms ne
piszklhasson bele az objektum belsejbe:
Az objektumnak van interfsze: az a programoz ltal kijellt metdusokbl ll (ritkb-
ban adatokbl is).
Az objektum csak az interfszn keresztl "kzelthet meg".
Az adatokat, ha lehet, csak metdusokon t tegyk elrhetv!
Az objektum interfszt tegyk a lehet legkisebb!

A bezrs (encapsulation) az adatok s metdusok sszezrst, betokozst jelenti. Ms


elnevezsek: egybezrs, egysgbezrs.
82 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Az informci elrejtse (information hiding) azt jelenti, hogy az objektum elrejti bel-
gyeit, azokat csak az interfszn t "hagyja" megkzelteni.

A bezrs s az informcielrejts fogalma sszemosdott, sokan egyknt is kezelik.

Implementci

Interfsz
metdus1

metdus2

metdus3 Adatok
.
.
.

metdusN

5.9. bra. Az informci elrejtse

5.10. A kd jrafelhasznlsa
A programoznak mindig is trekvse volt, hogy az egyszer mr jl megrt, kitesztelt prog-
ramkdjt akr ugyanabban, akr egy msik programban jra felhasznlhassa. Az objektum-
orientlt programozs egyik nagy elnye, hogy a rgi kdokat knnyszerrel s hibtlanul
vagy majdnem hibtlanul hasznlhatjuk fel ms programokban.
A kd jrafelhasznlsnak egyik mdja, hogy a mr megalkotott osztlybl pldnyokat
hozunk ltre. Ahny pldnyt hozunk ltre, annyiszor hasznljuk jra a megfelel osztly kd-
jt. Ha ezt az osztlyt egyszer sikerlt jl beprogramozni, akkor azt nyugodtan hasznlhatjuk
akrhnyszor, sosem fogunk benne csaldni. A kd jrafelhasznlsnak van egy msik mdja
is: egy mr meglev osztly rkls rvn val tovbbfejlesztse, trsa.

A kd jrafelhasznlsa (code reuse) egy mr megrt kd felhasznlsa akr pldny


ltrehozsval, akr osztly tovbbfejlesztsvel.
5. Objektum, osztly 5.11. Objektumok, osztlyok sztereotpusai 83

5.11. Objektumok, osztlyok sztereotpusai

Az objektumokat, illetve azok osztlyait feladataik jellege szerint csoportostani lehet. Egy
objektum, illetve osztly sztereotpusnak (stereotype) nevezzk annak fajtjt, jellegt.
A sztereotpusok kztt nem mindig hzhat les hatr, s elfordulhat, hogy egy
objektumra kt sztereotpus is jellemz. Az objektumok, osztlyok alapvet sztereotpusai:
informcihordoz, hatr, kontroll, kontner.

Az UML szerint az objektumok, osztlyok lnyegesebb sztereotpusai a kvetkezk:


Informcihordoz (egyed, zleti) objektum: Az informcihordoz objektum infor-
mcit trol. Rendszerint hosszabb let (maradand, perzisztens), vagyis tlli a
program futst. Ezeket az objektumokat gyakran adatbzisban troljk. Az informci-
hordoz objektum ltalban vals vilgbeli szemly, dolog, hely, fogalom vagy ese-
mny. Pldul egy banki rendszerben: bank, gyfl, szmla stb.
Hatrobjektum (interfszobjektum): A hatrobjektum a klvilggal kapcsolatot
teremt objektum. Az aktor hatrobjektumokon keresztl kommunikl a rendszerrel.
Hatrobjektumok pldul egy grafikus felhasznli fellet elemei: ablakok (szvegszer-
keszt, dialgus, ...), beviteli mezk, nyomgombok stb. Ksbb ltni fogjuk: mindig a
hatrobjektum ismeri az informcihordoz objektumot, sosem fordtva!
Kontrollobjektum: Vezrlst, szmolst vgrehajt objektum. Ilyen pldul egy folya-
matvezrl, egy statisztikai adatgyjt, vagy egy ms objektumokat koordinl objek-
tum.
Kontnerobjektum: A kontnerobjektum tipikusan implementcis (a program
kdolst elsegt) objektum. A kontner az objektumok kztti kapcsolatok megval-
stst szolglja. Kontnerekrl a kvetkez, Trstsi kapcsolatok fejezetben lesz sz.

A sztereotpusok ismerete olyankor hasznos pldul, amikor egy rendszer fejlesztsekor


objektumokat prblunk azonostani, csoportostani, vagy a feladat megoldsra hasznlhat
osztlyt keresglnk egy osztlyknyvtrban. Az osztly sztereotpust cmkvel (az osztly
neve felett, angyalzrjelben), vagy ikonnal szoks feltntetni (5.10 bra).

Ikonok:
hatr
Informcihordoz:
Frame Frame
Hatr:
Kontroll:

5.10 bra. A sztereotpus jellse az UML-ben


84 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Tesztkrdsek

5.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) Feladatnak elvgzse utn az objektum definilatlan llapot lesz.
b) Ha kt objektum llapota megegyezik, akkor a kt objektum azonos.
c) Az osztly meghatrozza objektumainak viselkedst.
d) Ha kt objektum ugyanahhoz az osztlyhoz tartozik s ugyanabban az llapotban
van, akkor egyformn reagl kt egyforma zenetre.
5.2. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az UML-ben az osztlyt egy hrom rszre osztott tglalappal jelljk. A fels
rszbe rjuk az osztly nevt, alhzva.
b) Az UML-ben a pldnyon fel lehet tntetni a pldnymetdusokat.
c) Az objektum szletsekor meg kell adni, hogy ez az objektum melyik osztlyhoz
tartozik, s azt az osztlyt a tovbbiakban mr nem lehet megvltoztatni.
d) Az zenet kldje a szerver.
5.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az objektumot szletsekor inicializlni kell!
b) Az objektum kezdeti llapott a konstruktor lltja be.
c) Az osztlymetdus elvileg elrheti a pldnyvltozt.
d) A pldnymetdus elvileg elrheti az osztlyvltozt.
5.4. Mi igaz az informci elrejtsre? Jellje meg az sszes igaz lltst!
a) Az informcihoz senki sem frhet hozz.
b) A feladat elvgzsnek hogyanja a feladatot vgz objektum belgye.
c) Az objektum bizonyos informciihoz nem lehet kvlrl hozzfrni.
d) Csak jelszval lehet elrni bizonyos adatokat.

Feladatok
5.1. Hasznlja fel a fejezetben tallhat Ember osztlyt:
a) (A) Hozzon ltre egy Gerg nev embert! Kezdeti pozcija legyen (30,5), irny-
szge pedig 120! Kvesse vgig Gerg llapott, ha Gerg a kvetkez zeneteket
kapja: megy(10), fordul(120), megy(13), elmegy(0,0)!
b) (B) Hozzon ltre egy Matyi nev embert is, s a kt ember folyamatosan menjen egy
adott pont fel, amg el nem ri azt a pontot!
5.2. (B) Kpzeljen el egy szmla objektumot! Szimullja a pnzbettet s -kivtet! Ksztse
el a Szmla osztly UML tervt s pszeudokdjt! Ezutn hozzon ltre hrom szmlt,
amelyekre klnbz sszegeket betesz, illetve amelyekrl klnfle sszegeket kivesz.
5.3. (C) Talljon ki, s specifikljon egy tetszleges osztlyt: hatrozza meg s rja le ponto-
san a feladatt! Ezutn ksztse el UML tervt s pszeudokdjt! Vgl hozzon ltre az
osztlybl pldnyokat, s hasznlja ket!
6. Trstsi kapcsolatok 6.1. Objektumok kztti trstsi kapcsolatok 85

6. Trstsi kapcsolatok

A fejezet pontjai:
1. Objektumok kztti trstsi kapcsolatok
2. Osztlyok kztti trstsi kapcsolatok
3. A trstsi kapcsolat megvalstsa

Egy objektum csak akkor tud egy msik objektumnak zenetet kldeni, azzal feladatot vgre-
hajtatni, ha trstsi kapcsolatban ll vele. A trstsi kapcsolat objektumokra s osztlyokra
egyarnt rtelmezhet; ez utbbi az elbbinek az ltalnostsa. Ebben a fejezetben az objek-
tumok s osztlyok kztti trstsi (ismeretsgi s tartalmazsi) kapcsolatokrl lesz sz.

6.1. Objektumok kztti trstsi kapcsolatok


Az objektumok csak gy tudnak egyttmkdni, ha azok trstsi kapcsolatban llnak egyms-
sal. Ha a kliensobjektum zenetet akar kldeni egy msik objektumnak, akkor tartalmaznia kell
a megszltani kvnt szerverobjektum azonostjt (referencijt, mutatjt). Ha az objektu-
mok klcsnsen akarnak zenni egymsnak, vagyis a kliensszerver szereposzts vltakozik,
akkor mindkt objektumban fel kell vennnk a msikra vonatkoz referencit.
Ktfle trstsi kapcsolat ltezik:
ismeretsgi, ms szval hasznlati kapcsolat;
tartalmazsi, ms szval egszrsz kapcsolat.

Az UML-ben gy jelljk a kapcsolatot kt objektum kztt, hogy az objektumokat sszekt-


jk egy vonallal (6.1. bra):
A vonal vgn lev nyl a navigls irnyt mutatja: a nyl irnyban mindenkppen
lehet az objektumnak zenetet kldeni. A nyilat nem ktelez kitenni, ha a kapcsolat
ktirny vagy mg nem tudjuk, hogy milyen.
Informcis jelleggel a vonal fl, illetve al rhatjuk a kapcsolat nevt s irnyt. A
nevet itt alhzzuk, mert objektumok kztti kapcsolatrl van sz (a kt osztly kztti
kapcsolat egy pldnya). Az irnyt egy tmr nylhegy jelli: a kapcsolatot a nyl ir-
86 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

nyban kell olvasni, mint pldul a 2. esetben: erzsbet gyereke zsfi. Ha nincs
nyl, akkor a kapcsolat neve mindkt irnyban olvashat. judit hzastrsa andrs
s andrs hzastrsa judit.

Az objektumokat s azok kapcsolatait brzol diagramot objektumdiagramnak vagy


pldnydiagramnak nevezzk. Egy objektum termszetesen tbb objektummal is kapcsolat-
ban llhat, s az is elfordulhat, hogy nincs kapcsolatban egyetlen msik objektummal sem.

Ismeretsgi kapcsolat
Kt objektum ismeretsgi (hasznlati) kapcsolatban ll egymssal, ha egyik lte sem fgg a
msiktl, s legalbb az egyik ismeri, illetve hasznlja a msikat. Az ismeretsgi kapcsolatban
ll objektumok kzl brmelyik megszntethet, csak arra kell vigyzni, hogy a tll
objektum a tovbbiakban ne hivatkozzk a meghalt-ra, s ne maradjon referencia nlkl az
az objektum, melynek mg zenetet akarunk kldeni.

1 2
gyereke zsfi
:Ember
hzastrsa
judit andrs erzsbet
:N :Frfi :Ember
kati
gyereke :Ember

Objektumdiagramok

6.1. bra. Objektumok kztti ismeretsgi kapcsolatok

A 6.1. bra csupa ismeretsgi kapcsolatot brzol. Elemezzk a kt esetet:

1. judit N, andrs pedig Frfi. A kapcsolat ktirny: judit hzastrsa andrs,


andrs hzastrsa judit. judit s andrs ismeri egymst, mindkett kldhet
zenetet a msiknak.

2. Ezen az objektumdiagramon hrom Ember szerepel, s kzlk ketten-ketten vannak


egymssal kapcsolatban. A kapcsolatok egyirnyak: erzsbet gyereke zsfi s
erzsbet gyereke kati. Erzsbet ismeri a gyerekeit, de a gyerekek nem ismerik t
(a pldban legalbbis nem, s gy nem zenhetnek vissza).
6. Trstsi kapcsolatok 6.1. Objektumok kztti trstsi kapcsolatok 87

Tartalmazsi kapcsolat
Kt objektum tartalmazsi (egszrsz) kapcsolatban ll egymssal, ha az egyik objektum
fizikailag tartalmazza vagy birtokolja a msik objektumot. A tartalmaz objektum az sszetett
vagy egsz objektum, a benne lev pedig a rszobjektum. A rszobjektum lte az egsz
objektumtl fgg, vagyis ha az egsz objektumot megszntetjk, vele egytt pusztul a rsz
is. A tartalmazsi kapcsolatra sokszor jellemz, hogy az egsz objektum deleglja feladatt a
rszeire is (pldul egy dialgusablak elmozgatsakor annak nyomgombjai is elmozdulnak).
Ktfle tartalmazsi kapcsolat ltezik:
gyenge tartalmazs: ha a rsz kivehet az egszbl;
ers tartalmazs: ha a rsz nem vehet ki az egszbl.
Tartalmazsi kapcsolat esetn a kapcsolat vonalra egy kis rombuszt tesznk a tartalmaz
objektum oldalra: a gyenge tartalmazst res, mg az ers tartalmazst tmr rombusz jelli
(6.2. bra). Kompozcinak nevezzk azt a tartalmazst, amelyben az egsz objektum ers
tartalmazsi kapcsolatban ll valamennyi rszvel, vagyis az egsz ltrehozsakor sszell a
vgleges kompozci, s ksbb nem vehet ki belle egyetlen rsz sem.
A tartalmazsi kapcsolat ersebb, mint az ismeretsgi: az egsz objektum mindig ismeri a
rszt.

1 2
-ban van
doboz csoki :Kutya
:Doboz :dessg

:Fej :Trzs :Lb

3
felgyeli
pageNum: InputLine
printDialog:
Dialog ok: Button

cancel: Button

6.2. bra. Objektumok kztti tartalmazsi kapcsolat


88 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Nzzk vgig a 6.2. bra eseteit:

1. A doboz-ban van csoki. A doboz osztlya Doboz, a csoki dessg. Ez gyenge


tartalmazs: ha a dobozt ellopjk, ellopjk a csokit is; de amg megvan a doboz, kive-
hetjk belle a csokit (ekkor megsznik a kapcsolat).

2. A Kutynak van Feje, Trzse s ngy Lba. A kutya a fejvel s a trzsvel ers
tartalmazsi kapcsolatban ll, hiszen azok nlkl egyltaln nem tud ltezni. A lbakat
gyenge tartalmazsknt jelltk; ennek helyessge termszetesen vitathat. A lbakat
multiobjektumknt brzoltuk: ha egy objektum tbb egyforma (egy osztlyhoz
tartoz) objektummal ll kapcsolatban, akkor azokat objektumcsoportknt, egymst
majdnem takar tglalapokkal brzolhatjuk. A csoportban szerepl objektumok szmt
a kapcsolat vonalra rhatjuk a csoport felli oldalra. Ilyenkor a csoport elemei egyen-
knt nem nevezhetk meg.

3. A printDialog tipikus kompozci: a printelst vezrl dialgusdoboz tartalmazza az


oldalak szmt megad pageNum inputsort, valamint egy ok s egy cancel nyom-
gombot. printDialog felgyeli pageNum-ot, ok-t s a cancel-t. Ha a dialgusdo-
bozt megszntetjk, akkor meg kell sznnik a benne lev objektumoknak is: hogy
festene az, ha az ablak eltnse utn a nyomgombok ott maradnnak a kpernyn? De
annak sincs rtelme, hogy egy nyomgombot kivegynk a dialgusdobozbl: ezek az
objektumok csak gy, egytt dolgoznak tkletesen.

Megjegyzsek:
- A magyarban a ragozs miatt sokkal nehezebb a kapcsolatnak olyan nevet tallni, hogy az
sszeolvass kvetkezetes legyen, s jl hangozzk. Angolul a Kutya s a Fej kztti
kapcsolatot gy mondannk: Dog has a Head, Head belongs to Dog. Prblja meg ezt
ragozs nlkl lefordtani magyarra: Kutya birtokolja Fej?, Fej tartozik Kutya? Az
egyik objektumot a magyarban ragoznunk kell.
- Annak eldntse, hogy egy kapcsolat tartalmazsi vagy ismeretsgi kapcsolat-e, ksbbre
halaszthat. A tartalmazsi kapcsolatot nem szksges mindenron feltntetni.

Az objektumok kztti trstsi kapcsolat (association) lehet ismeretsgi vagy tartalmazsi:


- kt objektum ismeretsgi vagy hasznlati kapcsolatban (acquaintance association) ll
egymssal, ha ltezsk fggetlen egymstl, s legalbb az egyik ismeri, illetve hasz-
nlja a msikat.
- kt objektum tartalmazsi vagy egszrsz kapcsolatban (aggregation, whole-part
association) ll egymssal, ha az egyik objektum fizikailag tartalmazza vagy birtokolja
a msik objektumot. A tartalmazs ers, ha a tartalmazott objektum nem vehet ki a
tartalmazbl, egybknt gyenge. Kompozcinak nevezzk azt a tartalmazst,
amelyben az egsz objektumot ers tartalmazsi kapcsolat kti ssze valamennyi
rszvel.
6. Trstsi kapcsolatok 6.2. Osztlyok kztti trstsi kapcsolatok 89

Az objektumokat s kapcsolataikat brzol diagramot objektumdiagramnak vagy pl-


dnydiagramnak nevezzk.

6.2. Osztlyok kztti trstsi kapcsolatok


Egy feladat kapcsn ltalban nem konkrt objektumok kztti kapcsolatokrl van sz, hanem
osztlyok kztti kapcsolatokrl, hiszen a szablyokat legtbbszr ltalnosan kell meghat-
rozni. Ilyenkor definilni kell, hogy az egyik osztly objektumai milyen kapcsolatban llhatnak
a msik osztly objektumaival. A pldnyok kztt ezek utn csak olyan kapcsolatok llhatnak
fenn, amelyeket az osztlyok kztti kapcsolatok megengednek. Az gy megadott szablyok-
nak egy rendszerben minden krlmnyek kztt rvnyeslnik kell, akkor is, ha az egyes
osztlyokbl jabb pldnyokat hozunk ltre, illetve szntetnk meg.
Osztlyok kztt ugyangy rtelmeznk ismeretsgi, illetve tartalmazsi kapcsolatot, mint
objektumok kztt. Az osztlyok kztti trstsi kapcsolat az objektumok kztti trstsi
kapcsolat ltalnostsa: kifejezi, hogy az egyik osztly egy-egy objektuma hny objektummal
llhat a kapcsolatban a msik osztlybl, s milyen lehet ez a kapcsolat. Kt osztly kztt a
kapcsolat lehet ismeretsgi vagy tartalmazsi (az egyes objektumprosok kapcsolatai egyfor-
mk). Az osztlyokat s azok kapcsolatait brzol diagramot osztlydiagramnak nevezzk.
Kt osztly kapcsolatt a kvetkezk jellemzik (a jellsket is felsoroljuk; 6.3. bra):
Kapcsolat: Vonalat hzunk a kt osztly kz. Az ismeretsgi, illetve tartalmazsi (ers
vagy gyenge) kapcsolatokat ugyangy jelljk, mint objektumok esetben. Opcionlis,
vagyis nem ktelez megadni.
Naviglsi irny: A vonal vgein lev nyilak mutatjk. Opcionlis.
Kapcsolat neve s irnya: A vonalra tesszk nagy kezdbetvel, vastag betsen,
alhzs nlkl. Opcionlis.
Multiplicits (kardinalits): A vonal kt vgre egy-egy szmot vagy szmhalmazt
runk: az osztlyhoz kzel es szm azt jelenti, hogy a szemkzti osztly egy
objektumhoz hny objektum tartozhat ebben az osztlyban. Szmhalmazt szmok s
szmintervallumok felsorolsval adhatunk meg. A * jelentse: akrhny. Ha nem runk
a vonalra semmit, az 1-et jelent. Pldul:
3 : pontosan hrom
0..1 : nulla vagy egy
10..20 : 10 s 20 kz es szm
* : 0.., vagyis akrhny
1..* : 1.., vagyis legalbb egy
1,3,10..* : 1 vagy 3, vagy 10-tl kezdve akrhny.
Szerepnv: Kt osztly kapcsolata nagyon jl jellemezhet azzal, hogy mi az osztlyok
szerepe ebben a kapcsolatban. A szerepnevet kisbetvel rjuk. Opcionlis.
90 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Megszortsok (kittelek): Ilyen pldul a kapcsolat rendezett volta (ha egy objek-
tummal kapcsolatban ll objektumok valamilyen szempont szerint rendezve vannak).
A megszortsokat kapcsos zrjelbe tesszk, pldul: {rendezett}. Opcionlis.

A 6.3. brn egy osztlydiagram lthat. Minden egyes kiskor objektumnak pontosan kt
nagykor szlje van, valamint minden egyes nagykor objektumnak akrhny kiskor gye-
reke van. Az ugyanahhoz a szlhz tartoz gyerekek sorba vannak rendezve (pldul kor sze-
rint). A navigls egyirny, vagyis csak a szlk parancsolhatnak a gyerekeknek, fordtva
ez nem lehetsges.

Kapcsolat neve
Megszorts
Kapcsolat multiplicitsa
{rendezett}
* Gyereke 2
Kiskor Nagykor
gyerek szl

szerepnv

6.3. bra: Osztlyok kztti trstsi kapcsolat (osztlydiagram)

A kapcsolatokat multiplicitsuk szerint osztlyozzuk. Eszerint alapveten hromfle kapcso-


latot klnbztetnk meg:
egyegy kapcsolat
egysok kapcsolat
soksok kapcsolat

Ezen bell egy kapcsolat lehet ktelez vagy opcionlis jelleg aszerint, hogy a tloldalon
kell-e egyltaln trs, vagy nem (a nulla megengedhet vagy nem). Nzzk vgig ezeket az
eseteket pldk segtsgvel. Az egyes osztlydiagramokhoz elvileg akrhny pldnydiagram
megadhat; mi a pldkban csak egyet adunk meg. A pldnydiagramra nem kell feltenni a
megfelel osztlyok sszes objektumt. Egy objektumdiagram az osztlydiagram egy elfor-
dulsa, pldnya.

Egyegy kapcsolat

Ha kt osztly egyegy kapcsolatban van egymssal, akkor az egyik osztly egy pldnya
a msik osztly legfeljebb egy (0..1) pldnyval llhat kapcsolatban. A msik osztlyra
ugyanez vonatkozik.

Elemezzk a 6.4. bra eseteit:


6. Trstsi kapcsolatok 6.2. Osztlyok kztti trstsi kapcsolatok 91

1. Az els eset azt fejezi ki, hogy vannak Doboz tpus (osztly) objektumok, s vannak
dessg tpus objektumok. Egy dobozban vagy van dessg, vagy nincs, de egynl
tbb dessg nem lehet benne. Fordtva: egy dessghez vagy nulla vagy egy doboz
tartozik (lehet, hogy az dessg nem dobozban van, s egy dessget kt dobozba
egyszerre nem lehet beletenni). Az objektumdiagram az osztlydiagram egy lehetsges
elfordulst adja meg: van kt doboz s hrom dessg. A sti nincsen dobozban. Ez
az objektumdiagram kielgti az osztlydiagram ltal lert szablyokat.
2. A msodik esetben a kapcsolat mindkt vgn egy 1-es szerepel (ez az alaprtelmezs,
ezt nem ktelez kirni), s ez azt jelenti, hogy a kapcsolat mindkt irnyban ktelez
jelleg: minden egyes emberhez pontosan egy tlevl tartozik, s minden egyes tlevl-
hez pontosan egy ember tartozik. Az letben termszetesen ez nem gy van; a diagra-
mok idealizltak, absztrakcival jnnek ltre.

Opcionlis kapcsolat
1 ban van
doboz1 csoki
:Doboz :dessg
0..1 0..1
Doboz dessg doboz2 cukor
Ban van :Doboz :dessg

sti
:dessg
2 Ktelez kapcsolat

1 1
Ember tlevl
Osztlydiagram
Objektumdiagram
emese pz664911 zsolt pk553015
:Ember :tlevl :Ember :tlevl

nomi ut238333 tams pz111111


:Ember :tlevl :Ember :tlevl

6.4. bra. Egyegy kapcsolat


92 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Egysok kapcsolat

Kt osztly kztt akkor ll fenn egysok kapcsolat, ha az els osztly egy pldnya a
msodik osztlynak sok pldnyval llhat kapcsolatban, a msodik osztly pldnyai
viszont legfeljebb csak eggyel az els osztly pldnyai kzl.

vrosa
1 orszga
Vrosa budapest:Vros
Orszga magyarorszg
:Orszg eger:Vros
1..*
Orszg Vros
usa:Orszg newYork:Vros

pcs:Vros

2
* dniel:Ember
Ember mria:Ember
kati:Ember
0..1 Gyereke zsuzsa:Ember
zsfi:Ember
Anyja
erzsbet:Ember gyereke
zoli:Ember
anyja

6.5. bra. Egysok kapcsolat

Elemezzk a 6.5. bra eseteit:

1. Az Orszg s Vros kapcsolata egysok. Minden orszghoz legalbb egy vros tarto-
zik (1..*; nincsen orszg vros nlkl), s minden vroshoz ktelezen egy orszg kap-
csoldik (nincs olyan vros, amelyiknek ne lenne orszga, illetve tbb orszghoz tartoz-
nk). A kapcsolat teht mindkt irnyban ktelez. Az objektumdiagram szerint hrom
magyar vros van, s egy amerikai. A kapcsolat gyenge tartalmazsi kapcsolat: egy
vros, ha kell, tkapcsolhat egy msik orszghoz. A kapcsolat ktirny, az orszg s
vros meg tudja szltani egymst.

2. Itt az Ember sajt magval ll kapcsolatban. A szereplk teht emberek, de a krnyezet


az anyagyerek kapcsolatot hangslyozza. Elvileg mindenki lehet anya, s egy anynak
6. Trstsi kapcsolatok 6.2. Osztlyok kztti trstsi kapcsolatok 93

akrhny gyereke lehet (*). Egy embernek nulla vagy egy anyja lehet (0..1), legalbbis
ebben a rendszerben. Az objektumdiagramon Mrinak nincs gyereke; Zsuzsnak egy
gyereke van: Dniel; Erzsbetnek kt gyereke van: Zsfi s Kati; Zoli anyjt nem
regisztrltk.

Soksok kapcsolat

Kt osztly kztti soksok kapcsolatban a kt osztly brmely pldnya a msik


osztlynak sok pldnyval llhat kapcsolatban.

A 6.6. bra esetei:

1. Els esetben a kapcsolat a Tanfolyam s a Hallgat osztly kztt ll fenn. Egy


tanfolyam ltszma 2 s 10 kztt lehet, egybknt a tanfolyamot meg kell szntetni
vagy kett kell osztani. Egy hallgat egy vagy tbb tanfolyamra jr. Ha egyre sem jr,
trlni kell a nyilvntartsbl.

2. Itt a Hallgat osztly nmagval ll kapcsolatban: a hallgatk ismerik, illetve ismer-


hetik egymst. Brmelyik hallgat ismerhet brmely ms hallgatt, de lehet olyan
hallgat is, aki senkit sem ismer, vagy akit senki sem ismer.

1
Tanfolyamok: Hallgatk:
Kpzi
Jr gprs andi
Tanfolyam 1..* 2..10 Hallgat
angol gyuszi

szmtech. anita

dvid

2
Hallgatk:

Hallgat * pter balzs

* Ismeri tams blint

gbor

6.6. bra. Soksok kapcsolat


94 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Az osztlydiagram (class diagram) az osztlyokat s azok kapcsolatait brzol diagram.


Az objektumdiagram az osztlydiagram elfordulsa, pldnya. Az osztlydiagram rgzti
az objektumok kztti kapcsolatok szablyait.
Kt osztly kztti trstsi kapcsolat fbb jellemzi: ismeretsgi vagy tartalmazsi
kapcsolat (ha tartalmazsi kapcsolat, akkor ers vagy gyenge); nv; multiplicits (egyegy,
egysok vagy soksok jelleg; ktelez vagy opcionlis); szerepnv; megszorts.

6.3. A trstsi kapcsolat megvalstsa


A kliensobjektumnak (a kr objektumnak) ismernie kell a szerverobjektumot (kiszolgl
objektumot), mskppen nem tudja azt megszltani. A program ksztsekor a trstsi kap-
csolatot nyelvi szinten meg kell valstani. Ezt gy tehetjk meg, hogy a kliensobjektumban
felvesznk egy szerverre vonatkoz referencit. Az, hogy egy objektum kapcsolatban ll egy
msik objektummal, az objektum tulajdonsga. Ezt a tulajdonsgot azonban az UML brn
nem szksges explicit mdon megadni, mert a trstsi tulajdonsgokat a nyilak egyrtelmen
kifejezik. A kapcsolatokat megad tulajdonsgokat csak a program megvalstsakor, a kdban
(pszeudokdban) kell felvennnk.

kliens szerver

:Ember egyik:Aut Ember


dvid aut Aut
nv=Dvid tpus=Peugeot nv
aut=egyik rendszm=BIT745 aut:Aut tpus
rendszm
:Ember aut msik:Aut
anita Ember(...) Aut(...)
nv=Anita tpus=Mazda megy(...) megy(...)
aut=msik rendszm=GXT912 vezet() defektetKap()
...

6.7. bra. Az egyegy kapcsolat megvalstsa

Az egyegy kapcsolat megvalstsa


A 6.7. brn lthat Ember-Aut egyegy multiplicits, ktelez kapcsolat a kvetkezt
jelenti: ha ltrehozunk egy Ember objektumot, akkor annak azonnal lesz egy autja is (ezt az
Ember konstruktora fogja biztostani). Az objektumdiagramon kt ember szerepel: referenci-
juk dvid s anita ms objektumokbl gy lehet rjuk hivatkozni. Mivel az ember ismeri
6. Trstsi kapcsolatok 6.3. A trstsi kapcsolat megvalstsa 95

az autt, az emberben szerepelnie kell egy autra vonatkoz referencinak (aut:Aut), hogy
meg tudja azt szltani, pldul gy: aut.defektetKap(). A kt emberben lv referencia
termszetesen ms-ms objektumot azonost: a dvid objektum aut nev referencija az
egyik, az anita objektum aut nev referencija pedig a msik autra mutat. Kt kln-
bz autrl van teht sz, pldul gy lehet ket megszltani:
dvid.aut.defektetKap();
anita.aut.megy();

Egyegy kapcsolat esetn a referencia ktflekppen kaphat rtket:


A kliens maga ltrehozza a szervert, ekkor a referencia automatikusan azonostja az j
objektumot:
aut = new Aut()
Egy mr ltez objektumra hivatkozunk. Ennek rdekben a kliensobjektumban felve-
sznk egy referenciatulajdonsgot, s ezt rirnytjuk a mr ltez szerverobjektumra,
pldul:
dvid.aut = anita.aut
Ez utbbi rtkads itt azt jelenti, hogy Anita autja Dvid (is) lett: az rtkads utn
Dvid ugyanarra az autra mutat, amelyikre Anita. A referencia tirnytst a 6.8. bra
szemllteti. Dvid autja most senki, azt mindjrt elviszi a szemetes. No s ki most
Anita autja? Dvid vagy Anit? Anittl az autt nem vettk el, gy ht ez az aut
most kzs. Csak az a problma, hogy ez az objektumdiagram egyltaln nem tartja be
az osztlydiagram ltal fellltott szablyt, miszerint mindenkinek pontosan egy autja
van.

A kapcsolat minden jellemzjt (multiplicits, tartalmazsi/ismeretsgi stb.) a programoznak


kell megvalstania: a programot gy kell kdolnia, hogy rvnyesljenek a megadott szab-
lyok. A 6.8. bra objektumdiagramja nem felel meg a 6.7. bra osztlydiagramjnak, hiszen itt
nem valsul meg az egyegy kapcsolat.

Ki ez az aut? Senki?
:Ember egyik:Aut
dvid
nv=Dvid tpus=Peugeot
aut=msik rendszm=BIT745
s ez kzs?

anita :Ember msik:Aut Hmmm. Ez nem felel meg


nv=Anita tpus=Mazda az osztlydiagramnak!!!
aut=msik aut
rendszm=GXT912

6.8. bra. A referencia tirnytsa


96 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Az egysok kapcsolat megvalstsa a kontner


Az egysok kapcsolat megvalsthat gy, hogy a kliensben egyszerre tbb referencit
vesznk fel:
auto1, auto2, auto3, ...: Auto

Az egysok kapcsolatot azonban tipikusan kontnerobjektumok segtsgvel szoks kdolni. A


kontner dolga, hogy a beledobott objektumokat trolja, megjegyezze azok sorrendisgt,
abban egy adott objektumot megkeressen, s szksg szerint kiadja a krt objektum refe-
rencijt (az objektum a kontnerben marad, csak a kliens kapcsolatba kerl a kontnerben
"lak" szerverrel). A kiadott objektumnak aztn zeneteket lehet kldeni. A kontner-
objektumot az osztlydiagramon az egy s a sok objektum kz tesszk.

add(aut) egyik:Aut
aut = next(egyik) tpus=Peugeot
... rendszm=BIT745
:Ember
nv=Dvid autk:Kontner
aut=msik msik:Aut
tpus=Mazda
Aut(...) rendszm=GIT912
aut.megy(...)
aut.defektetKap()
...

Ember Kontner Aut

nv tpus
autk:Kontner size(): number rendszm
*
aut: Aut add(obj: Object)
first(): Object Aut(...)
Ember(...) next(obj: Object): Object megy(...)
megy(...) rNext(obj: Object): Object defektetKap()
vezet() prev(obj: Object): Object ...
rPrev(obj: Object): Object
remove(obj: Object)
clear()

6.9. bra. Egysok kapcsolat megvalstsa: a kontner


6. Trstsi kapcsolatok 6.3. A trstsi kapcsolat megvalstsa 97

A 6.9. bra egyttmkdsi diagramja szerint egy embernek sok autja lehet. Az ember s az
autk kztt egy autk nev kontnerobjektum dolgozik, az felelsge az autkat nyil-
vntartani. Az embernek nem kell bajldnia annak megjegyzsvel, hogy hny s milyen
tpus autja van; csak sorban kikri autit a kontnertl, megkrdezi a tulajdonsgaikat s
zeneteket kld nekik. A kontner ismeri sszes autjt, tlk egy kis segtsget is kr: minde-
gyiket megkri, hogy jegyezze meg az utna kvetkez objektumot (ezt az brn gy fejeztk
ki, hogy minden aut mutatja a kvetkez autt).
Pldaknt tegye be Dvid az brn lthat kt autt az autk kontnerbe. Ezutn zenje azt a
kontnerben lev els autnak, hogy menjen, a msodiknak pedig azt, hogy kapjon defektet:
aut: Aut
autk: Kontner = new Kontner()
autk.add(new Aut("Peugeot","BIT745"))
autk.add(new Aut("Mazda","GIT912"))
...
aut = autk.first()
aut.megy()
aut = autk.next(aut)
aut.defektetKap()
Az osztlydiagramon az egyttmkdsi diagramnak megfelelen az Ember s az Aut
osztly kz tesszk a Kontner osztlyt, s belerjuk a feladatait. Az Ember osztlyban
felvettnk egy aut referencit a kontner egyes autinak azonostshoz.

A Kontner osztly metdusai


size(): number
Visszaadja a kontner mrett, vagyis azt, hogy hny objektum van benne pillanatnyilag.
add(obj: Object)
Objektum hozzadsa a kontnerhez.
first(): Object
A trols szerinti els objektum referencijnak kiadsa.
next(obj: Object): Object
rNext(obj: Object): Object
obj-hoz kpest a kvetkez objektum referencijnak kiadsa. Az utols objektum utn
next a null referencit adja vissz (vge a listnak), rNext pedig az elst (round Next,
vagyis krbe megy).
prev(obj: Object): Object
rPrev(obj: Object): Object
obj-hoz kpest az elz objektum referencijnak kiadsa. Az els objektum utn prev
a null referencit adja vissza (vge a listnak), rPrev pedig az utolst (round Prev,
vagyis krbe megy).
remove(obj: Object)
obj objektumot trli a kontnerbl.
clear()
Az sszes objektumot trli a kontnerbl.
98 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

A kapcsolat minden jellemzjt (multiplicits, tartalmazsi/ismeretsgi stb.) a programoz-


nak kell megvalstania: a programot gy kell kdolni, hogy rvnyesljenek a
megadott szablyok.
Az egyegy kapcsolatot gy valstjuk meg, hogy az egyik osztlyban felvesznk egy
referenciatulajdonsgot.
Az egysok kapcsolatot tipikusan kontnerobjektumokkal valstjuk meg, de megval-
sthat tbb referenciatulajdonsg definilsval is.

Tesztkrdsek

6.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) Az ismeretsgi kapcsolat egyben tartalmazsi kapcsolat is.
b) A tartalmaz objektum megsznse maga utn vonja a tartalmazott objektum meg-
sznst.
c) Kompozci esetn a tartalmaz objektum ers tartalmazsi viszonyban ll objek-
tumaival.
d) Kt osztly kapcsolatnak multiplicitsa megadja, hogy a kapcsolat kt oldaln
sszesen legalbb hny objektumnak kell szerepelnie.
6.2. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az objektumdiagram objektumokat s azok trstsi kapcsolatait brzol diagram.
b) Egy objektumdiagrambl egyrtelmen megllapthat az osztlydiagram.
c) A gyenge tartalmazs azt jelenti, hogy a tartalmazott objektumot ki lehet venni a
tartalmazbl.
d) A ktelez kapcsolat azt jelenti, hogy az osztly minden objektumnak kapcsolatban
kell lennie legalbb egy objektummal a msik osztlybl.
6.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az osztlydiagram az osztlyokat s azok kapcsolatait brzol diagram.
b) Az osztlydiagram rgzti a lehetsges objektumok kztti kapcsolatok szablyait.
c) Ha kt osztly kztt nem adjuk meg a kapcsolat multiplicitst, akkor az nulla.
d) Kt objektum kztt a navigls irnyban kldhetk zenetek.
6.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Kt osztly kztti ktelez egyegy kapcsolat esetn az egyik osztly mindegyik
objektumhoz a msik osztlybl nulla vagy egy objektum tartozik.
b) Kt osztly kztti egysok kapcsolat esetn nem lehetsges olyan eset, hogy az
egy oldalon lev objektumhoz ne tartozzk objektum a sok oldalon.
c) Kt objektum kztt egy kapcsolatot gy valstunk meg, hogy az egyik objektum-
ban felvesszk a kapcsold objektum referencijt.
d) Csak objektumok kztt lehet tartalmazsi kapcsolat, osztlyok kztt nem.
6. Trstsi kapcsolatok 6.3. A trstsi kapcsolat megvalstsa 99

Feladatok
6.1 (A) Hatrozza meg a kvetkez objektumcsoportok osztlydiagramjt, s ksztsen
mindegyikhez legalbb kt objektumdiagramot:
Aut, sofr
Ember, testrszek
Laks, telefon
Hz, laks
Emberek hzastrsi viszonya
Talljon ki tovbbi pldkat!
100 II. RSZ. OBJEKTUMORIENTLT PARADIGMA
7. rklds 7.1. Az rklds fogalma, szablyai 101

7. rklds

A fejezet pontjai:
1. Az rklds fogalma, szablyai
2. Az utd osztly pldnynak adatai s a kldhet zenetek
3. Egyszeres, tbbszrs rkls
4. Az interfsz fogalma
5. Lthatsg (hozzfrsi md, vdelem)

Az rklds kt osztly kztt rtelmezett kapcsolat: az rkldssel specilis osztlyt ksz-


tnk egy ltalnos osztly tulajdonsgaira tmaszkodva. E fejezetben az rkldssel kapcso-
latos alapismereteket trgyaljuk.

7.1. Az rklds fogalma, szablyai


Az ltalnosts folyamatban kzs jellemzket emelnk ki tbb dolog lersbl. A specia-
lizlssal egyedi jellemzket adunk egy mr meglev dolog lershoz. Specializlssal egy
mr meglev osztly tulajdonsgait s kpessgeit felhasznlva jabb osztlyt kszthetnk. A
meglv osztly az sosztly, a specializlt pedig az utdosztly, ms szval kiterjesztett
osztly. A specializlt osztly rkli az sosztly adatait s metdusait, azokhoz jabbakat
adhatunk, vagy mdosthatjuk a mr meglvket. A 7.1. bra az rklds jellst mutatja
UML-ben. Az utdosztlybl egy nyl mutat az sosztlyra; a nyl hegye egy res, zrt hrom-
szg. A nyl irnya a fggsget szndkozik kifejezni: az utdosztly fgg az sosztlytl.
Tbb utd esetn rajzolhatunk kln nyilakat is, de ssze is hzhatjuk ket az brn lthat
mdon. A specializlst az OO paradigmban az osztlyok kztti az egy ... kapcsolatnak,
vagy ms nven olyan, mint ... kapcsolatnak is szoks nevezni.
Elemezzk a 7.1. brn tallhat kt esetet:

1. Az Ember-nek van pozcija s IQ-ja (intelligence quotient = intelligenciahnyados), vala-


mint megy, tanul s beszl. A Hallgat osztly az Ember egy specializcija (A hallgat
az egy ember.). A hallgat rkli az ember tulajdonsgait s kpessgeit. sszessgben
van teht pozcija, IQ-ja s osztlyzata, valamint megy, tanul s beszl. De a tanul
102 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

kpessge t van rva, gy a hallgat mskpp tanul, mint az tlagember valsznleg


intenzvebben. A Tanr osztly is az Ember osztly specializcija (A tanr is ember.)
a tanrnak van pozcija, IQ-ja, elrhetsge s tananyaga (amelyet kifejlesztett), valamint
megy, tanul, beszl s tant. Lthat, hogy itt egy j kpessg jelent meg, hiszen nem min-
den ember tud tantani, csak a tanr. A tanr beszl kpessge az emberhez kpest t van
rva, nyilvn sokkal grdlkenyebben beszl.

2. A Dialog ablaknak van helyzete (location), mrete (size) s van kt nyomgombja


(Button). A FileDialog osztly a Dialog osztly kiterjesztse, segtsgvel bekrhetjk
egy fjl nevt a felhasznltl. A FileDialog osztly termszetesen rkli a Dialog
osztly adatait s kapcsolatait is, ezrt egy FileDialog ablaknak is van helyzete s
mrete, s lesznek nyomgombjai is. j kpessgknt megjelennek a fjl lekrdez-
st/belltst elvgz metdusok (getFile/setFile).

2
1 Ember 2 Dialog Button
pozci(x,y) location(x,y)
IQ size(width,height)
megy()
setLocation() sosztlyok
tanul()
setSize()
beszl()

Hallgat Tanr FileDialog


osztlyzat elrhetsg file:String Utdosztlyok
tananyag
getFile():String
tanul() tant() setFile(file:String)
beszl()
Ez egy megjegyzs az UML-ben

7.1. bra. rklds jellse az UML-ben

A szrmaztats tbb szinten t folytatdhat a Hallgatbl szrmaztathatnnk pldul jabb


osztlyokat: SzorgalmasHallgat, LustaHallgat. Brmely metdus elvileg ismeri s
7. rklds 7.1. Az rklds fogalma, szablyai 103

hasznlhatja a sajt osztlyban s a felette lv osztlyokban deklarlt sszes adatot s met-


dust. A belle szrmaz dolgokat termszetesen mg nem ismerheti.

Hozzunk ltre klnbz pldnyokat az Ember, a Hallgat s a Tanr osztlyokbl, s


vizsgljuk meg, ki mire kpes (7.2. bra): legyen gerg egy Ember, zsolt s bea hallgat,
goston pedig tanr. zsolt s bea ugyangy beszl, mint gerg; goston mr sokkal
meggondoltabban. Sem gerg, sem zsolt, sem bea nem tud tantani, goston viszont igen.
goston s gerg egyformn tud tanulni, zsolt s bea viszont sokkal intenzvebben. A pl-
dnyok egsz letk sorn pontosan tudni fogjk osztlyukat, s automatikusan gy viselked-
nek, ahogy az az osztlyukban meg van hatrozva.

Ember

pozci
IQ gerg
megy()
tanul()
beszl()

Hallgat Tanr
zsolt
osztlyzat elrhetsg
tananyag goston
tanul() tant()
bea
beszl()

7.2. bra. Ki mire kpes?

Egy osztly rktsekor hrom lehetsgnk van:


j vltozkat adunk hozz az sosztlyhoz;
j metdusokat adunk hozz az sosztlyhoz;
az sosztly metdusait trjuk (fellrjuk).

Az els kt t az osztly bvtse, a harmadik annak megvltoztatsa. Az sosztly adatait


sosem lehet trni.
104 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Megjegyzs: j adatok megadsa j metdusok nlkl ltalban rtelmetlen, hiszen egyrszt


az j adattal j viselkeds is megjelenik, msrszt az adatokat metdusokkal szoks elrni
(informci elrejtse). Az smetdusok nyilvnvalan nem ismerhetik az jonnan deklarlt
adatokat.

Elnevezsek
sosztly (ancestor class) = szuperosztly (superclass): Amibl rktnk.
Utd (descendant) = leszrmazott = szrmaztatott (derived) = kiterjesztett (extended)
= specializlt (specialized) osztly = alosztly (subclass): Az rkl osztly.
Kzvetlen s (immediate ancestor): A legkzelebbi rkt valamelyike.
Kzvetlen utd (immediate descendant): A legkzelebbi rkl valamelyike.
Alaposztly (base class): A hierarchia legfels osztlya(i).

Megjegyzs: Az sutd kapcsolatra szoks mg a szlgyerek kapcsolat (parantchild


relationship) elnevezst is hasznlni. Ez azonban nha zavart okozhat, mert a szakirodalom
sok helyen az egszrsz kapcsolatra hasznlja ezt az elnevezst.

Szablyok
Egy osztlybl tbb osztly is szrmaztathat.
A hierarchia mlysge tetszleges, de: 5 mg ajnlott, 10 felett ttekinthetetlen.
Az rkls tranzitv: Ha A rkli B-t s B rkli C-t, akkor A rkli C-t.
Pldnyadatok rklse: Az utdosztly pldnyainak adatai = s adatok + sajt (utd)
adatok. Az utdosztly metdusaiban hasznlhat brmely sajt s s adat.
Pldnymetdusok rklse: Brmely metdust fell lehet rni.
Az utdosztly pldnynak kldtt zenet mindig a fellrt (az rklsi gon az
utdhoz legkzelebbi) metdus vgrehajtst jelenti.
Az utdosztly metdusaiban hasznlhatk a legkzelebbi s metdusok.
Az utdosztly az sosztly kapcsolatait is rkli.

Az ltalnosts (generalization) az a folyamat, amellyel tbb dolog lersbl kiemeljk a


kzs jellemzket. A specializls (specialization) olyan folyamat, amelyben egy mr
meglv dolog lershoz egyedi jellemzket adunk hozz.
Az rklds (inheritance) kt osztly kztti kapcsolat; az abban szerepl utdosztly,
ms szval kiterjesztett osztly (descendant class, extended class) az sosztly (ancestor
class, superclass) specializlsa (kiterjesztse, szrmaztatsa, tovbbfejlesztse) sorn
keletkezett.
Osztlydiagram (class diagram): Olyan diagram, amely az osztlyokat s a kzttk lv
trstsi s rklsi kapcsolatokat brzolja. Osztlyhierarchia-diagram (class hierarchy
diagram): csak rklsi kapcsolatokat brzol osztlydiagram.
7. rklds 7.2. Az utd osztly pldnynak adatai s a kldhet zenetek 105

7.2. Az utd osztly pldnynak adatai s a kldhet zenetek


Kvessk most vgig az adatok s metdusok rklsi szablyait egy plda segtsgvel! A
7.3. brn az s osztly adatai: az a s b, metdusai pedig: az m1 s m2. Az Utd osztlyban a
c s d adatot, valamint az m1 s m3 metdust deklarltuk. Az utdban teht m1 az s m1 fell-
rsa, m3 pedig egy jonnan bevezetett metdus. Mindkt osztlybl ltrehozunk egy-egy
pldnyt: az o1 s o2 objektumot.

Milyen adatokat tartalmaznak az egyes pldnyok? o1-nek kt adata lesz: a s b; o2-nek


mr ngy: a, b, c s d, hiszen c-t s d-t az utdban deklarltuk, a s b pedig rklt adat.
Milyen zenetek kldhetk az egyes pldnyoknak? Az s osztly pldnynak kldhet
zenetek egyrtelmek, hiszen az osztlyban deklarlt sszes metdus meghvhat (s.m1 s
s.m2). Nzzk most meg, milyen zenetek kldhetk az Utd osztly pldnynak, o2-nek!
Minden olyan metdus hvhat, amely az rklsi gon megtallhat a krds csak az: val-
jban melyik hajtdik vgre? Termszetesen az, amelyik az rklsi gon kzelebb ll az Utd
osztlyhoz. Ez azt jelenti, hogy ha van az objektum osztlyban ilyen nev metdus, akkor az
hajtdik vgre, ha nincs, akkor a keress felfel halad az rklsi gon. Az o2-nek hrom
zenet kldhet: m1, m2 s m3; o2.m1 s o2.m3 hatsra az Utd osztly metdusai hajtdnak
vgre, hiszen m1-et fellrtuk, m3 pedig j metdus; o2.m2 hatsra pedig az s metdusa
kerl vgrehajtsra, mert az Utd osztlyban nincs ilyen nev metdus.

Kldhet zenetek Mi hajtdik vgre?

s
a o1: s m1 s.m1
b m2 s.m2
a, b
m1
m2

Utd
o2: Utd m1 Utd.m1
c
d a, b, m2 s.m2
c, d m3 Utd.m3
m1
m3

7.3. bra. Utd pldny adatai, kldhet zenetek


106 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

7.3. Egyszeres, tbbszrs rkls


Egyszeres rklsrl akkor beszlnk, ha egy osztlynak csak egy kzvetlen se lehet. A
tbbszrs rkls azt jelenti, hogy egy osztlynak tbb kzvetlen se is lehet. A 7.4. brn a
LakKocsi ugyangy rkli a Laks jellemzit (lehet benne lakni, van benne htszekrny,
lgarnitra stb.), mint a Kocsi-t (rszt vesz a kzlekedsben, kereke van, autszerelhz
kell vinni stb.). Egyes programozsi nyelvek megengedik a tbbszrs rklst, msok nem.
Ennek az az oka, hogy a tbbszrs rkls megvalstsa lnyegesen bonyolultabb, mint az
egyszeres, hiszen az, hogy az skben elfordulhatnak ugyanazok az azonostk (pl. a laks-
ban s a kocsiban is lehet ablak vagy kszb), elvi s programtechnikai nehzsgekkel jr.

Laks Kocsi

LakKocsi

7.4. bra. Tbbszrs rkls

Ha az osztlynak tbb kzvetlen se is lehet, akkor tbbszrs rklsrl (multiple


inheritance) beszlnk, egybknt egyszeres rklsrl (single inheritance).

Megjegyzsek:
- A Javban, a Pascalban s a Smalltalkban csak egyszeres rkls van, a C++ s a CLOS
nyelv megengedi a tbbszrs rkls alkalmazst.
- A tbbszrs rklst helyettesteni lehet ismeretsgi/tartalmazsi kapcsolatok felpts-
vel, illetve interfszekkel.

7.4. Az interfsz fogalma

Egy interfsz (interface) metdusfejeket definil abbl a clbl, hogy valamely osztly azt
a ksbbiekben implementlja, megvalstsa. Az implementl osztly specilis utdja az
interfsznek. Egy osztly tbb interfszt is implementlhat, fggetlenl attl, hogy milyen
osztlyokat rkl.

Az interfsz: kpessgek gyjtemnye. Az interfsz a metdusoknak csak a formjt adja meg,


azokat nem valstja meg. Egy osztly gy implementl egy interfszt, hogy megrja az ott
7. rklds 7.4. Az interfsz fogalma 107

megadott metdusokat. Az implementcit az UML-ben az rklsnl bemutatotthoz hasonl,


de szaggatott nyl jelzi (7.5. bra). A 7.5. brn kt interfsz szerepel:
a Repl interfsz: definilja a felszll(), leszll() s repl() metdusokat;
az UtasSzllt interfsz: definilja a ltszm(), beszll(utas) s kiszll(utas) met-
dusokat.
A repl s az utasszllt sz itt nem fnv, hanem mellknv mindkett kpessgeket fejez
ki (repl madr, utasszllt jrm stb.). Ha egy osztly implementl egy ilyen interfszt,
akkor biztosak lehetnk benne, hogy az osztlyban implementlva vannak ezek a metdusok;
objektumaiban teht meglesznek a megadott kpessgek, s meg lehet ket krni az
interfszben felsorolt feladatok elvgzsre. A 7.5. brn hrom osztly szerepel:
a Madr Repl, mert implementlja a Repl interfszt.
a ReplGp szintn Repl, mert is implementlja a Repl interfszt nyilvn-
valan egszen mskpp, mint a madr. A Repl UtasSzllt is egyben.
az AutBusz UtasSzllt, de nem tud replni.

Az interfszt implementl osztly termszetesen ms metdusokat is tartalmazhat. A megfe-


lel interfsz megvalstsra szerzdst kttt, gy az osztly hasznlja szmthat r, hogy
az interfszben megadott metdusok mindenkppen meg vannak valstva.

interfsz interfsz
Repl UtasSzllt
felszll() ltszm() Interfszek
leszll() beszll(utas)
repl() kiszll(utas)

Madr ReplGp AutBusz

felszll() felszll() ltszm()


leszll () leszll () beszll(utas)
repl() repl() kiszll(utas) Implementl osztlyok
eszik() ltszm() megy()
etet() beszll(utas) vrakozik()
fszketRak() kiszll(utas)

7.5. bra. Interfszek


108 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

7.5. Lthatsg (hozzfrsi md, vdelem)


A mosgpnek legyenek egyrtelmek a gombjai n majd kapcsolgatom, s ha
nem vgzi el azt, ami le van rva, akkor elviszem a szervizbe. Amihez nem szabad
hozznylnom, ahhoz ne is lehessen hozznylni ezt a szerviz is gy akarja,
meg n is!
Mr sz volt rla, hogy az adatokat semmikppen sem ajnlatos kvlrl manipullni, s van-
nak olyan metdusok is, amelyeket a kls felhasznlk ell el kell zrni, mert a kls
felhasznlk bajt okozhatnak ezeknek a meghvsval. Nzzk most meg rszletesebben, ki
ell s hogyan lehet elrejteni egy osztly deklarciit!

Az osztly deklarciinak lnyegben hromfle lthatsga vagy hozzfrsi mdja


(visibility, access mode) ltezik:
- Nyilvnos (public): Minden vele kapcsolatban ll kliens elri s hasznlhatja; UML
jellse: +
- Vdett (protected): Hozzfrs csak az osztlybl s az osztly leszrmazottaibl
lehetsges; UML jellse: #
- Privt (private): Az osztly privt deklarcija, csak az osztly sajt metdusai frhet-
nek hozz; UML jellse: -

Az osztly deklarciit az ell kell vagy lehet vdeni, aki az osztlyt hasznlni akarja. Egy ksz
osztlyt lnyegben ktflekppen lehet hasznlni:

Az osztlybl pldnyt hozunk ltre (7.6. bra):


Egy objektumnak kizrlag csak a publikus deklarciit lehet elrni. A privt (private)
s vdett (protected) deklarcikat az objektum megszltsval nem lehet hasznlni.
Az osztlybl rktssel j osztlyt hozunk ltre (7.7. bra):
Az rktskor az j, utdosztlyban felhasznljuk a mr meglv osztly adatait s
metdusait. Igaz, hogy az j osztlyt valsznleg gyakorlott programoz kszti el,
mgis felmerl a krds: megengedjk-e az sszes adat, illetve metdus hasznlatt?
Egy jl beprogramozott osztly adatai, metdusai ltalban csak egytt kpesek jl dol-
gozni ha azok kzl nmelyeket trunk (akr vletlenl is), akkor tnkretehetjk az
osztly mkdst. Ezrt egy osztly rja eldntheti, hogy mely adatokat s metdu-
sokat enged fellrni, s melyeket nem. A gyakorlott programoznak is knyelmesebb, ha
az osztlyt btran hasznlhatja, nem kell flnie attl, hogy elront valamit. A privt
(private) deklarcikat csak az osztly programozja rheti el, azokhoz mg rkls
rvn sem lehet hozzfrni. A nyilvnos (public) s vdett (protected) deklarcikat az
utdosztly hasznlhatja, hivatkozhat rjuk.
7. rklds 7.5. Lthatsg (hozzfrsi md, vdelem) 109

Osztly objektum.publikusAdat
+publikusAdat
objektum.publikusMetdus
#vdettAdat objektum
-privtAdat :Osztly
+publikusMetdus
objektum.vdettAdat
#vdettMetdus
objektum.vdettMetdus
-privtMetdus
objektum.privtAdat
objektum.privtMetdus

7.6. bra. Objektum vdelme

Osztly
+publikusAdat
#vdettAdat
-privtAdat
+publikusMetdus
#vdettMetdus
-privtMetdus

Hivatkozsok a metdusban:
UtdOsztly
publikusAdat
vdettAdat
privtAdat
egyMetdus
publikusMetdus
vdettMetdus
privtMetdus

7.7. bra. Osztly vdelme

Az osztlyokat csoportostani lehet: a logikailag sszetartoz osztlyokat csomagokba


(package) foglaljk. A teljessghez hozztartoznak mg a kvetkez szablyok:
A lthatsgot nem ktelez megadni. A lthatsg alaprtelmezse az n. csomag
szint lthatsg, ez azt jelenti, hogy a deklarci az aktulis csomagban nyilvnos.
110 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Az osztlyoknak is van lthatsguk: a publikus osztly ms csomagokbl is lthat;


alaprtelmezsben egy osztly csak a sajt csomagjban lthat.
Az sszes lthatsgi jel elhagysa egy UML brn azt is jelentheti, hogy nem adjuk meg a
lthatsgot.

Tesztkrdsek

7.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) A specializls az a folyamat, melyben tbb dolog lersbl kiemeljk a kzs
jellemzket.
b) Az ltalnosts az a folyamat, melyben tbb dolog lersbl kiemeljk a kzs
jellemzket.
c) Az rklds objektumok kztt rtelmezett kapcsolat.
d) Ha a B osztly utdja az A osztlynak, akkor a B osztly hivatkozhat az A osztly
sszes privt metdusra.
7.2. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az osztlyok kztti rklsi kapcsolatot az egy ... kapcsolatnak is szoks
nevezni.
b) Az rkl osztly az s kapcsolatait is rkli.
c) Az utdosztly pldnya csak azokat az adatokat tartalmazza, melyeket az
utdosztlyban deklarltak.
d) Az alaposztly az osztlyhierarchia teteje.
7.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Egy osztlyhierarchia-diagram az osztlyok kztti rklsi s trstsi kapcsolato-
kat egyarnt brzolja.
b) Egy osztlyhierarchia-diagram csak az osztlyok kztti rklsi kapcsolatokat
brzolja.
c) A tbbszrs rkls jelentse: az sosztlynak tbb kzvetlen utdja is lehet.
d) A tbbszrs rkls jelentse: az utdosztlynak tbb kzvetlen se is lehet.
7.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az osztlydiagram csak az osztlyokat s azok trstsi kapcsolatait brzolja.
b) Az interfsz metdusfejeket definil abbl a clbl, hogy azokat majd egy osztly
implementlja.
c) Egy osztly tbb interfszt is implementlhat.
d) Ha azt akarjuk, hogy egy metdust az osztlyon kvl ms senki se hasznlhasson,
akkor azt vdettnek (protected) kell definilnunk.
7.5. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A nyilvnos deklarcit mindenki ltja, teht az osztly egy pldnynak hasznlja
s az osztly utdja is.
b) A vdett deklarcit mindenki lthatja, aki megszltja az osztly valamely objektu-
mt.
c) A privt deklarcit kizrlag az osztly s annak leszrmazottai ltjk.
d) A vdett deklarci ersebb vdelmet ad, mint a privt deklarci.
8. Egyszer OO terv Esettanulmny 8.1. A fogalmak tisztzsa 111

8. Egyszer OO terv Esettanulmny

A fejezet pontjai:
1. A fogalmak tisztzsa
2. Gyuszi jtka fejlesztsi dokumentci

A szoftver fejlesztsnek fzisairl s az egyes munkafolyamatokrl a knyv 3. fejezetben


esett sz. E fejezet clja, hogy altmassza eddigi szoftverfejlesztsi s OO tervezsi ismere-
teinket, s megmutassa, hogyan lehet egy kis szoftvert lpsrl lpsre elkszteni. A fejezet
els rszben tisztzunk nhny, a megoldshoz nlklzhetetlen fogalmat, s megadunk
nhny fejlesztsi fogst. A msodik rsz a mintafeladat fejlesztsi dokumentcija: a kve-
telmnyspecifikci, a kpernyterv, a szakterleti objektummodell, a hasznlati esetek felso-
rolsa, a programterv s a pszeudokd.
Fontos tudni, hogy az itt trgyalt mintaprogram Java nyelven trtn megrsa mg nagyon sok
ismeret elsajttst ignyli ettl fggetlenl a forrskd megtekinthet a programozssal
val bartkozs cljbl. Nem gondolom azonban, hogy a fejezet elolvassa utn a fejleszts-
ben mg nem jrtas Olvas meg tudna oldani ehhez hasonl feladatokat, vagy legalbb a terve-
zskkel megbirkzna. De most nem is ez a cl, hanem az, hogy az Olvas kell ttekintst
kapjon az OO rendszerekrl, majd annak birtokban knnyedn elsajtthassa a Java nyelv
elemeit, s ne vesszen el a kdols meg a hibakeress tvesztiben.

Futtassa a GyusziJateka programot! Ehhez lapozzon a 9. fejezethez, s jrjon el az ott


lertak szerint!
Megjegyzs: A Gyuszi jtkhoz hasonl programok elksztshez csak a 2. ktet ad majd
elegend ismeretet.

8.1. A fogalmak tisztzsa


Elszr megfogalmazzuk, milyen szoftvert szeretnnk kszteni, ezutn tisztzzuk a szmt-
gpes szimulci fogalmt, tismteljk az egyszer OO fejleszts munkafolyamatait, doku-
mentciit, s vgl beszlnk majd az algoritmusvezrelt s az esemnyvezrelt programrl.
112 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

A ksztend szoftver
Gyuszinak hamarosan itt a szletsnapja, erre szeretnnk egy szemlyes jtkot kszteni.
Lelnk vele beszlgetni, megprbljuk kifaggatni, hogy mire vgyna. Kiderl, hogy legin-
kbb egy olyan szmtgpes jtknak rlne, amely a mr ltez terepasztalt s a rajta
robog autit szimullja. Gyuszi gy szokott jtszani az autival, hogy knye-kedve szerint
megfordtja vagy arrbb teszi ket.
A feladatot meg szeretnnk oldani, vagyis el szeretnnk kszteni a Gyuszi jtka szoftvert.
Mieltt hozzltnnk a megoldshoz, tisztzunk nhny, a fejlesztshez szksges alapfogal-
mat.

Szmtgpes szimulci

A szimulci valamely ltez vagy elkpzelt rendszer viselkedsnek utnzsa. Szmt-


gpes szimulcival szoftveresen utnozzuk a rendszer mkdst gy, hogy a rendszer
minden egyes elemhez hozzrendelnk egy a szoftverben rtelmezhet dolgot.

Gyuszi jtkt szmtgpen kell ltrehoznunk. Ha ezt Gyuszi nem mondta volna, akkor lehet,
hogy a jtkboltban ktnnk ki, s mretre vgatnnk egy farostlemezt a terepasztalhoz. gy
azonban a feladatot szimullni fogjuk: a terepasztal nem igazi lesz, hanem egy ablakkeret a
kpernyn. A kisautk a szmtgp kpernyjn fognak robogni gy, hogy a megadott helyen
kirajzoldnak. Gyuszi aktor (a program hasznlja), a kisautkat most nem a kezvel, hanem
az egrrel fogja manipullni: ha kettt kattint az autn, akkor az 180 fokos fordulatot tesz,
vonszolssal pedig oda teheti, ahov akarja.

Egy egyszer OO fejleszts munkafolyamatai, dokumentcii


A Gyuszi jtka feladat arnylag kicsi, gy a fejlesztsre elegend egyetlen iterci; ennek a
kvetelmnyfeltrs, az analzis, a tervezs, az implementls s a tesztels lesznek a
munkafolyamatai. Ismteljk t ezeket a munkafolyamatokat nagy vonalakban!

Kvetelmnyfeltrs

Ebben a munkafolyamatban tisztzni kell a feladatot. A kvetelmnyfeltrs dokumentci-


ja a kvetelmnyspecifikci (feladatspecifikci), amely egyrtelmen lerja a feladat
irnti kvetelmnyeket.
8. Egyszer OO terv Esettanulmny 8.1. A fogalmak tisztzsa 113

Analzis

Az analzisnek az a feladata, hogy megvizsglja a feladat megoldhatsgt, s felvzolja a


megolds f vonalt. Egyszer feladat esetn az analzis dokumentcii a kvetkezk:
- szakterleti objektummodell;
- a hasznlati esetek felsorolsa;
- kpernytervek;
- a szmtgpes krnyezet s a fejleszteszkzk megadsa.

A szakterleti modell fellltshoz lnyegben nincs szksg specilis szmtgpes tudsra,


csupn szakterleti ismeretekre. Esetnkben ez azt jelenti, hogy a jtk modelljnek fell-
ltshoz rteni kell az autkhoz, de nem kell tudnunk pldul programozni. A szakterleti
modellt a csak a maga terletn jrtas szakember is rti. Az objektummodell elksztshez
be fogunk mutatni egy egyszer fogst, amely megknnytheti az objektumok megtallst s a
felelssgek sztosztst.

Tervezs

A programtervezsnek az a feladata, hogy az analzissel kialakult elkpzelseket tovbb-


fejlesztve rszletesen kidolgozza az ott megszletett tervet. A szakterleti modellbl
programterv lesz; az mr magba foglal szmtgppel kapcsolatos rszeket is, s mr csak
tapasztalt szoftverfejlesztnek lthat t.
Egy egyszer objektumorientlt program terve a kvetkez rszekbl ll:
- Osztlydiagram (class diagram): Az osztlydiagram a feladatban szerepl objektumok
osztlyt s azok (trstsi s rklsi) kapcsolatait brzolja. A rendszert egyetlen
osztlydiagram rja le. Az osztlydiagramon szerepel a rendszer sszes objektumnak
osztlya, mgpedig mindegyik osztly pontosan egyszer. Az osztlydiagramhoz osz-
tlylersok tartoznak. Ezekben az osztlydiagramon szerepl osztlyokat dokumentl-
juk, rszletezzk. Minden egyes osztlynak rviden lerjuk a feladatt, megadjuk leg-
fontosabb jellemzit, s szksg esetn lerjuk az egyes metdusok mkdst. Csak a
feladatspecifikus, a fejleszt ltal tervezett osztlyokat kell dokumentlni, a fejleszt-
eszkz ltal knlt osztlyokat nem. Az osztlydiagram kpezi az implementls
(kdols) alapjt.
- Egyttmkdsi diagramok (collaboration diagram): Az egyttmkdsi diagram
olyan objektumdiagram, amelyen feltntetjk az egyes objektumoknak kldtt zenete-
ket. Az egyttmkdsi diagramon osztlyok is szerepelhetnek az osztlyvltozk,
illetve osztlymetdusok hasznlata miatt. Az egyttmkdsi diagram segtsgvel
szemlletess tehetjk az egyes hasznlati eseteket, illetve opercikat mkds kz-
ben. Egy osztlydiagramhoz tbb egyttmkdsi diagram is tartozhat. Az egyttm-
kdsi diagram az osztlydiagram egy pldnya, a mkd program pillanatfelvtele.
114 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Implementls
A programterv alapjn a forrskd elksztse. Mi most az implementcit pszeudokdban
fogjuk megadni. A Java kd a knyv mellkletben megtallhat.

Tesztels
Ebben a munkafolyamatban a szmtgpen valban fut szoftver hibit keressk. Krem az
Olvast, hogy tesztelje a fut jtkot, s ha hibt szlel, rja meg a szerznek!

Egy mdszer az analzis objektummodelljnek fellltshoz


Az analzis objektummodelljnek fellltshoz ssze kell gyjteni a feladatban tallhat
sszes megoldand rszfeladatot, hasznlati esetet, s ki kell jellni azokat az objektumokat,
amelyek majd vgrehajtjk ezeket a feladatokat. Ezrt megprbljuk megkeresni a feladat fbb
objektumait, s meghatrozni, melyik mirt legyen felels. A hasznlati eset olyan feladat,
amelynek az aktor (hasznl) indtja el a vgrehajtst.

A fnevek s az igk szerepe a feladat szvegben


Vizsgljuk meg a feladat szvegezst! Nagyon fontos szrevtel, hogy az objektum neve lta-
lban fnv, az objektum ltal vgrehajtand tevkenysgek (metdusok) pedig igk. Kvet-
kezskppen, ha a feladat megfogalmazsa j, akkor szinte minden tlalva van. Olvassuk
teht vgig a feladat szvegt figyelmesen, s hzzuk al a fneveket folytonos, az igket
pedig szaggatott vonallal!
Mirt nagy segtsg ez?
A fnevek kivlasztsa azrt ad segtsget, mert a keresett objektumok szinte bizonyo-
san nevkn vannak nevezve a feladatban. Az OOP (objektumorientlt programozs)
emberkzeli programozs. Adjunk olyan nevet objektumainknak, amilyeneket a ht-
kznapokban is hasznlunk! Persze nem mindegyik fnv lesz objektum, hiszen az
objektumok tulajdonsgai is fnevek. A tallt tulajdonsgokat csoportostsuk a megfe-
lel objektumok kr.
Az igk kivlasztsa azrt nyjt segtsget, mert az igk fogalmazzk meg azokat a
feladatokat, amelyeket a program objektumai vgre fognak hajtani. Az aut megfordu-
lsa pldul az aut dolga. Vegyk teht sorra a feladat megfogalmazsban szerepl
igket (feladatokat), s gondolkodjunk el: van-e olyan objektum, amelyik ezt a feladatot
el fogja vgezni? Vgl minden feladatot ki kell osztani.

Egy fnevet, illetve igt elegend egyszer alhzni. A ragozott, kpzett s gyans eseteket is
vizsgljuk meg! Elkpzelhet termszetesen, hogy a feladat megfogalmazsa kiss hinyos,
vagy tl sok a szveg. Persze nem nyelvtanrn vagyunk, csak egyszeren segtsget szeret-
nnk kapni a feladat tervnek elksztshez. Egy biztos: az ilyen tgondols mindenkppen
segt az OO terv elksztsben.
8. Egyszer OO terv Esettanulmny 8.1. A fogalmak tisztzsa 115

Pldaknt prbljuk megkeresni Gyuszi jtknak objektumait, s hatrozzuk meg nagy vona-
lakban a felelssgeket! Csak a funkcionlis kvetelmnyeket boncolgatjuk. me, a feladat
megfogalmazsa (feladatspecifikci), az alhzott fnevekkel s igkkel:

Gyuszinak van egy 7x5 m-es terepasztala, amelyen kisautk robognak klnbz
irnyokban. Minden autjra jellemz annak szne s sebessge. Ha egy aut a
terepasztal falhoz r, ott rugalmasan tkzik, s a megvltozott irnyban folytatja
tjt. Gyuszi gy jtszik, hogy kedve szerint egy-egy autt megfordt vagy arrbb tol.
Elbb vagy utbb Gyuszi befejezi a jtkot ha rt egyet az asztalra, az autk
engedelmesen megllnak.
A feladatot egy egyprocesszoros szmtgpes krnyezetben kell szimullni! Kny-
nyts: tegyk fel, hogy az autk nem tkznek soha, vagyis tmennek egymson.

Csak a funkcionlis kvetelmnyeket boncolgatjuk. A fejleszts krlmnyeire utal kittelek,


mint A feladatot egy egyprocesszoros szmtgpes krnyezetben kell szimullni!, majd az
implementcinl jtszanak szerepet.
A szvegben tallt fnevek:
Gyuszi = aktor (a program hasznlja)
terepasztal = asztal = grafikus fellet, keret, frame (7*5 m)
kisaut = aut
irny (az aut pillanatnyi tulajdonsga)
szn (az aut lland tulajdonsga)
sebessg (az aut lland tulajdonsga)
fal = a terepasztal szle
t = az aut pozcijnak vltozsa
jtk = Gyuszi jtka = feladat = program
A szvegben tallt igk:
robog (aut a terepasztalon) = tovbb folytatja (tjt) = megy
r = tkzik (az aut fordul, irnyt vltoztat)
jtszik (fut a program)
megfordt (az autt) hasznlati eset
arrbb tol (az autt) hasznlati eset
befejezi = rt = vge a programnak, lenyomja az Esc billentyt hasznlati eset
megllnak (az autk a jtk vgn)
tmennek (egymson) = nem tkznek ezt a problmt nem kell lekezelni

A szinonimk kzl kivlasztjuk azt a szt, amelyik a leghtkznapibb, leglogikusabb s leg-


beszdesebb. Idnknt elllhat tbb j megolds is, s az is elkpzelhet, hogy egyik sz sem
az igazi, s egy jabbat vlasztunk. A kivlasztott szavakat valamilyen mdon megjelljk,
pldul az els helyre tesszk (mi most vastag betvel szedtk).
116 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Megjegyzsek:
- Az egyszer mr megtallt fneveket, illetve igket tbbszr nem hzzuk al. A rag
termszetesen nem szmt.
- Az objektumok megtallshoz s a felelssgek helyes sztosztshoz nagyobb felada-
tokban jelents tapasztalatra van szksg.

Minden feladathoz megkeressk az alkalmas objektumot: Ki vgzi el ezt a feladatot?. Tart-


suk szem eltt, hogy minden feladatot ki kell osztanunk, s hogy az egyes objektumokat vala-
kinek ltre is kell hoznia, letre kell keltenie.
Mieltt vglegesen sztosztannk a felelssgeket, elmlkedjnk most egy kicsit a teljes prog-
ram vgrehajtsnak felelssgrl!

A f felels
Tegyk fel, hogy elromlik a Mazdm, s megbzom a Ktjobbkz Kft.-t, hogy javtsa
meg. n az autt egy bizonylat ellenben tadom. Az aut X kezbe jut, aki kell szaktu-
ds hinyban tadja azt Y-nak. Y pedig bezratlanul az utcn felejti, s az autnak ettl
"kereke kl". Krds: ki fizeti meg az autt? Ki a felels? Szerencsre az n kezemben
van egy bizonylat a Ktjobbkz Kft. pecstjvel, s ennek alapjn az autt vissza kell
kapnom. Engem nem rdekel sem X, sem Y, az egsz gyrt a Ktjobbkz Kft. a
felels, amely idkzben valsznleg Ktbalkz-re vltoztatta nevt.
Szoftver esetn is van valaki, aki a program egszrt felels. Amikor szvegszerkesztm
egy Application error zenet ksretben elszll, nem a hibrt felels rutint vagy annak
rjt fogom szidni, hanem a szvegszerkesztt magt, s azt a cget, amely ehhez az alkalma-
zshoz a nevt adta. Persze a f felels a legtbb esetben thrtja valakire a felelssget, de ez
az magngye, s csak akkor sikerl neki, ha korbban egyrtelmen osztdtak szt a
rendszer feladatai.
A krds most az, hogyan kezddjk a program, kit krjnk meg elszr, s mire?

Egy objektumorientlt programban mindig van egy vezr, aki a teljes feladatot elvgzi s
mindenrt felel. Ezt a f felelst f objektumnak, vezrlnek (kontrollnak), programnak
vagy alkalmazsnak (applikcinak) szoks nevezni.

Egy Java programban a vezr a main metdust tartalmaz objektum vagy osztly. A mi prog-
ramunk vezre a Gyuszi jtka objektum. Statikus main metdusa azzal kezdi, hogy ltrehoz
az osztlybl egy pldnyt.
8. Egyszer OO terv Esettanulmny 8.1. A fogalmak tisztzsa 117

A feladat objektumai, felelssgeik


Objektumjelltjeink, az azokhoz rendelt tulajdonsgok s felelssgek a kvetkezk:
Gyuszi: aktor. Kvlrl fogja manipullni a programot a billentyzettel s az egrrel.
Terepasztal
tulajdonsg: mret
felelssg: sszetartja s mkdteti az autkat.
Aut
tulajdonsgok: pozci, szn, sebessg, irny
felelssg: megy valamekkora sebessggel, megfordul, arrbb megy
Gyuszi jtka
tulajdonsg: -
felelssg: ez az objektum vezrli az egsz programot.

A szakterleti objektummodell a fejlesztsi dokumentciban megtallhat (8.4. bra).

Algoritmusvezrelt program esemnyvezrelt program

Van egy lnyeges krds: Ki figyeli pontosan, hogy Gyuszi (az aktor) mikor s milyen
billenty-, illetve egresemnyeket kelt? A tovbbiakban tisztzzuk az algoritmusvezrelt s
az esemnyvezrelt program fogalmt. Feladatunkat esemnyvezrelt krnyezetben fogjuk
megoldani.

A programvezrlsi mdszereket osztlyozhatjuk aszerint, hogy az aktor hogyan avatkozik


be a program menetbe. Egy program ktfle lehet aszerint, hogy lehet-e vele beszlgetni:
- Ktegelt: Ktegelt (batch) programnak az aktor megadhat indtsi paramtereket, de a
fut program mkdsbe mr nem szlhat bele.
- Interaktv: Interaktv (prbeszdes) programmal az aktor programfuts kzben is
kommuniklhat.

Egy interaktv program a prbeszd mdjtl fggen ktfle lehet:


- Algoritmusvezrelt: Egy algoritmusvezrelt programban az interakcit a program ir-
nytja. Az aktor csak vlaszol a program ltal feltett krdsekre. Az aktor pontosan
akkor s azt mondhatja, amikor s amit a program krdez tle.
- Esemnyvezrelt: Egy tkletesen esemnyvezrelt program reagl az aktor ltal indu-
klt krsekre, krdsekre. Az aktor azt mondhatja, amit akar, s akkor, amikor
akarja!
118 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Az algoritmusvezreltsg a vaskalapos szl (program) s a jlnevelt gyerek (aktor) pr-


beszde a gyerek megvrja, amg a szl befejezi mondandjt, majd arra vlaszol, amit kr-
deztek tle. Ezzel szemben az esemnyvezrelt beszlgets ltszlag ksz zrzavar, a kt fl
mintha minduntalan egyms szavba vgna. E ltszlagos zrzavar mgtt azonban a program
rszrl egy szilrd bels rend ll igaz, hogy az aktor elvileg azt csinl, amit akar, de a prog-
ram jl nevel szl mdjra okosan a helyre teszi a "hiperaktv" gyereket: csak azokat a
krseit elgti ki, amelyeknek rtelmk van, a tbbit ha kell, hatrozott, egyrtelm tmuta-
ts ksretben elutastja. A program, ha lehet, mindenben kiszolglja a felhasznl rtelmes
krdseit, krseit: prhuzamosan elvgzi a kijellt feladatokat s figyel arra, hogy ne romoljk
el a bels konzisztencija.
Mintapldnkban lehet, hogy Gyuszika ssze-vissza nyomogatja az egeret s a billentyzetet.
Semmi baj: ha j a program, akkor nem engedi, hogy Gyuszika bajt csinljon; nem fagy le az
Enter lenyomstl, s nem engedi leszllni az autt a terepasztalrl, ha Gyuszika netn
tlhzn az egrrel.
Az esemnyvezreltsg egytt szokott jrni a grafikus felhasznli fellettel, de ez nem
szksgszer kvetelmny. Egy grafikus felleten is mkdhet ktegelt vagy algoritmus-
vezrelt program; s fordtva: egy karakteres felleten is elkpzelhet esemnyvezrelt prog-
ram.

Az aktor csak akkor


A program adhat letjelet, ha erre
Egy objektum az algoritmus megkri.

Belpsi pont
main

Szegny Gyuszi, lehet, hogy hiba nyomkodja...

8.1. bra. Algoritmusvezrelt program


8. Egyszer OO terv Esettanulmny 8.1. A fogalmak tisztzsa 119

Az algoritmusvezrelt program szerkezete

Minden programnak van egy belpsi pontja: a Javban egy program a vezrlobjektum main
metdusnak meghvsval kezddik (8.1. bra). Ez a metdus aztn meghv egy msik met-
dust, amely ugyanazon az objektumon vagy egy msikon dolgozik. A metdushvsok
objektumrl objektumra vndorolnak: a hvott metdus vagy rgtn lefut, vagy egy jabb
metdust hv meg. Az egyes objektumok pillanatnyi llapottl fggen a vezrls termszete-
sen ms s ms gra kerlhet. Kzben brmely objektum lekrdezheti a billentyzet vagy az
egr pillanatnyi llapott, hogy azt megnyomtk-e, s pontosan milyen eredmnnyel. Az algo-
ritmusvezrelt programra az jellemz, hogy az aktor csak akkor avatkozhat bele a programba,
amikor a program megkrdezi. A 8.1. brn lthat, hogy a program objektumai s az aktor
kztti kapcsolat egyirny: a program krdezi az aktort (pontosabban az aktor eszkzeit: a
billentyzetet s az egeret).

Az esemnyvezrelt program szerkezete

Az esemnyvezrelt program (event driven program) futsa (8.2. bra) szintn a main megh-
vsval kezddik szintn a main meghvsval kezddik, s a metdusok ugyanolyan szab-
lyok szerint kerlnek meghvsra, mint egy algoritmusvezrelt programban. Van azonban egy
lnyeges klnbsg: egy esemnyvezrelt programban a program f szla mellett mkdik egy
esemnyeloszt szl, benne egy risi esemnyeloszt ciklus, amely folyamatosan figyeli,
hogy bekvetkezett-e valamilyen esemny (event). Ha igen, akkor vgignzi, hogy melyik
komponenst (objektumot) illeti az esemny lekezelse (billentyzetesemny esetn azt, ame-
lyik ppen fkuszban van, egresemny esetn azt, amelyiken rajta van az egr). A ciklus oda-
adja az esemnyt a jogos tulajdonosnak, hogy az lekezelhesse. A lekezelseket az ese-
mnylekezel metdusok vgzik. A programoznak mindssze annyi a dolga, hogy megrja az
objektum esemnylekezel metdust, s kzli a rendszerrel, hogy ezen az objektumon milyen
esemnyeket figyeljen. Ilyen rtelemben a programnak a programoz szempontjbl tbb
belpsi pontja van: lefut egy esemnylekezel metdus, aztn lefut egy msik esemnyleke-
zel metdus stb.

Az esemnyeloszts roppant terhtl az esemnyvezreltsget tmogat komponensksz-


let hasznlatval szabadulhatunk meg. Ez a komponenskszlet esetnkben a Java osztly-
knyvtr csomagjai: a java.awt s a javax.swing.
Egy grafikus felhasznli interfsszel (Graphical User Interface, GUI ) rendelkez programban
a kpernyelemek tglalap alak komponensek (a JComponent osztly utdainak pldnyai),
amelyeknek van pozcijuk, mretk, sznk stb. A rendszer egy adott szablyrendszer szerint
meg tudja llaptani, hogy egy egr-, illetve billentyzetesemny melyik komponensen kelet-
kezett. Ha mint programozk azt szeretnnk, hogy egy objektum reagljon bizonyos
esemnyekre, akkor a kvetkezket kell tennnk:
120 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

meg kell rnunk a megfelel lekezel metdus(oka)t az objektum osztlyban. (A Jav-


ban az egresemny lekezel metdusai a mouseClicked s a mouseDragged, a
billentyzetesemny lekezel metdusa a keyPressed.)
az objektumot r kell tennnk a megfelel figyellncra (a Javban ezt az addMouse
Listener, illetve az addKeyListener paranccsal tehetjk meg). Ezzel elrjk, hogy
az objektum figyelje a megfelel esemnyt. Az esemny bekvetkeztekor a lekezel
metdus automatikusan meghvdik.
Pldnkban az aut egy GUI komponens, ez figyeli az egresemnyeket: ha kettt kattintanak
rajta, akkor majd megfordul, ha pedig vonszols kzben ppen rajta van az egr, akkor folya-
matosan thelyezdik abba a pozciba, ahov az egr irnytja.

Program Belpsi pont Ha az aktor esemnyt


(keyPressed) kelt, akkor azt a
Objektum
megfelel metdus
lekezeli.

F belpsi pont
main

Belpsi pont
(mouseClicked)

8.2. bra. Esemnyvezrelt program

8.2. Gyuszi jtka fejlesztsi dokumentci


A kvetkez dokumentcikat adjuk meg:
Kvetelmnyspecifikci ................................. A kvetelmnyfeltrs dokumentcija
Kpernyterv (prototpus)
Szakterleti objektummodell Az analzis dokumentcii
Hasznlati esetek
Szmtgpes krnyezet, fejleszteszkzk
Programterv ....................................................... A tervezs dokumentcija
Pszeudokd (Java kd helyett) .......................... Az implementls dokumentcija
8. Egyszer OO terv Esettanulmny 8.2. Gyuszi jtka fejlesztsi dokumentci 121

Kvetelmnyspecifikci
Gyuszinak van egy 7*5 m-es terepasztala, melyen kisautk robognak klnbz ir-
nyokban. Minden autra jellemz a szne s a sebessge. Ha egy aut a terepasztal
falhoz r, ott rugalmasan tkzik, s a megvltozott irnyban folytatja tjt.
Gyuszi gy jtszik, hogy kedve szerint egy-egy autt megfordt vagy arrbb tol.
Elbb vagy utbb Gyuszi be szeretn fejezni a jtkot ha rt egyet az asztalra,
akkor az autk engedelmesen megllnak.
A feladatot egy egyprocesszoros szmtgpes krnyezetben kell szimullni! Tegyk
fel, hogy az autk soha nem tkznek ssze, hanem tmennek egymson.

A kvetelmnyspecifikcinak maradtak szabad vegyrtkei: itt nincsen sz a terepasztal


sznrl, az autk szmrl, azok formjrl, az egyes autk sznrl, sebessgrl stb. Ezeket
a tovbbiakban kell majd tisztzni!

Gyuszi

8.3. bra. A Gyuszi jtka program szmtgpes szimulcija

Kpernyterv (prototpus)
A feladatot egy egyprocesszoros szmtgpes krnyezetben szimulljuk. A feladat egyes
objektumainak szmtgpes megfeleli a kvetkezk:
Terepasztal: egy ablakkeret a kpernyn. A terepasztal fala az ablakkeret szle.
Autk: rajzok a kpernyn. gy robognak, hogy a megadott helyen kirajzoldnak. Az
autk nem tkznek, hanem tmennek egymson.
122 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Gyuszi aktor, az egr segtsgvel manipullja a kisautkat: ha kettt kattint valamelyi-


ken, akkor az 180 fokos fordulatot tesz, vonszolssal pedig arrbb viszi ket. A program
akkor fejezdik be, amikor Gyuszi leti az Esc billentyt (rt az asztalra).

A Gyuszi jtka program kpernyterve (itt most prototpusa) a 8.3. brn lthat.

Szakterleti objektummodell
A jtk objektummodelljt a 8.4. bra mutatja.

Aktorok s objektumok lersa, felelssge


Gyuszi: aktor. A programot kvlrl manipullja billentyzettel s egrrel.
Gyuszi jtka: Vezr. Elszr ltrehozza a terepasztalt, aztn ltrehoz egy csom
autt, s rteszi ket az asztalra. Vgl megkri az asztalt, hogy legyen robogs, vagyis
az autk menjenek folyamatosan a megadott mdon.
Terepasztal: A terepasztalnak van mrete, s az a f feladata, hogy sszetartsa s
mkdtesse, robogtassa az autkat. A terepasztal olyan kontner, amelybe betesszk az
sszes autt. Mivel csak egy processzorunk van (s programszlakat most nem szeret-
nnk rni), a prhuzamos robogst a terepasztal a kvetkezkppen rheti el: sorban,
egyms utn minden autt megkr, hogy menjen egy kicsit. Ha az aut megkapta a
lehetsget a mkdsre, akkor neki mr tudnia kell, hogyan menjen. A terepasztal
msik feladata, hogy figyelje Gyuszit, nem nyomta-e meg az Esc billentyt. Mert ha
igen, akkor azonnal be kell fejezni a robogtatst.
Aut: Az a f feladata, hogy egyenletes sebessggel menjen: egyhuzamban megtegyen
valamekkora, a sebessgtl fgg utat. Az aut figyeli Gyuszit, nem nyomta-e meg az
egeret. Ha igen, akkor megfordul vagy thelyezdik.

aut
aut
aut
aut

Egr

gyusziJtka terepasztal Esc


Gyuszi

8.4. bra. Gyuszi jtka Szakterleti objektummodell


8. Egyszer OO terv Esettanulmny 8.2. Gyuszi jtka fejlesztsi dokumentci 123

Hasznlati esetek
A program aktora Gyuszi. Gyuszi a kvetkez dolgokra hasznlja a programot:
Megfordtja az autt (kettt kattint az autn az egrrel)
Arrbb tolja az autt (az egrrel vonszolja az autt)
Vget vet a programnak (leti az Esc billentyt)

Ezek a kezdeti hasznlati esetek, ezeket kell a programban megvalstani. Mivel kis feladatrl
van sz, ez lesz a vgleges hasznlatieset-sszellts is.

Szmtgpes krnyezet, fejleszteszkzk


A feladatot grafikus felleten, esemnyvezrelten oldjuk meg. A megoldsban a kvetkez
eszkzket hasznljuk:
Opercis rendszer: Windows
Programfejlesztsi mdszer: Egysgestett eljrs, UML
Programnyelv: Java
Fejleszteszkz: JBuilder 8.0, JDK 1.4

Megjegyzs: Az implementcit itt csak pszeudokdban ksztjk el. A vgs kdols term-
szetesen Java nyelven trtnik, ez megtallhat a knyv mellkletben. (GyusziJateka.java)

Programterv
A program egyttmkdsi s osztlydiagramja a 8.5. brn lthat; a tervhez tartoznak a meg-
felel osztlyok lersai is. Az osztlylersok utn megadjuk a program pszeudokdjt (a
konkrt Java implementci helyett). Pszeudokdot egybknt az osztlylersokban is lehet
alkalmazni a jobb rthetsg kedvrt. A programterv ellltshoz mr szksges a progra-
mozsban val jrtassg de mert ennek a megszerzse ezutni feladat, azrt most megadjuk
a JPanel s a JFrame API-osztly lerst is. Az osztlylersok utn elemezni fogjuk a tervet
s a pszeudokdot.
A 8.5. brn lthat osztlydiagram osztlyainak lersai a kvetkezk:

Auto osztly osztlylers

se: JComponent

Az Auto olyan komponens, amely megjelenik kpernyn, aut formja van, tud menni, for-
dulni. Rugalmasan tkzik a terepasztal falval. Reagl a ketts egrkattintsra s a vonszo-
lsra.
124 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Metdusok:
Auto(szin:Color, x,y,sebesseg:number, asztal:TerepAsztal)
Konstruktor. Ltrehoz egy autt, melynek szne, pozcija s sebessge a paramterben
megadott rtk lesz. Szintn paramterben adjuk meg a terepasztalt, amelyen mozog.
paintComponent(g:Graphics)
Kirajzolja az autt.
megy()
Megy egy sebessgnek megfelel egysget.
fordul(fok:number)
Elfordul a megadott fokkal.
setIrany(fok:number)
Bell a megadott irnyba.
mouseClicked(e:MouseEvent)
Lekezeli a dupla kattints egresemnyt. Megfordul, azaz fordul 180 fokot.
mouseDragged(e:MouseEvent)
Lekezeli az egrvonszols egresemnyt. thelyezi az autt az egr ltal kijellt
pozciba.

TerepAsztal osztly osztlylers


se: JFrame. Mrete 700*500 pont, szne szrke. Egysok kapcsolatban ll az autival. Ismeri
autit, s kpes robogtatni ket. Reagl az Esc billenty letsre.
Metdusok:
TerepAsztal()
Konstruktor. Ltrejn a terepasztal, mrete s szne a megadott.
robogas()
Robogtatja az autkat. Sorban kikri a kontnertl az autkat, s mindegyiket utastja,
hogy menjen egy sebessgnek megfelel tvolsgot.
keyPressed(e:KeyEvent)
Lekezeli a billentyzetesemnyt. Ha lenyomtk az Esc-et, akkor befejezi a programot.

GyusziJateka osztly osztlylers


se: nincs. Vezrli a jtkot.
Metdusok:
GyusziJateka()
Konstruktor. Ltrehozza a terepasztalt s az autkat. Az autkat rteszi a terepasztalra,
s felkri a terepasztalt, hogy robogtassa ket.
main()
A program belpsi pontja. Ltrehozza a gyusziJateka objektumot.
8. Egyszer OO terv Esettanulmny 8.2. Gyuszi jtka fejlesztsi dokumentci 125

Egyttmkdsi diagram: fordul()


setLocation()
:Auto
Auto(...)
setIrny() mouseClicked()
mouseDragged()

megy()
Gyuszi
keyPressed()
:GyusziJateka terepAsztal:TerepAsztal
GyusziJateka()
TerepAsztal()
add(aut)
robogas()

Osztlydiagram: JComponent
-x,y: number
-width,height: number
Auto #JComponent()
+setLocation(x,y:number)
-szin: Color +setSize(width,height:number)
-sebessg: number +setBackGround(color:Color)
-irny: number +paintComponent(g:Graphics)

+Auto(szin:Color,x,y,...)
+paintComponent(g:Graphics)
+megy()
JFrame
+fordul(fok:number)
+setIrany(fok:number)
+mouseClicked(e:MouseEvent) +add(comp: Component)
+mouseDragged(e:MouseEvent) +getComponent (index: number): Component
+getComponentCount(): number

*
TerepAsztal
GyusziJateka
+TerepAsztal()
+GyusziJateka()
+robogas()
+main()
+keyPressed(e:KeyEvent)

8.5. bra. Gyuszi jtka programterve Egyttmkdsi s osztlydiagram


126 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Pszeudokd
class Auto extends JComponent // JComponent kiterjesztse
szin: Color
sebesseg: number // m/sec
irany: number // fokban
terepAsztal: TerepAsztal // objektum, ezen van rajta
// Konstruktor:
Auto(aSzin:Color, x,y,aSebesseg:number, azAsztal:TerepAsztal)
szin = aSzin, sebesseg = aSebesseg, irany = 0
terepAsztal = azAsztal
setLocation(x,y) // az aut pozcija a terepasztalon
setSize(60,60) // az aut mrete
end Auto

paintComponent(g:Graphics)
aut kpnek kirajzolsa
end paintComponent

// megy egy sebessgnek megfelel egysget.


megy()
x,y: number
x s y kiszmtsa a sebessg s irny alapjn.
Nem mehet le a terepasztalrl. Szksg esetn irnyvlts
setLocation(x,y)
end megy

fordul(fok: number) // elfordul a megadott fokkal


irany = irany + fok
end fordul

setIrany(fok: number) // bell a megadott irnyba


irany = fok
end setIrany

mouseClicked(e:MouseEvent) // az egrkattints lekezelje


fordul(180)
end mouseClicked

mouseDragged(e:MouseEvent) // az egrvonszols lekezelje


aut thelyezse az egrkurzor helyre (setLocation)
end mouseDragged
end class Auto

class TerepAsztal extends JFrame // JFrame kiterjesztse


TerepAsztal() // konstruktor
setSize(700,500) // a terepasztal mretnek belltsa
setBackground(szrke) // a terepasztal szne szrke legyen
end TerepAsztal
8. Egyszer OO terv Esettanulmny 8.2. Gyuszi jtka fejlesztsi dokumentci 127

robogas()
index: number // ez az index megy krbe az autkon
auto: Auto // aktulis kapcsolat egy autval
index = -1
do
index = index+1 // a kvetkez aut indexe
if index == getComponentCount() // utols aut utn az els
index = 0 // szmozs nulltl
end if
auto = getComponent(index) // kapcsolatfelvtel egy autval
auto.megy() // az aktulis aut megy egy kicsit
kis vrakozs
end do while true // az autk a vgtelensgig robognak
end robogas

keyPressed(e:KeyPressed) // a billentylets lekezelje


if e==Esc // ha az Esc-et tttk le
vge a programnak
end if
end keyPressed
end class TerepAsztal

class GyusziJateka // Kontroll objektum osztlya


terepAsztal: TerepAsztal

GyusziJateka() // konstruktor
terepAsztal = new TerepAsztal()
auto: Auto
auto = new Auto(piros,100,10,5,terepAsztal)
terepAsztal.add(auto)
auto = new Auto(fekete,250,150,10,terepAsztal)
auto.setIrany(30)
terepAsztal.add(auto)
auto = new Auto(zld,350,50,5,terepAsztal)
auto.setIrany(120)
terepAsztal.add(auto)
auto = new Auto(fehr,500,300,15,terepAsztal)
auto.setIrany(60)
terepAsztal.add(auto)

terepAsztal.robogas()
end GyusziJateka

main()
new GyusziJateka()
end main

end class GyusziJateka


128 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

API osztlyok lersai


Component osztly (API) osztlylers (nem rsze a tervnek)

A JComponent a javax.swing csomag absztrakt osztlya. Szrmaztatsra val, kzvetlenl


nem lehet pldnyt ltrehozni belle. Az osztly tartalmaz minden olyan alapmetdust, amely
egy alakzatnak a kpernyn val megjelentshez szksges. A JComponent osztly kirajzol
(paintComponent) metdusa csupn egy res tglalapot jelent meg. Ahhoz, hogy egy adott
alakzatot megjelentsnk, a JComponent osztlybl szrmaztatnunk kell egy osztlyt (itt
Auto), melyben fell kell rnunk a paintComponent metdust.
Metdusok:
JComponent()
Vdett konstruktor, csak a leszrmazott osztly hasznlhatja. Ltrehozza a komponenst.
setLocation(x:number, y:number)
thelyezi a komponenst az (x,y) helyre. (x,y) a komponens bal fels sarknak relatv
koordintja az t tartalmaz komponens (ablak) bal fels sarkhoz viszonytva.
setSize(width:number, height:number)
Belltja a komponens mrett, vagyis szlessgt (width) s magassgt (height).
setBackground(color:Color)
Belltja a komponens httrsznt.
paintComponent(g:Graphics)
Kirajzolja a komponenst (alakzatot) a kpernyre. A metdus alaprtelmezsben csak
egy res tglalapot jelent meg.
A leszrmazott kirajzolshoz termszetesen tovbbi ismeretekhez lenne szksg, de
ezzel most nem foglalkozunk. Tegyk fel, hogy megvannak a megfelel eszkzeink,
hogy egyeneseket, krket s egyb mrtani idomokat rajzoljunk klnbz sznekkel.

JFrame osztly (API) osztlylers (nem rsze a tervnek)


se (nem kzvetlen): JComponent
Egy ablakkeret, amely megjelenik a kpernyn. Jval tbbet tud snl, mert egyttal kont-
ner is, amely ismeri s sszetartja a benne lev lthat komponenseket (pldul a terepasztal az
autkat).
Metdusok:
add(comp: JComponent)
jabb komponens hozzadsa a kerethez. Ez lesz a legnagyobb sorszm komponens.
getComponent(index:number): JComponent
Visszaadja a megadott index komponens objektumot.
getComponentCount():number
Visszaadja a kontnerben (az ablakkeretben) lev komponensek szmt.
8. Egyszer OO terv Esettanulmny 8.2. Gyuszi jtka fejlesztsi dokumentci 129

A terv s a pszeudokd elemzse


A terv alapjn elksztettk a program pszeudokdjt. Az elemzs sorn a tervre, az osztly-
lersokra s a pszeudokdra egyarnt fogunk hivatkozni.

Az osztlydiagramon a GyusziJateka az indul objektum osztlya. Ennek az objektumnak a


ltrehozsrl is gondoskodnia kell valakinek, mgpedig a rendszeren kvlrl. Az indul
objektum ltrehozsnak technikja a nyelvi krnyezettl fgg. Tegyk fel teht, hogy
vgrehajtdik a GyusziJateka osztly konstruktora, s ltrehoz egy :GyusziJateka objek-
tumot (ezt a main metdus fogja elvgezni). Ez a konstruktor felels aztn a tbbi objektum
ltrehozsrt s beindtsrt ltrehozza a terepasztalt: terepAsztal=new TerepAsztal()
s az autkat: auto=new Auto(...); az autkat rteszi az asztalra: terepAsztal.add(auto);
majd felkri az asztalt a robogsra: terepAsztal.robogas(). Az egyttmkdsi diagra-
mon lthat, hogy a :GyusziJateka objektum a TerepAsztal(), add(aut) s
robogas() zeneteket kldi a terepAsztal:TerepAsztal objektumnak. Ezek az zenetek
teht szerepelnek a TerepAsztal osztlyban vagy annak valamelyik sben.

Ha az egyttmkdsi diagramon egy objektumnak zenetet kldnk, akkor az zenethez


illeszked metdusnak szerepelnie kell az osztlydiagramon a megfelel osztlyban vagy
annak egy sben.

A Terepasztal osztly kzvetve a JComponent osztlybl szrmazik, az teht egy kompo-


nens: van pozcija, mrete stb. Kzvetlenl azonban a JFrame osztlybl szrmazik, amely
mr kontner is (bele lehet tenni komponenseket), ezrt a terepasztal szintn kontner. Az
autk a terepasztalon vannak. A 8.5. brn az egysok kapcsolatot a JFrame s Auto oszt-
lyok kztt is jellhettk volna, mert a trolst a JFrame vgzi el. Emlkezznk vissza, hogy a
kapcsolatok rkldnek, ennlfogva a TerepAsztal s az Auto osztlyok is egysok kapcso-
latban llnak egymssal.

Az aut is egy komponens: van pozcija, mrete, szne stb., az osztlya is a Component
osztlybl szrmazik. Az aut teht mindent tud, amit egy komponens; ezen kvl azonban van
szne, sebessge, irnya, s tud menni, fordulni stb. Fellrtuk benne a paintComponent()
metdust, ezrt aut formja van. A mouseClicked() s mouseDragged() egy-egy
esemnylekezel metdus. Ide kell bernunk, mit kell tennie az autnak az esemnyek
bekvetkezsekor. A megfelel esemnylekezel metdust a rendszer automatikusan meghvja,
ha az esemny bekvetkezik.
130 II. RSZ. OBJEKTUMORIENTLT PARADIGMA

Tesztkrdsek

8.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) A szmtgpes szimulci egy ltez vagy elkpzelt rendszer szoftverrel val utn-
zsa.
b) A kvetelmnyfeltrsnak nincsen dokumentcija.
c) Az analzis dokumentcija a feladatspecifikci.
d) Az osztlydiagram a programterv rsze.
8.2. Miben segtenek a feladat szvegben lev fnevek? Jellje meg az sszes j vlaszt!
a) A feladat objektumainak megkeressben.
b) Az objektumok tulajdonsgainak megkeressben.
c) Az objektumok felelssgnek megkeressben.
d) Az egyes osztlyok metdusainak meghatrozsban.
8.3. Melyik objektum felels a teljes program mkdsrt? Jellje meg az sszes j
vlaszt!
a) Az alkalmazs
b) Valamelyik felhasznli interfsz objektum
c) A programot vezrl objektum
d) A program objektumai egyformn felelsek a mkdsrt
8.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Ktegelt programmal kommuniklhat a felhasznl.
b) Az interaktv program s az esemnyvezrelt program fogalma azonos.
c) Az esemnyvezrelt program az aktor ltal induklt esemnyekre reagl.
d) Esemnyvezrelt programban az esemnyeket egy kzponti esemnyeloszt ciklus
osztja el.
8.5. A felsoroltak kzl melyek az analzis dokumentcii? Jellje meg az sszes j vlaszt!
a) Szakterleti objektummodell
b) Hasznlati esetek
c) Kpernyterv
d) Programterv
8.6. Mi igaz az egyttmkdsi diagramra? Jellje meg az sszes j vlaszt!
a) Az egyttmkdsi diagrambl kiolvashat, hogy valamely osztlyban pontosan
milyen metdusok szerepelnek.
b) Minden egyes osztlydiagramhoz pontosan egy egyttmkdsi diagram tartozik.
c) Az egyttmkdsi diagram egy pillanatfelvtel a mkd programrl.
d) Ha az egyttmkdsi diagramon egy objektumnak zenetet kldnk, akkor az
osztlydiagramon a megfelel osztlyban vagy annak valamelyik sben szerepelnie
kell az zenethez tartoz metdusnak.
I. BEVEZETS A PROGRAMOZSBA
1. A szmtgp s a szoftver
2. Adat, algoritmus
3. A szoftver fejlesztse

II. OBJEKTUMORIENTLT PARADIGMA


4. Mitl objektumorientlt egy program?
5. Objektum, osztly
6. Trstsi kapcsolatok
7. rklds
8. Egyszer OO terv Esettanulmny

III. JAVA KRNYEZET


9. Fejlesztsi krnyezet Els programunk
10. A Java nyelvrl III.
IV. JAVA PROGRAMOZSI ALAPOK
11. Alapfogalmak
12. Kifejezsek, rtkads
13. Szelekcik
14. Itercik
15. Metdusok rsa

V. OSZTLYOK HASZNLATA, KSZTSE


16. Objektumok, karakterlncok, csomagolk
17. Osztly ksztse

VI. KONTNEREK
18. Tmbk
19. Rendezs, keress, karbantarts
20. A Vector s a Collections osztly

FGGELK
A tesztkrdsek megoldsai
Irodalomjegyzk
Trgymutat
132 III. RSZ. JAVA KRNYEZET
9. Fejlesztsi krnyezet Els programunk 9.1 133

9. Fejlesztsi krnyezet Els programunk

A fejezet pontjai:
1. A JBuilder letltse, indtsa
2. A knyv mellklete
3. A JBuilder alkalmazsbngszje
4. JBuilder-projekt fordtsa, futtatsa
5. nll program fordtsa, futtatsa
6. A javalib knyvtr konfigurlsa
7. A javaprog projekt ltrehozsa
8. Mintaprogram Hurr
9. A JBuilder szvegszerkesztje
10. JDK Java Fejleszti Kszlet
11. Az API csomagstruktrja
12. Fordts s futtats tbb osztly esetn
13. Integrlt fejleszti krnyezetek

Ebben a fejezetben telepteni fogjuk a JBuilder integrlt fejleszti krnyezetet s a knyv


elektronikus mellklett. Megismerkednk a JBuilder alkalmazsbngszvel, s megtanuljuk
futtatni a knyv kt ktetnek programjait. Nmelyik ilyen program egsz JBuilder-projekt,
msok meg csak egyetlen Java forrskdbl llnak. Elszr azt fogjuk ltni, hogyan lehet egy
mr megrt JBuilder projektet lefordtani s futtatni. Ezutn nll Java forrskdokkal fogunk
foglalkozni a knyv mellkletben kzreadott javaprog projekttel egyszeren lefordthatunk
s futtathatunk egy tetszleges nll, brmilyen krnyezetben megrt Java forrskdot.
Trkpezze fel a kt ktet tanulnivalit: futtassa, prblgassa mindkt ktet programjait; nem
baj, ha mg nem rti a kdot! A knyv els ktetben nem lltunk ssze projektet, csak ksz
projektet futtatunk; projektksztssel majd a knyv 2. ktete foglalkozik.
Vgl sz lesz a JDK-rl, a Java programozs alapszoftverrl. A JDK ott van minden Java
krnyezet mgtt, s minden Java program fordthat s futtathat vele, csak pp meglehetsen
fapados mdszerrel.
134 III. RSZ. JAVA KRNYEZET

9.1. A JBuilder letltse, indtsa

A JBuilder integrlt fejleszti krnyezet; fejleszteszkzket (szvegszerkeszt, fordt,


futtat, nyomkvet stb.) ptettek ssze (integrltak) benne, s rengeteg knyelmi funkcit
is belefoglaltak.

A JBuilder Personal (aktulis verzija a 8.0) a www.borland.com laprl tlthet le, s ingyene-
sen hasznlhat. Tbb platformra is elkszlt: Windowsra, Linuxra s Solarisra. A letltend
tmrtett llomny mrete nagyjbl 60 MB. Ajnlatos a dokumentcit is letlteni tovbbi
60 MB-ot. Letltskor a felhasznlnak regisztrlnia kell magt; vlaszul a Borland e-levlben
aktivcis llomnyt kld, s abban a regisztrcis kulcsot.
A JBuilder erforrsignye:
Memria: 256 MB
Lemezterlet: JBuilder: ~120 MB, dokumentci: ~70 MB
Processzor: Intel Pentium II 233 MHz vagy ezzel kompatbilis.

A telepts eltt vizsglja meg, van-e elegend hely a lemezn!


Teleptse elszr a JBuilder 8.0 fejleszteszkzt! Futtassa az install programot; a szoftver
helynek adja meg valamelyik lemeznek JBuilder8 mappjt (pl. C:/JBuilder8)!
Ezutn teleptse a JBuilder 8.0 dokumentcijt, vagyis a segtsget (helpet)! A JBuilder
mappjnak adja meg azt a mappt, ahov a JBuildert teleptette (pl. C:/JBuilder8), a JDK
(Java Development Kit, Java Fejleszti Kszlet, lsd ksbb) mappjnak pedig az az alatti
jdk1.4 mappt (pl. C:/JBuilder8/jdk1.4).

A JBuilder els indtsakor meg kell adni az e-levlben kapott aktivcis llomnyt.

Megjegyzs: A knyvtrneveket elvlaszt jel hol / lesz, hol meg \, mert lehetetlen kvet-
kezetesnek lenni. Az elvlasztjel opercisrendszer-fgg, s a JBuilder is minduntalan
kicserli a \ jelet /-re. Egy programban ajnlatos a / jelet hasznlni.

9.2. A knyv mellklete


Tltse le a knyv elektronikus mellklett a knyv htn megadott cmrl! A mellklet a kt
ktet kzs mellklete, neve javaprog.zip, mrete kb. 4 MB. Bontsa ki a fjlt, s tegye a C
lemezegysg fknyvtrba! Ha ms helyre teszi, akkor a knyv s a javaprog projekt hivat-
kozsai rtelemszeren trandk.
Kibonts utn a 9.1. brn lthat knyvtrstruktrt kapja. A mappkat vastag betvel szed-
tk. Az els 3 mappa neve alhzssal kezddik, hogy az bc szerint elre kerljenek. A
9. Fejlesztsi krnyezet Els programunk 9.2 135

_MyPrograms mappa a kszl, sajt programokat tartalmazza; hozzunk ltre almappkat a


programok csoportostsra (pldul tanul neve, dtum vagy tma szerint)!
A mappk mellett megjegyzsben tntettk fel a tartalmukat. Bizonyos mappkat csak a knyv
2. ktete hasznl (pl. icons, images, sounds).
c:\
javaprog
_MyPrograms // sajt programjaink helye
_OOTPJava1 // az 1. ktet mellklete
Esettanulmanyok
Feladatmegoldasok
Mintaprogramok
_OOTPJava2 // a 2. ktet mellklete
Esettanulmanyok
Feladatmegoldasok
Mintaprogramok
doc // dokumentcik
original // fontosabb fjlok eredeti vltozata
icons // ikonok
images // kpek
javaprog_bak // a javaprog projekt forrsfjljainak msolata
javaprog_classes // a javaprog projekt class-fjljai
javaprog_src // a javaprog projekt alaprtelmezett forrsfjljai (res)
lib // segdknyvtrak
javalib.jar // a javalib knyvtr tmrtve
javalib_src.jar // a javalib knyvtr forrskdjai tmrtve
sounds // hangfjlok
work // munkaknyvtr (pl. fjlkezelshez)
javaprog.jpx // nll forrskdok projektfjlja

9.1. bra. A knyv mellkletnek knyvtrstruktrja

A knyv mellkletben a programoknak ktfle lehet a kiszerelsk:


nll Java forrskd (kiterjesztse java): Egyetlen java kiterjeszts, nllan fordt-
hat s futtathat forrsllomny. Az els ktetben szinte csak ilyen programokkal fog-
lalkozunk. Minden forrsllomnyt kln mappba tettnk. A program fordtshoz s
futtatshoz be kell tltennk a Java forrsllomnyt.
Projekt (a projektfjl kiterjesztse jpx): Nagyobb, tbb llomnybl ll program. Az
llomnyok lehetnek forrskdok, adat-, kp-, hangfjlok stb. Mindezek az llomnyok
egy projektknyvtrnak nevezett knyvtr alatt sorakoznak, knyvtrstruktrba szer-
vezve. A projekt llomnyait egy projektfjl fogja ssze (JBuilderben egy jpx kiterjesz-
ts fjl). A program fordtshoz s futtatshoz elegend a projektfjlt betlteni.
136 III. RSZ. JAVA KRNYEZET

Projektksztssel majd a 2. ktet foglakozik ebben a knyvben csak futtatjuk, s ha kell,


fordtjuk ket.
Elszr nagy vonalakban ttekintjk a JBuilder alkalmazsbngsz elemeit, majd lefordtunk
s futtatunk egy JBuilder-projektet s egy nll Java forrskdot.

9.3. A JBuilder alkalmazsbngszje

A projekt (project) egy szoftver fejlesztsben hasznlt, logikailag sszetartoz llom-


nyok s krnyezeti belltsok gyjtemnye. Minden projektnek van egy knyvtra; ebben
a knyvtrban van a projektet ler fjl, itt vannak tovbb a projekt alknyvtrai s
llomnyai.

Pldul:
C:/javaprog/_OOTPJava1/Esettanulmanyok
GyusziJateka
GyusziJateka.jpx // projektfjl
src // a projekt forrsfjljai
classes // a projekt bjtkdjai
...

A GyusziJateka projekt knyvtra: C:/javaprog/_OOTPJava1/Esettanulmanyok/GyusziJateka;


projektllomnya: GyusziJateka.jpx.

Nyissa meg a GyusziJateka projektet:


File/Open Project... Vlassza ki a kvetkez llomnyt:
C:/javaprog/_OOTPJava1/Esettanulmanyok/GyusziJateka/GyusziJateka.jpx.

A projektet nem kell lefordtani, mert a lefordtott kd rsze a mellkletnek. Ha kettt kattin-
tunk a projektfa GyusziJateka.java elemn (9.2. bra), akkor a tartalompanelen megjelenik
a forrskd. Futtassa a GyusziJateka projektet:
Run/Run Project (F9)

A JBuilder f ablakt alkalmazsbngsznek nevezzk (application browser). Ez lthat a


9.2. brn: most ppen a GyusziJateka projekt fut benne. A program egy ablakot jelent
meg, az zenetpanelre nem r semmit.
Az alkalmazsbngsz rszei:
Fmen (Main menu). Menpontok: File, Edit, Search, View, Project, Run, Wizards,
Tools, Window, Help.
F eszkztr (Main toolbar). Innen rhetk el az alkalmazsbngszre vonatkoz fbb
menpontok. A gombok funkci szerint vannak csoportostva: File, Edit, Search, Build,
9. Fejlesztsi krnyezet Els programunk 9.3 137

Run, Debug, Navigation s Help. A klnfle csoportok elrejthetk, illetve jra ltha-
tv tehetk a View/Toolbars menpontban.
Projektpanel (Project pane). Ez mutatja a projekt elemeit, fastruktrba szervezve. A
panelen van a projekt eszkztra (project toolbar). Mindig van egy aktulis projekt: az,
amelyen dolgozunk ezt a projektet a projektvlaszt listbl lehet kivlasztani. A
projektfa mindig az aktulis projekt elemeit mutatja. A + s ikonnal elemeket adha-
tunk a projekthez, illetve elemeket vehetnk le rla.

Alkalmazsbngsz Projekt eszkztr Fmen F eszkztr

Projektfjl
Tartalompanel

Projektfa Projektpanel

Struktrapanel

zenetpanel

Nzet flek

Alkalmazsbngsz sttuszsora Tartalompanel sttuszsora

Fut projekt
9.2. bra. A GyusziJateka projekt a JBuilderben

Tartalompanel (Content pane). A tartalompanelen ott van az sszes nyitott llomny (a


megnyitott llomnyoknak egy-egy fl felel meg). Egy llomnyt gy nyithatunk meg,
hogy dupln kattintunk a projektfa megfelel elemn. Ha a JBuilder felismeri a meg-
jelentend llomnyt, akkor azt a szoksos mdon jelenti meg ilyenek pldul a java,
class, txt, html, xml, jpg, gif, wav, zip, s jar kiterjeszts llomnyok. A megnyitott
138 III. RSZ. JAVA KRNYEZET

llomnyok kztt mindig van egy aktulis, ehhez kapcsoldik a struktrapanel s a


tartalompanel sttuszsora.
A projekt elemei s a nyitott llomnyok elvileg fggetlenek egymstl. A projekt
elemei megnyithatk, de megnyithatk ms, a projekthez nem tartoz llomnyok is
(File/Open File...).
A tartalompanel rszei:
Fjlflek (fell). A flre val kattintssal kivlaszthat az aktulis llomny.
Nzetflek (alul: Source, Design ...). Az aktulis llomnynak klnbz nzetei
lehetnek. A megfelel flre kattintva nzetet vlthatunk. A Source fln tallhat a
forrskd; a Design flet vizulis tervezsnl hasznljuk stb.
A tartalompanel sttuszsora. Informcik az aktulisan szerkeszthet llomnyrl:
az llomny neve, a kurzor pozcija (sor:oszlop), Modified, Insert/Overwrite.
Struktrapanel (Structure pane). A tartalompanel aktulis elemnek struktrjt
mutatja Java forrsfjlban a csomag- s tpusdeklarcikat, valamint a klnfle tpu-
sok tagdeklarciit.
zenetpanel (Message pane). Az zenetpanel lapjain jelennek meg a hibazenetek,
valamint a keressek, futtatsok s nyomkvetsek informcii, eredmnyei. Ez a prog-
ram konzolablaka is: itt kell teht megadni a program beviteli adatait (pldul a
Console osztly metdusaival bekrt adatokat). Adatbekrs eltt az zenetpanelt
fkuszba kell hozni!
Az egyes tevkenysgekhez kln lap nylik:
Fordts (Compiler). A lap megjelenti legutbbi fordts hibalistjt, ha a fordts
nem sikerlt volna. A hibazenetre kattintva a hibs sorra llhatunk.
Futtats (Az aktv program neve). Kln lap nylik minden fut programszlnak.
Nyomkvets (Debugger).
Keress (Search Results). A lapon a legutbbi keress eredmnye lthat.

Minden lapon kt gombot tallunk: az egyikkel lellthat a szl, a msikkal jraindt-


hat. Az zenetpanel lapjai trlhetk: Jobb egrgomb a lap aljn/Remove... Az ze-
netpanel elrejthet: View/Messages.
Az alkalmazsbngsz sttuszsora (Status line): Egysoros informci az alkalmazs
llapotrl.

Kedvencek
Adja hozz a kedvencekhez a javaprog mappt, hogy knnyebben odatalljon! Ezt az File/
Open Project... vagy a Project/Add Files... ablakban tallhat Favorites (kedvencek, jele:
szvecske) eszkzgombbal teheti meg. A kedvencek hasznlata megknnyti a munkt.
9. Fejlesztsi krnyezet Els programunk 9.4 139

9.4. JBuilder-projekt fordtsa s futtatsa


Nzzk meg egy kicsit rszletesebben, hogyan fordthat s futtathat le egy JBuilder-projekt!
Kzben keressen a knyv mellkletben s a JBuilder mintaprogramjai kztt tovbbi projek-
teket, s futtassa ket!
Futtassa pldul a C:/javaprog/_OOTPJava2/Esettanulmanyok/KissDraw/KissDraw.jpx projek-
tet!
Megjegyzs: Ne ijedjen meg! Egyelre csak hasznlnia kell ezt a programot. Ilyen programot
csak a knyv 2. ktetben fogunk rni.

Projekt megnyitsa
File/Open Project... Megjelenik az Open Project dialgusablak. Az ablakban csak a
projektfjlok jelennek meg (jpr vagy jpx kiterjeszts). Keressk meg a lemezen, s
vlasszuk ki a kvnt projektfjlt!
File/Open File... (Ctrl + O) Megjelenik az Open File dialgusablak. Az ablakban felt-
nik az sszes llomny. Keressk meg a lemezen, s vlasszuk ki a kvnt projektfjlt!
Ha projektfjlt nyitunk meg, akkor ez a kt funkci csak a megjelentett fjlokban tr el egy-
mstl.

Projekt(ek) bezrsa
Projekt eszkztr/Kk X Bezrja az aktulis projektet.
File/Close Projects... Bejelljk a bezrand projekte(ke)t.

Projekt fordtsa
Project/Make Project "[Projektfjl]" (Ctrl + F9, F eszkztr/Srga tglalap/Make).
Lefordtja a projektben az idkzben mdostott forrsllomnyokat (azokat, amelyek-
nek a dtuma ksbbi, mint a mr lefordtott class llomny). Ha szksges, akkor az
sszes forrskdot lefordtja. Fordts eltt elmenti a forrskdot, ha azt megvltoztat-
tuk volna a szvegszerkesztben.
Project/Rebuild Project "[Projektfjl]" (F eszkztr/Srga tglalap/Rebuild). Lefordt-
ja a projekt sszes forrsllomnyt, felttel nlkl. A megvltozott forrskdokat elbb
lemezre menti.
Mindkt esetben megjelenik egy, a fordts eredmnyessgrl szl zenet az alkalmazs-
bngsz sttuszsorban. Pldul: Build succeeded with 1 file(s) built. Build took 1 seconds.
Vagyis: 1 llomny fordtsa sikeresen befejezdtt. A fordts 1 msodpercig tartott.
140 III. RSZ. JAVA KRNYEZET

Projekt futtatsa
Run/Run Project (F9, F eszkztr/Zld hromszg/[Futsi konfigurci]). Futtatja a
projektet. Ha a projekt forrskdjai mg nincsenek lefordtva, akkor lefordtja ket.

Egy projekt tulajdonsgai kzt ott van a lefordtand projekt tpusa (alkalmazs/applet...), s ha
alkalmazsrl van sz, akkor a main metdust tartalmaz osztly neve is. Egy ksz projektben
(gy a knyv projektjeiben is) minden tulajdonsg gy van belltva, hogy a projekt futtathat
legyen, a projektek belltsaival ezrt remlhetleg nem kell trdnnk.

A knyv bizonyos projektjei megkvetelik a javalib knyvtr jelenltt; ez is benne van a


knyv mellkletben (javaprog/lib/javalib.jar). Ilyenkor a megfelel knyvtrat hozz kell adni
a krnyezethez (lsd a fejezet A javalib knyvtr konfigurlsa pontjt).

9.5. nll program fordtsa, futtatsa


A JBuilderben csak projekt keretein bell lehet programot rni. A programfejlesztst a progra-
moz ltalban egy projekt sszelltsval kezdi: klnbz knyvtrakat, fjlneveket s
alaprtelmezseket kell megadnia, belltania. Nagyobb program fejlesztsekor a projekt nagy
segtsget ad. Ms esetekben viszont knyelmetlen s rtelmetlen lehet kln projektet s
projekttartozkokat ltrehozni pldul akkor, ha
mindssze egyetlen, rvid Java forrskdot ksztnk, vagy ha
egy meglv Java forrskdot fordtunk s futtatunk. Gyakori eset, hogy a Java forrs-
kdhoz nincs projektfjl vagy ha van, akkor az ms fejlesztrendszerbl val. A kln-
bz Java fejlesztkrnyezetek projektllomnyai ltalban nem kompatbilisek egy-
mssal. Egy szabvnyos Java forrsllomny fggetlen a fejlesztsi krnyezettl.

Knyvnkben az 1. ktet programjaihoz s a 2. ktet programjainak nagyjbl 80%-hoz nem


tartozik kln projektfjl.
Egy nll Java forrsllomnyt tbbflekppen fordthatunk s futtathatunk. Legegyszerbb,
ha a kvnt forrsllomnyt hozzadjuk a knyv mellkleteknt megadott javaprog projekt-
hez.

Pldaknt futtassa a 14. fejezet Csillag.java programjt! A feladat a kvetkez:

rjunk ki a konzolra 10 darab csillagot egy sorba!

Nyissa meg a javaprog projektet:


File/Open Project... Vlassza ki:
C:/javaprog/javaprog.jpx
9. Fejlesztsi krnyezet Els programunk 9.5 141

Nyissa meg s adja a projekthez a Csillag.java forrskdot:


Projekt eszkztr/+ Vlassza ki:
C:/javaprog/_OOTPJava1/Mintaprogramok/14Iteraciok/Csillag/Csillag.java

Ha kettt kattintunk a projektfn a Csillag.java nvre, akkor a forrskd nyomban megje-


lenik a tartalompanelen.

Fordtsa le s futtassa a Csillag.java programot (a lefordtott kd nem rsze a knyv mel-


lkletnek, futtatskor azonban automatikusan lezajlik a fordts):
Jellje ki a forrsprogramot a projektfn! Jobb egrgomb/Run using "javaprog"

A 9.3. bra mutatja a Csillag.java forrsprogram futst. Az zenetpanelen megjelenik 10


darab csillag.

Megjegyzs: A programot egyelre csak futtatnia kell!

9.3. bra. A Csillag.java nll Java program a JBuilderben

A javaprog projekt klnll forrskdok fejlesztshez (fordtshoz s futtatshoz)


hasznlhat. A javaprog.jpx projektfjl a knyv mellklethez tartozik, egyszeren
megnyithat s hasznlhat. Nem kell bezrni; j, ha mindig kznl van.
142 III. RSZ. JAVA KRNYEZET

A javaprog projekthez hozzadott nll forrsprogramok nem fordthatk s futtathatk


projektknt, vagyis rjuk nem alkalmazhatk a Project/Make Project, a Project/Rebuild
Project, valamint a Run/Run Project menpontok.
Most egy kicsit rszletesebben megmutatjuk, hogyan kell egy Java forrsllomnyt kivlasz-
tani vagy ltrehozni, majd a javaprog projekthez hozzadni, fordtani s futtatni.

Elem hozzadsa a projekthez


Project/Add Files/Packages... vagy Projekt eszkztr/+ Megjelenik a 9.4. bra dial-
gusablaka. Az Explorer (bngsz) fl segtsgvel keresglhetnk a lemezen. Ha mr
meglev Java forrskdot akarunk hozzadni a projekthez, akkor egyszeren csak kiv-
lasztjuk. Ha egy j forrskdot akarunk ltrehozni, akkor rjuk be a File name beviteli
mezbe a kvnt nevet a java kiterjesztssel, s nyomjuk le az Ok gombot. Az nllan
fut programok forrsllomnyait ajnlatos kln knyvtrba tenni j knyvtrat
ltrehozhatunk itt a bngszben is. Ha nem ltez fjlnevet adunk meg, akkor a rend-
szer megkrdezi, hogy ltre akarjuk-e hozni. A kivlasztott vagy ltrehozott elem ezutn
megjelenik a projektfn.

j Java forrskd ltrehozsakor ne felejtse el megadni a java kiterjesztst! Ha nem


adunk meg kiterjesztst, akkor az txt lesz, s az nem kezelhet Java forrskdknt.

9.4. bra. Elem hozzadsa a projekthez


9. Fejlesztsi krnyezet Els programunk 9.5 143

Megjegyzsek:
- Egy projekthez elvileg brmilyen llomnyt (szveget, bjtkdot, kpet, hangot, HTML
lapot...) hozzadhatunk, de mi most Java forrsllomnyt szeretnnk fordtani s futtatni.
- Egy Java forrskdot a File/Open menponttal is megnyithatunk, a projekthez val
hozzads nlkl. A projekt aktulis belltsai ilyenkor is rvnyesek, de krlmnye-
sebb a fordts s futtats (futtatskor pldul nincs automatikus fordts).

Elem lekapcsolsa a projektrl


Project/Remove from Project... vagy Projekt eszkztr/ Eltte ki kell jellni a projekt-
elemet a projektfn. A fjl nem trldik a lemezrl, csupn kikerl a projektbl.

Gyakorlskppen kapcsolja le a programot a projektrl, majd jra adja hozz!

nll forrsfjl fordtsa

A javaprog projekt nem fordthat, mert a forrsprogramok nem a projekt forrsknyvtr-


ban (C:/javaprog/javaprog_src) helyezkednek el, hanem brhol a lemezen. A forrskdokat
egyedileg kell fordtani. Lehetsgek:
A projektfn jelljk ki a forrsfjlt! Jobb egrgomb/Make
Jelentsk meg a tartalompanelen a forrsfjlt! Ha elzleg mr megjelentettk, akkor
vlasszuk ki a tartalompanelen (kattintsunk a nevnek megfelel flre)! Project/Make
"[Forrsfjl]" (Ctrl + Shift + F9)

Bjtkdok trlse

A lefordtott class llomny az Output Path helyen keletkezik a javaprog projektben a


C:/javaprog/javaprog_classes knyvtrban. Mivel a javaprog projekt minden bjtkdot ide
tesz, azrt ajnlatos ezt a knyvtrat idnknt kirteni:
Jobb egrgomb/Clean. Ha eltte a projektfjl volt kijellve, akkor a projekt sszes bjt-
kdja trldik; ha egy forrskd volt kijellve, akkor trldik a neki megfelel class
llomny.

nll forrsfjl futtatsa

A javaprog projekt nem futtathat; a hozzadott forrsprogramot csak egyedileg lehet


futtatni. Lehetsgek:
Run/Run "[Forrsfjl]"
Jobb egrgomb/Run using "javaprog". Elzetesen ki kell jellni a forrsprogramot a
projektpanelen.
144 III. RSZ. JAVA KRNYEZET

Megjegyzs: Ha valamirt hasznlhatatlann vlna a javaprog projekt, akkor a javaprog_bak


knyvtrban megtalljuk a eredeti, srtetlen jpx llomnyt.

9.6. A javalib knyvtr konfigurlsa


Az eddig futtatott programok mind a rendszerrel egytt szlltott osztlyokra tmaszkodtak.
Ms programok azonban nem rik be az alaprtelmezsben jelen lev API (Application
Programming Interface) knyvtrakkal a benne lev csomagok osztlyaival , hanem tovbbi
knyvtrakra is hivatkoznak. A knyv programjainak tbbsge hasznlja pldul a javalib
knyvtrat az is benne van a mellkletben. A javalib knyvtrban van az extra.Console
osztly; a benne szerepl statikus metdusok segtsgvel adatokat krhetnk be a konzolrl (a
Java ri nem gondoltak a kezd programozkra).

9.5. bra. A javalib knyvtr konfigurlsa

A javaprog projekt gy van belltva, hogy tmaszkodjk a javalib knyvtrra. A tnyle-


ges hasznlhatsghoz azonban be kell ptennk ezt a knyvtrat a JBuilder krnyezetbe, s
azutn a JBuilder mr emlkezni fog r. Vlasszuk ki a Tools/Configure Libraries... men-
pontot! Vlasszuk aktulis knyvtrnak a User Home knyvtrat, majd nyomjuk le a New...
gombot (9.5. bra)! Megjelenik a New Library Wizard ablaka. Adjuk meg a kvetkez adato-
kat:
9. Fejlesztsi krnyezet Els programunk 9.6 145

Name (a knyvtr neve): javalib


Library Path (a knyvtr tvonala):
Class: javaprog/lib/javalib.jar // class fjlok knyvtra tmrtett formban
Source: javaprog/lib/javalib_src.jar // java fjlok knyvtra tmrtett formban

Most mr a kt ktet sszes programja futtathat vagy nll projektknt, vagy a javaprog
projekt segtsgvel.

Prbaknt futtassa a 20. fejezet ValosSzamok.java programjt! A feladat a kvetkez:


Krjnk be tetszleges sok vals szmot 0 vgjelig! Ezutn rjuk ki
a szmokat a bevitel sorrendjben!
a szmokat nvekv sorrendben!
a legkisebb s a legnagyobb szmot!
Vgl keressnk meg egy szmot a bevittek kztt!

9.6. bra ValosSzamok.java Beolvass konzolrl


146 III. RSZ. JAVA KRNYEZET

A program futst a 9.6. bra mutatja. Az zenetpanelen megjelenik a "Szm: " szveg,
jelezve, hogy a program bevitelre vr. t kell vltanunk az zenetpanelre, s be kell tnnk
egy vals szmot. A program ezutn kri a kvetkez szmot, egszen addig, amg a 0 vgjelet
be nem tjk. Erre a program befejezi a szmok gyjtst, s kirja a krt adatokat (az eredeti
sorrendben ktfle kirs trtnik). Vgl kr egy szmot, hogy megkereshesse azt a bettt
szmok kztt. Az brn a kurzor ppen bevitelre vr. A program els sora: import
extra.Console; (nem ltszik), jelezve, hogy hasznlni akarja a Console osztlyt.

Prblja meg futtatni a 2. ktet esettanulmnyait is! A javalib_projekt kivtelvel itt minden
mappban egy futtathat projekt van (a javalib_projekt nllan nem futtathat osztlyknyv-
tr).

9.7. A javaprog projekt ltrehozsa


A javaprog projekt a knyv mellklete, azt nem kell ltrehozni. S mivel a JBuilder indtskor
automatikusan megnyitja az utoljra hasznlt projekteket, azrt a javaprog projekttel gyakor-
latilag nincs semmi dolgunk... Ha mgis ltre szeretn hozni a javaprog projektet, kvesse a
kvetkez tmutatst!
File/New Project... Megjelenik a projekt varzsl. lltsa be a mezket az brkon meg-
adott mdon!

9.7. bra. Projekt varzsl 1. lps


9. Fejlesztsi krnyezet Els programunk 9.7 147

1. lps (9.7. bra):


Name: javaprog. A projekt neve. Ez lesz a projektfjl neve is, jpx kiterjesztssel.
Directory: C:/javaprog A projekt knyvtra. Vlasszuk ki a C:\ fknyvtrat, s az
majd automatikusan kiegszl a projekt nevvel. Ajnlatos a mappa s a projektfjl
nevt egyformnak vlasztani.
Template: (Default project) Projektminta: ennek alapjn jn ltre az j projekt.

9.8. bra. Projekt varzsl 2. lps, tvonalak belltsa

2. lps (9.8. bra):


JDK: A hasznlt JDK aktulis verzija. A JBuilder Personalban ez nem mdosthat.
Output path: C:/javaprog/javaprog_classes. Itt keletkeznek a projektben leford-
tott bjtkdok. Idnknt ajnlatos trlni ket.
Backup path: C:/javaprog/javaprog_bak. Itt keletkeznek a projektben szerkesztett
forrskdok biztonsgi msolatai.
Working directory: C:/javaprog. Munkaknyvtr a projekt forrskdjaiban mega-
dott relatv tvonalak kiindul knyvtra.
148 III. RSZ. JAVA KRNYEZET

Source: C:/javaprog/javaprog_src. Csak az osztlyvarzslval ltrehozott


forrskdok keletkeznek itt. Megadsa ktelez, de ebben a projektben nem hasznljuk
ez a mappa teht ltalban res.
Required Libraries: Itt kell belltani a programban hasznlt knyvtrakat (a
CLASSPATH tvonalait, lsd a JDK lerst). A 9.9. bra a javalib knyvtr bell-
tst mutatja. A knyvtra(ka)t elzleg a New segtsgvel vagy a Tool/Configure
Libraries... menpontban be kell lltani. A klnfle projektekben a mr megadott
knyvtrakbl vlogatunk. Ha a krnyezetben megvltoztatjuk egy knyvtr tvonalt,
akkor a bellts a JBuilder sszes projektjt rinti!

Egy projekt ajnlott mappanevei: classes, bak s src. A javaprog projektben azrt adtunk
tlk klnbz neveket, hogy a mappk bc rendben kvessk egymst gy ttekinthetbb
a javaprog knyvtr.

9.9. bra. Projekt varzsl 2. lps, szksges knyvtr megadsa


9. Fejlesztsi krnyezet Els programunk 9.8 149

3. lps:
Itt nincs mit tennnk. Nyomjuk meg nyugodtan mr a 2. lps vgn a Finish gombot! A
projekt a c:/javaprog knyvtrban keletkezik, javaprog.jpx nvvel.
Ezt a javaprog projektet csak egyszer kell ltrehozni. Ezutn a megfelel Java forrsllomnyt
csak hozz kell adni a projekthez, illetve le kell venni rla.
A javaprog projektet nem kell bezrni. Egyszerre tbb projekt is nyitva lehet.

9.8. Mintaprogram Hurr


Ebben a pontban berunk s elemznk egy nagyon egyszer mintaprogramot, majd lefordtjuk
s futtatjuk is.

Feladat Hurr
rjunk olyan Java programot, amely konzolra rja a kvetkez szveget:
Hurr, fut az els Java programom!

A mintaprogram megtallhat a C:/javaprog/_OOTPJava1/Mintaprogramok/09Kornyezet/Hurra


mappban. Ksztse el a programot nllan, a _MyPrograms/Hurra mappban!
File/Open Project... C:/javaprog/javaprog.jpx. Csak akkor kell betlteni a javaprog pro-
jektet, ha mg nem volna betltve!
Projekt eszkztr/+ C:/javaprog/_MyPrograms/Hurra/Hurra.java

A forrskdot a Hurra.java szveges llomny fogja tartalmazni.

Forrskd
// Els Java programom //1
public class Hurra { //2
public static void main(String[] args) { //3
System.out.println("Hurr, fut az els Java programom!"); //4
} //5
} //6

A program bersa
Gpelje be a forrskdot! Pontosan azt gpelje be, amit megadtunk a kisbett pldul kisbe-
tnek, a nagybett nagybetnek!
A szvegszerkeszt funkciit s lehetsgeit a kvetkez pont trgyalja.
150 III. RSZ. JAVA KRNYEZET

A mintaprogram elemzse
A Hurra.java forrsllomny mindssze egyetlen osztlynak, a Hurra osztlynak a deklar-
cijt tartalmazza. Az osztly UML brja a 9.10. brn lthat. Ennek az osztlynak egyetlen
publikus osztlymetdusa van, a main (konstruktora nincs, nem kszl az osztlybl egyetlen
objektum sem). A Java rtelmez mindig egy publikus osztly main metdust keresi, majd
automatikusan el is indtja. A main metdus feje kttt formj:
public static void main(String[] args) vagy
public static void main(String args[])

Javban mindkt paramterforma elfogadott, s az args vltoznv helyett vlaszthatunk ms


nevet is.

Hurra

+main(args: String[])

9.10. bra. A Hurra osztly UML brja

Elemzs soronknt:
// Els Java programom
Az 1. sor egy megjegyzssor. Egy programsor // jelpros utni rszt a fordt figyel-
men kvl hagyja. Minden sor vgn megjegyzsbe tettk a sor szmt.
public class Hurra
A 2. sor a Hurra nev osztly deklarcijnak a feje (class = osztly). Az osztly
publikus (public), azaz ms csomagokbl is lthat. A fejet a deklarci blokkja kveti,
kapcsos zrjelek kztt (a 2. sor vge s a 6. sor). A blokk a fej utn kezddik, s az
osztlydeklarci vgig tart.
public static void main(String[] args)
A 3. sor az osztly main nev metdusnak feje. Ez a program belpsi pontja. A
public kulcssz jelzi azt, hogy ez a metdus publikus (a terven ezt a + jel mutatja), a
static kulcssz pedig azt, hogy osztlymetdus (a terven alhzs). A void azt
jelenti, hogy a main metdusnak nincsen visszatrsi rtke, vagyis a main eljrs. A
zrjelben lev String[] args a main metdus esetleges futtatsi paramtereit adja
meg: ezeket mindig le kell rnunk, br egyelre figyelmen kvl hagyjuk ket. A main
metdus trzse szintn egy nyit s egy csuk kapcsos zrjel kz van berva (3. sor
vge s az 5. sor).
9. Fejlesztsi krnyezet Els programunk 9.9 151

System.out.println("Hurr, fut az els Java programom!");


A 4. sor a main metdus egyetlen utastsa (metdushvsa). A System osztly out
objektumnak println metdusa a paramterben megadott szveget ("Hurr, fut
az els Java programom!") kirja a konzolra, JBuilderben az zenetpanelre. A
System.out.println metdusrl a 11. fejezetben rszletesebben is sz lesz.

9.9. A JBuilder szvegszerkesztje


A tartalompanelen megjelen forrskd szerkeszthet. Felsoroljuk a szvegszerkeszt fonto-
sabb lehetsgeit, csoportokba szedve.

Szvegrs
Insert: Vlts a Beszr md s Fellr md kztt. Beszr zemmdban (a
sttuszsorban: Insert) a kurzor egy vkony vonal, fellr zemmdban (a sttuszsor-
ban: Overwrite) pedig egy tmr, az aktulis karakteren villog tglalap.
Karakter: Beszr zemmdban a lettt karakter a kurzor helyre kerl, az addigi
karakterek pedig eggyel jobbra toldnak a sorban. Fellr zemmdban az jonnan
bert karakterek fellrjk a mr ott levket.
Enter: j sor kezdse. Fellr zemmdban a kurzor a kvetkez sor els pozcijra
ll. Beszr zemmdban ezzel egy sort szrunk be, a kurzor ebben az j sorban a
felette ll sor els karaktere al ll. Szerkeszts kzben a program struktrja automa-
tikusan alakul a bert vezrl utastsok alapjn (Indent md).

Pozicionls
A kurzor egy karakterrel jobbra lp.
A kurzor egy karakterrel balra lp.
Ctrl + A kurzor egy szval jobbra lp.
Ctrl + A kurzor egy szval balra lp.
A kurzor egy sorral feljebb lp.
A kurzor egy sorral lejjebb lp.
Home A kurzor a sor elejre ugrik.
End A kurzor a sor vgre (az utols karakter mg) ugrik.
Ctrl + Home A kurzor a szveg elejre ugrik.
Ctrl + End A kurzor a szveg vgre ugrik.
Ctrl + Page Up A kurzor az aktulis oldal tetejre ugrik.
Ctrl + Page Down A kurzor az aktulis oldal aljra ugrik.

Trls
Delete A kurzor alatt lev karakter trlse. A kurzor helyben marad.
BackSpace () A kurzor eltti karakter trlse; a kurzor eggyel balra lp.
Ctrl + Y A kurzor sornak trlse. Az alatta lev sorok eggyel
feljebb hzdnak, s a kurzor a kvetkez sor elejre ll.
152 III. RSZ. JAVA KRNYEZET

Kdbeilleszts Ctrl + J
A kdbeilleszts megknnyti a kdolst: elre elksztett kdrszletek illeszthetk be vele a
programba. A Ctrl + J hatsra egy lista tnik fel, klnbz kdrszletek azonostival. A
kivlasztott kdrszlet bekerl a forrskdba.

A main blokkot pldul minden programba be kell rnunk ez egyrszt unalmas, msrszt
hiba forrsa lehet. A main azonostj kdrszlet kivlasztsra a szvegbe kerl a main
blokk.
Fontosabb elemek:
Azonost Kdrszlet
classp public class {}
main public static void main(String[] args) {}
out System.out.println("");
addwin addWindowListener(new WindowAdapter() {...});

Automatikus metdusfelknls
Ha egy osztly vagy objektum neve utn pontot tesznk, akkor a rendszer automatikusan felk-
nlja azokat az adatokat, metdusokat, amelyeket a fordt ezen a helyen elfogad (9.11. bra).
Mindez csak akkor megy gy, ha a program eddig szintaktikailag hibtlan, s tartalmazza a
megfelel importdeklarcikat.

Hibafeltrs
Ha a kdban szintaktikai hiba van, akkor szerkeszts kzben a struktrapanelen megjelenik egy
Errors gykrelem, s felsorolja a hibkat. Ha a hibt kijavtjuk, akkor ez az elem eltnik.
Ajnlatos a hibkat folyamatosan javtani, klnben nem mkdik az automatikus metdus-
felknls.

9.11. bra. Automatikus metdusfelknls


9. Fejlesztsi krnyezet Els programunk 9.10 153

Automatikus befejezs Ctrl + Space


Ha elkezdnk rni egy szt, akkor a Ctrl + szkz lenyomsra a rendszer a szt legjobb
tudsa szerint befejezi. Ha a folytats mg nem egyrtelm, akkor a rendszer felknlja a
lehetsgeket.
A szvegszerkesztben van ezen kvl szintaktikai kiemels (klnbz tpus szavak ms
sznnel jelennek meg), valamint helyzetrzkeny help (F1 lenyomsra megjelenik annak az
osztlynak a lersa, amelyen a kurzor ll).

9.10. JDK Java Fejleszti Kszlet

A JDK szabvnyos fejleszti krnyezet; a Sun fejlesztette ki, s belefoglalta a Java prog-
ramok rshoz szksges
- fejleszteszkzket; pldul fordtt, futtatt, nyomkvett;
- osztlyknyvtrakat (ez az API, Application Programming Interface).
A JDK nllan letlthet, s alkalmas Java programok fejlesztsre, de nem integrlt
fejleszti krnyezet, mint a JBuilder: nem tartalmaz szvegszerkesztt, s a fordtst meg a
futtatst kln programmal kell meghvni. A JDK rsze a JBuildernek.

A Java fejleszteszkzk valamilyen mdon mind hasznljk a JDK-t. Bizonyos krnyezetek


megkvetelik a JDK jelenltt ilyen pldul a JCreator , msok, mint a JBuilder, maguk
teleptik fel. Ha teht teleptjk a JBuildert, akkor felesleges a JDK-t mg kln telepteni,
hiszen az a JBuilder mappjban mr gyis benne lesz!
A JDK-t tudnunk kell alapszinten hasznlni, klnben idegen krnyezetben, szoksos integrlt
fejleszti krnyezetnk nlkl nem boldogulhatnnk. Ktsgtelen persze, hogy a JDK csak
fapados mdszerekkel szolgl.

A JDK teleptse, knyvtrstruktrja


A Java nyelvet a Sun MicroSystems egy csoportja, a JavaSoft fejlesztette ki. A Javhoz a
nyelvi szablyok lersn kvl tartozik egy osztlyknyvtr is, az API (Application
Programming Interface): az alkalmazsok ltal hasznlhat osztlyok gyjtemnye. A Sun a
Java klnbz verziit JDK (Java Development Kit = Java Fejleszti Kszlet) nvvel bocstja
ki (az aktulis verzi az 1.4-es). A JDK rsze az API, valamint egy primitv fejleszti krnye-
zet: egyebek kztt egy fordt, egy rtelmez/futtat, valamint egy appletnz program
klnbz platformokra (Windows, Linux, Solaris ). A JDK szabadon letlthet az Internet-
rl, s szabadon hasznlhat, cme: http://java.sun.com/j2se
154 III. RSZ. JAVA KRNYEZET

Megjegyzsek:
- A JDK-t a Sun mr minduntalan SDK-nak (Standard Development Kit) emlegeti.
- A kiterjesztett JDK a J2SE ez a Java2 Standard Edition rvidtse.
- A JDK egyetlen, futtathat llomnyknt tlthet le. (Az 1.4-es verzi mrete kb. 35
MB.) A teleptshez kattintsunk r a verzinak s platformnak megfelel tmrtett,
futtathat llomnyra; az llomny erre kicsomagolja magt, s telepti a JDK-t a krt
knyvtrba. A JDK installlt vltozata mintegy 60 MB. A dokumentcit (az API ler-
st) kln kell letlteni.

A JDK knyvtrstruktrjt a 9.12 bra mutatja. A // utn minden sorban az aktulis elem
rvid magyarzata ll. Vizsgljuk meg most nagy vonalakban a klnfle elemeket!

c:\JBuilder8
jdk1.4
bin // fejleszti programok
javac.exe // Java compiler
java.exe // Java interpreter (JVM, futtat)
appletviewer.exe // Java appletnz
...
demo // mintaprogramok
applets // applet mintaprogramok
sound // hang mintaprogramok
...
jre // futtatkrnyezet (Java Runtime Environment)
lib
rt.jar // API (osztlygyjtemny)
bin
java.exe // JVM, a jdk1.4\bin\java.exe msolata
...
docs // API help dokumentci, kln kell letlteni s
index.html telepteni
src.zip // API osztlyok forrskdja (source)
...

9.12. bra. A JDK knyvtrstruktrja

A JDK elemei:
bin knyvtr: Itt tallhatk a fejleszti programok (fordt, futtat, hibakeres stb.). A
javac.exe lefordtja a Java forrsllomnyt, s elkszti a bjtkdot. A java.exe s a
javaw.exe virtulis gp (JVM), vagyis rtelmezi s futtatja a bjtkdot. Az
appletviewer.exe olyasfajta funkcit lt el, mint a bngszbe beptett JVM:
tesztelhetjk appletjeinket, hogy milyennek fogjuk ltni ket bngszs kzben.
demo knyvtr: Minta-appleteket s -applikcikat tartalmaz demonstrcis clra.
jre knyvtr: Java futtatkrnyezet. Ha a Java programokat csak futtatni akarjuk, akkor
csupn erre a mappra van szksgnk. Kt almappja van:
9. Fejlesztsi krnyezet Els programunk 9.10 155

lib knyvtr: ebben a mappban tallhat a Java osztlyknyvtr, ms nven az API


(Application Programming Interface) lefordtott, bjtkd formban. Tbb ezer
osztlybl vlogathatunk programjaink elksztsekor. Az API osztlyknyvtrat
tulajdonkppen az risi, rt.jar tmrtett llomny tartalmazza; a rendszer ebben
tallja meg a class kiterjeszts, knyvtrstruktrba szervezett osztlyokat.
bin knyvtr: itt is megtallhat a JVM, a jdk1.4\bin\java.exe msolata.
docs knyvtr: Help, API-specifikci hiperszveg (vagy pdf) formban. Az
index.html-bl elrhet az API sszes osztlynak s interfsznek lersa.
src.zip: a Sun mellkelte az osztlyknyvtr (API) teljes forrskdjt. Aki nem igazodik
el kellkppen a help dokumentcikon, az tovbbi lehetsgknt bngszheti a Java
forrskdot is. A forrs kzszemlre bocstsnak ms clja is van: sok szem tbbet lt,
s jval knnyebben kiszri az esetleges hibkat. A Java fejleszteszkzk kicsomagols
nlkl olvassk ezt az llomnyt.

Tegyk fel most, hogy nem is teleptettk a JBuilder-t! Ha teleptettk volna a JDK-t, akkor
a jdk1.4 mappa most a fknyvtr alatt lenne. Ebben a pontban csak a JDK szolgltatsaira
tmaszkodva runk Java programot.
Java forrsprogramunkat brmilyen tiszta karakteres szvegszerkesztvel elkszthetjk: az a
lnyeg, hogy az elmentett llomny csak a begpelt szveg karaktereit tartalmazza, ne kerljn
bele semmilyen szvegformzsi parancs.

Megjegyzsek:
- Windows krnyezetben szvegszerkesztsre alkalmas pldul a NotePad vagy az Edit. A
Word nem hasznlhat erre a clra, mert az elmentett llomny tele lesz a Java fordt
szmra rthetetlen formz karakterekkel.
- rdemes megfigyelnie, hogy a JDK a lemezen mintegy 60 MB helyet foglal el, s ebbl a
javac.exe s a java.exe csak nagyjbl 2020 KB!
- A bngszkbe betett JVM ltalban le van maradva az aktulis verzihoz kpest.

Krnyezeti belltsok
Ha JDK-ban dolgozunk, be kell lltanunk a kvetkez krnyezeti vltozkat:
PATH krnyezeti vltoz: Ahhoz, hogy a JDK programjait (javac.exe, java.exe
stb.) a maguk knyvtrn kvli knyvtrbl is hasznlhassuk, a PATH-t ki kell bvte-
nnk a knyvtrukra val hivatkozssal a mi esetnkben ezzel:
SET PATH=%PATH%;C:\JBuilder8\jdk1.4\bin
JAVA_HOME krnyezeti vltoz: A knyv programjai fordtskor s futtatskor az
opercis rendszer JAVA_HOME krnyezeti vltozjra hivatkoznak. lltsa be azt a
JDK knyvtrra! A mi esetnkben:
SET JAVA_HOME=C:\JBuilder8\jdk1.4
156 III. RSZ. JAVA KRNYEZET

CLASSPATH krnyezeti vltoz: A JDK fordt- s futtatrendszere megtallja a


maga osztlyknyvtrt, az API-t. Ha programunkban ms osztlyokat is szeretnnk
hasznlni, akkor meg kell adnunk azok elrsi tvonalt. A rendszer a CLASSPATH
krnyezeti vltozban megadott knyvtrakban keresi azokat az osztlyokat, csomago-
kat, amelyekre programunkban hivatkozunk (az importlt osztlyokat, csomagokat). A
CLASSPATH-ban az aktulis knyvtrat mindenkppen meg kell adnunk (erre a knyv-
trra a . jellel hivatkozunk), mert itt vannak az aktulis csomag osztlyai. Knyvnk
hasznl egy sajt, extra nev csomagot (osztlyknyvtrat) is, a javalib knyvrbl;
erre a csomagra a legegyszerbb programok rshoz is szksgnk lesz. Esetnkben
teht a bellts:
SET CLASSPATH=.;C:javaprog\lib\javalib.jar

Vigyzat! Ha tbb knyvtrat ad meg, ne tegyen kzjk szkzt!

Ajnlatos a futtatshoz egy kis parancsllomnyba foglalni ezeket a belltsokat. A knyv


mellkletben ez a javaprog\lib\setjava.bat llomny, s ez van belerva:
SET PATH=%PATH%;c:\JBuilder8\jdk1.4\bin
set JAVA_HOME=c:\JBuilder8\jdk1.4
set CLASSPATH=.;c:\javaprog\lib\javalib.jar
doskey
c:
cd \javaprog\_MyPrograms

Az utols paranccsal tvltunk abba a munkaknyvtrba, ahol dolgozni fogunk. A doskey


parancsra azrt van szksg, hogy az elzleg bert DOS parancsokat a fel-le billentyvel jra
elhozhassuk. A krnyezeti vltozkat a rendszerbelltsokkal (Windowsban a vezrlpulton)
vglegesen is megadhatjuk akkor nem kell a setjava.

A program begpelse, futtatsa


A Hurra.java program fordtst s futst a 9.13. bra mutatja. A program elksztshez s
futtatshoz kvesse az albbiakat:
Nyisson egy konzolablakot!
Start/Run/cmd.exe, vagy Start/Programs/Accessories/Command Prompt
Futtassa a javaprog\lib\setjava.bat programot:
A kvetkezkben gondoskodjon arrl, hogy a munka megkezdsekor (a konzolablak
megnyitsakor) mindig lefusson ez a parancsllomny.
Mg egyszerbben: Kattintson kettt a javaprog\work\jdkwork.bat llomnyon, s mris
ott tallja magt a JDK-s munkra felksztett konzolablakban, a _MyPrograms mappban.
Ksztsen most a Hurra programnak egy mappt s lpjen t ebbe a knyvtrba!
md Hurra
cd Hurra
9. Fejlesztsi krnyezet Els programunk 9.10 157

Indtsa el a Notepad szvegszerkesztt! rja be a parancssorba: Notepad, vagy:


Start/Programs/Accessories/Notepad
Gpelje be a program forrskdjt!
Mentse el a begpelt szveget a c:\javaprog\_MyPrograms\Hurra mappba, egy Hurra.
java nev llomnyba!
A NotePad-bl ne lpjen ki, csak vltson t a konzolablakra! Ott a C:/javaprog/
_MyPrograms/Hurra az aktulis knyvtr!
Fordtsa le a Java forrsprogramot a kvetkez paranccsal:
javac Hurra.java

A javac.exe program paramtere az elbb megrt Java forrsllomny neve, kiter-


jesztssel egytt (Hurra.java). Az aktulis knyvtrban keletkezik egy Hurra.class
llomny (errl meggyzdhet a knyvtr kilistzsval: dir), ez a Hurra.java
osztly lefordtott, bjtkd formja.
Futtassa a Hurra.class llomnyt a kvetkez paranccsal:
java Hurra

A java.exe program paramtere az elbb lefordtott bjtkd (Hurra.class) neve,


ezttal kiterjeszts nlkl!

9.13. bra. A Hurra program fordtsa s futtatsa JDK-ban


158 III. RSZ. JAVA KRNYEZET

Kpernyjn remlhetleg megjelent az ujjong szveg! Elkpzelhet, hogy az kezetes betk


hibsan jelennek meg a JBuilder mr majd jl fogja megjelenteni.
Elfordulhat, hogy valamilyen hiba folytn mgsem jelent meg a vrva vrt szveg. Ebben az
esetben jra ellenrizni kell a szveget s a megfelel mveleteket, nem rontottunk-e el vala-
mit. Legjobb, ha nyitva hagyjuk a konzolablakot s a szvegszerkeszt ablakot is (a
Windowsban ezt megtehetjk), s a kvetkez algoritmus szerint jrunk el:
do
tvlts a Notepad szvegszerkeszt ablakba
forrsprogram szerkesztse
forrsprogram elmentse
tvlts a konzolablakba
fordts
futtats
end do while valami nincs rendben

Esetleges hibk
Ha valami nincs rendben, ellenrizze a kvetkezket:
Nem mindegy, hogy a Java forrsllomny nevben s a mappk nevben kisbett
runk-e vagy nagybett! A Hurra s a hurra teht klnbzik; az extra csomag neve
csupa kisbets!
A Java forrsllomny nevnek meg kell egyeznie az llomnybeli publikus osztly
nevvel: public class Hurra Hurra.java
Fordtskor meg kell adnunk a .java kiterjesztst, futtatskor viszont nem szabad
megadnunk a .class kiterjesztst (javac Hurra.java s java Hurra)!
Ellenrizze a PATH krnyezeti vltozt a DOS set parancsval! Benne van a JDK bin
knyvtra?
Ellenrizze a CLASSPATH krnyezeti vltozt a DOS set parancsval! Benne van az
aktulis knyvtr (.) s a javalib?
A krnyezeti bellts mdja fgghet az opercis rendszertl. A konzolablakbl val
kilpskor megsznhetnek a belltsok!
Az opercis rendszer hossz llomnyneveket hasznl (a .java kiterjeszts is tbb
mint 3 karakter).
Ha olyan sok hibazenetet r ki a fordt, hogy a konzolablakban nem lehet visszalapoz-
ni ket, akkor vltoztassa meg az ablak tulajdonsgait: nvelje meg a kpernypuffer
sorainak szmt!
Nzze meg, hogy biztosan java-e a kiterjeszts! Az opercis rendszer elrejtheti a
kiterjesztst a konzolablak DIR parancsa azonban mindig megmutatja!
9. Fejlesztsi krnyezet Els programunk 9.11 159

Elfordulhat, hogy az opercis rendszer trja a kisbett nagybetre, vagy a szveg-


szerkeszt hozzteszi az llomnynvhez az ltala hasznlt kiterjesztst (pldul.
Hurra.java.txt). Ilyenkor prblja meg a nevet elmentskor idzjelbe tenni:
"Hurra.java".

A JDK-ban nehzkes a programozs. A JBuilderben fontosabb dolgokra is figyelhetnnk.


Futtassa JDK-ban a knyv nhny programjt!

9.11. Az API csomagstruktrja


A Java nyelv igen egyszer felpts; nincs benne sok tpus s utastsfajta. Tervezi arra
trekedtek, hogy knnyen ttekinthet legyen, s egyknnyen ne lehessen hibzni. A Java
nyelv ereje a fejleszti krnyezettel egytt kapott osztlyknyvtrban van: a programoz
rengeteg osztlyra tmaszkodhat a legklnflbb programok sszelltshoz. Megjegyzend,
hogy ennyi osztlyt szinte lehetetlen ttekinteni. A knyv clja nem is az, hogy a teljes osztly-
knyvtrat ismertesse az Olvasval. A cl az, hogy az Olvas megrtse a nyelvben s az
osztlyknyvtrban rejl szemlletet, s kialakuljon benne az jrafelhasznlhat s robusztus
alkalmazsok rsnak kpessge.

A Java osztlyknyvtr (API) osztlyai a tmrtett rt.jar llomnyban vannak,


knyvtrstruktrba szervezve. Az osztlyokat logikailag csoportostottk: az sszetartoz
osztlyok ugyanabba a csomagba (package) tartoznak. Bizonyos csomagokba az osztlyo-
kon kvl tovbbi csomagok (alcsomagok) is kerltek. A csomagstruktrnak a lemezen
egy ugyanolyan szerkezet knyvtrstruktra felel meg.

A JDK csomagstruktrja a 9.14. brn lthat. A legfels szinten szerepel pldul a java s a
javax csomag. A java csomag alcsomagjai: az applet, awt, io, lang, util stb. A kln-
fle csomagokba osztlyokat foglaltak: az appletbe az Appletet, az awt-be a Containert, a
Fontot, a javax.swing csomagba a JButtont, JComponentet stb. Az bra nem teljes, csak
nhny, neknk fontosabb csomagot s osztlyt brzol. A csomagok neve mindig kisbetvel
kezddik az brn vastag betvel szedtk ket , az osztlyok viszont mindig nagybetvel.
Az osztlyok class kiterjesztssel szerepelnek a megadott knyvtrban (pldul
Applet.class), hiszen futtatskor a rendszer az osztly lefordtott bjtkdjt hasznlja. Az
osztlyokat csomagneveikkel s az osztly nevvel egytt azonostjuk, s e nevek kz pontot
tesznk (pl.: java.applet.Applet).
160 III. RSZ. JAVA KRNYEZET

java
| applet
| | Applet
| | ...
| awt
| | Container
| | Font
| | Graphics
| | Color
| | ...
| | event
| | | KeyListener
| | | MouseListener
| | | ...
| io
| | File
| | PrintStream
| | ...
| lang
| | Integer
| | Math
| | Object
| | String
| | System
| | ...
| util
| | GregorianCalendar
| | Locale
| | Vector
| | ...
javax
| sound
| swing
| | JButton
| | JComponent
| | JFrame
| | ...
| ...

9.14. bra. A Java API csomagstruktrja

Az API fbb csomagjainak rvid ismertetse:


- java: Legfels szint csomag, kzvetlenl nem tartalmaz osztlyokat.
- java.applet: Az appletek rshoz szksges osztlyokbl ll.
- java.awt (Abstract Window Toolkit): Ez a csomag tartalmazza a grafikus felhasznli
fellet (GUI, Graphical User Interface) alaposztlyait. Az itt szerepl vezrlk (keret,
nyomgomb, beviteli mez stb.) az opercis rendszer szolgltatsaira tmaszkodnak
(n. nehzsly komponensek, natv vezrlket futtatnak). A JDK 1.2-es verzijban
9. Fejlesztsi krnyezet Els programunk 9.12 161

megrtk a pehelysly, az opercis rendszertl mr fggetlen swing komponense-


ket; lsd javax.swing csomagot.
- java.io (input/output): Osztlyai segtsgvel adatokat lehet kirni a klnbz perifri-
kra (pldul lemezre), valamint adatokat lehet beolvasni rluk.
- java.lang (language): A Java alaposztlyait tartalmazza (Integer, Math, Object
stb.). Ezt a csomagot minden Java program automatikusan ltja, nem kell kln impor-
tlni.
- java.util (utility): Ez a csomag kisegt osztlyokat tartalmaz. Itt vannak a kontnerek
(pl. Vector), a naptrral s nemzetkzisggel kapcsolatos osztlyok (pl. Gregorian
Calendar, Locale) s ms hasznos osztlyok, interfszek.
- javax: Java kiterjeszts.
- javax.swing: A Swing az AWT kiterjesztse (modernebb s bvebb vltozata). A
Swing platformtl fggetlen, knnyed (pehelysly) klalakkal szolgl. A GUI oszt-
lyok neve itt J betvel kezddik.
Programunkban egy API osztlyra csak gy hivatkozhatunk, ha az osztlyt (vagy az osztly
teljes csomagjt) programunk szmra elrhetv, lthatv tesszk, vagyis importljuk.

A kvetkez sorban a java.util csomag Vector osztlyt importljuk:


import java.util.Vector;

A teljes java.util csomagot annak sszes osztlyt gy importlhatjuk:


import java.util.*;

A lang csomagot minden program automatikusan ltja, ezrt a kvetkez importls pldul
felesleges:
import java.lang.System;

9.12. Fordts s futtats tbb osztly esetn


Egy program ltalban tbb osztlyt is tartalmaz (mi egyelre csak egyosztlyos programokat
fogunk rni). Az osztlyok forrskdjt forrsllomnyokba tesszk; egy forrsllomny egy
vagy tbb osztlyt tartalmazhat, de ltalban ajnlatos az egy osztlyegy llomny konstruk-
cihoz tartanunk magunkat (bizonyos fejleszti krnyezetek ezt meg is kvetelik).
Az egyszerre lefordthat forrskdmennyisget fordtsi egysgnek szoktk nevezni. Javban
a fordtsi egysg a teljes osztly(oka)t tartalmaz forrsllomny. Nzzk t, mi is trtnik
nagy vonalakban egy Java fordtsi egysg (forrsllomny) fordtsakor s futtatsakor, ha
abban tbb osztly is szerepel (9.15. bra).
162 III. RSZ. JAVA KRNYEZET

Appikacio.java (fordtsi egysg, forrsllomny)


import java.util.* package java.util;
public class Applikacio {
public static void main(String[] args) { class GregorianCalendar ...
...
} class Date ...
} ...
class Osztaly1 {
...
}
class Osztaly2 {
...
}

A forrskd osztlyaibl Fordtprogram


egy-egy bjtkd lesz. javac Applikacio.java

Applikacio.class Osztaly1.class Osztaly2.class


Bjtkd Bjtkd Bjtkd

Megkeresi az
Applikacio.class main JVM
metdust, s lefuttatja. java Applikacio

9.15. bra. A Java program fordtsa, futtatsa

Pldnkban az Applikacio.java forrsllomnyban 3 osztly szerepel: Applikacio,


Osztaly1 s Osztaly2; hrmjuk kzl csak egy publikus, az Applikacio. Ez az osztly
tartalmazza a main nev, kttt formj publikus osztlymetdust. Az Applikacio.java
importlja a java.util csomagot, mert nyilvn hivatkozni szeretne az abban szerepl oszt-
lyokra, pldul a GregorianCalendar-re vagy a Vector-ra.
9. Fejlesztsi krnyezet Els programunk 9.13 163

A fordts menete, szablyok:


- Egy Java forrsllomny (fordtsi egysg) egyszerre tbb osztlyt is tartalmazhat, s
azok kzl legfeljebb egy lehet publikus. A publikus osztlynak a neve meg kell, hogy
egyezzk a forrsfjl nevvel: (public class Applikacio Applikacio.java).
- Egy Java program tbb fordtsi egysgbl is llhat (mi egyelre csak egyet runk), de a
programnak pontosan egy belpsi pontja van, ez a main metdus. A main metdus
feje kttt formj: public static void main (String[] args). Az Applikcio
osztly csak akkor futtathat, ha tartalmaz main-t.
- A fordtprogram (javac.exe) a fordtsi egysg minden osztlybl kszt egy
class kiterjeszts bjtkdot. A class-llomnyok neve ugyanaz lesz, mint a bennk
lev osztly.
- Futtatni csak olyan bjtkd llomnyt lehet, amelyben van main metdus. Akrhny
osztlybl ll is a programunk, csak egyetlen main metdusa, vagyis egyetlen belpsi
pontja lehet.
- Lefordtott programunk (a class fjlok sszessge) futtatskor is hasznlja az API osz-
tlyknyvtrat. A futsi krnyezetnek (jre = java runtime environment) teht szm-
tgpnkn minden futskor jelen kell lennie.

9.13. Integrlt fejleszti krnyezetek


Mint lttuk, a JDK tartalmazza azokat az alapprogramokat, amelyekkel egy forrsprogramot
bjtkdd fordthatunk (javac.exe), s azt futtathatjuk (java.exe). A program fejlesztse
azonban meglehetsen nehzkes, ha pusztn a JDK ltal knlt minimlis lehetsgeket hasz-
nljuk, mivel folyamatosan vltanunk kell a szvegszerkeszt s konzolablak kztt, mindig
figyelnnk kell a megfelel krnyezeti belltsokra, s nem tmaszkodhatunk msutt mr
megszokott knyelmi funkcikra.
Az integrlt fejleszti krnyezet (Integrated Development Environment) rengeteg lehetsggel
teszi knnyebb a programoz lett s gyorstja meg a munkjt. Egy modern fejleszti keret-
rendszer sszekapcsolja a szvegszerkesztst, a fordtst, a futtatst s a tbbi funkcit, spedig
gy, hogy egy gombnyomssal vgre lehessen hajtani ket. Egy integrlt fejleszti krnyezet
mindenkppen tartalmaz
egy szvegszerkesztt a forrskd megrsra. Ez a szvegszerkeszt tiszta karakteres
llomnyt llt el, s lehetsg szerint segti a strukturlt programrst (pldul van
benne beljebb kezds (indent) md, vagyis az Enter letsre a kurzor mindig az
elz sor al ll).
egy fordtt, amely egy gombnyomsra listt kszt a forrskd szintaktikai hibirl s
krsre a forrskd hibs sorra ll.
egy futtatt, amely gombnyomsra futtatja a lefordtott kdot.
164 III. RSZ. JAVA KRNYEZET

Egy j integrlt krnyezetben megvannak a kvetkez funkcik is:


Szintaktikai kiemels (syntax highlighting): ms-ms sznben jelennek meg a forrs-
kd szintaktikailag elklnthet szavai (pl. a kulcsszavak kkek, a szvegek zldek
stb).
Nyomkvets (debugger): A program futst lpsrl lpsre hajthatjuk vgre, figyelve
kzben a program alakulst.
Segtsg (help): A programfejleszts klnbz szakaszaiban magyarzatot krhetnk a
klnfle fogalmakrl, kulcsszavakrl, st a krnyezet gpels kzben felknlja az
ppen berhat adatok s metdusok listjt!

9.16. bra. JCreator integrlt fejleszti krnyezet

Pldk integrlt Java fejleszti krnyezetre:


JCreator (Xinox Software, www.jcreator.com)
JPadPro (ModelWorks Software, www.modelworks.com)
TextPad (Helios Software Solution, www.textpad.com)
JBuilder (Borland, www.borland.com)
JDeveloper (Oracle, www.oracle.com)
VisualAge for Java (IBM, www.ibm.com)
Forte for Java (Sun Microsystems, Inc., www.sun.com)
9. Fejlesztsi krnyezet Els programunk 9.13 165

A 9.16. bra a JCreator integrlt fejleszti krnyezetet mutatja.


Vannak JDK-ra pl, s vannak nll fejleszti krnyezetek:
A JDK-ra pl krnyezet csak akkor hasznlhat, ha teleptjk a JDK-t s kapcsolatot
teremtnk kzte meg a krnyezet kztt. Az ilyen krnyezet kzvetlenl rpl a JDK-
ra, hasznlja annak programjait s osztlyknyvtrt (az API-t). Ezek a krnyezetek
ltalban egyszerek, csak a szvegszerkesztsi s integrlsi feladatokat ltjk el:
gombnyomsra meghvjk a JDK javac.exe fordtjt az aktulis forrsllomnnyal,
illetve a java.exe futtatjt az aktulisan lefordtott class llomnnyal. JDK-ra pl
krnyezet a felsoroltak kzl a JCreator, a JPadPro s a TextPad.
Az nll fejleszti krnyezetbe a gyrt cg sajt (felteheten gyorsabb) fordt s
futtat programokat pt bele, s a JDK aktulis verzijt is belefoglalja. Az nll kr-
nyezetek ltalban rengeteg specialitssal szolglnak, s sokkal drgbbak, mint a JDK-
ra pl krnyezetek. Ilyen nll krnyezet a JBuilder, a JDeveloper, a VisualAge for
Java s a Forte for Java. E ngy krnyezet egyben vizulis fejleszteszkz is.

Egy integrlt fejleszti krnyezetbe (Integrated Development Environment, IDE) kln-


bz funkcikat ptenek ssze a programoz munkjnak knnytse cljbl. Egy integ-
rlt fejleszti krnyezet mindenkppen tartalmaz szvegszerkesztt, fordtt s futtatt. Az
igazn knyelmes krnyezetben megtallhatk az olyasfajta extrk is, mint a nyomkvets,
a segtsgads, a szintaktikai kiemels stb. Vannak JDK-ra pl, s vannak nll integ-
rlt fejleszti krnyezetek.

Tesztkrdsek

9.1. Mi igaz egy JBuilder projekttel kapcsolatban? Jellje meg az sszes igaz vlaszt!
a) A projekt csak class llomnyokat tartalmaz.
b) A projektllomny kiterjesztse jbp.
c) A projekthez tetszleges kiterjeszts llomny tartozhat.
d) A projekt logikailag sszefogja llomnyait.
9.2. Mi igaz az alkalmazsbngszvel kapcsolatban? Jellje meg az sszes igaz vlaszt!
a) A fmen rsze az alkalmazsbngsznek.
b) A struktrapanel a projekt knyvtrstruktrjt jelenti meg.
c) Az alkalmazsbngsz sttuszsora mutatja, hogy a szvegszerkesztben hnyadik
sorban van a kurzor.
d) Az zenetpanelre a rendszer zen, arra a programoz nem rhat.
9.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A JBuilderben egyszerre tbb projekt is nyitva lehet.
b) A JBuilder tartalompanelje kpes megjelenteni egy HTML fjlt.
166 III. RSZ. JAVA KRNYEZET

c) A JBuilder tartalompanelje kpes megjelenteni egy hangfjlt.


d) Ha a projektfrl levesznk egy fjlt a Remove paranccsal, akkor a fjl trldik a
lemezrl.
9.4. Mely funkcival lehet egy JBuilder projekt sszes forrskdjt felttel nlkl lefordta-
ni? Jellje meg az sszes igaz vlaszt!
a) Project/Make Project "[Projektfjl]"
b) Project/Rebuild Project "[Projektfjl]"
c) Project/Compile Project "[Projektfjl]"
d) Project/Debug Project "[Projektfjl]"
9.5. Mely funkcival lehet egy tetszleges Java forrskdot futtatni, ha azt hozzadjuk a
javaprog projekthez? Jellje meg az sszes igaz vlaszt!
a) Project/Make Project "[Projektfjl]"
b) Project/Rebuild Project "[Projektfjl]"
c) Run/Run "[Forrsfjl]"
d) Jobb egrgomb/Run using "javaprog"
9.6. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A JBuilder els indtsa utn brmely projekt futtathat. Minden belltsrt a
projekt felel.
b) Egy projekt forrskdjainak ajnlott helye az src knyvtr.
c) A JBuilder szvegszerkesztjben van automatikus metdusfelknls.
d) A JBuilderben szvegszerkesztjben van szintaktikai kiemels.
9.7. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A JDK tbbek kztt tartalmaz egy szvegszerkesztt.
b) Az API egyfajta alkalmazskszt eszkz.
c) A JDK tartalmaz egy bin knyvtrat; abban vannak a fejleszti programok.
d) A jre a JDK futtatsi krnyezete.
9.8. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Egy programot a JDK-ban a java.exe programmal fordthatunk.
b) A program JDK-val val fordtsa s futtatsa eltt a CLASSPATH krnyezeti vl-
tozban meg kell adnunk az API knyvtrt.
c) Az API a szabvnyos Java osztlyokat tartalmazza bjtkd formban.
d) A Java osztlyok knyvtrhierarchija tkrzi a csomaghierarchit.
9.9. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Ha egy Java programban hasznlni akarjuk a util csomagot, akkor azt importlni kell
a programba.
b) A java.lang csomagot mindenkppen importlni kell, mert abban alapvet osztlyok
vannak.
c) Egy Java fordtsi egysg legalbb kt osztlybl ll.
d) Minden Java osztlyban szerepelnie kell egy main metdusnak.
9. Fejlesztsi krnyezet Els programunk 9.13 167

9.10. Az albbiak kzl mely API csomag tartalmazza a kontnerosztlyokat? Jellje meg az
egyetlen j vlaszt!
a) java.lang
b) java.util
c) java.io
d) java.awt
9.11. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Egy Java fordtsi egysgben pontosan egy osztly szerepel.
b) A fordtprogram mindegyik fordtsi egysgbl kszt egy class kiterjeszts
llomnyt.
c) Brmely class kiterjeszts llomnyt lehet futtatni.
d) Futtatskor a program hasznlja a jre-t.
9.12. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Egy integrlt fejleszti krnyezet mindenkppen tartalmaz szvegszerkesztt, ford-
tt s futtatt.
b) A JDK egyfajta integrlt fejleszti krnyezet.
c) A JDK-t akkor is kln kell teleptennk a gpre, ha nll fejleszti krnyezetet
hasznlunk.
d) A Java forrsprogram tartalmazhat formz karaktereket is.

Feladatok

9.1. (A) Vltoztassa meg a 9.8. pontban tallhat Hurra osztlyt gy, hogy a program kirja
a kvetkez szveget: "Nem csggedek, nemsokra lvezni fogom a programozst!".
Futtassa a programot! (Hurra1.java)

9.2. (A) Vltoztassa meg a Hurra osztlyt gy, hogy a program kirja csaldtagjainak nevt
a konzolra, mgpedig ktszer! Futtassa a programot! (Hurra2.java)
168 III. RSZ. JAVA KRNYEZET
10. A Java nyelvrl 10.1 169

10. A Java nyelvrl

A fejezet pontjai:
1. Az OO programozsi nyelvek trhdtsa
2. A Java nyelv trtnete
3. Az Internet, a World Wide Web s a Java
4. A Java nyelv jellemzi

E fejezetben sz lesz az objektumorientlt nyelvek kialakulsrl, majd a Java nyelvrl: annak


viharos sebessg trhdtsrl, az Internettel val kapcsolatrl s klnfle jellemzirl.

10.1. Az OO programozsi nyelvek trhdtsa


Egy objektumorientlt eszkz csak segt az OO elvek megvalstsban. Az OO
nyelv s eszkz hasznlata nem jelenti felttlenl azt, hogy OO elveket alkalmazunk!
Az objektumorientlt elvek akkor is rvnyesek, ha nem a programozsban alkalmazzuk ket.
Programksztshez azonban programozsi nyelvre van szksg, mgpedig olyan nyelvre,
amelynek segtsgvel az OO elveket knnyen valra vlthatjuk.
Az objektumorientlt programozs elmlete meglehetsen rgi kelet. Az 1960-as vekben
megalkotott Simula-67 programnyelv mr tartalmazza a fbb OO elveket. Ennek hatsra az
1970-es vek elejn a XEROX kutatkzpontja, a PARC (Palo Alto Research Center) ltre-
hozta a Smalltalk-72 nyelvet, majd folyamatosan tovbbfejlesztette, s sorban megszletett a
Smalltalk-74, 76, 78, majd a Smalltalk-80 nyelv. Br a szoftverkrzis mr a 60-as vekben
felttte a fejt, a vilg sajnos nem figyelt fel igazn az j programozsi paradigmra. Ez taln
azzal indokolhat, hogy az j paradigma egszen ms szemlletet kvetelt meg, mint a struktu-
rlt programozsi mdszer.
Az ttrst 1981 augusztusa hozta, amikor a Byte magazin szinte teljes terjedelmben a
Smalltalk-80-rl radozott. Sorban megjelentek az errl szl knyvek, majd a Digitalk az
addigiaktl fggetlenl kidolgozta a Smalltalk/V nyelvet. 1986-ban az ACM (Association of
Computing Machinery) elindtott egy konferenciasorozatot, az OOPSLA-t (Object-Oriented
Programming Systems, Languages, and Applications), s annak 1990-ben mr tbb mint 2000
170 III. RSZ. JAVA KRNYEZET

rsztvevje volt. Elindult teht a lavina, s gy tnik, egyhamar nem ll meg. Ma mr szinte
nincs is olyan programozsi nyelv, amelyben ne foglaltk volna bele valamennyire az OO
paradigma ltal knlt lehetsgeket.
A programnyelveket csoportostani szoks aszerint, hogy milyen kvetik az OO elvet. Az
olyan programnyelveket, amelyek knyszertik a programozt az OO elvek betartsra, tiszta
objektumorientlt nyelveknek (pure OO language) nevezzk ilyen pldul a Java vagy a
Smalltalk. Sok programozsi nyelvbe ksbb ptettk bele az OO lehetsgeket, gy az ilyen
nyelvekben tovbbra is lehet hagyomnyos, strukturlt mdon programokat rni ezek az n.
vegyes, hibrid nyelvek (hybrid OO language), mint pldul a C++ vagy a Turbo Pascal. Az
olyan nyelvet, amely lehetv teszi az objektumazonossg, az osztlyozs s a bezrs
hasznlatt, de nem engedi az rklst, objektum alap nyelvnek (object-based language)
nevezzk ilyen pldul a Basic.

Tiszta objektumorientlt nyelv: Olyan programozsi nyelv, amely kiknyszerti az OO


elvek betartst.
Hibrid nyelv: Olyan programozsi nyelv, amelyben lehet objektumorientlt s strukturlt
programokat is rni.
Objektum alap nyelv: Olyan programozsi nyelv, amely tmogatja az objektumazonos-
sgot, az osztlyozst s a bezrst, de nem tmogatja az rklst.

Nzzk most t a legelterjedtebb OO nyelveket:


C++
Hibrid nyelv. Az AT&T Bell Laboratories fejlesztette ki a C nyelvbl az 1980-as vek
elejn, Bjarne Stroustrup tervei alapjn. Napjaink OO rendszereinek jkora hnyadt
C++ nyelven rjk. A C++ legnpszerbb vltozata a Borland C++ s a Microsoft C++.
Java
Tiszta OO nyelv. A Sun Microsystems egy csoportja, a JavaSoft fejlesztette ki James
Gosling vezetsvel. A Java a C++ tdolgozott, leegyszerstett vltozata; az a legna-
gyobb erssge, hogy alkalmas az Internet programozsra. A fejleszti krnyezet s
Java osztlyknyvtr magja a szabvnyos JDK (Java Development Kit); ennek alapjn
tbb cg is gyrt fordt, illetve futtat programot.
Pascal
Hibrid nyelv. Objektumorientlt vltozatt elszr az Apple Computer fejlesztette ki
1986-ban Niklaus Wirth-tel, a Pascal tervezjvel egyetrtsben. Legnpszerbb vlto-
zata az Object Pascal, a Delphi programozsi nyelve (Borland International, Inc.).
Smalltalk
Tiszta OO nyelv, legnpszerbb vltozatai a Smalltalk/V (Digitalk, Inc.), a Smalltalk-80
(ParcPlace Systems, Inc.) s az IBM Smalltalk (IBM Corporation).
10. A Java nyelvrl 10.1 171

Eiffel
Tiszta OO nyelv, Bertrand Meyer fejlesztette ki az 1980-as vekben (Interactive
Software Engineering, Inc.).

OO vizulis fejleszteszkzk

Egy vizulis fejleszteszkz birtokban a fejleszt a program nagy rszt nem forrskd
rsval kszti, hanem interaktv mdon, a fejlesztrendszer eszkztra ltal felknlt vizu-
lis elemek kivlasztsval, azok tulajdonsgainak belltsval. A forrskd vzt a fej-
leszteszkz generlja, majd a fejleszt kiegszti.

A vizulis fejleszteszkz ersen megknnyti a programoz munkjt. Az ppen fejlesztett


program elemeit (pldul egy dialgusdobozt s az azon lev beviteli sorokat s nyomgom-
bokat) nem programnyelvi utastsokkal lltjuk el, hanem a kpernyn, interaktv mdon
adjuk meg: az elemeket egy eszkztrbl cipeljk le a tervezett helyre, s addig igaztjuk
ket, amg jk s tetszetsek nem lesznek. Az elemek tulajdonsgait is menbl vlaszthatjuk.
A megfelel adatbzis-kezelst vgz komponenst is interaktv mdon helyezzk programunk-
ba. A vizulis szerkeszts alapjn a fejleszteszkz automatikusan elkszt egy forrskdvzat,
ezt aztn a programoz kiegszti. De sokszor ez a kiegszts a program lelke, s ezt nem
lehet kattintgatssal helyettesteni. Az alkalmazs logikjt tovbbra is a fejlesztnek kell
kigondolnia! Brmennyire knlkozik is egy vizulis fejleszteszkz az azonnali program-
ksztsre, a programozst minden esetben tervezsnek kell megelznie!
Vizulis eszkzk alkalmazsval knnyen kszthetnk a felhasznlnak prototpust (prog-
rammintt) gy a fejleszt kevsb rul zskbamacskt.
Elterjedt vizulis fejleszteszkzk a kvetkezk:
Java alap: JBuilder (Borland), JDeveloper (Oracle), IBM VisualAge for Java, Visual
J++ (Microsoft)
C++ alap: Borland C++ Builder, Microsoft Visual C++
Object Pascal alap: Delphi (Borland)
Smalltalk alap: IBM VisualAge for Smalltalk, Visual Smalltalk (ParcPlace-Digitalk)

OO adatbzis-kezelk

OO adatbzis-kezel rendszerek segtsgvel az objektumokat adataikkal s viselked-


svel egytt perzisztens mdon (maradandan, a programfuts idejn tl is) el lehet trolni
s klnbz szempontok szerint visszakeresni.

Az objektumorientlt adatbzis-kezel rendszerek csak a 90-es vekben kezdtek letre kelni, s


mg mindig nem igazn npszerek. Taln azrt nem tudnak betrni a piacra, mert egyelre
bonyolultak, lassak, s nincs meg a megfelel matematikai htterk. Ezzel szemben egy
172 III. RSZ. JAVA KRNYEZET

relcis adatbzis-kezel rendszer megbzhat, hasznlata egyszer; nem beszlve arrl, hogy
szabvnyos a lekrdez nyelve, az SQL (Structured Query Language). tmeneti megoldsknt
sorban jnnek ltre az n. hibrid adatbzis-kezel rendszerek, melyekbe OO funkcionalitst
ptenek be, gy az adatbzis hasznlja OO szemvegen t ltja a relcis adatbzist.
OO adatbzis-kezelk pldul:
ObjectStore (Object Design Inc.)
Versant (Versant Object Technology)

10.2. A Java nyelv trtnete


A Java trtnete 1991-re nylik vissza, amikor a Sun MicroSystems egy csoportja Patrick
Naughton s James Gosling vezetsvel egy begyazott, szmtgpes mini nyelvet tervezett
olyan kommunikcis eszkzk programozsra, mint pldul egy kbel-TV kapcsol doboza.
Mivel az ilyen eszkzk nem tl gyorsak, s memrijuk is szks, a nyelvnek nagyon kicsi-
nek, a lefordtott kdnak pedig roppant hatkonynak kellett lennie. s kzrejtszott mg egy
fontos szempont: mivel valsznsthet volt, hogy a klnbz gyrtk klnbz tpus
processzorokat fognak vlasztani, ezrt a nyelvet ltalnosra kellett megalkotni, nem volt
szabad azt egy megadott architektrra szkteni. Ez volt a Green projekt.
Kapra jtt a csapatnak az az tlet, amelyet Niklaus Wirth mr az UCSD Pascalban kidolgo-
zott. Eszerint olyan hordozhat nyelvet kell kszteni, amely egy virtulis (hipotetikus, elkp-
zelt, nem ltez) gpre kzbens kdot generl innen ered a virtulis gp, vagyis a Java
Virtual Machine (JVM) elnevezs. Ez a kzbens bjtkd aztn hasznlhat minden olyan
gpen, amelyen megvan a megfelel interpreter. James Gosling s trsai a C++ nyelvet egysze-
rstettk le a kvnt cl rdekben, hiszen unixos kzegbl jttek, s addig C++-ban dolgoz-
tak. Az j nyelvnek eredetileg az Oak (tlgy) nevet adtk, mint mondjk, azrt, mert a Sunnl
Gosling ablaka eltt egy gynyrszp tlgyfa llt. Ksbb azonban a Sun emberei felfedeztk,
hogy Oak nev programnyelv mr ltezik. s mikzben azon tprengtek, mi is legyen az j
nv, nagy lvezettel fogyasztottk gzlg kvjukat. E finom, trtnelmi kv a Java nevet
viselte, utalva ezzel szrmazsi helyre
A Java nyelv nagyon jra sikerlt, s ezt reztk az alkoti. Termkket el szerettk volna adni.
1992-tl tbb v hzals kvetkezett, de szerzdst senki sem kttt velk. A legrdekesebb,
hogy mg Jim Clark sem ltta meg a Javban a jvt, az az ember, aki ksbb mint a Netscape
vezetje leginkbb tmogatta a nyelvet.
Mg a szerzk hzaltak, az Internet s a Web (lsd 10.3 pont) risi sebessggel fejldtt.
Mivel a webtechnika kulcskrdse a hatkony browser (bngsz) volt, a Java fejlesztinek az
a gondolatuk tmadt, hogy j nyelvk kivlan alkalmas lenne az igazi bngsz elkszt-
sre. Patrick Naughton s Jonathan Payne 1994-ben el is ksztette a HotJava bngszt. Bele-
csempsztk a bngszbe a Java futtatrendszert, a JVM-et, s ezzel alkalmass tettk azt a
10. A Java nyelvrl 10.3 173

Java fordt ltal generlt bjtkd futtatsra. A honlapok letre keltek: mr nem csak mozdu-
latlan informcikat jelenthettek meg, hanem mozg brkat, animcikat s videfilmeket is.
Egyszval a tvoli felhasznl honlapjn futottak a Java programok! A szerzk 1995. mjus
23-n bemutattk termkket, s ezzel a Java elindult diadaltjn: 1996 janurjban a Netscape
2.0 mr Java-kpes (Java enabled) volt, s ezutn minden gyrt bellt a sorba: ma mr nincs
bngsz, amely ne futtatn a Java appleteket (a bngszben fut Java alkalmazst appletnek,
alkalmazsk-nak nevezzk). A vilg fejleszti egyre mohbban ittk kzs csszjkbl a
gzlg kvt. Az a cup of Java (egy cssze Java) egyre npszerbb vlt.

A Java nyelvet a Sun MicroSystems egy csoportja fejlesztette ki, eredetileg kommunik-
cis eszkzk programozsra alkalmas, C++ alap nyelvknt. Alapvet cl volt a kism-
ret nyelv, a hatkony kd s a hordozhatsg. A Java nyelv akkor lett igazn sikeres, ami-
kor 1995-tl kezdve futtatrendszert beptettk a bngszkbe, s ezzel a bngszk Java-
kpess vltak.

10.3. Az Internet, a World Wide Web s a Java


Mivel a Java nyelv elssorban az Internet programozsi nyelve, azrt most nhny szban
sszefoglaljuk a szorosan ide kapcsold fogalmakat.

Az Internet s a World Wide Web


Az Internet: szmtgpekbl ll vilghl. A szmtgpek a szabvnyos TCP/IP
(Transmission Control Protocol/Internet Protocol) technolgival kapcsoldnak egymshoz.
Az Internet segtsgvel brmely kt, az Internetbe bekapcsolt szmtgp beszlgethet
egymssal. Internet mr a 60-as vekben is ltezett, de csak 1995-tl vlt ilyen npszerv, a
World Wide Web jvoltbl (World Wide Web = vilgmret hl, WWW vagy egyszeren
Web). A WWW elektronikus informcis trhz, amely az Interneten keresztl a vilg
brmely pontjrl elrhet. A lehetsgek korltlanok: a hlzatra kttt brmely szmtgp-
rl szllodai szobt vagy repljegyet foglalhatunk, lekrdezhetjk a vilg tetszleges vros-
nak trkpt, mozimsort vagy idjrsjelentst, otthonrl intzhetjk vsrlsainkat,
kezelhetjk a bankszmlnkat stb. Az informcis trhz termszetesen sohasem teljes azon
brmi fent lehet, s brmi hinyozhat is belle, hiszen ki-ki azt tesz szmtgpnek kiraka-
tba, amit akar. Az Internet s a WWW fogalma lassan sszemosdik.
Az Internetet nemcsak a szmtstechnikhoz rt szakember hasznlja az nlklzhetetlen
segttrsa a XXI. embernek.
174 III. RSZ. JAVA KRNYEZET

URL (Uniform Resource Locator)


Egy tvoli gpen lev erforrs (pldul dokumentum) egyrtelm azonostja. Pldul:
http://www.gdf.hu/angster/ook/info.htm
Az erforrs azonostsa hrom rszbl ll:
Protokollmegads. Itt: http:// (HyperText Transfer Protokol)
Az erforrs helye, vagyis a szerver, a tvoli gp neve. Itt: www.gdf.hu
A dokumentum neve teljes tvonallal. Itt: /angster/ook/info.htm

Browser, hypertext, applet


Az informcis trhzban bngszkkel (angolul browser, pldul a Netscape Navigator vagy
az Internet Explorer) bngszhetnk. A bngsz hiperszvegeket jelent meg. A hiperszveg
(hypertext) olyan dokumentum, amelynek bizonyos rszeire egrrel rkattintva jabb doku-
mentumokat, dokumentumrszeket rhetnk el. A szvegnek ezek az rzkeny pontjai alh-
zssal vagy ms mdon vannak megklnbztetve. Az rzkeny pontokhoz hiperhivatkozsok
(hyperlink) tartoznak. A 10.1. brn lthat, hogy az Internet Explorer a http://www.gdf.hu/
angster/applets/Pecs.html lapot jelentette meg. Ez a lap a Gbor Dnes Fiskola (GDF) szerve-
rnek /angster/applets knyvtrban tallhat, Pecs.html nven.
Egy bngsz Java-kpes (Java enabled), ha futtatja a Java appleteket. A bngsztl
fggetlenl fut programot alkalmazsnak nevezzk (application, applikci), a bngszben
fut programot pedig appletnek (alkalmazska). Egy applet biztonsgi okok miatt sokkal keve-
sebb dologra kpes, mint egy applikci: msok gpn pldul egyltaln nem tudja kezelni az
llomnyokat. Bngszskor nem kell teht attl tartanunk, hogy a szmtgpnkre letlttt
applet letrli, mdostja, netn elolvassa llomnyainkat.
Hiperszvegek megadsra egy egyszer hiperszveg-szerkeszt nyelvet fejlesztettek ki, a
HTML-t (HyperText Markup Language). A hiperszveg egyszer szveges llomny, mely-
ben HTML parancsok tallhatk. A 10.2. brn lthat a Pecs.html llomny: ez jelenti
meg a 10.1. brn lthat kpet. Lthatk benne a HTML parancsok; egy ilyen parancsot a
<PARANCS> vezet be, s a </PARANCS> zr le. Pldul:
<HTML> ... </HTML> HTML dokumentum
<HEAD> ... </HEAD> A bngsz ablaknak belltsai
<TITLE> ... </TITLE> A bngsz ablaknak cme
<BODY> ... </BODY> A lap (hiperszveg) tartalma
<H2> ... </H2> Fejlc (header)
<P> ... </P> Paragrafus
<U> ... </U> Alhzs (underline)
<A> ... </A> Hiperhivatkozs megadsa (anchor = horgony)
<APPLET code=... width=... Begyazott applet (code: a futtatand applet bjtkdja,
height=... > </APPLET> width, height: az applet szlessge s magassga)
10. A Java nyelvrl 10.3 175

10.1. bra: Bngsz, s benne egy applet

<HTML>
<HEAD>
<TITLE>Kpek Pcsrl</TITLE>
</HEAD>
<BODY>
<h2 align = middle>Pcsi kpek, 2000. szeptember</h2>
<P>A kpeket Antal Attila ksztette. Ltogasson el ide is:
<A HREF="http://www.gdf.hu/angster/ook/info.htm">
<U>http://www.gdf.hu/angster/ook/info.htm</U></A></P>
<APPLET code = "ViewPictures.class"
width = 800
height = 500
>
</APPLET>
</BODY>
</HTML>

10.2. bra: A HTML forrsszveg: ez lltja el az elbbi kpet


176 III. RSZ. JAVA KRNYEZET

A hiperszvegeket szoks HTML dokumentumoknak is nevezni; llomnynevk HTML vagy


HTM kiterjeszts. Ha egy ilyen kiterjeszts file-ra kettt rkattintunk, akkor az vrhatan
megjelenik a bngszben. Br a HTML dokumentumok egyszer szvegszerkesztkkel is
szerkeszthetk, bonyolultabb hiperszvegek szerkesztsre kln HTML szerkeszt szoftve-
reket fejlesztettek ki (pldul a FrontPage Editort).

10.4. A Java nyelv jellemzi


A Java nyelv fejleszti hivatalos kiadvnyban (white paper) tettk kzz tervezsi cljaikat s
eredmnyeiket. Ez a kiadvny 11 szval jellemzi a Java nyelvet:
Egyszer (simple): A Java nyelv a C++ leegyszerstett vltozata. A C++ a Java eltt a
legnpszerbb programozsi nyelv volt, de ktetlensge s tlzottan sok lehetsge
miatt bonyolult s nehzkes volt hasznlni. A Java sokkal kevesebb nyelvi eszkzt,
lehetsget knl, s sokkal nagyobbak benne a ktttsgek. Leegyszersdtt a szintak-
tika: eltntek a mutatk, automatikus lett a memria felszabadtsa (mr nem a progra-
moznak kell rla gondoskodnia). Emiatt egy Java programot rni vagy olvasni sokkal
egyszerbb, mint egy C++ programot. Nmelyek a Javt igencsak szellemesen gy
hvjk: C++-- (CPluszPluszMnuszMnusz).
Objektumorientlt (object-oriented): A Java OO szellem, tiszta objektumorientlt
nyelv. Egy Java applikcit osztlyok ksztsvel s jrafelhasznlsval ptnk sz-
sze.
Elosztott (distributed): Egy Java applikci kpes az Internet brmely pontjn tallhat,
URL-lel azonostott objektumot elrni s feldolgozni.
Robusztus (robust): Ms nven: hibatr, megbzhat. A szoftver hibatr, ha a lehet-
sgekhez kpest normlisan mkdik az abnormlis esetekben is. A nyelv tervezi nagy
gondot fordtottak a hibk korai, mg a fordts idejn val kiszrsre, hogy elejt
vegyk a lehetsges futsi hibknak.
Biztonsgos (secure): A Java nyelvet elssorban internetes, elosztott krnyezetben val
mkdsre terveztk. Ezrt jelents biztonsgi intzkedseket kellett bevezetni, nehogy
egy ilyen program krt tehessen a msik felhasznl rendszerben. A Java nyelv hasz-
nlatval olyan programokat lltunk el, amelyek nem rhetnek el vdett eszkzket s
llomnyokat.
Architektrasemleges (architecture neutral): ms szval: gpfggetlen. A fordtprog-
ram gptl fggetlen bjtkdot (.class file) generl, s az klnbz gpek processzorain
futtathat. A futtats felttele a futtat krnyezet (JVM, Java Virtual Machine) jelenlte.
A bjtkd unikd formtum s szabvnyos, szmtgpes krnyezettl s processzortl
fggetlen instrukcikbl ll. A bjtkdot az adott gp futs kzben rtelmezi a virtulis
gp segtsgvel. A JVM ltal vglegesre lefordtott kd a natv kd, s az mr tnylege-
sen fut a gpen. A bjtkd hasznlatnak pillanatnyilag az a htrnya, hogy az rtel-
10. A Java nyelvrl 10.4 177

mez utastsonknt fordt, s emiatt a program meglehetsen lass. A teljestmnyt a


JIT (Just In Time) fordtk jcskn megnvelik, mert megjegyzik az egyszer mr lefor-
dtott kdot, s a legkzelebbi hivatkozskor mr nem fordtjk jra.
Hordozhat (portable): A nyelvnek nincsenek implementcifgg elemei, azaz nem
fordulhat el olyan eset, hogy egy nyelvi elem vagy osztly az egyik krnyezetben ms-
kppen legyen specifiklva, mint a msikban. Az int (integer = egsz) adattpus
pldul a szabvny szerint egy 32 bites eljeles egsz, brmilyen krnyezetrl (szmt-
gp, opercis rendszer, Java fordt) van is sz.
Interpretlt (interpreted): A clgpen fut natv kdot az rtelmez hozza ltre utast-
sonknt a bjtkd rtelmezsvel. Ha egy clgpen installlnak egy Java rtelmezt,
akkor az brmilyen Java bjtkdot rtelmezhet.
Nagy teljestmny (high performance): A Java magas teljestmnye mg elrend cl.
A Javt ezen a tren ri a legtbb tmads: sok fejleszt szerint a fordts s a futtats is
idegesten lass. A kvetkez tendencik azonban remnyt keltenek:
a processzorok gyors temben fejldnek, egyre gyorsabbak lesznek;
a Java fejleszti risi sszegeket kltenek ez irny kutatsokra;
a JIT (Just In Time) fordtk mris 10-20-szor gyorsabbak az rtelmezknl.
Tbbszl (multithreaded): A tbbszl programozs lnyegben azt jelenti, hogy
ugyanabban az idben tbb programrsz futhat egymssal prhuzamosan, tbb szlon.
Igaz, hogy egyszerre csak egy processzor dolgozik, de az mindegyik szl munkjt
igazsgosan, egyszerre vgzi, pldul:
amg az egyik szl bevitelre vr, addig a msik nyugodtan dolgozik;
a program egy videfilm lejtszsa kzben pldul nyugodtan elvgezhet bizonyos
szmtsokat, hiszen a kpeket gysem lehet egy adott sebessgnl gyorsabban
mutogatni.
Dinamikus (dynamic): A Javt gy terveztk, hogy knnyedn tovbb lehessen fejlesz-
teni. Az osztlyknyvtrak szabadon bvthetk anlkl, hogy azok hatssal lennnek
az ket hasznl kliensekre.

Tesztkrdsek

10.1. Ki fejlesztette ki a Java nyelvet? Jellje meg az egyetlen j vlaszt!


a) az AT & T Bell Laboratories
b) a Sun MicroSystems
c) a Smalltalk
d) az IBM
10.2. Jellje meg azokat a pontokat, amelyekben az sszes nyelv tiszta objektumorientlt!
a) Java, Object Pascal, C++
b) Eiffel, Smalltalk
c) Turbo Pascal, Java, Smalltalk
d) Eiffel, C++, Java
178 III. RSZ. JAVA KRNYEZET

10.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) A vizulis fejleszteszkzt hasznl programoz csak vizulisan adja meg a prog-
ram tulajdonsgait, forrskdot nem kell rnia.
b) Az OO adatbzis-kezel rendszerek az objektumoknak csak az adatait trolja el, a
viselkedst nem.
c) A Java nyelv egy si jtkrl kapta a nevt.
d) A Java akkor lett igazn sikeres, amikor futtat rendszert beptettk a bng-
szkbe.
10.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az Internet nem ms, mint szmtgpekbl ll vilghl.
b) Egy tvoli gpen lev dokumentumot az URL-je azonost.
c) A WWW a World, World, World! rvidtse
d) a bohoc@where.hu szintaktikailag helyes URL.
10.5. Melyik volt az els olyan programozsi nyelv, amely mr tartalmazott OO elveket?
Jellje meg az egyetlen j vlaszt!
a) Smalltalk
b) C++
c) Simula
d) ACM
10.6. Melyik vben ptettk be a bngszkbe a JVM-et? Jellje meg az egyetlen j vlaszt!
a) 1980-ben
b) 1985-ben
c) 1990-ben
d) 1995-ben
10.7. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A bngszvel hiperszveget lehet kszteni.
b) Az, hogy a bngsz Java-kpes, azt jelenti, hogy alkalmas Java appletek futtat-
sra.
c) A HTML egyfajta nyelv.
d) A Java nyelvnek az az egyik jellemzje, hogy elosztott alkalmazsokat lehet benne
rni.
10.8. Mely clokat tztk ki a Java nyelv fejleszti? Jellje meg az sszes j vlaszt!
A Java legyen:
a) Biztonsgos
b) Felhasznlbart
c) Robusztus
d) Egyszer
I. BEVEZETS A PROGRAMOZSBA
1. A szmtgp s a szoftver
2. Adat, algoritmus
3. A szoftver fejlesztse

II. OBJEKTUMORIENTLT PARADIGMA


4. Mitl objektumorientlt egy program?
5. Objektum, osztly
6. Trstsi kapcsolatok
7. rklds
8. Egyszer OO terv Esettanulmny

III. JAVA KRNYEZET


9. Fejlesztsi krnyezet Els programunk
10. A Java nyelvrl

IV. JAVA PROGRAMOZSI ALAPOK


11. Alapfogalmak
12. Kifejezsek, rtkads
13.
14.
Szelekcik
Itercik
IV.
15. Metdusok rsa

V. OSZTLYOK HASZNLATA, KSZTSE


16. Objektumok, karakterlncok, csomagolk
17. Osztly ksztse

VI. KONTNEREK
18. Tmbk
19. Rendezs, keress, karbantarts
20. A Vector s a Collections osztly

FGGELK
A tesztkrdsek megoldsai
Irodalomjegyzk
Trgymutat
180 IV. RSZ. JAVA PROGRAMOZSI ALAPOK
11. Alapfogalmak 11.1. Mintaprogram Krumpli 181

11. Alapfogalmak

A fejezet pontjai:
1. Mintaprogram Krumpli
2. ASCII s unikd karakterek
3. A program alkotelemei
4. Vltoz, tpus
5. Primitv tpusok
6. A forrsprogram szerkezete
7. Metdushvs (zenet)
8. rtkad utasts
9. Adatok bevitele a konzolrl
10. Megjelents a konzolon

A fejezetben a Java program alapvet fogalmait s szintaktikai szablyait tisztzzuk. Az els


pontban bemutatunk egy mintaprogramot, melyre az egsz fejezetben hivatkozni fogunk.

11.1. Mintaprogram Krumpli

Feladat Krumpli
Egy cserksztborban kszl a vacsora, de a konyhafnk nem tudja, mennyi
krumplit vegyen. A fejadagot ismeri, az 0.4 kg, de a szksges mennyisget szm-
tgp segtsgvel szeretn kiszmolni az aktulis ltszmtl fggen. rjuk meg a
programot a konyhafnknek! A program krje be a ltszmot, majd rja ki a szks-
ges mennyisget a kvetkezkppen:
Ltszm? 20
A szksges mennyisg: 20 * 0.4 kg = 8.0 kg

A Krumpli.java mintaprogramunk egyetlen osztlybl, az pedig egyetlen metdusbl ll. A


program sszes feladatt a statikus main metdus fogja elvgezni, a Krumpli osztlybl
pldnyt nem hozunk ltre.
182 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A mintaprogram terve a kvetkez:


Krumpli

+main(args: String[])

Forrskd
/* A program a cserksztbor konyhafnke rszre kszlt.
* A program bekri a ltszmot, majd kirja a krumpli
* szksges mennyisgt.
*/
import extra.*; // az extra egy sajt csomag, nem API

public class Krumpli {


public static void main(String[] args) {
int letszam;
double fejadag=0.4, osszesen;

// A letszam vltoz bekrse konzolrl:


letszam = Console.readInt("Ltszm? ");

// A szksges mennyisg kiszmtsa s kirsa:


osszesen = fejadag*letszam;
System.out.print("A szksges mennyisg: ");
System.out.println(letszam+" * "+fejadag+" kg = "
+Format.left(osszesen,0,2)+" kg");
}
}

A program egy lehetsges futsa


Ltszm? 20
A szksges mennyisg: 20 * 0.4 kg = 8.00 kg

Nyissa meg a javaprog projektet, s adja hozz a Krumpli.java forrskdot! A forrskd


mappja: C:\javaprog\_OOTPJava1\Mintaprogramok\11Alapok\Krumpli. Fordtsa s futtassa a
programot a 9. fejezetben lertak szerint!
Mieltt megprbln lefordtani a programot, fontos megjegyezni a kvetkezt: A program
mkdshez szksg van az extra.Console s az extra.Format osztlyra, mely nem
rsze a Javnak (a program importlja az extra csomag sszes osztlyt). Ehhez konfigurlja
a javalib knyvtrat, ha ezt mg nem tette meg! A javalib knyvtr struktrja a kvetkez:
javalib // az extra csomag knyvtra (mappa vagy jar fjl)
extra // extra csomag
Console // Console osztly
Format // Format osztly
...

A program futst a JBuilder alkalmazsbngszjnek zenetpaneln a 11.1. bra mutatja (az


zenetpanel kln ablakk varzsolhat a bal als sarkban lev ikonnal).
11. Alapfogalmak 11.2. ASCII s unikd karakterek 183

11.1. bra. A Krumpli program futsa

A Console osztly tbbek kztt tartalmazza a readInt() statikus metdust (a Javban


elbb rjuk a tpust, aztn a vltozt):
int readInt(String str)
A metdus segtsgvel konzolrl be lehet olvasni egy egsz szmot. A konzolon meg-
jelenik a paramterben megadott informcis szveg. A kurzor a szveg utn villog,
jelezve, hogy a program bevitelre vr. A program addig nem folytatdik, amg egy
egsz rtket be nem tnk. Ekkor a fggvny visszatrsi rtke a bevitt egsz szm
lesz.

A mintaprogramban a letszam vltoz rtkt krtk be a felhasznltl:


letszam = Console.readInt("Ltszm? ");

11.2. ASCII s unikd karakterek


Mindenekeltt tisztzzuk az ASCII s az unikd karakterbrzols fogalmt, mert a tovbbiak-
ban alkalmazni fogjuk ket. Karaktereknek nevezzk egyttesen a betket (A, B, a, b), a
szmjegyeket (0, 1, 2...), a specilis karaktereket (*, +, !) s a vezrlkaraktereket (Enter,
Backspace, PageDown, Shift-F1). Ezeket a karaktereket a szmtgpnek valahogy meg kell
klnbztetnie egymstl. Ktfle karakterbrzols terjedt el: az ASCII s az Unikd.

ASCII karakterkszlet
Az ASCII (American Standard Code for Information Interchange, az informcicsere amerikai
szabvnyos kdjai) kdtbla egy karaktert egy bjton brzol, vagyis sszesen 256 karaktert
klnbztet meg. Az ASCII kdtblt az amerikaiak 1963-ban rgztettk.
184 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Az ASCII karakterek kztt vannak megjelenthet karakterek, s vannak vezrl, ms


szval kontroll vagy escape karakterek. A megjelenthet karaktereket szimpla aposztrfok
kz szoks rni, pldul 'A', '$'. A vezrlkarakter elnevezs onnan ered, hogy ha egy ilyen
karaktert a kpernyre vagy printerre kldnk, akkor az nem jelenik ott meg, hanem valami-
lyen vezrl (kontroll) funkcit lt el, pldul sort emel, lapot dob stb. A vezrlkarakterek az
ASCII kdtbla 1.-26. karakterei. Jellsk: Control-A, Control-B vagy mskppen ^A, ^B
... az bc betinek sorrendjben.
Az ASCII kdtbla megjelenthet elemei:
a szmjegyek (10 db: 0,1,2,...9), ASCII kdjuk 48-tl 57-ig
az angol bc nagybeti (26 db: A,B,C,...) , ASCII kdjuk 65-tl 90-ig
az angol bc kisbeti (26 db: a,b,c,...), ASCII kdjuk 97-tl 122-ig
specilis karakterek (mintegy 40 db, pl. !,$,%,...)
grafikus jelek (pl. ,,)

Az ASCII kdtbla a 256 karakterbl tulajdonkppen csak az els 128-at adja meg, a tbla m-
sodik felvel szabadon lehet gazdlkodni. Ezekre a karakterekre az ANSI (American National
Standards Institute) kln ajnlst adott, mi, magyarok pedig ide tehetjk a neknk fontos ""
bett s trsait.
A hatvanas vekben mg senki sem gondolt arra, hogy az 1 bjt mennyire kevs lesz, micsoda
gondot okoz majd a klnbz nemzetek kezetes betinek trolsa.

Unikd karakterkszlet
A szmtstechnika fejldsvel s elterjedsvel az ASCII kdtbla igencsak szksnek bizo-
nyult. A vilg klnbz npei sajt nyelvkn szeretnk hasznlni szmtgpket, szve-
geiket sajt nyelvkn szeretnk betni s ltni. E problma megoldsra dolgoztk ki az
unikd karakterkszletet, mely mr 2 bjton brzolja a lehetsges karaktereket. A lehets-
gek szma gy 256-rl 65536-ra emelkedett, s ez bven elegend az angol, magyar, orosz,
knai, szanszkrit vagy hottentotta betk megklnbztetsre is (pillanatnyilag mintegy 35000-
fle karaktert hasznlnak a vilg szmtgpein).

Az unikd karaktereket leggyakrabban hexadecimlis kdjukkal adjk meg \uhhhh formban,


ahol a \u (backslash u) az unikd brzolst bevezet vezrlkarakter, hhhh pedig ngy hexa-
decimlis szm (1..9, a..f/A..F). Az unikd karakterek a \u0000 karaktertl a \uffff
karakterig terjednek. Az els 256 unikd karakter megegyezik az ASCII/ANSI karakterksz-
lettel, pldul:
Unikd ASCII
\u001a Control-Z
\u0041 A
\u0031 1
11. Alapfogalmak 11.3. A program alkotelemei 185

Bizonyos vezrlkarakterek jellsre a Java specilis vezrl szekvencikat engedlyez.


Ilyenkor a \ jelet egyetlen, u-tl klnbz karakter kveti:

Escape szekvencia Nv Unikd rtk


\b backspace (visszatrls) \u0008
\t tab (tabultor) \u0009
\n line feed (soremels) \u000a
\f form feed (lapdobs) \u000c
\r carriage return (kocsi vissza) \u000d
\" dupla aposztrf \u0022
\' szimpla aposztrf \u0027
\\ backslash (\ jel) \u005c

Megjegyzs: A Javban egy szveget dupla aposztrfok kztt adunk meg ("Hello"). Ezrt
magban a szvegben nem szerepelhetne a " karakter, ha azt a vezrlkarakteres trkkel nem
szrhatnnk mgiscsak be ("De \"Trkks\" vagy!").

Az unikd karaktereket a Unicode Consortium felgyeli s tartja karban. Bvebb informci a


www.unicode.org Internet cmen tallhat.

ASCII karakterkszlet: Szabvnyos kdrendszer, mely a karaktereket 1 bjton brzolja.


Unikd karakterkszlet: Szabvnyos kdrendszer, mely a karaktereket 2 bjton brzolja.
Jellse: \uhhhh, ahol hhhh hexadecimlis szmok. Az unikd karakterek rtke \u0000
s \uffff kz esik.

11.3. A program alkotelemei


Elemezzk most a mintaprogramot szintaktikailag! Egy Java forrsprogram unikd karakte-
rekbl ll, s megklnbzteti a kis- s nagybetket.

A Java program szintaktikailag elklnthet alkotelemei a kvetkezk:


- Fehr szkz
- Megjegyzs
- Azonost
- Kulcssz
- Literl A program alapelemei
- Szepartor
- Opertor
186 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Vegyk most sorra ezeket az alkotelemeket!

Fehr szkz
A fehr szkz (white space) elvlasztja a program alapelemeit. Fehr szkznek nevezzk
a szkzt, a tabultort, a sor- s lapvgjeleket:

Fehr szkz Angol nv Rvidts Unikd Esc. szekv.


Szkz Space SP \u0020
Vzszintes Tab Horizontal Tab HT \u0009 \t
Sor eleje Carriage Return CR \u000d \r
j sor Line Feed LF \u000a \n
Lapvg Form Feed FF \u000c \f

Mintaprogramunkban a public s a class kulcsszavakat pldul szkz vlasztja el. Ha a


szkzt elhagynnk, a publicclass egyetlen alkotelem lenne.
A fehr szkzk a program szvegben csupn res helyeknek ltszanak. A szintaktika
szerint, ahol egy fehr szkz van, ott lehet tbb is. A megjegyzs, az opertor s a szepartor
automatikusan elvlaszt szerepet tlt be. Pldul a fejadag s a letszam azonostt a *
(szorzs) opertor mr elvlasztja, tovbbi szkzre teht nincs szksg. Ugyangy a sorvgi ;
(pontosvessz) utn sem kellene sort emelnnk. Szpen, strukturltan azonban csak gy tudunk
kdolni, ha a kd megfelel helyeire fehr szkzket szrunk be, de ez termszetesen felesle-
ges a fordtprogram szmra.

Megjegyzs: Mintaprogramunk, mint minden Java program, egyszer szveges llomny. Ha


a szveg szerkesztsekor lenyomjuk a Tab vagy az Enter billentyt, akkor a memriban a
megfelel megjelenthet karakterek kztt egy HT, illetve egy LF karakter jelenik meg.
Amikor a szvegszerkeszt konzolra rja a szveget, akkor a HT karakter hatsra tabulls,
az LF hatsra pedig soremels kvetkezik be.
Pldul a "{\n\t//Proba\n}" szveg a kpernyn gy fest:
{
//Proba
}

Megjegyzs
A megjegyzs (comment) emlkeztet vagy dokumentl clokat szolgl szveg. A meg-
jegyzseket a Java fordt nem veszi figyelembe. A j megjegyzsekkel megtzdelt forrsprog-
ram olvashatbb s rthetbb, mint a megjegyzseket mellz kd.
11. Alapfogalmak 11.3. A program alkotelemei 187

A Java programban alapveten ktfle megjegyzst alkalmazhatunk:


Egysoros megjegyzs: a // karakterpr utn lv szveg az aktulis sor vgig. A
kvetkez sor mr nem tartozik a megjegyzshez.
Tbbsoros megjegyzs: a /* s */ karakterprok kz zrt szveg. Ebben az esetben a
megjegyzs akrmilyen hossz lehet, akr tbb soros is.
A megjegyzsek nem gyazhatk egymsba. A /* s */ jelek kz teht hiba illesztnk //
jeleket, azt a fordt nem veszi figyelembe.

Ha elkezdett egy megjegyzst, akkor ne felejtse el bezrni! Lehet, hogy csak azrt nem
mkdik a programja, mert a fordt nem vesz tudomst a program utastsairl!

Mintaprogramunkban egy darab hromsoros s hrom darab egysoros megjegyzs van.


Megjegyzsek:
- A megjegyzs alkalmazsa egy j forrskd elengedhetetlen velejrja ugyan, de nem
helyettesti a beszdes azonostkat. A forrskd legyen ndokumentl!
- Van mg egy harmadik fajta megjegyzs is, amelyet a /** s */ karaktersorozatok kz
tesznk. Ezt a fajta megjegyzst a javadoc.exe dokumentcikszt szoftver hasznlja
fel a program html dokumentcijnak elksztshez.

Azonost
A program bizonyos elemeit (osztlyait, objektumait, vltozit, metdusait stb.) azonos-
tani kell, vagyis azoknak nevet kell adni. Vannak olyan elemek, melyeket mr a Java ri azo-
nostottak, s neknk csak hivatkozni kell rjuk ilyen pldul a String, a System, az out,
s a println. Vannak elemek, melyeket a programoz azonost ilyen pldul a Krumpli, a
letszam, a fejadag, s az osszesen. Az azonostnak egy adott programszinten (csomag-
ban, illetve blokkban) egyedinek kell lennie: ha pldul a f osztly neve Krumpli, akkor egy
msik osztlynak mr nem lehet Krumpli a neve.

Azonostkpzsi szablyok
Az azonost brmilyen hossz unikd karaktersorozat, melyben a karakterek a kvet-
kezk lehetnek:
Java betk: az unikd tblban szerepl betk, kztk a latin ABC kis- s nagybeti;
Java szmjegyek: az unikd tblban szerepl szmjegyek, kztk a 0..9 szmje-
gyek;
_ (alhzs) karakter s a valutaszimblumok (pl. $).
Egy azonost nem kezddhet szmjeggyel, nem lehet kulcssz, s nem lehet a nyelv
elre definilt konstansa ( true, false vagy null).
Kt azonost csak akkor egyezik meg, ha unikd karaktereik rendre megegyeznek.
188 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Vigyzat! Az azonostk esetben megklnbztetjk a kis- s a nagybetket. Ha


System helyett a system szt gpeljk be, akkor az szintaktikai hibt fog okozni.

Megjegyzsek:
- Hogy egy unikd karakter bet-e, az lekrdezhet a Character.isLetter(kar) fgg-
vnnyel; hogy szmjegy-e, lekrdezhet a Character.isDigit(kar) fggvnnyel.
- A Java nyelv megengedi az kezetes karakterek hasznlatt, de ez a szolgltats az ope-
rcis rendszerben klnleges belltst ignyelhet. Az kezetes azonostkat inkbb
mellzzk.

Pldul:
Szintaktikailag helyes azonostk:
pi_pi, Csapda22, _kakadu, $nezzIde$, PI, lljMeg, gr, J
Szintaktikailag helytelen azonostk:
true, 1Program, Ez/az, Is=Is, no-Please, indulj!, default

Azonost elnevezsi konvencik


- Trekedjnk arra, hogy jl olvashat, informatv, beszdes azonostkat vlasszunk!
- Az osztlyok azonostjt nagybetvel kezdjk. (Az osztlyokon kvl csak a konstans
kezddik nagybetvel.)
- A vltozk s metdusok azonostjt kisbetvel kezdjk.
- A konstanst csupa nagybetvel rjuk.
- Az azonostkat lehetsg szerint gy tagoljuk, hogy az sszetett szavak kezdbetit
nagybetvel, a tbbit kisbetvel rjuk (pl. isLetterOrDigit, ButtonGroup).

Pldul:
Beszdes azonostk:
maxSebesseg, betukSzama, TerepAsztal
rtelmetlen, csnya azonostk:
a, haidekerulavezerlestuttihogyelszallagep, AKARMI, adsfd

A mintaprogram azonosti:
extra: csomagazonost
Console, Format, Krumpli, String, System: osztlyazonostk
args, out: objektumazonostk
letszam, fejadag, osszesen: vltozazonostk
main, print, println, readInt: metdusazonostk
11. Alapfogalmak 11.3. A program alkotelemei 189

Kulcssz
A kulcssz (keyword) a rendszer rszre fenntartott sz, azt msra nem lehet hasznlni.
Szoks fenntartott, foglalt vagy kttt sznak is nevezni. Minden kulcssznak megvan a
maga kulcsszerepe. A mintaprogram kulcsszavai a kvetkezk:
import: kls csomag (az abban lev osztlyok) importlsa
public: publikus, azt kvlrl is lehet ltni
class: osztly
static: statikus, azaz osztlytag
void: semleges. A metdus nem fggvny, hanem eljrs (nincs visszatrsi rtke).
int: egsz tpus (integer).
double: dupla pontossg vals tpus.

A Java kulcsszavai a kvetkezk:


abstract default if package transient
boolean do implements private try
break double import protected void
byte else instanceof public volatile
case extends int return while
catch final interface short synchronized
char finally long static this
class float native super throw
continue for new switch throws

A const s goto szintn foglalt sz, de egyik sem hasznlatos.

Literl

A literl olyan lland rtk, amely bepl a program kdjba, s a tovbbiakban


mr nem vltoztathat meg. A literlok fajti:
- egsz: egy pozitv vagy negatv egsz szm, vagy nulla.
- vals: egy tizedesekkel lerhat szm.
- logikai: kt logikai (boolean) konstans ltezik: a true (igaz) s a false (hamis).
- karakter: egy unikd karakter (szimpla aposztrfok kz tesszk).
- szveg: akrmilyen hossz, unikd karakterekbl ll sorozat (idzjelek kz tesszk).
- null

Nzzk most sorra a klnbz literlokat!


190 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Egsz literl
Egy egsz (integer) literl egy pozitv vagy negatv egsz szm, vagy nulla. Negatv szm ese-
tn a szm el runk egy (mnusz) jelet. A nulla el rt + vagy jel nem vltoztatja meg a
nulla rtket, s a pozitv szm rtke sem vltozik, ha + jelet runk el. Az egsz literlokat
hrom formban adhatjuk meg:
Decimlis forma. Pldul: +238, -5, 2147483647
Hexadecimlis forma. A hexadecimlis (0..9, a..f, A..F) karaktersorozat el egy 0x
(nulla s x) jelet tesznk. Pldul: 0x2a1 (decimlis rtke 2*256+10*16+1=673)
Oktlis forma. Az oktlis (0..7) karakterek el egy nullt tesznk. Pldul: 021 (deci-
mlis rtke 2*8+1=17)
Egy egsz literl automatikusan int tpus, de ha a vgre tesznk egy L vagy l bett, akkor
tpusa long lesz, pldul: 400L.

Az egsz literl el ne tegyen nullt, mert az ilyen szm oktlis szmrendszerbelinek min-
sl; a vgre pedig ne tegyen kis L bett, mert l bet s az 1 szmjegy sszetveszthet!

Vals literl
Vals vagy lebegpontos (floating-point) literloknak nevezzk a tizedesekkel lerhat szmo-
kat. A vals szm kt formban adhat meg:
Tizedes forma: az egsz s az esetleges tizedes rsz kztt egy tizedespont van (pl.
9.12, 105, 105.0, 3345.6666, 0.00566, vagy 100000.0).
e
Lebegpontos forma: <mantissza>E/e<exponens>, a vals szm rtke m*10 :
mantissza: tetszleges eljeles tizedes szm;
E/e: az exponens jele, a kt bet kzl valamelyik.
exponens: eljeles egsz szm. Azt jelzi, hogy 10-nek milyen hatvnyval kell a
mantisszt megszorozni, hogy a kvnt rtket kapjuk, vagyis hogy hny hellyel kell
a tizedespontot eltolni jobbra, ha pozitv, balra, ha negatv.
Vals szmok pldul:
12.999 { 12.999*100 = 12.999 }
1E0 { 1*100 = 1 }
1e9 { 1*109 = 1000000000 }
-0.006 { -0.006*100 = -0.006 }
12E2 { 12*102 = 1200 }
5E-4 { 5*10-4 = 0.0005 }
-6.2E3 { -6.2*103 = -6200 }

Egy vals literl automatikusan double tpus, de ha a vgre tesznk egy F vagy f bett,
akkor tpusa float lesz, pldul: 21.3F, 0.2f, 60F. (A double s a float lebegpontos
szmokat trol Java tpusok. A double dupla pontossg.)
11. Alapfogalmak 11.3. A program alkotelemei 191

Karakterliterl
A karakter (character) literl pontosan egy darab unikd karakter, melyet szimpla aposztrfok
kz tesznk. Egy karakter megadhat
unikdjval: '\u0041', '\u0009'
megjelenthet karakter formjval: 'A', '?', '', '#'
escape szekvencival: '\t', '\''
Unikddal minden karakter megadhat. Vannak n. megjelenthet karakterek, ezeket olyan
formban adjuk meg, ahogy a konzolon is megjelennek (pl. 'K', '9', '='). Vannak azonban olyan
karakterek, amelyeknek nincs kpk, s ezrt csak escape szekvencival adhatk meg: ilyen
pldul a HT karakter: '\t', vagy a szimpla aposztrf: '\''. (Az escape meneklst jelent, s
utal arra, hogy ezek a karakterek csak kerl ton adhatk meg.) Az 'A' ugyanaz, mint a
'\u0041', mert az A bet kdja: \u0041. A '\t' ugyanaz, mint a '\u0009', mert a HT
kdja \u0009.
Karakterliterlok pldul:
'A', '\u0041', '!', '\'', '\t', '\\', '', '', '', '\u0a5f'

Szvegliterl
A szveg (string) literl egy akrmilyen hossz, unikd karakterekbl ll sorozat. A literl
tartalmazhat escape szekvencikat, s kzvetlen unikdokat is. A sorozatot idzjelek (dupla
aposztrfok) kz tesszk. Pldul:
A karaktersorozat: Hello
Megadsa String literlban: "Hello"
A karaktersorozat: "Nono", ezt ne csinld!
Megadsa String literlban: "\"Nono\", ezt ne csinld!"
A karaktersorozat: c:\jdk1.4\bin
Megadsa String literlban: "c:\\jdk1.4\\bin"
A karaktersorozat: Most jn egy tabHT, meg mg egyHTVge
Megadsa String literlban: "Most jn egy tab\t, meg mg egy\u0009Vge"
A println ezt jelenti meg: Most jn egy tab , meg mg egy Vge

Szepartor
A szepartorok specilis jelents elvlaszt elemek ((){}[];,.), nmelyikk prosval fejti
ki hatst. Jelentsk:
A metdusok azonostit az klnbzteti meg az egyb azonostktl, hogy az azono-
st utn egy () karakterpr szerepel, benne az esetleges paramterekkel. Pldul:
println(letszam)
192 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Az osztly feje utn kvetkez osztlyblokkot, a metdus feje utni metdusblokkot s


az sszes ms blokkot is a {} karakterpr hatrolja.
A [] karakterpr sokszoroz, tmbt kpez. Pldul: a String[] egy String-eket
tartalmaz tmbt jelent.
A program utastsait s deklarciit a ; (pontosvessz) szepartor zrja le. Pldul:
int letszam;
A , (vessz) szepartor felsorolst jelent. Pldul: fejadag, osszesen
A . (pont) szepartor minstsre hasznlatos. Pldul: System.out.println (a
System osztly out objektumnak println metdusa)

Opertor
Az opertor vagy mveleti jel a kifejezs rsze (pldul fejadag*letszam).
Java opertorok pldul:
* / % + - < <= > >= ++ != && || = +=

Az opertorokrl rszletesen a 12., Kifejezsek, rtkads cm fejezetben lesz sz.

11.4. Vltoz, tpus


A programok adatokon manipullnak. Egy gpi kd programnak ki kell jellnie a memri-
ban az ltala hasznlt adatterleteket, magas szint nyelvben azonban nincs szksg erre. A
programoznak csak meg kell mondania, mennyi s milyen memriaterletre van szksge a
program futtatshoz. Egy-egy ilyen memriaterletet egyrszt azonostani kell (nevet kell
adni neki), msrszt meg kell adni a tpust, vagyis azt, hogy milyen rtkek kerlnek majd
bele. Emlkezznk vissza, hogy a memria nem ms, mint egy cmezhet bjtsorozat, s a
bjtok rtke 0 s 255 kz eshet. Egy bjt sok mindent jelenthet: lehet egy nagy szm elsnek
vagy utolsnak trolt bjtja, lehet egy szveg valamelyik karaktere, vagy jelenthet egy true
rtket. A program mindezt magtl nem tudhatja. A memriaterletnek a programoz ad
rtelmet azzal, hogy megadja a tpust. A program aztn a tpusnak megfelelen bnik a me-
mriaterlettel. A vltoz tpusa meghatrozza a vltoznak adhat rtkek tartomnyt,
valamint a rajta vgezhet mveleteket.

Mintaprogramunkban hrom vltoznak foglaltunk le helyet. Az elsnek letszam az azono-


stja s int tpus, a msik kettnek fejadag, illetve osszesen a neve s double a tpusa:

int letszam double fejadag double osszesen

20 0.4 8.0
11. Alapfogalmak 11.4. Vltoz, tpus 193

Az int azt jelenti, hogy egy ilyen tpus memriaterleten egy 4 bjtos eljeles egsz szmot
lehet trolni: az egsz szm rtke +0x7fffffff (decimlis 2147483647) s -0x80000000
(decimlis -2147483648) kztt mozoghat. A memriaterlet aktulis rtke a program futsa
sorn llandan vltozhat: felvehet pl. 0, 5, -9, 888 stb. rtkeket, ami csak belefr. A
double tpus vltoz 8 bjtot foglal le, s benne egy lebegpontos szm lakik.

A letszam vltoznak beolvasssal adunk rtket (letszam=Console.readInt()) a


fejadag vltoznak kezdeti rtket adunk (fejadag=0.4), az osszesen vltoznak pedig a
program ad rtket az elbbi kt vltoz aktulis rtkeitl fggen (osszesen=fejadag*
letszam). Az rtkeket a futs sorn termszetesen tbbszr is megvltoztathatnnk, st a
felhasznltl brmikor bekrhetnnk az aktulis rtket.
A programoznak ltalban nemigen kell trdnie azzal, hogy pontosan mekkora a klnfle
tpusokhoz tartoz terletfoglals, de azrt fontos, hogy felmrje: belefrnek-e akkora rtkek a
vltozba, amelyek a feladat megoldsa sorn felmerlhetnek. Ha nem gy van, akkor elfor-
dulhat, hogy a program rosszul mkdik, vagy futsi hibval lell.

Ne tvesszen meg senkit az, ha egy vltoznak az azonostja is szveg, meg a tartalma is.
Ezek a dolgok teljesen fggetlenek egymstl. A szveg nev dobozban lakhat akr
szveg, akr msSzveg is:
szveg szveg

szveg msSzveg

A vltoz deklarlsa
Javban a program ltal hasznlt sszes vltozt deklarlni kell, vagyis meg kell adni a nevt
s a tpust. Elszr megadunk egy tpust, majd felsorolunk egy vagy tbb azonostt, vessz-
vel elvlasztva. A deklarl utastst a ; zrja. A felsorolt vltozk mind a megadott tpusak
lesznek.
Mintaprogramunkban:
int letszam;
double fejadag, osszesen;

A deklarlt vltozra aztn a programoz a megadott nven hivatkozhat, s tpusnak megfe-


lel szablyok szerint hasznlhatja azt. A vltoz neve azonostja a vltozt, vagyis egyrtel-
mv teszi a r val hivatkozst.

Megjegyzs: Vannak olyan programnyelvek, melyekben a vltozdeklarci automatikus. Ez


azt jelenti, hogy ha egy olyan vltozt hasznlunk, amelyet mg nem deklarltunk, akkor azt
a fordt automatikusan deklarlja neknk. Az automatikus vltozdeklarci azonban ren-
geteg rejtett programhibt szlhet. A Java megkveteli a vltozk deklarlst.
194 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A vltoz inicializlsa
Amikor egy vltoznak kezdeti, indul rtket adunk, akkor a vltozt inicializljuk. Iniciali-
zlatlan vltoz rtknek lekrdezse szintaktikai hibt okoz, azt mr a fordt kiszri! Egy
vltozt inicializlhatunk deklarlskor vagy ksbb is. Fontos, hogy a vltoz rtke a forrs-
kdban jl kvethet legyen!
Egy vltoznak mr rgtn deklarlskor kezdrtket adhatunk. Tegynk az azonost utn
egy egyenlsgjelet, majd adjuk meg a kvnt kezdrtket megad kifejezst. Ha egy deklar-
ciban tbb vltozt sorolunk fel, akkor azok az inicializls szempontjbl kln letet lnek,
egymstl fggetlenl kapnak (vagy nem kapnak) kezdrtket:

Mintapldnkban a fejadag kap egy kezdrtket, az osszesen kezdrtk nlkl marad:


double fejadag=0.4, osszesen;

Konstans, a vltoztathatatlan vltoz


Megtehetjk, hogy egy vltozt egsz letre befagyasztunk, vagyis nem engedjk megvl-
toztatni. Ezt gy tehetjk meg, hogy a deklarci el tesszk a final mdostt (final =
vgleges). A konstansokat a kdolsi konvenci szerint csupa nagybetvel szoks rni:
final int EVSZAM=1999;

Mivel EVSZAM vltoztathatatlan, az EVSZAM=2000; rtkad utasts pldul fordtsi hibt


eredmnyezne.
Megjegyzs: A konstans nem tvesztend ssze a literllal! A konstans egy vltoz, melyre
hivatkozni lehet a nevvel; a literl a programkdba van begetve, s mshonnan nem lehet
r hivatkozni.

A Java tpusok osztlyozsa


A Java tpusok logikai csoportostsa a 11.2. brn lthat. Ktfle tpus ltezik:
A primitv tpus vltoz memriaterlete oszthatatlan, az egy lettelen, viselkeds
nlkli tulajdonsgot trol. A Javban mindssze 8 primitv tpus ltezik, ezek a byte,
short, int, long, char, float, double s boolean (az brn vastagon vannak
szedve).
A referencia tpus vltoz olyan mutat, mely egy objektum hivatkozst tartal-
mazza. Az objektum sszetett memriaterlet, tbb primitv tpus vltozt, valamint
tovbbi referencikat (hivatkozsokat) is tartalmazhat.

A primitv tpus lehet numerikus vagy logikai tpus; a numerikus tpus lehet sorszmozott
vagy vals tpus; a sorszmozott tpus pedig lehet egsz vagy karakter tpus.
Sorszmozott tpus (integral type): olyan tpus, amelyben minden lehetsges rtkhez egy
egyrtelm sorszm van rendelve.
11. Alapfogalmak 11.5. Primitv tpusok 195

A primitv tpusokat a kvetkez pontban rszletesen trgyaljuk.

Java tpus

Primitv Referencia

Numerikus Logikai Osztly/Interfsz Tmb

Sorszmozott Vals boolean Osztly tpus Interfsz tpus Tpus [ ]

Egsz Karakter float double

byte short int long char

11.2. bra. A Java tpusok osztlyozsa

Vltoz: Egy nvvel azonostott memriaterlet. Egy vltoznak mindig van azonostja
(neve), adott mret memriahelye, tpusa s aktulis rtke.
Tpus: A vltoz tpusa meghatrozza a vltoznak adhat rtkek tartomnyt, valamint a
rajta vgezhet mveleteket. A Javban ktfle tpus ltezik: primitv s referencia tpus. A
primitv tpusok a byte, short, int, long, char, float, double s boolean.
Deklarls, inicializls: A Javban minden vltozt deklarlni kell! Deklarlskor meg
kell adni a vltoz azonostjt s tpust, s az esetleges kezdrtket is (a vltoz iniciali-
zlhat). A deklarl utasts formja (a nagy zrjelben lv rszeket nem ktelez meg-
adni):
<tpus> <vltoz1> =<kifejezs1> , <vltoz2>=<kifejezs2>... ;

Konstans: Vltoztathatatlan vltoz. Mdostja final.

11.5. Primitv tpusok


Minden egyes tpushoz megadjuk a nevt, az ltala lefoglalt memria mrett, valamint a trol-
hat rtkeket. Az alkalmazhat opertorokat a 12., Kifejezsek, rtkads cm fejezetben
trgyaljuk.
196 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Egsz tpusok
Ngyfle egsz tpus van, mindnek lehet negatv rtke is:
Tpus neve Foglalt memria Legkisebb rtk Legnagyobb rtk
7
byte 1 bjt (8 bit) -2 = -128 27-1 = 127
short 2 bjt (16 bit) -215 = -32768 215-1 = 32767
int 4 bjt (32 bit) -231 = -2147483648 231-1= 2147483647
long 8 bjt (64 bit) -263 ~ -1019 263-1 ~ 1019

Vals tpusok

A vals tpusok szmbrzolst az IEEE 754 szabvny rja le. A pontossg itt azt jelenti, hogy
a program maximum hny szmjegyig terjed tizedest trol. Ennl nagyobb pontossg szmot
nem tudunk betenni a vals tpus vltozba. Ktfle vals tpust definiltak:
Legkisebb rtk
Tpus neve Foglalt memria Legnagyobb rtk Pontossg
float 4 bjt (32 bit) 1.40129846432481707e-45 6-7 jegy
3.40282346638528860e+38
double 8 bjt (64 bit) 4.94065645841246544e-324 14-15 jegy
1.79769313486231570e+308

A float tpus sokkal nagyobb szmot kpes trolni (~3E+38), mint a long tpus (~1E19).
Egy long szmnak azonban az sszes jegye szignifikns (szmt), a float szm vgn sok 0
szerepel (a szm utols jegyei elhanyagoldnak). Ha az 1234567890123456789L szmot
pldul egy float vltozba tesszk, akkor az rtk 1234567894000000000L-re csonkul,
ahogy ezt a kvetkez kis program mutatja:
// LongToFloat.java
public class LongToFloat {
public static void main(String[] args) {
long lon = 1234567890123456789L;
float f;
f = lon;
System.out.println(f); // 1.234567894E18
}
}

A kirt rtk teht 1.234567894E18 lesz, s ez egsz formban: 1234567894000000000.

Megjegyzs: A java.math csomagban lv BigInteger s BigDecimal osztly alkalma-


zsval tetszleges pontossg rhet el.
11. Alapfogalmak 11.6. A forrsprogram szerkezete 197

Karakter tpus
A karakter tpus vltozba egy karakterliterlt tehetnk bele.

Tpus neve Lefoglalt memria Legkisebb rtk Legnagyobb rtk


char 2 bjt (16 bit) '\u0000' (0) '\uffff' (65535)

Pldaknt a c vltozba egy 'A' rtket tesznk, majd a vltoz tartalmt kirjuk a konzolra:
// Karakter.java
public class Karakter {
public static void main(String[] args) {
char c = 'A';
System.out.println(c); // --> A
}
}

Logikai tpus
Egy logikai (boolean) tpus vltoznak egy boolean (logikai) literlt adhatunk rtkl, vagyis
a true vagy false rtk valamelyikt. E tpus nvadja George Boole XIX. szzadi angol
matematikus: t tekintik a szimbolikus logika megalkotjnak.

Tpus neve Foglalt memria Igaz rtk Hamis rtk


boolean nem definilt true false

Ha kt rtk sszehasonlthat, akkor sszehasonltsuk eredmnye vagy igaz, vagy hamis. Ha


pldul letszam egy int tpus vltoz, akkor a letszam>20 lehet igaz is, meg lehet hamis
is ez a letszam pillanatnyi rtktl fgg. Mivel az sszehasonlts eredmnye a program
folyamn vltozhat, van rtelme a mostani eredmnyt egy vltozban eltrolni:
boolean tulnagy;
tulnagy = letszam>20;

11.6. A forrsprogram szerkezete


Egy Java fordtsi egysg (forrsllomny) egy vagy tbb osztlybl llhat. Legyenek ezek az
osztlyok most a C1, C2 ... CN s az App (11.3. bra). Egyelre csak olyan programokkal fog-
lalkozunk, amelyeknek az osztlyait egyetlen fordtsi egysgben kdoljuk. A forrsllomny
neve a main metdust tartalmaz publikus osztly neve lesz: App.java. A forrskd fordt-
snak eredmnyeknt (javac App.java) annyi class kiterjeszts llomny keletkezik,
ahny osztlyt deklarltunk (App.class, C1.class ... CN.class). A Javban mindig
egy class kiterjeszts llomnyt futtatunk (java App). Csak olyan osztlyt lehet futtatni,
amelyben van egy main metdus. Indtskor a main automatikusan elkezd futni.
198 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

C1 CN App
v1, ...vN

... ... +main
+m1
...
+mN

11.3. bra. A Java forrsprogram szerkezete

Egy Java forrsprogram szerkezete a kvetkez (rszletek a 11.3. brn tallhat osztlyok
forrskdjbl):

// App.java forrsprogramja
import java.util.*; Csomagok importlsa
import extra.*;

// Egy vagy tbb osztly deklarlsa (a sorrend mindegy):


class C1 {
...
}
...

class CN {
...
}

// A fordtsi egysg egyetlen publikus osztlya.


// Ebben van a main:
osztly feje
public class App {
v1, ... vN // App vltozinak deklarcii
// main metdus:
public static void main(String[] args) { main metdus
// metdus blokkja
// vltozk deklarcii, utastsok
}
// App osztly egyb metdusai:
void m1() { az osztly blokkja
...
} a metdus feje
...
void mN() {
... a metdus blokkja
}
}
11. Alapfogalmak 11.6. A forrsprogram szerkezete 199

Importls

A fordtsi egysg elejn importlnunk kell azokat az osztlyokat, amelyekre a fordtsi


egysgben hivatkozni szeretnnk. A * azt jelenti, hogy a csomagban szerepl sszes osz-
tlyt importljuk; ekkor a csomag brmelyik osztlyra hivatkozhatunk. A java.lang
csomagot nem kell importlnunk, mert azt a fordt automatikusan megteszi.

A java.lang-ban van tbbek kztt a System osztly. A java.util egy API csomag, az
extra egy sajt osztlyokat tartalmaz csomag.

Osztlydeklarci

Az osztly deklarcija egy fejbl s egy blokkbl ll:


- Az osztly fejben a class kulcssz utal arra, hogy osztlydeklarcirl van sz. A
class kulcssz eltt szerepel az esetleges lthatsgi mdost, utna pedig az osztly
neve. Egy fordtsi egysgben csak egy publikus osztly lehet, s annak neve meg kell,
hogy egyezzk az llomny nevvel.
- Az osztly blokkjban lehet akrhny vltoz- s metdusdeklarci. Brmely met-
dus blokkjbl hivatkozhatunk brmely vltozra, illetve metdusra.

Metdusdeklarci (a main metdus)


Minden metdusnak van egy feje s egy blokkja (ha a metdus nem absztrakt). Egyelre
csak a main metdusba runk kdot. A main metdus fejnek rszei s azok jelentse a kvet-
kez:
public: a metdus lthatsga nyilvnos.
static: a metdus osztlymetdus (nem pldnymetdus).
void: a metdus nem ad vissza rtket, vagyis eljrs.
main: a metdus neve, azonostja.
(String[] args): a metdus paramtere.

Blokk
Lthattuk, hogy az osztlynak s a metdusnak is van blokkja. Ksbb ltni fogjuk, hogy bizo-
nyos utastsoknak is lehet blokkjuk.

Egy blokkot a {} karakterpr hatrol. A blokk sszefogja a benne tallhat utastsokat.


Mindaz, amit abban a blokkban adunk meg, pontosan arra a blokkra rvnyes. Ahol egy
utastst megadhatunk, ott megadhatunk blokkot is. A blokkot szoks sszetett utastsnak
is nevezni.
200 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Utasts

Egy blokk utastsokbl ll. Az utastsok fajti a kvetkezk:


- Deklarl utasts. Memriahelyek foglalsa. Pldul: int letszam;
- rtkad utasts. Pldul: letszam=45;
- Postfix s prefix nvel s cskkent utasts. Pldul: letszam++;
- Metdushvs. Pldul: System.out.println("Hello");
- Pldnyosts. j objektum ltrehozsa.
Pldul: aDatum = new Datum(2000,11,05);
- Programvezrl utasts. Pldul: if (i==0) ...
- res utasts: ; (csak egy pontosvessz)
Minden utastst pontosvessz zr le.

Figyelem! A blokk utn nem szabad pontosvesszt tenni!

Kivtelek

Ha egy utasts (pldul metdushvs) belsejben valamilyen rendellenessg, hiba trt-


nik, akkor az utasts kivtelt (exception) dobhat (bocsthat ki). Ekkor hacsak nem
kezeli valamilyen mdon ezt a kivtelt, a program hibazenet ksretben lell, ms
szval futsi hibval elszll. A hibazenet tartalmazza
- a kivtel tpust,
- a hiba okt,
- az osztly s a metdus nevt, amelyben a hiba keletkezett, valamint
- a hibs Java llomny nevt s abban a hibs sor szmt.
Ilyenkor javtsuk ki a hibt, majd fordtsuk s futtassuk jra a programot!

A kvetkez kis program a nullval val oszts miatt szll el, ha a felhasznl a Hnyan
vagytok? krdsre nullval vlaszol:
// Kivetel.java //1
import extra.*; //2
//3
public class Kivetel { //4
public static void main(String[] args) { //5
int narancsokSzama = 56; //6
System.out.println(narancsokSzama+" narancs van."); //7
int letszam = Console.readInt("Hnyan vagytok? "); //8
System.out.println("Fejadag:"+narancsokSzama/letszam);//9
System.out.println("Finom a narancs!"); //10
} //11
} //12
11. Alapfogalmak 11.7. Metdushvs (zenet) 201

Amint betik a nullt, a konzolon a kvetkez zenet jelenik meg:


java.lang.ArithmeticException: / by zero
at Kivetel.main(Kivetel.java:9)
Exception in thread "main"
Az zenet rtelmezse:
a kivtel tpusa: java.lang.ArithmeticException;
a hiba oka: / by zero (oszts nullval);
az osztly s a metdus neve, amelyben a hiba keletkezett: Kivetel.main;
a hibs Java llomny neve s abban a hiba helynek sorszma: Kivetel.java:9
A programot ktszer futtatjuk (ezttal JDK-ban): a bettt rtk elszr 5, majd 0. A msodik
esetben a fejadag s a "Finom a narancs!" mr nem rdik ki. A program futsnak konzolabla-
kt a 11.4. bra mutatja. A futsi hibrt termszetesen a program felels: meg kellett volna
vizsglnia, s el kellett volna utastania a bettt nulla rtket. A kivtelek kezelsvel a tan-
knyv 2. ktete foglalkozik majd.

11.4. bra. Futsi hiba (kivtel) keletkezse a Java programban

11.7. Metdushvs (zenet)

Egy osztly metdusnak vgrehajtst a metdus nevre val hivatkozssal krhetjk. A


metdus neve utn a () karakterpr szerepel, benne az esetleges paramterekkel. A met-
dus neve eltt megadhat az osztly vagy objektum neve attl fggen, hogy mit akarunk
megszltani:
- osztlymetdus hvsa: Osztly.metdus(paramterek)
- pldnymetdus hvsa: objektum.metdus(paramterek)
- ha a metdust a sajt osztlybl hvjuk, akkor nem kell minstennk, csak a nevt kell
megadnunk: metdus(paramterek)
202 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Egy metdus lehet eljrs vagy fggvny aszerint, hogy van-e visszatrsi rtke:
- Eljrs: visszatrsi rtke nincs, vagyis void (semleges). A visszatrsi rtk nlkli
metdusokat utastsknt hvjuk meg. Ekkor a metdus blokkja vgrehajtdik az aktu-
lis paramterek fggvnyben, majd visszakerl a vezrls a metdushvst kvet uta-
stsra. A metdushv utastst a ; (pontosvessz) zrja le.
- Fggvny: Ha egy metdusnak van visszatrsi rtke, akkor azt kifejezsben szoks
hasznlni ekkor a visszatrsi rtk behelyettestdik a kifejezsbe. Fggvnyt hasz-
nlhatunk pldul rtkad utasts jobb oldaln, metdusok paramtereiben stb.

Eljrs pldul:
System.out.println("Ezt a println eljrs rta ki");
Fggvnyek pldul:
java.lang.Math.sin(szogRadian), visszatrsi rtke double tpus
extra.Console.readInt(), visszatrsi rtke int tpus

Megjegyzs: A visszatrsi rtkkel rendelkez metdus (fggvny) meghvhat eljrsknt


is; ilyenkor a program nem hasznlja fel a visszatrsi rtket.
A Java osztlyknyvtra rengeteg metdust knl fel a programoznak. Mieltt azonban alkal-
maznnk egy metdust, meg kell nznnk, mi a metdus feladata (mit vrhatunk tle), s
hogyan lehet azt meghvni. A metdus lersban a kvetkez dolgok szerepelnek:
lthatsg;
a metdus neve;
a metdus feladata;
hny paramtere van, s azoknak egyenknt mi a tpusuk;
a visszatrsi rtk tpusa.

Ebben a knyvben szinte kivtel nlkl public lthatsg API metdusokrl lesz sz. Ezrt
az ttekinthetsg rdekben csak az ettl eltr lthatsgot adjuk meg.

Pldaknt nzzk meg a java.lang csomag Math osztlyban lev statikus cos metdust:
static double cos(double a)
a metdus neve: cos
feladata: Visszaadja az a szg koszinuszt.
a paramterek szma: 1, tpusa double
a visszatrsi rtk tpusa: double

A jellemzk egyrtelmen kiolvashatk a metdus fejbl, gy bven elegend megadni a


metdus fejt s feladatt:
static double cos(double a)
Visszaadja az a szg koszinuszt.
11. Alapfogalmak 11.8. rtkad utasts 203

Metdus szignatrja, tlterhels (overloading)


A Javban vannak olyan metdusok, amelyeket tbbfle paramterezssel lehet meghvni. Ez
azrt lehetsges, mert egy metdust a szignatrja (a metdus neve, a paramterek szma s
rendre a paramterek tpusai egytt) azonost. Az ugyanolyan nev, de ms paramterezs
metdus nem ugyanaz a metdus azt kln kdban adtk meg, ms implementcit takar.
Egy metdust mindig a paramtereivel egytt azonostunk. A metdusok e tulajdonsgt tl-
terhelsnek (overloading) nevezzk a metdust tlterheljk tbbfle paramterezssel.

Pldul a println() metdus paramtere lehet long, double vagy String is. Ez a metdus
annyiszor szerepel a PrintStream osztlyban, ahny klnbz paramterezse van.

11.8. rtkad utasts

Az rtkad utasts segtsgvel rtket adhatunk egy vltoznak:


<vltoz> = <kifejezs>;
Az rtkad opertor (= legyen egyenl) bal oldaln lev vltoz fel fogja venni a jobb
oldalon szerepl kifejezs rtkt.

A jobb oldali kifejezsnek jl meghatrozott tpusa van, amely a kifejezs alkotelemeitl


fgg. Az rtkads els lpseknt a program kirtkeli a kifejezst, azaz kiszmtja a kifejezs
aktulis rtkt a bal oldaltl fggetlenl. Ezt kveten a kapott rtket megprblja betenni a
bal oldali vltozba. A bettel nem minden esetben sikerl: fontos, hogy a kifejezs tpusa
rtkads szerint kompatbilis legyen a vltoz tpusval: egy long tpus rtk pldul
nem fr bele csak gy egy int tpus vltozba. Az rtkads mechanizmust a 11.5. bra
szemllteti. A kifejezsek tpusrl s kirtkelsrl a 12., Kifejezsek, rtkads cm feje-
zetben lesz sz.

letszam fejadag
10 0.21

letszam * fejadag

= 2.1
osszesen
?

11.5. bra. rtkad utasts


204 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Pldul:
letszam = 10; fejadag = 0.21;
osszesen = fejadag*letszam; // osszesen rtke 2.1 lesz

A Javban egyszerre tbb vltoznak is rtket adhatunk a kvetkezkppen:


vltoz1 = vltoz2 = kifejezs;
vltoz1 = vltoz2 = vltoz3 = ... kifejezs;

A kvetkez pldban letszam s fejadag vltoz rtke egyarnt 2:


letszam = fejadag = 2;

11.9. Adatok bevitele a konzolrl

extra.Console osztly
Egy modern program grafikus interfsz (ablakoz rendszer) segtsgvel kommunikl a
felhasznlval. A Java programoz kln API csomagokat hasznlhat a GUI (Graphical User
Interface, grafikus felhasznli fellet) beprogramozsra. Sajnos az AWT s a Swing haszn-
lata egy kezd programoz szmra nehz. Ezrt a kezdeti lpsek megttelhez felttlenl
szksges egy olyan metdusgyjtemny, amelynek segtsgvel a konzolrl egyszeren
bekrhetnk primitv tpus rtkeket. A Javban azonban a konzolrl val beolvass igencsak
bonyolult procedra. Mivel a Java kszti nem gondoltak a kezd programozkra, ezrt kny-
telenek vagyunk egy sajt osztlyt felhasznlni a konzolrl val beolvassokhoz: ez az extra
csomag Console osztlya (11.6. bra).

extra::Console

+readInt(str: String): int


+readInt(): int
+readLong(str: String): long
+readLong(): long
+readDouble(str: String): double
+readDouble(): double
+readChar(str: String): char
+readChar(): char
+readLine(str: String): String
+readLine(): String
+pressEnter()

11.6. bra. Az extra.Console osztly


11. Alapfogalmak 11.9. Adatok bevitele a konzolrl 205

Megjegyzs: Az extra csomag s a knyv forrskdmellklete letlthet a knyv htn meg-


jellt Internet cmrl!

A 11.6. brn lthat, hogy az UML-ben nhny jells eltr a Java szintaktiktl:
a csomag s az osztlynv kz az UML-ben kt kettspontot tesznk, a Javban csak
pontot;
az adatok s a paramterek UML-beli deklarcijban elbb szerepel az azonost,
azutn a tpus; Javban ugyanez fordtva van. UML-ben a metdus visszatrsi rtkt a
fggvny deklarcijnak vgn adjuk meg, Javban az elejn. Ezt a szablyt az UML
nem veszi nagyon szigoran megengedi a nyelvspecifikus elemeket is. Az a lnyeg,
hogy a terv mindig jl olvashat legyen.

A Console osztly statikus metdusai (a static kulcsszt nem rjuk ki, mert zavar lenne):
int readInt(String str)
int readInt()
Mindkt fggvny addig vr, amg a felhasznl be nem t egy egsz szmot. Az Enter
letse utn a fggvny a bettt int tpus szmmal tr vissza. Az str paramterben
megadhat a tnyleges bekrs eltt egy prompt, vagyis egy informcis szveg.
long readLong(String str)
long readLong()
Egy long tpus rtk bekrse konzolrl promptos s prompt nlkli vltozatban.
double readDouble(String str)
double readDouble()
Egy double tpus rtk bekrse konzolrl promptos s prompt nlkli vltozatban.
char readChar(String str)
char readChar()
Egy char tpus rtk bekrse konzolrl promptos s prompt nlkli vltozatban.
String readLine(String str)
String readLine()
Szveg bekrse egy String tpus vltozba a konzolrl promptos s prompt nlkli
vltozatban. str tartalma a teljes begpelt sor lesz az Enter letsig. A kvetkez kis
programrszlet pldul bekri a felhasznl nevt, majd duplzva kirja azt:
String nev = Console.readLine("Mi a neved? ");
System.out.println(nev+", "+nev+"!");
A Javban a szveget (karakterlncot) objektum trolja. A String tpus objektumnak
rtkl adhat egy szvegliterl. A String tpus objektum llapota nem vltoztathat,
abbl csak fggvnyekkel lehet informcit krni. A karakterlncokra nem lehet alkal-
mazni az sszehasonlt opertorokat! A karakterlncokkal a 16. fejezet foglalkozik.
206 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

void pressEnter()
Az eljrs vr az Enter billenty letsre. Bizonyos fejleszti krnyezetekben a prog-
ram lefutsa utn a konzolablak automatikusan becsukdik a pressEnter() utasts-
sal feltartztathatjuk ezt a becsukdst, s elolvashatjuk a program futsi kpernyjt.

11.10. Megjelents a konzolon


Konzolra a kvetkez metdusokkal rhatunk:
System.out.print(paramter)
System.out.println(paramter)
System.out.println()

A System osztly a java.lang csomagban tallhat (ezt a csomagot nem kell importlni). Az
out a System osztly egy objektuma (osztlyvltozja). Az out a PrintStream osztlybl
val, s az a java.io csomagba tartozik (az io csomagot nem neknk kell importlnunk). A
PrintStream osztlynak van egy println() metdusa, amely kpernyre rja a paramte-
rben megadott szveget.

A metdusoknak mindssze egyetlen paramterk lehet, de az tbbfle tpus: int, double,


String stb. Ha egyszerre tbb dolgot is ki szeretnnk rni (pldul egy szveget s egy int
tpus szmot), akkor ssze kell adnunk ket (pldul "Ltszm"+letszam). A Java mindent
szvegg tud konvertlni, s ezrt megengedi, hogy klnbz tpus kifejezseket sszead-
junk. A vgeredmny egy String tpus rtk lesz ezt a szveget fogja a print(), illetve a
println() kirni a konzolra. A println() metdus mindssze annyiban tr el a print()
metdustl, hogy a kirs vgn sort emel (print line).

Szablyok
A primitv tpus kifejezs rtke szvegg konvertldik, s ez rdik ki:
print(123); 123
print(123.4E3); 123400.0
print(0.4588877); 0.4588877
print('B'); B
boolean b=true; print(b); true
int a=1; print((a+12)*3); 39

A print metdus a paramterben megkapott szveget vltozatlan formban rja ki a


konzolra. Ha a szvegben escape szekvencik is vannak, akkor azok kivltjk a megfe-
lel hatst, mint tabulls, soremels stb.
print("a\tb\tc"); a b c
11. Alapfogalmak 11.10. Megjelents a konzolon 207

Szvegeket s primitv tpus kifejezseket tetszleges hosszsgban sszeadhatunk.


Ekkor a nem szveg tpus kifejezseket a metdus szvegg konvertlja:
print(letszam+" * "+fejadag+" kg = "+sszesen+" kg");
3 * 2 kg = 6 kg

Vigyzat! Ha egy kifejezsben String is van, akkor a fordt a nem zrjelezett kifeje-
zseket egyenknt karakterlncc konvertlja!
int a=1, b=2; System.out.println("a+b="+a+b); a+b=12
(nem a+b=3!)

Megjegyzs: A java.lang csomag System egysgben van egy statikus objektum: neve
out, osztlya PrintStream. A PrintStream osztlyban szerepelnek a print() s
println() pldnymetdusok.

extra.Format osztly
Sajnos a print() metdus a lebegpontos szmokat bartsgtalan formban ontja a konzolra,
s igaztsra sem lehet rbrni. A sajt extra.Format osztly metdusaival a kirand adato-
kat (szmokat, szvegeket) igaztani tudjuk. Elrhetjk pldul, hogy egy double tpus szm
ne lebegpontos formban kerljn a konzolra, hanem a megadott hosszsgban, a megadott
tizedesszmmal.

Az extra.Format osztly metdusai:


String left(long num, int len)
String right(long num, int len)
Visszaad egy len hosszsg szveget, melyben a num egsz szm balra (left), illetve
jobbra (right) van igaztva. A visszaadott szveg len-tl fggetlenl legalbb olyan
hossz, hogy a megadott szm elfrjen, vagyis a szm semmikppen sem csonkul.
String left(double num, int len, int frac)
String right(double num, int len, int frac)
Visszaad egy len hosszsg szveget, melyben a num vals szm balra (left), illetve
jobbra (right) van igaztva frac darab tizedessel, kerektve. A tbbi tizedes teht nem
rdik ki. A visszaadott szveg len-tl fggetlenl legalbb olyan hossz, hogy a meg-
adott szm elfrjen, vagyis a szm egsz rsze semmikppen sem csonkul.
String left(String str, int len)
String right(String str, int len)
Visszaad egy len hossz szveget, melyben az str szveg balra (left), illetve jobbra
(right) van igaztva. A szveget len-tl fggen levgja vagy szkzkkel egszti ki.
208 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Pldul:
int i = 45; Format.right(i,5) == " 45"
int i = 45; Format.left(i,5) == "45 "
double d = 59.9477; Format.right(d,6,2) == " 59.95"
double d = 126.1; Format.right(d,0,3) == "126.100"
String str = "Hapci"; Format.left(str,3) == "Hap"
Format.left(str,8) == "Hapci "
Format.right(str,2) == "Ha"

Megjegyzs: A konzolon val balra igaztott kirshoz hasznlhatja a TAB karaktert is.

Feladat Henger
Krjk be konzolrl egy henger sugart s magassgt cm-ben, majd
rjuk ki a henger trfogatt!
rjuk ki a henger slyt, ha ez tmr vashenger, s ha fahenger!
A kirsokban a szmokat igaztsuk egyms al, s kerektsnk 2 tizedesre!

A program terve
Ezt a tervet csak a tisztnlts vgett adjuk meg: ekkora program tervt nem szoks paprra
vetni. A tervbl az olvashat ki, hogy a main metdus hrom osztly statikus adatait, illetve
metdusait hasznlja:

java.lang::Math extra::Console extra::Format


PI: double
+readDouble(String): double +right(String): String

Henger

+main(String[])

Megjegyzs: Nem kell a terven felttlenl minden osztlyt szerepeltetni. Az a fontos, hogy a
terv alapjn a program knnyen kdolhat legyen. A Math, Console s Format osztlyokat
pldul tipikusan nem szoks feltntetni a programterven. Ha a program csak egy main me-
tdusbl ll, nem is szoktunk osztlydiagramot tervezni.
11. Alapfogalmak 11.10. Megjelents a konzolon 209

Forrskd
import extra.*;
public class Henger {
public static void main(String[] args) {
final float VAS_SURUSEG = 7.8F; // g/cm3
final float FA_SURUSEG = 0.7F; // g/cm3
double terfogat;
double sugar, magassag;
sugar = Console.readDouble("Sugr (cm)? ");
magassag = Console.readDouble("Magassg (cm)? ");
terfogat = sugar*sugar*Math.PI*magassag;
System.out.println("Trfogat : "+
Format.right(terfogat,8,2)+" cm3");
System.out.println("Vashenger: "+
Format.right(terfogat*VAS_SURUSEG,8,2)+" g");
System.out.println("Fahenger : "+
Format.right(terfogat*FA_SURUSEG,8,2)+" g");
}
}

A program egy lehetsges futsa


Sugr (cm)? 3
Magassg (cm)? 4.5
Trfogat : 127.23 cm3
Vashenger: 992.43 g
Fahenger : 89.06 g

A program (main metdus) elemzse

A VAS_SURUSEG s a FA_SURUSEG konstans, vagyis olyan vltoz, amelynek nem lehet meg-
vltoztatni az rtkt. Miutn bekrtk a felhasznltl a sugr s a magassg rtkt, //1-ben
kiszmtjuk a trfogatot. A Math.PI egy konstans, a Math osztly statikus vltozja. A kir-
sokban minden vltozt, illetve kifejezst 8 hosszon runk ki, ebbl a tizedesek szma 2.

Tesztkrdsek

11.1. Mely lltsok igazak az unikd karakterbrzolsra vonatkozan? Jellje meg az sszes
igaz lltst!
a) A maximlisan brzolhat karakterek szma 32768.
b) A maximlisan brzolhat karakterek szma 65536.
c) Hexadecimlis formja \uhhhh
d) Hexadecimlis formja //hhhh
210 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

11.2. Mik tartoznak a program szintaktikailag elklnthet alkotelemei kz? Jellje meg
az sszes j vlaszt!
a) azonost
b) metdusfej
c) szepartor
d) vltoz
11.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az ASCII kdkszlet a karaktereket 2 bjton brzolja.
b) Egy azonost szmjeggyel is kezddhet.
c) A megjegyzst a fordt nem veszi figyelembe.
d) Az azonostk elnevezsi konvencija szerint egy osztly azonostjt nagybetvel
kezdjk.
11.4. Mely azonostk helyesek szintaktikailag? Jellje meg az sszes j vlaszt!
a) for
b) 56kezd
c) Logika
d) x/y
11.5. Mely vltozdeklarcik helyesek szintaktikailag? Jellje meg az sszes j vlaszt!
a) int tripleSec;
b) int nagy.egesz;
c) char betu2;
d) integer i;
11.6. Mely vltozdeklarcik helyesek szintaktikailag? Jellje meg az sszes j vlaszt!
a) double d=49;
b) boolean egyenlo=5;
c) int a=256, b;
d) double d, e;
11.7. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Egy karakterliterl idzjelek (ketts aposztrfok) kztt adhat meg, pldul "=".
b) A szvegliterl csak akkor tartalmazhat idzjelet, ha azt ktszer lerjuk:
"Ez ""nem"" szp dolog!"
c) A vals literl megadhat akr tizedes, akr lebegpontos formban.
d) Az egsz literl megadhat hexadecimlis formban is.
11.8. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A Javban sszesen 4-fle primitv tpus ltezik: int, double, char s boolean.
b) A java.lang csomagot minden Java programban importlni kell.
c) Egy osztly tbb metdust is tartalmazhat.
d) Minden osztlyban kell lennie egy main metdusnak.
11. Alapfogalmak 11.10. Megjelents a konzolon 211

11.9. Mi jelenik meg a kpernyn a kvetkez utastsok vgrehajtsa utn? Jellje meg az
egyetlen j vlaszt!
byte a=5, b=2;
System.out.println("a+b= "+a+b);

a) a+b= 7
b) a+b= 52
c) a+b= 5 2
d) Semmi, mert a kdrszlet szintaktikailag hibs.

Feladatok

11.1. (A) Jelentse meg a konzolon a Holnap "j" leszek szvegkonstanst! (JoLeszek.java)

11.2. (A) Krje be konzolrl a felhasznl nevt, majd rja ki a kvetkez jkvnsgot:
Kedves X! Sikeres Java programozst! (Jokivansag.java)

11.3. (B) Krje be konzolrl egy hasb hrom lnek hosszsgt, majd rja ki a hasb felsz-
nt s trfogatt! (Hasab.java)

11.4. (C) Krjen be konzolrl kt vals szmot (az sszeadandkat)! Ezutn rja ki a szmo-
kat egyms al, kt tizedesre igaztva! Vgl hzzon egy vonalat, s rja ki a szmok
sszegt szintn kt tizedesre igaztva! Tegyk fel, hogy a szmok egsz jegyeinek
szma maximum 7, vagyis 2 tizedessel kirva 10 karakteren elfrnek. (Osszead.java)
212 IV. RSZ. JAVA PROGRAMOZSI ALAPOK
12. Kifejezsek, rtkads 12.1. A kifejezs alkotelemei 213

12. Kifejezsek, rtkads

A fejezet pontjai:
1. A kifejezs alkotelemei
2. Opertorok
3. Tpuskonverzik
4. rtkads
5. Kifejezsek kirtkelse pldk
6. Felttel
7. Paramtertads, tlterhelt metdusok
8. java.lang.Math osztly

A kifejezsek kirtkelst, illetve az rtkadst ersen bonyoltja az a tny, hogy az egyes


vltozknak tpusuktl fggen ms s ms a befogadkpessgk. Egy long tpus rtket
pldul, brmilyen kicsiny legyen az, nem lehet egyszeren rtkl adni egy int tpus vltoz-
nak, mert adatveszts kvetkezhet be. A Java nyelv szigor tpusegyeztetsi szablyokat llt
fel az adatvesztsi hibk kiszrsre. Ebben a fejezetben a kifejezsek kirtkelsvel s az
rtkadssal kapcsolatos szablyokat, az implicit s explicit tpuskonverzikat trgyaljuk.

12.1. A kifejezs alkotelemei

Egy kifejezs operandusokbl s opertorokbl (mveletekbl) ll (12.1. bra). A kife-


jezsben szerepelhet egy vagy tbb operandus, s brmelyik operandus lehet maga is egy
kifejezs. Vannak egy-, illetve ktoperandus opertorok.
Az operandus lehet:
- Vltoz
- Literl
- Fggvnyrtk
- Kifejezs (zrjelben vagy zrjel nlkl)
214 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

a + sin(5)

Operandus Opertor Operandus

12.1. bra. Kifejezs

Kifejezsek pldul:
alfa
Math.sin(alfa) + 5
-98E4
(j<5) || (j>10)
!(Math.sqrt((n+3)/2)==0)

A kifejezsek kirtkelsi sorrendjt a zrjelek s az opertorok hatrozzk meg. A


kirtkels a kvetkez szablyok szerint trtnik:
- Elszr a zrjelekben tallhat kifejezsek rtkeldnek ki (bellrl kifel).
- Ezen bell elbb mindig a nagyobb priorits mvelet hajtdik vgre.
- Ha a mveletek prioritsa egyforma, akkor a mvelet asszociativitstl fggen jobb-
rl balra () vagy balrl jobbra () trtnik a kirtkels.

Az operandus tpusa
A Java nyelvben minden operandusnak van egy jl meghatrozott tpusa. Minden opertorhoz
tartozik egy szably arra vonatkozlag, hogy milyen tpus operandus llhat annak bal, illetve
jobb oldaln. Az adott mvelettl s annak operandusaitl fggen a mvelet eredmnynek is
jl meghatrozott tpusa lesz. Elszr nzzk meg, hogyan tudjuk egyrtelmen megllaptani
egy operandus tpust, aztn vegyk sorra a mveleteket s a kirtkelssel kapcsolatos szab-
lyokat.

Az operandus tpust a kvetkezkppen tudjuk megllaptani:


- Egy vltoz tpusa a deklarlskor megadott tpus;
- Egy fggvny tpusa annak visszatrsi rtke;
- Egy egsz literl automatikusan int tpus, hacsak nem tesznk a szm mg egy L
bett ekkor a literl long tpus lesz (pl. 0L, 236L). Egy literl tpusa nem lehet sem
byte, sem short.
- Egy vals literl automatikusan double tpus, hacsak nem tesznk a szm mg egy F
bett ekkor a literl float tpus lesz (pl. 2F, 3.1F).
- A logikai, a karakter s a szvegliterlok tpusai rendre boolean, char s String. A
String nem primitv tpus, hanem osztly a String vltozkrl ksbb lesz sz.
12. Kifejezsek, rtkads 12.2. Opertorok 215

12.2. Opertorok
A 12.2. brn felsoroljuk a Java sszes opertort. A mveletek prioritsa fentrl lefel
cskken, az egy sorban szerepl opertorok prioritsa egyenl. Az asszociativits a kirtkels
irnyt adja meg (bal asszociativits: balrl jobbra; jobb asszociativits: jobbrl balra).
Egy opertor lehet:
unris, melynek egyetlen operandusa van. Ilyen pldul a negatv kpzs: -i.
Az unris opertor lehet
prefix, mely az operandus eltt szerepel. Ilyen a kirtkels eltti lptets: ++i
postfix, mely az operandus utn szerepel. Ilyen a kirtkels utni lptets: i--
binris, melynek kt operandusa van. Ilyen pldul az sszeads: i+j

Prior. Opertor Elnevezs Asszoc.


[] . (<param>) ++ -- unris postfix opertorok
++ -- + - ~ ! unris prefix opertorok
new (<tpus>)<kif> pldnyosts, tpusknyszerts
* / % multiplikatv opertorok
+ - additv opertorok
<< >> >>> bitenknti lptet opertorok
< <= > >= instanceof hasonlt opertorok
== != egyenlsgvizsgl opertorok
& logikai/bitenknti S
^ logikai/bitenk. KIZR VAGY
| logikai/bitenknti VAGY
&& logikai rvid S
|| logikai rvid VAGY
?: feltteles kirtkels
= += -= *= /= %= &= |= ^= rtkad opertorok
<<= >>= >>>=

12.2. bra. Java opertorok

Figyelje meg, hogy az rtkad opertoroknak a legalacsonyabb a prioritsa. rtkadskor


ezrt elszr kirtkeldik a teljes jobb oldal, amely azutn bekerl a bal oldali vltozba.
216 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A tblzat mveleteit pldk segtsgvel magyarzzuk meg. Minden esetben megadjuk a


kirtkelt kifejezs tpust s az eredmnyt. Tegyk fel, hogy az egsz fejezetben rvnyesek a
kvetkez deklarcik (a vltozk nevbl knnyen lehet kvetkeztetni tpusukra):
boolean bool; char c;
byte b; short s; int i; long lon; float f; double d;

Unris postfix s prefix opertorok


[] : tmbkpz opertor (lsd a 18., Tmbk fejezetet).
. (pont) : minst opertor.
(<param>) : metduskpz opertor (lsd a 15., Metdusok rsa fejezetet).
~ s ! : (lsd ezt a fejezetet, Logikai opertorok s Bitenknti opertorok).
new : pldnyost opertor (lsd a 16., Karakterlncok, csomagolk fejezetet)
(<tpus>)<kif> : tpusknyszert opertor (lsd ezt a fejezetet, Tpuskonverzik)

+ (plusz), - (mnusz)

Eljel opertorok: a prefix - (mnusz) eljel opertor egy egsz vagy vals kifejezst a -1-
szeresre vltoztat. A + (plusz) eljel opertor a kifejezst vltozatlanul hagyja.

++ (plussz plussz), -- (mnusz mnusz)

Lptet opertorok: a prefix, illetve a postfix lptet opertor eggyel nveli (++), vagy csk-
kenti (--) a hozz tartoz numerikus vltozt. A klnbsg akkor jelentkezik, ha a lptetst
egy kifejezsen bell hasznljuk. A prefix lptet megnveli a vltozt, s aztn hasznlja fel a
vltoz rtkt a kifejezsben, a postfix vltozat pedig elbb hasznlja fel az rtket, s csak
utlag nveli a vltozt.
Pldk az eljel s lptet opertorokra:
Utastsok Eredmny
i=3; i=-i; i==-3
i=3; i++; i==4
d=1.1; d--; d==0.1
s=-2; ++s; s==-1
i=3; lon=3+i++; lon==6, i==4
i=3; lon=3+ ++i; lon==7, i==4

Megjegyzs: Kerljk a bonyolult, olvashatatlan utastsokat! Br a


lon=4; i=3; lon=lon+++i; az eredmny: lon==7, i==3.
rtkads-sorozat teljesen szablyos, ne alkalmazzuk! A + jeleket mindenkppen vlasszuk
szt (lon=lon++ +i;)! Ez az eset radsul megtveszt is, hiszen lon lptetse teljesen
felesleges (fellrjuk rtkt).
12. Kifejezsek, rtkads 12.2. Opertorok 217

Multiplikatv (szorz) opertorok


Ide tartoznak a * (szorzs), / (oszts), s a % (maradkkpzs). A maradkkpzs a vals
szmokra is alkalmazhat. Ha az operandusok egszek, akkor az eredmny is egsz, ha lega-
lbb az egyik operandus vals, akkor az eredmny is vals.
Pldk:
Utastsok Eredmny
d=1.0; d=d*6; d==6.0
i=22; i=i/5; i==4
d=20.5; d=d/5; d==4.1
i=22%5; i==2
f=20.5F%5; f==0.5

Additv (sszead) opertorok


Ide tartoznak a + (sszeads) s a - (kivons).
Pldk:
Utastsok Eredmny
i=3; f=i+600; f==603.0
i=3; i=7-i; i==4

Hasonlt s egyenlsgvizsgl opertorok


Ezek az opertorok sszehasonltjk a jobb s bal oldal rtkt. Az eredmny egy boolean
tpus rtk lesz, true vagy false.
Hasonlt opertorok: < (kisebb-e), <= (kisebb vagy egyenl-e), > (nagyobb-e), >=
(nagyobb vagy egyenl-e).
Egyenlsgvizsgl opertorok: == (egyenl-e), != (nem egyenl-e).

Pldk:
Utastsok Eredmny
i=3; bool=i==3; bool==true
i=3; bool=i>=5; bool==false

Logikai opertorok
A logikai kifejezsekre alkalmazhatk a ! (nem), az & (s), s a | (vagy) mveletek. A !
unris, a & s | mveletek binrisak. A logikai mveletek eredmnyeit a megfelel
218 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

igazsgtblk szemlltetik, amelyek a b1 (s b2) logikai vltozk minden lehetsges rtk-


kombincijra megadjk a kifejezs rtkt.
boolean b1, b2;

! (NEM)

A logikai tagads (nem=not) az rtket egyszeren megfordtja:


b1 !b1
true false
false true

&, && (S)

A logikai szorzs (s=and) eredmnye true, ha mindkt operandus true. Minden ms esetben
false rtket ad:
b1 b2 b1 & b2
true true true
true false false
false true false
false false false

Az && mvelet a rvid kirtkels (short circuit) vltozat. Ez azt jelenti, hogy csak addig
trtnik kirtkels, amg a program el nem tudja dnteni a vgeredmnyt. Az i==3 && f!=4
kifejezsben pldul az f!=4 mr nem rtkeldik ki, ha i rtke nem 3. A rvid kirtkels
gyorstja a programot, arra azonban vigyzni kell, hogy a kifejezs nem kirtkelt rsznek
lehet olyan mellkhatsa, amely fontos az algoritmus helyessge szempontjbl.
|, || (VAGY)

A logikai sszeads (vagy=or) eredmnye false, ha mindkt operandus false. Minden ms


esetben true rtket ad:
b1 b2 b1 | b2
true true true
true false true
false true true
false false false

A || mvelet a rvid kirtkels (short circuit) vltozat. A kvetkez program arra plda,
hogy a rvid s a teljes kirtkels ms vgrehajtst eredmnyez:

Feladat Egy vagy kt A bet


A program krjen be egy karaktert. Ha az nem az A bet, akkor krjen be mg egyet.
Vgl rja ki, hogy az egyik bet A bet volt-e.
12. Kifejezsek, rtkads 12.2. Opertorok 219

import extra.*;
public class EgyketA {
public static void main(String[] args) {
boolean vanA;
vanA = Console.readChar("rjon be egy bett: ")=='A' ||
Console.readChar("Mg egyet: ")=='A';
System.out.println("Volt benne A bet: "+vanA);
}
}

A program egy lehetsges futsa


rjon be egy bett: A
Volt benne A bet: true

Futtassa a programot gy, hogy a || mveletet kicserli a | mveletre! Ekkor mindenkppen


kt karakterbeolvass megy vgbe fggetlenl attl, hogy az els alkalommal A bett tttek-e
be, vagy sem.
^ (KIZR VAGY)

A logikai kizr vagy (exclusive or) eredmnye true, ha a kt operandus kzl az egyik true,
a msik false. Minden ms esetben false rtket ad:
b1 b2 b1 ^ b2
true true false
true false true
false true true
false false false

Pldk:
Utastsok Eredmny
i=3; s=-2; bool = (i<4) & (s!=6); bool==true
b=1; s=-2; bool=true; bool = b==s | !bool; bool==false
i=3; d=1.0; bool = i==5 | d!=4; bool==true

Megjegyzs: Az (i<4) & (s!=6) kifejezsben nem kellene zrjeleket alkalmaznunk,


hiszen az & gyengbb mvelet, mint a hasonlts. Sokszor azonban a zrjelek hasznlata
javtja az olvashatsgot.

Bitenknti opertorok
A logikai mveletek bitekre is alkalmazhatk. A bitenknti ~ (NEM), & (S), | (VAGY) s ^
(KIZR VAGY) mveletek bitenknt vgzik el a logikai mveleteket gy, hogy az 1 true, a
0 pedig false rtknek szmt. A mveletek mindig az egymsnak megfeleltethet biteken
hajtdnak vgre. b<<n (signed shift-left) b-ben n-nel balra tolja a biteket gy, hogy jobbrl
nullk jnnek be. b>>n (signed shift-right) b-ben n-nel jobbra tolja a biteket gy, hogy balrl
220 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

nullk (ha b pozitv) vagy egyesek (ha b negatv) jnnek be. A b>>>n (shift-right-with-zero-
fill) b-ben n-nel jobbra tolja a biteket gy, hogy balrl mindenkppen nullk jnnek be.

A kvetkez pldban a mvelet bal oldaln mindig b=124 van. Az egyes sorok vgn meg-
jegyzsbe tettk a konzolon megjelen eredmnyt, majd zrjelben a szm kettes szmrend-
szerbeli alakjnak utols 8 bitjt:
public class BitMuveletek {
public static void main(String[] args) {
int b=124; // b=124 (01111100)
System.out.println("~b ="+~b); // ~b =-125(10000011)
System.out.println("b|1 ="+(b|1)); // b|1 =125 (01111101)
System.out.println("b&4 ="+(b&4)); // b&4 =4 (00000100)
System.out.println("b^2 ="+(b^2)); // b^2 =126 (01111110)
System.out.println("b<<1 ="+(b<<1)); // b<<1 =248 (11111000)
System.out.println("b>>1 ="+(b>>1)); // b>>1 =62 (00111110)
System.out.println("b>>>3="+(b>>>3));// b>>>3=15 (00001111)
}
}

Feltteles kirtkels
A feltteles kirtkels szintaktikai formja a kvetkez:
(felttel) ? kifejezs1 : kifejezs2;

Ha a felttel rtke true, akkor kifejezs1 kerl kirtkelsre, egybknt kifejezs2.


Pldul:
int teljesitmeny = 60;
int premium = (teljesitmeny>50)?10000:0; // -> 10000

rtkad opertorok

Az rtkad mvelet egy vltoznak ad rtket:


<vltoz> = <kifejezs>;

Az = rtkad opertor beteszi a bal oldali vltozba a jobb oldali kifejezs rtkt. A bal
oldal kizrlag vltoz lehet. A jobb oldal tetszleges kifejezs, amely lehet vltoz, vagy
literl is.
Ha egy vltoz rtkt egy adott rtkkel nvelni/cskkenteni, szorozni/osztani stb. akar-
juk, akkor hasznlhatjuk az n. kiterjesztett aritmetikai opertorokat:
- += hozzadja a vltozhoz a jobb oldal rtkt: a+=b;
- -= levonja a vltozbl a jobb oldal rtkt: a-=b;
- *= megszorozza a vltozt a jobb oldal rtkvel: a*=b;
- /= elosztja a vltozt a jobb oldal rtkvel: a/=b;
- %= a jobb oldallal val oszts maradkt teszi be a vltozba: a%=b;
12. Kifejezsek, rtkads 12.3. Tpuskonverzik 221

Pldk:
Utastsok Eredmny
i=32000; i==32000
s=-2; s+=2; s==0
lon=4; lon-=7; lon==-3
d=1; d/=2; d==0.5

Vigyzat! Az rtkads jele nem tvesztend ssze az egyenlsgvizsglat (==) jelvel. Az


a=b eredmnye nem igaz vagy hamis, hanem az a rtke b lesz, mg akkor is, ha ugyana-
zon kifejezsen bell hasznljuk!

12.3. Tpuskonverzik

A Java ersen tpusos nyelv. Ez azt jelenti, hogy a fordt a tpus kompatibilitsnak
ellenrzst minden lehetsges esetben elvgzi. Egy tpus kompatbilis egy msik tpussal,
ha az adott krnyezetben helyettesthet vele.
Bizonyos mveletek vgrehajtsa eltt az operandus tpust konvertlni kell egy msik
tpuss.
A tpuskonverzit jellegt tekintve kt szempontbl is osztlyozhatjuk:
- automatikus (implicit) vagy knyszertett (explicit) konverzi: els esetben a kon-
verzit a fordt automatikusan elvgzi, msodikban a programoznak kell azt kikny-
szerteni;
- konverzi irnya: eszerint megklnbztetnk szkt vagy bvt tpuskonverzit.

Implicit s explicit tpuskonverzi

A tpuskonverzi implicit, ha azt a fordt automatikusan elvgzi, s explicit, ha azt a


programoznak kell elvgeznie. Ez utbbi esetben tpusknyszertsrl beszlnk, ilyen-
kor a programoz egy kifejezs rtkre rerltet egy tpust:
(<tpus>)<kifejezs>

A kifejezs el kell teht rnunk zrjelben azt a tpust, amit r szeretnnk hzni az rtkre.
A tpusknyszerts angol neve type cast, ezrt az rtket, illetve vltozt castolni (ksztolni)
is szoktk.
Pldul:
double d; int i = 5;
d = i; // int konvertlsa double tpusv implicit mdon. Bvts.
222 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

d = 79.4;
i = (int)d; // double konvertlsa int tpusv explicit mdon. Szkts. ->79
// i = d; // Szintaktikai hiba!!!

Szkt s bvt konverzik

Primitv tpusok esetn egy szkebb adattpus rtke konvertlhat egy bvebb adattpus
rtkbe informciveszts nlkl. Az ilyen konverzit bvt konverzinak nevezzk. A
bvt konverzik irnyt a 12.3. bra mutatja. A konverzi tranzitv.

Egy int tpus rtkre pldul minden tovbbi nlkl rhzhat a long tpus, hiszen az rtk
bven belefr egy long tpus dobozba, mg ltyg is benne. A konverzi tranzitv: pl-
dul ha egy int tkonvertlhat long tpuss, az pedig float-t, akkor az int tkonvertl-
hat float tpuss is.

byte short
int long float double
char

12.3. bra. A bvt konverzi irnya

Szkt konverzirl akkor beszlnk, ha egy bvebb tpusbl szkebb tpusba konvert-
lunk. A szkt konverzi informcivesztssel jrhat.

A long tpus rtk pldul csak akkor fr bele egy int tpus vltozba, ha az nem nagyobb
az int-ben brzolhat maximlis, s nem kisebb az int-ben brzolhat minimlis rtknl.

Lthat, hogy a char tpus int tpusv bvthet: az egsz rtk a karakter unikdja lesz. A
tbbi esetben egyszer msols megy vgbe, kivve a longfloat esetet, amikor a pontos-
sg csonkulhat, hiszen a float tpus lebegpontosan trolja a szmokat, s csak 6-7 jegy
pontossg (1234567890123456789L1.23456794E18F).

A boolean tpus rtket nem lehet konvertlni egyetlen msik primitv tpusba sem, s egyik
rtk sem konvertlhat boolean tpusv.

Pldul:
int i = 'A'; // implicit bvt konverzi, char int (i==65)
char c = (char)65; // explicit szkt konverzi, int char (c=='A')
12. Kifejezsek, rtkads 12.4. rtkads, rtkadsi kompatibilits 223

Numerikus opertorok tpuskonverzii


Egy numerikus opertornak csak bizonyos tpus operandusai lehetnek. A szorzs bal-, illetve
jobb oldaln llhat pldul numerikus, de nem llhat logikai tpus kifejezs. Emlkezznk
vissza arra, hogy az egsz literl automatikusan int, a vals literl pedig automatikusan
double tpus.

A Java a numerikus opertorok operandusait kirtkels eltt a kvetkez szablyok szerint


automatikusan konvertlja:
- Unris (egy operandus) mveletek esetn: Ha az operandus tpusa int-nl szkebb,
akkor az operandust int tpusv konvertlja, egybknt nem konvertlja.
- Binris (kt operandus) mveletek esetn: Mindkt operandust a kett kzl a bvebb,
de minimum int tpuss konvertlja.
Az eredmny tpusa a kzs, konvertlt tpus lesz.

Pldul:
Kifejezs Eredeti tpusok Konvertlt tpusok Kifejezs tpusa
b*s byte*short int*int int
i/lon int/long long/long long
f+3 float+int float+float float
12L-s long-short long-long long
lon*1.0 long*double double*double double
c/b char/byte int/int int

A Javban ha az a s b egsz tpus kifejezsek, akkor az a/b is egsz! Az eredmny nem


kerektssel, hanem levgssal keletkezik. Pldul: 5/6==0, 1/2==0, 25/6==4.

12.4. rtkads, rtkadsi kompatibilits


Az rtkad opertor bal oldaln egy vltoz, jobb oldaln egy kifejezs ll:
<vltoz> = <kifejezs>

Az rtkad opertor precedencija a legkisebb, gy mindig a jobb oldali kifejezs rtke-


ldik ki elszr, s csak ezutn kerl be az eredmny a bal oldali vltozba. Az rtkad
opertor a mvelet eredmnyekppen visszaadja a jobb oldali kifejezs rtkt. Ezrt a
Javban a tbbszrs rtkads is rtelmezhet:
<vltoz1> = <vltoz2> = ... <vltozN> = <kifejezs>

Az rtkad opertor jobb asszociativits, elszr teht a jobb rtkads kerl kirtke-
lsre (<vltozN>=<kifejezs>), majd a kifejezs sorban bekerl a tbbi vltozba is.
224 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A deklarl utastsban egy vltoznak rtkadssal kezdrtk adhat:


<tpus> <vltoz> = <kifejezs>;

A kvetkez pldban a //1 s //2 sorok egyenrtkek:


int n1, n2;
n2 = 5; n1 = n2; //1
n1 = n2 = 5; //2

A terfogat vltoznak deklarlskor adunk rtket:


double terfogat = 15*5*Math.PI*4/1E6;

A kvetkez plda azt mutatja, hogy a terulet=a*b rtke maga a terulet ezt rjuk ki:
int terulet; int a=2, b=3;
System.out.println(terulet=a*b); // -> 6
System.out.println(terulet*2); // -> 12

A kifejezs tpusnak rtkads szerint kompatbilisnek kell lennie a vltoz tpusval!


rtkads eltt a jobb oldal kirtkeldik, teht mindkt oldal tpusa adott. Az rtkads
vgrehajtsakor a Java a kvetkez szablyok szerint jr el:
- Ha a bal s jobb oldal tpusai megegyeznek, akkor az rtkads tpuskonverzi nlkl
vgrehajtdik.
int i,j;
i = 5; // mindkt oldal int tpus
j = i; // mindkt oldal int tpus
byte b = (byte)128; // 128 nem fr be, ezrt knyszertjk -128!!

- Ha a jobb oldal szkebb, mint a bal oldal, akkor implicit bvt konverzi kvetkezik
be (a jobb oldalt a bal oldal tpusra konvertlja).
long lon; int i=50; double d;
lon = i; // implicit konverzi: int long
d = 2; // implicit konverzi: int double

- Implicit szkt konverzi trtnik, ha a bal oldal tpusa byte, short vagy char, s a
fordt el tudja dnteni, hogy az int tpus jobb oldal belefr-e a bal oldalba. Ezt a
fordt termszetesen csak akkor tudja eldnteni, ha a jobb oldali kifejezs kizrlag
literlokat tartalmaz, vagyis nincsen benne hivatkozs (vltoz/fggvny).
byte b = 127; // 127 rtke belefr a byte-ba
char c = 65; // belefr, van ilyen karakter

- Minden ms esetben (amikor a fordt nem kpes implicit tpuskonverzival a kt oldalt


kompatbiliss tenni) fordtsi hiba keletkezik.
12. Kifejezsek, rtkads 12.4. rtkads, rtkadsi kompatibilits 225

A fordtsi hiba tpusknyszertssel elkerlhet, de a vele jr esetleges logikai hiba nem!


A tpusknyszertst teht csak nagy krltekintssel szabad alkalmazni.

Tekintsk a kvetkez programrszletet:


int i= 32000;
short s;
s = (short)i;
System.out.println(i+", "+s);

A program jl mkdik: ktszer kirja a 32000 rtket. De ha i kezdeti rtke 33000, akkor s
rtke torzul, s a kpernyn ez jelenik meg: 32000, -32536. A 33000 ugyanis mr nem fr
bele a short dobozba. Ezt a prselst a rendszer automatikusan nem is tenn meg, de mivel
mi a leghatrozottabban krtk a bettelt, ht megtette. A 33000-bl gy lett -32536. A for-
dtprogram ezrt persze nem vllalt garancit.
Nzznk meg nhny helyes s helytelen rtkadst:
Helyes Nem helyes
d=f; b=s;
f=lon; //lehet adatveszts s=i;
lon=i; lon=f;
d=b; c=i;
i=c; c=f;
f=c; // f==65.0 c=s;
s=32000; b=256;

Kiterjesztett aritmetikai rtkadsok (*=, /=, %=, +=, -=)

A kiterjesztett rtkad opertor szintaktikai formja a kvetkez:


<vltoz> <opertor> = <kifejezs> (ahol opertor: *, /, %, +, -)
Szemantikja pedig a kvetkez:
<vltoz> = (<tpus>)<vltoz> <opertor> <kifejezs>
ahol tpus a vltoz tpusa, amelyet rknyszertnk a jobb oldalra. A vltozt teht meg-
szorozzuk a kifejezssel, rknyszertjk sajt tpust, s ez lesz a vltoz j rtke.

Vigyzni kell, mert a jobb oldali eredmnyt a bal oldal csonkthatja!

Pldaknt megadunk kiterjesztett rtkad utastsokat, s mindegyikhez megadjuk annak


kiterjeszts nlkli prjt. Minden rtkads eltt i rtke legyen 5:
int i=5;
226 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Kiterjesztett rtkads Kiterjeszts nlkli forma Eredmny


i += 4; i = (int)(i+4); -> i==9
i *= 6; i = (int)(i*6); -> i==30
i *= 1.1; i = (int)(i*1.1); -> i==5

Az utols esetben 5*1.1==5.5, ami int-t alaktva 5.

12.5. Kifejezsek kirtkelse - pldk


sszefoglalsknt nzzk meg nhny kifejezs kirtkelst! Minden egyes esetben megvizs-
gljuk, hogy mi a kifejezs tpusa s rtke, az eredmnyrl programrszlettel gyzdnk meg.
A vizsgland kifejezseket vastagon szedtk:

1. plda: Vigyzat, a d*i/2 nam ugyanaz, mint i/2*d!


int i=5; double d=1;
System.out.println(i/2*d); //1 2.0
System.out.println(d*i/2); //2 2.5
//1-ben elszr az i/2 rtkeldik ki: e rszkifejezs int tpus, rtke 2; itt vsz el
teht a pontossg. A vgeredmny mr double tpus lesz, rtke 2*1.0==2.0.
//2-ben elszr d*i kerl kirtkelsre: e rszkifejezs double tpus, rtke 2.5. A
vgeredmny is double tpus lesz, rtke 2.5*1.0==2.5.

2. plda:
byte b=1; int i=3;
boolean ok = (b+2*i++)%2==0|i==3;
System.out.println(ok); // false
1. lps: i++ (a kifejezs tpusa int, rtke 3, de: i rtke 4!). 2. lps: 2*i++ (tpusa
int, rtke 6). 3. lps: b+2*i++ (tpusa int, rtke 7). 4. lps: (b+2*i++)%2 (tpusa
int, rtke 1). 5. lps: (b+2*i++)%2==0 (tpusa boolean, rtke false). 6. lps: i==3
(tpusa boolean, rtke false). 7. lps: (b+2*i++)%2==0|i==3 (tpusa boolean, rtke
false)
3. plda: Vigyzat, tlcsorduls!
double d; byte b=-2; short s=30000; int i=5000000; float f=5F;
d = f*-b+s*i;
System.out.println(d); // -3.2385536E8
Az teljes kifejezs tpusa float. Azonban az s*i tpusa int, amibe a 30000*
5000000 mr nem fr bele, ezrt ezen a ponton tlcsorduls kvetkezik be.
3. plda:
short s=32; char c=' '; // a szkz unikdja 32.
int i = c/s;
System.out.println(i); // 1
12. Kifejezsek, rtkads 12.6. Felttel 227

A char s a short egyarnt int-t konvertldik, s az eredmny int lesz. Az ered-


mny teht 32/32=1 lesz.
4. plda:
char c=65;
double d = c/10;
System.out.println(d); // 6.0
A c vltozba az int tpus 65 belefr, az rtkads teht leglis. A c/10 kifejezsben
c int-t konvertldik, s az egsz oszts eredmnyekppen a jobb oldal rtke 6 lesz.
Ez kerl bele a double tpus bal oldalba.
5. plda: Vigyzat, a b=b+10; s a b+=10; rtkad utastsok nem egyformk!
byte b=110;
// b=b+10; //1 fordtsi hiba!
b += 10; //2 b==120, mg belefr
b += 10; //3 b==-126, tlcsorduls!

//1 fordtsi hibt eredmnyez. Ez azrt van, mert a jobb oldal int tpus, amely nem
kompatbilis a byte-tal. //2-ben a jobb oldal byte tpus, s az eredmny belefr a bal
oldalba. //3-ban az eredmny tlcsordul.

12.6. Felttel

Felttelnek nevezzk a boolean tpus kifejezst.

Pldul:
a==b & a%2==0 | !a+b<10

A felttelek s klnsen az sszetett felttelek megfogalmazsa nem mindig egyszer feladat.


Elszr meg kell fogalmaznunk az egyszer feltteleket.
Ezutn az egyszer feltteleket sszekapcsoljuk logikai mveletekkel a prioritsi
szablyok figyelembevtelvel: legersebb a !, aztn az & s a |, vgl az &&, s a ||,
egybknt a balrl jobbra szably rvnyes.
Megprbljuk a felttelt minl egyszerbb formra hozni.
A felttelt szraz teszt al vetjk, vagyis tbb konkrt esetre kiprbljuk, helyes-e az
eredmny.
Pldaknt fogalmazzunk meg nhny felttelt! Legyenek a, b, c s d int tpus vltozk:
a s b kzl egyik sem nulla:
a nem nulla: a!=0
b nem nulla: b!=0
228 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Teljesljn mindkett felttel egyszerre: a!=0 && b!=0


Teszteljk a felttelt: Legyen pldul a=0, s b=5. Ekkor az a!=0 felttel false, a
b!=0 felttel true. A false & true pedig false eredmnyt ad. Az egyik sem nulla
felttel ebben az esetben teht hamis, ahogy azt vrtuk is.
a 25-nl nagyobb s pros, b pedig (a hatrokat is belertve) 1000 s 2000 kz es,
nullra vgzd szm:
(a>25 && a%2==0) && (b>=1000 && b<=2000 && b%10==0)
a s b kzl legalbb az egyik nagyobb, mint 100.
a>100 | b>100
a s b kzl pontosan az egyik nagyobb, mint 100.
a>100 ^ b>100
a s b kzl, valamint c s d kzl legalbb az egyik nagyobb, mint 100.
(a>100 | b>100) & (c>100 | d>100)
Itt a zrjel hasznlata fontos, mert az s mvelet ersebb, mint a vagy.
Vagy az a s b kzl, vagy a c s d kzl mindkett nagyobb, mint 100.
a>100 & b>100 | c>100 & d>100
Itt nem kell zrjelet hasznlnunk.

A felttel tagadsa
Amikor egy felttelt tagadunk, akkor annak ppen az ellenkezjt lltjuk. Pldul: Nem igaz
az, hogy a s b kzl legalbb az egyik nagyobb, mint 100. Ilyenkor a legegyszerbb, ha meg-
fogalmazzuk a hogy utni felttelt, azt zrjelbe tesszk, s el rjuk a nem mveletet:
!(a>100 | b>100)

A zrjel fontos, hiszen a ! mindennl ersebb mvelet. Rvidebb s hamarabb kirtkelhet


eredmnyt kapunk, ha a fenti logikai kifejezst leegyszerstjk. Ehhez ismerni kell a tagads
szablyait, az n. DeMorgan azonossgokat:

DeMorgan azonossgok
!(a & b) == !a | !b
!(a | b) == !a & !b

Vagyis az egyszer feltteleket kln-kln letagadjuk, majd az s-t vagy-ra, a vagy-ot pedig
s-re cserljk. Pldnkban:
!(a>100 | b>100) = !(a>100) & !(b>100)

Az egyszer feltteleket ez esetben knny letagadni. A vgs vltozat teht:


a<=100 & b<=100
12. Kifejezsek, rtkads 12.7. Paramtertads, tlterhelt metdusok 229

Bizonyts igazsgtblval
Elfordulhat, hogy kt logikai kifejezs azonossgrl szeretnnk meggyzdni. Az azonos-
sgrl a legegyszerbben igazsgtblzat fellltsval gyzdhetnk meg. Az igazsgtblrl
a logikai opertoroknl sz volt. Ha a logikai kifejezsek igazsgtblzatai megegyeznek,
akkor a kifejezsek azonosak. me, annak bizonytsa, hogy !(a|b)==!a&!b. Az igazsgtbla
kt utols oszlopa megegyezik:
a b !(a|b) !a&!b
true true false false
true false false false
false true false false
false false true true

12.7. Paramtertads, tlterhelt metdusok


Programunkban rendszeresen meghvunk metdusokat (eljrsokat, fggvnyeket). A hvott
metdusok mindegyikt egy konkrt osztlyban deklarltk publikus lthatsggal. Pldny-
metdust egy objektum megszltsval, statikus metdust pedig ltalban a metdus osztly-
nak megszltsval hvhatunk meg. Pldul:
int y; double d;
d = Math.cos(1.3);
y = Console.readInt("y=");
y = Math.min(2,y+3);
d = Console.readDouble("d=");
System.out.println("Ez egy szveg paramter");

A cos s min a java.lang.Math osztly statikus fggvnyei, a readInt az


extra.Console osztly szintn statikus fggvnye (a Math s Console osztlyokbl nem is
lehet pldnyt ltrehozni). A println metdust a java.io.PrintStream osztlyban dekla-
rltk pldnymetdusknt a java.lang.System osztly out objektumt szltjuk meg
vele.

Primitv tpus paramtertads


Amikor meghvunk egy metdust, annak a legtbb esetben paramtereket is t kell adni. Az
tadott paramtereket aktulis paramtereknek nevezzk, hiszen a metdus sokfle rtkkel
kpes lenne futni, de most aktulisan azokkal az rtkekkel fut, amelyeket megkap. Pldul:
int kisebb = Math.min(3,9); // a min fggvny aktulis paramterei: 3 s 9
double x1 = d*Math.cos(3.2); // a cos fggvny aktulis paramtere: 3.2
double x2 = d*Math.cos(2); // a cos fggvny aktulis paramtere: 2

Az aktulis paramtert a metdus formlis paramtere kapja meg. Ahhoz, hogy tudjuk,
milyen aktulis paramterek kldhetk a metdusnak, ismerni kell a metdus formlis para-
230 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

mtereit, a paramterek deklarciit. Ezek hasonlk a vltozdeklarcikhoz: meg van adva az


sszes paramter neve s tpusa. A metdus hasznljnak csak a paramterek szmt kell
ismernie, s rendre az sszes paramter tpust. A metdus ri ezenkvl mg megadtk a
metdus visszatrsi rtknek tpust, ezt a metdus neve el rtk. A java.lang.Math
osztly min s cos fggvnyeit pldul gy adtk meg:
visszatrsi rtk formlis paramterek

int min(int a, int b) // kt int rtket fogad, egy int rtket ad vissza
double cos(double a) // egy double rtket fogad, egy double rtket ad vissza

A metdus aktulis paramterei rendre taddnak a formlis paramtereknek. A paramte-


rek szmnak egyeznie kell, s az aktulis paramtereknek rendre rtkads szerint kompa-
tbiliseknek kell lennik a formlis paramterekkel.

Pldul:
int min(int a, int b) // metdus feje

int m = Math.min(x+2,3) // metdus hvsa (a=x+2, b=3)

Itt x+2-nek int-nl szkebb, vagy int tpusnak kell lennie, azaz x csak byte, short, int
vagy char tpus lehet.

Metdusok szignatrja s tlterhelse


Egy metdusnak tbbfle paramterezse is lehetsges. A min fggvnynek pldul ngy
vltozatt is megtallhatjuk a Math osztlyban. Ezek mind klnbz fggvnyek, amelyeknek
egyenknt rtk meg a blokkjukat:
int min(int a, int b) //1
long min(long a, long b) //2
float min(float a, float b) //3
double min(double a, double b) //4

A Javban egy metdust annak szignatrja azonost, vagyis a metdus neve, a paramte-
rek szma, s sorban a paramterek tpusai (pldul min,int,int). Az ugyanolyan nven,
de ms paramterezssel megadott metdusokat tlterhelt (overloaded) metdusoknak
nevezzk (a min neve tl van terhelve).

Tlterhels esetn a metdus hvsakor mr a fordt kivlasztja a metdus fajtjt: amilyen


tpus rtkekkel hvtk a metdust, azt a paramterezs metdust fogja kivlasztani. A
min(x,3) esetn pldul, ha az x paramter tpusa int vagy annl szkebb, akkor a //1 met-
dus kerl vgrehajtsra, ha x float tpus, akkor a //3. A min(x,3.0) a //4 metdus vgre-
hajtst eredmnyezi.
12. Kifejezsek, rtkads 12.8. java.lang.Math osztly 231

A Javban csak rtk szerinti paramtertads ltezik, s ez azt jelenti, hogy paramtereken
keresztl nem kaphatunk vissza rtket. Az aktulis paramtereket csak hasznlja a metdus,
az tadott vltoz pldul biztosan rintetlen marad, azt a metdus nem tudja megvltoztatni.
rtket csak visszatrsi rtken keresztl kaphatunk a metdustl. Ebbl az is kvetkezik,
hogy egy metdustl egyszerre csak egy rtket kaphatunk, hiszen a metdusnak csak egy
visszatrsi rtke lehet. Ha a visszatrsi rtk tpusa void, az azt jelenti, hogy nincs vissza-
trsi rtk. Ekkor a metdus csak eljrsknt hvhat. Megjegyezzk, hogy a visszatrsi
rtkkel rendelkez metdus is hvhat eljrsknt, ekkor a visszatrsi rtk elvsz, az nem
kerl felhasznlsra. Ennek persze csak akkor van rtelme, ha a fggvny az rtk kiszmt-
sn kvl ms hasznosat is tesz.

12.8. java.lang.Math osztly

A Math osztly rengeteg hasznos matematikai fggvnyt s konstanst tartalmaz. Az


osztlyt nem lehet pldnyostani (nincs publikus konstruktora), az kizrlag statikus
deklarcikat tartalmaz.

A java.lang.Math szmunkra lnyegesebb adatait s metdusait a 12.4. bra (tblzat)


foglalja ssze. Az osztly a java.lang csomagban van, azt nem kell importlnunk. A szgek
radinban rtendk! 2*PI radin = 360 fok, vagyis 1 radin = 180/PI fok ~57.3 fok.

Adatok (konstansok)
final double E a termszetes alap
final double PI Pi rtke

Metdusok
double abs(double a) visszaadja a double szm abszolt rtkt
float abs(float a) visszaadja a float szm abszolt rtkt
int abs(int a) visszaadja az int szm abszolt rtkt
long abs(long a) visszaadja a long szm abszolt rtkt
double acos(double a) visszaadja a arcus koszinuszt radinban (0..PI)
double asin(double a) visszaadja a arcus szinuszt (-PI/2..PI/2)
double atan(double a) visszaadja a arcus tangenst (-PI/2..PI/2)
double ceil(double a) a legkzelebbi egsz, amely nem kisebb nla
double cos(double a) az a szg (radin) koszinuszt adja vissza
double exp(double a) a visszaadott rtk ea (e a termszetes alap)
double floor(double a) a legkzelebbi egsz, amely nem nagyobb nla
double log(double a) termszetes alap logaritmus fggvny
double max(double a, double b) visszaadja a nagyobbik double szmot
float max(float a, float b) visszaadja a nagyobbik float szmot
int max(int a, int b) visszaadja a nagyobbik int szmot
long max(long a, long b) visszaadja a nagyobbik long szmot
232 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

double min(double a, double b) visszaadja a kisebbik double szmot


float min(float a, float b) visszaadja a kisebbik float szmot
int min(int a, int b) visszaadja a kisebbik int szmot
long min(long a, long b) visszaadja a kisebbik long szmot
double pow(double a, double b) hatvnyozs. Visszaadja ab rtkt
double random() ad egy vletlen szmot, mely >=0.0 s <1.0.
double rint(double a) a legkzelebbi egsz
long round(double a) a legkzelebbi long rtk
int round(float a) a legkzelebbi int rtk
double sin(double a) az a szg (radin) szinuszt adja vissza
double sqrt(double a) visszaadja a ngyzetgykt
double tan(double a) az a szg (radin) tangenst adja vissza
double toDegrees(double radian) a radinban megadott szget tvltja fokra
double toRadians(double degree) a fokban megadott szget tvltja radinra

12.4. bra. A java.lang.Math osztly metdusai

Feladat Kamat
Ha betesznk a bankba egy adott sszeget, adott ves kamatszzalkra, adott
hnapra, mennyi pnzt vehetnk majd fel az id lejrtakor?

Hrom adatot fogunk bekrni teht: az sszeget, a kamatot szzalkban, s a hnapok szmt
ezekbl az adatokbl kell kiszmtani az j sszeget. Mivel vi kamatos kamattal szmolunk,
annyiszor kell szoroznunk az sszeget az 1+kamatSzzalk/100 szorzval, ahny vig az
kamatozik, vagyis a szorzt az vvel (hnap/12) hatvnyozni kell. Bonyoltja a helyzetet,
hogy az v trt szm is lehet:
jsszeg = sszeg * (1+kamatSzzalk/100)v .

Forrskd
import extra.*;
public class Kamat {
public static void main(String[] args) {
double osszeg, ujOsszeg;
double kamatSzazalek;
int honap;
osszeg = Console.readDouble("sszeg (Ft)? ");
kamatSzazalek = Console.readDouble("Kamat%? ");
honap = Console.readInt("Hny hnapra kti le? ");
ujOsszeg = osszeg *
Math.pow(1+kamatSzazalek/100,honap/12.0); //1
System.out.println(honap+" hnap mlva "+
Format.left(ujOsszeg,0,2)+" Ft-ot vehet ki"); //2
}
}
12. Kifejezsek, rtkads 12.8. java.lang.Math osztly 233

A program futsa
sszeg (Ft)? 5000
Kamat%? 12.5
Hny hnapra kti le? 5
5 hnap mlva 5251,50 Ft-ot vehet ki

A program elemzse

Kt sor rdemel kln figyelmet. //1-ben fontos, hogy a hnapot double tpus rtkkel
osszuk, mert az egsz oszts torz eredmnyhez vezetne. //2-ben a Format.left() metdus
msodik paramtere 0; gy az eredmny pontosan annyi karakter hossz, ahny karakteren a
szm elfr.

Tesztkrdsek

12.1. Egsztse ki a kvetkez igazsgtblt! Melyik pont tartalmazza a hinyz oszlop rt-
keit? Az oszlop elemeinek felsorolsa fentrl lefel trtnik. Jellje meg az egyetlen j
vlaszt!
a b a&b|a
true true ...
true false ...
false true ...
false false ...
a) true false true false
b) true true false false
c) false false false false
d) true false false false

12.2. Mely kifejezs szerepelhet az igazsgtbla fejlcben? Jellje meg az egyetlen j vlaszt!
a b ...
true true true
true false false
false true false
false false false
a) a | b
b) a & b
c) a | b & a
d) !b
12.3. A megadott deklarcik mellett mi a tpusa a kvetkez kifejezsnek? Jellje meg az
egyetlen j vlaszt!
boolean a=true;
byte b=1;
short c=21;

(c%5!=b) | !a
234 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

a) true
b) false
c) 1
d) szintaktikai hiba
12.4. Mely pontra igaz, hogy a felsorolt tpusok szigoran bvl sorrendben vannak? Jellje
meg az sszes j vlaszt!
a) byte, short, int, long, float, double, char, boolean
b) byte, short, int, long, float, double
c) byte, short, int, char, long, float, double
d) char, int, long, double
12.5. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az implicit tpuskonverzit a program magtl elvgzi.
b) A prefix opertor az operandus eltt szerepel.
c) rtkadskor a jobb oldal tpusnak mindig bvebbnek kell lennie a bal oldal tpus-
nl.
d) rtkadskor a bal oldal tpusa egyrtelmen meghatrozza a jobb oldal tpust.
12.6. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A Java minden aritmetikai mveletet legalbb int tpusba konvertlva vgez.
b) A boolean tpus a memriban 1 bitet foglal el, mert a lehetsges kt rtk trolsra
elegend ennyi hely.
c) Egy char tpus kifejezs mindig rtkl adhat egy int tpus vltoznak, knysze-
rts nlkl.
d) Egy int tpus kifejezs mindig rtkl adhat egy char tpus vltoznak, knysze-
rts nlkl.
12.7. Mit r ki a kvetkez programrszlet? Jellje meg az egyetlen j vlaszt!
int a=2, b=5;
System.out.print(++a*4+b+" "+b++);
a) 17 6
b) 17 5
c) 13 5
d) Egyik sem
12.8. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A / s a % opertorok ugyanolyan precedencival rendelkeznek.
b) A >= s a != opertorok ugyanolyan precedencival rendelkeznek.
c) A + s ktoperandus opertorok magasabb precedencival rendelkeznek, mint a *
s / opertorok.
d) A || opertor magasabb precedencival rendelkezik, mint a && opertor.
12. Kifejezsek, rtkads 12.8. java.lang.Math osztly 235

12.9. A megadott deklarcik mellett mi a tpusa a kvetkez kifejezsnek? Jellje meg az


egyetlen j vlaszt!
byte b; int i;

(byte)Math.sqrt(i)+3*b

a) double
b) int
c) byte
d) A kifejezs szintaktikailag hibs
12.10. A megadott deklarcik mellett a kvetkez kifejezsek kzl melyikre igaz: szintakti-
kailag helyes, s tpusa int? Jellje meg az sszes j vlaszt!
byte b; int i; double d;
a) (b+i)/2
b) (i/2+5)/2
c) b*i*55.0%2
d) 55*b*Math.pow(5,5)

Feladatok

12.1. a, b s c vals tpus vltozk. rja le azt a logikai kifejezst, amely igaz, ha:
a) (A) a rtke 0 s 1 kz esik (a hatrokat belertjk)
b) (A) a rtke 5 s 10, b rtke pedig 15 s 20 kz esik (a hatrokat belertjk)
c) (A) nem igaz az elz llts
d) (A) sem a, sem b, sem c nem 0
e) (B) a egsz
f) (B) a, b s c kzl legalbb 2 szm egsz
g) (C) a s b kzl az egyik pozitv, a msik negatv
h) (C) a, b s c kzl legfeljebb kett pozitv
(Kifejezesek1.java)

12.2. (B) a s b egsz tpus vltozk. rja le azt a logikai kifejezst, mely igaz, ha:
a) a s b kzl legfeljebb az egyik pros
b) a s b kzl pontosan az egyik pros
(Kifejezesek2.java)
12.3. (A) Trolja konstansokban a krumpli, a hagyma s a padlizsn egysgrt! rjon olyan
programot, amely bekri, mibl mennyit hajt a vsrl, majd ksztsen egy szmlt a
kvetkez formban:

krumpli : 2.5 kg * 70 Ft/kg = 175 Ft


hagyma : 3.0 kg * 98 Ft/kg = 294 Ft
padlizsn : 10.0 kg * 200 Ft/kg = 2000 Ft
-----------------------------------------
sszesen 2469 Ft
236 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Az egysgrak egszek, a mennyisg vals is lehet. A vsrolt adagok rtkeit kerekt-


sk egszre! (Szamla.java)

12.4. (A) A piacon minden ru olcsbb, mint a szomszdunkban lev boltban. Krje be,
mennyibe kerl egy kg eper a piacon, valamint a szomszd boltban. Ezt kveten krje
be, hny kg epret szeretnnk befzni. rja ki, hny Ft vesztesg r bennnket, ha a
szomszd boltban vesszk az epret. (Piac.java)

12.5. (A) Krje be a gmb sugart, majd rja ki a gmb felsznt s trfogatt! (Gomb.java)

12.6. (B) Ha a szmla FA sszege a szmla nett rtknek egy adott szzalka, akkor hny
szzalk F-t tartalmaz a szmla brutt sszege? Ksztsen a problmra egy kisegt
programot! Pldul: 25%-os FA esetn a szmla 20% F-t tartalmaz, 12%-os FA
esetn a szmla FA tartalma 10.71 szzalk. (AfaTartalom.java)

12.7. (C) Feri pnzt kap. Hogy mennyit, azt krje be a program. A kifizetshez 5000, 1000,
500 s 100 Ft-os cmletek llnak rendelkezsre a maradkot Feri nem kapja meg.
Felttelezzk, hogy minden cmletbl van elg, s a lehet legkevesebb szm pnz
kerl kiosztsra. Milyen cmletbl hnyat kapott Feri, s mennyi pnzt hagyott ott ajn-
dkba? (Penzvaltas.java)

Vigyzzon a j vltoznevek megvlasztsra s a program helyes strukturlsra!


13. Szelekcik 13.1. Egyg szelekci if 237

13. Szelekcik

A fejezet pontjai:
1. Egyg szelekci if
2. Ktg szelekci if..else
3. Egymsba gyazott szelekcik
4. Tbbg szelekcik else if s switch
5. Fggetlen felttelek vizsglata

A szelekci vlogatst jelent. Elre elgondoljuk, hogy milyen esetek kvetkezhetnek be, s
minden esetre megadunk egy tevkenysget vagy tevkenysgsorozatot, melyet a programnak
vgre kell hajtania. A vgrehajts utn a program jra sszefolyik, s egy kzs tevkenysg-
gel folytatdik. Tbbfle szelekci ltezik. Az esetek szma szerint megklnbztetnk
egyg, ktg, illetve tbbg szelekcit. A szelekcik egymsba gyazhatk. Ebben a feje-
zetben sorra vesszk a szelekcik klnbz fajtit.

13.1. Egyg szelekci if

Az egyg szelekci azt jelenti, hogy ha igaz egy adott felttel, akkor a hozz kapcsold
utastst (tevkenysget) vgrehajtjuk, egybknt pedig kikerljk, s a programot az azt
kvet kzs utastssal folytatjuk. Ha tbb utastst szeretnnk az igaz gban vgrehajtani,
az utastsokat blokkba zrjuk. Az egyg szelekci tevkenysgdiagramjt a 13.1. bra
mutatja, Java kdja a kvetkez:
if (felttel) {
if (felttel) utasts1;
utasts; utasts2;
...
utastsN;
}

Az if magyar jelentse: ha. Az if utni felttelt (boolean tpus kifejezst) zrjelbe kell
tenni, a felttel utn pedig megadjuk az utastst, vagy a tbb utastst tartalmaz blokkot.
238 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Kdolsi konvencitl fggen a blokk kezd zrjelt tehetjk j sorba is:


if (felttel)
{
... [else]
}

[felttel]

utasts

13.1. bra. Az egyg szelekci tevkenysgdiagramja

Vigyzat! Az if (felttel) utn ne tegyen pontosvesszt, mert ezzel lezrja az if


utastst gy, hogy az igaz gon mindssze egy res utasts ll, s a pontosvessz utni
utasts az if utastst szekvencilisan kveti!
int n=10;
if (n==5); // Ne tegyen pontosvesszt!!!
n*=2; // A kd strukturlsa gy helytelen!!!
// n rtke 20!!!

ltalnos szablyok a Javban:


- Minden felttelt zrjelbe kell tenni;
- Az utastsok blokkba tehetk. A blokk sszefogja a benne tallhat utastsokat.

A program strukturlsa (trdelse)


Figyelje meg, hogy azok az utastsok, amelyeknek vgrehajtsa feltteltl fgg, a forrskd-
ban kt karakterhellyel jobbra tolva szerepelnek!

A forrskdban a vezrlszerkezetek jelenltt a forrsszveg trdelsvel, a sorok


vzszintes eltolsaival fejezzk ki. Ha egy tevkenysg beljebb kezddik, mint egy
valamelyik felette ll elem, az minden esetben egy vezrlszerkezet jelenltt mutatja. A
vezrlszerkezetek bels alrendelt egysgeit a forrskdban jobbra toljuk.
- A szekvencilisan egymst kvet utastsok pontosan egyms alatt szerepelnek;
- Az az utasts vagy blokk, amelynek vgrehajtsa feltteltl fgg, kt vagy hrom
karakterhellyel jobbra tolva szerepel a forrskdban.
Fontos, hogy egy olyan kdolsi konvencit alaktsunk ki, amely eleget tesz az ltal-
nos szablyoknak. A szp, strukturlt forrskd olvashatv teszi a programot. A
strukturls szablyai a programozra nzve ktelezek!
13. Szelekcik 13.1. Egyg szelekci if 239

Ezt a kdolsi konvencit aztn az egsz programon t kvessk, ellenkez esetben progra-
munk ttekinthetetlenn vlik. A szp program rsa pusztn szoks dolga, semmifle plusz
megerltetst nem kvn. Az utlagos szptgets mindig vesztesgekkel jr. A kifejezetten
program rsra ksztett szvegszerkesztkben megvan a lehetsgnk arra, hogy programun-
kat Indent mdban rjuk. Ilyenkor az Enter lenyomsra a kurzor a most bert sor els karak-
tere al ll, s ez nagyban elsegti a szekvencik kdolst. Ha ilyenkor lenyomjuk a
Backspace billentyt, akkor a kurzor az aktulis sor felett lev els, tle balra kill sor al
ll, ez pedig az egyb struktrk programozsban nyjt segtsget (pldul egy szelekci vagy
iterci befejezsben). A kdolsi konvencikat folyamatosan trgyaljuk a klnbz strukt-
rknl. Tartsa szem eltt a kvetkezket:
Az a j, ha az eltols egysge jl lthat (legalbb kt karakternyi), s nem tl sok
(maximum hrom karakternyi), hogy a mlyebben strukturlt program se cssszon le a
kpernyrl, illetve a paprrl.
A beljebb tolshoz lehetleg ne hasznljuk a tabultort, inkbb ssk le ktszer a
szkzt! Ha ragaszkodunk a Tab karakterhez, akkor lltsuk be a krnyezetben a Tab
mrett 2-re, valamint lltsuk be a Szkzk Tab helyett lehetsget (gy minden Tab
letsekor 2 szkz kerl a szvegbe)! Az igazi Tab karakter s a szkz vltakoz
hasznlata a legrosszabb, mert gy a forrskd teljesen szteshet a klnbz szveg-
szerkesztkben!
Ha ez az ttekinthetsget nem zavarja, akkor kivtelesen megengedhet, hogy egy
sorba kt utastst rjunk.
Ha egy utasts csak kt sorban fr ki, akkor a sort ttekintheten tagoljuk, s a msodik
sort egy egysggel beljebb tolva kezdjk!

Feladat Fizets
Krjk be konzolrl egy alkalmazott fizetst! Ha ez a fizets 100000 forintnl nem
nagyobb, akkor emeljk meg 25%-kal. Vgl rjuk ki az alkalmazott fizetst!

Forrskd
import extra.*;

public class Fizetes {


public static void main(String[] args) {
int fizetes = Console.readInt("Fizets? ");
if (fizetes < 100000)
fizetes *= 1.25;
System.out.println("Az j fizets: "+fizets+" Ft");
}
}

A program egy lehetsges futsa:


Fizets? 90000
Az j fizets: 112500 Ft
240 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Feladat Kvetkez karakter


Krjnk be konzolrl egy karaktert! Ha a karakter 'A' s 'Z' kz esik, akkor rjuk ki az
unikd tblban t kvet karaktert, egybknt ne rjunk ki semmit!

Forrskd
import extra.*;
public class KovKarakter {
public static void main(String[] args) {
char karakter = Console.readChar("Karakter? ");
if (karakter >= 'A' && karakter <= 'Z') {
karakter++;
System.out.println(karakter);
}
}
}

Ms megoldsok: A karakter++; helyett hasznlhattuk volna a kvetkez utastsokat is:


karakter+=1; vagy karakter=(char)(karakter+1);

13.2. Ktg szelekci if..else

[felttel] [else]

utasts1 utasts2

13.2. bra. A ktg szelekci tevkenysgdiagramja

A ktg szelekci azt jelenti, hogy ha igaz egy adott felttel, akkor a hozz kapcsold
utastst (tevkenysget) hajtjuk vgre, egybknt egy msikat. Az elgazs utn a program
sszefolyik, vagyis egy kzs utasts kvetkezik. Ha tbb utastst szeretnnk valame-
lyik gban vgrehajtani, akkor ott az utastsokat blokkba zrjuk. Az else magyar jelen-
tse: egybknt. A ktg szelekci tevkenysgdiagramjt a 13.2. bra mutatja, Java kdja
a kvetkez:
13. Szelekcik 13.3. Egymsba gyazott szelekcik 241

if (felttel) {
if (felttel) utasts;
utasts1; ...
else }
utasts2; else {
utasts;
...
}

Feladat J szm
Krjnk be konzolrl egy vals szmot! A szm akkor j, ha 1000 s 2000 kztti
pros egsz (a hatrokat is belertve). rjuk ki, hogy a szm j, vagy nem j!

Forrskd
import extra.*;
public class JoSzam {
public static void main(String[] args) {
double szam = Console.readDouble("Krek egy szmot: ");
if (szam>=1000 && szam<=2000 && szam%2==0)
System.out.println("J szm");
else
System.out.println("Nem j szm");
}
}

13.3. Egymsba gyazott szelekcik


Az if utasts megfelel gn akrmilyen utasts llhat, akr egy jabb if utasts. Ilyenkor
azonban klnsen vigyzni kell a tiszta programszerkezetre, mert knnyen elkeveredhetnk.
Mindig egyrtelmen ltni kell a program struktrjt!

Feladat Legnagyobb
Krjnk be hrom szmot, majd rjuk ki ezek kzl a legnagyobbat!

Forrskd
import extra.*;

public class Legnagyobb {


public static void main(String[] args) {
int szam1, szam2, szam3;
int legnagyobb;

szam1 = Console.readInt("1. szm: ");


szam2 = Console.readInt("2. szm: ");
szam3 = Console.readInt("3. szm: ");
242 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

if (szam1 > szam2)


if (szam1>szam3)
legnagyobb = szam1;
else
legnagyobb = szam3;
else
if (szam2>szam3)
legnagyobb = szam2;
else
legnagyobb = szam3;

System.out.println("A legnagyobb szm: "+ legnagyobb);


}
}

A program egy lehetsges futsa


1. szm: 33
2. szm: 29460
3. szm: 2
A legnagyobb szm: 29460

A program elemzse
A hrom szm beolvassa utn megnzzk az els kt szmot, melyik a nagyobb (//1). Ha a
szam1 a nagyobb, akkor a legnagyobb szm csak szam1 s szam3 kzl kerlhet ki (//2). Ha
szam2 a nagyobb, akkor szam2 s szam3 kzl vlaszthatjuk ki a legnagyobbat (//3).

Az if s else prostsa

Az if utastsok egymsba gyazhatk. Ilyenkor a fordt az else kulcsszavakat mindig a


legutbbi if kulcsszval prostja, hacsak ezt a szablyt blokkok kpzsvel fell nem
brljuk.

sszetett, nehezen ttekinthet szelekci rsakor rdemes az egyes gakat blokkba foglalni
mg akkor is, ha abban csupn egyetlen utasts van. Ez klnsen akkor hasznos, ha a szelek-
ci nem szimmetrikus.
A kvetkez plda mutatja, mennyire megtveszt lehet egy rossz kdols. Egy ktg szelek-
ci igaz gba szeretnnk egy egyg szelekcit illeszteni:
if (f1)
if (f2) //1
u1;
else //2 Vigyzat, rossz kdols!
u2;

A fordt sajnos nem olvassa ki a gondolatainkat. a //2 sor else-t az //1 sor if-vel lltja
prba, s a kvetkez kdols szerint fog eljrni:
13. Szelekcik 13.4. Tbbg szelekcik else if s switch 243

if (f1)
if (f2)
u1;
else
u2;

Jobban jrunk teht, ha gy strukturlunk, ahogy azt a fordt is rtelmezi. Ha ragaszko-


dunk eredeti elkpzelsnkhz, akkor a helyes kd gy fest:
if (f1) {
if (f2)
u1;
}
else
u2;

13.4. Tbbg szelekcik else if s switch

A szelekcinak kettnl tbb ga is lehetsges. A tbbg szelekci tevkenysg-


diagramjt a 13.3. bra mutatja. Ilyenkor a felttelek kzl legfeljebb egy teljeslhet,
vagyis ha az egyik felttel teljesl, a tbbi mr szba sem jhet. A felttelek teht ilyen
rtelemben egymstl fggenek, a kirtkels a tevkenysgdiagram szerint balrl jobbra
trtnik. Utols gknt megadhat egy egybknt (else) g, amelyre akkor kerl a
vezrls, ha egyik felttel sem volt igaz. Ha nincs egybknt g, akkor elfordulhat, hogy
egyetlen g sem kerl vgrehajtsra. Az egy- s a ktg szelekci a tbbg szelekci
specilis esetei.
A Javban a tbbg szelekcit ktfle vezrlszerkezettel valsthatjuk meg: ezek az
else if s a switch szerkezetek.

[felttel1] [felttel2] [else]

utasts1 utasts2 ... utastsN

13.3. bra. A tbbg szelekci tevkenysgdiagramja


244 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Mivel a szmtgp egyszerre csak egy felttel igaz vagy hamis voltt tudja megllaptani, a
tbb esetbl trtn vlogats szksgszeren egymsba gyazott if utastsok sorozata. Ha
az els felttel nem teljesl, akkor a msodik felttel vizsglata kvetkezik; ha az sem teljesl,
akkor a harmadik stb. egszen addig, amg valamelyik felttel vgl mgiscsak teljesl, vagy
nincs tbb felttel. A vezrls legfeljebb egy igaz gon fog thaladni. Vgs esetben az else
gra kerl a vezrls, ha van else g. Ha valamely felttel esetn nem akarunk tevkenysget
vgrehajtani, akkor azon az gon nem adunk meg tevkenysget (resen hagyjuk).
A feladatok tbbsgben a tbbg szelekci esetei elvileg egyenrangak. A szintaktika azon-
ban ekkor is megkveteli a felttelek sorrendjnek megadst. Elfordulhat, hogy a felttelek
sorrendje a program mkdse szempontjbl nem mindegy; de ha mindegy is, ajnlatos egy
logikus sorrendet fellltani a program olvashatsga rdekben. Vgig kell gondolnunk:
Van-e tfeds a felttelek kztt? Figyelembe kell venni, hogy csak az els igaz felttel-
hez tartoz utasts hajtdik vgre!
Melyik felttel teljeslse a gyakoribb? Bizonyos esetekben, amikor szmt, hogy a gp
mennyit dolgozik, s fel tudjuk mrni az esetek elfordulsainak gyakorisgt, akkor a
gyakoribb eseteket elrbb tesszk, hiszen a felttel vizsglata is gpidt vesz ignybe.
Milyen sorrend megadsa mellett olvashatbb a program kdja?

else if

Az else if szerkezettel brmilyen tbbg szelekci lekdolhat. Szintaktikja:


if (felttel1)
utasts1;
else if (felttel2)
utasts2;
...
else
utastsN;

Az utastsok helyn blokkok is llhatnak. Az else if szerkezet tulajdonkppen egymsba


gyazott if utastsoknak egy trkks, ltvnyban eltorztott, de az ember szmra mgis
termszetesebb vltozata. E struktra kihangslyozza az esetek egyenrangsgt.

Feladat Kor
Olvassunk be egy nem negatv egsz szmot, valakinek az letkort. Kortl fggen
rjuk ki a megfelel szveget:
0-13 vig: Gyerek
14-17 vig: Fiatalkor
18-23 vig: Ifj
24-59 vig: Felntt
60 vtl : Ids
13. Szelekcik 13.4. Tbbg szelekcik else if s switch 245

Forrskd
import extra.*;
public class Kor {
public static void main(String[] args) {
int kor = Console.readInt("Hny ves? ");
if (kor < 14) // kor = ..13
System.out.println("Gyerek");
else if (kor < 18) // kor = 14..17
System.out.println("Fiatalkor");
else if (kor < 24) // kor = 18..24
System.out.println("Ifj");
else if (kor < 60) // kor = 25..59
System.out.println("Felntt");
else // kor = 60..
System.out.println("Ids");
}
}

Feladat Mi igaz?
Krjen be egy tetszleges egsz szmot! llaptsa meg, hogy a kvetkez kt llts
kzl melyik igaz: 1. llts: 50 s 150 kz esik; 2. llts: Pratlan, s a szm 5.
hatvnya kisebb, mint 1 milli. Ennek megfelelen rja ki a kvetkezket:
Csak az 1. llts igaz
Csak a 2. llts igaz
Mindkt llts igaz
Egyik llts sem igaz

Forrskd
import extra.*;

public class MiIgaz {


public static void main(String[] args) {
int szam = Console.readInt("Szm= ");
boolean allitas1 = szam >=50 && szam <= 150;
boolean allitas2 = szam%2==1 && Math.pow(szam,5)<1E6;

if (allitas1 && !allitas2)


System.out.println("Csak az 1. llts igaz");
else if (!allitas1 && allitas2)
System.out.println("Csak a 2. llts igaz");
else if (allitas1 && allitas2)
System.out.println("Mindket llts igaz");
else
System.out.println("Egyik llts sem igaz");
}
}
246 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

switch

A switch szerkezet is tbbg szelekci kdolsra hasznlatos, de csak akkor alkalmaz-


hat, ha egy kifejezs jl meghatrozott, klnll rtkeire szeretnnk bizonyos utastso-
kat vgrehajtani. Az utasts szerkezete a kvetkez:
switch (kifejezs) {
case rtk1: utastsok; break;
case rtk2: utastsok; break;
...
default: utastsok;
}
Jelentsek: switch: kapcsol; case: eset; default: alaprtelmezs; break: megtrs.

A switch utasts az utasts fejbl s egy blokkbl ll. A fej tartalmazza a switch
kulcsszt, s zrjelben egy kifejezst. A blokk akrhny esetet tartalmazhat. Az eseteket a
case kulcssz vezeti be, utols esetknt megadhat egy default, alaprtelmezett eset.
Szablyok:
- kifejezs: tetszleges kifejezs, de visszatrsi tpusa csak primitv lehet, mgpedig
byte, short, int vagy char (nem lehet teht sem long, sem boolean, sem vals).
- rtkI: egyetlen rtk, mely csak konstans kifejezs lehet olyan kifejezs, amelyet
a fordt ki tud rtkelni. Egy konstans kifejezs csak literlt s konstanst (final vlto-
zt) tartalmazhat, metdushvs nem szerepelhet benne. Minden eset utn pontosan egy
rtk adhat meg, s ennek egyenlnek kell lennie a kifejezssel.
- Az egyes esetekben, vagyis a case rtk: utn akrhny utasts megadhat. Az eset
lehet res is nem ktelez teht megadni semmilyen utastst, gy a break-et sem.
- Az esetek sorban egyms utn kerlnek vgrehajtsra, ezt csak a break utasts brlja
fell. A break hatsra a switch blokk vgre kerl a vezrls. Ha nem tesznk a
case vgre break utastst, akkor a vezrls a kvetkez case-re kerl! Ha egyik
eset sem igaz, akkor a default eset hajtdik vgre. Nem ktelez default esetet
adni.
- Kt egyforma eset megadst a szintaktika nem engedi meg.
- rtktartomnyt tbb egyms utni case lersval adhatunk meg.

Feladat Kocka
Dobjunk egyet a kockval! A dobs rtktl fggen rjuk ki a kvetkez zenetek
egyikt:
1..3: Gyenge!
4: Nem rossz!
5: Egsz j!
6: Fantasztikus!
Ha a dobs nem 1 s 6 kztt van, rjuk ki, hogy rvnytelen dobs!
13. Szelekcik 13.5. Fggetlen felttelek vizsglata 247

Forrskd
import extra.*;

public class Kocka {


public static void main(String[] args) {
int dobas = Console.readInt("Dobj! 1-6: ");

switch (dobas) {
case 1:
case 2:
case 3:
System.out.println("Gyenge!");
break;
case 4:
System.out.println("Nem rossz!");
break;
case 5:
System.out.println("Egsz j!");
break;
case 6:
System.out.println("Fantasztikus!");
break;
default:
System.out.println("rvnytelen dobs!");
}
}
}

Megjegyzs: A switch nem alkalmas felttelek megfogalmazsra. Az elz, Mi igaz? felada-


tot pldul nem lehet megoldani switch szerkezettel.

13.5. Fggetlen felttelek vizsglata


Elfordul, hogy egyms utn tbb felttelt is meg akarunk vizsglni, de ezek mindegyikt
kln-kln, egymstl fggetlenl. A feltteleket persze valamilyen sorrendbe kell lltani, de
fggetlenl attl, hogy valamelyik felttel teljesl-e, meg akarjuk vizsglni a tbbit is.

Fggetlen felttelek vizsglata esetn nem tbbg szelekcirl van sz, hanem egyg
szelekcikbl ll szekvencirl. A felttelek egymstl fggetlenek, azokat egyms utn
meg kell vizsglni, a hozzjuk tartoz tevkenysgeket a felttel teljeslse esetn vgre
kell hajtani:
if (felttel1)
utasts1;
if (felttel2)
utasts2;
...
248 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A szelekcik sorrendjt alaposan t kell gondolni, mert a mr vgrehajtott utasts hatssal


lehet a kvetkez szelekci felttelre!

Feladat Oszthat?
Krjnk be egy szmot! rjuk ki, hogy az oszthat-e 2-vel, 3-mal, illetve 5-tel (kln-
kln)!

A felttelek megfogalmazsa megtveszt: ezek a felttelek teljesen fggetlenek egymstl.

Forrskd
import extra.*;

public class Oszthato {


public static void main(String[] args) {
int szam = Console.readInt("Adj meg egy egesz szamot: ");
if (szam%2==0)
System.out.println("Oszthat 2-vel");
if (szam%3==0)
System.out.println("Oszthat 3-mal");
if (szam%5==0)
System.out.println("Oszthat 5-tel");
}
}

Megjegyzs: Specilis szelekci mg a kivtelkezels try-catch-finally szerkezete is.


Errl a tanknyv 2. ktetben lesz sz.

Tesztkrdsek

13.1. Mi igaz az albbi strukturlatlan kdrszletre? Jellje meg az sszes igaz lltst!
if (f1)
if (f2)
u1;
else
u2;

a) Az els if egyg szelekci.


b) Az els if ktg szelekci.
c) A msodik if egyg szelekci.
d) A msodik if ktg szelekci.
13. Szelekcik 13.5. Fggetlen felttelek vizsglata 249

13.2. A forrskd strukturlsnak szablyait szem eltt tartva mely lltsok helyesek?
Jellje meg az sszes helyes lltst!
a) A programot nem ktelez strukturlni, hiszen a fordt gysem veszi figyelembe az
eltolsokat.
b) Ha a forrskdban egy utasts beljebb kezddik, mint a felette ll sor, az a prog-
ram olvasja szmra egy feltteles vgrehajtst sugall.
c) Ha kt utasts a forrskdban egyms alatt szerepel, akkor azok szekvencilisan
kvetik egymst.
d) Ktg szelekci esetn az if kulcssz else prjt ugyanabban az oszlopban
(pontosan egyms alatt) kell kezdeni.
13.3. Mit r ki a kvetkez programrszlet? Jellje meg az egyetlen j vlaszt!
int honap=5, nap=3, d=0;
if (honap>=4 && honap!=10) {
d++;
if (nap<2 | nap>5)
d++;
else if (nap>0)
d++;
else
d++;
d++;
}
System.out.println(d);

a) 1
b) 2
c) 3
d) Semmit, mert a kd szintaktikailag hibs.
13.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Az if utasts felttele tartalmazhat metdushvsokat.
b) A switch utasts fejben a kifejezs tartalmazhat metdushvsokat.
c) Az if utasts feltteleknt brmilyen boolean tpus kifejezs llhat.
d) A szintaktika megkveteli, hogy az if utasts minden gt blokkba foglaljuk.
13.5. Adott a kvetkez switch utasts:
int a=48;
switch (kifejezs) {
case 1: utastsok; break;
case 2: utastsok; break;
...
}

Mely kifejezs helyettesthet be a switch utasts fejbe? Jellje meg az sszes j


vlaszt!
a) 6
b) (char)a
c) Math.sin(a)
d) a+3
250 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Feladatok

13.1. (A) Krje be egy telek oldalait mterben! rja ki a telek terlett ngyszglben (1 l=
3.6m2). Ha a telek 100 ngyszglnl kisebb, akkor rja ki, hogy tl kicsi! (Telek.java)

13.2. (B) Van egy henger alak hordnk, melybe nem tudjuk, hogy belefr-e a rendelkezsre
ll bor. Krje be a bor mennyisgt literben, majd a hord sszes szksges adatt cm-
ben. Adjon tjkoztatst, hogy hny literes a hord, s hogy belefr-e a hordba a bor!
Ha belefr, akkor adja meg, hogy mennyi frne mg bele! rja ki szzalkosan is a tel-
tettsget! Az adatokat egszre kerektve rja ki! (Hordo.java)

13.3. (A) Krjen be egy vszmot! Ha a bettt szm negatv, adjon hibajelzst, ha nem,
llaptsa meg, hogy az vszm oszthat-e 17-tel, vagy nem! (EvszamOszthato.java)

13.4. Krjen be egy karaktert!


a) (A) rja ki, hogy a karakter nagybet, kisbet, szm vagy egyb-e! Minden esetben
rja ki a karakter unikdjt!
b) (C) Ha a karakter nagybet, akkor rja ki a kisbets alakjt, ha kisbet, akkor a
nagybets alakjt! (Karakter.java)
13.5. (A) Krje be a fnke fizetst, aztn a sajtjt. Hasonltsa ssze a kt fizetst: rjon ki
egy-egy megjegyzst, ha a fnk fizetse a nagyobb, ha a sajtja a nagyobb, illetve ha
egyenl! (FonokFizetese.java)

13.6. (C) Krje be Zsfi, Kati s Juli szletsi vt. rja ki a neveket udvariassgi sorrendben
(elre az idsebbeket...)! (Udvariassag.java)

13.7. (B) Krjen be egy egyjegy, nem negatv szmot! rja ki a szm szveges formjt (1 =
egy, 2 = kett stb.) (SzamSzoveggel.java)

13.8. (B) Krjen be egy egsz ra rtket. Ha a szm nem 0 s 24 ra kztt van, akkor adjon
hibazenetet, egybknt ksznjn el a program a napszaknak megfelelen! 4-9: J
reggelt!, 10-17: J napot!, 18-21: J estt!, 22-3: J jszakt! (Koszones.java)

13.9. (B) Egy dolgozatra annak pontszmtl fggen a kvetkez osztlyzatot adjk:
elgtelen (1): 0-29
elgsges (2): 30-37
kzepes (3): 38-43
j (4): 44-49
jeles (5): 50-55
Krje be a dolgozat pontszmt, majd rja ki az osztlyzatot szmmal s betvel!
(Dolgozat.java)
14. Itercik 14.1. Elltesztel ciklus while 251

14. Itercik

A fejezet pontjai:
1. Elltesztel ciklus while
2. Htultesztel ciklus do while
3. Lptet ciklus for
4. Ciklusok egymsba gyazsa, kiugrs a ciklusbl
5. Adatok feldolgozsa vgjelig
6. Megszmlls
7. sszegzs, tlagszmts
8. Minimum- s maximumkivlaszts
9. Menkszts

A program legfontosabb tulajdonsgai kz tartozik, hogy kpes utastsokat ismtelten vgre-


hajtani. Az iterci ismtlst jelent, ilyenkor egy vagy tbb utasts jra s jra vgrehajtdik.
A Java hrom mechanizmust knl az itercik megvalstsra:
while: Elltesztel ciklus, melynek a belpsi felttelt fogalmazzuk meg.
do while: Htultesztel ciklus, melynek szintn a belpsi felttelt kell megadni.
for: Lptet ciklus, melyben a ciklusvltoz minden egyes ciklus vgrehajtsakor
automatikusan lp egyet.

A feladatokat tbbflekppen is meg lehet oldani. Vannak azonban n. tpusfeladatok, amelyek


esetben rdemes az adott, sokak ltal elfogadott s tesztelt megvalstsi eljrst kvetni. A
fejezet a Java ltal felknlt itercis lehetsgeken kvl nhny tpusfeladatot is bemutat.

14.1. Elltesztel ciklus while

Elltesztel ciklus esetn a program mg a ciklusba val belps eltt megvizsgl egy
felttelt ezt belpsi felttelnek nevezzk , s ha ez teljesl, akkor a ciklusmag vgrehaj-
tsra kerl, egybknt nem. A ciklusmag ismtelten vgrehajtdik, amg a belpsi felttel
teljesl. Ha mr nem teljesl, akkor a program a ciklus utni utastssal folytatdik. Az
252 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

elltesztel ciklust a Javban a while utasts valstja meg tevkenysgdiagramjt a


14.1. bra mutatja; Java kdja a kvetkez:
while (felttel) {
while (felttel) utasts1;
utasts; utasts2;
...
utastsN;
}
Szablyok:
- A while utasts fejben a felttelt zrjelbe kell tenni.
- Ha a ciklusmagban tbb utasts van, akkor azokat utastsblokkba zrjuk.

[felttel]

utasts

14.1. bra. A while utasts tevkenysgdiagramja

Ha a felttel utn ;-t tesznk, ott befejezdik a while utasts, s a ciklusmag egy res
utasts lesz! Pldul az int i=1; while (i<5); i++; vgtelen ciklust eredmnyez.

Ha nem teremtjk meg annak lehetsgt, hogy a vezrls kikerlhessen a ciklusbl, vg-
telen ciklust kapunk! Vgtelen ciklus esetn elfordul, hogy a program lemerevedik,
vagy elkezd rngatzni. Ilyenkor az opercis rendszer vagy a fejleszti krnyezet ltal
nyjtott lehetsgek valamelyikvel meg kell szaktanunk a program futst (pldul let-
jk a Ctrl-C billentykombincit).

A while ciklus tipikusan olyan feladatok megoldsra javasolhat, amelyekben az indul


felttelek hatrozzk meg a ciklusmag vgrehajtsnak szksgessgt. Pldul:
14. Itercik 14.2. Htultesztel ciklus do while 253

Feladat Bank
Van egy kis megtakartott pnzem. Arra vagyok kvncsi, hny hnap mlva ri el ez
az sszeg a bankban a 100 000 Ft-ot, ha havi 2%-os kamatos kamattal szmolha-
tok?

A feladat elemzse
A problmt gy oldjuk meg, hogy az indul egyenleget addig szorozzuk a havi kamatos
kamattal, amg az sszeg el nem ri a 100 000 Ft-ot. A hnapok szmt teht 0-rl indtjuk, s
a ciklusmagban az egyenleg szorzsval egyidejleg mindannyiszor 1-gyel nveljk az rtkt.
Ahnyszor el kell vgezni a szorzst, annyi hnapig kell bent tartani a bankban a pnzt. Elre
termszetesen nem tudhatjuk, hogy a ciklust hnyszor kell vgrehajtani, hiszen ha tudnnk,
nem rnnk programot. A kvetkez sarkalatos krds, hogy megengedhet-e az res ciklus,
vagyis ltezhet-e olyan eset, mikor a ciklus egyetlenegyszer sem hajtdik vgre. Ilyen eset
akkor lehetsges, ha az indul egyenleg elri a 100 000 Ft-ot. Most mondhatn a kedves
Olvas, hogy ha az indul sszeg ilyen nagy, akkor szintn nem rnnk programot. A program
hasznlja azonban bethet brmekkora rtket, meg kell engednnk teht az res ciklust.

Forrskd
import extra.*;
public class Bank {
public static void main (String args[]) {
final int ALOMEGYENLEG = 100000;
double egyenleg = Console.readInt("Mennyi pnzed van (Ft)?");
short honap = 0;
while (egyenleg < ALOMEGYENLEG) {
honap++;
egyenleg *=1.02;
}
System.out.println("Tartsd bent "+honap+" hnapig!");
System.out.println("Utna kivehetsz "+
Format.right(egyenleg,0,0)+" Ft-ot.");
}
}

A program egy lehetsges futsa


Mennyi pnzed van (Ft)? 84000
Tartsd bent 9 hnapig!
Utna kivehetsz 100388 Ft-ot.

14.2. Htultesztel ciklus do while

Htultesztel ciklus esetn a ciklus magja egyszer mindenkppen vgrehajtdik, majd a


ciklus vgn, htul kvetkezik egy felttelvizsglat, amely eldnti, bent maradunk-e a
ciklusban, vagy kilpnk. Ha a felttel igaz, akkor a ciklusmag jbl vgrehajtdik. A
254 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

htultesztel ciklust a Javban a do while utasts valstja meg. Tevkenysgdiagramja


a 14.2. brn lthat; Java kdja a kvetkez:
do do {
utasts; utasts1;
while (felttel); utasts2;
...
utastsN;
} while (felttel);
Szablyok:
- A while utni felttelt zrjelbe kell tenni.
- Ha a ciklusmagban tbb utasts van, akkor azokat utastsblokkba zrjuk.

utasts

[felttel]

14.2. bra. A do while utasts tevkenysgdiagramja

A htultesztel ciklust nagy elvigyzattal kell alkalmazni, hiszen a program a ciklusba sz


nlkl belemegy. Egy hasonlattal lve: az ember ktflekppen mehet be egy helyisgbe. Vagy
megll az ajt eltt, kopog, s csak akkor lp be, ha erre engedlyt kapott (elltesztel ciklus),
vagy krdezs nlkl benyit, s ott esetleg kiderlhet, hogy nincsen keresnivalja (htultesztel
ciklus). Gondolkods nlkl csak oda megyek be, ahol van keresnivalm, s ezt biztosan
tudom, hiszen elre tgondoltam.
Tipikusan htultesztel feladat, ha a program hasznljtl egy elfogadhat bevitelt vrunk:

Feladat Szmbekrs
Krjnk be terminlrl egy szmot. A szmot csak akkor fogadjuk el, ha az egy nap-
tri nap rtke, vagyis 1 s 31 kz esik! rjuk ki minden esetben, ha a szm nem j.
(Felttelezzk, hogy a felhasznl szmot t be.)
14. Itercik 14.2. Htultesztel ciklus do while 255

Forrskd
import extra.Console;
public class SzamBeker {
public static void main (String args[]) {
int szam;
boolean ok;
System.out.println("Szm (1..31)");
do {
szam = Console.readInt();
// A szm vizsglata:
ok = szam>=1 && szam<=31; // a szm vizsglata
if (!ok)
System.out.println("Nem j, mgegyszer!");
} while (!ok);
System.out.println("J. Vge.");
}
}

A program egy lehetsges futsa


Szm (1..31)
221
Nem j, mgegyszer!
31
J. Vge.

Feladat Jegyek szma


Krjnk be terminlrl egy szmot! rjuk ki a szm jegyeinek a szmt!

Osszuk el a szmot 10-zel, az eredmnyt megint osszuk el 10-zel, egszen addig, amg a szm
nulla nem lesz. Kzben szmoljuk az osztsok szmt, ez lesz a szm jegyeinek a szma. Hogy
az eredeti szmot ne rontsuk el, az osztogatst egy segdvltozban vgezzk el!

Forrskd
import extra.Console;
public class JegyekSzama {
public static void main (String args[]) {
int szam = Console.readInt("Szm: ");
int seged = szam;
int jegySzam = 0;
do {
seged /= 10;
jegySzam++;
} while (seged!=0);
System.out.println(szam+" jegyeinek szma: "+jegySzam);
}
}

A program egy lehetsges futsa


Szm: 300998
300998 jegyeinek szma: 6
256 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

14.3. Lptet ciklus for

A lptet (nvekmnyes, szmll) ciklusban egy vagy tbb ciklusvltoz szerepelhet,


melyek minden egyes ciklus vgrehajtsakor automatikusan lpnek egyet. A for utasts
tevkenysgdiagramjt a 14.3. bra mutatja; Java kdja a kvetkez:
for (inicializls; felttel; lptets)
utasts;

for (inicializls; felttel; lptets) {


utasts1;
utasts2;
...
utastsN;
}

A for utastsnak van egy feje s egy blokkja. A fej zrjeles elemnek hrom rsze van,
melyeket pontosvesszk vlasztanak el egymstl (pontosan kt darab). A rszek a kvet-
kezk:
- Inicializls: Megadhat egy vagy tbb utasts, vesszvel elvlasztva. Az itt megadott
utasts(ok) az utasts elejn, egyszer kerl(nek) vgrehajtsra. Itt lehet pldul ciklus-
vltozt deklarlni, s annak kezdeti rtket adni. A ciklusvltoz tpusa tetszleges, s
az egsz for utasts alatt l (a fejben s a blokkban). Csak ugyanolyan tpus ciklus-
vltozk adhatk meg. Pldul:
int i=0, j=10
- Felttel (belpsi): Megadhat egy felttel (boolean tpus kifejezs). Ez a felttel min-
den ciklus elejn kirtkeldik, s ltalban a ciklusvltozt vizsglja. Ha a felttel
teljesl, a ciklus jbl vgrehajtdik, egybknt a vezrls a for utni utastsra kerl.
sszetett felttel is megadhat. A felttel alaprtelmezs szerinti rtke true, vagyis ha
nem adunk meg felttelt, akkor a ciklus minden esetben jbl vgrehajtdik. Pldul:
i<10 && j>20
- Lptets: Megadhat egy vagy tbb utasts, vesszvel elvlasztva. Valamennyi lptet
utasts a ciklusmag vgn minden alkalommal automatikusan vgrehajtdik. A lptet
utasts elrbb viszi a ciklust. ltalban a ciklusvltozt szoks itt megvltoztatni,
elsegtve ezzel a valamikori kilpst a ciklusbl. Pldul:
i++, j++
Egyb szablyok:
- Ha a ciklusmagban tbb utasts van, akkor azokat utastsblokkba zrjuk.
- A for fejnek tagjai hagyhatk resen is, de az elvlaszt pontosvesszket akkor is ki
kell tenni!: for (;;)...
14. Itercik 14.3. Lptet ciklus for 257

- A lptet ciklust egy elltesztel ciklus valstja meg. Ha a felttel az els ciklus
vgrehajtsa eltt nem igaz, akkor a ciklus egyszer sem hajtdik vgre.

inicializls

[felttel]

utasts

lptets

14.3. bra. A for utasts tevkenysgdiagramja

Nvekmnyes ciklust leggyakrabban akkor alkalmazzuk, ha a ciklusok szmt elre tudjuk. A


ciklusok szmt nem kzvetlenl adjuk meg: a ciklus a ciklusvltoz egyms utni rtkeire
hajtdik vgre egy kezdeti rtktl valamilyen felttel bekvetkeztig.

Ha a fej utn ;-t tesznk, akkor ott befejezdik a for utasts, vagyis a for (...);
ciklusmagja res. Az ezt kvet utasts a for-t szekvencilisan kveti!

Vigyzat! Fnnll a vgtelen ciklus veszlye! Ha nem lptetjk a ciklusvltozt vagy a


felttelt nem vltoztatjuk, lehet, hogy a ciklus sohasem fejezdik be!

Feladat Csillag
rjunk ki a konzolra 10 darab csillagot egy sorba!

Forrskd
public class Csillag {
public static void main(String[] args) {
for (int i=0; i<10; i++)
System.out.print("*");
System.out.println();
}
}
258 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A program elemzse

A kirs az i ciklusvltoz 0, 1, 2, ... 9 rtkeire hajtdik vgre, vagyis sszesen 10-szer.


Ugyanezt a hatst rtk volna el, ha a for utasts ciklusvltozja 1-tl 10-ig (vagy akr 33-tl
42-ig) halad, a ciklusmagban ugyanis nem hasznljuk i rtkt:
for (int i=1; i<=10; i++) System.out.print("*");
for (int i=33; i<=42; i++) System.out.print("*");
Fontos, hogy minden esetben olyan hatrokat adjunk meg, amelyek olvashatk, s utalnak a
feladatra! 10 darab csillag kirshoz a 33-tl 42-ig halad ciklus teljesen flrevezet!

Ha a feladat az lenne, hogy rjuk ki 1-tl 10-ig a szmokat, akkor mr nem varilhatnnk a
ciklusvltoz kezdeti rtkt, hiszen azt a ciklusmag felhasznlja:
for (int i=1; i<=10; i++)
System.out.print(i+" ");

A ciklusvltozt nem szksges a for utasts fejben deklarlni. Elvileg megtehetjk ezt a
metdus blokkjban mshol, mg a for utasts eltt (ebben az esetben i a for utasts utn is
hasznlhat):
int i;
for (i=1; i<=10; i++)
System.out.print(i+" ");

Feladat Fizets
Most 2001-et runk. rjuk ki, hogy mostantl 2006-ig melyik vben mennyi lesz Jzsef
fizetse, ha az venknt 12%-kal nvekszik! Jzsef fizetst konzolrl krjk be!

Forrskd
import extra.Console;

public class Fizetes {


public static void main (String args[]) {
final int ELSOEV = 2001;
final int UTOLSOEV = 2006;
int fizetes = Console.readInt("Fizets 2001-ben? ");
for (int ev=ELSOEV+1; ev<=UTOLSOEV; ev++) {
fizetes *= 1.12;
System.out.println(ev+"-ben: "+fizetes);
}
}
}

A program futsa
Fizets 2001-ben? 100000
2002-ben: 112000
2003-ben: 125440
2004-ben: 140492
2005-ben: 157351
2006-ben: 176233
14. Itercik 14.3. Lptet ciklus for 259

A ciklusvltoz brmilyen tpus lehet, gy karakter is:

Feladat Angol bc
rjuk ki az angol bc nagybetit a konzolra szkzkkel elvlasztva!

Forrskd
public class AngolABC {
public static void main (String args[]) {
for (char betu='A'; betu<='Z'; betu++)
System.out.print(betu+" ");
}
}

A program futsa
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Feladat Els t
rjuk ki 200-tl kezdve 17-esvel az els 5 szmot!

Forrskd
public class ElsoOt {
public static void main (String args[]) {
for (int i=0, szam=200; i<5; i++, szam+=17)
System.out.print(szam+" ");
}
}

A program futsa
200 217 234 251 268

Feladat Kis s nagy bc


rjuk ki konzolra az angol bc nagybetit s kisbetit a kvetkez formban:
aA bB cC dD ...zZ

Forrskd
import extra.Console;
public class KisNagyABC {
public static void main (String args[]) {
// A felttelt elg az egyik hatrra megfogalmazni:
for (char kis='a',nagy='A'; kis<='z'; kis++, nagy++)
System.out.print(kis+""+nagy+" ");
}
}

A ciklusok szerkezete legyen tiszta, knnyen ttekinthet! Ellenkez esetben knnyen


elkvethetnk valamilyen szemantikai hibt!
260 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

14.4. Ciklusok egymsba gyazsa, kiugrs a ciklusbl


A ciklusokat egymsba is gyazhatjuk.
A kvetkez feladat kls ciklusa htultesztel, mert az adott mveletet mindenkppen vgre-
hajtjuk, majd a felhasznlra bzzuk annak eldntst, kri-e mg egyszer a mveletet:

Feladat Rendszm
Egy rendszmtbla betkbl (A..Z) s szmokbl (0..9) ll, brmelyik helyen brmi
llhat. Az autk szma alapjn tervezzk meg a rendszmtbla hosszsgt!
Krjk be a szmot, majd rjuk ki a rendszmtbla szksges hosszt! Ezutn kr-
dezzk meg a felhasznltl, akarja-e folytatni a jtkot. Ha igen, jbl krjk be a
szmot, ha nem, fejezzk be a programot!
A feladat analizlsa
A kls ciklus egy olyan do while ciklus, amelynek vgn mindig felknljuk a folytatsi le-
hetsget. Minden egyes ciklusban beolvassuk a krdses szmot, melyhez ki kell szmolnunk
a szksges jelek szmt. Nzzk meg elszr, hogy adott darab jelbl hny rendszmot
tudunk kirakni: A rendszmtbla brmelyik helyre 36 jelbl vlogathatunk (26 bet s 10
szm). Ha a rendszmtblra 2 jelet tehetnk, akkor az els helyen ll akrmelyik jel mell 36
jelbl vlogathatunk, teht sszesen 36*36 klnbz rendszmtbla kszlhet. 3 jel esetn ez
a szm 36*36*36, s gy tovbb, az n jelbl ll rendszmtblk maximlis szma 36n.
A megoldshoz egy bels ciklus is szksges, melyben folyamatosan kpezzk 36 hatvnyait.
Abban a pillanatban, hogy ez a hatvnyszm elri vagy lehagyja a krdses szmot, a ciklusbl
kilpnk ahnyszor vgrehajtottuk a ciklust, annyi jelre van szksgnk a rendszmtblk
ellltshoz. A 0 esetet kln kezeljk, hiszen ebben az esetben nem is kell rendszmtbla;
de ha legalbb egy kell, akkor mr 36 rendszmtblnk is lehetne ezrt az ennyiLehet rt-
kt 36-rl indtjuk.

Forrskd
import extra.Console;
public class Rendszam {
public static void main (String args[]) {
char valasz;
do {
byte rendszamHossz;
long ennyiKell=Console.readInt("Hny rendszmtbla kell? ");
if (ennyiKell<=0)
System.out.println("Nem kell rendszmtbla.");
else {
long ennyiLehet = 36;
for (rendszamHossz=1;ennyiLehet<ennyiKell;rendszamHossz++)
ennyiLehet *= 36;
System.out.println(rendszamHossz+" hossz lesz a tbla.");
}
valasz = Console.readChar("Folytatod? I/N ");
} while ((valasz!='N') & (valasz!='n'));
14. Itercik 14.4. Ciklusok egymsba gyazsa, kiugrs a ciklusbl 261

} // main
} // Rendszam

A program egy lehetsges futsa


Hny rendszmtbla kell? 875000
4 hossz lesz a tbla.
Folytatod? I/N i
Hny rendszmtbla kell? 1000000000
6 hossz lesz a tbla.
Folytatod? I/N n

A kvetkez pldban for ciklusokat gyazunk egymsba:

Feladat Szorztbla
Ksztsk el a kvetkez szorztblt:
Szorztbla
------------------------------
1 | 1 2 3 4 5 6 7 8 9
2 | 2 4 6 8 10 12 14 16 18
3 | 3 6 9 12 15 18 21 24 27
4 | 4 8 12 16 20 24 28 32 36
5 | 5 10 15 20 25 30 35 40 45
6 | 6 12 18 24 30 36 42 48 54
7 | 7 14 21 28 35 42 49 56 63
8 | 8 16 24 32 40 48 56 64 72
9 | 9 18 27 36 45 54 63 72 81

A feladat analizlsa

Elszr kirjuk a fejlcet, majd a tblzatot. A kls ciklusban i rtke (az i*j bal oldali
tnyezje) fut 1-tl 9-ig. A bels ciklusban fut j rtke (a jobb oldali tnyez) gy, hogy i
minden egyes rgztett rtkre vgigfut 1-tl 9-ig. Az egyes szorzatokat egyms utn, igaztva
rjuk ki, s a bels ciklus utn a kls ciklus utols utastsaknt sort emelnk.

Forrskd
import extra.Format;
public class SzorzoTabla {
public static void main (String args[]) {
System.out.println(" Szorztbla");
System.out.println("-------------------------------");
for (int i=1; i<=9; i++) {
// Egy sor rsa:
System.out.print(i+" |");
for (int j=1; j<=9; j++)
System.out.print(Format.right(i*j,3)); // igaztunk
System.out.println();
}
}
}
262 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A break s continue utastsok

A ciklusbl val kiugrsra, illetve a ciklusmag tlpsre a Java kt lehetsget knl:


A break utasts az aktulis utastsblokkbl val azonnali kiugrst eredmnyezi.
Hatsra a vezrls a blokk utni utastsra kerl. rvnyes a while, a do, a for s a
switch utastsok blokkjaiban. Pldul:
for (int i=0; i<10; i++) {
for (int j=0; j<20; j++) {
if (ok)
break; // kiugrs a bels ciklusbl
...
}
System.out.println("Vge a bels ciklusnak");
}
System.out.println("Vge a kls ciklusnak");

Megvan arra is a lehetsg, hogy tbb blokkbl is kiugorjunk egyszerre. Brmely utasts
megcmkzhet (<cmke>:<utasts>), s ez a cmke a break utasts utn megadhat.
Ebben az esetben a vezrls a cmkzett utastsra kerl. Pldul:
for (int i=0; i<10; i++) {
for (int j=0; j<20; j++) {
if (ok)
break tovabb; // kiugrs a tovabb cmkre
...
}
System.out.println("Vge a bels ciklusnak");
}
tovabb:
System.out.println("Vge a kls ciklusnak");

A continue utasts hatsra a vezrls az utastsblokk (ciklus) vgre kerl. A ciklus


teht tovbb folytatdik, csak az aktulis ciklusmag (blokk) ettl kezdve nem kerl vgre-
hajtsra. rvnyes a while, a do, s a for utastsok blokkjaiban. Pldul:
for (int i=0; i<10; i++) {
for (int j=0; j<20; j++) {
if (ok)
continue; // folytats a ciklusvltoz kvetkez rtkvel
...
}
System.out.println("Vge a bels ciklusnak");
}
System.out.println("Vge a kls ciklusnak");
A continue esetn is megadhat cmke.
14. Itercik 14.4. Ciklusok egymsba gyazsa, kiugrs a ciklusbl 263

A ciklusbl val kiugrst csak nagy elvigyzatossggal szabad alkalmazni! Fontos,


hogy a program tovbbra is ttekinthet legyen!

Megjegyzs: A return az egsz metdusblokkot elhagyja (lsd 15., Metdusok rsa fejezet).

A break utastst akkor szoks alkalmazni, ha egy bizonyos problma a ciklus kzben megol-
ddik, s mr nincs rtelme a tovbbi vgrehajtsnak. Vgs (nem optimlis) esetben a ciklust
egy adott felttel bekvetkeztig kell vgrehajtani. Pldul:

Feladat Els oszthat


Kt szm kztt hatrozzuk meg az els olyan szmot, amelyik oszthat egy
megadott szmmal!

A kt szm kztt egyesvel lpegetnk, s minden szmrl megvizsgljuk, hogy osztja-e a


megadott szm. Ha valamelyik szm ilyen, akkor elhagyjuk a ciklust, de elfordulhat, hogy a
ciklus vgre rnk gy, hogy egyetlen ilyen szmot sem tallunk:

Forrskd
import extra.Console;
public class ElsoOszthato {
public static void main (String args[]) {
int kezd=5000, veg=7000, oszto=1797, szam;
boolean van = false;
for (szam=kezd; szam<=veg; szam++)
if (szam%oszto==0) {
van = true;
break;
}
if (van)
System.out.println("Els "+oszto+"-vel oszthat szm: "+szam);
else
System.out.println("Nincs ilyen");
}
}
A continue utastst akkor rdemes alkalmazni, ha a ciklus magjt csak rendhagy esetben
nem kell vgrehajtani. Ekkor a lnyegi utastssorozatot nem kell if blokkba tenni, s gy a
kd ttekinthetbb vlik. Pldul:

Feladat Szkv
rjuk ki a megadott kt vszm kztti sszes szkvet, majd a szkvek szmt!

Egy szkv (366 napos v, amelyben a februr 29 napos) 4-gyel oszthat, de: a 100-zal
oszthat vek nem szkvek, csak a 400-zal oszthatk. A for ciklus teht az els 4-gyel
oszthat vrl indul, s ngyesvel megy (//1). A //2-ben megfogalmazott felttelnek eleget
tev vek nem szkvek (ezek korrekcis vek), azokat egyszeren tugorjuk.
264 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Forrskd
import extra.Console;

public class Szokoev {


public static void main (String args[]) {
int tolEv = 1979, igEv = 2020;
int szokoSzam = 0;

System.out.print("Szkvek (366 naposak):");


for (int ev=((tolEv-1)/4+1)*4; ev<igEv; ev+=4) { //1
if (ev%100==0 && ev%400!=0) //2
continue;
// Ez egy szkv:
System.out.print(ev+" ");
szokoSzam++;
}
System.out.println("\nSzkvek szma: "+szokoSzam);
}
}

14.5. Adatok feldolgozsa vgjelig

Feladat Kr kerlete
A felhasznl adott sugar krk kerletre kvncsi. Amikor bet egy sugarat, mi
kirjuk a kr kerlett. Ha mr nem kvncsi tbb eredmnyre, akkor a kr sugarnl
nullt (vgjelet) kell tnie

A feladat analizlsa
Els gondolatunk az lehetne, hogy a ciklusmagban beolvassuk a kr sugart, majd kirjuk a kr
kerlett. Az utastsoknak ez a sorrendje azonban helytelen, mert gy a vgjelet is egy kr
sugarnak tekintennk. A vgjelet sosem szabad feldolgozni, mg akkor sem, ha ezzel trt-
netesen nem mkdnk hibsan a program. Feladatunkban a felhasznl a vgjelet azrt ti be,
mert nem kvncsi tbb kerletre. A 0 sugar kr kirsa teht hibs s zavart kelt mvelet. A
vgjelet hasznos konstansknt felvenni, mert gy knnyebb azt alkalomadtn kicserlni. Arra is
gyelni kell, hogy a vgjel ne essk a feldolgozand elemek kz. Ha pldul a feladatban
pozitv szmokat dolgozunk fel, akkor a vgjel lehet 0. De ha napi kzphmrskleteket
dolgozunk fel, akkor a nulla vgjelknt val alkalmazsa nemcsak, hogy kizrn a nulla fok
bevitelt adatknt, hanem meg is szaktan a bevitelt. Ha a sorozat elemei elvileg brmilyen
szmok lehetnek, akkor ki kell tallni valamilyen abszurd szmot, pldul egy adott tpus
legnagyobb vagy legkisebb rtkt. Az ilyen vgjel bevitele persze rendkvl knyelmetlen.
Tanulmnyaink elrehaladtval a vgjelig val feldolgozst egyre felhasznlbartibb
mdon fogjuk majd megoldani (pldul Esc-et is lehet tni).
14. Itercik 14.5. Adatok feldolgozsa vgjelig 265

Az adatok vgjelig val feldolgozsra tbbfle megolds is knlkozik. E megoldsok


egy dologban hasonlk: az adatbevitelt mindenkppen egy vizsglatnak kell kvetnie,
amely meghatrozza, hogy a bevitt adat vgjel-e vagy sem.
- Az els megoldsban a ciklus eltt s a ciklusmag vgn krnk be adatot gy, hogy a
beolvasst kzvetlenl kveti a while ciklus felttelnek vizsglata. gy a ciklusmag-
ban csak rvnyes adatot dolgozunk fel. Az adatokat elolvassuk a tnyleges feldolgo-
zshoz.
- A msodik megoldsban a beolvasst egy huszrvgssal betesszk a ciklus felttelbe,
gy elkerljk a redundancit, a ktszeri beolvasst.
- A harmadik megoldsban egy vgtelen ciklusban olvassuk be s dolgozzuk fel az ada-
tokat. Az adat bekrse utn itt is vizsglat kvetkezik, s ha a bekrt adat vgjel, akkor
elhagyjuk a ciklust.

Forrskd (hrom megolds)

import extra.Console;

public class KorKerulet {


public static void main (String args[]) {
final int VEGJEL = 0;
double sugar;
long kerulet;

// 1. megolds:
sugar = Console.readDouble("Sugr: ") ;
while (sugar != VEGJEL) {
kerulet = Math.round(sugar*2*Math.PI);
System.out.println("Kerlet: "+kerulet) ;
sugar = Console.readDouble("Sugr: ") ;
}

// 2. megolds:
while ((sugar = Console.readDouble("Sugr: ")) != VEGJEL) {
kerulet = Math.round(sugar*2*Math.PI);
System.out.println("Kerlet: "+kerulet) ;
}

// 3. megolds:
while (true) {
sugar = Console.readDouble("Sugr: ") ;
if (sugar == VEGJEL)
break;
kerulet = Math.round(sugar*2*Math.PI);
System.out.println("Kerlet: "+kerulet) ;
}
}
}
266 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

14.6. Megszmlls

Ebben a feladattpusban megszmoljuk egy sorozat valamilyen adott tulajdonsggal


rendelkez elemeit. A szmllt (n-et) kezdetben nullra lltjuk, majd az adott tulajdon-
sg elem feldolgozsakor eggyel megnveljk.

A legegyszerbb eset, amikor minden elemet megszmolunk:

Feladat Megszmol
Krjnk be szmokat a felhasznltl 0 vgjelig. rjuk ki a bevitt szmok szmt!

Forrskd
import extra.Console;
public class Megszamol {
public static void main (String args[]) {
final int VEGJEL = 0;
int n = 0;
int szam;
while ((szam = Console.readInt("Szm: ")) != VEGJEL) {
n++;
}
System.out.println("A bevitt szmok szma: "+n);
}
}

Most nzznk egy olyan esetet, amelyben vlogatunk is, vagyis csak az adott tulajdonsg
elemeket szmoljuk:

Feladat Prmek
Adott kt szm kztt hny darab prmszm van?

Egy szm prmszm, ha csak eggyel s nmagval oszthat. Ha egyb osztt is tallunk, akkor
a szm nem prm. A vizsglatot termszetesen elegend a szm ngyzetgykig elvgezni.

Forrskd
public class Primek {
public static void main (String args[]) {
int tol=2000, ig=2100;
int primekSzama=0;
for (int n=tol; n<=ig; n++) {
boolean prim=true;
for (int i=2; prim && (i<=Math.sqrt(n)); i++)
prim = n%i!=0;
if (prim) {
System.out.print(n+" ");
primekSzama++;
}
}
14. Itercik 14.7. sszegzs, tlagszmts 267

System.out.println("\nPrmek szma: "+primekSzama);


}
}
A program futsa
2003 2011 2017 2027 2029 2039 2053 2063 2069 2081 2083 2087
2089 2099
Prmek szma: 14

14.7. sszegzs, tlagszmts

Az olyan feladatokat, melyekben a sorozat elemeit valamilyen mdon gyjteni kell,


sszegzses feladatoknak nevezzk. Ebbe a feladatcsoportba sorolhat a klnbsg-,
illetve szorzatkpzs is.

Az tlag kiszmtsakor egyszerre kt dolgot is vgznk sszegznk, s kzben szmllunk.


Vgl a kt gyjttt rtk hnyadost kell kpezni, de csak akkor, ha volt tlagoland adat.
Ellenkez esetben nullval osztannk, s ez futsi hibt eredmnyezne.

Feladat tlag
Olvassunk be szmokat nulla vgjelig, majd rjuk ki ezek sszegt, darabszmt s
tlagt!

Forrskd
import extra.*;
public class Atlag {
public static void main (String args[]) {
final int VEGJEL = 0;
long osszeg = 0;
int db = 0, szam;
while ((szam = Console.readInt("Szm: "))!= VEGJEL) {
db++;
osszeg += szam;
}
if (db!=0) {
System.out.println("sszeg= "+osszeg);
System.out.println("Darab = "+db);
System.out.println("tlag = "+
Format.right(osszeg*1.0/db,0,2));
}
else
System.out.println("Nincs beolvasott szm!");
}
}

A program egy lehetsges futsa


Szm: 5
Szm: 9
268 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Szm: 3
Szm: 0
sszeg= 17
Darab = 3
tlag = 5.67

14.8. Minimum- s maximumkivlaszts

Maximumkivlaszts esetn a sorozat legnagyobb, minimumkivlaszts esetn a sorozat


legkisebb elemt kell meghatroznunk.
Az algoritmus lnyege, hogy a sorozat elemeit sorban megvizsglva mindig megjegyezzk
az addigi maximlis/minimlis elemet. Ha egy annl nagyobb/kisebb elem rkezik, akkor a
megjegyzett elemet ezzel kicserljk. Indul rtkknt vagy az els elemet adjuk meg,
vagy egy olyan szlsrtket (nagyon kicsi/nagyon nagy rtket), amelyet az sszes lehet-
sges rkez elem biztosan lehagy. A feldolgozs vgn amennyiben volt a sorozatnak
legalbb egy eleme a megjegyzett elem az sszes szm maximuma/minimuma lesz.

Legknnyebb dolgunk akkor van, ha elre tudjuk a sorozat elemeinek szmt, s ez nem nulla.
Ilyen a kvetkez feladat:

Feladat Minimlis s maximlis kilomter


Krjk be a hnap minden napjra, hogy autnkkal hny km-t tettnk meg aznap!
rjuk ki, melyik nap mentnk a legtbbet, illetve a legkevesebbet, s mennyit! A
hnap 31 napos. Kt egyforma teljestmny nap esetn az elst rjuk ki!

Forrskd
import extra.Console;

public class MinMaxKm {


public static void main (String args[]) {
int km = Console.readInt(1+". napi km: ");
int minKm=km, maxKm=km;
int minNap=1; int maxNap=1;
for (int nap=2; nap<=31; nap++) {
km = Console.readInt(nap+". napi km: ");
if (km < minKm) {
minNap = nap;
minKm = km;
}
else if (km > maxKm) {
maxNap = nap;
maxKm = km;
}
}
14. Itercik 14.8. Minimum- s maximumkivlaszts 269

System.out.println("Legkevesebb a "+minNap+
". napon "+minKm+" km");
System.out.println("Legtbb a "+maxNap+
". napon "+maxKm+" km");
}
}

A kvetkez feladatban maximumot szmtunk gy, hogy nem tudjuk az rkez elemek szmt,
viszont tudjuk, hogy az rkez elemek csak pozitvak lehetnek. Ezrt a vgjel is lehet nulla, s a
kezdeti maximumot is vehetjk nullnak. Ha a vgn a maximum mg mindig nulla, az azt
jelenti, hogy nem volt bevitel.

Feladat Maximlis szmla


Krjnk be a felhasznltl szmlasszegeket. A bevitel befejezdik, ha az sszeg-
nl nullt tnek. rjuk ki a legnagyobb sszeg szmla sorszmt s sszegt! Nulla
sszeg szmla nem lehetsges.

Forrskd
import extra.*;

public class MaxSzamla {


public static void main (String args[]) {
double maxOsszeg = 0, osszeg;
int maxSorszam=0, sorszam=0;
System.out.println("sszegek (vge=0)");

while ((osszeg=Console.readDouble("? ")) != 0) {


sorszam++;
if (osszeg > maxOsszeg) {
maxOsszeg = osszeg;
maxSorszam = sorszam;
}
}
if (maxOsszeg == 0)
System.out.println("Nincs szmla!");
else {
System.out.print("A maximlis szmla sszege: "+
Format.left(maxOsszeg,0,2));
System.out.println(", sorszma: "+maxSorszam);
}
}
}

A program egy lehetsges futsa


sszegek (vge=0)
? 5020
? 6400
? 700
? 0
A maximlis szmla sszege: 6400, sorszma: 2
270 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

14.9. Menkszts
A menksztsnek most egy egyszer vltozatt programozzuk be. Hogy hogyan lehet egy
profi ment kszteni, arrl a kvetkez ktetben lesz majd sz a grafikus felhasznli fellet
programozsa kapcsn.

Amikor egy ment ksztnk, vlasztsi lehetsgeket knlunk fel a felhasznlnak, majd
vrjuk az erre val reaglst. A lehetsgeket ismtelten felknljuk egszen addig, amg a
felhasznl gy nem dnt, hogy nem akar tbb lehetsget ignybe venni, vissza akar lpni
a programnak egy elz szintjre, vagy be akarja fejezni a programot. Ha a felhasznl
nem a kilpst vlasztotta, akkor vlogatni kell a programrszek kztt a felhasznl vla-
sznak megfelelen. A menkszts tipikusan htultesztel ciklussal megoldand feladat.

Feladat Men
Ksztsnk egy ment! Hrom dologbl lehet vlasztani: egyik funkci, msik funkci
s kilps.
Jelentsk meg a vlasztsi lehetsgeket: E(gyik) / M(sik) / V(ge)?
Az Egyik, illetve a Msik funkci vlasztsra ismtelten jelenjk meg egy-egy
szveg, a Vge vlasztsra pedig legyen vge a programnak.

Forrskd
import extra.Console;
public class Menu {
public static void main (String args[]) {
char valasz;

do {
// Vlasztsi lehetsgek kirsa:
System.out.print("E(gyik) / M(sik) / V(ge)? ");

// A felhasznl vlaszt:
valasz = Console.readChar();
// Nagybetre alakits:
valasz = Character.toUpperCase(valasz);

// A kivlasztott funkci vgrehajtsa:


switch (valasz) {
case 'E':
System.out.println("Egyik funkci vgrehajtsa\n");
break;
case 'M':
System.out.println("Msik funkci vgrehajtsa\n");
break;
}
} while (valasz!='V');
}
}
14. Itercik 14.9. Menkszts 271

Futs
E(gyik) / M(sik) / V(ge)? e
Egyik funkci vgrehajtsa

E(gyik) / M(sik) / V(ge)? m


Msik funkci vgrehajtsa

E(gyik) / M(sik) / V(ge)? e


Egyik funkci vgrehajtsa

E(gyik) / M(sik) / V(ge)? v

Tesztkrdsek

14.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) A while ciklusban a felttel teljeslse esetn vgrehajtdik a ciklusmag.
b) A do while ciklusban a ciklusmag utn egy kilpsi felttel van.
c) A do s while kulcsszavak kztti egyetlen utastst nem kell blokkba tenni.
d) A while ciklus felttelt zrjelbe kell tenni.
14.2. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A while utasts ell tesztel, s egyszer mindenkppen vgrehajtdik.
b) A do while utasts htul tesztel, s egyszer mindenkppen vgrehajtdik.
c) A for utasts fejben ktelez ciklusvltozt deklarlni.
d) A for utasts fejben a kzps rszben kt felttel is megadhat, vesszvel elv-
lasztva.
14.3. Melyik for ciklus feje helyes szintaktikailag? Jellje meg az sszes j vlaszt!
a) for(int i=0;i==8;++i) utasts;
b) for(int i=0;false;i++) utasts;
c) for (int i=0;i++) utasts;
d) for(;;) utasts;
14.4. Mit r ki a kvetkez kdrszlet? Jellje meg az egyetlen j vlaszt!
for (int k=0;k<=6;k++) {
int s=k%5;
s*=2;
}
System.out.print(s+" ");
a) 0246802
b) Fordtsi hiba, mert a kir utastsban az s ismeretlen.
c) 2
d) 0123401
272 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

14.5. Melyik ciklus hajtdik vgre legalbb egyszer a kvetkez deklarci mellett? Jellje
meg az sszes j vlaszt!
int a=10; b=12;

a) while (a>=0 & b!=0) {...}


b) do {
...
} while (a==b | b<0);
c) for (int i=5; i<0; i--) {...}
d) while (a<0 | (a+b)%5==2) {...}
14.6. Mi igaz a kvetkez kdrszletre? Jellje meg az sszes igaz lltst!
for (int i=0;i<10;i--) {
for (int i=0;;i++) {
System.out.println(i);
}
}
a) A kdrszlet szintaktikailag hibs, mert a kls ciklusvltoz sohasem rheti el a
10-et.
b) A kdrszlet szintaktikailag hibs, mert az i vltoz ktszer van deklarlva.
c) A kdrszlet szintaktikailag hibs, mert a msodik for ciklusban nincs felttel.
d) A kdrszlet szintaktikailag helyes.
14.7. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A break utasts hatsra a vezrls az adott utastsblokk vgre kerl.
b) A break utasts hatsra a vezrls a break-et tartalmaz sszes ciklust elhagyja.
c) A continue hatsra a vezrls az adott utastsblokk vgre kerl.
d) A continue utasts a ciklusvltozt automatikusan eggyel megnveli.
14.8. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Vgjelig val feldolgozs esetn a vgjel feldolgozsa a sorozat elemeknt logikai
hibt eredmnyez.
b) A megszmlls algoritmusban egy sorozat valamilyen adott tulajdonsg elemeit
szmoljuk meg.
c) A minimumszmts algoritmusban, ha a sorozat elemeit mindig egy addigi mini-
mumhoz hasonltjuk, akkor vagy az els szmrl, vagy egy olyan kicsi
szmrl kell indulnunk, amilyen biztosan nincs a sorozatban.
d) A maximumszmts algoritmusban, ha a sorozat elemeit mindig egy addigi maxi-
mumhoz hasonltjuk, akkor vagy az els szmrl, vagy egy olyan kicsi szmrl
kell indulnunk, amilyen biztosan nincs a sorozatban.

Feladatok

14.1. (A) Szretkor sorban lemrik a puttonyokban lev szl slyt. Ksztsnk programot,
mely segtsgvel ezek az rtkek feldolgozhatk! Kvncsiak vagyunk a nap vgn,
hogy sszesen hny puttonnyal s hny kg szlt szreteltek. Termszetesen a putto-
nyok szmt elre nem tudjuk. (Szuret1.java)
14. Itercik 14.9. Menkszts 273

14.2. (B) Egsztsk ki az elz feladatot: A szlt 1000 kg teherbrs gpkocsikkal szllt-
jk el a helysznrl. Minden esetben, amikor a szl mennyisge elrte (meghaladta) az
1000 kg-ot, akkor a program figyelmeztessen: Mehet a kocsi! (Szuret2.java)

14.3. (A) Munksokat vesznk fel egy adott munkra. A szksges ltszmot a program ele-
jn megkrdezzk. Az emberek csoportosan jelentkeznek; ssk be sorban a jelentkez
csoportok ltszmait! Ha megvan a szksges ltszm, akkor rjuk ki, hogy A ltszm
betelt!, valamint azt, hogy hny fre van szksg az utols csoportbl!
(MunkasFelvetel.java)
14.4. (A) Krjk be, hogy a hten mennyi kalrit fogyasztottunk az egyes napokon! Ezutn
rjuk ki az sszes kalriafogyasztsunkat, valamint a napi tlag kalriafogyasztst!
(Kaloria.java)

14.5. (A) Krjen be egy egsz szmot, majd rja ki 0-tl n-ig (n-et is belertve)
a) az sszes egsz szmot!
b) az sszes pros szmot!
c) az sszes hrommal oszthat szmot!
(SzamSor.java)
14.6. (A) Ksztsen egy dsztsort! A dsztsor egy adott karaktersorozat ismtlse. Krje be
a felhasznltl a karaktersorozatot s az ismtlsek szmt, majd jelentse meg a dsz-
tsort a konzolon! A dsztsor tbb soros is lehet. (Diszitosor.java)

14.7. (B) Krje be n rtkt, majd ksztse el a kvetkez n soros hromszget


(Haromszog.java):
1
1 2
1 2 3
. . .
1 2 3 . . . n

14.8. (B) Krjen be egy egsz szmot, s llaptsa meg, hogy hny 0 jegy szerepel benne!
(NullaJegyek.java)

14.9. Hny darab ngyzetszm van ezerig? rja is ki a ngyzetszmokat


a) (B) sorban, egyms utn!
b) (C) gy, hogy egy sorban csak t szm szerepeljen, s a szmok 6 hosszon legyenek
kirva, jobbra igaztva! (NegyzetSzamok.java)
14.10. Krjen be kt karaktert, majd rja ki az sszes olyan karaktert, amely az unikd tblban
a megadott karakterek kz esik!
a) (A) Tegyk fel, hogy elbb az unikd tblban elrbb szerepel karaktert adjk
meg.
b) (B) Figyeljnk a kvetkezre: a felhasznl nem ismeri az unikd tblt, ezrt nem
biztos, hogy elszr a kisebb karaktert ti be!
(KettoKozott.java)
274 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

14.11. (B) Krdezze meg a felhasznltl, hogy mennyi pnze van, s milyen vi kamatozssal
tette azt be a bankba! Ezutn a program ismtelten tegye lehetv, hogy az illet tbb-
szr megkrdezhesse, melyik vben mennyi pnze lesz? (MennyiPenz.java)

14.12. (A) Krjnk be terminlrl karaktereket '-' vgjelig! Vgl rjuk ki, hny karaktert
tttek be A s Z, a s z, valamint 0 s 9 kztt! rjuk ki azt is, hny ezektl eltr
karaktert tttek! (KarSzamol.java)

14.13. (B) Van egy bizonyos sszegnk, amelybl szmlkat szeretnnk kifizetni, de maxi-
mum tzet. Krje be a rendelkezsre ll sszeget, majd sorban a szmlasszegeket! Ha
a szmlk szma elri a tzet, vagy az adott szmlra mr nincs pnz, adjon a program
egy figyelmeztetst! Vgl rja ki, hny szmlt sikerlt kifizetni, s mennyi a tnylege-
sen kifizetend sszeg! (SzamlaKifizetes.java)

14.14. (C) Krjen be egy hatrszmot, majd rja ki eddig a szmig az sszes prmszmot!
(Primek.java)

14.15. (C) Sheran hindu kirly meg akarta jutalmazni a sakkjtk feltalljt, s rbzta, hogy
maga vlassza meg a jutalmt. A blcs ember gy vlaszolt: A sakktbla els mezj-
rt csak egy bzaszemet adj uram! A msodikrt 2-t, a harmadikrt 4-et stb., minden
mezrt ktszer annyit, mint az elzrt. Szmoljunk utna, mennyi is volt pontosan a
jutalom?
A sakktbla vzszintes koordinti: A s H, fggleges koordinti pedig: 1 s 8 kztti
rtkek. A tbla (A,1) mezjre egy darab bzaszemet helyeznk, a (B,1) helyre ennek
ktszerest. A sakktbla sszes mezjre sorfolytonosan mindig az elz mezre tett
bzamennyisg ktszerest tesszk.
a) Melyik mezn lesz mr legalbb 1 milli bzaszem? rja ki az oszlopot s sort is (pl.
E3 mezn 1048576 szem bza)!
b) Hny bzaszem lesz az egyes mezkn? Ciklusban krjk be a felhasznltl,
milyen koordintra kvncsi, s minden esetben rjuk ki az eredmnyt! A program-
nak akkor legyen vge, ha a beviteli vzszintes koordintnl a * karaktert tik be!
(Buzaszemek.java)
14.16. (A) Krdezzk meg a felhasznltl, hogy minek a terlett hajtja kiszmtani: tgla-
lapt, krt vagy krcikkt? Krjk be a szksges adatokat s rjuk ki az eredmnyt!
Ezutn jra knljuk fel a lehetsgeket. Tegyk lehetv azt is, hogy a felhasznl
kiszlljon a programbl! (Terulet.java)

14.17. Krjk be, hogy a hten mennyi kalrit fogyasztottunk az egyes napokon! Ezutn rjuk
ki, hogy hnyadik napon fogyasztottuk a legtbb, illetve a legkevesebb kalrit!
a) (A) Ha tbb ilyen nap van, akkor az els ilyent rjuk ki! (LegKaloria1.java)
b) (B) Ha tbb ilyen nap van, akkor rjuk ki az sszeset! Tipp: A maximlis s
minimlis rtkeket egy karakterlncban gyjtsk! (LegKaloria2.java)
14. Itercik 14.9. Menkszts 275

14.18. (B) Krje be egyms utn klnbz henger alak hordk adatait (tmr, magassg)!
Ha a hord els adatnl 0-t tnek be, akkor vge a bevitelnek. rja ki, hnyadik hor-
dba fr bele a legkevesebb, illetve a legtbb bor! rja ki ezen hordk adatait is!
(MinMaxHenger.java)

14.19. (C) Ksztsen egy pnzbedob automatt! Elszr krje be a bedoband sszeget. Az
automatba csak 10, 20, 50 s 100 Ft-ost lehet bedobni, ha ms pnzt dobnak bele, azt
visszaadja. Addig krje az automata a pnzt, amg a bedobott sszeg el nem ri a kvnt
sszeget. Kzben folyamatosan tjkoztassuk a bedobt, hogy mennyit kell mg bedob-
nia! Vgl, ha a bedob tbb pnzt dobott be, akkor a visszajr sszeget az automata
visszaadja. (Automata.java)
276 IV. RSZ. JAVA PROGRAMOZSI ALAPOK
15. Metdusok rsa 15.1. A metdus fogalma, szintaktikja 277

15. Metdusok rsa

A fejezet pontjai:
1. A metdus fogalma, szintaktikja
2. Paramtertads
3. Visszatrs a metdusbl
4. Metdusok tlterhelse
5. Loklis vltozk
6. Nhny plda
7. Hogyan tervezzk meg metdusainkat?

Metdusok rsval az objektum, illetve osztly feladatait rszekre bonthatjuk, azokat kln-
kln megnevezhetv tehetjk. Amikor egy objektumnak (vagy osztlynak) zenetet kldnk,
akkor egy olyan metdus kerl vgrehajtsra, amely az zenetnek egyrtelmen megfeleltet-
het. Az osztlyban deklarlt metdusok egymst is hvhatjk. A fejezet bevezeti az Olvast a
metdusrs rejtelmeibe.

15.1. A metdus fogalma, szintaktikja


A metdusrs alapvet felptst s szintaktikjt egy mintafeladaton keresztl mutatjuk be:

Feladat Metdusminta
Krjnk be szmokat a konzolrl 0 vgjelig! Minden egyes szmrl llaptsuk meg,
hogy az hny jegy! A program elejn s vgn, valamint az egyes eredmnyek
kirsa utn hzzunk egy-egy 20 hosszsg vonalat!
A nagyvonal megolds terve (pszeudokd)
adatok: szm, jegyek szma
vonalhzs
in: szm
while szm != 0
jegyek szmnak kiszmtsa s kirsa
vonalhzs
in: szm
end while
vonalhzs
278 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

E durva elkpzelsnek most meg kell rnunk a Java kdjt. A program gy is mkdkpes
lenne, ha az sszes utastst beprselnnk a main metdusba. Ez azonban a programot teljesen
ttekinthetetlenn tenn, hiszen
a vonal hzst hromszor kellene kdolnunk, s ha a vonalhz algoritmuson vltoz-
tatni szeretnnk, azt hrom helyen kellene tvezetnnk;
a feladatok rszekre bontsa az ttekinthetsg elengedhetetlen felttele. Gondoljuk
meg, hogy a Java kd a tervnek tbbszrse lesz.

A metdus utastsok (tevkenysgek) sszessge, melyet meghvhatunk a metdus


nevre val hivatkozssal.

rjunk egy-egy metdust a vonal hzsra s a jegyek szmnak kiszmtsra; ezeket aztn a
megfelel helyekrl meghvhatjuk. Nzzk a teljes programot:

Forrskd
import extra.*;

public class MetodusMinta { //1

public static void main(String[] args) { //2


vonalhuz(); //3
int szam; //4

while ((szam=Console.readInt("Szm: ")) != 0) { //5


System.out.println("Jegyek szma: "+
jegyekSzama(szam)); //6
vonalhuz(); //7
} //8
vonalhuz(); //9
} //10

static void vonalhuz() { //11


for (int i=1; i<=20; i++) //12
System.out.print('-'); //13
System.out.println(); //14
} //15

static int jegyekSzama(int n) { //16


int result = 0; //17
do { //18
n /= 10; //19
result++; //20
} while (n !=0); //21
return result; //22
} //23
} //24
15. Metdusok rsa 15.1. A metdus fogalma, szintaktikja 279

A program egy lehetsges futsa


--------------------
Szm: 3
Jegyek szma: 1
--------------------
Szm: 6289
Jegyek szma: 4
--------------------
Szm: 0
--------------------

A program elemzse

A program egyetlen osztlya a MetodusMinta; az osztly UML diagramja a 15.1. brn


lthat. Az osztly hrom metdust tartalmaz: main, vonalhuz s jegyekSzama. A main az
osztly ktelez formj metdusa, amely minden Java program belpsi pontja. A program
futsa sorn a Java futtat rendszer a main utastsait sorban vgrehajtja. ltalban, amikor a
vezrls egy metdushvshoz r, a rendszer megjegyzi, hol tartott, elszalad vgrehajtani a
meghvott metdust, majd visszatr oda, ahonnan a hvs trtnt. Programunkban a main a
kvetkez metdusokat hvja meg:
a vonalhuz metdus eljrs, amelynek feladata a 20 karakter hosszsg vonal meg-
hzsa. Az eljrs kdja a //11 s //15 sorok kztt van, s azt a //3, //7 s //9 sorokbl
hvjuk meg.
a jegyekSzama metdus fggvny, amely azrt felels, hogy kiszmtsa egy adott
szm jegyeinek a szmt. A fggvny kdja a //16 s //23 sorok kztt van, s azt a //6
sorbl hvjuk meg.

MetodusMinta

+main(args: String[])
vonalhuz()
jegyekSzama(n: int): int

15.1. bra. MetodusMinta osztly

Az osztly metdusainak deklarlsi sorrendje tetszleges, de szem eltt kell tartani az


osztly ttekinthetsgt. A main metdust mindenkppen az osztly els vagy utols
metdusaknt clszer megadni.
280 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Egy Java program megrsa minden esetben osztlyok fejlesztsvel trtnik. Programrs
kzben hivatkozhatunk akr az API osztlyaiban deklarlt metdusokra, akr a sajt osztlya-
inkban megrtakra. Hivatkozskor vagy egy objektumot, vagy egy osztlyt szltunk meg. Egy
metdust az t tartalmaz csomag(ok), azon bell osztly(ok) neveivel minstnk pldul a
java.lang.Math.random() a java csomag lang alcsomagjban lev Math osztly
random() metdust azonostja. A minsts nlkli metdushvs annak az osztlynak a
metdust hvja meg, amelybl a hvs trtnt. A MetodusMinta osztlyban pldul felesle-
ges a vonalhuz(); helyett a MetodusMinta.vonalhuz(); minstett nevet hasznlnunk,
hiszen a hvs a MetodusMinta egy msik metdusbl trtnt.

Eljrs, fggvny

Egy metdust attl fggen, hogy van-e visszatrsi rtke, vagy nincs, eljrsnak vagy
fggvnynek szoks nevezni:
- Az eljrs utastsok sszessge, melyet egyszeren vgrehajtunk az eljrs nevre
val hivatkozssal (metdushv utastssal). Vgrehajts utn a program azzal az uta-
stssal folytatdik, amelyik kveti a metdushv utastst. Az eljrs visszatrsi
tpusa void (void=semleges), ami azt jelenti, hogy a visszatrsi tpus nincs definilva.
Pldul:
System.out.println(); vonalhuz();
- A fggvny is utastsok sszessge, melyet a nevre val hivatkozssal hajtunk vgre,
de egy lnyeges dologban eltr az eljrstl: a fggvny visszaad egy rtket, melyet a
fggvny neve kpvisel. A visszatrsi rtk tpusa a fggvny visszatrsi tpusa. A
fggvny rtkt olyan kifejezsekben hasznlhatjuk, ahol ez a visszatrsi tpus meg
van engedve. Pldul:
double d=Math.cos(2);
int jegySzam=jegyekSzama(65);

Az eljrs s a fggvny deklarcija a Javban formailag azonos, s mindkettt metdus-


nak nevezzk.
Az eljrs visszatrsi rtke semleges, s nem hvhat meg fggvnyknt. A fggvny
ezzel szemben eljrsknt is meghvhat, ekkor a visszatrsi rtk a szemtbe kerl. A
fggvny eljrsknt trtn hvsnak termszetesen csak akkor van rtelme, ha a fgg-
vnynek ms feladata is van a visszatrsi rtk meghatrozsn kvl. A Math.sin(0);
utasts pldul szintaktikailag helyes, de semmi rtelme sincs.
Fontos tudni: a fordt nem engedi meg, hogy statikus metdusbl (osztlymetdusbl)
pldnymetdust hvjunk, hiszen a statikus metdus futsa nem kveteli meg a pldny
ltezst, a pldnymetdus ezzel szemben csak pldnyon tud dolgozni. Statikus met-
dusbl kizrlag az osztly statikus elemeire (adataira s metdusaira) hivatkozha-
tunk!
15. Metdusok rsa 15.1. A metdus fogalma, szintaktikja 281

A metdus ltalnos szintakszisa

A metdus ltalnos szintakszisa s az egyes rszek jelentse a kvetkez:

Metdusfej

<mdostk> <visszatrsi tpus> <metdus neve>


( <formlis paramterlista> ) <throws ...>
{
<metdusblokk>
}
A nagy zrjelek kztti rszeket nem ktelez megadni.

Pldk metdusfejek megadsra

Mdostk Visszat. tpus Nv Paramterek


public void print (float f)
public static int min (int a, int b)
void vonalhuz ()
private int minChar (char c1, char c2, char c3)

A pldkbl jl lthat, hogy mdostkat nem felttlenl kell adni. Visszatrsi tpusa s neve
azonban mindegyik metdusnak van. Ktelez tovbb kirni a formlis paramterlista nyit s
csuk zrjelt, mert ez azt jelzi, hogy metdusrl s nem vltozdeklarcirl van sz.

Mdostk
Mdostt nem ktelez adni, s a sorrend elvileg ktetlen. A metdus mdosti a kvetkezk
lehetnek:
public, protected vagy private: a metdus lthatsga. Legfeljebb egy adhat
meg. Ha nem adjuk meg, akkor alaprtelmezs szerint a deklarci kizrlag a sajt
csomagjbl lthat (csomagszint lthatsg).
abstract: absztrakt metdus, vagyis res, s azt egy utd osztlyban kell majd kifej-
teni.
final: vgleges metdus, nem lehet az utd osztlyokban mdostani. Ha nem adjuk
meg, akkor a metdus elvileg ksbb fellrhat. (Az abstract s final mdostk
nem adhatk meg egyszerre.)
static: statikus, vagyis osztlymetdus. Ha nem adjuk meg, akkor a metdus
pldnymetdus.
Egyb mdostk: native, synchronized
282 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A felsorolt mdostk kzl egyelre csak a public s static mdostkat alkalmazzuk:


- public: Publikus lthatsg metdus. Ezt a mdostt pillanatnyilag csak a main
metdus el fontos kirnunk, hiszen a f osztlyt nem akarjuk s nem is tudjuk kvlrl
ms metdussal megszltani.
- static: Statikus, vagyis osztlymetdus. Egy metdus alaprtelmezs szerint
pldnymetdus (el teht nem rjuk ki a static kulcsszt).

Megjegyzs: Ebben a fejezetben knyszersgbl mindegyik metdusunk statikus lesz,


mert mg nem tudunk osztlyt deklarlni s pldnyostani.

Visszatrsi tpus
Minden metdusnak ktelezen definilni kell a visszatrsi tpust, illetve kzlni kell azt
is, ha nincsen. Az eljrsnak nincsen visszatrsi tpusa, erre utal a void (semleges) kulcssz.
Fggvny esetben a visszatrsi tpus a fggvny ltal visszaadott rtk tpusa, amely lehet:
brmelyik primitv tpus vagy
egy referencia (objektum) tpus.

A metdus neve
Minden metdusnak ktelezen meg kell adni a nevt, erre az azonost kpzsi szablyai
rvnyesek. A metdus szignatrjnak az osztlyban egyedinek kell lennie (nv+a param-
terek tpusa).

Formlis paramterlista
A formlis paramterlistban adjuk meg az esetleges formlis paramterek nevt s tpu-
st. Ha nincs a metdusnak paramtere, a nyit s csuk zrjeleket akkor is ktelez meg-
adni, mert a Java gy klnbzteti meg a metdusokat az egyb deklarciktl. A vonalhuz
metdusnak nincsen paramtere, mg a jegyekSzama metdusnak egyetlen, int tpus para-
mtere van, az n. Tbb paramter esetn a paramtereket vesszvel vlasztjuk el egymstl, s
minden egyes paramternek kln-kln megadjuk a tpust. Pldul: min(int a, int b).

throws ...
Nem ktelez megadni. E kulcssz utn kivtel- (exception) tpusokat sorolhatunk fel: az ilyen
kivtelekkel a metdus nem kvn foglalkozni, azokat tovbbtja az t hv eljrsnak. A kiv-
telkezelsrl a knyv 2. ktetben lesz sz.

Metdusblokk
A metdus blokkja utastsokat tartalmaz. A metdus blokkjt nyit s csuk kapcsos
zrjelek kz rjuk. A metdus blokkjban nem lehet jabb metdust deklarlni.
15. Metdusok rsa 15.2. Paramtertads 283

15.2. Paramtertads
A metdusoknak paramterek adhatk t. A jegyekSzama(szam) fggvnyt egyetlen para-
mterrel hvjuk meg. A metdus mindig az aktulis paramter rtktl fggen fut le. Nz-
zk meg, hogyan kell felksztennk egy metdust a paramterek fogadsra!

Formlis paramter

static int jegyekSzama(int n) {


int result = 0;
do {
n /= 10; Paramtertads, a httrben ez
result++;
} while (n !=0); trtnik: n=szam;
return result;
}
Aktulis
...
System.out.println paramter
("Jegyek szma: "+jegyekSzama(szam));
...

15.2. bra. Paramtertads

Formlis s aktulis paramterek


A paramtertads technikjt a 15.2. bra mutatja. A jegyekSzama metdus a futskor
kapott szam aktulis rtkbl szmtja ki a jegyek szmt.

A metdus fejben deklarlt paramtert formlis paramternek nevezzk, hiszen ez eg-


szen addig csak formlis, mg az eljrst meg nem hvjuk valamilyen aktulis paramter-
rel. A formlis paramtert ugyangy kell deklarlni, mint egy vltozt meg kell adni
nevt s tpust. Egy metdusnak akrhny (nulla, egy vagy tbb) formlis paramtere
lehet. A formlis paramterlista formlis paramterdeklarcik vesszvel elvlasztott
sorozata.
Az aktulis paramter brmilyen kifejezs lehet, amely a formlis paramterrel r-
tkads szerint kompatbilis. Ez azt jelenti, hogy ha lerhatjuk a formPar=kifejezs;
rtkad utastst, akkor a kifejezs paramterknt is tadhat formPar-nak.

Pldnkban lerhatjuk az n=szam; rtkad utastst, teht a paramtertads szintaktikailag


helyes. Az aktulis paramter tetszleges kifejezs lehet. Az int tpus n formlis paramter-
nek pldul a kvetkez kifejezsek is tadhatk aktulis paramterknt:
284 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

jegyekSzama(szam+20)
jegyekSzama(102) // egy operandus kifejezs
jegyekSzama(szam+(int)Math.round(Math.random()*10))

Vltoztassuk meg most a MetodusMinta feladatot gy, hogy a program elejn s vgn 50
hosszsg vonalat hzunk, kzben pedig vltozatlanul 20 hosszsgt. Ezt gy tudjuk leg-
szebben megoldani, ha a vonalhuz eljrsnak egy hossz paramtert definilunk. A kvetkez
metdus mindig a megadott hosszsg vonalat hzza:

static void vonalhuz (int hossz) {


for (int i=1; i<= hossz; i++)
System.out.print('-');
System.out.println(); 20 helyett a hossz most mindig ms!
}

A metdust most a programbl ktflekppen fogjuk meghvni:


vonalhuz(50);
vonalhuz(20);

Egy olyan vonalat, melynek hosszsga 1 s 80 kztti vletlen rtk, gy hzhatunk:


vonalhuz((int)(Math.random()*80)+1);

Egy eljrsnak nemcsak egy paramtere lehet, hanem akrhny. A kvetkez metdus egy
adott hosszsg vonalat hz, adott karakterrel:
static void vonalhuz(int hossz, char ch) {
for (int i=1; i<=hossz; i++)
System.out.print(ch);
System.out.println();
} Mr kt vltoz fgg az aktulis rtktl!

A kvetkez hvs hatsra a ***** vonal jelenik meg a konzolon.


vonalhuz(5,'*');

Megjegyzs: A Javban csak rtk szerinti paramtertads van. Ez azt jelenti, hogy az aktu-
lis paramter rtkt a metdus felhasznlja, de nem vltoztathatja meg. Aktulis param-
terknt tadhat egy brmilyen, rtkads szerint kompatbilis kifejezs rtke, de ha trt-
netesen egy puszta vltozt adunk t, azt a metdus nem fogja s nem is tudja megvltoz-
tatni. Objektumreferencia tadsa esetn az objektum megvltoztathat ugyan, de maga a
referencia nem.
Ms programozsi nyelvekbl ismert a cm szerinti paramtertads: ilyen esetben aktulis
paramterknt egy cmmel azonostott vltozt adunk t, melyet a metdus megvltoztathat.
Javban nem rhat meg pldul a szoroz(a,2) eljrs, amely az a rtkt megktszerezi.
15. Metdusok rsa 15.3. Visszatrs a metdusbl 285

15.3. Visszatrs a metdusbl

Fggvny esetn ktelezen meg kell adnunk a visszatrsi rtket a return (visszatrs)
utastssal, mg a blokkbl val kilps eltt:
return kifejezs;

A return hatsra a vezrls azonnal a blokk vgre kerl, s a metdus futsa befejezdik. A
return utn ktelez megadni egy kifejezst, s annak rtkads szerint kompatbilisnek kell
lennie a fggvny visszatrsi tpusval. A fggvnyhvs a kifejezs aktulis rtkt fogja
felvenni. A 15.3. brn lthat, hogy a jegyekSzama fggvny rtke a loklisan kiszmtott
result lesz.

static int jegyekSzama(int n) {


int result = 0;
do {
n /= 10;
result++;
} while (n!=0);
return result;
}

...
System.out.println
("Jegyek szma: "+jegyekSzama(szam));
...

15.3. bra. A fggvny visszatrsi rtke

A fordt figyeli, hogy a fggvnynek nincs-e olyan ga, amelyikbl kikerlhet a vezrls
return nlkl. Fordtsi hibt eredmnyez, ha a fggvnynek van return nlkli ga.

A kvetkez pldban n negatv rtke mellett a fggvnynek nincs visszatrsi rtke (visz-
szatrs azrt van, hiszen a blokk vgre kerlve mindenkppen befejezdik a metdus futsa):
static int kovetkezo(int n) {
if (n>=0)
return n+1;
} // -> Fordtsi hiba!!!

Eljrs esetn, vagyis ha a metdus visszatrsi tpusa void, nem kell return utastssal
elhagynunk a blokkot. Ha mgis ki szeretnnk ugrani a blokkbl, akkor ezt a puszta return
utastssal tehetjk meg:
return;
286 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Megjegyzs: Egy metdust nmagbl jra meghvhatunk, mieltt a vezrls a blokk vgre
rne. Ezt a jelensget rekurzinak nevezzk. Ilyen esetben a hvsnak egy az elztl telje-
sen fggetlen pldnya szletik meg. A klnbz hvsok mind klnll, sajt loklis
vltozkkal dolgoznak. Rekurzi esetn gyelni kell arra, hogy ne keveredjnk vgtelen
ciklusba. A rekurzinak kell, hogy legyen egy lellt felttele! A rekurzirl a knyv 2.
ktetben lesz sz.

Feladat Kvetkez
rjunk egy fggvnyt, mely eggyel nagyobb szmot ad vissza, mint a paramterknt
tadott szm!

Forrskd
public class Kovetkezo {

static int kovetkezo(int n) {


return n+1;
}

public static void main (String args[]) {


System.out.println(kovetkezo(555)); // -> 556
}
}

15.4. Metdusok tlterhelse

Egy metdust nem a neve, hanem a szignatrja azonost, amely a nevn kvl tartalmazza
a metdus sszes paramternek tpust a deklarls sorrendjben. (A szignatrhoz a
visszatrsi tpus nem tartozik hozz.) Ezrt megtehetjk, hogy ugyanolyan nven kln-
bz paramterezs metdusokat is deklarlunk. Ezt a jelensget a metdusok tlterhe-
lsnek nevezzk. Hvskor a fordt megkeresi azt a metdust, amely mind nvben, mind
paramterezsben rhzhat a hvsra. Az aktulis hvstl fggen az a metdus fog
futni, amelynek formlis paramterezse
- megfelel a hvsnak, vagyis ahol az sszes aktulis paramter rtkads szerint kompa-
tbilis a megfelel formlis paramterrel; s azok kzl is, amelyik
- legkzelebb ll az aktulis paramterekhez.

A kvetkez, MetodusMinta2 feladatban a vonalhuz() metdust hromfle paramtere-


zssel is megterheljk:
15. Metdusok rsa 15.4. Metdusok tlterhelse 287

Feladat Metdusminta2
Krjnk be szmokat a konzolrl 0 vgjelig! Minden egyes szmrl llaptsuk meg,
hogy az hny jegy! Hzzunk
a program elejn egy 50 hossz, @ karakterekbl ll vonalat,
az egyes eredmnyek kirsa utn egy-egy 20 hosszsg, mnusz karakterekbl
ll vonalat, valamint
a program vgn egy 50 hossz, nevet fejecskkbl ll vonalat!

Forrskd
import extra.*;
public class MetodusMinta2 {

static void vonalhuz() {


vonalhuz(20,'-');
}

static void vonalhuz(int hossz) {


vonalhuz(hossz,'-');
}

static void vonalhuz(int hossz, char ch) {


for (int i=1; i<=hossz; i++)
System.out.print(ch);
System.out.println();
}

static int jegyekSzama(int n) {


int result = 0;
do {
n /= 10;
result++;
} while (n !=0);
return result;
}

public static void main(String[] args) {


vonalhuz(50,'@');
int szam;
while ((szam=Console.readInt("Szm: ")) != 0) {
System.out.println("Jegyek szma: "+jegyekSzama(szam));
vonalhuz();
}
vonalhuz(50,'\u0002'); // nevet fejecskk
}
}

Ebben a feladatban nem nehz a megfelel hvsokat rhzni a metdusokra: a paramterek


szma egyrtelmen eldnti, hogy melyik legyen a vgrehajtand metdus. A paramter nl-
kli vonalhuz() alaprtelmezsben 20 hosszsg, mnusz jelekbl ll vonalat hz.
288 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

A kvetkez pldban a paramterek tpusa alapjn dl el, melyik lesz az aktulisan hvott
metdus:
Feladat Minimumok
rjunk hrom minimumfggvnyt: az egyik kt int, a msik kt long, a harmadik kt
double szm kzl adja vissza a kisebbet, ugyanolyan tpus rtkknt!

Forrskd
public class Minimumok {

static int min(int a, int b) {


return (a<b)? a:b;
}

static long min(long a, long b) {


return (a<b)? a:b;
}

static double min(double a, double b) {


return (a<b)? a:b;
}

public static void main(String[] args) {


int i = 53;
double d = 66.4666;
System.out.println(min(i,5)); //1 -> 5
System.out.println(min(5.0,d)); //2 -> 5.0
System.out.println(min(292,d)); //3 -> 66.4666
System.out.println(min(i,5000000000L)); //4 -> 53
}
}

A forrskd elemzse

A min metdus hvsakor:


//1-ben mindkt aktulis paramter int tpus, ezrt a fordt a min(int,int) szig-
natrj metdust hajtja vgre;
//2-ben mindkt aktulis paramter double tpus, ezrt a fordt a min(double,
double) szignatrj metdust hajtja vgre;
//3-ban az egyik aktulis paramter int, a msik pedig double tpus, ezrt a fordt a
min(double,double) metdust hajthatja vgre, hiszen a double-nak lehet int
tpus rtket adni, de fordtva nem;
//4-ben egy int s egy long tpus paramter kerl tadsra (az 5 millird utn kte-
lez kitenni az L bett, mert az int-be ekkora rtk mr nem fr be). A meghvott
metdus a min(long,long).

Megjegyzs: Ezek a min metdusok megtallhatk a java.lang.Math osztlyban is.


15. Metdusok rsa 15.5. Loklis vltozk 289

15.5. Loklis vltozk


A metdus blokkjban az utastsok kztt lehetnek deklarl utastsok is. A main metdus-
ban mr eddig is deklarltunk loklis adatokat.

A metdus blokkjban deklarlt vltozk a metdus loklis vltozi, azok csak az t dekla-
rl metdusban ismertek.
Egy loklis vltoz a deklarls pontjtl az t deklarl blokk vgig l. Egy loklis
vltoz minden egyes alkalommal, amikor a metdus meghvsra kerl, a deklarls pont-
jn megszletik (szmra memriahelyet ekkor foglal a rendszer), majd amikor a vezrls a
blokk vgre kerl, ez a memriahely felszabadul, arra hivatkozni a tovbbiakban nem
lehet.
A formlis paramterek abban klnbznek a loklis vltozktl, hogy azok szletskkor
(a metdusba val belpskor) kvlrl rtket kapnak. A loklis vltozk s a formlis
paramterek egy programszinten vannak, azonostiknak egyedieknek kell lennik.

A konstans loklis vltoz mdostja final.

A jegyekSzama metdusban a result loklis vltoz, az n formlis paramter:


static int jegyekSzama(int n) {
int result = 0;
do {
n /= 10; Formlis paramter (rtkt kvlrl kapja)
result++; Loklis vltoz
} while (n !=0);
return result;
}

A loklis vltoz kezdrtke

A loklis vltozk nem kapnak kezdrtket a blokkba val belpskor, arrl a programo-
znak kell gondoskodnia. A nem inicializlt loklis vltoz hasznlata fordtsi hibt
eredmnyez.

A metdus- s utastsblokk vltozi

Minden vltoz a deklarls pillanatban szletik meg, s az t deklarl blokk


vgig l. Ez a szably a metdusblokkra s az utastsblokkra egyarnt rvnyes. Egy
rvnyben lev vltozval azonos nev msik vltoz nem deklarlhat. Az inicializlatlan
vltozra val hivatkozs fordtsi hibt eredmnyez.

Pldul:
290 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

static void metodus() {


double d=1e3; // d a metdusblokk vltozja
for (int i=0; i<10; i++) { // i csak a for ciklusban l!
//double d = 3.5; // Szintaktikai hiba! d mr ltezik!
int n=10, m; // n s m az utastsblokk vltozi
//System.out.println(m); // Szintaktikai hiba! m nincs inicializlva!
System.out.println(d+n+i); // Rendben, d itt is rvnyes.
}
int i=5; // Rendben, a for i-je mr meghalt.
int m=10; // Rendben, a for m-je mr meghalt.
//System.out.println(n); // Szintaktikai hiba! n mr nem l!
}

A main metdus vltozi is loklis vltozk (a mintaprogramban a szam). Azrt lnek


ezek mgis egszen a program vgig, mert a program futst maga a main metdus futsa
jelenti. A main vltozi akkor szabadulnak fel, amikor a main vgre kerl a vezrls
ekkor azonban a programnak is vge van.

Megjegyzs: Egy metdus loklis vltozit csak az a metdus ismeri, amelyben a vltozt
deklarltk. Ezeket a vltozkat ms metdusok egyltaln nem ltjk, gy nem is manipull-
hatjk. Ha egy vltozt az osztly tbb metdusbl is hasznlni szeretnnk, akkor a vltozt
az osztly adataknt (osztlyszinten) kell deklarlni. Osztlyszint adatok deklarlsrl a
17., Osztly ksztse cm fejezetben lesz sz.

15.6. Nhny plda


Feladat sszeg
rjunk egy olyan metdust, mely visszaadja a paramterknt megkapott kt, int
tpus szm sszegt! A metdus egy lehetsges hvsa:
int osszeg, a=3; osszeg = sum(5,a+3);

Megjegyzs: Ezt a metdust csak a feladat kedvrt rjuk meg. Az sszead opertor haszn-
lata kzenfekvbb!
Forrskd
public class Osszeg {
static int sum(int a,int b) {
return a+b;
}

public static void main(String[] args) {


int osszeg, a=3;
osszeg = sum(5,a+3);
System.out.println(osszeg); // -> 11
}
}
15. Metdusok rsa 15.6. Nhny plda 291

Feladat Faktorilis
rjunk eljrst, amely kirja kt szm kztt a szmokat s a hozzjuk tartoz faktori-
lis rtkeket (n!=1*2*3*...*n) nvekv sorrendben! (Akkor is, ha az els paramter
kisebb, mint a msodik.)
Az eljrs egy lehetsges hvsa:
faktKiir(5,12);

Az eljrshoz ksztnk egy segdfggvnyt, mely kiszmtja egy szm faktorilist!

Forrskd
import extra.*;
public class Faktorialis {

static long fakt(int n) {


if (n < 1)
return 1;
long f = 1;
for (int i=1; i<=n; i++)
f *= i;
return f;
}

static void faktKiir (int a, int b) {


// a>b esetn a kt szm felcserlse:
if (a>b) {
int seged=a; a=b; b=seged;
}
for (int i=a; i<=b; i++)
System.out.println(i+" faktorilisa: "+fakt(i));
}

public static void main(String[] args) {


faktKiir(7,5);
}
}

A program futsa
5 faktorilisa: 120
6 faktorilisa: 720
7 faktorilisa: 5040

Feladat Vletlen szm


Ksztsnk egy fggvnyt, mely visszaad egy olyan vletlen egsz szmot, amelyik
a paramterknt megadott kt egsz kztt van (a hatrokat is belertve)!
A fggvny egy lehetsges hvsa:
int veletlen = random(3,12);

Generljunk 1000 darab vletlen szmot, s szmoljuk ki az tlagukat!


292 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Forrskd
import extra.*;

public class VeletlenSzam {


static int random(int also, int felso) {
// a>b esetn a kt szm felcserlse:
if (also>felso) {
int seged=also; also=felso; felso=seged;
}
return (int)(Math.random()*(felso-also+1))+also;
}

public static void main(String[] args) {


final short DB = 1000;
long osszeg = 0;
for (int i=0; i<DB; i++)
osszeg += random(3,12);
System.out.println(osszeg/(float)DB); // pldul -> 7.541
}
}

Feladat Sinus
A Math osztlyban lev sin(double) fggvny paramterben radinban kri a
szget. rjunk egy olyan sin fggvnyt, amely a szget fokokban vrja!

Forrskd
public class Sinus {
static double sin(double fok) {
// 360 fok = 2PI radin, 1 fok = 2PI/360 radin
return Math.sin(fok * 2 * Math.PI / 360);
}
public static void main(String[] args) {
System.out.println(sin(90)); // -> 1.0
System.out.println(sin(60)); // -> 0.866 (3/2)
}
}

15.7. Hogyan tervezzk meg metdusainkat?

Amikor egy metdust (rutint, eljrst vagy fggvnyt) szeretne rni, sose a kdolssal
kezdje! Elszr gondolja t, mit is akar tulajdonkppen. Nagyon fontos, hogy a metduso-
kat knyelmesen hasznlhassuk, ezrt elszr azt prblgassa, hogyan szeretn meghvni.
Gondoljon arra, hogy J lenne, ha lenne egy ilyen metdus...
- Az els dolog, hogy megfogalmazzuk a metdus feladatt.
- Megvizsgljuk, hogy a metdust kifejezsben akarjuk-e hasznlni, vagy sem azaz
hogy fggvny legyen-e vagy eljrs. ltalban: ha igeknt (vagy igbl kpzett
fnvknt) termszetes a metdus hvsa, akkor a metdus eljrs lesz. Pldul olvas,
15. Metdusok rsa 15.7. Hogyan tervezzk meg metdusainkat? 293

olvass, talakt, setData; ha fnvknt vagy mellknvknt termszetes a hvs,


akkor a metdus fggvny lesz. Pldul sszeg, kiads. Mellknv esetn a fgg-
vny visszatrsi rtke valsznleg logikai, pldul pros, prim, szabad, hibs,
isNice.
- Vgiggondoljuk: van-e mr ilyen metdusunk esetleg egy msik osztlyban, amely az
adott krlmnyek kztt alkalmazhat. Ha megtalltuk, mr hasznlhatjuk is a met-
dust.
- Elgondolkodunk a metdus nevn: Utaljon feladatra! Legyen knnyen megjegyez-
het! Ha nem tudok j nevet vlasztani, akkor gyans: taln mg nem is tisztztam
pontosan, mit akarok.
- Aztn a paramterek kvetkeznek. Milyen paramtereket lenne knyelmes tadni a
metdusnak? Gondoljuk vgig az egyes paramtereket egyenknt: milyen tpus
rtkeket, vltozkat akarunk majd tadni? A formlis paramterek tpust gy kell
megvlasztani, hogy a formPar=aktPar; minden esetben rtkads szerint kompat-
bilis legyen! Vgl csoportostjuk a paramtereket, s azok szmra is kitallunk j
neveket. Ha fggvnyrl van sz, akkor meghatrozzuk a visszatrsi rtk tpust is.
- Megtervezzk a metdust! Ehhez megllaptjuk a szksges loklis adatokat, majd a
feladat bonyolultsgtl fggen fejben vagy pszeudokd, illetve tevkenysgdiagram
segtsgvel megtervezzk az algoritmust.
- Most jhet a metdus kdolsa s tesztelse. A forrskdot megjegyzsekkel ltjuk el,
hogy ksbb is eligazodjunk rajta. Ne feledkezznk meg a mdostk megadsrl!
- Ha a metdus ltalnos cl, akkor azt elraktrozzuk egy alkalmas osztlyban, hogy
ksbb is felhasznlhassuk.

Figyeljnk a kvetkezkre:
- Tartsuk be az adatok elrejtsnek elvt! Lehetsg szerint minden vltozt abban a
blokkban deklarljuk, amelyikben hasznljuk!
- Kerljk a redundancit! Ha lehet, semmit se rjunk le ktszer.
- Az eljrs, illetve fggvny ne vgezzen se tbbet, se kevesebbet, mint ami a fela-
datlersban szerepel. Ha pldul a fggvnynek az a feladata, hogy megllaptsa egy
szmrl, hogy az pozitv-e, vagy sem, akkor adjon vissza egy boolean rtket, de ne
rjon a kpernyre zenetet. A fggvny hasznlja valsznleg nem oda, nem olyan
nyelven s nem azt az zenetet akarja majd kirni!
294 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

Tesztkrdsek

15.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) Minden metdusnak van visszatrsi rtke.
b) Egy fggvnyt meg lehet hvni eljrsknt is.
c) A metdus fejben legalbb egy mdostt mindenkppen meg kell adni.
d) Minden metdus blokkjban ktelezen szerepelnie kell a return utastsnak.
15.2. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Futskor a formlis paramterek addnak t az aktulis paramtereknek.
b) A fggvny visszatrsi tpusa csak primitv tpus lehet.
c) Az osztly metdusainak deklarlsi sorrendje tetszleges.
d) static mdostval elltott metdusbl csak static mdostval elltott metdus
hvhat.
15.3. Mely kulcsszavak szerepelnek egy visszatrsi rtkkel nem rendelkez, a leszrmazott
osztlyban fellrhat, vdett pldnymetdus fejben? Jellje meg az sszes j vlaszt!
a) static
b) final
c) void
d) public
15.4. Jellje meg az sszes szintaktikailag helyes metdusfejet!
a) public static boolean ok(a int)
b) void kiir()
c) public menny_valahova()
d) public double pozicio(byte x, byte y)
15.5. Mit r ki a kvetkez programrszlet? Jellje meg az egyetlen j vlaszt!
static double div(int x, int y) {return x/y;}
...
System.out.println(div(15,4));

a) 3
b) 3.0
c) 3.75
d) Semmit, mert a metdus deklarcija szintaktikailag hibs.
15.6. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A formlis paramterlista elemeit pontosvesszvel vlasztjuk el egymstl.
b) Ha a metdusnak van egy int szam formlis paramtere, akkor a metdus blokkj-
ban nem vehet fel ilyen nev vltoz.
c) Fordtsi hibt eredmnyez, ha egy metdusnak, amelynek nem void a visszatrsi
tpusa, van return nlkli ga.
d) Az aktulis paramternek rtkads szerint kompatbilisnek kell lennie a formlis
paramterrel.
15. Metdusok rsa 15.7. Hogyan tervezzk meg metdusainkat? 295

15.7. Mi lesz az eredmnye a kvetkez program fordtsi s futtatsi ksrletnek? Jellje


meg az egyetlen j vlaszt!
public class Proba {
public static boolean met(int a,float b,int c) {
return a-b>c ;
}
public static void main(String[] args) {
System.out.println(met(5,6,4));
}
}
a) Fordtsi hiba, mert a metdus feje hibs.
b) Fordtsi hiba, mert a paramtertads helytelen.
c) Sikeresen lefut, s ezt rja ki: false
d) Sikeresen lefut, s ezt rja ki: true
15.8. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A metdust a neve egyrtelmen azonostja, fggetlenl a paramtereitl.
b) A main metdus hivatkozhat brmely ms metdus loklis vltozira.
c) Egy loklis vltoz a deklarls pontjtl az t deklarl blokk vgig l.
d) Egy loklis int tpus vltoz alaprtelmezs szerinti rtke 0.
15.9. Mi a helyes sorrendje a metdus rsakor a kvetkez tevkenysgeknek? Jellje meg
az egyetlen j vlaszt!
1) Meghatrozzuk a metdus nevt; 2) Meghatrozzuk a paramtereket; 3) Megtervez-
zk a metdust; 4) Megfogalmazzuk a metdus feladatt.
a) 1, 2, 3, 4
b) 4, 1, 2, 3
c) 3, 4, 1, 2
d) 4, 3, 1, 2
15.10. Mi lesz az eredmnye a kvetkez program fordtsi s futtatsi ksrletnek? Jellje
meg az egyetlen j vlaszt!
public class Szorzo {
static void szoroz(int mit,int mivel) {
mit = mit*mivel;
}
public static void main(String[] args) {
int a=5;
szoroz(a,7);
System.out.println(a);
}
}
a) Fordtsi hiba, mert a metdus feje hibs.
b) Futs sorn kivtel keletkezik, hibs paramtertads miatt.
c) Sikeresen lefut, s ezt rja ki: 5
d) Sikeresen lefut, s ezt rja ki: 35
296 IV. RSZ. JAVA PROGRAMOZSI ALAPOK

15.11. Mi lesz az eredmnye a kvetkez program fordtsi s futtatsi ksrletnek? Jellje


meg az egyetlen j vlaszt!
public class Oszto {
static double oszt(int mit,int mivel) {
if (mivel==0)
return;
return (double)mit/mivel;
}
public static void main(String[] args) {
int a=5, b=2;
System.out.println(oszt(a,b));
}
}
a) Sikeresen lefut, s ezt rja ki: 2.0
b) Sikeresen lefut, s ezt rja ki: 2.5
c) Fordtsi hiba, mert a metdus feje hibs.
d) Fordtsi hiba, mert a metdus nem ad vissza minden esetben rtket.

Feladatok

15.1. (A) rjon eljrst, amelynek


a) nincs paramtere, s 10-szer lerja, hogy "Ezentl mindig szpen strukturlom a
programomat."!
b) egy paramtere van, s 10-szer lerja a paramterben megadott szveget!
c) kt paramtere van, s a paramterben megadott szmszor lerja a szintn
paramterben megadott szveget!
A hrom eljrsnak ugyanaz legyen a neve! (SokszorKiir.java)
15.2. (A) rja meg a kvetkez eljrsokat (Eljarasok.java):
a) Konzolra rja a megadott rtkhatrok kztti pros szmokat!
b) Kir egy adott hosszsg, adott karakterekbl ll sort!
c) Egy adott szlessg s magassg tmr tglalapot rajzol konzolra a megadott
karakterekkel! Az egyes sorokat az elksztett metdus rja!
Pldul a teglalap(11,2,'@'); hvsnak eredmnye:
@@@@@@@@@@@
@@@@@@@@@@@

15.3. (A) rja meg a kvetkez fggvnyeket (Fuggvenyek.java):


a) Visszaadja egy szm ktszerest!
b) A kr sugarbl kiszmolja a kr terlett!
c) A gmb sugarbl kiszmolja a gmb trfogatt!
d) Megadja, hogy a megadott szm pozitv-e!
e) Megadja, hogy a paramterben megadott karakter benne van-e a szintn
paramterknt megadott tartomnyban!
A fggvny hvsa pldul: if benne('a','z',kar) ...
f) Visszaadja kt karakter kzl a kisebbiket!
Pldul a ch = min('a','A'); rtkads utn ch rtke 'A' lesz.
g) Megadja kt szm kztti sszes szm sszegt (a hatrokat is belertve)!
h) A cm-ben megadott hosszsgot inch-re alaktja!
15. Metdusok rsa 15.7. Hogyan tervezzk meg metdusainkat? 297

15.4. (B) Prblja megrni a Math.round(double) s a Math.round(float) fggvnye-


ket a Math.floor fggvny ismeretben! (Round.java)

15.5. (C) rja meg a kvetkez prmszmokkal kapcsolatos metdusokat:


a) Eldnti egy szmrl, hogy az prm-e!
b) Kap egy szmot, s kirja az sszes nla kisebb prmszmot! Minden prm el rjuk
ki, hogy hnyadik prm!
c) Kap egy szmot, s visszaadja, hogy hny nla kisebb prmszm van!
d) Kap egy szmot, s visszaadja az els nla nagyobb prmszmot!
(Primek.java)
298 IV. RSZ. JAVA PROGRAMOZSI ALAPOK
300 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE
16. Objektumok, karakterlncok, csomagolk 16.1. A fejezet osztlyainak rendszerezse 301

16. Objektumok, karakterlncok, csomagolk

A fejezet pontjai:
1. A fejezet osztlyainak rendszerezse
2. Primitv tpus referenciatpus
3. Objektum ltrehozsa, deklarlsa
4. rtkads az objektumok krben
5. Az objektum lete, automatikus szemtgyjts
6. String osztly
7. StringBuffer osztly
8. Objektum tadsa paramterknt
9. Primitv tpusok csomagolsa
10. StringTokenizer osztly

A fejezet egyrszt megismerteti az Olvast az objektumok ltrehozsnak s hasznlatnak


technikjval, msrszt bemutat nhny alapvet Java (API) osztlyt.

16.1. A fejezet osztlyainak rendszerezse


Az API mintegy 2000 osztlyt tartalmaz, amelyek csomagokba vannak szervezve. Egy prog-
ramoz ltalban ezen osztlyoknak csak igen kis hnyadval dolgozik. E knyvnek sem az a
clja, hogy minl tbb osztlyt hasznlatba vegyen, hanem felkszteni a programozt arra,
hogy a feladathoz szksges osztlyokat szksg esetn minl knnyebben megtallja, s
azokat hatkonyan felhasznlja. Vannak azonban az API-nak olyan alapvet osztlyai, amelye-
ket minden programoznak alaposan ismernie kell ezekbl mutatunk be most nhnyat. A
fejezetben trgyalt osztlyok a java.lang s a java.util csomagokban kaptak helyet a
16.1. bra ezen osztlyok rklsi hierarchijt s az osztlyokat tartalmaz csomagokat br-
zolja. UML-ben a csomagot fles tglalappal jelljk, a csomag nevt a flre rjuk. Egy
csomagban idegen (ms csomagban definilt) osztlyt is brzolhatunk, de ekkor az osztly
nevt minstennk kell az eredeti csomag nevvel (a csomag s az osztly neve kz dupla
kettspontot tesznk). Az Object osztlyt pldul a java.util csomagban gy kell azonos-
tanunk: java.lang::Object.
302 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

java::lang java::util

Object java::lang::Object

Boolean Character Number Math System String StringBuffer


StringTokenizer

Byte Short Integer Long Float Double

16.1. bra. A fejezetben trgyalt API osztlyok

Az Object osztly minden osztly se


A Javban minden osztly az Object osztlybl szrmazik. Mondhatjuk teht, hogy brmely
osztlybl ltrehozott pldny az egy objektum, gy azt minden olyan feladatra meg lehet
krni, amely mr az Object osztlyban is definilva van. Ahogy az a 16.1. brrl leolvashat,
az Object osztly a java.lang csomagban foglal helyet, a java.util csomagban mr
idegen osztlyknt szerepel (nevt sajt csomagjval minstettk: java.lang::Object). Az
Object osztly olyan metdusokat tartalmaz, amelyek a Java minden objektumra jellemzk
zeltknt felsorolunk nhnyat:
boolean equals(Object obj)
sszehasonltja a megszltott objektumot egy msik (a paramterben megadott)
objektummal. A visszaadott rtk true, ha a kt objektum egyenl. Ezt a metdust t
szoks rni az utd osztlyokban: meg lehet adni annak defincijt, hogy kt objektum
mikor egyenl. Az eredeti, Object.equals metdus akkor ad vissza igaz rtket, ha a
kt objektum referencija ugyanaz.
String toString()
Visszaadja az objektum szveges reprezentcijt. A metdust az utdokban fell
szoks rni. Ha nem rjk fell, a metdus visszaad egy szveget, amely az objektum
osztlyt s hastkdjt1 tartalmazza. A System.out.println(objektum) minden

1
hash code: egy objektumhoz rendelt szm, amely az objektum hasttblban val elhelyezshez kell.
16. Objektumok, karakterlncok, csomagolk 16.1. A fejezet osztlyainak rendszerezse 303

esetben az objektum.toString() metdus ltal visszaadott szveget rja ki a


konzolra. Pldul:
Object obj = new Object(); // obj:Object objektum ltrehozsa
System.out.println(obj); //->java.lang.Object@11b1
Class getClass()
Visszaadja az objektum osztlyt. Pldul:
String str = new String("babaruha");
System.out.println(str.getClass()); //->Class java.lang.String

Az Object osztly leszrmazottai


A java.lang csomagban kaptak helyet az n. csomagol osztlyok: Boolean, Character,
Byte, Short, Integer, Long, Float s Double. Ezek a megfelel primitv tpusokat csoma-
goljk osztlyokba, lehetv tve ezzel a primitv rtkek objektumknt val hasznlatt.
Ahogy a 16.1. brn lthat, a numerikus osztlyoknak van egy kzs absztrakt se, a Number.
Az absztrakt osztly csak rktsi clokat szolgl, abbl nem lehet pldnyt ltrehozni. Az
UML-ben az absztrakt osztlyt dlt betvel szedjk.

A java.lang csomagban lev Math s System nem rkthet (final) s nem pldnyost-
hat osztlyok (nincs publikus konstruktoruk), ezekben csupa statikus deklarci szerepel:
A Math osztly matematikai konstansokat s fggvnyeket definil. Ezt az osztlyt mr
a 12., Kifejezsek, rtkads fejezetben trgyaltuk.
A System osztlyban a rendszer mkdsvel kapcsolatos alapvet metdusok s
objektumok kaptak otthont. Itt van pldul a rendszer azonnali lellst eredmnyez
exit() metdus, s itt vannak az in s az out objektumok, amelyeket a konzolrl
trtn beolvasshoz, illetve az arra val kirshoz hasznlunk. Pldul:
if (szam<=0)
System.exit(0);
System.out.println("Ez egy pozitv szm");

A java.lang csomag String s StringBuffer osztlyai szvegek (karakterlncok) trol-


sra alkalmasak. A kt osztly kztti legnagyobb klnbsg az, hogy a String tpus objek-
tum llapota nem vltoztathat (egsz lete sorn ugyanaz a szveg van benne), szemben a
StringBuffer tpus objektummal, amelynek llapota vltoztathat, a benne lv szveg
manipullhat.

A java.util csomag StringTokenizer osztlya segtsgvel karakterlncot tudunk dara-


bolni: megadjuk az elvlasztjeleket, majd ennek alapjn sorban visszakaphatjuk a karakter-
lnc rszeit, pldul egy mondat szavait.
A karakterlnckezel, a csomagol s a karakterlncdarabol osztlyokat ebben a fejezetben
trgyaljuk.
304 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

16.2. Primitv tpus referenciatpus

A Javban ktfle tpus ltezik: primitv tpus s referencia tpus (16.2. bra):
- Primitv tpus: Egy primitv tpus vltoz azonostjval kzvetlenl hivatkozunk a
vltoz memriahelyre. Ezt a helyet a rendszer a deklarl utasts vgrehajtsakor
foglalja le. A Javban 8 elre definilt primitv tpus van: boolean, char, byte,
short, int, long, float s double. A programoz nem definilhat primitv tpust
(egy programban csak ez a 8 primitv tpus szerepelhet).
- Referenciatpus: A Javban a referencia tpus vltozk objektumokra mutatnak. Egy
referencia tpus vltoz azonostjval az objektum memriahelyre kzvetve hivat-
kozunk egy referencin (hivatkozson) keresztl.

A referencia tpus vltozk alkalmazsa egyszer, mert maga a hivatkozs rejtve marad.
Pldul:
double d=68.9;
Ember ember;
ember = new Ember("Erika",1953);
ember.megy();
System.out.println(ember);
ember = null;

primitv tpus vltoz referencia tpus vltoz

Ember(...)
d ember
nv="Erika"
68.9
szlv=1953

ember

null

16.2. bra. Primitv s referencia tpus vltozk

A null referencia

A null referencia tpus konstans, foglalt sz (16.2. bra). A null referencia rtke a
nulla cm, s azt fejezi ki, hogy nem mutat semmire. Arra val, hogy megklnbztessk
azoktl a referenciktl, amelyek egy adott objektumra hivatkoznak.
16. Objektumok, karakterlncok, csomagolk 16.3. Objektum ltrehozsa, deklarlsa 305

16.3. Objektum ltrehozsa, deklarlsa

new opertor, konstruktor

Egy osztly pldnyait a new (j) opertorral hozhatjuk ltre. A new utn meg kell
adni a ltrehozand objektum osztlyt, ezt a konstruktor aktulis paramterlistja kveti:
new <OsztlyAzonost>(<aktulis paramterlista>)
A new opertor feladatai:
- Ltrehoz egy j, OsztlyAzonost osztly objektumot; lefoglalja szmra a szk-
sges memrit;
- Meghvja az osztlynak azt a konstruktort, amelynek szignatrjra rhzhat az aktu-
lis paramterlista;
- Visszaadja az jdonslt objektum referencijt (azonostjt). Az objektum osztlya az
lesz, amit a new utn megadtunk.
A konstruktor belltja az objektum kezdeti llapott (kezdeti rtket ad az adatoknak s
az esetleges kapcsolatoknak). A konstruktor neve megegyezik az osztly nevvel. Egy
osztlynak tbb konstruktora is lehetsges.
Az objektum egsz lete sorn a new utn megadott osztlyhoz fog tartozni, osztlyt meg-
vltoztatni nem lehet.

Minden Java osztlyban szerepelnie kell legalbb egy konstruktornak. A konstruktort az osz-
tly ksztje rja meg, a felels a helyes konstrulsrt. Ha az osztly ksztje nem r
konstruktort, akkor egy alaprtelmezs szerinti, paramter nlkli, res konstruktor fut le. Ha a
konstruktort privtt tesszk, letilthatjuk az osztly pldnyostst. Ezt olyankor szoks
pldul alkalmazni, amikor az osztly csupa statikus metdussal rendelkezik.

Objektum deklarlsa

Minden referencia tpus vltozt (mint ahogyan a primitv tpusakat is) deklarlni kell!
Deklarlskor csak a referencia rszre kvetkezik be trfoglals:
<OsztlyAzonost> objektum;
Az objektum ltrehozsrl a programoznak kell gondoskodnia. A new opertor ltal
visszaadott referencia rtkl adhat a referencia tpus vltoznak:
objektum = new <OsztlyAzonost>(<aktulis paramterlista>);
vagy
<OsztlyAzonost> objektum =
new <OsztlyAzonost> (<aktulis paramterlista>);
Az objektumot a referencia tpus vltozn keresztl szlthatjuk meg:
objektum.metdus()
306 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

String

new String("Pirkadat")
+String(value: String) szveg : String
+toUpperCase(): String "Pirkadat" toUpperCase()
...

16.3. bra. Objektum ltrehozsa

Pldaknt hozzunk ltre egy String objektumot (16.3. bra)!

String szoveg; //1


szoveg = new String("Pirkadat"); //2
System.out.println(szoveg.toUpperCase()); //3 -> PIRKADAT
System.out.println(szoveg); //4 -> Pirkadat

//1-ben deklarltunk egy szoveg nev referencia tpus vltozt. A szoveg rtke egyelre
definilatlan, egy String objektumra mutat cmet fog majd tartalmazni. //2-ben ltrehozunk
egy String objektumot, melynek llapota "Pirkadat" lesz. A ltrehozott objektum mutatjt
rgtn rtkl adjuk a szoveg referencinak, amely a String tpus (osztly) objektumot
egyrtelmen azonostja. Az objektumra gy hivatkozunk: szoveg. Az objektumot //3-ban gy
szltjuk meg: szoveg.toUpperCase() ez egy fggvny, mely visszaadja a szveg nagy-
bets vltozatt. //4-ben kirjuk a szoveg objektum tartalmt.
Termszetesen megtehettk volna, hogy az objektumot rgtn, vagyis a deklarlskor hozzuk
ltre:
String szoveg = new String("Pirkadat");

Lthat teht, hogy a referencia tpus vltozval a hivatkozs kzvetett tulajdonkppen a


referencia ltal mutatott objektumot szltjuk meg. A kzvetettsget a programoz nem ltja, s
nem is szoktuk jellni az objektumdiagramokon. A Javban minden objektum automatikusan
referencia tpus vltoz.
16. Objektumok, karakterlncok, csomagolk 16.4. rtkads az objektumok krben 307

16.4. rtkads az objektumok krben

Objektumokat (referencia tpus vltozkat) rtkl adhatunk egymsnak ilyenkor maga


a hivatkozs msoldik t az egyik vltozbl a msikba: rtkads utn a kt vltoz
ugyanazt az objektumot azonostja.

Az obj2 referencia tpus vltoz rtkads szerint kompatbilis az obj1 referencia


tpus vltozval, vagyis obj2 rtkl adhat obj1-nek (obj1=obj2), ha
- obj1 s obj2 ugyanahhoz az osztlyhoz tartoznak, vagy
- az obj1 osztlya se az obj2 osztlynak.

Az obj1=obj2 rtkads utn obj1, akrmilyen objektumot azonostott is eddig, most


ugyanazt fogja azonostani, mint obj2. Ha obj2 nem azonostott mg objektumot, akkor for-
dtsi hiba keletkezik.
Az rtkads szablyt gy is megjegyezhetjk: Egy referencia csak abban az esetben mutathat
egy objektumra, ha a mutatott objektum legalbb olyan, mint . Kpzeljk el a kvetkez
szitucit: Az Ember osztly leszrmazottai a Hallgat s a Tanr osztlyok. Egy teremben
hallgatk s tanrok vannak. Ha mindenkihez akarok szlni, akkor csak mint emberekhez
beszlhetek, hiszen a tanroknak kldtt zeneteket a hallgatk nem rtik meg, s fordtva. A
kzs mutat tpusnak mindig meg kell keresni a legnagyobb kzs osztlyt, mert az abban
lev zeneteket mg mindenki megrti br ugyanazokat az zeneteket ki-ki a sajt mdjn
fogja rtelmezni (polimorfizmus). Ugyangy, mivel a String az egy Object, ezrt egy Object
mutat mutathat Stringre, de fordtva nem, mert az Object az nem String.

//1 :String
Object ember1 ember3
"Tmea"
//3
String :String //4
ember2 obj
//2
"Roland"

16.4. bra. Objektumok kztti rtkads

A kvetkez pldban rtkadsok sorozatval prbljuk rzkeltetni az objektumok kztti


rtkads szablyait. Az egyes utastsokat a 16.4. bra is rzkelteti.
308 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

String ember1 = new String("Tmea"); //1


String ember2 = new String("Roland"); //2
Object obj;
String ember3;
ember1 = ember2; //3
obj = ember1; //4
// ember1 = obj; Szintaktikai hiba! obj ltalnosabb!
// ember1 = ember3; Szintaktikai hiba! ember3-nak nincs rtke!

Az rtkadsok utn mr hrom hivatkozs is Rolandra mutat, Tmera pedig egy sem. Hacsak
nincs a programban egyb referencia, amely Tmera mutatna, Tmea megszlthatatlann
vlik, a klvilg szmra egyszeren elvsz.

Objektumok egyenlsgvizsglata

Objektumok llapott nem lehet a hasonlt opertorokkal (==, !=) sszehasonltani. Az


obj1==obj2 logikai kifejezs a kt objektum referencijt hasonltja ssze: azt adja meg,
hogy a kt referencia ugyanoda mutat-e, azaz a kt objektum fizikailag azonos-e! Ha a kt
objektum azonos, akkor termszetesen llapotuk is megegyezik, de kt nem azonos objek-
tumnak is lehet ugyanaz az llapota. Objektumok egyenlsgt az equals metdussal
szoks megllaptani.

Pldul:
String s1 = new String("Hell"), s2 = new String("Hell");
System.out.println((s1==s2)?"Azonosak":"Nem azonosak");
System.out.println((s1.equals(s2))?"Egyenlk":"Nem egyenlk");

A programrsz a kvetkez szvegeket jelenti meg:


Nem azonosak
Egyenlk

16.5. Az objektum lete, automatikus szemtgyjts

Minden egyes new opertor ltrehoz egy objektumot, amely termszetesen memriafoglalssal
jr. Amikor egy referencia tpus vltoz rtkt megvltoztatjuk, az addig hivatkozott objek-
tum mg tovbb l, foglalja a memrit! Ha nincs egyetlen olyan referencia sem, amely az
adott objektumot azonostan, az objektum a tovbbiakban elrhetetlenn, megszlthatatlann
vlik. Az ilyen objektumokat a rendszer figyeli, s idnknt kispri a memribl ezt a
folyamatot nevezzk automatikus szemtgyjtsnek. A Javban nincs lehetsg az objektumok
egyesvel trtn megszntetsre; az objektumok felszmolsa a rendszer dolga.
Tekintsk a kvetkez pldt, s kvessk nyomon a hivatkozsokat (16.5. bra):
String ember1, ember2=new String("Andrs"), ember3; //1
ember1 = new String("Gbor"); //2
ember1 = new String("Anik"); //3
16. Objektumok, karakterlncok, csomagolk 16.6. String osztly 309

ember2 = new String("Tams"); //4


ember2 = ember1; //5

:String //1 :String


//2 ember2
ember1
"Gbor" "Andrs"
//3
:String //5 :String
//4
ember3 "Anik" "Tams"

16.5. bra. Hivatkozsok nyomon kvetse

//1-ben hrom darab referencit deklarltunk, ezek kzl ember2 a szveg objektumra,
Andrsra mutat, ember1 s ember3 mg inicializlatlanok. //2-ben mr ember1 is egy ltez
objektumot azonost, Gborra mutat. //3-ban fellrtuk Gbor mutatjt ember1 most mr
Anikt azonostja. Ezzel Gbor elvsz, hiszen nem jegyeztk meg a mutatjt. //4-ben Andrs
vsz el, ember2 j azonostottja most mr Tams. Vgl //5-ben ember2-t tirnytjuk
ember1-re, gy Tams is az enyszet lesz, Anikra viszont ketten mutatnak. ember3 egylta-
ln nem kapott rtket e tevkenysgsorozatban. A kdrszletben teht sszesen 4 objektum
szletett, de az egszet mindssze Anik lte tl. A hrom firt alkalmasint jn a takartn,
s a szemtgyjts ldozatai lesznek. Hogy ez mikor kvetkezik be, az a programozt nem
rdekli egszen addig, amg van memria az j objektumok szmra. Ha fogytn a memria, a
takartn gyis akciba lp.

Automatikus szemtgyjts (garbage collection): A rendszer bizonyos idnknt automa-


tikusan felszabadtja a hivatkozs nlkli objektumok memriahelyeit.

16.6. String osztly

A String osztly olyan szveg (karakterlnc) trolsra szolgl, amelynek rtkt egsz
lete sorn nem akarjuk megvltoztatni. A String objektum szvege unikd karakterek
sorozata, a karakterek sorszmozottak: ha a lnc n karaktert tartalmaz, vagyis a lnc hossza
n, akkor a legels karakter sorszma (indexe) 0, az utols pedig n-1.

A 16.6. brn lthat "Ksz!" objektum egy 5 hossz szveg, a K bet indexe 0, az indexe
1, a ! karakter pedig 4.
310 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

0 1 2 3 4

K s z !

16.6. bra. Karakterlnc indexelse

A szveg elvileg olyan hossz lehet, amilyent mg az int tpus ki tud fejezni. A String
objektum llapota nem vltoztathat, vagyis a Ksz! mindig Ksz! marad, amg csak az
objektum l.

Ltrehozs a new opertorral s anlkl


Mint minden ms objektumot, a String objektumot is a new opertorral hozhatjuk ltre:
String szoveg = new String("Ez egy szvegobjektum");

A Java megengedi, hogy egy String objektumot ltrehozhassunk egy szveg literl rtkad-
sval is; ekkor a new feladatt a program automatikusan elvgzi:
String szoveg = "Ez is egy objektum, new nlkl";

Ez utbbi esetben a rendszer egy optimalizcit vgez el, miszerint a megegyez karakterln-
cokat a programban csak egyszer trolja, gy ezen szvegek referencii mind ugyanarra az
objektumra mutatnak. Mivel a szveget a program sorn gysem lehet megvltoztatni, a trols
mdjt a programoz szre sem veszi. Ha azt szeretnnk, hogy biztosan trtnjk trfoglals,
akkor a new opertort kell hasznlnunk!

A String osztly metdusai

A String osztly fknt olyan pldnymetdusokat (csak fggvnyeket) deklarl,


amelyek a trolt karakterlnctl fggen egy j karakterlncot vagy informcit adnak
vissza:
- a szveg hosszt;
- a szveg kisbets, illetve nagybets vltozatt;
- egy msik szveggel val konkatenlst (sszeadst);
- ms karakterlnccal val sszehasonlts eredmnyt;
- adott pozcin lev karaktert, illetve rszlnct;
- egy adott karakter, illetve rszlnc indext;
- stb.
E fggvnyek mindegyike az objektum tartalmt vltozatlanul hagyva egy j String tpus
objektumot llt ssze, s ennek az j objektumnak a referencijt adja vissza.
16. Objektumok, karakterlncok, csomagolk 16.6. String osztly 311

A String osztlyban vannak ezenkvl olyan statikus metdusok, amelyekkel klnbz


primitv rtkek, illetve objektumok karakterlnc-vltozatait kaphatjuk meg.

Az egyes metdusok a kvetkez kivteleket dobhatjk:


StringIndexOutOfBoundsException: Ez akkor kvetkezik be, ha a paramterben
megadott index a szvegen kvlre mutat.
NullPointerException: Ez akkor kvetkezik be, ha a paramterben megadott
objektum referencia a null.
A String osztly lnyegesebb, publikus konstruktorait, metdusait a 16.7. bra mutatja. Az
osztlyban elszr szerepelnek a konstruktorok, majd bc rendben az egyb metdusok. A
metdusokat logikai csoportokba foglalva trgyaljuk gy, hogy kzben egy-egy pldt is
bemutatunk.

String

String()
String(value: String)
String(buffer: StringBuffer)
charAt(index: int): char
compareTo(o: Object): int
compareTo(str: String): int
compareToIgnoreCase(str: String): int
concat(str: String): String
equals(anObject: Object): boolean
equalsIgnoreCase(anotherString: String): boolean
indexOf(ch: int): int
indexOf(ch: int, fromIndex: int): int
indexOf(str: String): int
indexOf(str: String, fromIndex: int): int
length(): int
replace(oldChar: char, newChar: char): String
valueOf(value: Type): String
valueOf(value : type): String
substring(beginIndex: int): String
substring(beginIndex: int, endIndex: int): String
toLowerCase(): String
toUpperCase(): String
toString(): String
trim(): String

16.7. bra. String osztly


312 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

Konstruktorok
String()
A ltrehozott objektum az res karakterlncot reprezentlja, illetve tartalmazza.
String(String value)
String(StringBuffer buffer)
A ltrehozott objektum a paramterben megadott szveget tartalmazza. A
StringBuffer osztlyrl a kvetkez pontban lesz sz. Pldul:
String szoveg = new String("Vltoztathatatlan szveg!");

Hossz, index
int length()
Visszaadja a szveg hosszt. Pldul:
String str = "Baromfi";
int szam = str.length(); // -> szam==7
char charAt(int index)
Visszaadja az index index karaktert. Pldul:
String str = "Baromfi";
char ch = str.charAt(1); // -> ch=='a'

Manipullt karakterlncok
String toLowerCase()
Visszaad egy objektumot, amely az objektum szvegnek csupa kisbets vltozata.
String toUpperCase()
Visszaad egy objektumot, amely az objektum szvegnek csupa nagybets vltozata.
String toString()
Visszaadja sajt magnak a msolatt.
String trim()
Visszaad egy szveget, amelynek elejrl s vgrl kitrlte a fehr szkzket.
String replace(char oldChar, char newChar)
A metdus visszaad egy karakterlnc-objektumot, melyben minden oldChar karaktert
newChar-ra cserlt. Pldul:
String str1 = "Szip iz icipici niji cipi", str2;
str2=str1.replace('i','a'); //str2=="Szap az acapaca naja capa"
String substring(int beginIndex)
Visszaadja az objektum rszlnct beginIndex-tl kezdve vgig. (A substring-ben
a kzps s kisbet!) Pldul:
0123456
String str = "Tehnke";
System.out.println(str.substring(3)); // -> "nke"
String substring(int beginIndex, int endIndex)
Visszaadja az objektum rszlnct beginIndex-tl endIndex-1-ig. endIndex mr
nem tartozik bele a rszlncba, gy a rszlnc hossza endIndex-beginIndex. Pldul:
0123456
String str = "Tehnke";
System.out.println(str.substring(3,5)); // -> "n"
16. Objektumok, karakterlncok, csomagolk 16.6. String osztly 313

Feladat StringTeszt
Krjnk be terminlrl egy szveget, majd:
1) rjuk ki fordtva!
2) rjuk ki csupa nagybetvel, aztn csupa kisbetvel!
3) rjuk ki az els 9 karaktert s az utols 3 karaktert!
4) Cserljk ki az sszes szkzt ktjelre!

Forrskd
import extra.*;
public class StringTeszt {
public static void main(String[] args) {
String szoveg = Console.readLine("Szveg: ");
// Kirs fordtva //1
for (int i=szoveg.length()-1; i>=0; i--)
System.out.print(szoveg.charAt(i));
System.out.println();
// Nagybets, majd kisbets formk //2
System.out.println(szoveg.toUpperCase());
System.out.println(szoveg.toLowerCase());
// Els 9 s utols 3 karakter kirsa //3
if (szoveg.length()>=9) // egybknt futsi hiba lenne
System.out.println(szoveg.substring(0,9));
if (szoveg.length()>=3) // egybknt futsi hiba lenne
System.out.println(szoveg.substring(szoveg.length()-3));
// Az sszes pont kicserlse ktjelre //4
System.out.println(szoveg.replace('.','-'));
}
}

A program egy lehetsges futsa


Szveg: Bolond Istok
kotsI dnoloB
BOLOND ISTOK
bolond istok
Bolond Is
tok
Bolond-Istok

A program elemzse

A szvegnek a Console.readLine() metdussal adunk rtket: a readLine() a konzolrl


bekr egy szveget, ennek alapjn sszellt egy String objektumot, majd visszaadja ennek
az objektumnak a referencijt. //1-ben a for ciklus i ciklusvltozja visszafel halad: a szveg
karaktereit sorban kiolvassuk visszafel a charAt(i) segtsgvel, s kirjuk ket a konzolra.
//2-ben kirjuk a szveg nagybets s kisbets formit. //3-ban az els 9 karakter kirsakor
amennyiben a bevitt szveg 9-nl rvidebb, nem runk ki semmit. Megtehettk volna, hogy egy
zenet ksretben kirjuk a 9-nl rvidebb szveget. Ugyanez vonatkozik az utols 3 karakter
kirsra is: ha a szveg nincs legalbb 3 karakternyi, nem runk ki semmit. Figyelje meg, hogy
314 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

az eredeti szoveg objektum mindvgig megmarad, az egyes fggvnyek minden esetben egy
j objektumot ksztenek!

Egyenlsgvizsglat, hasonlts
boolean equals(Object anObject)
sszehasonltja az objektumot a paramterknt megadott msik objektummal. A vissza-
adott rtk true, ha a paramterben megadott objektum osztlya String, s a szve-
gek karakterei rendre megegyeznek.
boolean equalsIgnoreCase(String str)
sszehasonltja az objektumot a paramterknt megadott msik String objektummal.
A visszaadott rtk true, ha a kt szveg karakterei rendre megegyeznek gy, hogy a
nagy- s kisbetk kztt nincs klnbsg.
int compareTo(Object o)
int compareTo(String str)
int compareToIgnoreCase(String str)
sszehasonltjk az objektumot a paramterknt megadott msik String objektummal.
A harmadik esetben a kis- s nagybetk kzt nem tesz klnbsget. A visszaadott rtk
0, ha a kt szveg egyenl; negatv, ha a szveg lexikogrfikusan kisebb, mint a para-
mter szvege; s pozitv, ha a szveg nagyobb, mint a paramter szvege.

Vigyzat! Az == opertor nem az egyenlsget, hanem az azonossgot vizsglja!

Feladat Legels
Krjnk be terminlrl szavakat "*" vgjelig. Csak az a sz szmt a feldolgozsban,
amelyik nem tartalmaz szkzt, s nem res. Vgl rjuk ki a bevitt szavak kzl az
bcben els helyen llt!

Forrskd
import extra.*;
public class LegElso {
public static void main(String[] args) {
// A bevitt szavak ennl biztosan kisebbek lesznek:
final String NAGY = "\uffff";
String szo, elso = NAGY;
while (!(szo=Console.readLine("Sz: ")).equals("*")) {
// Nem j, ha van benne szkz vagy res:
if (szo.indexOf(" ")>=0 || szo.length()==0)
System.out.println("Van benne szkoz, vagy res!");
else if (szo.compareTo(elso)<0) // szo < elso
elso = szo;
}
if (elso.equals(NAGY))
System.out.println("Nem volt j sz bevitel!");
else
System.out.println("ABC szerint az els: "+elso);
}
}
16. Objektumok, karakterlncok, csomagolk 16.6. String osztly 315

A program egy lehetsges futsa


Sz: durung
Sz: hegyes bot
Van benne szkoz, vagy res!
Sz: Uborka
Sz: *
ABC szerint az els: Uborka

A program elemzse
A feladatban a minimumkivlaszts algoritmust alkalmazzuk. Kezdetben az bcben legels
sznak egy olyan NAGY szt adunk, amelyiknl az bcben biztosan kisebb minden bevitt sz.
A szavakat a while ciklus fejben krjk be, rtkl adjuk a szo vltoznak, s azonnal meg-
vizsgljuk, hogy rtke a * vgjel-e: ha igen, kilpnk a ciklusbl, ha nem, akkor amennyiben
a sz leglis (nincs benne szkz, s nem res), megnzzk, hogy az eddigi els szt meg-
elzi-e. Ha igen, lesz a pillanatnyi els. Vgl kirjuk az bc szerinti els szt, feltve,
hogy vittek be egyltaln elfogadhat szt. Megjegyezzk, hogy a nagybetk unikdjai elrbb
tallhatk a kdtblban, mint a kisbetki ezrt van elbb az Uborka, mint a durung.

Keressek
int indexOf(int ch)
int indexOf(int ch, int fromIndex)
int indexOf(String str)
int indexOf(String str, int fromIndex)
E ngy metdussal karaktert (ch) vagy rszlncot (str) kereshetnk a szvegben, ell-
rl vagy egy adott indextl (fromIndex) kezdve. A visszaadott egsz rtk a szveg
azon indexe, ahol a keresend elemet a metdus elszr tallta meg. Ha nincs ilyen
elem, akkor a visszaadott rtk -1. Megjegyzend, hogy a karakter tpusa int, gy a
karaktert szm formban is megadhatjuk. Pldul:
String str = "KATONA";
System.out.println(str.indexOf('A')); // -> 1
System.out.println(str.indexOf(65)); // -> 1
System.out.println(str.indexOf('A',2)); // -> 5

Megjegyzs: A lastIndexOf metdusok a karakterlncban visszafel keresnek.

Konkatenci
String concat(String str)
A metdus az objektum karakterlnchoz hozzrja a paramterben megadott karakter-
lncot, s ez lesz a metdus visszatrsi rtke. Kt String objektumot a + opertorral
is ssze lehet adni. A keletkezett j objektum szvege az operandusok konkatencija.
A kvetkez kt utasts ekvivalens egymssal:
str = str1+str2;
str = str1.concat(str2);
316 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

Karakterlncformk
static String valueOf(<Type> value)
static String valueOf(<type> value)
Type egy tetszleges osztlyt, type egy tetszleges primitv tpust jell. A statikus
metdusok visszaadjk value karakterlncformjt. Ha a paramter objektum, akkor az
objektum osztlynak toString() metdusa hatrozza meg a visszaadott rtket;
primitv tpus paramter esetn a megfelel csomagol osztly toString() metdusa
a mrvad (a csomagol osztlyokrl mg ebben a fejezetben sz lesz). Pldul:
String dStr = String.valueOf(4.519);
String iStr = String.valueOf(71);
System.out.println(dStr+" "+iStr); // -> "4.519 71"

Feladat TizedespontCsere
Krjnk be egy vals szmot. A szmot gy rjuk ki a konzolra, hogy a tizedespont
helyn tizedesvessz jelenjk meg!

Forrskd
import extra.*;
public class TizedespontCsere {
public static void main(String[] args) {
double szam = Console.readDouble("Vals szm: "); //1
String szamSt = String.valueOf(szam); //2
System.out.println(szamSt.replace('.',',')); //3
}
}

A program egy lehetsges futsa


Vals szm: 34.981
34,981

A program elemzse

//1-ben bekrnk egy double tpus szmot. //2-ben ezt a szmot karakterlncc alaktjuk,
mert a manipulcit csak szvegen tudjuk elvgezni. //3-ban a szveg sszes pont karaktert
vesszre cserljk (mi tudjuk, hogy a szvegben a pontok szma csak 0 vagy 1 lehet).

16.7. StringBuffer osztly

A String osztly nem alkalmas arra, hogy egy karakterlncot megvltoztassunk, azon
bonyolultabb mveleteket hajtsunk vgre. Egy String objektumbl nem tudunk egyetlen
karaktert sem kitrlni vagy megvltoztatni, s nem tudunk egyetlen karaktert sem beszrni.

A String osztllyal ellenttben a StringBuffer osztly szvege manipullhat. Elvgez-


hetk pldul a kvetkez mveletek:
16. Objektumok, karakterlncok, csomagolk 16.7. StringBuffer osztly 317

- karakter, szveg, valamint primitv tpus adatok hozzadsa a szveghez;


- karakter, szveg, valamint primitv tpus adatok beszrsa a szvegbe;
- adott pozcij karakter, illetve rszlnc trlse;
- stb.
A StringBuffer ltal tartalmazott szveg aktulis hossza futs kzben vltozhat. A
StringBuffer objektumnak van
- kapacitsa (capacity), ez azt jelenti, hogy milyen hossz szveg trolsra van felk-
szlve. Az objektum kapacitst az egyes mveletek automatikusan lltjk, de a prog-
ramoznak is lehetsge van a kapacits megvltoztatsra hatkonysgi clokbl.
- aktulis hossza (length), vagyis az ppen trolt szveg hossza.

A StringBuffer osztly metdusait fleg eljrsknt szoks meghvni, de a metdusok


mintegy extra szolgltatsknt visszaadjk a megvltoztatott objektum referencijt.
A String s StringBuffer osztlyok nincsenek rklsi viszonyban egymssal.

A StringBuffer osztly lnyegesebb, publikus konstruktorait, metdusait a 16.8. bra


mutatja.

StringBuffer

StringBuffer()
StringBuffer(length: int)
StringBuffer(str: String)
append (value: <Type>): StringBuffer
append (value: <type>): StringBuffer
capacity():int
charAt(index: int): char
delete(start: int, end: int): StringBuffer
deleteCharAt(index: int): StringBuffer
ensureCapacity(minimumCapacity: int)
insert (offset: int, value: <Type>): StringBuffer
insert (offset: int, value: <type> value): StringBuffer
length():int
replace(start: int, end: int, str: String): StringBuffer
reverse(): StringBuffer
setCharAt(index: int, ch: char)
setLength(newLength: int)
substring(start: int): String
substring(start: int, end: int): String
toString(): String

16.8. bra. StringBuffer osztly


318 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

Konstruktorok
StringBuffer()
A ltrehozott objektum az res karakterlncot tartalmazza, kezdeti kapacitsa 16 karak-
ter.
StringBuffer(int length)
A ltrehozott objektum az res karakterlncot tartalmazza, kezdeti kapacitsa length
karakter.
StringBuffer(String str)
A ltrehozott objektum a paramterben megadott szveget tartalmazza. Kezdeti kapaci-
tsa a lnc hossza + 16 karakter. Pldul:
StringBuffer szoveg = new StringBuffer("Do re mi");

Vigyzat! A StringBuffer szoveg = "Kezdeti rtk"; szintaktikailag hibs. A


jobb oldal String tpus, ez rtkads szerint nem kompatbilis a StringBuffer
tpussal.

Kapacits, hossz, index


int capacity()
Megadja az aktulis kapacitst. Ennyi karakter fr az objektumba.
int length()
Megadja a szveg aktulis hosszt.
void ensureCapacity(int minimumCapacity)
Bvti az aktulis kapacitst. Az egyes metdusok a kapacitst szksg szerint automa-
tikusan bvtik. A programoz ezzel a metdussal elre meghatrozhatja a kapacitst a
hatkonysg rdekben. Az j kapacits a minimumCapacity s a 2*capacity()+2
kzl a nagyobbik lesz.
void setLength(int newLength)
A hossz mdostsa. Ha newLength kisebb, mint az aktulis hossz, akkor a metdus
levgja a szveget, ha nagyobb, akkor feltlti a \u0000 karakterekkel. Szksg esetn
nveli a kapacitst. A szveg hossza newLength lesz. (A nulla karakterek a konzolon
nem ltszdnak.)
char charAt(int index)
Visszaadja az index index karaktert.

Bvts
StringBuffer append (<Type> value)
StringBuffer append (<type> value)
Sok tlterhelt metdusrl van sz: a Type egy osztly, a type pedig egy tetszleges
primitv tpus. Minden esetben a value karakterlnc vltozata addik hozz a szveg
vghez. A karakterlnc vltozatot az osztly, illetve primitv tpus esetn a csomagol
16. Objektumok, karakterlncok, csomagolk 16.7. StringBuffer osztly 319

osztly toString() metdusa hatrozza meg. A visszatrsi rtk a megvltoztatott


szveg. Pldul:
StringBuffer szoveg = new StringBuffer("Szm=");
float f = 34.6f;
szoveg.append(f);
szoveg.append("*");
System.out.println(szoveg); // Szam=34.6*
StringBuffer insert (int offset,<Type> value)
StringBuffer insert (int offset,<type> value)
Hasonlkppen mkdik, mint az append metdus, azzal a klnbsggel, hogy a
value-bl talaktott karakterlncot nem a szveg vgre helyezi, hanem beszrja a
megadott offset pozcitl kezdden. A visszatrsi rtk a megvltoztatott szveg.
Pldul:
StringBuffer szoveg = new StringBuffer("Osszesen Ft");
float f = 34.6f;
szoveg.insert(9,f);
System.out.println(szoveg); // "Osszesen 34.6 Ft"

Trls
StringBuffer deleteCharAt(int index)
Az adott index karakter trlse a szvegbl. A szveg aktulis hossza eggyel cskken.
A visszatrsi rtk a megvltoztatott szveg.
StringBuffer delete(int start, int end)
Rszlnc trlse a szvegbl. Az els trlend karakter indexe start, az utols
end-1. A szveg hossza end-start rtkkel cskken. A visszatrsi rtk a megvl-
toztatott szveg. Pldul:
StringBuffer szoveg = new StringBuffer("Bolha");
szoveg.delete(2,4);
System.out.println(szoveg); // Boa
szoveg.deleteCharAt(0);
System.out.println(szoveg); // oa

Egyb
StringBuffer replace(int start, int end, String str)
A start s end-1 kztti (end mr marad) rszlncot kicserli str-re. A visszatrsi
rtk a megvltoztatott szveg.
StringBuffer reverse()
Megfordtja az objektum szvegt. A visszatrsi rtk a megvltoztatott szveg.
320 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

String substring(int start, int end)


String substring(int start)
Visszaad egy j String objektumot, amely a StringBuffer objektum start s end
kztti rszlnca (az utols visszaadott karakter pozcija end-1). A msodik esetben
end=length(). Az eredeti objektum vltozatlan marad.
String toString()
Visszaadja az objektum szvegt String formban.

A szveget megvltoztat metdusok tbbsgnek van egy StringBuffer tpus visszatrsi


rtke. A visszaadott objektum maga a megvltoztatott szveg, amelyet termszetesen nem
fontos felhasznlnunk. Emlkezznk vissza arra, hogy brmely fggvny hvhat eljrsknt is
ekkor a visszatrsi rtk egyszeren nem kerl felhasznlsra. A String osztly metdusait
nincs rtelme eljrsknt hvni, mivel ezek nem vltoztatjk meg az objektumot, kvetkezs-
kppen csak a visszatrsi rtk lehet rdekes szmunkra. A StringBuffer osztly metdu-
sait azonban a legtbb esetben eljrsknt fogjuk meghvni. A kvetkez pldt a 16.9. bra
szemllteti:
StringBuffer hegy1 = new StringBuffer("Machu"); //1
StringBuffer hegy2 = hegy1.append(" Picchu"); //2
hegy2.insert(0,"Ez is "); //3
System.out.println("Hegy1="+hegy1);
System.out.println("Hegy2="+hegy2);

//1 //2
:StringBuffer hegy1
hegy1 :StringBuffer
"Machu"
"Machu Picchu"
hegy2

//3
hegy1
:StringBuffer
"Ez is Machu Picchu"
hegy2

16.9. bra. A StringBuffer vltozsnak nyomonkvetse

//1-ben ltrehozzuk a hegy1 objektumot, melynek tartalma "Machu". //2-ben a hegy1 objek-
tumhoz az append metdussal hozzfzzk a " Picchu" szveget, s a megvltoztatott
szveget adjuk rtkl a hegy2 objektumnak. hegy1 s hegy2 teht ugyanazt a "Machu
Picchu" tartalm objektumot azonostjk. //3-ban a hegy2 objektumba beszrjuk az
16. Objektumok, karakterlncok, csomagolk 16.7. StringBuffer osztly 321

"Ez is " szveget, ami termszetesen hegy1-et is rinti. Vgeredmnykppen teht hegy1
s hegy2 ugyanaz az objektum, s rtkk "Ez is Machu Picchu".

Sajnos a String s a StringBuffer osztlyok rtkads szerint nem kompatbilis tpusok.


Van ugyan egy kzs sk, az Object, de ezen kvl semmi kzk sincs egymshoz. Egyik
sem rkldik a msikbl, s nehezti a hasznlatot, hogy a gyakran hasznlatos metdusok
egy rsze (mint a keress) a String osztlyban, ms rsze (mint a trls s a beszrs) a
StringBuffer osztlyban kapott helyet. A kvetkez feladatban pldul a cl rdekben a
szveget ide-oda kell alaktgatnunk:

Feladat Csere
Krjnk be egy szveget, majd cserljk ki az sszes & jelet az and szra!

Forrskd
import extra.*;
public class Csere {

public static void main(String[] args) {


StringBuffer szoveg =
new StringBuffer(Console.readLine("Szveg: ")); //1
int poz = szoveg.toString().indexOf('&'); //2
while (poz!=-1) {
szoveg.replace(poz,poz+1,"and"); //3
poz = szoveg.toString().indexOf('&'); //4
}
System.out.println(szoveg); //5
}
}

A program egy lehetsges futsa


Szveg: O & te & en
O and te and en

A program elemzse

A feladatot gy tudjuk megoldani, hogy rkeresnk az sszes & jelre, majd azokat egyenknt
kicserljk az and szra. Ezt a csert csak a StringBufferben tudjuk megoldani, ezrt
//1-ben a beolvasott szveget egy StringBufferben helyezzk el. A Console.readLine()
metdus egy Stringet ad vissza, azt nem tehetjk t kzvetlen rtkadssal a
StringBufferbe, csak konstruktoron keresztl. A beolvasott szvegben most keresnnk kell.
Mivel a StringBufferben nincs erre alkalmas metdus, a szveget //2-ben ideiglenesen
talaktjuk Stringg a StringBuffer.toString() metdussal. A metdus visszatrsi
rtkben vgezzk el a keresst. Miutn megtalltuk az & pozijt (poz), visszatrnk a
StringBufferhez, hogy elvgezhessk a csert (//3-ban kicserljk a poz. karaktert az
"and" lncra). Ezutn jra keresnk (//4), s ezt a mveletsorozatot addig folytatjuk, amg van
322 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

& jel. Ha mr nincs (poz=-1), akkor kirjuk a StringBuffer tartalmt (//6). A print met-
dus brmit ki tud rni.

Vigyzat! A megolds nem mkdik brmilyen cservel! Prblja ki pldul gy, hogy az
& jelet &&-re cserli! Mi trtnik? A program vgtelen ciklusba fog esni. Mi a feladat lta-
lnosabb megoldsa? Lsd a 16.5. feladatot!

Megjegyzs: A feladat megoldhat csak String tpus objektumok segtsgvel is, de ebben
az esetben rengeteg szemt keletkezik.

16.8. Objektum tadsa paramterknt

Egy referencia tpus vltoz (objektum) akkor adhat t aktulis paramterknt egy refe-
rencia tpus formlis paramternek, ha az aktulis paramter rtkads szerint kompa-
tbilis a formlis paramterrel. A metdus megkapja az objektum referencijt. A met-
dus a mutatott objektumot megvltoztathatja, de nem vltoztathatja meg az eredeti mutatt.

Objektum paramterknt val tadsakor nem az egsz objektum msoldik t, hanem csak a
referencia. A formlis s aktulis paramterek teht a metdusba val belpskor ugyanarra az
objektumra mutatnak, s az tmsolt referencival elvileg ppgy meg tudjuk vltoztatni az
objektumot, mint az eredetivel. Megtehetjk, hogy a formlis paramter rtkt a metdus
futsa kzben megvltoztatjuk (tirnytjuk egy msik objektumra), de ettl az eredeti objek-
tum rintetlen marad. Nzznk erre kt pldt!

Feladat Objektum paramter


rjunk eljrst, amely a paramterknt megkapott szveget szthzza, vagyis karak-
terei kz beszr egy-egy szkzt!

Forrskd
import extra.*;

public class ObjektumParameter {

static void szethuz(StringBuffer str) {


for (int i=str.length()-1; i>0; i--)
str.insert(i,' ');
str = null; // csak demonstrcis cl utasts
}

public static void main(String[] args) {


StringBuffer sb = new StringBuffer("Peace");
szethuz(sb);
System.out.println("*"+sb+"*"); // -> "*P e a c e*"
}
}
16. Objektumok, karakterlncok, csomagolk 16.8. Objektum tadsa paramterknt 323

A program elemzse

A main metdusban sb egy StringBuffer objektumot azonost. sb-t paramterknt tadjuk a


szethuz metdusnak, ott teht str is ugyanezt az objektumot azonostja. A metdusban az
str ltal mutatott objektumot megvltoztatjuk (rtke peace helyett p e a c e lesz), de ez
ugyanaz az objektum, mint amelyet a main metdusban sb azonost. A metdus vgn str
rtkt null-ra lltjuk, ez azonban nem befolysolja az sb ltal mutatott objektumot. Az
aktulis s formlis objektum paramter viselkedst a 16.10. bra mutatja: a metdusba val
belpskor sb s str ugyanazt az objektumot azonostja, str ezt a kzs objektumot vltoz-
tatja meg. A metdusbl val kilps eltt str-nek rtkl adjuk a null referencit, de ettl
mg sb tovbbra is a megvltoztatott objektumot azonostja. A metdusbl val kilpskor
str elvsz.

A metdusba val belpskor: A metdusbl val kilps eltt:

null

str str
:StringBuffer :StringBuffer

"Peace" "P e a c e"


sb sb

16.10. bra. Az objektum paramter viselkedse

Feladat Palindrma
Krjnk be mondatokat az res mondat vgjelig! llaptsuk meg minden egyes mon-
datrl, hogy az palindrma-e, azaz a szveg visszafel olvasva ugyanaz-e!
Felttelezzk, hogy a mondatban nincsenek rsjelek, s a vizsglatot tegyk fg-
getlenn a szkzktl s a kis/nagybetktl!

A feladat nagyvonal terve


in: szveg
while szveg != "" Palindroma
szkzk kivtele a szvegbl
nagybetre alakts
palindrma vizsglat kivesz(str:String, kar:char): String
eredmny kirsa palindroma(szoveg:String): boolean
in: szveg +main(...)
end while
324 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

A szkzk kivtelre rjunk egy ltalnosan is hasznlhat kivesz() fggvnyt, mely a


paramterknt megkapott szvegbl kiveszi az sszes paramterknt megkapott karaktert! A
szveg nagybetre alaktsra van a String osztlyban egy metdus, a toUpperCase(). A
palindrma vizsglatra rjunk egy palindroma() fggvnyt, amely brmely szvegrl meg-
llaptja, hogy az palindrma-e! Nzzk a programot:

Forrskd
import extra.*;
public class Palindroma {

// str-bl az sszes kar trlse:


static String kivesz(String str,char kar) {
StringBuffer sb = new StringBuffer(str);
int p;
while ((p=sb.toString().indexOf(kar)) != -1)
sb.deleteCharAt(p) ;
return sb.toString();
}

// true, ha a szoveg palindrma:


static boolean palindroma(String szoveg) {
szoveg = kivesz(szoveg,' ').toUpperCase();
StringBuffer sb = new StringBuffer(szoveg);
return szoveg.equals(sb.reverse().toString());
}

public static void main (String args[]) {


// Szvegek beolvassa s feldolgozsa:
String szoveg;
while (!(szoveg=Console.readLine("Szveg: ")).equals("")){
// Palindrma vizsglat:
if (palindroma(szoveg))
System.out.println("Palindrma");
else
System.out.println("Nem palindrma");
}
}
}

A program egy lehetsges futsa


Szveg: Kuka
Nem palindrma
Szveg: Gza kk az g
Palindrma
Szveg:

A program elemzse

A kivesz() metdusnak kt paramtere van: az str -ben tallhat kar karaktereket kiveszi,
s ez lesz a metdus visszatrsi rtke. A karakterek kivtelhez a szveget egy
16. Objektumok, karakterlncok, csomagolk 16.9. Primitv tpusok csomagolsa 325

sb:StringBuffer objektumba tesszk. Ahhoz, hogy megvizsgljuk, van-e a szvegben kar


karakter, talaktjuk a szveget Stringg, mert csak a String osztlyban van indexOf()
fggvny, s amelyik pozcin talltunk kar karaktert, azt a pozcij karaktert kivesszk az
sb objektumbl. Ezt addig ismteljk, amg az sb-ben mg van a krdses karakterbl. Vgl
sb-t talaktjuk Stringg, s ez lesz a fggvny visszatrsi rtke.

16.9. Primitv tpusok csomagolsa

A primitv tpus vltozk nem objektumok. Annak rdekben, hogy a primitv tpus
adatokat objektumokknt kezelhessk, a java.lang csomag n. csomagol osztlyokat
(wrapper classes) definil: minden primitv tpushoz tartozik egy osztly, mely a megfelel
tpust becsomagolja. Ennek megfelelen a csomagol osztlyok a kvetkezk:
Character, Boolean, Byte, Short, Integer, Long, Float, Double

A Character s a Boolean osztlyok kzvetlenl az Object-bl szrmaznak, a tbbi hat


numerikus osztlynak van egy kzs se, az absztrakt Number osztly. A csomagol osz-
tlyok pldnyai vltoztathatatlanok, vagyis llapotuk letk vgig az marad, amit inicia-
lizlskor megadtunk.
A csomagol osztlyok segtsgvel lehetsgnk van arra, hogy
- a primitv tpus vltozkat objektumokknt hasznljuk;
- a megfelel primitv tpusokkal kapcsolatban informcit krjnk.

A csomagol osztlyokban nagyon sok a hasonl elven mkd metdus, ezrt azokat nem
osztlyonknt, hanem mkds szerint csoportostva trgyaljuk. Az egyes metdusok lersai
osztlyonknt megtallhatk az API dokumentciiban.
Az sszes numerikus csomagol osztlyra vonatkozik, hogy ha egy metdusban egy szveg
nem alakthat t a megfelel primitv szmm, akkor NumberFormatException kivtel
keletkezik.

Konstruktorok
<Type> (<type> value)
Itt Type brmelyik csomagol osztly lehet. Minden csomagol osztlynak van egy
olyan konstruktora, amelynek paramtere a megfelel primitv rtk. A type a Type-
nak megfelel primitv tpus. Pldul:
Character cObj = new Character('A');
Boolean bObj = new Boolean(true);
Integer iObj = new Integer(30);
Double dObj = new Double(6099.8);
326 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

<Type> (String s)
Minden csomagol osztlynak (kivve a Characternek) van egy olyan konstruktora,
amelynek paramtere a megfelel primitv rtk szveges formja. Pldul:
Boolean b1Obj = new Boolean("True"); // kis/nagybet mindegy
Boolean b2Obj = new Boolean("t"); // false (ha nem true)
Integer iObj = new Integer("30");
Double dObj = new Double("6099.8");

Pldnymetdusok
String toString()
Ez minden csomagol osztlyban megtallhat. Az Object megfelel metdust rja
fell gy, hogy visszaadja az objektum szveges formjt. Pldul:
Double dObj = new Double(6099.8);
String s = dObj.toString(); // s=="6099.8"
<type> <type>Value()
Itt type egy primitv tpust jell. Minden csomagol osztlyban megvan a megfelel
metdus (Character-ben char charValue(), Integer-ben int intValue() stb.).
A pldnymetdus visszaadja az objektum primitv tpus rtkt. Ezenkvl minden
numerikus csomagol osztly tartalmazza az sszes tbbi primitv tpusra talakt
metdust is: brmelyik numerikus objektumnak ki lehet teht krni annak
tpusknyszertett primitv rtkt. Pldul:
Character cObj = new Character('A');
Integer iObj = new Integer(30);
char c = cObj.charValue(); // c=='A'
int i = iObj.intValue(); // i==30
double d = iObj.doubleValue(); // d==30.0
boolean equals(Object obj)
Minden csomagol osztly fellrja az Object osztly equals metdust. Ez a met-
dus megvizsglja, hogy az objektum egyenl-e a paramterben megadottal. A vissza-
adott rtk csak akkor true, ha a kt objektum osztlya ugyanaz, s az objektumok
azonos llapotak. Pldul:
Integer iObj = new Integer(30), jObj = new Integer(30);
if (iObj.equals(jObj)) ... // true
if (iObj.equals("30")) ... // false, nem ugyanaz az osztly

Statikus metdusok
static <Type> valueOf(String s)
A Type-nak megfelel csomagol osztlyban van (kivve a Characterben). A karak-
terlncbl egy Type tpus objektumot gyrt.
Integer iObj, jobj;
iObj = Integer.valueOf("30");
jObj = Integer.valueOf("45D"); // NumberFormatException!
16. Objektumok, karakterlncok, csomagolk 16.9. Primitv tpusok csomagolsa 327

Most nzzk sorra, milyen egyb deklarcik tallhatk az egyes csomagol osztlyokban:

Boolean osztly
static final Boolean TRUE = new Boolean(true);
static final Boolean FALSE = new Boolean(false);
Ez kt Boolean tpus konstans objektum.

Character osztly
static final char MIN_VALUE = '\u0000';
static final char MAX_VALUE = '\uffff';
A char tpus ltal reprezentlt legkisebb, illetve legnagyobb unikd rtk konstans.

static boolean isUpperCase(char ch) // Nagybet?


static boolean isLowerCase(char ch) // Kisbet?
static boolean isDigit(char ch) // Szm?
static boolean isLetter(char ch) // Bet?
static boolean isLetterOrDigit(char ch) // Bet vagy szm?
static boolean isISOControl(char ch) // Vezrl karakter?
static boolean isSpaceChar(char ch) // Szkz
static boolean isWhitespace(char ch) // Fehr szkz?
Visszaadja, hogy a karakter nagybet (upper case), kisbet (lower case) stb.
static char toUpperCase(char ch)
static char toLowerCase(char ch)
Visszaadja a karakter nagybets, illetve kisbets formjt.

Feladat Milyen karakter?


Krjnk be karaktereket '-' vgjelig! llaptsuk meg minden egyes karakterrl, hogy
az szm, bet (azon bell kisbet vagy nagybet), szkz, fehr szkz vagy egyb!

Forrskd
import extra.*;
public class MilyenKarakter {
public static void main(String[] args) {
char kar = Console.readChar("Karakter:");
while (kar != '-') {
if (Character.isDigit(kar))
System.out.println("Szm");
else if (Character.isLetter(kar)) {
if (Character.isUpperCase(kar))
System.out.println("Nagybet");
else
System.out.println("Kisbet");
}
328 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

else if (Character.isSpaceChar(kar))
System.out.println("Szkz");
else if (Character.isWhitespace(kar))
System.out.println("Fehr szkz");
else
System.out.println("Egyb");
kar = Console.readChar("Karakter:");
}
}
}

A program egy lehetsges futsa


Karakter:!
Egyb
Karakter:A
Nagybet
Karakter:-

Numerikus csomagol osztlyok


static final <type> MIN_VALUE = <a tpusnak megfelel rtk>;
static final <type> MAX_VALUE = <a tpusnak megfelel rtk>;
A megfelel tpus ltal reprezentlt legkisebb, illetve legnagyobb szm rtk konstans:
System.out.println("Legkisebb byte:"+Byte.MIN_VALUE);//-> -128
System.out.println("Legnagyobb int:"+Integer.MAX_VALUE);
// -> 2147483647
static <type> parse<Type>(String s)
E statikus metdus megfelel vltozata mindegyik numerikus csomagol osztlyban
szerepel. Visszaadja a szveg ltal reprezentlt primitv tpus rtket (kivtel: int
esetn a metdus neve nem parseInteger hanem parseInt). Pldul:
int b = Byte.parseByte("3"); // b==3
int i = Integer.parseInt("50"); // i==50
double d = Double.parseDouble("3.14"); // d==3.14

Feladat sszegzs
Krjnk be egy sszeget szveg formjban, ahol a vals szmok + jelekkel vannak
elvlasztva! rjuk ki egyms al az egyes sszeadandkat 8 hosszon, kt tizedessel
jobbra igaztva, majd az egszet alhzva rjuk ki az sszeget is!

Forrskd
import extra.*;

public class Osszegzes {


public static void main(String[] args) {
String osszegStr = Console.readLine
("rjon be egy sszeget 9.9+9.9+9.9 formban:\n");
// gy knnyebb lesz feldolgozni az utols szmjegyet:
osszegStr = osszegStr+"+"; //1
double osszeg = 0, szam;
16. Objektumok, karakterlncok, csomagolk 16.10. StringTokenizer osztly 329

int kezd = 0; //2


int p = osszegStr.indexOf('+'); //3
while (p >= 0) {
szam = Double.parseDouble
(osszegStr.substring(kezd,p)); //4
System.out.println(Format.right(szam,8,2)); //5
osszeg += szam; //6
kezd = p+1; //7
p = osszegStr.indexOf('+',kezd); //8
}

System.out.println("--------");
System.out.println(Format.right(osszeg,8,2));
}
}

A program egy lehetsges futsa


rjon be egy sszeget 9.9+9.9+9.9 formban:
123.5+1+99+5.134
123.50
1.00
99.00
5.13
--------
228.63

A program elemzse

A bekrt szveg vgre tesznk egy + jelet, gy a feldolgozs addig folytatdhat, amg van +
jel (//1). A kvetkez szm rszlnca mindig a kezd pozci (kezd) s a kvetkez + jel poz-
cija (p) kztti rsz lesz, ezeket az rtkeket a ciklus eltt (//2, //3), valamint a ciklus vgn
(//7, //8) mindig szmoljuk. A ciklusban kivesszk a soron kvetkez rszlncot, s azt rgtn
double rtkk alaktjuk (//4), majd igaztva kirjuk az rtket (//5), s elvgezzk az sszeg-
zs (//6).

16.10. StringTokenizer osztly

A StringTokenizer osztly segtsgvel egy szveg knnyen egysgekre (rszekre,


tokenekre) bonthat. Az egyes egysgeket egy vagy tbb elvlaszt karakter (elvlaszt jel,
delimiter) klnti el egymstl. Ezek az elvlaszt karakterek alaprtelmezsben a fehr
szkzk (szkz, TAB, CR, LF s FF karakterek), de az elvlaszt karakterek halmazt
mi magunk is megadhatjuk.

A String darabolst a 16.11. bra mutatja.


330 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

Pldk:
Szveg: 2*3 az nha 5!
Ha az elvlaszt karakter: szkz, akkor az eredmny 4 egysg: 2*3, az, nha s
az 5! (16.11. bra)
Ha az elvlaszt karakter: *, akkor az eredmny 2 egysg: 2 s a 3 az nha 5!
Szveg: 1+34+567*3-5
Ha az elvlaszt karakterek: +-*/, akkor az eredmny 5 egysg: 1,34, 567, 3 s 5

Az alaprtelmezs szerinti elvlasztkkal a mondat szavakra bomlik.


Egy szveg felbontst gy tudjuk elvgezni, hogy ltrehozunk egy StringTokenizer
tpus objektumot, melyet a felbontand szveggel inicializlunk. A szveg kvetkez rszt
mindig a nextToken() metdus adja meg. A szveg vghez rve a hasMoreTokens()
fggvny false rtk, ilyenkor a nextToken() jbli meghvsa NoSuchElement
Exception kivtelt vlt ki. A szvegen csak egyszer lehet vgigmenni, ezrt a szveg tbb-
szri felbontshoz mindig j darabol objektumot kell ltrehozni. Az elvlaszt karaktereket
menet kzben meg lehet vltoztatni.

A delimiterek itt a szkzk

2 * 3 a z n h a 5 !

tokenek

16.11. bra. String darabols

Konstruktorok
StringTokenizer(String str, String delim, boolean returnTokens)
Ltrehoz egy olyan objektumot, mely az str szveget fogja majd felbontani. A delim
ltal tartalmazott karakterek brmilyen sorozata elvlasztja az egysgeket. Ha
returnTokens rtke true, akkor a felbont eljrs az elvlasztjeleket is visszaadja
(egyesvel) mint egysget. Ha returnTokens rtke false, akkor a nextToken()
mindig csak az rtelmes egysgeket adja vissza (a szveg nem tartalmaz elvlaszt
karaktert).
16. Objektumok, karakterlncok, csomagolk 16.10. StringTokenizer osztly 331

StringTokenizer(String str, String delim)


Ltrehoz egy olyan objektumot, mely az str szveget fogja majd felbontani. A delim
ltal tartalmazott karakterek sorozata elvlasztja az egysgeket. returnTokens rtke
false.
StringTokenizer(String str)
Ltrehoz egy olyan objektumot, mely az str szveget fogja majd felbontani. delim
rtke " \t\n\r\f" (fehr szkzk), returnTokens rtke false.

Metdusok
boolean hasMoreTokens()
true-t ad vissza, ha van mg rsz (egysg).
String nextToken()
Visszaadja a kvetkez egysget. Ha nincs tbb egysg, NoSuchElementException
kivtel keletkezik.
String nextToken(String delim)
Elszr tvlt a delim elvlasztjel-kszletre, majd ennek megfelelen visszaadja a
kvetkez egysget, mint ahogyan azt a nextToken() teszi. A tovbbiakban ezek az
elvlasztk lesznek rvnyben.
int countTokens()
Visszaadja, hogy hny rsz van mg a szvegben.

Feladat Szavak
Krjnk be egy mondatot! rjuk ki, hny sz van benne, majd rjuk ki a szavakat is
termszetes sorszmmal elltva (1-tl), mindegyiket kln sorba!

Forrskd
import extra.*;
import java.util.*;

public class Szavak {

public static void main(String[] args) {


String mondat = Console.readLine("Mondat: ");
StringTokenizer st = new StringTokenizer(mondat);

System.out.println("Szavak szma: "+st.countTokens());


int sorszam = 0;
while (st.hasMoreTokens())
System.out.println(++sorszam+": "+st.nextToken());
}
}
332 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

A program egy lehetsges futsa


Mondat: Remlem, jl sztbontod ezt a mondatot!
Szavak szma: 6
1: Remlem,
2: jl
3: sztbontod
4: ezt
5: a
6: mondatot!

Feladat Dtumbonts
Az eeee.hh.nn. formtum szveg egy dtumot tartalmaz. Hatrozzuk meg az vet,
a hnapot s a napot egsz rtkknt!

Most egyetlen elvlasztjel van, a pont. A rszek szvegek, melyeket az Integer osztly
parseInt fggvnyvel primitv tpus int rtkekk alaktunk.

Forrskd
import java.util.*;

public class DatumBontas {


public static void main(String[] args) {
String datumStr = "1978.03.15.";
StringTokenizer dt = new StringTokenizer(datumStr,".");
int ev = Integer.parseInt(dt.nextToken());
int ho = Integer.parseInt(dt.nextToken());
int nap = Integer.parseInt(dt.nextToken());
System.out.println("v: "+ev+" H: "+ho+" Nap: "+nap);
}
}

A program futsa
v: 1978 H: 3 Nap: 15

Tesztkrdsek

16.1. Mely lltsok igazak a toString() metdusra vonatkozan? Jellje meg az sszes
igaz lltst!
a) Minden objektumot meg lehet szltani a toString() metdussal fggetlenl attl,
hogy az adott osztlyban azt definiltk-e, vagy sem.
b) A toString() minden esetben az objektum adatait adja vissza szveges formban.
c) Minden osztlyban ktelezen szerepelnie kell egy sajt toString() metdusnak.
d) A System.out.println() metdus paramterben brmilyen objektum szerepel-
het.
16. Objektumok, karakterlncok, csomagolk 16.10. StringTokenizer osztly 333

16.2. Jellje meg az sszes helyes lltst a kvetkezk kzl!


a) A null referencia egy specilis, res objektumra mutat.
b) A referencia tpus vltoz azonostjval az objektum memriahelyre nem kz-
vetlenl, hanem kzvetve hivatkozunk.
c) Egy objektum deklarlsakor a rendszer az objektum szmra memriahelyet foglal.
d) Az objektum osztlya futs kzben megvltoztathat.
16.3. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) Az inicializlst vgz metdust konstruktornak nevezzk.
b) A konstruktornak elvileg tbbfle paramterezse is lehet.
c) A Javban a konstruktor neve nem az osztly nevvel egyezik meg, hanem a
ltrehozand objektumval.
d) Az objektum adatainak a konstruktorral kezdeti rtkeket adhatunk.
16.4. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) Kt objektum azonos, ha llapotaik megegyeznek.
b) A new opertorral egy objektumot hozhatunk ltre.
c) Egy metdus meg tudja megvltoztatni a paramterben megkapott objektumot.
d) A hivatkozs nlkli objektumokat az automatikus szemtgyjt idnknt megsem-
misti.
16.5. Adott a kvetkez deklarci:
String szo="Virgot";
Melyik kifejezs adja vissza a "rg" rszlncot a szo-bl? Jellje meg az egyetlen j
vlaszt!
a) szo.substring(3,3)
b) szo.substring(2,3)
c) szo.substring(2,4)
d) szo.substring(2,5)
16.6. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) A Character osztly kzvetlenl az Object osztlybl szrmazik.
b) Az Integer osztly kzvetlenl az Object osztlybl szrmazik.
c) A Boolean primitv tpus.
d) A Javban az objektumok referencia tpus vltozk.

Feladatok

String osztly

16.1. Krjen be konzolrl egy szveget! rja ki a szveget


a) (A) csupa kisbetvel!
b) (A) tzszer egyms utn, a + jellel elvlasztva!
c) (A) gy, hogy az sszes _ karakter helyett ktjel szerepel!
d) (B) gy, hogy a szveg els s msodik fele fel van cserlve (kzps karakter
marad)! Pldul: Buldozer ozerBuld
334 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

e) (B) gy, hogy az els szkz eltti s utni rsz fel van cserlve!
Pldul: Ady Endre Endre Ady
(SzovegAlakit.java)
16.2. Krjen be konzolrl szvegeket egy adott vgjelig, majd rja ki kzlk a leghosszab-
bat!
a) (A) Tbb egyenl hosszsg szveg esetn az utols leghosszabbat rja ki!
b) (B) Tbb egyenl hosszsg szveg esetn rja ki mindegyiket! Tipp: Gyjtse az
egyenl hosszsg szvegeket gy, hogy azokat konkatenlja szkzket is beik-
tatva! Ha ezeknl tall egy rvidebbet, akkor kezdje ellrl a gyjtst!
(Leghosszabb.java)
16.3. rjon metdust, amely megszmolja, hogy a paramterben megadott szvegben
a) (A) hny szkz van!
b) (B) hny and sz van! Nem szmt, hogy eltte, illetve utna van-e szkz.
c) (B) hny, msodik paramterknt megadott sz szerepel! (Elz feladat ltalnos-
tsa.)
(Megszamol.java)
16.4. (C) Krjen be egy szveget, majd cserlje le benne az sszes kezetes bett kezet
nlklire! (Ekezetcsere.java)

StringBuffer osztly, objektum tadsa paramterknt

16.5. (B) rjon egy olyan metdust, amely a paramterknt megadott karakterlncban
bizonyos karakterlncokat msikra cserl! A kicserlend s beszrand karakter-
lncokat is paramterknt adjuk meg! A metdus brmilyen kt lncra mkdjn!
(SzoCsere.java)

16.6. (B) rjon egy olyan fggvnyt, amely a paramterknt megadott karakterlncbl kiveszi
a msodik paramterknt megadott karakterlncban tallhat sszes karaktert! A fgg-
vny az eredeti lncot hagyja vltozatlanul, s adja vissza a megvltoztatott lncot!
(Kivesz.java)

16.7. (B) rjon egy olyan metdust, amely egy szveget a paramterknt megadott
hosszsgra alakt: ha kell, levgja, ha kell, kiegszti szkzkkel! Hvsa pl.:
szoveg=lenString(szoveg,6); (LenString.java)

16.8. (C) rjon egy olyan metdust, amely visszaadja egy szm bitkpt karakterlnc
formjban! A bevezet nullk ne szerepeljenek a lncban (pldul 5 == "101")! Egy
msik metdus adja vissza a bitkp ltal reprezentlt szmot! (BitKep.java)

16.9. (B) A gyerekek krben jl ismert a Tuvudsz vgy beveszvlnivi? tpus beszl-
gets. Tantsa meg a szmtgpet gy beszlni! A beolvasott mondatot alaktsa t gy,
16. Objektumok, karakterlncok, csomagolk 16.10. StringTokenizer osztly 335

hogy minden magnhangz utn szrjon be egy v bett s az elz magnhangzt!


(Tuvudsz.java)

16.10. (C) rjon egy olyan metdust, amely kdol egy szveget: fordtsa meg minden karakter
3. s 4. bitjt: a 0-bl legyen 1-es s fordtva! Ksztsen megfejt metdust is!
(Kodolas.java)

16.11. (C) Krjen be egy szveget, majd vegye ki belle az sszes zrjeles megjegyzst!
Pldul: Ez a kutya (hzrz) szp (polt). Ez a kutya szp. (MegjegyzesKivesz.java)

Primitv tpusok csomagolsa

16.12. (A) Krjen be egy szveget! rja ki, hogy a szvegben sszesen hny darab bet, hny
szm, hny fehr szkz, illetve hny egyb karakter szerepel! (KarEloszlas.java)

16.13. (C) Krjen be egy szveget! A szvegben szerepl sszes dollrsszeget vltsa t
forintra (pldul ha 1 $=280 Ft, akkor a 21 $ helyett 5880 Ft szerepeljen)! Tegyk fel,
hogy a dollrsszeg formja: egy egsz szm, egy szkz s a $ jel. rja ki az talaktott
szveget! (Atvaltas.java)

16.14. (C) Krjen be egy nevet, mely akrhny rsznvbl llhat. Csak akkor fogadja el a
nevet, ha az legalbb kt rsznvbl ll (a rszneveket legalbb egy szkz vlasztja el)!
Vegye le a szkzket a nv elejrl s vgrl, a rsznevek kzt pedig csak egy
szkzt hagyjon! A nevet alaktsa t gy, hogy minden rsznv nagybetvel kezddjn,
a tbbi pedig kisbet legyen! (NevAlakit.java)

StringTokenizer osztly

16.15. (A) rjon egy fggvnyt, mely megszmolja, hny sz van a paramterknt megadott
szvegben! (A szavakat egy vagy tbb fehr szkz vlasztja el egymstl.)
(SzavakSzama.java)

16.16. (B) Bontsuk mondatokra egy paragrafus tartalmt! Egy mondatot a pont, a felkiltjel
vagy a krdjel zrja le (egytt nem alkalmazhatk). rjuk ki egyenknt a mondatokat s
utna zrjelben a benne lev szavak szmt! (Paragrafus.java)

16.17. (C) Egy szvegsor egy hallgat nevt s Programozs rdemjegyeit tartalmazza. A
hallgat neve utn egy kettspont ll, majd szkzzel elvlasztva jn akrhny darab 1
s 5 kztti rdemjegy. Krjk be ezt a sort, majd rjuk ki a hallgat nevt, s jegyeinek
tlagt! (JegyekAtlaga.java)
336 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE
17. Osztly ksztse 17.1. OO paradigma Emlkeztet 337

17. Osztly ksztse

A fejezet pontjai:
1. OO paradigma Emlkeztet
2. Els mintaprogram Raktrprogram
3. Msodik mintaprogram Bank s a Jszerencse
4. Az osztly felptse, az osztly deklarcii
5. Osztlytag, pldnytag
6. Azonost, hivatkozsi kr, takars
7. Vltozk alaprtelmezs szerinti kezdeti rtkei
8. A this objektumreferencia
9. Konstruktorok
10. Inicializlk

Az elz fejezetben az API ksz osztlyait hasznltuk; most mi magunk fogunk osztlyt
kszteni. A megrt osztlyt aztn ugyangy pldnyosthatjuk, mint brmely ms API osztlyt.
Az osztlykszts szablyait kt mintaprogram segtsgvel szemlltetjk: az els program
bevezet jelleg ott a vezrl objektum egyetlen, osztlytagokat nem tartalmaz objektum-
mal ll kapcsolatban; a msodik programban a vezrl mr kt objektumnak zen, s az ze-
neteket fogad objektum osztlytagokat is tartalmaz. A fejezet sszes pontjban e kt minta-
programra fogunk hivatkozni.

17.1. OO paradigma Emlkeztet


Elszr is sszefoglaljuk a II. rsz, OO paradigmban trgyalt, idetartoz fontosabb definci-
kat:

Pldnydeklarci: A pldnyonknt (objektumonknt) helyet foglal vltozk a


pldnyvltozk, ms nven pldnyadatok. Az osztly azon metdusait, amelyek pld-
nyokon (pldnyvltozkon) dolgoznak, pldnymetdusoknak nevezzk. (Lsd 5.7.)
338 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

Osztlydeklarci: Az osztlyvltoz az osztly sajt vltozja, az egyes pldnyokban


nem szerepel. Az osztlymetdus az osztly sajt metdusa, amely csak osztlyvltozkon
dolgozik. Egy osztlyt csak osztlymetdussal lehet megszltani; egy objektumot meg
lehet szltani pldnymetdussal s osztlymetdussal egyarnt. (Lsd 5.8.)
Objektumok, osztlyok sztereotpusai: Egy objektum (osztly) sztereotpusnak nevez-
zk annak fajtjt, jellegt. A sztereotpusok kztt nem mindig hzhat les hatr, s el-
fordulhat, hogy egy objektumra kt sztereotpus is jellemz. Az objektumok, osztlyok
alapvet sztereotpusai: informcihordoz, hatr, kontroll, kontner. (Lsd 5.11.)
Objektumdiagram (pldnydiagram): Elssorban objektumokat s azok kapcsolatait
brzol diagram. Az objektumdiagramon osztly is feltntethet (az osztlydeklarcik
miatt). (Lsd 6.1.)
Kt osztly kztti egyegy kapcsolat: az egyik osztly egy pldnya a msik osztly leg-
feljebb egy pldnyval llhat kapcsolatban. A msik osztlyra ugyanez vonatkozik. (Lsd
6.2.)
Osztlydiagram: Az osztlydiagram a feladatban szerepl objektumok osztlyait s azok
(trstsi s rklsi) kapcsolatait brzolja. A rendszert egyetlen osztlydiagram rja le. Az
osztlydiagramon szerepel a rendszer sszes olyan objektumnak osztlya, melyet a forrs-
kdban meg kell valstani (le kell kdolni). Az osztlydiagramon az API osztlyait csak
akkor szoks feltntetni, ha az szksges a rendszer megrtshez. (Lsd 6.2.)
Egyttmkdsi diagram: Olyan objektumdiagram, amelyen feltntetjk az egyes objek-
tumoknak kldtt zeneteket. Az egyttmkdsi diagramon osztlyok is szerepelhetnek
az osztlyvltozk, illetve osztlymetdusok hasznlata miatt. A diagram zeneteit a vg-
rehajts sorrendjben be lehet sorszmozni. Az egyttmkdsi diagram segtsgvel
szemlletess tehetjk az egyes hasznlati eseteket, illetve opercikat mkds kzben.
Egy osztlydiagramhoz tbb egyttmkdsi diagram is tartozhat. Az egyttmkdsi
diagram az osztlydiagram egy pldnya, a mkd program egy pillanatfelvtele. (Lsd
6.2.)
Kt osztly kztti egy-egy kapcsolat megvalstsa: A kliens osztlyban ltrehozzuk a
szerver objektumra mutat referencit. (Lsd 6.3.)
Lthatsg: Az osztly deklarcii a kvetkez lthatsggal (hozzfrsi mddal) ren-
delkezhetnek: Nyilvnos (public, +): minden kapcsolatban ll kliens elri s hasznlhatja;
Vdett (protected, #): hozzfrs csak rklsen keresztl lehetsges; Privt (private, -):
az osztly privt deklarcija, csak az osztly sajt metdusai frhetnek hozz. (Lsd 7.5.)

Nzze t a II. rsz, OO paradigma megfelel rszeit!


17. Osztly ksztse 17.2. Els mintaprogram Raktrprogram 339

17.2. Els mintaprogram Raktrprogram


Feladat
Adott egy zldsgraktr, melyben pillanatnyilag egyetlen rut, paradicsomot raktro-
zunk. A raktrba gyakran tesznk be, illetve vesznk ki onnan paradicsomot. A para-
dicsom pillanatnyi egysgra 300 Ft, de ez vltozhat. Ksztsnk olyan programot,
mely segtsgvel rgzteni tudjuk a megfelel adatokat, s brmikor jelentst tudunk
adni a paradicsom aktulis mennyisgrl, egysgrrl s rtkrl!
Vgezzk el a kvetkez akcikat: Tegynk a raktrba 125 kg paradicsomot, aztn
vegynk ki 25 kg-ot, majd szlltsuk le a paradicsom egysgrt 210 Ft-ra! Mind-
hrom akci utn rjuk ki, mennyi paradicsom van raktron s milyen rtkben!

A program terve

Egyttmkdsi diagram:
3: Aru(aNev,aEgysegar)
1: main(args) 5: hozzatesz(aMenny)
6: elvesz(aMenny)
2: RaktarProgram()
7: setEgysegar(aEgysegar)
4: akciok()

RaktarProgram program:
aru:Aru
RaktarProgram

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

17.1. bra. A raktrprogram egyttmkdsi- s osztlydiagramja


340 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

A feladat szvegbl els ltsra kt objektum vilglik ki: egy zldsgraktr s abban egy ru.
A raktrba betesznk paradicsomot, a paradicsom rt megvltoztatjuk, stb. De ha jobban
belegondolunk, a paradicsom mennyisge nem a raktrra jellemz, hanem magra az rura.
Amikor egy raktrba betesznk 2 kg paradicsomot, akkor ezt a mennyisget a paradicsomhoz
hozztesszk. Elvileg lehetne tbb ru is a raktrban, de most nincs tbb, s a raktrra pillanat-
nyilag nem is jellemz ms, mint hogy paradicsom van benne. Az akcikat sem a raktr vgzi,
hanem egy vezrl, aki a raktrba betesz, illetve kivesz. Mivel a raktrnak pillanatnyilag csak
tovbbt szerepe lenne, t most kiiktatjuk a megoldsbl marad az ru s egy vezrl, amely
az ruhoz hozztesz, illetve abbl elvesz egy adott mennyisget. A program vezrljnek kita-
llunk egy jellemz nevet, legyen ez raktrprogram. A program egyttmkdsi- s osztly-
diagramja a 17.1. brn lthat.

Osztlylersok
Aru: Informcihordoz osztly: van neve, egysgra s aktulis mennyisge. Az ru
ltrehozsakor megadjuk annak nevt s egysgrt: new Aru("Paradicsom",300),
a raktron lev indul mennyisg 0. Az runak le lehet krdezni minden trolt adatt
(getNev, getEgysegar, getMenny), le lehet krdezni az rt (getAr), valamint meg
lehet vltoztatni az egysgrt (setEgysegar) s a raktron lev mennyisget
(hozzatesz, elvesz). A toString() ltal visszaadott szveg az ru objektumot
reprezentlja a System.out.println(aru) ezt a szveget jelenti meg a konzolon.
RaktarProgram: Kontroll osztly, mely nem csinl mst, mint vgrehajtja a krt akci-
kat (hozzatesz, elvesz, setEgysegar). A raktrnak nincsenek tulajdonsgai.

A RaktrProgram s az Aru osztlyok egy-egy, tartalmazsi kapcsolatban vannak egymssal.


Ha a program megsznik, akkor az ru is vele egytt elpusztul. A program:RaktrProgram
objektum teht ismeri az aru:Aru objektumot, annak zeneteket tud kldeni.
Az egyttmkdsi diagramon jl kvethet a program futsa. Az egyes tevkenysgek a
vgrehajts sorrendjben sorszmozva vannak:
1. main(): ez a program belpsi pontja. A publikus RaktarProgram osztly statikus
main metdusval kezddik a program futsa.
2. RaktarProgram(): a main ltrehozza a program:RaktrProgram objektumot
sajt osztlybl.
3. Aru(): A raktrProgram rgtn a konstruktorban ltrehozza az aru objektumot.
4. akciok(): meghvja az aru.hozzatesz(), aru.elvesz() stb. metdusokat.
Az akciok() a kvetkez tevkenysgeket foglalja magban:
5. hozzatesz(aMenny): a program hozztesz egy adott mennyisget az ruhoz.
6. elvesz(aMenny): a program objektum elvesz egy adott mennyisget az rubl.
7. setEgysegar(): a program belltja az ru egysgrt.
17. Osztly ksztse 17.2. Els mintaprogram Raktrprogram 341

Az egyes akcik kztt kpernyre rjuk az aru objektumot ekkor kzvetve meghvjuk
annak toString() metdust.

Ha az egyttmkdsi diagramon egy objektum zenetet fogad, akkor az zenetnek meg-


felel metdusnak szerepelnie kell az objektum osztlyban.

Az brn pldul a 3. konstruktor, valamint az 5., 6., s 7. zenetek rendre megtallhatk az


aru objektum osztlyban, az Aru-ban.

Forrskd
// RaktarProgram.java
class Aru { //1
private String nev; //2
private double egysegar; //3
private double menny; //4

public Aru(String aNev, double aEgysegar) { //5


nev = aNev;
egysegar = aEgysegar;
menny = 0;
}

public String getNev() { //6


return nev;
}

public double getEgysegar() { //7


return egysegar;
}

public void setEgysegar(double aEgysegar) { //8


if (aEgysegar >= 0)
egysegar = aEgysegar;
}

public double getMenny() { //9


return menny;
}

public double getAr() { //10


return menny*egysegar;
}

public void hozzatesz(double aMenny) { //11


if (aMenny>0)
menny += aMenny;
}

public void elvesz(double aMenny) { //12


if (aMenny>0 && aMenny<=menny)
menny -= aMenny;
}
342 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

public String toString() { //13


return nev+"\tEgysegr: "+egysegar+
"\tMenny: "+menny+"\tr: "+getAr();
}
}

public class RaktarProgram { //14


private Aru aru; //15

public RaktarProgram() { //16


aru = new Aru("Paradicsom",300); //17
}

public void akciok() { //18


aru.hozzatesz(125); //19
System.out.println(aru); //20
aru.elvesz(25); //21
System.out.println(aru); //22
aru.setEgysegar(210); //23
System.out.println(aru); //24
}

public static void main(String[] args) { //25


RaktarProgram program = new RaktarProgram(); //26
program.akciok(); //27
}
}

A program futsa
Paradicsom Egysegr: 300.0 Menny: 125 r: 37500.0
Paradicsom Egysegr: 300.0 Menny: 100 r: 30000.0
Paradicsom Egysegr: 210.0 Menny: 100 r: 21000.0

A forrskd elemzse
A forrskdban kt osztlyt kdoltunk: a RaktarProgram a main-t tartalmaz publikus
osztly, a msik osztly (Aru) nem is lehet publikus.

Egy osztly deklarcija egy fejbl s egy blokkbl ll. Az osztly fejt a class kulcssz jelzi
(//1); ha az osztly publikus, akkor a class eltt a public kulcssz ll (//14). Az osztly
blokkjt nyit s csuk kapcsos zrjelek kz tesszk. A blokk adat s metdusdeklarcikat
tartalmaz. Feladatunkban csak pldnydeklarcik szerepelnek. Nzzk vgig a deklarcikat!

ru osztly deklarcii:
//2-4: Adatok. A nev, egysegar s menny pldnyvltozk, azok szerepelni fognak a
ltrehozott aru objektumban. Lthatsguk privt //20-ban pldul szintaktikailag
hibs lenne a kvetkez utasts:
System.out.println(aru.nev);
17. Osztly ksztse 17.2. Els mintaprogram Raktrprogram 343

//5: Konstruktor. Feladata, hogy a paramterben megadott aNev s aEgysegar rtke-


ket betltse a nev s egysegar pldnyvltozkba, s hogy a menny vltoznak 0
rtket adjon. A konstruktor neve minden esetben megegyezik az osztly nevvel, s
nincs visszatrsi tpusa (nem is void).
//6-13: Pldnymetdusok (egyik eltt sem szerepel a static kulcssz). A pldny-
metdusok (eljrsok s fggvnyek) az objektum adatain, a pldnyvltozkon dol-
goznak. Az egyes metdusok blokkjaiban hivatkozhatunk brmely msik deklarcira:
//6-ban pldul a getNev metdus a pldny nev vltozjnak rtkt adja vissza, //11-
ben a hozzatesz metdus a paramterben megadott aMenny rtket hozzadja a
menny vltozhoz.

RaktrProgram osztly deklarcii:


//15: Az aru referencia a RaktarProgram osztly egyetlen adata ez valstja meg az
egy-egy kapcsolatot a kt osztly kztt. A forrskdban az osztly igazi adatait s
kapcsolatait egyarnt adatknt kdoljuk. Az aru pldnyadat, vagyis csak a program
objektum ltrejtte utn, s csak pldnymetdusbl lehet r hivatkozni (a main-bl
teht nem).
//16: A RaktarProgram osztly konstruktora. //17-ben ltrehozza az rut.
//18: Az akciok() metdus az aru objektumnak zeneteket kld: hozzatesz,
elvesz stb. A System.out.println(aru) konzolra rja az aru.toString() fgg-
vny rtkt.
//25: A main osztlymetdus ltrehozza a programot (//26), s mkdsre brja azt
(//27). Itt indul be teht a gpezet: ltrejn a program objektum, amely ltrehozza az
aru objektumot. Amg nem hozzuk ltre az els objektumot, addig a tbbi objektum
sem szlethet meg addig pusztn csak lersok lteznek...

Objektum ltrehozsa sajt osztlybl


A main osztlymetdust a futtat rendszer automatikusan meghvja, hogy a program elindul-
hasson. A RaktarProgram osztly main metdusa sajt osztlybl hoz ltre egy pldnyt,
majd meghvja a ltrehozott objektum akcik() pldnymetdust. Ezt az esetet a 17.2. bra
1. esete mutatja. Egy osztly elvileg akrhny pldnyt ltre tud hozni nmagbl. Megtehet-
tk volna, hogy ksztnk egy StartRaktarProgram osztlyt, s a main metdust abba tesz-
szk; ez a 17.2. bra 2. esete. Ebben az esetben kt osztly helyett hrmat kell lekdolnunk.
A 2. eset forrskdja a kvetkez:
class Aru { //1
// Az Aru osztly kdja nem vltozik

}
344 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

class RaktarProgram { //14


private Aru aru; //15

public RaktarProgram() { //16


aru = new Aru("Paradicsom",300); //17
}

public void akciok() { //18


aru.hozzatesz(125); //19
System.out.println(aru); //20
aru.elvesz(25); //21
System.out.println(aru); //22
aru.setEgysegar(210); //23
System.out.println(aru); //24
}
}

public class StartRaktarProgram { //25


public static void main(String[] args) { //26
RaktarProgram program = new RaktarProgram(); //27
program.akciok(); //28
}
}

1. 2.

program:RaktarProgram program:RaktarProgram

RaktarProgram() RaktarProgram()
akciok() akciok()

RaktarProgram StartRaktarProgram

main(...) main(...)

17.2. bra. Objektum ltrehozsa sajt osztlybl, illetve kvlrl

A main metdusnak mindkt esetben ugyanaz a feladata, s a program:RaktarProgram


objektum feladatai sem vltoznak. A kt eset kztt a klnbsg csak a main metdus tartz-
kodsi helyben s az osztlyok lthatsgban van:
17. Osztly ksztse 17.3. Msodik mintaprogram Bank s a Jszerencse 345

1. eset: a main a RaktarProgram osztly metdusa. A RaktarProgram lthatsga


publikus.
2. eset: a main a StartRaktarProgram publikus osztly egyetlen metdusa. A
StartRaktarProgram publikus, a RaktarProgram nem publikus.

Br az 1. eset els ltsra bonyolultabbnak tnhet, ez az eset a szokvnyosabb, knnyebb prog-


ramozni, s logikailag ugyanolyan j, mint a 2. megolds.

A ltrehozott objektum osztlya lehet az az osztly is, amelyben a ltrehozst vgezzk. Ily
mdon az objektumnak tbb pldnya is ltrehozhat sajt magbl. A ltrehozs
osztly- vagy pldnymetdusbl egyarnt trtnhet.

zenet rptben
A main metdusban nem lenne szksges deklarlni a program objektumot. Mivel a program
sorn annak mindssze egyetlen zenetet kldnk, megtehetjk ezt a ltrehozs utn kz-
vetlenl is, rptben:
public static void main(String[] args) {
new RaktarProgram().akciok();
}

17.3. Msodik mintaprogram Bank s a Jszerencse


Feladat Bank
Az OTP bank Jszerencse fantzianev befektetsi jegyeket forgalmaz. Egy gyfl
szmlt nyithat ehhez a befektetsi formhoz, majd vsrolhat vagy eladhat befek-
tetsi jegyeket. A szmla nyitsakor meg kell adni a szmlatulajdonos nevt, s
megadhat a kedvezmnyezett neve is (az, aki rkli a szmlt). Az indul sszeg
a szmla nyitsakor nulla. A befektetsi jegynek rfolyama van; a vsrls s az
elads mindig az aktulis rfolyamon trtnik. Vsrlskor 200 Ft, eladskor 400 Ft
kezelsi kltsget kell fizetni.
Ksztsnk olyan programot, amely a bank Jszerencse befektetsi jegyeinek for-
galmt szimullja! A program elejn nyissunk kt gyflnek szmlt, majd menbl
vlaszthatan tegyk lehetv, hogy az gyfelek vsroljanak vagy eladjanak befek-
tetsi jegyeket! Lehessen az rfolyamot is vltoztatni!

Megjegyzs: A feladat kiss erltetett, hiszen egy bankban a szmlk szma elvileg korltlan.
Tetszleges szmlt akkor tudunk majd nyitni, ha a kontner programozsval is megismer-
kednk. Kontnerekkel a knyv VI. rsze foglalkozik.
346 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

A program terve
Az OTP, valamint az gyfelek szmli nyilvnvalan objektumok lesznek. Az OTP feladata
lesz a befektetsi szmlk kezelse. Az gyfelek aktorok, akiket az OTP megkrdez, mit
szeretnnek: vsrolni, eladni stb.

A program terve (egyttmkdsi s osztlydiagramja) a 17.3. brn lthat. Az otp osztlya


Bank. Ebben az osztlyban helyezzk el az indul main() metdust, s itt fogjuk ltrehozni az
otp objektumot a Bank osztly teht ltrehoz egy pldnyt sajt magbl. Az otp kt
JoSzerencse osztly objektummal (befektetsi szmlval) ll kapcsolatban. A szmla
objektum feladata, hogy megjegyezze a szmln lv befektetsi jegyek darabszmt, s lebo-
nyoltsa az eladsokat, illetve vsrlsokat. Az otp indulsknt ltrehozza a kt szmlt,
ezutn felkrjk a menu() vgrehajtsra. A menbl az otp sajt magt kri meg az
ugyfelKiszolgalas() elvgzsre. Az egyttmkdsi diagramon kt osztlyt is elhelyez-
tnk: a Bank osztly azrt szerepel a diagramon, mert a program futsa a benne lev main()
osztlymetdussal kezddik; a JoSzerencse osztlyra azrt van szksg, mert az brn
lthat utolsoSzamlaSzam, arfolyam, vasarKezKoltseg s eladKezKoltseg adatokat
jegyzi, s a setArfolyam(), getArfolyam() tevkenysgek elvgzsre t fogjuk fel-
krni. Az objektumokat az tlthatsg kedvrt bestttettk. Az objektumoknak s az osz-
tlyoknak az adatrszt is megjelentettk: vilgosan lthat, hogy a JoSzerencse osztly-
adatai (utolsoSzamlaSzam, arfolyam...) az osztlyban szerepelnek, mg a pldnyadatok
(szamlaszam, tulajdonos...) az egyes pldnyokban vannak jelen. A feladatok sztosztsa
az osztlyok kztt a kvetkez:

JoSzerencse osztly osztlylers


Adatok
utolsoSzamlaSzam:long Indul sorszm: 10000. Osztlyadat, mely az j szmlk
szmlaszmnak kiosztshoz szksges. Csak egyszer szerepel az osztlyban. Az j
szmla mindig az elzhz kpest eggyel nagyobb sorszmot kap.
arfolyam:double Osztlyadat, a befektetsi jegy aktulis rfolyama. Ha a jegyek
darabszmt megszorozzuk az rfolyammal, megkapjuk a szmln lev befektetsi
jegyek pillanatnyi rtkt forintban.
vasarKezKoltseg=200, eladKezKoltseg=400 Osztlyadatok: kezelsi kltsg
vsrlskor, illetve eladskor.
szamlaSzam:long A szmla szma. Az objektum lete sorn nem vltoztathat.
tulajdonos:String A szmla tulajdonosnak neve.
kedvezmenyezett:String A szmla kedvezmnyezettjnek a neve. kapja meg az
sszeget, ha a tulajdonossal trtnik valami.
jegyDb:long A szmln lv befektetsi jegyek szma. Vsrlskor s eladskor vl-
tozik.
17. Osztly ksztse 17.3. Msodik mintaprogram Bank s a Jszerencse 347

Egyttmkdsi jegyDb(...)
JoSzerencse
diagram: ertek(...)
utolsoSzamlaSzam=10002
arfolyam=1.03
vasarKezKoltseg=200 :JoSzerencse
eladKezKoltseg=400 szamlaszam=10001
szamla1
tulajdonos="Arany Dniel"
getArfolyam() kedvezm. ="Ezst Hajnalka"
main(...) Bank()
setArfolyam() jegyDb=5
menu()
JoSzerencse("Arany Dniel")
Bank otp:Bank vasarlas(10000)
eladas(50000)
:JoSzerencse
ugyfelKiszolgalas(szamla) szamlaszam=10002
jelentes() tulajdonos="Fejr Lipt"
szamla2 kedvezmenyezett=""
gyfl jegyDb=34

Informcihordoz
JoSzerencse
-utolsoSzamlaSzam: long = 10000
Osztlydiagram:
-arfolyam: double = 1.03
-vasarKezKoltseg, eladKezKoltseg: int
-szamlaSzam: long
Kontroll -tulajdonos, kedvezmenyezett: String
Bank -jegyDb: long

+JoSzerencse (tulajdonos, kedvezmenyezett)


+Bank() +JoSzerencse (tulajdonos)
2
+ugyfelKiszolgalas(szamla) +getArfolyam(): double
+jelentes() +setArfolyam(arf)
+menu() +jegyDb(ertek): long
+main(...) +ertek(jegyDb): long
+getJegyDb(): long
+ertek(): long
+vasarlas(osszeg): long
+eladas(osszeg): long
+toString(): String

17.3. bra. A Bank program terve


348 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

Konstruktorok
JoSzerencse(tulajdonos:String, kedvezmenyezett:String) Nyit egy J-
szerencse befektetsi szmlt a megadott tulajdonos s kedvezmnyezett nevvel. A
szmla sorszmt a program adja, automatikusan az elzleg megnyitott szmla szm-
nl eggyel nagyobbat. A jegyDb indulskor 0.
JoSzerencse(tulajdonos:String) Mint az elz, csak nincs kedvezmnyezett.

Metdusok
getArfolyam():double Osztlymetdus. Visszaadja az aktulis rfolyamot.
setArfolyam(arf:double) Osztlymetdus. Belltja az aktulis rfolyamot.
jegyDb(ertek:long):long Osztlymetdus. Megadja, hogy egy adott rtk sszeg
hny darab jegyet r az aktulis rfolyamon.
ertek(jegyDb:long):long Osztlymetdus. Megadja, hogy az adott darabszm
jegynek mennyi az rtke az aktulis rfolyamon.
getJegyDb():long Visszaadja a szmln lev jegyek darabszmt.
ertek():long Visszaadja a szmla aktulis rtkt.
vasarlas(osszeg:long):long Az gyfl befektetsi jegyet vsrol ezrt az ssze-
grt. A metdus visszatrsi rtke a tnylegesen befizetend sszeg (a kerekts miatt).
eladas(osszeg:long):long Az gyfl befektetsi jegyet ad el ezrt az sszegrt. A
metdus visszatrsi rtke a tnylegesen kifizetett sszeg (a kerekts miatt).
toString():String Megadja az objektum szveges reprezentcijt.

Bank osztly osztlylers


Adatok: Nincsen adat. A bank kapcsolatban ll kt befektetsi szmlval a kapcsolatokat a
forrskdban referencikkal valstjuk meg, ezeket a terven nem kell adatknt feltntetni.

Metdusok:
Bank() Konstruktor. Ltrehozza a kt Jszerencse objektumot, vagyis szmlt nyit
kt gyfelnek.
ugyfelKiszolgalas(szamla:JoSzerencse): Kiszolgl egy gyfelet a paramter-
ben megadott szmla alapjn. Megkrdezi, hogy vsrls lesz-e vagy elads, bekri a
vsrolni vagy eladni kvnt sszeget. Mdostja a szmlt, s kirja a tnylegesen
befizetend vagy kifizetend sszeget.
jelentes() Kirja az aktulis rfolyamot s a szmlk szveges reprezentciit (a
toString-ben megadott, az objektumra jellemz adatokat).
menu() Ki lehet szolglni az 1. vagy a 2. gyfelet, jelentst lehet krni, vagy rfolya-
mot lehet mdostani. Minden vlaszts eltt az otp jelentst ad a szmlkrl.
main(...) Sajt magbl ltrehoz egy pldnyt, az otp:Bank objektumot, majd meg-
hvja annak menu() metdust.
17. Osztly ksztse 17.3. Msodik mintaprogram Bank s a Jszerencse 349

Forrskd
import extra.*;
class JoSzerencse {
private static long utolsoSzamlaSzam = 10000;
private static double arfolyam = 1.03;
private static int vasarKezKoltseg = 200;
private static int eladKezKoltseg = 400;
private long szamlaSzam;
private String tulajdonos, kedvezmenyezett;
private long jegyDb;
public JoSzerencse(String tulajdonos,String kedvezmenyezett){
szamlaSzam = ++utolsoSzamlaSzam;
this.tulajdonos = tulajdonos;
this.kedvezmenyezett = kedvezmenyezett;
jegyDb = 0;
}
public JoSzerencse(String tulajdonos) {
this(tulajdonos,"");
}
public static double getArfolyam() {
return arfolyam;
}
public static void setArfolyam(double arf) {
if (arf>=0)
arfolyam = arf;
}
public static long jegyDb(long ertek) {
return (long)(ertek/arfolyam);
}
public static long ertek(long jegyDb) {
return (long)(jegyDb*arfolyam);
}
public long getJegyDb() {
return jegyDb;
}
public long ertek() {
return ertek(jegyDb);
}
public long vasarlas(long osszeg) {
long db = jegyDb(osszeg);
jegyDb += db;
return ertek(db)+vasarKezKoltseg; // a befizetend sszeg
}
public long eladas(long osszeg) {
long db = jegyDb(osszeg);
jegyDb -= db;
return ertek(db)-eladKezKoltseg; // a kifizetend sszeg
}
350 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

public String toString() {


return "Szmlaszm: "+szamlaSzam+
" Tulajd.: "+Format.left(tulajdonos,15)+
" Kedv.: "+Format.left(kedvezmenyezett,15)+
" Jegyszm: "+Format.right(jegyDb,8)+
" rtk: "+Format.right(ertek(),8);
}
}

public class Bank {


private JoSzerencse szamla1, szamla2;
public Bank() {
szamla1 = new JoSzerencse("Arany Dniel","Ezst Hajnalka");
szamla2 = new JoSzerencse("Fejr Lipt");
}
public void ugyfelKiszolgalas(JoSzerencse szamla) {
long osszeg;
System.out.println("\n"+szamla);
char valasz;
do {
valasz = Character.toUpperCase(
Console.readChar("V(srls)/E(lads) ?"));
} while (valasz!='V' && valasz != 'E');
if (valasz == 'V') {
osszeg=szamla.vasarlas(Console.readInt("Mennyirt vsrol?"));
System.out.println("Befizetend: "+osszeg+" Ft");
}
else {
osszeg=szamla.eladas(Console.readInt("Mennyirt ad el? "));
System.out.println("Kifizetend: "+osszeg+" Ft");
}
}
public void jelentes() {
System.out.println("\n*-*-*-*- JELENTS -*-*-*-*");
System.out.println("rfolyam : "+JoSzerencse.getArfolyam());
System.out.println(szamla1);
System.out.println(szamla2);
}
public void menu() {
char valasz;
do {
jelentes();
System.out.println("\n1: 1. gyfl kiszolglsa");
System.out.println("2: 2. gyfl kiszolglsa");
System.out.println("A: rfolyam mdosts");
System.out.println("V: Vge");
valasz = Character.toUpperCase(Console.readChar("?"));
switch (valasz) {
case '1': {
ugyfelKiszolgalas(szamla1);
break;
}
17. Osztly ksztse 17.4. Az osztly felptse, az osztly deklarcii 351

case '2': {
ugyfelKiszolgalas(szamla2);
break;
}
case 'A': {
JoSzerencse.setArfolyam(
Console.readDouble("j rfolyam: "));
break;
}
}
} while (valasz!='V');
}

public static void main(String[] args) {


Bank otp = new Bank();
otp.menu();
}
}

A program futst terjedelmi okokbl nem mellkeljk. Futtassa a programot!

17.4. Az osztly felptse, az osztly deklarcii

Az osztly egy fejbl s egy blokkbl ll:


Az osztly feje

<mdostk> class <OsztlyAzon> extends <OsztlyAzon>


implements <InterfszAzon> , <InterfszAzon> ...
{
<osztly blokk (az osztly deklarcii)>
}

Nzzk meg rszletesen elszr a fej alkotelemeit, majd az osztly deklarciit!

Osztly feje
Az osztly feje tartalmazza az esetleges mdostkat, a class kulcssz utn az osztly azono-
stjt, majd opcionlisan az extends kulcssz utn az s osztly azonostjt s az
implements kulcssz utn az implementland interfszek azonostit.

Osztlyfejek pldul:
class JoSzerencse
public class Bank
public final class System
public final class String implements java.io.Serializable,Comparable
352 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

Mdostk

Egy osztlynak a kvetkez mdosti lehetnek:


- Hozzfrsi mdostk: csak a public hasznlhat. Ha nem adunk meg semmit, akkor
alaprtelmezs szerint az osztly csak a sajt csomagjban lthat. Egy fordtsi egy-
sgben (Java forrsllomnyban) legfeljebb egy publikus osztly lehet.
- Egyb mdostk: Hasznlhat az abstract s a final. Egy absztrakt osztlyt nem
lehet pldnyostani (arra val, hogy rktssel tovbbfejlesszk). Ha egy osztly
final (vgleges), akkor azt nem lehet rkteni. Az abstract s a final kizrjk
egymst. rklssel a knyv 2. ktete foglalkozik majd.

extends <OsztlyAzon>

A deklarlt osztly az itt megadott OsztlyAzon-t terjeszti ki (belle szrmazik). Az


extends utn legfeljebb egy osztly adhat meg (egy osztlynak csak egy se lehet). A Java
sszes osztlya implicit mdon az Object osztlybl szrmazik, azt sosem kell megadni.

implements <InterfszAzon>[, <InterfszAzon> ...]


Az osztly implementlja a felsorolsban megadott interfszeket. Egy osztly tbb interfszt is
implementlhat. Interfszekkel a 20. fejezet foglalkozik.

Osztly blokkja, az osztly deklarcii

Osztly szint deklarci: kzvetlenl az osztly blokkjban lv deklarci.


Az osztly blokkja a kvetkez deklarcikat tartalmazhatja:
- osztlytagok (osztlyvltozk s osztlymetdusok);
- pldnytagok (pldnyvltozk s pldnymetdusok);
- konstruktorok;
- osztlyinicializl blokkok;
- pldnyinicializl blokkok;
- bels osztlyok;
A deklarcik sorrendje a blokkon bell tetszleges. rdemes azonban betartani a sor-
rendre vonatkoz kdolsi konvencikat, hogy a kd olvashatbb legyen. Egy ajnlott
deklarlsi sorrend a kvetkez (tbbfle ajnls is ltezik):
- vltozk elbb az osztly kapcsolatait szoks megadni;
- konstruktorok;
- metdusok elszr az adatkiolvas (get) s adatbellt (set) metdusokat szoks
megadni;
- main metdus, ha van.
17. Osztly ksztse 17.5. Osztlytag, pldnytag 353

A deklarcik fajtit a 17.4. bra mutatja. Az egyes deklarcikat kln pontok trgyaljk. A
bels osztlyokrl a 2. ktetben lesz sz.

Osztly szint deklarci

Osztlytag Pldnytag Konstruktor Osztly- Pldny- Bels


inicializl inicializl osztly
blokk blokk
Osztlyvltoz Pldnyvltoz

Osztlymetdus Pldnymetdus

17.4. bra. Az osztly szint deklarcik fajti

17.5. Osztlytag, pldnytag

Osztlytag vagy ms nven statikus tag (class member, static member): Az osztlyhoz
tartozik, s az osztly minden objektumra egyformn rvnyes. Az osztlytag mdostja
static. Az osztlytag lehet
- osztlyvltoz vagy ms nven statikus vltoz (class variable, static variable): az
osztlyhoz tartoz vltoz, az egyes pldnyokban nem jelenik meg.
- osztlymetdus vagy ms nven statikus metdus (class method, static method): az
osztly sajt metdusa, mely csak az osztlytagokat ltja.
Pldnytag (instance member): A pldnyhoz tartozik, minden egyes pldnyra jellemz.
A pldnytagnak nincs static mdostja (innen ismerhet fel). A pldnytag lehet:
- pldnyvltoz (instance variable): minden pldnyban kln szerepel, rtke a pl-
dny llapotra jellemz.
- pldnymetdus (instance method): a megszltott pldnyon dolgozik, mely az
osztly- s pldnytagokat egyarnt ltja.

Tag (member): az osztlytagok s pldnytagok kzs neve. Osztlyon bell egy osztly-
tag csak az osztlytagokat ltja, a pldnytag minden tagot lt.
354 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

A tagok mdosti
A tagok eltt megadhatk hozzfrsi s egyb mdostk:
Hozzfrsi mdostk (accessibility modifiers):
public: mindenhonnan el lehet rni.
protected: kizrlag ebbl az osztlybl s az osztly utdaibl lehet elrni.
private: kizrlag csak ebbl az osztlybl lehet elrni.
Ha egyiket sem adjuk meg, akkor alaprtelmezs szerint a sajt csomagjban brki elr-
heti, de ms csomagbl nem lthat (csomagszint hozzfrs, package accessibility).
Egyb mdostk:
static: osztlytag.
final: vgleges, nem vltoztathat.
abstract (csak metdusra alkalmazhat): res metdus, ezt majd egy utdosztlyban
kell kifejteni.

Megjegyzs:
Van mg nhny mdost, ezekkel egyelre nem foglalkozunk:
- transient s volatile (csak vltozkra alkalmazhatk);
- native s synchronized (csak metdusokra alkalmazhatk).

A JoSzerencse osztlytagjai

A JoSzerencse osztlyban tbbek kztt a kvetkez osztlytagok tallhatk:


private static long utolsoSzamlaSzam = 10000;
private static double arfolyam = 1.03;
public static boolean setArfolyam(double arf) {
if (arf>=0)
arfolyam = arf;
}

Az utolsoSzamlaSzam s arfolyam adatok teht csak a JoSzerencse osztlyban szere-


pelnek, az osztly pldnyaiban nem. Ezek a pldnyok kzs adatai: az utolsoSzamlaSzam
tartalmazza az utolsknt kiadott szmlaszmot, ebbl szmtja ki a szlet pldny sajt
szmlaszmt; az arfolyam a mindenkori, minden szmlra vonatkoz rfolyam minden
pldny ezt hasznlja a szmla, illetve a vsrolt/eladott jegyek rtknek kiszmtsakor. Az
rfolyamot a setArfolyam(double arf) osztlymetdus segtsgvel lehet megvltoztatni.

A JoSzerencse pldnytagjai

A JoSzerencse osztlyban tbbek kztt a kvetkez pldnytagok tallhatk:


private long szamlaSzam;
private String tulajdonos, kedvezmenyezett;
private long jegyDb;
17. Osztly ksztse 17.6. Azonost, hivatkozsi kr, takars 355

public long getJegyDb() {


return jegyDb;
}

public long vasarlas(long osszeg) {


long db = jegyDb(osszeg);
jegyDb += db;
return ertek(db)+vasarKezKoltseg; // a befizetend sszeg
}

A jegyDb pldnyadat: minden egyes szmlban kln rtkkel szerepel, vagyis minden gy-
flnek ms darabszm jegy van a szmljn. A getJegyDb() pldnymetdus, amely vissza-
adja a jegyDb rtkt. Egy osztlymetdus, mint pldul a setArfolyam() nem ltja a
jegyDb-t (nem is tudn, melyik szmlba kukkantson bele a sok kzl). A vasarlas()
metdus minden tagot lt: a jegyDb pldnyvltozt, a vasarKezKoltseg osztlyvltozt s
az ertek(long jegyDb) osztlymetdust. Megjegyzend, hogy az osztly kt rtk()
metdust is deklarl: egy osztlymetdust, amely a paramterknt megadott darabszm
befektetsi jegyek rtkt adja meg; s egy pldnymetdust, amelynek nincsen paramtere, s
az objektum sajt befektetsi jegyeinek az rtkt szmolja ki.

17.6. Azonost, hivatkozsi kr, takars

Az egyes deklarcikra a kvetkez szablyok szerint lehet hivatkozni:


- A metdus blokkjbl hivatkozni lehet az osztly brmely tagjra (osztlymetdusbl
csak osztlytagra).
- Egy adattag csak a fizikailag eltte deklarlt tagokra hivatkozhat (osztlyadat csak
osztlyadatra).
- Egy metdus loklis vltozjra csak az t deklarl metdus hivatkozhat.

Pldul a vasarlas() pldnymetdus hivatkozik a jegyDb pldnyadatra, a jegyDb() s


ertek() statikus metdusokra. Az osszeg paramter, a db loklis vltoz:
public long vasarlas(long osszeg) {
long db = jegyDb(osszeg);
jegyDb += db;
return ertek(db)+vasarKezKoltseg; // a befizetend sszeg
}

Az osztlyban ugyanazon a nven deklarlhat metdus s vltoz, st a metdusok tlter-


helhetk.

Helyes lenne pldul a kvetkez kdrszlet:


356 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

class JoSzerencse {
int joSzerencse; //1

int joSzerencse() { //2


int joSzerencse = this.joSzerencse; //3
return joSzerencse; // a loklis deklarcit adja vissza
}
...
}

//1-ben a joSzerencse osztly szint vltoz; //2-ben a joSzerencse() osztly szint met-
dus; //3-ban a joSzerencse loklis vltoz, mely takarja az azonos nev pldnyvltozt.

A loklis vltozk eltakarjk az ugyanolyan nev osztly-, illetve pldnyvltozkat. Ha


az osztly deklarcijra szeretnnk hivatkozni, akkor osztlyvltoz esetn az osztly
nevvel, pldnyvltoz esetn pedig a this referencival kell azt minstennk.

Pldul:
class Proba {
int szam=1; //1
static char kar='A'; //2

void proba(){ //3


int szam=2; //4
char kar='B'; //5

System.out.println(szam); //6 -> 2


System.out.println(this.szam); //7 -> 1
System.out.println(kar); //8 -> B
System.out.println(Proba.kar); //9 -> A
}
}

//6 a metdus sajt szam loklis vltozjt rja ki a konzolra. Ha az osztly szint szam pl-
dnyvltozt szeretnnk kirni, akkor azt a this objektumreferencival kell minstennk
(//7).

//8 a metdus sajt kar loklis vltozjt rja ki a konzolra. Ha az osztly szint kar osztly-
vltozt szeretnnk kirni, akkor azt a Proba osztlynvvel kell minstennk (//9).

A vltoz takarsa kerlend, hiszen a program olvashatsga ettl ersen romlik!


17. Osztly ksztse 17.7. Vltozk alaprtelmezs szerinti kezdeti rtkei 357

17.7. Vltozk alaprtelmezs szerinti kezdeti rtkei


Ha a vltoz osztlyszinten van deklarlva, vagyis osztlytag vagy pldnytag, akkor a rend-
szer a vltozhoz rendel egy alaprtelmezs szerinti kezdeti rtket. Ez az rtk minden eset-
ben nullaszer, vagyis a memriaterlet csupa 0 bit: boolean esetn false, char esetn
\u0000, szm esetn pedig 0, referencia esetn null. Ha a vltoz loklis, vagyis metdus-
ban van deklarlva, akkor szletsekor rtke definilatlan lesz attl fggetlenl, hogy tpusa
primitv vagy referencia. A vltozk alaprtelmezs szerinti kezdeti rtkeit a 17.5. bra fog-
lalja ssze.

Osztlyvltoz, pldnyvltoz Loklis vltoz


(nullaszer kezd. rtk)

Primitv tpus vltoz boolean: false; Definilatlan


char: '\u0000'; szm: 0
Referencia tpus vltoz null Definilatlan

17.5. bra. A vltozk alaprtelmezs szerinti kezdeti rtkei

17.8. A this objektumreferencia


Amikor egy pldnymetdust megrunk, objektumnak mg hre sincs. Az osztlyt tartalmaz
egysget mr rg lefordtottuk de mg mindig nincs objektum. Milyen adatra hivatkozik ht a
metdus? Azt mondtuk egszen eddig, hogy a pldnymetdus minden esetben a hvott objek-
tum adatain dolgozik. s ez gy is van. Igen m, de vajon honnan tudjuk a metdusban, hogy
most ppen melyik objektum van tertken?! Az osztly egysgnek fordtsakor mg azt
sem tudjuk biztosan, hny objektum lesz a programban!
A technikai megvalsts borzaszt egyszer: minden pldnymetdusnak van egy utols,
rejtett paramtere, a this (ez), amely a hvott objektum referencija, tpusa pedig maga az
osztly. Egy pldnymetdus minden esetben a this objektumon dolgozik. Ha a megszltott
objektum a szamla1, akkor a szamla1 cme kerl a this vltozba, ha a megszltott
objektum a szamla2, akkor a this rtke szamla2 lesz. A metdus blokkjban pedig a for-
dtprogram minden olyan pldnytag el, amely nem objektumreferencival kezddik, egy-
szeren odateszi a this referencit, biztostva ezzel azt, hogy minden, ami a metdus belsej-
ben trtnik, az aktulis objektumra vonatkozzk. A JoSzerencse osztly vasarlas()
metdusnak rejtett paramtere a this:JoSzerencse. A pldnyadatok s pldnymetdu-
sok a this objektumra vonatkoznak. A vastagon szedett rszek csak magyarzat cljbl
vannak a forrskdban:
358 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

public long vasarlas(long osszeg, JoSzerencse this) {


long db = jegyDb(osszeg);
this.jegyDb += db;
implicit paramter
return ertek(db)+vasarKezKoltseg;
} (a fordt gy ltja)

A this implicit paramter nem ms, mint memriacm, amely a megszltott objektum
referencija. Egy pldnymetdus innen tudja, hogy ppen melyik pldnyon dolgozik (a
this ltal mutatott objektumon). Egymsbl hvott metdusok esetn a this automatiku-
san tovbbaddik.

A toString() pldnymetdus pldul tovbbadja a this rtkt, amikor meghvja az


ertek() pldnymetdust:
public long ertek(JoSzerence this) {
return ertek(this.jegyDb);
}
public String toString(JoSzerence this) {
return "Szamlaszm: "+this.szamlaSzam+
" Tulajd.: "+Format.left(this.tulajdonos,15)+
" Kedv.: "+Format.left(this.kedvezmenyezett,15)+
" Jegyszm: "+Format.right(""+this.jegyDb,8)+
" rtk: "+Format.right(""+this.ertek(this),8);
}

17.9. Konstruktorok

Amikor egy objektumot a new opertorral ltrehozunk, akkor azt inicializlni kell. A konst-
ruktor elsdleges feladata az objektum kezdeti llapotnak (adatainak s kapcsolatainak)
belltsa, felptse.
A konstruktor ltalnos szintakszisa: a konstruktor feje

<mdostk> <OsztlyAzonost>( <formlis paramterlista> )


{
<konstruktor blokkja>
}
A konstruktor hasonlt a metdushoz a kvetkez szablyok rvnyesek r:
- A konstruktor neve ktelezen megegyezik az osztly nevvel.
- Csak a new opertoral hvhat. Konstruktorral nem lehet jra inicializlni egy objektu-
mot.
- A mdostk kzl csak a hozzfrsi (lthatsgi) mdostk hasznlhatk.
- A konstruktor tlterhelhet.
- A konstruktornak nincs visszatrsi rtke, s nem is void.
- A konstruktor nem rkldik.
17. Osztly ksztse 17.9. Konstruktorok 359

Alaprtelmezs szerinti konstruktor

Ha egy osztlyban nem adunk meg explicit mdon konstruktort, akkor az osztlynak lesz
egy alaprtelmezs szerinti (default), paramter nlkli konstruktora. Ha teht az
osztlyban nem adtak meg konstruktort, akkor a pldny ltrehozsakor a rendszer ezt az
alaprtelmezs szerinti konstruktort hvja meg. Az objektum adatai ekkor az alaprtelmez-
sek szerint lesznek belltva.
Ha az osztlyban ltezik egy akrmilyen explicit konstruktor (akr paramteres, akr para-
mter nlkli), akkor az osztlynak nem lesz implicit, alaprtelmezs szerinti konstruktora.

Tekintsk a kvetkez deklarcit:


class Kor { // Kr
private double atmero;
public double getAtmero() { return atmero; }
public void setAtmero(double a) { atmero = a; }
public double terulet() {
return Math.pow(atmero/2,2)*Math.PI;
}
}

Br a Kor osztly nem definil konstruktort, mgis ltrehozhat Kor objektum a new opertor-
ral. A kr tmrje ebben az esetben indulskor 0 lesz; rtkt a setAtmero() metdussal
vltoztathatjuk meg:
Kor kor = new Kor();
kor.setAtmero(5);

A kvetkez pldban az alaprtelmezs szerinti konstruktor hasznlata fordtsi hibt eredm-


nyez, mivel deklarltunk egy msik, paramteres konstruktort:
class Kor {
private double atmero;

public Kor(double atmero) { this.atmero = atmero; }


public double getAtmero() { return atmero; }
public void setAtmero(double a) { atmero = a; }
public double terulet() {
return Math.pow(atmero/2,2)*Math.PI;
}
}

Kor kor = new Kor(5);


// Kor kor = new Kor(); Fordtsi hiba!!!

Ha deklarlunk paramteres konstruktort, s ezenkvl szksgnk van paramter nlkli


konstuktorra is, akkor azt meg kell rnunk.
360 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

A konstruktor tlterhelse

A konstruktorok ugyangy tlterhelhetk, mint ms metdusok. Egy objektum gy tbb-


flekppen is inicializlhat.
Ha egy osztly tbb konstruktort definil, akkor az egyik konstruktorbl annak els
utastsaknt meghvhat egy msik konstruktor a this referencia segtsgvel. A this
ekkor eljrsknt hajtdik vgre:
this(paramterek)

Pldul:
public JoSzerencse(String tulajdonos,String kedvezmenyezett) {
szamlaSzam = ++utolsoSzamlaSzam;
this.tulajdonos = tulajdonos;
this.kedvezmenyezett = kedvezmenyezett;
jegyDb = 0;
}

public JoSzerencse (String tulajdonos) {


this(tulajdonos,"");
}

...
szamla1 = new JoSzerencse("Arany Dniel","Ezst Hajnalka");
szamla2 = new JoSzerencse("Fejr Lipt"); // nincs kedvezm.

Konstruktorok rsakor is kerljk a redundancit! Tipp: Az adatokat a tbb paramteres


konstruktor lltsa be, a tbbi konstruktor pedig ezt a konstruktort hvja meg!
Vannak esetek, amikor nincs rtelme egy osztlybl pldnyt ltrehozni (pldul csak osztly-
tagjai vannak). Ilyenkor az osztly rja letilthatja a pldnyostst. A letiltst gy vgezhetjk
el, hogy az osztlyban runk egy paramter nlkli konstruktort, s annak privt lthatsgot
adunk, mert gy nem rvnyes tbb az alaprtelmezett publikus konstruktor. Ilyen osztly
pldul a java.lang.Math.

17.10. Inicializlk
Inicializlk segtsgvel bellthat az osztlyok s objektumok kezdeti llapota, s elvgez-
hetk egyb, tetszleges kezdeti tevkenysgek. Objektumok esetn e funkcikat a konstruktor
is el tudja ltni; lehetsg szerint azt hasznljuk! Osztlyok esetn a kezdeti tevkenysgek
automatikus elvgzsre csak az inicializl alkalmas. Az inicializlk lehetnek kifejezsek
vagy blokkok.
17. Osztly ksztse 17.10. Inicializlk 361

Inicializl kifejezs

Inicializl kifejezssel egy vltoznak, illetve konstansnak adhatunk kezdeti rtket. A


kifejezs kirtkelse
- osztlytag esetn az osztly betltsekor;
- pldnytag esetn az objektum szletsekor (a new opertor vgrehajtsakor) trtnik
meg.
Az inicializl kifejezs a vltoz, illetve a konstans deklarcijnak a rsze.
Egyb szablyok:
- Az inicializl kifejezsek a deklarls sorrendjben kerlnek kirtkelsre; elbb az
osztly, aztn a pldnytagok inicializl kifejezsei.
- A kifejezsben csak a kifejezs eltt szerepl deklarcikra hivatkozhatunk.
- Osztlytagokbl nem hivatkozhatunk pldnytagokra.

Pldul:
class Tanulo1 {
static int alapTandij = 2000;
double atlag = Console.readDouble("tlag: ");
int tandij =
alapTandij + (int)Math.round(3000*(5-atlag));
// ...
public void print() {
System.out.println("Tandj: "+tandij);
}
}

Pldnkban az alapTandij osztlyvltoz; ez egyetlenegyszer kap rtket, mgpedig a prog-


ram indulsakor, amikor az osztly betltdik. Az atlag s tandij vltozk pldnyonknt
szerepelnek, azok az egyes objektumok ltrehozsakor kapnak rtket.

Inicializl blokk

Egy osztlyt az osztlyinicializl blokk, egy pldnyt pedig a pldnyinicializl blokk


segtsgvel inicializlhatunk. Az inicializl blokk olyan programkd, amely az osztly,
illetve a pldny letben egyetlenegyszer, els tevkenysgknt fut le. Egy osztlyban
akrhny osztly-, illetve pldnyinicializl blokk deklarlhat, azok elvileg brhol szere-
pelhetnek, s tetszleges kdot tartalmazhatnak.
- Osztlyinicializl blokk (statikus inicializl blokk): Egyetlenegyszer, az osztly
betltsekor hajtdik vgre. Az osztlyinicializl blokkot osztly szint vltozk inici-
alizlsra szoktk hasznlni. Az osztlyinicializl blokk egyszer blokk (csak egy {}
zrjelpr; nincs feje), melyet a static kulcssz vezet be.
362 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

- Pldnyinicializl blokk: Pldnyonknt egyszer, a pldny szletsekor hajtdik


vgre. A pldnyinicializl blokkot elssorban a pldny szint vltozk inicializl-
sra szoktk hasznlni. A pldnyinicializl blokk egyszer blokk, mely eltt nem
szerepel a static kulcssz.
Elbb az osztlytagok aztn a pldnytagok inicializl blokkjai kerlnek vgrehajtsra, a
deklarls sorrendjben. Az inicializl blokkok csak olyan deklarcikra hivatkozhatnak,
amelyek fizikailag a blokk eltt szerepelnek.

Pldaknt az elz, Tanul1 osztlyt trjuk gy, hogy az osztly- s pldnyvltozk iniciali-
zlst most a kifejezsek helyett statikus, illetve pldnyinicializl blokkok vgzik el:
class Tanulo2 {
static int alapTandij;
double atlag;
int tandij;

// Osztlyinicializl blokk:
static {
alapTandij = 2000;
}
// Pldnyinicializl blokk:
{
atlag = Console.readDouble("tlag: ");
tandij = alapTandij + (int)Math.round(3000*(5-atlag));
}
// ...
public void print() {
System.out.println("Tandj: "+tandij);
}
}

Az inicializls sorrendje
Mindenekeltt az osztlyadatok kapnak kezdeti rtket:
- elszr felveszik az alaprtelmezs szerinti rtkeket, majd
- kirtkeldnek az osztlyinicializl kifejezsek, majd lefutnak az osztlyinicializl
blokkok a deklarls sorrendjben.
Egy objektum szletsekor az objektum adatai a kvetkez szablyok szerint kapnak
kezdeti rtket:
- elszr felveszik az alaprtelmezs szerinti rtkeket, aztn
- kirtkeldnek az inicializl kifejezsek, majd lefutnak a pldnyinicializl blokkok
a deklarls sorrendjben;
- vgl sorban lefutnak az esetlegesen egymst hv konstruktorok.
17. Osztly ksztse 17.10. Inicializlk 363

Tesztkrdsek

17.1. Jellje meg az sszes szintaktikailag helyes osztlyfejet!


a) class public Kalitka extends Lakas
b) final public class
c) class LakoTelep
d) public class Bohoc implements Comparable

17.2. A kvetkez fogalmak kzl jellje meg az osztly szint deklarcikat!


a) osztlyvltoz
b) loklis vltoz
c) formlis paramter
d) pldnyinicializl blokk
17.3. Tekintse a kvetkez tagdeklarcikat:
double d; //1
static double d; //2
double m() { return d; } //3
static double m() { return d; } //4

Jellje meg az sszes helyes lltst a kvetkezk kzl!


a) A //1 s a //3 deklarcik nem lehetnek egy osztlyban.
b) A //2 s a //4 deklarcik nem lehetnek egy osztlyban.
c) A //1 s a //4 deklarcik nem lehetnek egy osztlyban.
d) A //2 s a //3 deklarcik nem lehetnek egy osztlyban.
17.4. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) A this az osztlymetdus implicit paramtere.
b) A this a megszltott objektum referencija.
c) A this osztlya minden esetben egy Object.
d) Egymsbl hvott pldnymetdusok esetn a this automatikusan tovbbaddik.
17.5. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) A konstruktor feladata, hogy belltsa az objektum kezdeti llapott.
b) A konstruktor fejben a mdostk kzl csak hozzfrsi mdost adhat meg.
c) A konstruktor visszatrsi rtke boolean.
d) A konstruktor neveknt ajnlatos az osztly nevt adni, de ez nem ktelez.
17.6. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) Egy statikus metdus meghvhatja ugyanazon osztly egy nem statikus metdust a
this kulcssz segtsgvel.
b) Az osztly sszes pldny- s osztlymetdusa hvskor tad egy implicit this
paramtert.
c) Minden objektumban helyet kap az a vltoz, amelynek van static mdostja.
d) Minden objektumban helyet kap az a vltoz, amelynek nincs static mdostja.
364 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

17.7. Jellje meg az sszes helyes lltst a kvetkezk kzl!


a) A konstruktor tlterhelhet.
b) Az osztly konstruktorbl meghvhat az osztly egy msik, tlterhelt konstruktora,
annak nevre val hivatkozssal.
c) Egy osztlynak minden esetben van egy paramter nlkli konstruktora.
d) A konstruktor visszatrsi rtke void.
17.8. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) Ha az osztlynak nincs explicit konstruktora, akkor a rendszer megad egy alaprtel-
mezs szerinti, paramter nlkli konstruktort.
b) A konstruktor lehet final.
c) Az osztly konstruktorbl meghvhat az osztly egy msik, tlterhelt konstruktora
a this referencia segtsgvel.
d) A konstruktor blokkja lehet res.
17.9. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) Az osztlyinicializl blokk belltja az objektum kezdeti rtkeit.
b) Az inicializlk kzl elszr futnak le az osztlyinicializlk, s csak azutn kerl-
nek vgrehajtsra a pldnyinicializlk.
c) Egy objektum ltrehozhat sajt osztlybl, de csak osztlymetdusbl.
d) Az osztly brmely pldnymetdusbl meghvhat a main metdus.

Feladatok
A kvetkez feladatspecifikcik alapjn tervezze meg, s kdolja le a programokat! A terv-
hez ksztse el az osztlydiagramot s legalbb egy egyttmkdsi diagramot!

17.1. (A) A bor vilgnapjn egy kis falu vezetsge gy dnt, hogy egy teljes 100 literes
hord bort kioszt az arra jr borkedvelknek, mindenkinek, akinl ppen van a bor
trolsra alkalmas edny. A borkedvel megmondja, hny litert akar (lehet trt rtk
is), s a csaplros mris kitlti a krt mennyisget. Ha nincs annyi bor mr a hordban,
akkor sajnlkozunk, s egyltaln nem adunk. Minden oszts eltt rjuk ki informci-
knt a hord kapacitst s az aktulis mennyisget! Az osztogats addig folyik, amg
mg legalbb egy deci bor marad a hordban. (BorFesztival.java)
17.2. (A) A fejezet 2. pontjban megadott raktrprogramot egsztse ki gy, hogy a program-
ban kt ru szerepel: paradicsom s paprika. Hol paradicsombl, hol paprikbl vesznk
ki, illetve tesznk be egy adott mennyisget. Kzben brmelyik runak megvltoztathat-
juk az egysgrt. (RaktarProgram2.java)

17.3. Ksztse el az 5. fejezet 7. pontjban trgyalt Ember osztlyt! Az embernek van pozci-
ja s irnyszge, s a kvetkez zenetek kldhetk neki: megy(tv), elmegy(x,y)
s fordul(szg). A ltrehozskor minden adat legyen megadhat, de egyik adat meg-
adsa se legyen ktelez! Ezutn
17. Osztly ksztse 17.10. Inicializlk 365

a) (A) programozza be Jnost az ott megadott mdon! Ellenrizze llapotait!


b) (B) hozzon ltre az Ember osztlybl egy Gerg azonostj embert! Kezdeti poz-
cija legyen (30,5), irnyszge pedig 120! Kvesse vgig Gerg llapott, ha a
kvetkez zeneteket kapja: megy(10), fordul(120), megy(13), elmegy(0,0)!
c) (B) hozza ltre Gergt s Annt tetszleges llapotokkal, s utastsa ket a kvetke-
zkre: Forduljanak meg! Menjenek a 0 irnyban 3 egysget! Forduljanak egyms
fel! (Emberek.java)

17.4. (B) Ksztsen egy osztlyt az ra brzolsra (ra, perc msodperc)! Hozzon ltre kt
rt s hasznlja ket: krdezze le az rt, lltsa t be egy adott idre, lltsa elrbb/
htrbb egy adott idvel! (Ora.java)

17.5. (B) Ksztsen egy osztlyt a komplex szmok brzolsra! Szmoljon a komplex
objektumokkal! (Komplex.java)

17.6. (C) Egy asztalosmhelyben plcikkat eszterglnak. Ktfle tpus gppel dolgoznak,
ezek a megadott mretre esztergljk a plcikkat. A mretek (tmr, magassg) a
kvetkezk:
kicsi: 0.6*5 cm;
nagy: 1.2*13 cm.
A plcikk mindig egyfle, az ppen raktron lev faanyagbl kszlnek. Ksztsnk
olyan programot, amely a klnbz tpus plcikkhoz cmkket gyrt! A cmkken a
kvetkez adatoknak kell szerepelnik: a plcika tpusa (kicsi vagy nagy), tmrje,
magassga, trfogata, a fa neve s fajslya, valamint a plcika slya. A cmke nyomta-
tsa eltt krdezzk meg a nyomtatand darabszmot! A cmkket ragads papr helyett
most konzolra nyomtatjuk.
A hozott fa alaprtelmezsben feny, melynek fajslya 0.7 gramm/cm3. Ezek az rtkek
azonban a klnbz szlltmnyok esetn megvltozhatnak. A fa adatait ezrt prog-
rambl llthatv kell tenni, s az tlltott rtk addig rvnyes, amg azt jra meg
adjk.
Menbl krhetjk a kvetkezket:
Cmkk nyomtatsa kicsi plcikatpusbl
Cmkk nyomtatsa nagy plcikatpusbl
A fa adatainak megadsa
Statisztika (melyik plcikatpushoz sszesen mennyi cmkt nyomtattunk)
Vge
A program legyen knnyen bvthet, mivel elkpzelhet, hogy egyb tpus cmkkre
is szksg lesz majd! (PalcikaCimkezo.java)
366 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE

17.7. (C) A fejezet 2. pontjban megadott raktrprogramot egsztse ki! Legyen most kt
raktr, s mindkt raktrban kt ru: paradicsom s paprika. Menbl vlaszthatan
tegye lehetv, hogy egyik raktrbl a msikba ttehessnk akr paradicsomot, akr
paprikt! Az egyes ruk rait is meg tudjuk vltoztatni. (KetRaktarProgram. java)
368 VI. RSZ. KONTNEREK
18. Tmbk 18.1. A tmb ltalnos fogalma 369

18. Tmbk

A fejezet pontjai:
1. A tmb ltalnos fogalma
2. Egydimenzis tmb
3. A tmb szekvencilis feldolgozsa
4. Gyjts
5. Ktdimenzis tmb
6. Tbbdimenzis tmb
7. A tmb tadsa paramterknt
8. A program paramterei
9. Feladat Szavazatkirtkels

A tmb fix elemszm, azonos tpus elemekbl ll sorozat (sszetett adatszerkezet), amely-
ben az elemek sorszmozhatk (indexelhetk), egyenknt manipullhatk. A Javban a tmb
elemei lehetnek akr primitv, akr referencia tpusak, s az index minden esetben egy 0-rl
indul egsz szm. A tmbk egymsba gyazhatk (a tmb eleme tmb is lehet) az
egymsba gyazsok szma a tmb dimenzija. A tmb rgztett elemszm sorozatok
kezelsre s az egysok kapcsolat megvalstsra egyarnt jl hasznlhat. A tmb egy
alacsonyszint kontner, melynek csak adatai vannak, nincsenek funkcii. A kvetkez fejezet
az egy-, kt- s tbbdimenzis tmbk hasznlatt mutatja be Javban.

18.1. A tmb ltalnos fogalma

A tmb azonos tpus elemek sorozata, ahol az elemek szma elre rgztett. A tmb
elemei indexelhetk, az elemekre az index segtsgvel hivatkozhatunk.

Egydimenzis tmb
Az egydimenzis tmb minden egyes elemhez egy egyrtelm indexrtk tartozik, amely
meghatrozza az elem tmbn belli helyt (18.1. bra). Az index tpusnak sorszmozhatnak
kell lennie. Az indextartomny kt hatrrtk kztti, s az indexek egyesvel nvekszenek.
370 VI. RSZ. KONTNEREK

Indexelsek pldul:
A matematikban az index ltalban egsz tpus, s az als hatr 1.
A Javban az index egsz tpus, s az als hatr minden esetben 0.

Megjegyzsek:
- Vannak olyan programozsi nyelvek (mint pldul a Pascal), amelyekben az index
brmilyen sorszmozott tpus lehet, s megadhat az indextartomny als s fels hatra.
Pldul: 1..20, -5..60000, A..Z.
- Matematikban az egydimenzis tmbt vektornak nevezzk.

Az egydimenzis tmb megadsa pszeudokddal:


<tmbAzonost>: <elemtpus>[<index>:tl..ig]

A kvetkez egydimenzis tmb pldul az v minden egyes hnapjhoz trolja a havi tlag-
hmrskletet (18.1. bra):
hmrs: number[h:1..12]

Ekkor:
A tmb azonostja: hmrs
A tmb elemeinek szma: 12
Az indextartomny als hatra: 1, fels hatra: 12
A tmb elemeinek tpusa: number
Elemek: hmrs[1]==12, hmrs[2]==15, ... hmrs[12]==22

h (index)

1. 2. 3. ... 12.
hmrs
12 15 14 22
(tmb)

hmrs[3]==14 (3. elem)

18.1. bra. Egydimenzis tmb

Az egyes elemek tpusuktl fggen manipullhatk. A tmb hasznlatban az a nagyszer,


hogy nem kell az elemeknek egyedi neveket kitallni, hanem egy gyjtnevet adunk az egsz
csoportnak (hmrs), s az egyes elemekre indexekkel hivatkozunk (hmrs[2] a februr
havi tlag hmrsklet).
18. Tmbk 18.1. A tmb ltalnos fogalma 371

Kt-, illetve tbbdimenzis tmb


A tmb elemei elvileg brmilyen tpusak, gy tmbk is lehetnek. Ha egydimenzis tmbket
mint elemeket egy tmbbe foglalunk, rgtn ktdimenzis tmbt kapunk. A hromdimenzis
tmb gy keletkezik, hogy tmbbe foglaljuk a ktdimenzis tmbket. Az egymsba gyazs-
nak elvileg nincs hatra a tmb dimenziinak szma elvileg korltlan. A ktdimenzis tmb
megadsa pszeudokd segtsgvel:
<tmbAzonost>:
<elemtpus>[<sorindex>:tl..ig][<oszlopindex>:tl..ig]

Tbbdimenzis tmbkkel egymsba gyazott, tbbszint indexels valsthat meg. A


tbbdimenzis tmb egy elemt egy indexhalmaz hatrozza meg. Minden egyes elemnek annyi
indexe van, ahny dimenzis a tmb.
A kvetkez ktdimenzis tmb pldul 10 ven keresztl az v minden hnapjra megadja a
havi tlaghmrskletet (18.2. bra):
hmrs: number[v:1..10][h:1..12]

Ekkor:
A tmb azonostja: hmrs
A tmb dimenzija: 2
Elemek: hmrs[1][1]==8, hmrs[1][12]==3, hmrs[10][1]==2,...
hmrs[10][12]==11 (A 10. v decemberben az tlag hmrsklet 11 fok volt.)

h (oszlopindex)
hmrs
(tmb) 1. 2. 3. ... 12.

1. 8 6 14 ... 3

hmrs[2] 2. -2 4 6 ... 6
(egy sor)
... ... ... ... ... ...

v (sorindex) 10. 2 3 13 ... 11

hmrs[2,3]==6 (2. sor 3. eleme)

18.2. bra. Ktdimenzis tmb


372 VI. RSZ. KONTNEREK

A 18.2. brn lthat hmrs ktdimenzis tmb ellltsa a kvetkezkppen kpzelhet el:
vesznk egy sort, melynek number tpus elemeit 1 s 12 kztt indexeljk. Ezutn vesznk
ilyen sorbl 10 darabot, s azokat 1-tl 10-ig indexeljk. A hmrs[2][3] a msodik sor har-
madik eleme. A ktdimenzis tmb egy teljes sorra is hivatkozhatunk: hmrs[2] a msodik
sort jelenti.
Pldk a ktdimenzis tmb alkalmazsra:
1990 s 2010 kztt vente s azon bell havonta szeretnnk gyjteni a berkezett
e-mailek szmt. Ekkor az egyik index lehet az v, a msik a h:
emailSzm: number[v:1990..2010][h:1..12]
Az 1998. 11. havi darabszmra gy hivatkozhatunk: emailSzm[1998][11].
Statisztikt szeretnnk kszteni arrl, hogy egy angol dokumentum egyes lapjain
milyen betbl hny szerepel (kis- s nagybetk kztt nem tesznk klnbsget).
Ekkor az egyik index a lap (1..lapokSzma), a msik index a bet (A..Z). A tmb elemei
egsz tpusak:
betkSzma: number[lap:1..lapokSzma][bet:'A'..'Z']
A 26. lapon tallhat A betk szma: betkSzma[26]['A']

Megjegyzsek:
- Matematikban a ktdimenzis tmbt mtrixnak nevezzk.
- A Javban a soroknak nem kell egyforma hossznak lennik.
- A Javban nem knyelmes, hogy az index csak nullrl indulhat. Az elbbi pldk kidol-
gozshoz az indexeket transzformlni kell!

18.2. Egydimenzis tmb

A Javban a tmb elemei brmilyen tpusak lehetnek, vagyis:


- primitv tpus, vagy
- referencia tpus (osztly tpus vagy tmb tpus).
Az elemek deklarlt tpusa azonos, de a referencia tpus vltozk utd tpus objektumo-
kat is azonosthatnak.

Tmb vltoz deklarlsa


A tmb referencia tpus vltoz, melyet deklarlnunk kell. Elszr megadjuk az elemek
tpust, ezt egy szgletes zrjelpr, a tmbkpz opertor kveti, vgl megadjuk a tmb
azonostjt. Az elemtpus lehet akr primitv, akr referencia. Az gy deklarlt vltoz
kpes egy megadott elemtpus tmbre mutatni:
<elemtpus>[] <tmbAzonost>; //1
A tmbkpz opertort a tmbazonost utn is tehetjk:
<elemtpus> <tmbAzonost>[]; //2
18. Tmbk 18.2. Egydimenzis tmb 373

Pldul:
int[] iArray1; // iArray1 egy tmb
int iArray2[]; // iArray2 is egy tmb!

Egy deklarciban a vesszvel elvlasztott azonostk mindegyikre a deklarci elejn


szerepl tpus vonatkozik. A kvetkez pldban iArray1, iArray2 s iArray3 tmbk,
de iArray4 csak egy egyszer int tpus vltoz!
int[] iArray1, iArray2; // iArray2 is tmb!
int iArray3[], iArray4; // iArray4 nem tmb!

Az iArray1 s az iArray2 vltozk egy-egy tetszleges mret, int elemtpus tmbre


kpesek mutatni (18.3. bra).

0. 1. 2. 3. 4.
iArray1 12 56 0 -9 26

0. 1. 2.
iArray2 2 98 10

18.3. bra. Tmbreferencia

A deklarlssal egyelre csak a referencinak (memriacmnek) foglaltunk helyet, ezen a pon-


ton mg nincs tmb. A tmbt kln ltre kell hoznunk.

A tmb ltrehozsa

A Javban a tmbt a program futsa kzben, a new opertorral hozhatjuk ltre. A new
utn meg kell adnunk az elemek tpust s a tmb mrett (az elemek szmt):
new <elemtpus> [<mret>]

A mret egy nem negatv, int tpus kifejezs. Maximum Integer.MAX_VALUE eleme
lehet a tmbnek.

Pldul:
new int[5] // mret:5 elemtpus:int
int k=20;
new double[k/3+1] // mret:k/3+1==7 elemtpus:double
new String[3] // mret:3 elemtpus:String
374 VI. RSZ. KONTNEREK

A new opertor ltrehozza a tmbt a memriban, s visszaadja a tmb referencijt, vagyis


memriabeli mutatjt. Ezt a referencit aztn rtkl adhatjuk egy olyan referencia tpus
vltoznak, amely egy ilyen tmbre kpes rmutatni:
int[] iArray;
double[] dArray;
String[] sArray;
iArray = new int[5];
dArray = new double[k/3+1];
sArray = new String[3];

A deklarcit s a ltrehozst egy lpsben is elvgezhetjk:


int[] iArray = new int[5];
double[] dArray = new double[k/3+1];
String[] sArrray = new String[3];

A tmb length konstansa

Minden tmb objektumnak van egy length konstansa (mdostja final), amely megadja a
tmb hosszt: tmbAzonost.length. A length rtke a tmb ltrehozstl kezdve
lland, azt nem lehet megvltoztatni. A tmb indexei 0 s length-1 kzttiek.

Megjegyzs: Vltoztathat mret kontnerknt az API Vector osztlyt fogjuk alkalmazni.

Indexels

A tmb egyes elemeire gy hivatkozhatunk:


<tmbAzonost>[index]
Az rvnyes indextartomny 0 s length-1 kztt van. Az ezen kvl es indexels
ArrayIndexOutOfBoundsException kivtelt vlt ki.

Pldul:
Az iArray tmb elemeinek feltltse:
int[] iArray = new int[5];
for (int i=0; i<iArray.length; i++)
iArray[i] = i*10;
0. 1. 2. 3. 4.
iArray 0 10 20 30 40

A dArray tmb elemeinek beolvassa a konzolrl:


double[] dArray = new double[20];
for (int i=0; i<dArray.length; i++)
dArray[i] = Console.readDouble();
18. Tmbk 18.2. Egydimenzis tmb 375

Az sArray tmb elemeinek rtkadsa (az elemek referencik):


String[] sArray = new String[4];
sArray[0] = "Panama";
sArray[1] = "Peru";
sArray[2] = "Ppua";

0. 1. 2. 3.
sArray

:String :String :String null

Panama Peru Ppua

A szep kt elem, boolean elemtpus tmb:


boolean[] szep;
szep = new boolean[2];
szep[0]=true; szep[1]=false;

A maganhangzok t elem, char elemtpus tmb:


char[] maganhangzok = new char[5];
maganhangzok[0]='a'; ...; maganhangzok[4]='u';

Alaprtelmezs szerinti kezdeti rtkek

A tmb referencijnak alaprtelmezs szerinti rtke osztlyszint deklarci esetn


null, loklis deklarci esetn definilatlan (mint minden ms referencia esetn).
Az jonnan ltrehozott tmb elemei alaprtelmezs szerinti rtkeket vesznek fel fg-
getlenl attl, hogy a deklarci osztlyszint, vagy loklis. Referencik esetn ez az rtk
null, primitv tpus vltozk esetn 0, \u0000, illetve false.

Inicializl blokk

Deklarlskor inicializl blokkal a tmb elemeinek kezdeti rtkek adhatk:


<elemtpus>[] <tmbazonost> = {<rtk0>, <rtk1>, ...}

A kapcsos zrjelek ltal hatrolt blokkot inicializl blokknak nevezzk. Ebben az eset-
ben nem kell s nem is szabad a tmbt a new opertorral ltrehozni: a {} blokk-kpz
opertor mindezt megteszi helyettnk! A tmb mrete pontosan akkora lesz, amennyi a fel-
sorolt rtkek szma.

Pldk:
int[] iArray = {0,10,20,30,40}; // 5 elem
char[] maganhangzok = {'a','e','i','o','u'}; // 5 elem
boolean[] szep = {true,false}; // 2 elem
double[] arak = {12.4,5000,3.7}; // 3 elem
376 VI. RSZ. KONTNEREK

rtkads

A t2 tmb rtkads szerint kompatbilis a t1 tmbbel (azaz t1=t2 megengedett), ha


- Primitv elemtpus esetn t1 s t2 elemtpusa azonos;
- Referencia elemtpus esetn t2 elemtpusa t1 elemtpusval azonos, vagy annak leszr-
mazottja.
Tmb rtkadsakor a tmb referencija kap rtket, nem a tmb elemei. gy klnbz
hosszsg tmbk is rtkl adhatk egymsnak.

Pldul adottak a kvetkez tmb deklarcik:


int[] iArray1 = {1,3,5,7}, iArray2 = {10,20};
double[] dArray1 = {1,2,3,4,5,6,7.0}, dArray2 = {1.5,6,0};
Object[] oArray = null;
String[] sArray = {"Get Back","Let It Be"};

Szintaktikailag helyes rtkadsok:


iArray1 = iArray2; // iArray1 == {10,20}, iArray2=={10,20}
dArray1 = dArray2; // dArray1 == {1.5,6,0}
oArray = sArray; // oArray == {"Get Back","Let It Be"}

Szintaktikailag helytelen rtkadsok:


iArray = dArray; // nem egyforma primitv tpus elemek
sArray = dArray; // egyik elemei objektumok, msik primitvek
sArray = oArray; // az Object-nek nem se a String!

rtkadskor teht a tmb nem msoldik, hanem tlltdik a mutatja. Az iArray1=


iArray2 rtkads utn iArray1 mr nem arra a tmbre mutat, amelyikre eddig, hanem arra,
amelyikre az iArray2 is mutat. Az rtkads utn teht mindkt mutat ugyanazt a tmbt
azonostja, az iArray1 ltal mutatott tmb pedig, hacsak ms nem mutat r, elbb vagy utbb
a szemtgyjt ldozata lesz. A tmb rtkadst a 18.4. bra szemllteti.

0. 1. 2. 3.
iArray1 1 3 5 7

0. 1.
iArray2 10 20

18.4. bra. Tmb rtkads (iArray1=iArray2)


18. Tmbk 18.3. A tmb szekvencilis feldolgozsa 377

18.3. A tmb szekvencilis feldolgozsa


A tmb szekvencilis feldolgozsakor a tmb elemeit sorban, egyesvel dolgozzuk fel. A
tmb szekvencilis feldolgozst nhny feladat segtsgvel mutatjuk be.

Feladat Szmok
Krjnk be 10 szmot a konzolrl minden bekrsnl rjuk ki az elem sorszmt!
Ezutn rjuk ki a szmokat elszr a bekrs sorrendjben, azutn pedig visszafel!

Forrskd
import extra.*;
public class Szamok {
int[] szamok = new int[10]; //1

// A 10 db szm bekrse:
void beker() {
for (int i=0; i<szamok.length; i++)
szamok[i] = Console.readInt(i+1+". szm: ");
}

// A szmok kirsa a bekers sorrendjben:


void kiirElore() {
for (int i=0; i<szamok.length; i++)
System.out.print(szamok[i]+" ");
System.out.println();
}

// A szmok kirsa fordtott sorrendben:


void kiirVissza() {
for (int i=szamok.length-1; i>=0; i--)
System.out.print(szamok[i]+" ");
System.out.println();
}

public static void main(String[] args) {


Szamok szamok = new Szamok();
szamok.beker();
szamok.kiirElore();
szamok.kiirVissza();
}
}

A program elemzse

A szmokat egy tmbben troljuk. A tmbt s az azon dolgoz algoritmusokat egy szamok
nev tmbkezel objektumba tesszk. A Szamok osztly felelssge a 10 darab szm beolva-
ssa, trolsa s kirsa elre s visszafel. A szamok tmbt (amely trtnetesen egy ugyani-
lyen nev objektumba van bezrva) az objektum szletsekor, egy inicializl kifejezssel
hoztuk ltre (//1), minden elem kezdeti rtke nulla. A beker(), a kiirElore() s a
378 VI. RSZ. KONTNEREK

kiirVissza() metdusok mind e szmokat tartalmaz tmbn dolgoznak. A beker(), s a


kiirElore() metdusokban a ciklus 0-rl indul s length-1-ig megy; a kiirVissza()
metdusban a tmb elemeit fordtott sorrendben dolgozzuk fel, ott a ciklus length-1-tl 0-ig
megy. Bekrskor a felhasznlnak mindig eggyel nagyobb indexet runk ki, mint a program-
beli valsg: szmra az 1-tl indul sorszmozs a termszetes.

Feladat Szvegek
Krjnk be szvegeket a konzolrl az res szveg vgjelig. Ha nem tudunk mr tbb
szveget trolni, informljuk errl a felhasznlt! Vgl rjuk ki a szvegeket elszr
a bekrs sorrendjben, azutn pedig visszafel!

Ez a feladat annyiban tr el az elztl, hogy most nem szmokat, hanem szvegeket krnk
be, s a bekrt szvegek szmt nem tudjuk elre. Egy akkora tmbt kell deklarlnunk,
amelybe nagy valsznsggel belefrnek a szvegek: a tmb mrete legyen 100! A szvegek
valdi szma (nSzoveg) a program futstl fgg majd, s termszetesen az is elfordulhat,
hogy a szvegek nem frnek majd bele a tmbbe. A szmozs alkalmazkodva a Javhoz
nullrl indul:

0. 1. nSzoveg-1 length-2 length-1


... ...

Forrskd
import extra.*;

public class Szovegek {


String[] szovegek = new String[100]; // 100 szveg fr be
int nSzoveg = 0; // szvegek szma

// A szvegek bekrse:
void beker() {
String szoveg;
while (true) {
if (nSzoveg == szovegek.length) {
System.out.println("Betelt");
break;
}
szoveg = Console.readLine(nSzoveg+1+". szveg: ");
if (szoveg.equals(""))
break;
szovegek[nSzoveg] = szoveg;
nSzoveg++;
}
}
18. Tmbk 18.4. Gyjts 379

// Szvegek kirsa a bekrs sorrendjben:


void kiirElore() {
for (int i=0; i<nSzoveg; i++)
System.out.print(szovegek[i]+" ");
System.out.println();
}

// Szvegek kirsa fordtott sorrendben:


void kiirVissza() {
for (int i=nSzoveg-1; i>=0; i--)
System.out.print(szovegek[i]+" ");
System.out.println();
}

public static void main(String[] args) {


Szovegek szovegek = new Szovegek();
szovegek.beker();
szovegek.kiirElore();
szovegek.kiirVissza();
}
}

A program elemzse

A szovegek objektumban most a bevitt szvegek szmt (nSzoveg) is trolnunk kell, hiszen
az futskor vltozik. A beker() eljrs ciklusban a kilps felttelt felesleges megfogalmaz-
nunk ha a tmb betelt, vagy a felhasznl vgjelet t, egyszeren kiugrunk a ciklusbl. Az
elbbi esetben figyelmeztetjk a felhasznlt, nehogy feleslegesen fradjon. Ha a tmbben van
hely: nSzoveg<szovegek.length, s a szveg nem a vgjel: !szoveg.equals(""), a
szveget betesszk a tmb soron kvetkez elembe: szovegek[nSzoveg]=szoveg, s
nveljk a tmbben lv szvegek szmt: nSzoveg++.

18.4. Gyjts
Gyjtskor valamilyen szempontbl sszetartoz elemek darabszmt, illetve rtkeit
sszegezzk, gyjtjk. Gyjtskor a bejv elemeket sztvlogatjuk: minden elemet sorban
megvizsglunk, hogy az melyik gyjtbe tartozik. Ha a gyjt indexelhet tmb, akkor azt kell
eldntennk, hogy melyik index gyjtt s hogyan kell mdostanunk.

Feladat Dobs-statisztika
Kt ember, Bush s Gates dobkockval versenyez: sajt kockjukkal mindketten
10-szer dobnak, s amelyikknek az tlaga jobb, az nyer. A dobsokat vletlen-
szm-genertorral szimulljuk! A verseny vgn rjuk ki mindkt versenyz nevt, s
azt, hogy hny darab 1-es, 2-es 6-os dobsuk volt, valamint dobsaiknak tlagt!
380 VI. RSZ. KONTNEREK

A program terve
A program terve a 18.5. brn lthat.
Ksztnk egy DoboKocka osztlyt. Egy osztlyvltozban troljuk a kocka oldalainak
a szmt (hogy alkalmasint htoldal kockval is jtszhassunk). Egy kocka szletsekor
meg kell adni tulajdonosnak nevt. A kockval lehet dobni, ilyenkor a kocka generl
egy vletlen rtket 1 s a kocka oldalszma (n) kztt. Minden kocka maga gyjti a
dobsok tmbben, hogy lete sorn hnyasokat dobtak vele (melyik szm hnyszor
szerepelt fell). A kocktl meg lehet krdezni eddigi dobsainak tlagt.
A DobasStatisztika osztly ltre fogja hozni a kt jtkos dobkockjt, s tzszer
felkri az egyes kockkat dobsra. Vgl kirja az eredmnyt. A megfelel informcit
minden kocka maga lltja el toString() metdusval.

DobKocka

-n: int = 6 {kocka oldalszma}


-tulaj: String
DobsStatisztika -fell: int {aktulis dobs}
2
-dobsok: int[n+1] {index: 1..n}
+main(...)
+DobKocka(tulaj:String)
+dobs(): int
+tlag(): double
+toString(): String

18.5. bra. A DobsStatisztika program osztlydiagramja

1. 2. 3. 4. 5. 6.

1 1 2 0 0 3
+1
+1 +1

...
33612666114622... a dobsok

18.6. bra. Gyjts


18. Tmbk 18.4. Gyjts 381

Elemezzk a DoboKocka osztlyban szerepl dobsok tmbt! A gyjts mechanizmust a


18.6. bra szemllteti. A tmb 1. rekeszben gyjtjk az 1-es dobsokat, a 2-esben a 2-eseket
stb. Ha a dobs n, akkor a dobasok[n] rtkt megnveljk eggyel. Kezdetben a gyjt reke-
szei nulla rtkek. A knnyebb szmols rdekben egy trkkt alkalmazunk: a tmb nulladik
elemt egyszeren nem szerepeltetjk a megoldsban. gy egy rekesz ugyan kihasznlatlan
marad, de a programot sokkal egyszerbb kvetni!

Forrskd
import extra.*;
class DoboKocka {
private static int n = 6;
private String tulaj;
private int felul;
private int[] dobasok = new int[n+1]; // 0. elem felesleges

public DoboKocka(String tulaj) {


this.tulaj = tulaj;
felul = 1;
}

public int dobas() {


felul = (int)(Math.random()*n+1); // 1 s n kztt
dobasok[felul]++; // gyjts
return felul; // a dobott rtket visszaadja
}

public double atlag() {


int osszeg=0, dobasSzam=0;
for (int i=1; i<=n; i++) {
dobasSzam += dobasok[i];
osszeg += dobasok[i]*i;
}
return osszeg*1.0/dobasSzam;
}

public String toString() {


String str=tulaj;
for (int i=1; i<=n; i++) {
str = str+" "+dobasok[i];
}
str = str+" tlag: "+atlag();
return str;
}
}

public class DobasStatisztika {


public static void main(String[] args) {
final int DOBASSZAM = 10;
DoboKocka d1 = new DoboKocka("Bush ");
DoboKocka d2 = new DoboKocka("Gates");
382 VI. RSZ. KONTNEREK

// Mindketten dobnak tizet:


for (int i=1; i<=DOBASSZAM; i++) {
d1.dobas();
d2.dobas();
}

// Eredmny kirsa:
System.out.println(d1);
System.out.println(d2);
}
}

A program egy lehetsges futsa


Bush 1 4 1 2 0 2 tlag: 3.2
Gates 0 2 2 1 2 3 tlag: 4.2

Sokszor elfordul, hogy tbb klnbz rtk elemnek ugyanazt a gyjtt kell nvelnie
a kvetkez feladat erre mutat pldt.

Feladat letkor
Krjk be 5 ember nevt s letkort. Ezutn ksztsnk olyan statisztikt, amely
megmutatja, hogy melyik korcsoportba hny ember tartozik (a 100 veseket vagy
annl idsebbeket soroljuk az utols korcsoportba)! A kpernyterv a kvetkez:
Korcsop Darab
0- 9: 999
10-19: 999
20-29: 999
...
80-89: 999
90-99: 999

A program terve
A gyjt indextpusa s az index kpzse most nem annyira egyrtelm, mint az elz feladat-
ban. Mivel a gyjt indexeinek egy sorszmozott tpus egymst kvet rtkeinek kell lennik,
ki kell tallnunk egy olyan indextpust, valamint egy olyan indexkpz algoritmust (transzfor-
mcit), amelyikkel a csoporthoz tartoz index egyrtelmen meghatrozhat. E feladatban
kzenfekv a 0..9 indextpus, az indexkpz algoritmus pedig legyen a 10-zel val egsz
oszts:

0 .. 9 10 .. 19 ... 90 ..

0 1 ... 9
18. Tmbk 18.4. Gyjts 383

A tmb 0. rekeszt nvelik a 0..9 rtkek, az 1. rekeszt a 10..19 rtkek stb. A 9. rekeszt
nvelik a 90 vagy annl nagyobb letkorok.

A program terve a 18.7. brn lthat. Ksztnk egy Ember osztlyt, amelynek konstruktora
bekri az ember adatait. Az ember meg tudja mondani sajt korcsoportjt (0..9), s osztlyme-
tdusokkal lekrdezhetk az egyes korcsoportok als s fels vei. Az Eletkor osztlyban
felvesznk egy gyjt tmbt a korcsoportoknak. A main metdus ltrehozza az Eletkor
vezrl objektumot, majd felkri t adatgyjtsre s a statisztika elksztsre. Az
adatGyujtes() metdus ltrehoz 10 embert; a statisztika() metdus sorban megvizs-
glja az embereket, hogy melyik korcsoportba tartoznak, az ennek megfelel gyjtrekeszt
eggyel nveli, vgl kirja az eredmnyt.

Eletkor Ember

-LETSZAM: int -nev: String


emberek -eletkor: int
-korcsGyujto: int[10]
* +Ember()
+adatGyujtes()
+evAlso(korcsop:int): int
+statisztika()
+evFelso(korcsop:int): int
+main(...)
+korcsoport(): int

18.7. bra. Az letkor program osztlydiagramja

Forrskd
import extra.*;
class Ember {
private String nev;
private int eletkor;

public Ember() {
System.out.println("\nAz ember adatai");
nev = Console.readLine("Nv: ");
eletkor = Console.readInt("letkor: ");
}

public static int evAlso(int korcsop) {


return korcsop*10;
}

public static int evFelso(int korcsop) {


return korcsop*10+9;
}
384 VI. RSZ. KONTNEREK

public int korcsoport() {


int korcsop = eletkor/10;
if (korcsop > 9) korcsop = 9;
return korcsop;
}
}

public class Eletkor {


private final int LETSZAM=5;
private int[] korcsGyujto = new int[10];
private Ember[] emberek = new Ember[LETSZAM];
public void adatGyujtes() {
for (int i=0; i<LETSZAM; i++)
emberek[i] = new Ember();
}
public void statisztika() {
for (int i=0; i<LETSZAM; i++)
korcsGyujto[emberek[i].korcsoport()]++;

System.out.println("\nKorcsoport Darab");
for (int i=0; i<korcsGyujto.length; i++) {
System.out.print(Format.right(Ember.evAlso(i),2)+"-"+
Format.right(Ember.evFelso(i),2));
System.out.println(Format.right(korcsGyujto[i],3));
}
}
public static void main(String[] args) {
Eletkor ek = new Eletkor();
ek.adatGyujtes();
ek.statisztika();
}
}

Feladat Betgyjts
Krjnk be egy szveget, majd rjuk ki, hogy A-tl Z-ig melyik betbl hny van a
szvegben! A kis- s nagybetket ne klnbztessk meg, s a nem ebbe a tarto-
mnyba es karaktereket ne szmoljuk!

Forrskd
import extra.*;
public class BetuGyujtes {
public static void main (String args[]) {
String szoveg = Console.readLine("Szveg: ");
int[] karakterek = new int['Z'-'A'+1]; //1
char karakter;
for (int i=0; i<szoveg.length(); i++) { //2
karakter = Character.toUpperCase(szoveg.charAt(i));
if (karakter>='A' && karakter<='Z')
karakterek[karakter-'A']++;
}
18. Tmbk 18.5. Ktdimenzis tmb 385

for (int i=0; i<karakterek.length; i++) { //3


if (karakterek[i] != 0)
System.out.println((char)('A'+i)+": "+karakterek[i]);
}
}
}

A program egy lehetsges futsa


Szveg: Merem-e?
E: 3
M: 2
R: 1

A program elemzse
A Javban sajnos nem tudunk karakterekkel indexelni, ezrt az 'A'..'Z' karaktertartomnyt le
kell kpeznnk a 0..25 szmtartomnyra. A karakterek tmbben fogjuk gyjteni a megfelel
karakterek darabszmt: a 0. elemben az 'A' betkt, az 1. elemben a 'B' betkt stb., a 25.
elemben a 'Z' betkt (//1). A tartomny mrett a szls karakterek unikdjaibl szmoltuk ki
('Z'-'A'+1). A //2-nl kezdd for ciklusban vgigmegynk a szban forg szvegen, min-
den egyes karaktert nagybetss alaktjuk, s megvizsgljuk, beleesik-e az 'A'..'Z' karakter-
tartomnyba. Ha igen, akkor a megfelel tmbelemet nveljk eggyel (az indexelsnl implicit
tpuskonverzi trtnik). //3-ban vgigmegynk a karakterek tmbn, s kirjuk az eredmnyt.

Megjegyzs: A karakterek tmb nullzsa felesleges lenne, mert azt a rendszer alaprtel-
mezs szerint elvgzi.

Oldja meg a fejezet vgn tallhat egydimenzis tmbkkel kapcsolatos feladatokat!

18.5. Ktdimenzis tmb

Ktdimenzis tmb deklarlsakor kt tmbkpz opertort tesznk az elemtpus utn:


<elemtpus>[][] <tmbAzonost>

A teljes ktdimenzis tmb ltrehozsa:


new <elemtpus> [mret0][mret1]

gy a tmb elemeinek a szma mret0*mret1 lesz. A ktdimenzis tmb lpsenknt is


ltrehozhat ekkor a begyazott tmbk klnbz mretek is lehetnek. A ktdimenzis
tmb sor-referenciinak ltrehozsa:
new <elemtpus> [mret0][]
386 VI. RSZ. KONTNEREK

A ktdimenzis tmb alapelemeinek indexelse:


<tmbazonost> [index0][index1]

Minden indexI egy 0 s meretI-1 kztti rtk.


A tbbdimenzis tmb elemeinek alaprtelmezs szerinti kezdeti rtkei ugyanolyanok,
mint az egydimenzis tmb esetn: referencik esetn az rtk null, primitv tpus
vltozk esetn 0, \u0000, illetve false.
Az inicializl blokkok egymsba gyazhatk:
<elemtpus>[][] <tmbazonost> = {
{<rtk0>, <rtk1>, ...},{<rtk0>, <rtk1>, ...},...
}

szamok
szamok[1][3]

szamok.length==3
0. 1. 2. 3. 4.
szamok[0] 12 56 0 -9 26

szamok[1] 1 53 0 19 2

szamok[2] 2 7 0 -2 21

szamok[2].length==5

18.8. bra. Primitv elemtpus ktdimenzis tmb

Pldaknt vegyk a szamok tmbt, melynek 3 sora s 5 oszlopa van, elemtpusa int:
int[][] szamok = new int[3][5];

A primitv elemtpus ktdimenzis tmbt a 18.8. bra mutatja. A sorok indexei 0 s 2, az


oszlopok indexei 0 s 4 kztt lehetnek. A szamok 1. sornak 3. eleme: szamok[1][3]. Az 5
elem sorokra kln lehet hivatkozni: szamok[0], szamok[1], szamok[2]. Az oszlopokra
kln nem hivatkozhatunk.
Msik pldaknt vegynk egy olyan ktdimenzis tmbt, amelyben korosztlyonknt troljuk
az els hrom helyezett versenyzt. A korosztlyok szma 4. A referencia elemtpus kt-
dimenzis tmbt a 18.9. bra szemllteti.
18. Tmbk 18.5. Ktdimenzis tmb 387

1. eset: Egyetlen utastssal ltrehozzuk az sszes referencit:


Ember[][] versenyzok = new Ember[4][3];

A ltrehozs utn a versenyzk tmb mind a 12 referencijnak rtke null emberek


mg nincsenek a tmbhz rendelve. Az embereket kln kell ltrehozni:
versenyzok[i][j] = new Ember(...);

2. eset: Megtehetjk, hogy az egyes korosztlyokhoz tartoz tmbket kln hozzuk


ltre, st azok klnbz mretek is lehetnek:
Ember[][] versenyzok = new Ember[4]; //1
versenyzok[0] = new Ember[3]; //2
versenyzok[0][1] = new Ember(...); //3
Az egyes korosztlyok tmbjeinek ltrehozzuk a referenciit (//1), de most csak a
legels korosztly versenyzinek foglalunk helyet (//2). A ltrehozott tmbben az els
referencihoz egy embert rendelnk, a tbbi mg meghatrozatlan (rtke null).

1 versenyzok
:Ember

0. 1. 2. :Ember
versenyzok[0]
:Ember
versenyzok[1]
:Ember
versenyzok[2]

versenyzok[3]

versenyzok[1][2]

2 versenyzok
:Ember

0. 1. 2.
versenyzok[0]

versenyzok[1]

versenyzok[2] versenyzok[0][0]

versenyzok[3]

18.9. bra. Referencia elemtpus ktdimenzis tmbk


388 VI. RSZ. KONTNEREK

Tmbk msolsa
A java.lang csomag System egysgben van egy statikus arraycopy metdus, melynek
segtsgvel azonos tpus tmbrszleteket lehet tmsolni egyik tmbbl a msikba:
static void arraycopy(Object src, int src_position, Object dst,
int dst_position, int length);
src (source) a forrstmb, melynek src_position elemtl kezdve a metdus tm-
solja az elemeket a dst (destination) nev cltmbbe a dst_position elemtl kezdve,
length hosszsgban.

Tesztprogram Mtrix
A kvetkez tesztprogram a matrix nev ktdimenzis tmbt manipullja. Minden egyes
mtrixmvelet utn kirjuk konzolra a mtrix tartalmt a printMatrix() metdussal.
Kvesse vgig a programot, s minden egyes mvelet utn ellenrizze a program utn szerepl
futsi eredmnyt.

Forrskd
import extra.*;

public class Matrix {


static int printN = 0; // A printels szma
static int[][] matrix = new int[5][3]; // 5 sor, 3 oszlop

// A mtrix kirsa soronknt:


static void printMatrix() {
printN++;
System.out.println("---- "+printN+" -----");
for (int i=0; i<5; i++) {
for (int j=0; j<3; j++)
System.out.print(Format.right(matrix[i][j],4));
System.out.println();
}
}

public static void main(String[] args) {


System.out.println("Sorok szma ="+matrix.length);
System.out.println("Oszlopok szma="+matrix[0].length);

// A mtrix feltltse 1,2,3 ... rtkekkel sorfolytonosan:


int ertek=0;
for (int i=0; i<5; i++)
for (int j=0; j<3; j++)
matrix[i][j] = ++ertek;
printMatrix(); // mtrix kirsa //1

// A 2. sor tmsolsa az 1. sorba:


System.arraycopy(matrix[2],0,matrix[1],0,matrix[1].length);
printMatrix(); // mtrix kirsa //2
18. Tmbk 18.5. Ktdimenzis tmb 389

// A 2. sor 1. eleme 999 lesz:


matrix[2][1] = 999;
printMatrix(); // mtrix kirsa //3

// 2. oszlop feltltse 0 rtkekkel:


for (int i=0; i<5; i++)
matrix[i][2] = 0;
printMatrix(); // mtrix kirsa //4

// Ezen rtkads utn a 0. sor ugyanaz mint a 4.!


// A kt referencia ugyanarra az tmbre mutat.
matrix[0] = matrix[4]; // A 0. sor elvsz!
printMatrix(); // mtrix kirsa //5

// rtkads a 4. sor 1. elemnek. 0. sor. 1. elemnek is!


matrix[4][1] = -1;
printMatrix(); // mtrix kirsa //6
}
}

A program futsa
Sorok szma =5
Oszlopok szma=3
---- 1 -----
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
---- 2 -----
1 2 3
7 8 9
7 8 9
10 11 12
13 14 15
---- 3 -----
1 2 3
7 8 9
7 999 9
10 11 12
13 14 15
---- 4 -----
1 2 0
7 8 0
7 999 0
10 11 0
13 14 0
---- 5 -----
13 14 0
7 8 0
7 999 0
10 11 0
13 14 0
390 VI. RSZ. KONTNEREK

---- 6 -----
13 -1 0
7 8 0
7 999 0
10 11 0
13 -1 0

A program elemzse
A program remlhetleg magrt beszl, csupn nhny dolog rdemel kln emltst.

A program azzal kezddik, hogy kirjuk a mtrix sorainak szmt (matrix.length), vagyis a
tmb kls mrett, majd a 0. sor oszlopainak szmt (matrix[0].length). Itt most minden
sor egyforma hossz. Ezutn az egyes lpsek a kvetkezk:
//1: Feltltjk a mtrix elemeit.
//2: A tmb 1. sort tmsoljuk a tmb 2. sorba az arraycopy metdus segtsgvel.
//3: A tmb 2. sora 1. elemnek j rtket adtunk, a 999-et.
//4: Feltltjk a 2. oszlopot nullkkal.
//5: A matrix[0]=matrix[4]; utasts hatsra a tmb 0. s 4. sora egyarnt az
eddigi negyedik sorra fog mutatni. Ezrt ezzel az utastssal nemcsak azt rjk el,
hogy a kt sor most ugyanolyan rtk elemeket fog tartalmazni, hanem brmilyen
vltoztatst hozunk ltre akr az egyik, akr a msik soron, az mindkt sor meg-
vltoztatst jelenti, hiszen a kt sor egy s ugyanaz.
//6: A 4. sor 1. elemt megvltoztatjuk. Figyelje meg, hogy //5 kvetkezmnyeknt a 0.
sor 1. eleme is megvltozik!

18.6. Tbbdimenzis tmb

Az N dimenzis tmb deklarlsa (N darab tmbkpz opertor):


<elemtpus>[][]...[] <tmbAzonost>
A teljes N dimenzis tmb ltrehozsa:
new <elemtpus> [mret0][mret1]...[mretN-1]
gy a tmb elemeinek a szma mret0*mret1*...*mretN-1 lesz. A ltrehozs
lpsenknt is elvgezhet ekkor a begyazott tmbk klnbz mretek is lehetnek.
A tbbdimenzis tmb alapelemeinek indexelse:
<tmbAzonost> [index0][index1]...[indexN-1]
Minden indexI egy 0 s mretN-1 kztti rtk.

A <tmbAzonost>.length a mret0-t adja vissza. A <tmbazonost>[index0]


rsztmb mrett a <tmbAzonost>[index0].length adja meg stb.

Az egsz N dimenzis tmbre a tmb azonostjval hivatkozunk. A MretN darab rsztmb


mindegyikre mr eggyel kevesebb indexre van szksg. Ahogy az indexek fogynak, gy fogy
18. Tmbk 18.6. Tbbdimenzis tmb 391

a rsztmb dimenzija. A tmb egy alapelemre val hivatkozshoz mr N indexre van


szksg.

Pldul a 4 dimenzis t tmb hivatkozsai a kvetkezk:


az egsz 4 dimenzis tmb: t
egy 3 dimenzis rsztmb: t[index0]
egy 2 dimenzis rsztmb: t[index0][index1]
egy 1 dimenzis rsztmb (sor): t[index0][index1][index2]
egy 0 dimenzis rsztmb (elem): t[index0][index1][index2][index3]

Pldaknt nzzk a dArray hromdimenzis tmbt, amely 3 magas, 2 soros, 10 oszlopos, s


elemtpusa double (18.10. bra). Deklarcija a kvetkez:
double[][][] dArray = new double[3][2][10];

Igazak a kvetkez egyenlsgek:


dArray.length == 3 // a dArray magassga 3
dArray[0].length == 2 // a dArray[0] lap 2 soros
dArray[2][0].length == 10 // a dArray[2][0] sor 10 elem

Az brn jellt fels sor (2-es szint 0. sora) feltltse 9-es rtkekkel:
for (int k=0; k<dArray[2][0].length; k++)
dArray[2][0][k] = 9;

dArray[2][0]
2
dArray[0]

1 dArray[1][0][9]
dArray[0][0][0]

9
0

18.10. bra. Hromdimenzis tmb


392 VI. RSZ. KONTNEREK

18.7. A tmb tadsa paramterknt

Egy tmb tadhat paramterknt egy metdusnak. Formlis paramterknt egy tmbrefe-
rencit kell deklarlnunk, amely fogadja az aktulis tmb referencijt. Az aktulis tmb-
nek rtkads szerint kompatbilisnek kell lennie a formlis tmbbel, vagyis:
- Primitv elemtpus esetn a formlis tmb elemtpusa ugyanolyan kell, hogy legyen,
mint az aktulis tmb;
- Referencia elemtpus esetn egy formlis tmb elemtpusnak az aktulis tmb elem-
tpusval azonosnak, vagy annak egy snek kell lennie.
A formlis paramter tetszleges hosszsg tmbt fogadhat.

Feladat Paramter teszt


rjunk eljrst, amely egy
int elemtpus tmb elemeit kilistzza!
Object elemtpus tmb elemeit kilistzza!

Forrskd
public class ParamTeszt {

// A formlis paramter primitv elemtpus tmb:


static void kiir(int[] tomb) {
for (int i=0; i<tomb.length; i++)
System.out.print(tomb[i]+" ");
System.out.println();
}

// A formlis paramter Object elemtpus tmb:


static void kiir(Object[] tomb) {
for (int i=0; i<tomb.length; i++)
System.out.print(tomb[i]+" ");
System.out.println();
}

public static void main(String[] args) {


int[] szamok1 = new int[2], szamok2 = new int[5];
szamok1[1] = 5;
szamok2[0] = 99; szamok2[4] = -5;
kiir(szamok1); kiir(szamok2);

String[] szerzok1 = {"Mozart","Wagner","Beethoven"};


StringBuffer[] szerzok2 = new StringBuffer[2];
szerzok2[0] = new StringBuffer("Monteverdi");
szerzok2[1] = new StringBuffer("Corelli");
kiir(szerzok1); kiir(szerzok2);
}
}
18. Tmbk 18.8. A program paramterei 393

A program futsa
0 5
99 0 0 0 -5
Mozart Wagner Beethoven
Monteverdi Corelli

A program elemzse

A kiir(int[] tomb) eljrsnak csak int elemtpus tmb adhat t, de az termszetesen


brmilyen hossz lehet. Az aktulis tmbk 2 s 5 hosszak. A kiir(Object[] tomb) elj-
rsnak csak referencia elemtpus tmb adhat t paramterknt. Az elemek osztlyainak az
Object osztlybl kell szrmazniuk. Az egyik aktulis tmb elemei String tpusak, a
msik pedig StringBuffer. A tomb akrmilyen mret elemekbl ll tmbt kpes
fogadni. A fenti kiir metdus kirja az aktulis tmb elemeit.

18.8. A program paramterei

A program elindtsakor a programnak tetszleges szm paramtert adhatunk t:


java <OsztlyAzonost> <param0> <param1> <param2> ...

A paramterek (argumentumok) szvegek, melyeket fehr szkzk vlasztanak el egy-


mstl. Az aktulis paramtereket a main metdus fogadja a String elemtpus formlis
paramtertmbben (szoksos elnevezse args). Az aktulis paramterek szmt az
args.length adja meg.

A program paramtereit parancssor-paramtereknek vagy a program argumentumainak is


nevezik.

Feladat Program paramter teszt


Ksztsen egy programot, mely a program paramtereit kirja a konzolra elszr
egyenknt, kln sorban, majd egy sorban, vesszvel elvlasztva! Ha nem adnak
meg paramtert, akkor rjuk ki, hogy "A programnak nincs paramtere."!

Prbaknt futtassa le a programot a kvetkez hrom paramterrel:


java ProgParamTeszt Yellow Submarine Yesterday

Forrskd
public class ProgParamTeszt {

public static void main(String[] args) {


if (args.length == 0) {
System.out.println("A programnak nincs paramtere.");
System.exit(0);
}
394 VI. RSZ. KONTNEREK

System.out.println("\nParamterek egyenknt, kln sorban:");


for (int i = 0; i < args.length; i++)
System.out.println(args[i]);

System.out.println("\nParamterek vesszvel elvlasztva:");

StringBuffer sor = new StringBuffer(args[0]);


for (int i = 1; i < args.length; i++) {
sor.append(", " + args[i]);
}
System.out.println(sor);
}
}

A program futsa a fenti paramterek mellett


Paramterek egyenknt, kln sorban:
Yellow
Submarine
Yesterday

Paramterek vesszvel elvlasztva:


Yellow, Submarine, Yesterday

JBuilder futsi konfigurci


A program paramtereit JBuilderben a futsi konfigurci ablakban llthatjuk be. Vlasszuk
ki a kvetkez menpontok egyikt:
Project/Project Properties...
Run/Configurations...

Mindkt esetben a Projekt tulajdonsgai (Project Properties) ablak jelenik meg, msodik
esetben rgtn a Run fl lesz az aktulis. A Run fln ki kell vlasztanunk az aktulis futsi
konfigurcit (Runtime Configuration), melyet szerkesztennk kell: Edit. Ha mg nincs futsi
konfigurci, hozzunk ltre egyet!
Megjelenik a Futsi konfigurci tulajdonsgai ablak (Runtime Configuration Properties,
18.11. bra). A program paramtereit az Application parameters mezbe kell berni, szkzzel
elvlasztva.

Megjegyzs: Ebben az ablakban llthatjuk be tbbek kztt a projekt f osztlyt (Main


class) is, amely a main metdust tartalmazza. E belltsnak csak valdi projekt esetn van
rtelme, ahol futtatjuk is a projektet.
18. Tmbk 18.9. Feladat Szavazatkirtkels 395

18.11. bra. A program paramterei

18.9. Feladat Szavazatkirtkels


Feladat
Egy sportversenyen kznsgszavazst tartanak. Minden nz egyetlen verseny-
zre szavazhat. A versenyzk klnbz kategrikban indulnak, a kategrik
szmozsa 1-tl indul. Minden kategriban a versenyzk sorszmot kapnak 0-tl
kezdden. Hogy hny kategria van sszesen, s kategrinknt hny versenyz
indul, azt a program paramtereiknt adjuk meg. 5 kategria esetn pldul:
6 10 5 3 7.
A kznsgben mindenki kap egy szavazcdult, melyen kitltheti a kategrit s a
versenyz sorszmt. A cdult egy ldikba kell bedobni. A ldikban lev cdulk
szma tetszleges.
Ksztsnk egy olyan programot, amely feldolgozza s kirtkeli a szavazcdul-
kat!
Elszr vigyk be a szavazcdulk adatait (rossz adatokat tartalmaz cdulk
nem vesznek rszt a szavazsban)!
396 VI. RSZ. KONTNEREK

Vgl ksztsk el a kvetkez kimutatst:


Kategrinknt s versenyznknt rjuk ki a szavazatok szmt!
rjuk ki azon versenyzk kategrijt s sorszmt, akik a legtbb szavazatot
kaptk a teljes meznyben! (Egyforma eredmny esetn mindegyiket rjuk ki!)
Mely kategria kapta sszesen a legtbb szavazatot? (Egyforma eredmny ese-
tn mindegyiket rjuk ki!)

A program terve

A Szavazatok osztly lesz a felels a szavazatok trolsrt, feldolgozsrt s a klnbz


kirtkelsekrt. Tervezzk meg az osztly adatait s algoritmusait! A program terve a 18.12.
brn lthat.

Szavazatok

katSzam : int
SzavazatKiertekeles szavazat : int[][]

Szavazatok(versenyzokSzama: String[])
main(args: String[]) feldolgozas()
print()
gyoztesVersenyzok()
kategoriaOssz(kat: int): int
gyoztesKategoriak()

18.12. bra. A SzavazatKirtkels program terve

Szavazatok osztlylers A versenyz sorszma


Adatok: 0 1 2 3 4 5 6 7 8 9
1 3 0 7 2 0 0
szavazat:
2 0 0 0 1 2 3 5 1 0 6

Kategria szma 3 1 3 0 0 1

4 3 1 5

5 1 0 0 5 4 9 4
18. Tmbk 18.9. Feladat Szavazatkirtkels 397

A szavazat tmbben paramtertl fggen lltjuk be a sorok (kategrik) s azon bell az


oszlopok (versenyzk) szmt. Az oszlopok szma soronknt klnbz lehet. A kategrit a
tmbben 1-tl szmozzuk, hogy ne kelljen transzformlni a szavazcduln szerepl rtkeket.
katSzam a kategrik szmt trolja.

Metdusok
Szavazatok(String[] versenyzokSzama)
Konstruktor. A program paramterei alapjn ltrehozza a szavazat tmbt.
void feldolgozas()
Ha egy cduln a kategria kat, s a versenyz sorszma vsz, akkor a tmb kat. sor-
nak vsz. elemt meg kell nvelnnk eggyel. A szavazcdulk vgt a kategrinl
bettt 0 jelzi. Tegyk fel, hogy az eredmny az lesz, amit a kitlttt bra mutat.
void print()
A kls ciklus kategrinknt fut. Minden kategrira kirjuk a versenyzk sorszmt,
al pedig a megfelel versenyz szavazatainak szmt.
void gyoztesVersenyzok()
Megllaptja, kik kaptk a legtbb szavazatot: vgigmegynk sorfolytonosan a tmbn,
s maximumszmtsi algoritmussal kivlasztjuk a legnagyobb rtket. Ezutn mg
egyszer vgigmegynk, s kirjuk, ki kapott ennyi szavazatszmot.
void gyoztesKategoriak()
A legtbb szavazatban rszestett kategrik meghatrozsa: ksztnk egy fggvnyt
(kategoriaOssz), mely egy adott kategria sszes szavazatt kiszmtja. E fggvny
segtsgvel vgigmegynk a kategrikon, s szintn maximumot szmtunk.
int kategoriaOssz(int kat)
Kiszmtja az adott kategriban leadott sszes szavaztok szmt: a kategria sornak
sszegt.

Forrskd
import extra.*;

class Szavazatok {
private int katSzam;
private int[][] szavazat;

public Szavazatok(String[] versenyzokSzama) {


System.out.println(versenyzokSzama.length);
katSzam = versenyzokSzama.length;
398 VI. RSZ. KONTNEREK

// Kategrik ltrehozsa:
szavazat = new int[katSzam+1][]; // 0. kategria nincs
for (int k=1; k<=katSzam; k++)
// Kategrinknt rsztmb ltrehozsa:
szavazat[k] = new int[Integer.parseInt(
versenyzokSzama[k-1])];
}

public void feldolgozas() {


int kat, vsz;
do {
kat = Console.readInt("Kategria : ");
if (kat == 0)
continue;
if (kat<1 || kat>katSzam) {
System.out.println("Rossz kategria");
continue;
}
vsz = Console.readInt("Versenyz: ");
if (vsz<0 || vsz>=szavazat[kat].length) {
System.out.println("Rossz versenyz sorszm");
continue;
}
szavazat[kat][vsz]++; // a megfelel rtk nvelse
} while (kat != 0);
}

public void print() {


for (int i=1; i<=katSzam; i++) {
System.out.println("\nSzavazatok az "+i+". kategriban");
// A versenyzk sorszmainak kirsa:
System.out.print("Vers. sorszma: ");
for (int j=0; j<szavazat[i].length; j++)
System.out.print(Format.right(j,3));
System.out.println();

// A versenyzk szavazatainak kirsa:


System.out.print("Szavazatok : ");
for (int j=0; j<szavazat[i].length; j++)
System.out.print(Format.right(szavazat[i][j],3));
System.out.println();
System.out.println("sszesen: "+kategoriaOssz(i)+" szav.");
}
}

public void gyoztesVersenyzok() {

// Maximlis rtk meghatrozsa


int max = 0;
for (int i=1; i<szavazat.length; i++)
for (int j=0; j<szavazat[i].length; j++)
if (szavazat[i][j] > max)
max = szavazat[i][j];
18. Tmbk 18.9. Feladat Szavazatkirtkels 399

// A gyztesek kirsa
System.out.println("Gyztes versenyzk:");
for (int i=1; i<szavazat.length; i++) {
for (int j=0; j<szavazat[i].length; j++)
if (szavazat[i][j] == max)
System.out.println(i+". kat.ban a "+j+". vers.");
System.out.println();
}
}

public int kategoriaOssz(int kat) {


int sum = 0;
for (int j=0; j<szavazat[kat].length; j++)
sum += szavazat[kat][j];
return sum;
}

public void gyoztesKategoriak() {


int max = 0;
for (int i=1; i<szavazat.length; i++)
if (kategoriaOssz(i) > max)
max = kategoriaOssz(i);

System.out.println("Gyztes kategorik:");
for (int i=1; i<szavazat.length; i++)
if (kategoriaOssz(i) == max)
System.out.print(i+" ");
System.out.println();
}
}

public class SzavazatKiertekeles {


public static void main(String[] args) {
Szavazatok szavazatok = new Szavazatok(args);

szavazatok.feldolgozas();
szavazatok.print();
szavazatok.gyoztesVersenyzok();
szavazatok.gyoztesKategoriak();
}
}

Tesztkrdsek

18.1. Mely deklarcik hatroznak meg egy olyan tmbt, amely 8 darab karakterelemet
tartalmaz? Jellje meg az sszes j vlaszt!
a) char[] betuk = new char[7];
b) String[] szo = new szo[8];
c) char[] jel = new char[8];
d) char jel[] = new char[8];
400 VI. RSZ. KONTNEREK

18.2. Jellje meg az sszes szintaktikailag helyes deklarcit!


a) int[] t1;
b) int t2[] = new t2;
c) int[][] t3;
d) int[] t4 = new int[5];
18.3. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) A ktdimenzis tmb sorai mindig egyforma hosszak.
b) A ktdimenzis tmb mrett deklarlskor meg kell adni.
c) A ktdimenzis tmb egyes sorai kln ltrehozhatk.
d) A ktdimenzis tmb sorai futs kzben bvthetk (az eredeti sor megszntetse
nlkl).
18.4. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) Ha a metdus formlis paramtere egy int elemtpus tmb, akkor az aktulis
paramter is csak int elemtpus tmb lehet.
b) Ha a metdus formlis paramtere Hallgato[] tpus, akkor az aktulis paramter
is csak Hallgato[] tpus lehet.
c) A programnak a main metdus paramtereknt tadhatk adatok.
d) A main metdus formlis paramtere ktelezen String elemtpus tmb.
18.5. Adva van egy ktdimenzis tmb:
int[][] tomb = new int[3][6];
Hogy hivatkozunk a tmb utols sorra? Jellje meg az sszes j vlaszt!
a) tomb[3]
b) tomb[3][]
c) tomb[2]
d) tomb[2][]
18.6. Adva van egy hromdimenzis tmb:
int[][][] tomb = new int[2][5][3];
Melyek azok a hivatkozsok, amelyek szintaktikailag is helyesek, s nem mutatnak a
tmbn kvlre? Jellje meg az sszes j vlaszt!
a) tomb[2][4]
b) tomb[1]
c) tomb[0,0,2]
d) tomb[][4][1]
18.7. Mely kifejezsek adjk meg a ktdimenzis tmb utols sornak a hosszt? Jellje meg
az sszes j vlaszt!
int[][] tomb;
...
a) tomb.length(0)
b) tomb[length-1].length()
c) tomb[tomb.length-1].length
d) tomb[length-1].length
18. Tmbk 18.9. Feladat Szavazatkirtkels 401

Feladatok
Egydimenzis tmbk

18.1. (A) Krjen be 10 darab egsz szmot! Ezutn rja ki a 10-nl nagyobb szmokat, majd a
10-nl kisebbeket! (Szamok.java)

18.2. (A) Mrjk meg 10 darab alma slyt, s a mrt rtkeket sorban vigyk be a szmt-
gpbe. Krds, hogy melyik alma slya tr el legjobban az tlagtl? rjuk ki a krdses
alma sorszmt, s eltrst az tlagtl (ha tbb van, akkor csak az elst)! Hogy ne
tvesszk ssze az almkat, szmozzuk be azokat 1-tl kezdve. (Sulyok.java)

18.3. (A) Egy brtnben 1000 cella van, mindegyikben egy rab l. Kezdetben minden cella
zrva van. A brtnrnek jtszani tmad kedve: vgigmegy az sszes cella eltt, s
mindegyik ajt zrjn fordt egyet. Fordtskor a nyitott cellt bezrja, illetve a zrtat
kinyitja. Ha vgigment, elkezdi ellrl, s minden msodik cella zrjn fordt egyet.
Aztn minden harmadikon fordt, s gy tovbb. Legvgl fordt egyet az ezrediken, s
ksz. Ezutn amelyik cella ajtaja nincs bezrva, abbl a rab elmehet. Kik a szerencss
rabok? (Borton.java)

18.4. (A) Generljon 100 darab 100 s 200 kztti vletlen egsz szmot (a hatrokat is bele-
rtve)! Vizsglja meg s rja ki, hogy melyik szmbl sszesen mennyi keletkezett!
(VeletlenEloszlas.java)

18.5. (B) Krjen be egy szveget, s szmolja meg a benne lev


a) A, B, ... , Z betk szmait (betnknt)! Ne klnbztesse meg a nagy s kisbetket!
b) betk szmait! A nagy- s kisbetket is klnbztesse meg!
c) 0, 1, 2,...9 szmjegyek szmait!
d) az ASCII karakterek szmait! (KarStat.java)
18.6. (B) Krjen be egy szmot, majd rja ki eddig a szmig az sszes prmszmot! Minden
prm el rja ki, hogy hnyadik prm!
tlet: Oldjuk meg a feladatot az Eratoszthenszi szita segtsgvel! Vegynk fel egy
tmbt, ahol minden szmhoz (indexhez) egy logikai rtk tartozik, jelezvn, hogy a
szm prm-e (kezdetben minden elemet true-ra kell lltani). Menjnk vgig a tmbn,
s lltsuk be a 2 tbbszrseihez tartoz rtkeket (4, 6, 8...) false-ra (ezek biztosan
nem prmek)! Ugyanezt vgezzk el a 3 tbbszrseire, s gy tovbb: csak a mg
prm rtkek tbbszrseit nzzk! Vgl a true rtk rekeszek indexei lesznek a prm-
szmok. (Primek.java)
402 VI. RSZ. KONTNEREK

18.7. (B) Egy cgnl felmrst vgeznek a fizetsekrl. Elszr krje be a dolgozk nevt s
fizetst! Ezutn
a) llaptsa meg a fizetsek tlagt!
b) rja ki, kiknek tr el a fizetse legjobban az tlagtl!
c) emelje meg 10%-kal mindenki fizetst!
A megoldshoz ksztsen egy Dolgoz osztlyt! (CegFizetesek.java)
18.8. (C) Ksztse el a szmlz programok elengedhetetlen azaz fggvnyt, amely egy
tetszleges egsz szmnak meghatrozza a szveges, kimondott alakjt. Pldul:
2002, azaz Kettezerkett; 30996, azaz Harmincezerkilencszzkilencvenhat. (Azaz.java)

18.9. (C) Egy tren sok ember tartzkodik. Mindegyik emberre jellemz a tartzkodsi helye
(a tr kzephez viszonytott pozcija) s az irnya, kpesek menni egy adott tvols-
got, s tudnak fordulni. Az nnepi sznok ilyen utastsokat ad ki:
a) Minden ember menjen egy mtert!
b) Akinek az irnya 0 s 90 fok kz esik, menjen kt mtert!
c) Mindenki forduljon el 30 fokkal!
d) Aki a tr kzeptl legalbb 20 mter tvolsgra van, forduljon meg!
Szimullja az nnepi msort! Az tkzsektl most tekintsnk el! (MusoraTeren.java)

Kt- s tbbdimenzis tmbk

18.10. (A) Adott egy 8*8-as sakktbla. gy jtszunk, hogy 100-szor vletlenszeren rbknk
a sakktbla valamely mezjre. A jtk vgn rjuk ki, hogy melyik mezre hnyszor
bktnk r. Egy mezt egy betvel (A..H) s egy szmmal (1..8) azonostunk. A rb-
kst vletlenszm-genertorral vgezzk. (Bokodes.java)

18.11. (B) Szimulljuk egy mozi kiss primitv jegyeladst. A nztren 10 sor tallhat,
abbl az els 5 sorban 8 hely van, a tbbiben 12. Menbl lehet vlasztani:
J: Eladnak egy jegyet. Krjk be, hova kri a nz a jegyet (sor s szkszm)! Csak j
rtket fogadjunk el! Ha a hely mr foglalt, akkor adjunk egy figyelmeztet zene-
tet! Ha mg nem foglalt, foglaljuk le a helyet!
M: A nz visszahoz egy jegyet. Krjk be a jegyn lev sor s szkszmot! Csak j
rtket fogadjunk el! Ha a hely nem foglalt, akkor adjunk egy figyelmeztet zene-
tet! Ha foglalt, akkor szabadtsuk fel a helyet!
V: Vge a programnak.
Minden funkci utn rajzoljuk ki a nzteret! Klnbztessk meg a foglalt s a sza-
bad helyeket! A nztr oldaln jelezzk a sor s oszlopszmokat!
Tipp: A nztrnek vegyen fel egy ktdimenzis logikai tmbt, melynek sorai vltoz
hosszsgak! (MoziJegyek.java)
18. Tmbk 18.9. Feladat Szavazatkirtkels 403

18.12. (C) Krjen be szmokat konzolrl! Ksztsen kimutatst, hogy a bekrt szmok kztt
a) sszesen hny egyjegy, ktjegy stb. szm van; azon bell hny vgzdik 0-ra,
1-re, 2-re stb.;
b) sszesen hny szm vgzdik 0-ra, 1-re, 2-re stb.; azon bell hny egyjegy, ktje-
gy stb. szm van.
c) hny olyan szm van, melyben a jegyek szma s a vgzds a megadott;
d) hny olyan szm van, melyben a jegyek szma a megadott;
e) hny olyan szm van, melyben a vgzds a megadott;
Csak a felttlenl szksges adatokat trolja! (JegyVegzodes.java)

18.13. (B) Egsz vben gyjttt szmlink rendezetlenl hevernek a fikunkban. Kiadsainkrl
szeretnnk egy sszestst kszteni naponta, havonta s egsz vre vonatkozan.
Ksztse el ehhez a programot! Bevitelnl ellenrizze a dtumot, hogy az adott vben
rvnyes-e a hnap s a nap! Csak a nem nulla napi eredmnyeket rja ki! (A szmlkat
egyenknt nem kell megjegyezni, s korriglsra sincs szksg. A megoldshoz
vegynk fel egy ktdimenzis tmbt, amely alapjn havonta, azon bell naponta elv-
gezhetjk az sszestst!) (Szamlak.java)

Paramtertads

18.14. Ksztsen metdust, amely


a) (A) a paramterben megadott double elemtpus tmb elemeit a paramterben
megadott hatrok kztti vletlen rtkekkel feltlti!
b) (A) a paramterben megadott String elemtpus tmb elemeit bekri a konzolrl!
c) (A) konzolra rja egy double elemtpus tmb elemeit, sorszmokkal elltva!
d) (A) konzolra rja egy String elemtpus tmb elemeit, sorszmokkal elltva!
e) (A) kiszmtja brmely double elemtpus tmb elemeinek tlagt!
f) (B) brmely Stringeket tartalmaz tmb elemeit fordtott sorrendbe teszi!
Tesztelje a metdusokat! (TombParam.java)

18.15. (B) Ksztsen egy programot, amely a program paramtereiben megadott szmokat sz-
szegezi. Tegyk fel, hogy a program paramterei szmok, s azokat fehr szkzk
vlasztjk el egymstl. (Osszead.java)

A program hvsa pldul: java Osszead 23.6 4 1


Eredmny: 28.6
404 VI. RSZ. KONTNEREK
19. Rendezs, keress, karbantarts 18.9. Feladat Szavazatkirtkels 405

19. Rendezs, keress, karbantarts

A fejezet pontjai:
1. Rendezs
2. Keress
3. Karbantarts
4. Primitv elemek rendezse, keresse
5. String objektumok rendezse, keresse
6. Sajt osztly objektumok rendezse, keresse
7. Szvegek rendezett karbantartsa

Szinte nem ltezik olyan szoftver, amelyben ne kellene adatokat, objektumokat nyilvntartani.
Rgzteni kell szemlyi adatokat, megrt leveleket, mrsi eredmnyeket. Gyakori feladat a
rgztett elemek (objektumok) valamilyen szempont szerinti rendezse, egy adott tulajdonsg-
gal rendelkez elem megkeresse, illetve az elemek karbantartsa (j elem felvitele, rginek a
trlse vagy mdostsa). Fontos szempontok a kvetkezk:
Az elemek rendezshez a sorozat (kontner) brmely kt elemt ssze kell
tudnunk hasonltani, azaz meg kell tudnunk llaptani, hogy a rendezett sorozatban
melyik szerepel majd elbb. Szmos rendezsi algoritmus ltezik; ezeket a programoz
ltalban kszen kapja. A rendezsi mdszer kivlasztshoz s helyes alkalmazshoz
azonban fontos, hogy nagy vonalakban ismerjk a rendezs elmlett. A fejezet az
egyik legegyszerbb, a minimum-kivlasztsos rendezsi eljrst trgyalja. Tudni kell
azonban, hogy ennl vannak sokkal hatkonyabb (s egyben bonyolultabb) rendezsek
is.
Az elemek karbantartshoz (felvitel, trls, mdosts) s az elemek keresshez az
elemeket azonostanunk kell, meg kell tudnunk llaptani egy adott elemrl, hogy ez-e
az, amit keresnk.
A fejezetben elszr a rendezs, a keress s a karbantarts ltalnos elvrl lesz sz. Ezutn
rendezni fogunk primitv s referencia elemtpus tmbket, keresni fogunk a rendezetlen s a
rendezett tmbkben, valamint a tmbkn karbantartsi mveleteket fogunk vgezni.
406 VI. RSZ. KONTNEREK

19.1. Rendezs

Egy sorozat rendezsnek alapfelttele, hogy a sorozat brmely kt eleme sszehasonlt-


hat legyen, vagyis eldnthet legyen sorrendisgk. A rendezett sorozatot elllt algo-
ritmust rendezsi algoritmusnak (eljrsnak, mdszernek) nevezzk.

A Javban a primitv adatok sszehasonltsa a <, >, <=, >=, ==, != sszehasonlt operto-
rokkal trtnik; objektumokat azonban kizrlag metdusokkal lehet sszehasonltani.
Hogy kt objektum kzl melyik a nagyobb, valamint az, hogy kt objektum egyenl-e, az
meghatrozs krdse.

Minimumkivlasztsos rendezs

A minimumkivlasztsos rendezsi algoritmus lnyege a kvetkez (19.1. bra):


- 1. lps: Megkeressk a teljes n elem tmb legkisebb elemt; azt kicserljk az els
elemmel; kvetkezskppen most az els helyen lesz a legkisebb elem, ahogy ezt sze-
retnnk is.
- 2. lps: most a maradk rszt, a 2.-tl az n. elemig lev tmbrszt kell rendeznnk.
Keressk meg itt is a legkisebb elemet! Ezt az elemet kicserljk a msodik elemmel,
s gy most mr kt elemnk van j helyen.
- Tovbbi lpsek: folytassuk ezt az eljrst: tegyk a helyre a 3. elemet, a 4. elemet, az
5. elemet stb. Utols lpsknt az utols eltti helyre kell kivlasztanunk a legkisebb
elemet, ezzel az utols elem is a helyre kerl.

Melyik a legkisebb? Az jjjn ide!


4. lps:

1. 2. 3. 4. 5. n-1. n.
...
Eddig mr rendezett

5. lps:

1. 2. 3. 4. 5. n-1. n.
...
Eddig mr rendezett

19.1. bra. Minimumkivlasztsos rendezs


19. Rendezs, keress, karbantarts 19.1. Rendezs 407

Megjegyzs:
Sok fle rendezsi algoritmus ltezik, pldul:
- Beszrsos vagy ms nven beillesztses rendezs: Hasonlt arra mdszerre, ahogy az
ember elrendezi kezben a krtykat leoszts utn. Felttelezzk, hogy van egy szigor
rend, amely szerint a krtykat sorba kell tenni. Felvesszk az els krtyt. Ezutn fel-
vesszk a msodikat, s a helyre tesszk. Felvesszk a harmadikat, helyre tesszk, s
gy tovbb. Minden esetben megkeressk a krdses krtynak a helyt a mr rendezett
sorban, s oda beszrjuk. A tmbbe val beszrs az elemek feljebb tolsval trtnik.
- Buborkos vagy ms nven szomszdos elemek cserjvel trtn rendezs: Els
lpsben a legnagyobb elem fel fog szllni a tmb utols helyre, mgpedig a kvetke-
zkppen: sszehasonltjuk a tmb els kt elemt, s ha az 1. nagyobb, mint a 2., akkor
felcserljk ket. Ezutn a 2. s 3. elemmel tesszk ugyanezt stb., a szomszdos elemeket
sorban hasonltgatjuk, s ha kell, cserljk. A legnagyobb elem, mint egy bubork, fel-
szll a tmb tetejre. Msodik lpsknt a tmb utols eltti helyre szlltjuk fel a bubo-
rkot, majd egyre kisebb tmbrsszel buborkoltatunk. Minden egyes menetben figyeljk,
hogy a tmb nem rendezett-e mr. Ha mr rendezett, akkor tbbszr nem megynk vgig
a tmbn. A buborkos rendezs csupn akkor hatkony, ha rendezettsgben csak egy
kicsit elromlott sorozatrl van sz.
- Az egyik leghatkonyabb rendezs a gyorsrendezs (quicksort), melynek algoritmusa
rekurzv.
A rendezs gyorsasgt elssorban az sszehasonltsok s az elemcserk szma befoly-
solja. A rendezsi algoritmust a feladat s a rendezend sorozat jellemzinek fggvnyben
kell megvlasztani.

Direkt rendezsrl akkor beszlnk, ha a rendezsi eljrssal az elemek sorrendjt vgr-


vnyesen megvltoztatjuk. Indexes rendezsrl beszlnk ellenben, ha a sorozat elemei-
nek eredeti sorrendjt meghagyva, egy olyan indexsorozatot rendeznk, amely azonostja a
sorozat elemeit.

Indexes rendezs

Az indexes rendezs lnyege, hogy az eredeti sorozatot vltozatlanul hagyjuk, s a soro-


zathoz egy indexsorozatot rendelnk. Az indexsorozatban szerepl indexek az eredeti soro-
zat elemeit azonostjk, s az adott rendezsi szempont szerint kvetik egymst. Ilyen kz-
vetett mdon egyszerre tbb szempont szerinti rendezettsget is el tudunk lltani tbb
indexsorozat felptsvel.

A 19.2. bra 1. esetben a f sorozat teljes nv (vezetknv+keresztnv) szerint van rendezve.


A sorozathoz hozzrendeltnk egy indexsorozatot (4,6,3,5,2,1), amelyben az indexek egy
keresztnv szerinti rendezettsget lltanak el: az indexsorozat legels eleme a 4-es, ez a f
408 VI. RSZ. KONTNEREK

sorozatban Aladr indexe (keresztnv szerinti rendezettsgben Aladr az els). Az indexsoro-


zat utols eleme az 1-es, ez a f sorozatban Vilmos indexe. Vilmos a keresztnv szerinti rende-
zettsgben az utols, br a f sorozatban, amely teljes nvre van rendezve, els helyen ll. Az
indexsorozatban lv indexekkel az elemek eredeti helyre hivatkozunk. A rendezett index-
sorozatot gy tudjuk ellltani, hogy azt feltltjk a rendezend elemek indexeivel (egyb
informci is kapcsoldhat hozz), majd az indexsorozat elemeit az indexelt elemek rendezett-
sgnek fggvnyben sorba rakjuk. A hasonltst teht mindig az indexelt elemekre vgezzk
el, a csere pedig az indexeket rinti. gy az eredeti sorozatunk vltozatlan maradhat.
A 2. esetben az eredeti tmbt keresztnv szerint direkt mdon rendeztk. Ezzel a teljes nv
szerinti rendezettsg elromlott, gy az 1. eset indexei mr hamis rendezettsget mutatnak (az
indexsorozatot jra fel kell pteni).

1. F sorozat (teljes nv szerint rendezett)


1 2 3 4 5 6
Abafi Vilmos Bor Kzmr Cirok Emil Finn Aladr Murok Jen Zentai Bla

4 6 3 5 2 1

Indexsorozat (keresztnv szerinti rendezettsg)

2. F sorozat (keresztnv szerint rendezett)

1 2 3 4 5 6
Finn Aladr Zentai Bla Cirok Emil Murok Jen Bor Kzmr Abafi Vilmos

19.2. bra. Indexes s direkt rendezs

19.2. Keress

Kereshetnk akr primitv-, akr referencia tpus elemeket trol kontnerben; ilyenkor
mindig egy adott felttelt kielgt elemet keresnk. Az elemeket sorban megvizsgljuk,
hogy azok a keressi felttelnek eleget tesznek-e (valamilyen szempontbl egyenlk-e a
keresettel): ha igen, akkor az elemet megtalltuk.
19. Rendezs, keress, karbantarts 19.2. Keress 409

Elkpzelhet, hogy tbb elem is eleget tesz a keressi felttelnek. Primitv adatok esetn egy
indexelhet kontnerben a keressi felttel lehet pldul a kvetkez:
if (kontener[i]==10)
System.out.println("Az i. elem 10");

Objektumok keressekor megfogalmazhatjuk a felttelt az objektumok tulajdonsgaival:


if (kontener[i].getDb()==10)
System.out.println("Az i. objektum darabszma 10");

Elegns megolds, ha az objektumokat fggvnnyel hasonltjuk ssze, klnsen akkor, ha a


hasonltsra mr vannak ksz metdusaink. A hasonltst elvgz metdus az objektum egy
pldnymetdusa, amelynek paramtere egy msik objektum. Ilyenkor az objektum sszeha-
sonltja magt egy msik, n. hasonlt objektummal, pldul:
if (kontener[i].equals(hasonlito))
System.out.println("az i. elem s a hasonlit egyenlk");

Az objektumok sszehasonltshoz a hasonlt objektumot ltre kell hoznunk (hacsak nincs


ksz hasonltand objektumunk), amelyben kitltjk a felttelben rszt vev tulajdonsgokat;
majd a keress sorn ezt az objektumot hasonltjuk a kontner elemeihez.

1 2 3 4 5 6
:Auto :Auto :Auto :Auto :Auto :Auto
BOT490 BAK900 KOS215 TIT111 ZAB200 AHA001
Fiat Mazda Mazda Mazda Mazda Skoda
ezst piros fehr fehr fehr fehr

autok[3].equals(hasonlito)?
true, ha a 3. aut rendszmnak els betje K,
hasonlito:Auto s tpusa Mazda.
K?????
Mazda
???

19.3. bra. Objektum keresse


410 VI. RSZ. KONTNEREK

A keresst a 19.3. bra szemllteti. Pldnk Aut osztlyban a kvetkez adatokat deklarl-
tuk: rendszm (ez egyedi adat), tpus s szn. A keressi felttel most az, hogy a tpus,
valamint a rendszm kezdbetje megegyezzk a megadott rtkekkel: Keresend egy
Mazda, amelyiknek a rendszma K betvel kezddik. A hasonlts cljra ltrehozunk egy
Aut objektumot, amelyben kitltjk a keresend tulajdonsgok rtkeit. Ezutn sorban meg-
vizsgljuk a sorozatot, hogy van-e kztk olyan aut, amelyik egyenl (equals) a hasonlt
objektummal, azaz keresnk egy olyan esetet, amikor a megfogalmazott felttelt a kt objek-
tumra alkalmazva igaz rtket kapunk. A keress gyorsabb, ha az autk rendezve vannak tpus
s azon bell rendszm szerint.

Szekvencilis keressrl beszlnk, ha a sorozat elemein sorban, egyesvel vgighaladva a


keresend elemet minden egyes elemmel sszehasonltjuk addig, amg azt meg nem tall-
tuk, s amg mg van rtelme a keressnek.
Keresskor tudnunk kell, hogy a szban forg sorozat elemei a keressi szempont szerint
vannak-e rendezve, vagy sem, mert e kt esetben mskpp kell keresnnk:
- Rendezetlen sorozat esetn az elemet addig keressk, amg meg nem talljuk, vagy a
sorozat vgre nem rnk.
- Rendezett sorozat esetn a keresst nemcsak akkor hagyjuk abba, ha a keresett elemet
megtalljuk, hanem akkor is, ha rendezettsgben tlhaladunk rajta, hiszen a sorozat
tovbbi rszben a krdses elem mr nem fordulhat el.
Belthat, hogy rendezett sorozatban val szekvencilis keresskor tlagban az elemek
felt kell megnznnk.

Megjegyzs: Rendezett sorozatban az egyik leghatkonyabb keressi mdszer a binris


keress, amelynek lnyege a kvetkez:
- Meghatrozzuk a tmb kzps elemt. Ha ez a keresett elem, akkor mr kszen is
vagyunk.
- Ha az elemet mg nem talltuk meg, akkor megvizsgljuk, hogy a keresett elem a tmb
als vagy fels felbe esik-e. Mivel a tmb rendezett, ez egyrtelmen eldnthet a
kzps elemmel val sszehasonltssal.
- Ha a keresett elem a tmb als felbe esik, akkor az j tmbrsz a tmb als fele, egyb-
knt a tmb fels fele lesz.
- Az j tmbrszben a keresst ugyangy folytatjuk, mint ahogy azt eddig lertuk: megha-
trozzuk a tmb kzps elemt...
- Ezt az eljrst addig folytatjuk, amg nincs meg a krdses elem, s van mit felezni.
Ha a rendezett sorozat elemszma n, akkor szekvencilis keresssel egy elemet tlagban n/2
lpsben tallunk meg; binris keresssel a lpsek szma legfeljebb log2(n). 1 milli elem
esetn teht az eredmny 500000:20, a binris keress javra.
19. Rendezs, keress, karbantarts 19.3. Karbantarts 411

19.3. Karbantarts

Karbantarts: az adat-, illetve objektumsorozat folyamatos mdostsra irnyul mve-


letek (tevkenysgek) sszessge. Karbantartsi mveletek:
- beszrs, vagy ms nven felvitel (insert, add): j elem hozzadsa a mr meglv
sorozathoz.
- trls (delete, remove): elem eltvoltsa a sorozatbl.
- mdosts (update, modify): a sorozatban lv elem tulajdonsgainak megvltoztatsa.
Karbantartani lehet akr primitv, akr referencia tpus elemeket.
Fontos, hogy a felhasznlnak minl kevesebbet kelljen vrnia az egyes mveletek elvg-
zsre, s hogy ne foglaljunk le feleslegesen sok memrit. Egy programot mind a futsi
idre, mind a helyfoglalsra optimalizlni kell!

Azonost, kulcs
Az objektumok karbantartshoz az objektumokat azonostanunk kell! Szerencsre minden
objektumnak van programbeli azonostja. Tudjuk azonban, hogy kt nem azonos objektumnak
lehet ugyanaz az llapota. A felhasznl el ltalban csak az objektum llapott, vagyis a
tulajdonsgok rtkeit tlaljuk. Ha az objektumokat llapotaik alapjn is meg akarjuk kln-
bztetni, akkor meg kell hatroznunk az objektumnak egy olyan elemi vagy sszetett tulajdon-
sgt, amely egyedi, teht objektumonknt ms.

Az objektum egyedi tulajdonsgt (tulajdonsgait) kulcsnak nevezzk. Karbantartskor


szem eltt kell tartani a kulcs egyedisgt:
- j elem felvitelekor mr ltez kulcsot nem adhatunk meg!
- Az objektum kulcst megvltoztatni nem szabad!

Megjegyzs: Az objektum kulcst azrt nem szabad megvltoztatni, mert annak programo-
zsa bonyolult, hibalehetsgeket rejt magban. Ajnlatos az objektumnak szletsekor egy
bels, mestersges kulcsot adni, amelyet a felhasznl nem is lt, gy nem is akarja azt meg-
vltoztatni.

A karbantartand elemek trolsnak mdja


Meg kell gondolnunk, hogy a karbantartand elemeket memriban vagy lemezen troljuk-e,
s hogy pontosan milyen kontnerben. A programoz a kontnerek szles skljbl vlaszt-
hat: a feladat nagysgtl s bonyolultsgtl fggen alkalmazhat akr egy egyszer tmbt,
akr egy bonyolult adatbzis-kezel rendszert. Mi most az egyszer tmb segtsgvel mutat-
juk be a karbantarts alapvet elveit.
412 VI. RSZ. KONTNEREK

El kell dnteni, hogy a sorozatot rendezetlenl troljuk, vagy rendezetten. Ez utbbi esetben el
kell dnteni, hogy a rendezettsg kulcs szerint vagy az objektum valamely ms tulajdonsga
szerint trtnjk (indexsorozatok segtsgvel tbb szempont szerinti rendezettsg is elllt-
hat). Az elemek rendezett trolsa esetn a sorozatnak mindig rendezettnek kell lennie, a
karbantart mveleteket eszerint kell elvgezni. sszefoglalva:
Rendezetlen sorozat esetn sokkal egyszerbb az objektumokat beszrni s trlni, a
keress viszont lass.
Rendezett sorozat esetn az objektumokat knny rendezetten listzni, s a keress is
sokkal gyorsabb. Figyelembe kell azonban venni, hogy egy j elem felvitelekor, illetve
egy mr meglv elem trlsekor vagy mdostsakor a rendezettsg megtartsnak
slyos ra is lehet.
Karbantart mveletek esetn a kulcsra mindenkppen r kell keresnnk! A karbantarts meg-
tervezse nagy elemszm esetn nehz feladat.

A karbantarts technikjnak kidolgozsa eltt kt dolgot el kell dntennk:


- Van-e az objektumoknak kulcsa;
- Rendezett-e a kontner a kulcs szerint.

Ezektl fggen a beszrs, mdosts s trls funkcik alapveten msok lesznek. Ngy
esetet kell vgignznnk:

Van kulcs Nincs kulcs


Rendezetlen Rendezetlen, van kulcs Rendezetlen, nincs kulcs
Rendezett Rendezett, van kulcs Rendezett, nincs kulcs

Ha a kontner rendezett ugyan, de nem a kulcs szerint, az megknnyt bizonyos keresseket s


listzsokat, de nem knnyti meg a karbantartst. Karbantartskor ugyanis a kulcsra minden-
kppen r kell keresnnk, hogy a kulcs dupliklst megakadlyozzuk.
ltalnos programozsi szempontok:
A kulcsot ne mdostsuk!
j elem felvitele eltt ha szksges , megvizsgljuk, van-e az elem szmra hely. Ha
mr nincs, akkor a beszrst nem vgezzk el, s errl zenetet adunk a felhasznlnak.
Trls vagy jelentsebb vltozst elidz mdosts eltt igny szerint krjnk
megerstst a felhasznltl: Biztosan trlni/mdostani akarja?. A tnyleges trlst
csak az Igen vlasz esetn vgezzk el.

A karbantartsi mveleteket most az indexelhet tmb kontnerben fogjuk szemlltetni. Az


elmlet kiterjeszthet egyb kontnerekre is.
19. Rendezs, keress, karbantarts 19.3. Karbantarts 413

Rendezetlen kontner, van kulcs


Pldul: Aut (rendszm, tpus, szn) objektumok karbantartsa. A rendszm egyedi adat. A
keressi felttel egy adott rendszm egyezsge. Az autk nincsenek rendezve.

Beszrs
Keresnk a rendezetlen tmbben. Ha ltezik mr az adott elem, akkor az elemet nem visszk
fel (hiszen az elemek egyediek), s errl zenetet adunk a felhasznlnak. Ha nincs, akkor az
j elemet az utols elem utni helyre tesszk (nem kell, hogy az elemek rendezettek legyenek,
gy a legknyelmesebb az elemet erre a helyre tenni). A nyilvntartsban szerepl elemek sz-
mt eggyel nveljk:
Elemszm

1. elem 2. elem 3. elem 4. elem 5. elem

j elem

Trls
Keresnk a rendezetlen tmbben. Ha nem tallhat az adott elem, akkor termszetesen nem
tudunk trlni, s a felhasznlt informljuk errl. Ha megvan az elem, akkor azt gy trljk,
hogy az utols elemet rmsoljuk. Az elemek szmt eggyel cskkentjk:

Elemszm

1. elem 2. elem 3. elem 4. elem 5. elem 6. elem

Trlend elem

Mdosts
Ha nem tallhat az adott elem, akkor errl zenetet adunk a felhasznlnak. Ha van ilyen
elem, akkor annak a kulcson kvl brmely adatt mdosthatjuk.

Rendezetlen kontner, nincs kulcs


Pldul: Hord (tmr, magassg, faanyag) objektumok karbantartsa. Nincs egyedi adat. A
keressi felttel az tmr s a magassg egyezsge. A hordk nincsenek rendezve semmilyen
szempont szerint. j hordt egyszeren a hordsor vgre tesznk; trls esetn ha az adott
414 VI. RSZ. KONTNEREK

tmrj s magassg hordt megtalljuk kitrljk, mindegy, hogy melyiket (a tlgyet


vagy a fenyt).
A nyilvntartott elemek szmt llandan jegyezzk. Az j elemet mindig a tmb vgre tesz-
szk. Ellenrzst nem kell vgeznnk, hiszen lehetnek ismtld, egyforma elemek is. Trls
s mdosts esetn kezelni kell az egyforma elemeket is!

Rendezett kontner, van kulcs


Pldul: Aut (rendszm, tpus, szn) objektumok karbantartsa. A rendszm egyedi adat. A
keressi felttel egy adott rendszm egyezsge. Az autk rendszm szerint rendezve vannak.
A tmbt llandan rendben tartjuk, vagyis minden egyes karbantartsi mvelet elvgzse-
kor gyelnk arra, hogy a rendezettsg megmaradjon.

Beszrs
Ha ltezik az adott elem a tmbben, akkor a beszrst nem vgezzk el, s errl rtestjk a
felhasznlt. Ha mg nincs ilyen elem, akkor megkeressk azt a helyet a tmbben, ahov az j
elemet a rendezettsg szerint be kellene szrnunk. Az elemeket onnan kezdve eggyel feljebb
toljuk, s az gy keletkezett res helyre berjuk (beszrjuk) az j elemet. A nyilvntartsban
szerepl elemek szmt eggyel nveljk:

Elemszm
j elem

1. elem 2. elem 3. elem 4. elem 5. elem 6. elem

Trls
Ha nem tallhat az adott elem a tmbben, akkor errl rtestjk a felhasznlt. Ha igen, akkor
azt gy trljk, hogy ettl az elemtl kezdve az elemeket a tmbben eggyel lejjebb msoljuk
a rendezettsg teht megmarad. A nyilvntartsban szerepl elemek szmt eggyel csk-
kentjk.

Mdosts
Kulcsot nem szabad mdostani, a tbbi adat mdosthat.
19. Rendezs, keress, karbantarts 19.4. Primitv elemek rendezse, keresse 415

Rendezett kontner, nincs kulcs


Pldul: Hord (tmr, magassg, faanyag) objektumok karbantartsa. Nincs egyedi adat. A
keressi felttel a faanyag egyezsge. A hordk rendezve vannak faanyaguk szerint.
A beszrs hasonl az elz esethez (a rendezettsgben ksbb jv elemeket feltoljuk) azzal a
klnbsggel, hogy a beszrst mindenkppen elvgezzk, ha van a tmbben hely.
Trls s mdosts esetn vigyzni kell, mert tbb egyforma elem lehetsges: el kell teht
dnteni, melyik elemre (esetleg az sszesre) akarjuk a mveletet elvgezni.

19.4. Primitv elemek rendezse, keresse

Keress rendezetlen tmbben


Feladat Primitv rendezetlen
Krjnk be a felhasznltl szmokat 0 vgjelig, majd rjuk ki a szmokat a bevitel
sorrendjben! Ezutn tegyk lehetv, hogy a felhasznl kereshessen szmokat a
bevitt szmsorozatban: ha az ltala megadott szm benne van a sorozatban, rjuk ki
els elfordulsnak indext (nulltl szmozva), egybknt rjuk ki, hogy "Nincs
ilyen szm"! Ha a megadott szm 0, legyen vge a programnak!

A program terve

Ksztnk egy Kontener osztlyt, amely a szmokat egy tmbben trolja. A tmb mrett
1000-re vesszk, felttelezzk, hogy ennl tbb szmot nem fog betni a felhasznl. A prog-
ram terve a 19.4. brn lthat.

Kontener
PrimitivRendezetlen
-tomb: int[1000]
kontener -size: int

+main(...) +Kontener()
+kiir()
+indexOf(elem:int): int

19.4. bra. A PrimitivRendezetlen program terve


416 VI. RSZ. KONTNEREK

A Kontner osztly metdusai:


Kontener()
Konstruktor. Bekri a szmokat a felhasznltl. A bekrt szmok szma size.
void kiir()
Kirja a tmb elemeit a konzolra.
int indexOf(int elem)
Visszaadja a paramterknt megadott elem els elfordulsnak tmbbeli indext,
illetve -1-et, ha nincs ilyen elem.

Forrskd s a program elemzse


import extra.*;
class Kontener {
private int[] tomb = new int[1000];
private int size=0;

A konstruktorban bekrjk a szmokat. A ciklus addig halad, amg van hely a tmbben, s nem
vgjelet tnek. A szmot betesszk az eddigi utols elem utni helyre, s az eltrolt szmok
darabszmt (size) eggyel megnveljk:
public Kontener() {
int elem;
while ((size<tomb.length) &&
(elem = Console.readInt("Szm: "))!=0) {
tomb[size++] = elem;
}
}

A metdus rendezetlenl, a bevitel sorrendjben rja ki a konzolra a szmokat.


public void kiir() {
for (int i=0; i<size; i++)
System.out.print(tomb[i]+" ");
System.out.println();
}

A rendezetlen tmbben az indexOf() metdus keres. A ciklussal vgighaladunk a tmbn; ha


kzben megtalljuk a keresett elemet, akkor elhagyjuk a fggvnyt gy, hogy annak visszat-
rsi rtke a keresett index lesz. A ciklus teljes lefutsa (vagyis hogy nem ugrunk ki a ciklus-
bl) azt jelenti, hogy nincs meg az elem: ekkor a visszatrsi rtk -1 lesz. Az elemek sszeha-
sonltst az == (egyenl-e) opertorral vgezzk el, mivel primitv tpusokrl van sz:

public int indexOf(int elem) {


for (int i=0; i<size; i++) {
if (tomb[i] == elem)
return i;
}
19. Rendezs, keress, karbantarts 19.4. Primitv elemek rendezse, keresse 417

return -1;
}
} // Kontener

public class PrimitivRendezetlen {


public static void main(String[] args) {
Kontener kontener = new Kontener();
kontener.kiir();
Addig keressk a szmokat, amg a felhasznl vgjelet nem t:
int elem;
while ((elem = Console.readInt("Keresend szm: "))!=0) {
int index = kontener.indexOf(elem);
if (index >= 0)
System.out.println("Indexe: "+index);
else
System.out.println("Nincs ilyen szm");
}
} // main
} // PrimitivRendezetlen

A program egy lehetsges futsa


Szm: 4
Szm: 13
Szm: 2
Szm: 7
Szm: 0
4 13 2 7
Keresend szm: 13
Indexe: 1
Keresend szm: 5
Nincs ilyen szm
Keresend szm: 0

Tmb rendezse, keress a rendezett tmbben


Feladat Primitv rendezett
Krjnk be a felhasznltl szmokat 0 vgjelig, majd rjuk ki a szmokat rtkk
szerint nvekv sorrendben! Ezutn tegyk lehetv, hogy a felhasznl kereshes-
sen szmokat a bevitt szmsorozatban: ha az ltala megadott szm benne van a
sorozatban, rjuk ki els elfordulsnak indext (nulltl szmozva), egybknt rjuk
ki, hogy "Nincs ilyen szm"! Ha a megadott szm 0, legyen vge a programnak!

Az elbbi Kontener osztlyt most ki kell egsztennk egy rendez() metdussal, amely a
szmok bevitele utn, a konstruktorban rendezi a tmbt. A rendez metdus privt lesz, a
tmbt kvlrl nem lehet rendezni. Az indexOf() metdus implementcija megvltozik,
hiszen rendezett tmb esetn nem kell a tmb vgig keresni. A program terve a 19.5. brn
lthat.
418 VI. RSZ. KONTNEREK

Kontener
PrimitivRendezett -tomb: int[1000]
kontener -size: int
+Kontener()
+main(...) +kiir()
-rendez()
+indexOf(elem:int): int

19.5. bra. A PrimitivRendezett program terve

Megjegyzs: A feladat megoldhat a rendez() metdus nlkl is, ha a konstruktort gy


mdostjuk, hogy a bevitt szmokat azonnal a helykre szrjuk be.

Forrskd
import extra.*;

class Kontener {
private int[] tomb = new int[1000];
private int size=0;

public Kontener() {
int elem;
while ((size<tomb.length) &&
(elem = Console.readInt("Szm: "))!=0) {
tomb[size++] = elem;
}
rendez();
}

public void kiir() {


for (int i=0; i<size; i++)
System.out.print(tomb[i]+" ");
System.out.println();
}

A rendez() metdus minimumkivlasztsos algoritmussal rendezi a szmokat. A kls


ciklusban az i index rtke a tmb els (0.) elemtl az utols eltti (size-2.) elemig megy.
Ezekre a helyekre vlasztjuk ki az adott menetben a legkisebb elemet. A bels ciklusban
minIndex a tmb i-tl kezdd rsze (az i, size-1 tartomny) legkisebb elemnek indexe
lesz. Ha ez klnbzik az i-tl (//1), vagyis nem az els helyen ll elem a legkisebb, akkor a
kt elemet ki kell cserlnnk. A rendezst a konstruktor vgzi, rgtn az elemek bevitele utn:
19. Rendezs, keress, karbantarts 19.4. Primitv elemek rendezse, keresse 419

private void rendez() {


for (int i=0; i<=size-2; i++) {
int minIndex = i;
for (int j=i+1; j<=size-1; j++)
if (tomb[j] < tomb[minIndex]) // elemek hasonltsa
minIndex = j;
if (i != minIndex) { //1
int seged = tomb[i]; // i. s minIndex. elem cserje
tomb[i] = tomb[minIndex];
tomb[minIndex] = seged;
}
}
}

Az indexOf() most a rendezett tmbben val keresst valstja meg. Figyelje meg, hogy
most nemcsak akkor hagyjuk el a metdust, ha megtalltuk az elemet (tomb[i]==elem),
hanem akkor is, ha a tmb aktulis eleme lehagyta a keresett elemet (tomb[i]>elem):
public int indexOf(int elem) {
for (int i=0; i<size; i++) {
if (tomb[i] == elem)
return i;
if (tomb[i] > elem)
return -1;
}
return -1;
}
}

public class PrimitivRendezett {


public static void main(String[] args) {
Kontener kontener = new Kontener();
kontener.kiir();

A keress semmiben sem klnbzik a rendezetlen tmbben vgzett keresstl:


int elem;
while ((elem = Console.readInt("Keresend szm: "))!=0) {
int index = kontener.indexOf(elem);
if (index >= 0)
System.out.println("Indexe: "+index);
else
System.out.println("Nincs ilyen szm");
}
} // main
} // PrimitivRendezett

A program futsa

Az elz, PrimitivRendezetlen.java programhoz kpest a program futsa mindssze


annyiban vltozik, hogy a szmok rendezetten kerlnek ki a konzolra, s nagy elemszm esetn
gyorsabb a keress.
420 VI. RSZ. KONTNEREK

19.5. String objektumok rendezse, keresse


Az objektumok rendezsnek felttele, hogy azok sszehasonlthatk legyenek, vagyis meg
tudjuk llaptani a sorozat kt objektumrl, hogy melyik a nagyobb. Keresskor el kell tud-
nunk dnteni egy objektumrl, hogy azt keressk-e. A hasonltsokat el tudjuk vgezni az
objektum tulajdonsgainak megvizsglsval (sszehasonltsval) is, de a legtbb esetben
sokkal elegnsabb magukat az objektumokat sszehasonltani.

Kt objektum sszehasonltsra nem alkalmazhatk az sszehasonlt opertorok,


azokat csak metdusokkal lehet sszehasonltani, hiszen kt referencia kztt
- az egyenlsg opertorok (==, !=) az objektumazonossgot vizsgljk (hogy a kt
objektum ugyanaz-e), s nem az objektumegyenlsget. Az objektumok kztti egyen-
lsget az equals() vagy a compareTo() metdussal szoks lekrdezni.
- a hasonlt opertorok (<, >, <=, >=) nincsenek rtelmezve. Objektumokat a
compareTo() metdussal szoks sszehasonltani.

Az equals() metdus visszatrsi rtke boolean, s azt mondja meg, hogy kt objektum
egyenl-e, vagy sem. A compareTo() metdus alkalmas a kisebb/nagyobb/egyenl sszeha-
sonltsra, amikor is a hrom a lehetsget a negatv, pozitv s nulla rtkek kpviselik.

Egy osztlyban az equals() s compareTo() metdusok egymstl fggetlenl megadha-


tk, tl is terhelhetk, s akr az egyenlsg, akr az sszehasonlts ms metdussal is defini-
lhat. Vannak olyan algoritmusok, amelyek megkvetelik a kttt formj equals() vagy a
compareTo() metdusok megadst, ilyen algoritmusokrl majd a 20. fejezetben lesz sz.
Sok osztlyban az equals() metdus pontosan akkor ad vissza true rtket, amikor a
compareTo() nullt (gy van ez a String-ben is); ez azonban nem trvnyszer. Az egyenl-
sgvizsglat s hasonlts felttelei klnbzek is lehetnek!

A String osztly equals() s compareTo() metdusai


boolean equals(Object anObject)
sszehasonltja az objektumot a paramterben megadott msik objektummal. A vissza-
adott rtk true, ha az anObject osztlya String, s a kt szveg karakterei rendre
megegyeznek. Ez a metdus az Object osztly metdust rja fell.
boolean equalsIgnoreCase(String str)
sszehasonltja az objektumot a paramterknt megadott msik String objektummal.
A visszaadott rtk true, ha a kt szveg karakterei rendre megegyeznek gy, hogy a
nagy- s kisbetk kztt nem tesz klnbsget.
int compareTo(Object o)
int compareTo(String str)
int compareToIgnoreCase(String str)
19. Rendezs, keress, karbantarts 19.5. String objektumok rendezse, keresse 421

sszehasonltjk az objektumot a paramterknt megadott msik objektummal. A har-


madik esetben a kis- s nagybetk kzt nem tesz klnbsget. A visszaadott rtk 0, ha
a kt szveg lexikografikusan egyenl; negatv, ha a szveg kisebb, mint a paramter
szvege; s pozitv, ha a szveg nagyobb, mint a paramter szvege.

Feladat String rendezett


Krjnk be a felhasznltl szvegeket az res szveg vgjelig, majd rjuk ki ket
bc szerint nvekv sorrendben! Ezutn tegyk lehetv, hogy a felhasznl
szvegeket kereshessen a bevitt sorozatban: ha az ltala megadott szveg benne
van a sorozatban, rjuk ki els elfordulsnak indext (nulltl szmozva), egyb-
knt rjuk ki, hogy "Nincs ilyen szveg"! Ha res szveget adnak meg, legyen vge a
programnak!

A program az elz pontban szerepl PrimitivRendezett.java program hasonmsa. A


StringRendezett.java forrskdban vastagon szedtk a megvltoztatott rszeket. Figyelje
meg, hogy rendezskor s keresskor a szvegek sszehasonltsra nem a <, >, s == operto-
rokat alkalmaztuk, mint primitv elemek esetn, hanem a compareTo() metdust!

A bevitt szveget az equals() metdussal vizsgljuk meg, hogy az res szveg-e. Ezt megte-
hettk volna a compareTo() metdussal is, de az equals() hasznlata knyelmesebb, s
ugyanaz az eredmnye. Az indexOf() metdusban a rendezett elemek kztt keresnk. Mivel
a rendezst a compareTo() metdus alapjn vgeztk, a keress is eszerint trtnik.

Forrskd
import extra.*;

class Kontener {
private String[] tomb = new String[1000];
private int size=0;

public Kontener() {
String elem;
while ((size<tomb.length) &&
!(elem=Console.readLine("Szveg: ")).equals("")) {
tomb[size++] = elem;
}
rendez();
}

public void kiir() {


for (int i=0; i<size; i++)
System.out.print(tomb[i]+" ");
System.out.println();
}

private void rendez() {


for (int i=0; i<=size-2; i++) {
int minIndex = i;
422 VI. RSZ. KONTNEREK

for (int j=i+1; j<=size-1; j++)


if (tomb[j].compareTo(tomb[minIndex])<0)
minIndex = j;

if (i != minIndex) {
String seged = tomb[i];
tomb[i] = tomb[minIndex];
tomb[minIndex] = seged;
}
}
}

// Adott elem keresse:


public int indexOf(String elem) {
for (int i=0; i<size; i++) {
if (tomb[i].compareTo(elem) == 0)
return i;
if (tomb[i].compareTo(elem) > 0)
return -1;
}
return -1;
}
} //Kontner

public class StringRendezett {


public static void main(String[] args) {
Kontener kontener = new Kontener();
kontener.kiir();
// Keress:
String elem;
while (!(elem=Console.readLine
("Keresend szveg: ")).equals("")) {
int index = kontener.indexOf(elem);
if (index >= 0)
System.out.println("Indexe: "+index);
else
System.out.println("Nincs ilyen szveg");
}
} // main
} // StringRendezett

A program egy lehetsges futsa


Szveg: Madrid
Szveg: Stockholm
Szveg: London
Szveg: Budapest
Szveg: Rma
Szveg:
Budapest London Madrid Rma Stockholm
Keresend szveg: Moszkva
Nincs ilyen szveg
Keresend szveg: London
Indexe: 1
19. Rendezs, keress, karbantarts 19.6. Sajt osztly objektumok rendezse, keresse 423

19.6. Sajt osztly objektumok rendezse, keresse


Az, hogy mikor egyenl kt objektum, valamint az, hogy mikor kisebb az egyik objektum,
mint a msik, nzpont krdse. Adott pldul a kvetkez feladat:

Feladat Hordkeress
Egy borsz klnbz mret henger alak hordkba tlti borait. Egy hordra
jellemz annak tmrje s magassga (cm-ben), ezek egyttesen meghatrozzk a
hord kapacitst (literben). A borsz a hordk feltltse utn sorba rendezi a hor-
dkat, hogy gy knnyebb legyen majd egy adott mret, illetve kapacits hordt
megtallni. rjunk a borsznak egy olyan programot, amely segti a hordk kivlasz-
tsban!
A program elejn hozzuk ltre a hordkat, majd keressnk a hordsorban adott
mret, illetve kapacits hordkat!

A borsz hordit a 19.6. bra mutatja. Hogyan rendezi sorba a borsz a hordkat? Tbbfle
szempont is lehetsges: rendezhetn ket tmrjk, magassguk vagy kapacitsuk szerint akr
nvekv, akr cskken sorrendbe. Fizikailag csak egyflekppen tudja elrendezni a hordkat;
el kell teht dntenie, mi legyen a rendezsi szempont. Mivel a legtbb vev literben kri a
bort, s a kisebb hordknak nagyobb a keletje, gy dnt, hogy legyen a hordk sorrendje kapa-
cits szerint nvekv! Ebben az esetben egy hord akkor kisebb, mint egy msik, ha kisebb a
kapacitsa. Kt hord akkor egyenl, ha egyenl a kapacitsuk. Ezt a felttelt a hord oszt-
lynak compareTo() metdusban fogjuk megfogalmazni, s eszerint vgezzk el majd a
rendezst is.

A rendezs a compareTo(), azaz kapacits szerint;


a keress az equals(), azaz a pontos mret szerint trtnik.

hasonltHord
(tmr,magassg) (60,20)
kapacits ??

(30,80) equals()? (70,100)


(30,70) 57 385
49
(100,40)
(60,20) 314
57

19.6. bra. A borsz hordi


424 VI. RSZ. KONTNEREK

A program terve Hordo(atmero,magassag)


Kontener()
kiir() kapacitas()
indexOf(kap) equals(hordo)
indexOf(hasonlitoHordo) compareTo(hordo)
:Hordo
:Hordo
:HordoKereses :Kontener :Hordo

meretKereses() rendez()
kapacitasKereses()

HordoKereses Kontener Hordo

-hordok: Hordo[1000] -atmero: int


-size: int -magassag: int
kontener *
HordoKereses() +Kontener() +Hordo(atmero, magassag)
kapacitasKereses() +kiir() +kapacitas(): int
meretKereses() -rendez() +equals(hordo):boolean
+main(...) +indexOf(hordo): int +compareTo(hordo):int
+indexOf(kap): int +toString(): String
+indexOf(kap,index):int

19.7. bra. Hordkeress program egyttmkdsi s osztlydiagramja

A vev ktflekppen fog keresni:


Adott mret (tmr s magassg) hord keresse: Erre a compareTo() metdust
nem tudjuk alkalmazni, hiszen az csak a kapacitst vizsglja; neknk pedig mindkt
mretnek szigoran meg kell egyeznie. rjuk meg az equals() metdust a kvetkez-
kppen: kt hord egyenl, ha tmrje s magassga is egyenl. A keresshez ltreho-
zunk egy hasonlt objektumot a kvnt adatokkal, s a sorozatban addig keresnk, amg
az equals() metdus true rtket nem ad vissza.
Adott kapacits hord keresse: Keresskor a compareTo() metdussal addik egy
nehzsg: a metdus objektumokat hasonlt ssze, ezrt egy adott objektum keresshez
ssze kell lltanunk egy n. hasonlt objektumot. A hasonlt objektumban ki kell tl-
tennk azokat az adatokat, amelyek rszt fognak venni a hasonltsban. Egy adott kapa-
cits objektumot azonban nagyon nehzkes lenne meghatrozni (mert az objektumnak
19. Rendezs, keress, karbantarts 19.6. Sajt osztly objektumok rendezse, keresse 425

nincs ilyen tulajdonsga). A keresst inkbb gy vgezzk el, hogy sorban minden
egyes hordnak lekrdezzk a kapacitst, s sszehasonltjuk a keresett rtkkel.

A fentiek figyelembevtelvel a program tervt a 19.7. bra mutatja.

Sajt objektumok rendezsekor s keressekor egyenlsgvizsgl s hasonlt metdu-


sokat szoks alkalmazni; ezek megrsa a programoz feladata. Az equals() metdus
alkalmas az egyenlsgvizsglatra, a compareTo() pedig a hasonltsra.

Az equals() s a compareTo() metdusok objektumokat hasonltanak ssze. E met-


dusok hasznlathoz ssze kell lltani egy hasonlt objektumot, amelyben be kell ll-
tani az egyenlsgvizsglatban, illetve hasonltsban szerepl adatokat. A hasonlt objek-
tumban csak egy rszllapotot hatrozunk meg, ehhez egy kln konstruktort kell ksz-
teni. Vigyzat! A hasonlt objektum egy korcs objektum, abban csak a hasonltshoz
szksges adatokat lltottuk be! A hasonlt objektumot a keress utn ki kell dobni,
vagy ha megtartjuk, akkor llapott ki kell egszteni!

Megjegyzs: Vannak a Javban olyan keres s rendez metdusok, amelyek megkvetelik


az equals(), illetve a compareTo() metdusok megadst. A Collections osztly ilyen
algoritmusairl a kvetkez fejezetben lesz sz.

Forrskd, a program elemzse


import extra.*;
class Hordo {
private int atmero, magassag; // cm-ben

public Hordo(int atmero, int magassag) {


this.atmero = atmero;
this.magassag = magassag;
}

A hord kapacitsnak kiszmtsa: (tmr/2)2*PI*magassg/1000. Mivel az tmr s


magassg mrtkegysge cm, a trfogatot el kell osztanunk 1000-rel, hogy a kapacitst literben
kapjuk meg. Az tmrt 2.0-val osztjuk, mert az egsz oszts miatt csonkulna az eredmny:
public int kapacitas() {
return (int)(Math.round(Math.pow(atmero/2.0,2)*
Math.PI*magassag/1000));
}

Kt hord akkor egyenl, ha tmrjk s magassguk egyarnt egyenl:


public boolean equals(Hordo hordo) {
return (hordo.atmero == atmero) &&
(hordo.magassag == magassag);
}
426 VI. RSZ. KONTNEREK

A visszaadott rtk pozitv, ha a hord sajt kapacitsa nagyobb, negatv, ha a hord sajt
kapacitsa kisebb, mint ami a paramterben meg van adva; s nulla, ha a kt kapacits egyenl:
public int compareTo(Hordo hordo) {
return kapacitas()-hordo.kapacitas();
}
public String toString() {
return "\ntmer:"+Format.right(atmero,6)+
" Magassg:"+Format.right(magassag,6)+
" Kapacits:"+Format.right(kapacitas(),8);
}
} // Hordo

class Kontener {
private Hordo[] tomb = new Hordo[1000];
private int size=0;

A konstruktorban a borsz beti a hordk mreteit. Ha nincs tbb hord, akkor az tmrnl
nullt t. Vigyzunk, hogy ekkor mr ne krjk be a magassgt!

public Kontener() {
int atmero;
while (size<tomb.length &&
(atmero=Console.readInt("\ntmer: "))!= 0) {
tomb[size++] = new Hordo(atmero,
Console.readInt("Magassg: "));
}
rendez();
}
public void kiir() {
for (int i=0; i<size; i++)
System.out.print(tomb[i]+" ");
System.out.println();
}

A sajt kszts osztlyok objektumait ugyangy rendezzk, mint ms objektumokat. Egyet-


len kikts, hogy az objektumoknak legyen compareTo() vagy egyb hasonlt metdusuk:
private void rendez() {
for (int i=0; i<=size-2; i++) {
int minIndex = i;
for (int j=i+1; j<=size-1; j++)
if (tomb[j].compareTo(tomb[minIndex])<0)
minIndex = j;

if (i != minIndex) {
Hordo seged = tomb[i];
tomb[i] = tomb[minIndex];
tomb[minIndex] = seged;
}
}
}
19. Rendezs, keress, karbantarts 19.6. Sajt osztly objektumok rendezse, keresse 427

A sajt kszts osztlyok objektumait ugyangy keressk, mint ms objektumokat. Egyetlen


kikts, hogy az objektumoknak legyen compareTo(), equals() vagy egyb hasonlt
metdusuk. Itt egy adott mret (tmrj s magassg) hordt keresnk, a keressi felttel
szempontjbl rendezetlen tmbben:
public int indexOf(Hordo hordo) {
for (int i=0; i<size; i++) {
if (hordok[i].equals(hordo))
return i;
}
return -1;
}

Adott kapacits hord keresse ellrl. Meghvja a msik indexOf() metdust:


public int indexOf(int kap) {
return indexOf(kap,0);
}

Adott kapacits hord keresse a megadott indextl. A keress a kapacits szerint rendezett
tmbben trtnik:
public int indexOf(int kap, int index) {
for (int i=index; i<size; i++) {
int iKap = tomb[i].kapacitas();
if (iKap == kap)
return i;
if (iKap > kap)
return -1;
}
return -1;
}
}

public class HordoKereses {


private Kontener kontener;

A konstruktorban ltrehozzuk a hord objektumokat tartalmaz kontnert, aztn elszr adott


mret, majd adott kapacits hordkat keresnk:
public HordoKereses() {
kontener = new Kontener();
kontener.kiir();
meretKereses();
kapacitasKereses();
}

Adott mret hordk keresse. A bekrt adatok alapjn ltrehozunk egy hasonlitoHordo
nev objektumot hasonlts cljra. Ezt a hordt megkeressk a kontnerben a Kontener osz-
tlyban megrt indexOf(Hordo) fggvnnyel:
428 VI. RSZ. KONTNEREK

void meretKereses() {
int atmero;
Hordo hasonlitoHordo;

atmero = Console.readInt("\ntmer: ");


while (atmero!=0) {
hasonlitoHordo=
new Hordo(atmero,Console.readInt("Magassg: "));
int index = kontener.indexOf(hasonlitoHordo);
if (index >= 0)
System.out.println("Indexe: "+index);
else
System.out.println("Nincs ilyen elem");
atmero = Console.readInt("\ntmer: ");
}
}

Adott kapacits hordk keresse. Most nem kell hasonlt objektum, mert az egyes hordk
primitv tpus kapacitsait hasonltjuk ssze sorban a keresend rtkkel. A keresst a
Kontener osztlyban megrt indexOf(int) fggvnnyel vgezzk el:
void kapacitasKereses() {
int kap;

while ((kap=Console.readInt("Keresend kapacits: "))!=0){


int index = kontener.indexOf(kap);
if (index >= 0)
System.out.println("Indexe: "+index);
else
System.out.println("Nincs ilyen hord");
}
}

public static void main(String[] args) {


new HordoKereses();
} // main
} //HordoKereses

Figyelje meg, hogy a Kontener osztlyban hromfle indexOf() metdus szerepel! Az adott
indextl indul keresst a feladatban nem hasznltuk ki. A metdus azonban kapra jhet, ha
meg szeretnnk szmolni az adott kapacits hordk szmt, vagy ki szeretnnk rni azok ada-
tait.
19. Rendezs, keress, karbantarts 19.7. Szvegek rendezett karbantartsa 429

19.7. Szvegek rendezett karbantartsa


Feladat Karbantarts, rendezett
Neveket szeretnnk nyilvntartani. Ksztsnk olyan programot, amely lehetv teszi
a nevek rendezett karbantartst s listzst. Kt egyforma nv nem szerepelhet a
nyilvntartsban. A kvetkez funkcikat menbl lehet krni:
Nv felvitele
Nv keresse
Nv trlse
Nvsor rendezetten

Ksztsnk egy SortedStringContainer osztlyt, amely felels a karbantartsi funkcik


elvgzsrt. A kontnerbe be lehet tenni egy nevet, ki lehet onnan egy adott nevet trlni, ki
lehet listzni a benne lev sszes nevet stb. A program terve a 19.8. brn lthat.

SortedStringContainer

-array: String[]
-capacity, size: int
-current: int

KarbRendezett +SortedStringContainer(capacity: int)


+SortedStringContainer()
+capacity(): int
beszuras() nevek +size(): int
kereses() +isEmpty(): boolean
torles() +isFull(): boolean
listazas() +contains(str: String): boolean
+main(...) +indexOf(str: String): int
+add(str: String): boolean
+remove(str: String): boolean
+print()

19.8. bra. KarbRendezett program osztlydiagramja

Forrskd, a program elemzse


import extra.*;
430 VI. RSZ. KONTNEREK

A SortedStringContainer szvegeket rendezetten trol osztly. A szvegeket az array


trolja; capacity a trol kapacitsa (nem lehet nvelni); size a trol aktulis mrete;
current pedig egy globlis mutat (index): azt a contains lltja, s a keress utn ms
metdusok felhasznljk rtkt:
class SortedStringContainer {
private String[] array; // kontner tmb
private int capacity; // kontner kapacitsa
private int size; // kontner aktulis mrete
private int current; // keress utn felhasznlhat mutat

Konstruktorok. Ha nem adunk meg kapacitst, akkor az 100 lesz:


public SortedStringContainer(int capacity) {
this.capacity = capacity;
size = 0;
array = new String[capacity];
}

public SortedStringContainer() {
this(100);
}

Lekrdez metdusok:
public int capacity() { return capacity; }
public int size() { return size; }
public boolean isEmpty() { return size == 0; }
public boolean isFull() { return size == capacity; }

Megmondja, van-e mr ilyen elem. lltja az osztlyszint current indexet: rtke az a poz-
ci, ahol az elem van, illetve ahova be kellene szrni:
public boolean contains(String str) {
for (current=0; current<size; current++) {
if (array[current].compareTo(str) == 0)
return true;

if (array[current].compareTo(str) > 0)
return false;
}
return false;
}

Ha van a trolban str, akkor annak indext, egybknt -1-et ad vissza:


public int indexOf(String str) {
if (contains(str))
return current;
else
return -1;
}
19. Rendezs, keress, karbantarts 19.7. Szvegek rendezett karbantartsa 431

Beszrs. A contains megkeresi azt a pozcit, ahov az elemet be kellene szrni. Be is


szrjuk az str-t, s a felette ll elemeket feljebb toljuk:
public boolean add(String str) {
if (isFull())
return false;
if (contains(str))
return false;
else { // current-et a contains adja
for (int i=size; i>current; i--)
array[i] = array[i-1];
array[current] = str;
size++;
return true;
}
}

Trls. A trlt elemre hzzuk a felette ll elemeket. A current. elem megsznik gy, hogy
azt fellrjuk a current+1. elemmel, a current+1. elemet fellrjuk a current+2. elemmel
stb. A trol mrett eggyel cskkentjk:
public boolean remove(String str) {
if (contains(str)) {
size--;
for (int i=current; i<size; i++)
array[i] = array[i+1];
return true;
}
else
return false;
}

Elemek listzsa:
public void print() {
for (int i=0; i<size; i++)
System.out.println(array[i]);
}
} // SortedStringContainer

A fosztly. Nevek rendezett karbantartsa s listzsa:


public class KarbRendezett {
private SortedStringContainer nevek =
new SortedStringContainer(20);

Beszrs: Bekrnk egy nevet. Ha a kontner tele van, vagy ltezik mr ilyen nv, sajnlko-
zunk, egybknt a nevet beszrjuk:
void beszuras() {
if (nevek.isFull()) {
System.out.println("Nincs tbb hely");
return;
}
432 VI. RSZ. KONTNEREK

String nev = Console.readLine("j nv: ");


if (nevek.contains(nev))
System.out.println("Van mr ilyen nv");
else
nevek.add(nev);
}

Keress: Bekrjk a nevet. Ha a nv indexe -1, akkor kirjuk, hogy nincs ilyen nv, egybknt
kirjuk, hogy hnyadik a rendezettsgben (0-tl szmtva):
void kereses() {
String nev = Console.readLine("Keresend nv: ");
int n = nevek.indexOf(nev);
if (n == -1)
System.out.println("Nincs ilyen nv");
else
System.out.println(n+". nv");
}

Trls: Bekrjk a nevet. Ha van ilyen nv (indexe>=0), akkor rkrdeznk, hogy a felhasz-
nl biztosan trlni akarja-e, s ha igen, akkor trljk:
void torles() {
String nev = Console.readLine("Trlend nv: ");
if (nevek.indexOf(nev)>=0) {
if (Character.toUpperCase(Console.readChar
("Biztosan trlni akarja? (I/N) "))=='I')
nevek.remove(nev);
}
else
System.out.println("Nincs ilyen nv!");
}

Listzs: Meghvjuk a kontner print() metdust:


void listazas() {
System.out.println("Nevek:");
nevek.print();
}

Men: Az elbbi funkcikat menbl hvjuk:


void menu() {
char menu;
do {
System.out.print("\nU(j) K(eres) T(rl) L(ista) V(ge)? ");
menu = Character.toUpperCase(Console.readChar());
switch (menu) {
case 'U' : { beszuras(); break; }
case 'K' : { kereses(); break; }
case 'T' : { torles(); break; }
case 'L' : { listazas(); break; }
}
} while (menu != 'V');
}
19. Rendezs, keress, karbantarts 19.7. Szvegek rendezett karbantartsa 433

public static void main(String[] args) {


new KarbRendezett().menu();
}
}

A SortedStringContainer osztlyt megrhatnnk sokkal ltalnosabbra is. A kontner


alaposztlya nyugodtan lehetne Object, ekkor az Object brmilyen leszrmazottjt is belete-
hetnnk. Figyelje meg, hogy a contains() metdust kivve teljesen mindegy, hogy String
vagy Object tpus elemmel dolgozunk. A contains() metdus viszont kihasznlja, hogy a
kontnerbe beletett objektumban van compareTo() metdus, ez Object-ben hinyzik. A
teljesen ltalnos kontnert a kvetkez fejezet trgyalja.

Megjegyzs: A Java osztlyknyvtrban vannak ksz kontnerek. A tovbbiakban term-


szetesen ezeket a ksz kontnereket fogjuk felhasznlni programjaink ksztsekor. A kvet-
kez fejezet ilyen kontnerekrl szl.

Tesztkrdsek

19.1. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) A Javban az objektumok opertorokkal sszehasonlthatk.
b) Ha egy sorozatot direkt mdon rendeznk, akkor a rendezs utn visszanyerhet a
sorozat eredeti, rendezs eltti llapota.
c) Ha egy sorozatot indexesen rendeznk, akkor a rendezs utn visszanyerhet a soro-
zat eredeti, rendezs eltti llapota.
d) A minimumkivlasztsos rendezs esetn nem kell elemeket cserlni.
19.2. Adva van egy nvekeds szerint rendezett tmb. Keresnk egy olyan elemet, amely
benne van a tmbben. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) A tmb vgig kell keresni.
b) Abbahagyhatjuk a keresst, ha talltunk az elemnl kisebb elemet.
c) Abbahagyhatjuk a keresst, ha talltunk az elemnl nagyobb elemet.
d) Ha az elemek objektumok, akkor azok osztlyban ktelezen szerepelnie kell egy
olyan metdusnak, amely eldnti, melyik objektum van elbb a rendezettsgben.
19.3. Jellje meg az sszes igaz lltst a kvetkezk kzl!
a) Karbantarts sorn az objektum kulcst nem szabad mdostani.
b) A beszrs rendezett, illetve rendezetlen kontnerbe ugyangy trtnik.
c) A trls rendezett, illetve rendezetlen kontnerbl ugyangy trtnik.
d) Ha egy rendezetlen sorozatban szekvencilisan keresnk, akkor az elemet addig
keressk, amg meg nem talljuk, vagy a sorozat vgre nem rnk.
434 VI. RSZ. KONTNEREK

19.4. Jellje meg az sszes igaz lltst a kvetkezk kzl!


a) Csak olyan objektumok rendezhetk, amelyek sszehasonlthatk.
b) A compareTo() metdust kt objektum sorrendisgnek megllaptsra szoktk
alkalmazni.
c) Az Object.equals() metdus visszatrsi rtke int.
d) Az equals(Object) metdussal trtn keresshez ssze kell lltanunk egy
hasonlt objektumot, s a metdusnak ezt az objektumot kell tadni aktulis para-
mterknt.
19.5. Mi lesz az elemek sorrendje a kvetkez programrszlet lefutsa utn? Jellje meg az
egyetlen j vlaszt!
int[] tomb = {2,4,0,4,55,3};
for (int i=0; i<tomb.length-1; i++)
for (int j=i+1; j<tomb.length; j++)
if (tomb[j] > tomb[i]) {
int seged = tomb[i];
tomb[i] = tomb[j];
tomb[j] = seged;
}

a) 0 2 3 4 4 55
b) 0 2 4 4 55 3
c) 55 4 4 3 2 0
d) 55 4 4 2 0 3

Feladatok

19.1. Generljon 1000 darab -100 s 100 kztti vletlen vals szmot! Rendezze a szmokat
a) (A) nvekv sorrendbe!
b) (A) cskken sorrendbe!
c) (C) gy, hogy elbb lljanak a nem negatv szmok nvekv sorrendben, aztn a
negatv szmok cskken sorrendben!
(VeletlenSzamok.java)
19.2. Krjen be a konzolrl neveket vgjelig! Rendezze a neveket
a) (A) nvekv sorrendbe!
b) (A) cskken sorrendbe!
c) (C) keresztnv (a msodik sz) szerint nvekv sorrendbe!
Tegyk fel, hogy 100-nl tbb nevet biztosan nem visznek be. (Nevsor.java)
19.3. (B) Krjen be a konzolrl neveket. Ha olyan nevet tnek be, amelyik mr szerepelt,
akkor krje be az illet szletsi vt, s tegye azt a nv utn (pl. Olajos Olga 1986). Ha
ilyen is ltezik, krjk be jra a nevet! Vgl rja ki a neveket nv, azon bell szletsi
v szerint rendezetten! (RendNevek.java)
19. Rendezs, keress, karbantarts 19.7. Szvegek rendezett karbantartsa 435

19.4. (A) Tpllja be a programba a vilg legnagyobb tengereinek neveit s terlet adatait!
Listzza ki az adatokat a tenger terlete szerint cskken rendezettsgben!
(Jeges:10512, Korall:4791, Arab:3683, Fldkzi:2969, Weddel:2890, Karib:2754...)
(Tengerek.java)

19.5. (B) A 19. fejezet 6. pontban tallhat HordoKereses.java programot vltoztassa meg
gy, hogy a rendezs
a) a hord kapacitsa s azon bell az tmr szerint nvekv legyen!
b) a hord kapacitsa szerint nvekv, azon bell az tmr szerint cskken legyen!
c) a hord kapacitsa s azon bell a magassg szerint cskken legyen!
(HordoKereses.java)

19.6. (C) Ksztsen egy olyan szvegeket trol osztlyt, melyben egyltaln nem fontos a
trols sorrendje, fontos viszont a gyors trls! Tipp: j elemet az utols elem utn
vigynk fel, trlskor az utols elemet ugrasszuk be a trlt elem helyre!
(KarbRendezetlen.java)

19.7. (C) Egsztse ki a SortedStringContainer osztlyt egy increaseCapacity(int)


metdussal, mely a paramterben megadott plusz elemszmmal megnveli a kontner
kapacitst! j elem felvitelnl a kontner automatikusan bvljn!
(KarbKapNovel.java)
436 VI. RSZ. KONTNEREK
20. A Vector s a Collections osztly 20.1. A kontner funkcii ltalban 437

20. A Vector s a Collections osztly

A fejezet pontjai:
1. A kontner funkcii ltalban
2. Vector osztly
3. Az equals metdus szerepe
4. A kontner elhagysa az UML diagramrl
5. Interfszek Collection, List, Comparable
6. Collections osztly
7. Feladat Nobel djasok
8. Feladat Vrosok
9. Feladat Autelads

Kontner objektumnak nevezzk az egysok kapcsolatot megvalst objektumot. A tmb is


kontner, de nem osztly, nincsen viselkedse: a tmbben trolt objektumok karbantartsra s
az elemek keressre az egyes funkcikat kln meg kell rni. Egy kontner osztly az elemek
trolsn kvl a klnbz karbantartsi, keressi s bejrsi funkcikat is megvalstja. A
Java kollekci keretrendszer (Collections Framework) egy API kontnergyjtemny, mely
klnbz kontner- s ms, kiegszt osztlyokat, interfszeket knl fel a programoz
szmra. A fejezetben a kollekci-keretrendszer kt osztlyt ismerjk meg rszletesen: a
Vector s a Collections osztlyokat. A Vector egy olyan kollekci, amely objektumok
rendezetlen trolsra kpes. A Collections osztly statikus metdusai kollekcikon rtel-
mezett rendez, keres s egyb kisegt algoritmusokat implementlnak.

20.1. A kontner funkcii ltalban

A kontner olyan objektum, amely objektumokat trol, s alkalmas klnbz karbantar-


tsi, keressi s bejrsi funkcik megvalstsra.

A 20.1. brn lthat kontnerbe az add(element) metdussal objektumot tehetnk be, a


remove(element) segtsgvel pedig egy konkrt objektumot tvolthatunk el. A size()
megadja a kontner aktulis mrett, az isEmpty() metdussal megkrdezhetjk, hogy a
438 VI. RSZ. KONTNEREK

kontner res-e, a contains(element) pedig megmondja, hogy a kontner tartalmaz-e a


paramterben megadott objektummal egyenl elemet. A get(i) visszaadja a kontner i.
elemt, a beraks sorrendjben.

Megjegyzs: A kontnerekre ltalban jellemz az a kpessg is, hogy az elemeket sorban


egyms utn is ki tudjk adni. A first() pldul kiadja a kontner els objektumt, a
next(element) egy adott objektumhoz kpest a kvetkezt, a previous(element) pedig
az elzt. Ebbl az els kt funkcit a Vector osztly itertora teljesti. Az itertorokrl a 2.
ktetben lesz sz.

add(element)
Object
remove(element)
size()
AnyClass isEmpty()
contains(element)
+metdus get(i) :AnyClass
kliens :Kontner
:AnyClass
.
.
.
((AnyClass)element).metdus
element :AnyClass

20.1. bra. A kontner funkcii ltalban

A Javban j nhny kontner osztlyt implementltak. A java.util csomagban helyet fog-


lal Java kollekci keretrendszer (Collections Framework) egy ltalnos kontnereket tartal-
maz osztlygyjtemny, melyben a kontnerek kollekcik vagy lekpezsek:
Kollekci (collection): A kollekci kontner egyszer trolst valst meg. Egyes kol-
lekcikba kizrlag egyedi elemek tehetk be, msokban az elemek dupliklhatk.
Egyes kollekcik rendezetten troljk az elemeket, msok rendezetlenl. A kollekci
keretrendszer kollekciosztlyai a HashSet, a TreeSet, a Vector, az ArrayList s a
LinkedList.
Lekpezs (map): Egy lekpezs kontnerben a nyilvntarts kulcsobjektumok szerint
trtnik. A kulcsokhoz informcihordoz objektumok rendelhetk. Kulcsok alapjn a
keress s a karbantarts sokkal hatkonyabb. A kollekci keretrendszer lekpe-
zsosztlyai a HashMap, a HashTable s a TreeMap.
20. A Vector s a Collections osztly 20.2. Vector osztly 439

A programoz feladata azt a kontnert kivlasztani, amelyik az adott feladat megoldsra a


legalkalmasabb. Ha nincs a feladatra alkalmas kontner, akkor kt lehetsgnk nylik:
vagy egy mr meglev osztlyt fejlesztnk tovbb, vagy egy teljesen jat runk. Ez utbbi
megoldsra ritkn van csak szksg.
A Java osztlyknyvtr kontnerei ltalnosak, azokba brmilyen objektumot betehe-
tnk. Egyetlen felttel, hogy az objektum osztlya az Object-bl szrmazzon, de ez a
Javban termszetes. A kontner ltalnossgnak azonban ra van: a betett objektumok
elvesztik osztlytudatukat, hiszen egy kontner minden objektumot egysgesen
Object-knt kezel. A kontner az objektum referencijt a kliens szmra Object tpus-
knt adja t (element:Object). Ha a kontnertl megkapott objektumnak zenni aka-
runk, akkor r kell knyszertennk annak osztlyt:
((AnyClass)element).metdus

A bels zrjel az AnyClass tpus rknyszertse az element-re. A kls zrjel azrt


szksges, mert a pont opertor ersebb priorits, mint a tpusknyszert opertor.

E fejezet a Vector osztlyt fogja bemutatni, amely a java.util csomagban tallhat Java
kollekci keretrendszer rsze. A Vector osztllyal az egyszerbb karbantartsi feladatok tbb-
sge megoldhat. A teljes kollekci keretrendszerrl a knyv 2. ktetben lesz sz.

20.2. Vector osztly

A Vector osztly a 20.2. brn lthat. Az osztlyban nincs feltntetve az sszes lehetsges
metdus, csak a szmunkra lnyeges kpessgeket trgyaljuk.

A vektor egy kontner objektum; egy vltoztathat mret tmb, amely rendelkezik kar-
bantartsi s keressi funkcikkal.

ltalnos jellemzk:
- A vektor mrete az elemek hozzadsval automatikusan bvl. A vektor mret-
nek fizikailag csak az index int tpusa s a memriamret szab hatrt. A vektor ugyan
egy fix mret tmbben trolja az elemeket (elementData), de ez a tmb szksg
esetn automatikusan lecserldik. Bvlskor a rendszer ltrehoz egy j, nagyobb
tmbt, melybe tmsolja a rgi vektor elemeit. A tmb mrete a vektor kapacitsa:
capacity(), a tmbben trolt aktulis elemek szma pedig a vektor mrete: size().
Ltrehozskor megadhat a vektor kezdeti kapacitsa: initialCapacity. Ha a kapa-
citst nem adjuk meg, akkor annak rtke 10. Megadhat tovbb a nvekeds mrtke:
capacityIncrement, ennyivel fog a tmb kapacitsa automatikusan megnni, amikor
a tmb betelik. Ha nem adjuk meg ezt az rtket, akkor a vektor a ktszeresre bvl. A
kapacits s a bvls mrtknek megadsakor figyelembe kell venni, hogy a gyakori
440 VI. RSZ. KONTNEREK

bvts felttlenl a hatkonysg rovsra megy, a tl nagy kapacits megadsa viszont


indokolatlan memriafoglalssal jrhat.
- A vektor elemei indexelhetk. Az index egy 0 s size()-1 kztti rtk. Az i.
elemet a get(i) fggvny adja meg. Hibs index megadsakor ArrayIndexOutOf
BoundsException kivtel keletkezik.

Kontner
Vector

#elementData: Object[]
#elementCount: int
#capacityIncrement: int
+Vector()
+Vector(initialCapacity: int)
+Vector(initialCapacity: int, capacityIncrement: int)
+Vector(c: Collection)
+size(): int
+capacity(): int
+isEmpty(): boolean
+get(index:int): Object
+contains(element : Object) : boolean
+containsAll(c: Collection) : boolean
+equals(obj: Object): boolean
+toString(): String
+setSize(newSize: int)
+set(index: int, element: Object): Object
+add(element: Object): boolean
+add(index: int, element: Object) : boolean
+addAll(c: Collection): boolean
+addAll(index: int, c: Collection): boolean
+remove(element: Object): boolean
+remove(index: int) : Object
+removeAll(c: Collection): boolean
+retainAll(c: Collection): boolean
+clear()
+indexOf(obj: Object): int
+indexOf(element: Object, index: int): int
+lastIndexOf(obj: Object): int
+lastIndexOf(obj: Object, index: int): int

20.2. bra. Vector osztly


20. A Vector s a Collections osztly 20.2. Vector osztly 441

- A vektor elemei rendezetlenek. A keressek s a trlsek mindig a megadott


hasonlt objektummal egyenl objektumra vonatkoznak. Kt objektum (egyik s
msik) egyenl, ha az egyik.equals(msik) rtke true.

Karbantart funkcik:
- Beszrs (add): j elemet vagy egy egsz kollekcit beszrhatunk akr a vektor vgre,
akr egy adott objektum el.
- Trls (remove): Akr egy adott objektum, akr egy adott index objektum trlhet.
Egy msik kollekci sszes eleme is trlhet a vektorbl.
- Mdosts (bellts, set): Egy adott objektum fellrhat (kicserlhet) egy msik
objektummal, illetve egy adott objektum adatai megvltoztathatk.
Keres funkcik:
- Keress (indexOf): Rkereshetnk egy adott objektumra a vektor elejtl elrefel vagy
a vektor vgtl visszafel, az els (utols) vagy a megadott indextl kezdden.

Pldaknt ltrehozunk egy emberek vektort, melynek kezdeti kapacitsa (initialCapacity)


4, a bvts egysge (capacityIncrement) pedig 3. A vektorba 5 darab, Ember osztly
objektumot tesznk (20.3. bra):
Vector emberek = new Vector(4,3);
for (int i=0; i<5; i++)
emberek.add(new Ember(...));

Ngy elem bettele utn emberek.capacity() s emberek.size() rtke egyarnt 4. Az


5. objektumnak (melynek indexe 4) a vektorhoz val hozzadsakor (s minden olyan esetben,
amikor betelt az aktulis tmb) a vektor kapacitsa 3-mal bvl. Ekkor emberek.
capacity()==7 s emberek.size()==5.

initialCapacity capacityIncrement

0 1 2 3 4

:Ember :Ember :Ember :Ember :Ember size() capacity()


Class
442 VI. RSZ. KONTNEREK

20.3. bra. A vektor bvtse

Megjegyzs: A bvls szksg esetn automatikusan megtrtnik (egy alaprtelmezett


rtkkel), fggetlenl attl, hogy megadtuk-e a kezdeti kapacitst s a bvls mrtkt.
Ezeket a paramtereket kizrlag a hatkonysg rdekben szoks megadni.

Vector osztly osztlylers

Konstruktorok
Vector(int initialCapacity, int capacityIncrement) //1
Vector(int initialCapacity) //2
Vector() //3
Vector(Collection c) //4
//1-ben megadhat a kezdeti kapacits s a bvls mrtke. //2-ben a bvls mrtke
ktszeres. //3-ban a kezdeti kapacits 10, a bvls mrtke ktszeres. Mindhrom eset-
ben a vektor kezdeti mrete 0 (size()==0). //4-ben a ltrejv vektor egy mr meg-
lv vektor, illetve kollekci elemeinek tmsolsval indul. A vektor mrete c mret-
vel lesz egyenl, a kapacits c-nek 110 %-a, a nvekeds mrtke ktszeres.

Lekrdezsek
int size()
Visszaadja a vektor mrett, vagyis az ppen benne lv objektumok szmt.
int capacity()
Visszaadja a vektor aktulis kapacitst.
boolean isEmpty()
Visszaadja, hogy a vektor res-e. isEmpty rtke true, ha size()==0.
Object get(int index)
Visszaadja az index index objektumot.
boolean contains(Object element)
Megmondja, van-e a vektorban az element-tel egyenl elem. A vektor elemeit sorban
megvizsglja, hogy van-e olyan elem, melyre az equals(element) metdus true-t
ad vissza. Ha legalbb egy ilyen van, akkor contains rtke true.
boolean containsAll(Collection c)
Megmondja, hogy a vektor tartalmazza-e a paramterben megadott vektor (kollekci)
sszes elemt. Akkor true, ha a c kollekci minden egyes element elemre igaz,
hogy a contains(element) true rtket ad vissza.
boolean equals(Object obj)
Visszaadja, hogy a vektor egyenl-e a megadott obj objektummal (egy msik kollekci-
val). Kt vektor akkor egyenl, ha mreteik megegyeznek, s az elemek pronknt is
20. A Vector s a Collections osztly 20.2. Vector osztly 443

egyenlk (az equals metdus alapjn, vagy mindkt elem null). Ez a metdus nem
tvesztend ssze az elemeken dolgoz equals metdussal!
String toString()
Visszaadja a vektor szveges reprezentcijt: a vektor elemeit vesszvel elvlasztva,
egy szgletes zrjelben.

Mdostsok, bvtsek
void setSize(int newSize)
Belltja a vektor mrett direkt mdon: az j mret newSize lesz. Ha ez az j mret
nagyobb, mint az eredeti, akkor szksg esetn a kapacits megnvekszik. Akr
nagyobb az j mret, akr kisebb, mint az eredeti, a size()-adik elemtl kezdve az
sszes elem mutatja null rtk lesz.
Object set(int index, Object element)
Az index index objektumot trja element-re. Visszaadja az ezen a helyen eddig
szerepl objektumot.
boolean add(Object o)
Az o ltal azonostott objektumot hozzadja a vektorhoz, utols elemknt. A vektor
mrete eggyel nvekszik, s ha a vektor teltett volt, akkor a kapacits is nvekszik
capacityIncrement rtkkel. A visszaadott rtk true, ha a hozzads sikerlt
(pldul volt elg memria).
boolean add(int index, Object element)
Az element ltal azonostott objektumot beszrja a vektorba az index-edik pozciba.
A sszes tbbi objektum mutatja eggyel feljebb toldik (indexeik eggyel megnnek).
A visszaadott rtk true, ha a hozzads sikerlt.
boolean addAll(Collection c)
Hozzadja a vektorhoz (az utols elem utn) a paramterben megadott c vektor (kollek-
ci) sszes elemt. A visszaadott rtk true, ha a vektor megvltozott.
boolean addAll(int index, Collection c)
Beszrja a vektor index-edik eleme utn a paramterben megadott c vektor (kollekci)
sszes elemt. A visszaadott rtk true, ha a vektor megvltozott.

Trlsek
boolean remove(Object obj)
Kitrli az els obj objektummal egyenl objektumot a vektorbl. A trlt objektum
utni objektumok lejjebb toldnak (indexeik eggyel cskkennek). A vektor mrete
eggyel cskken. A visszaadott rtk true, ha a trls sikerlt. Az objektum csak akkor
semmisl meg tnylegesen, ha ms nem hivatkozik r. (Az egyik vektorbl kitrlt
objektum pldul egy msik vektornak mg eleme maradhat.)
444 VI. RSZ. KONTNEREK

Object remove(int index)


Kiveszi a megadott index elemet a vektorbl. A visszaadott rtk a trlt objektum
referencija.
boolean removeAll(Collection c)
Kiveszi a vektorbl a paramterben megadott c vektor (kollekci) sszes elemt. A c
minden egyes element elemre vgrehajtja a remove(element) metdust. A vissza-
adott rtk true, ha a vektor megvltozott, azaz legalbb egy elem trlsre kerlt.
boolean retainAll(Collection c)
Kzs rsz, illetve metszet kpzse. Kiveszi a vektorbl azokat az elemeket, melyek a
paramterben megadott c vektorban (kollekciban) nincsenek benne. Mskpp: a vek-
torban csak azokat az elemeket hagyja meg, melyek c-ben is benne vannak. A vissza-
adott rtk true, ha a vektor megvltozott.
void clear()
Trli a vektorbl az sszes objektumot. A vektor mrett nullra, a benne lev elemek
mutatit null-ra lltja. Az objektumokat majd a szemtgyjt megsemmisti, ha nincs
rjuk egyb hivatkozs. A kapacits nem vltozik.

Keressek
int indexOf(Object element)
int indexOf(Object element, int index)
Megkeresi a listban az els element objektummal egyenl elemet, s visszaadja
annak indext. A keress az els esetben a vektor elejtl, a msodik esetben az adott
indextl megy vgbe (belertve az index-edik elemet is), s addig halad, mgnem a
get(i).equals(element)a vektor valamely elemre true rtket ad vissza. Ha
nincs ilyen elem, a visszaadott rtk -1.
int lastIndexOf(Object element)
int lastIndexOf(Object element, int index)
Megkeresi a listban az utols element objektummal egyenl elemet, s visszaadja
annak indext. A keress visszafel trtnik, az els esetben a vektor vgtl, msodik
esetben az adott indextl, s addig megy, mgnem a get(i).equals(element)a
vektor valamely elemre true rtket ad vissza. Ha nincs ilyen elem, a visszaadott
rtk -1.
A kvetkez mintaprogram a vektor hasznlatt mutatja be. A vektor elemei tetszleges
objektumok lehetnek. Mi most szvegeket fogunk a vektorban trolni.

Feladat Vector minta


Prbljuk ki egy String objektumokat trol vektor mkdst! Kldjnk a vektor-
nak klnbz zeneteket!
20. A Vector s a Collections osztly 20.2. Vector osztly 445

Az egyes mveletek knnyebb kvetse rdekben minden egyes mvelet, illetve mveletcso-
port elvgzse utn kirunk egy informcis szveget az ppen vgrehajtott mveletrl, s a
lista() metdussal kilistzzuk a vektort. Az aktulisan kilistzott vektor elemei, illetve a
mvelet eredmnye megjegyzsknt a megfelel mvelet mellett lthat.

Forrskd
import extra.*;
import java.util.*;

public class VectorMinta {


// Vektor listzsa:
static void lista(String info,Vector v) {
System.out.println("\n"+info);
System.out.println("mret: "+v.size());
for (int i=0; i<v.size(); i++)
System.out.println(i+". "+v.get(i));
}

public static void main(String[] args) {


Vector v = new Vector();

v.add(new String("Marci"));
v.add(new String("Dani"));
v.add(new String("Peti"));
v.add(new String("Rudi"));
lista("4 elem vektor",v); // Marci Dani Peti Rudi

if (v.contains("Peti")) { // true
System.out.print("Peti benne van, ");
System.out.println("indexe:"+v.indexOf("Peti"));
}

v.remove(2);
lista("2. trlve",v); // Marci Dani Rudi

v.remove("Rudi"); // A kt Rudi egyenl (equals==true)


lista("Rudi trlve",v); // Marci Dani

v.add(0,new String("Cili"));
v.add(1,new String("Marci"));
lista("Beszrs elre",v); // Cili Marci Marci Dani

int n=v.size();
System.out.println("\nUtols kt objektum kirsa");
System.out.println(v.get(n-2)+" "+v.get(n-1)); // Marci Dani

v.set(1,new String("Tni")); // Az eddigi 1. obj. elvsz


lista("1. elem trsa Tni-ra",v); // Cili Tni Marci Dani
Vector vv = new Vector(v);
lista("vv vektor:",vv); // Cili Tni Marci Dani
446 VI. RSZ. KONTNEREK

vv.clear();
lista("A vv vektor res lett",vv); // (res)

vv.add(new String("Marci"));
vv.add(new String("Lili"));
vv.addAll(v);
lista("Marci, Lili s a teljes v hozzadsa vv-hez",vv);
// Marci Lili Cili Tni Marci Dani
lista("v vektor:",v); // Cili Tni Marci Dani

if (vv.containsAll(v)) // true
System.out.println("\nvv tartalmazza v elemeit");
else
System.out.println("\nvv nem tartalmazza v elemeit");

vv.retainAll(v);
lista("vv s v kzs rsze:",vv);
// Marci Cili Tni Marci Dani
}
} // VectorMinta

Az objektumok ltrehozsakor szndkosan alkalmazzuk a new opertort: v.add(new


String("Marci")); Helyes lett volna gy is: v.add("Marci"); de csak az elbbi esetben
tudjuk biztostani a vektor elemeinek tnyleges klnbzsgt. Ennek a program mkdse
szempontjbl nincs most jelentsge, de a forrskd gy jobban ltalnosthat. A hasonlt
objektumoknak nem kell klnbznik egymstl.

20.3. Az equals metdus szerepe

0 1 2 size()-1

:Ember :Ember :Ember :Ember


nev="Hapci" nev="Morg" nev="Szende" ... nev="Vidor"
magassag=53 magassag=87 magassag=70 magassag=66

equals(hasonlt)?

Ember.equals() metdus:
hasonlt
public boolean equals(Object obj) {
nev = "Morg" return nev.equals(((Ember)obj).getNev());
magassag: ??? }

20.4. bra. Keress a vektorban


20. A Vector s a Collections osztly 20.3. Az equals metdus szerepe 447

A Vector osztly bizonyos metdusainak adott tulajdonsg objektumot adunk meg param-
terknt. Ilyen pldul a contains(Object), a remove(Object) s az indexOf(Object)
metdus. A paramterben megadott objektum a legtbb esetben nem eleme a kontnernek,
inkbb az a gyakori eset, hogy egy adott tulajdonsg objektumot keresnk. Sok esetben a
keress eltt ssze kell lltanunk egy objektumot a hasonltshoz: ebben az objektumban be
kell lltanunk a keresend llapotot vagy rszllapotot (pldul keressk azt az objektumot,
amelyben a nv=="Morg"). A keress a vektor elejtl (vagy egy adott indextl) kezddik,
s akkor van vge, ha a vektor vgre rtnk, vagy az i. objektumra igaz, hogy
get(i).equals(hasonlt)==true. A hasonlt objektumban csak azokat az adatokat kell
megadni, amelyek befolysoljk az equals metdus visszatrsi rtkt. A keress utn a
hasonlt objektumot a feladattl fggen kiegszthetjk s felhasznlhatjuk, vagy akr el is
dobhatjuk. A 20.4. bra a vektorban vgbemen keresst mutatja be. A keress az
Ember.equals() metdus alapjn trtnik. Eszerint kt ember akkor egyenl, ha az objek-
tumban lv nv adatok megegyeznek, fggetlenl az ember tbbi adattl.

A Vector osztly egy objektumot az elemein rtelmezett equals metdus alapjn


keres meg. A keresshez ssze kell lltani egy hasonlt objektumot, amelyben meg kell
adni az equals() metdus ltal vizsglt tulajdonsgokat. Fontos, hogy az equals met-
dus akkor adjon vissza true rtket, amikor a vizsglt objektum rszllapota megegyezik a
hasonlt objektum rszllapotval. Az equals metdus helyes mkdsrl a progra-
moznak kell gondoskodnia.

Ha egy osztlynak nincs sajt equals metdusa, akkor az Object osztly equals met-
dusa marad rvnyben, amely akkor s csakis akkor ad true rtket, ha a kt objektum
azonos. Az equals metdus feje kttt:
public boolean equals(Object obj) {...}

A metdusnak aktulis paramterknt brmilyen objektum tadhat. Mivel azonban a


paramter ktelezen Object tpus, ezrt az obj objektum azon metdusaira, amelyek az
Objectben nincsenek deklarlva, csak gy tudunk hivatkozni, ha arra rknyszertjk
valdi osztlyt.

Az equals() metdus a Java osztlyok tbbsgben (Integer, Real, Character, String


stb.) fell van rva.
A kvetkez feladatban sajt kszts objektumokat trolunk vektorban.
448 VI. RSZ. KONTNEREK

Feladat Trpeprogram
Emberek neveit s magassgait szeretnnk nyilvntartani. A nyilvntartsban kt
egyforma nev ember nem szerepelhet!
Krjk be konzolrl a ht trpe nevt s magassgt (vgjel: nvnl Enter)!
Listzzuk ki a trpket a bevitel sorrendjben!
Keressnk meg egy adott nev trpt, s rjuk ki a magassgt!

Megjegyzs: Ne trje a fejt! Hapci, Kuka, Morg, Szende, Szundi, Tudor, Vidor.

A program terve

A tp:TorpeProgram vezrlnek van egy torpek nev kontnere, amelybe majd beteszi az
ltala ltrehozott trpket. A trpk adatait konzolrl kri be. A program f funkciit hrom
rszre bontjuk: bevitelre, listzsra s keressre. A listt az rdekessg kedvrt hrom kln-
bz technikai megvalstsban tlaljuk. A rszletes magyarzatot a forrskdban tallja meg.

main(...)
TorpeProgram Vector()
add(ember) getNev()
TorpeProgram() contains(ember)
bevitel() get(poz)
lista() indexOf(keresettEmber) equals(ember)
kereses() :Ember
tp:TorpeProgram torpek:Vector
:Ember

...
Ember(nev,mag)
setMagassag(mag) :Ember

Kontroll, Kontner Informcihordoz


hatr Vector Ember
TorpeProgram -nev: String
torpek -magassag: int
+Vector() *
+add(Object): boolean
TorpeProgram() +Ember(String,int)
+contains(Object): boolean
bevitel() +Ember(String)
+get(int): Object
lista() +getNev(): String
+indexOf(Object): int
kereses() +getMagassag():int
+main(...) +setMagassag(int)
+equals(Object): boolean
+toString(): String

20.5. bra. A TorpeProgram egyttmkdsi s osztlydiagramja


20. A Vector s a Collections osztly 20.3. Az equals metdus szerepe 449

Forrskd s annak elemzse


import extra.*;
import java.util.*;

class Ember {
private String nev;
private int magassag;

Konstruktorok: Az Ember osztlynak kt konstruktora van. Az els (ktparamteres) konst-


ruktor az igazi, a msodik csak arra val, hogy sszelltson egy hasonlt objektumot a nv
szerinti keresshez:
public Ember(String nev, int magassag) {
this.nev = nev;
this.magassag = magassag;
}

public Ember(String nev) {


this(nev,0);
}

Adatokat kiolvas s bellt metdusok:


public String getNev() { return nev; }
public int getMagassag() { return magassag; }
public void setMagassag(int mag) {
if (mag>0)
magassag = mag;
}

Az equals() metdus: A trolt emberek kztt majd nv szerint kell keresnnk, ezrt meg kell
rnunk a megfelel equals() metdust. Kt ember akkor egyenl, ha nevk megegyezik:
public boolean equals(Object obj) {
return nev.equals(((Ember)obj).getNev());
}

public String toString() {


return Format.left(nev,10) + Format.right(magassag,3);
}
}

public class TorpeProgram {


private Vector torpek = new Vector();

Bevitel: A TorpeProgram a trpk bevitelvel kezddik. A vgjelig tart olvassban mr


otthonosak vagyunk. A beolvasott nvrl azonban el kell dntennk, hogy van-e mr ilyen
nev ember a vektorban, mert a nyilvntartsban nem szerepelhet kt egyforma nev ember. A
hasonlt objektumban csak a nevet tltjk ki: new Ember(nev), hiszen tudjuk, hogy csak a
nv fog rszt venni a hasonltsban. A Vector osztly contains metdusa a trpk equals
450 VI. RSZ. KONTNEREK

metdusai alapjn keresi vgig a vektort. Minden egyes objektumot megszlt s megkrdezi,
hogy a benne lev nv megegyezik-e az obj paramterben lv nvvel (a nev privt adat,
teht obj-bl mr csak a publikus getNev() metdussal lehet azt kiolvasni). Ha van mr ilyen
nev trpe, akkor errl rtestjk a felhasznlt. Ha mg nincs, akkor a trpe betehet a vek-
torba, de ehhez a magassgt is be kell krnnk. A mr flig sszelltott embernek teht meg-
adjuk a magassgt is, s a ksz trpt a torpek.add(torpe)utastssal betesszk a vek-
torba:
void bevitel() {
Ember torpe;
String nev = Console.readLine("\nTrpe neve: ");
while (!nev.equals("")) {
if (torpek.contains(torpe = new Ember(nev)))
System.out.println("Van mr ilyen trpe!");
else {
torpe.setMagassag(Console.readInt("magassga : "));
torpek.add(torpe);
}
nev = Console.readLine("Trpe neve: ");
}
}

Egyszer lista, beptett mdon: A teljes vektort egyszeren tadjuk a println() metdus-
nak, amely a torpek.toString()-et kirja a konzolra. A Vector osztly toString()
metdust gy rtk meg, hogy az meghvja a vektor minden egyes elemre a toString()
metdust, s a kapott Stringeket a [] zrjelprban vesszvel elvlasztva sorolja fel. Mivel a
vektor elemei itt Ember osztlyak, az Ember.toString() metdus hvdik meg, s az
visszaadja az ember nevt s magassgt szveges formban:
void lista1() {
System.out.println("\nBeptett lista:");
System.out.println(torpek);
}

Listzs index szerint, toString()-gel: Az i ciklusvltozval vgigmegynk a vektoron


0-tl size()-1-ig, s egyszeren kirjuk a get(i) objektumot a toString() implicit hv-
sval. Ebben az esetben is kell teht a toString(), csak most megszabadultunk a []
zrjelprtl, s az elemeket kln sorba rhatjuk:
void lista2() {
System.out.println("\nLista index szerint:");
for (int i=0; i<torpek.size(); i++) {
System.out.println(torpek.get(i));
}
}

Listzs toString() nlkl: A listt most gy produkljuk, hogy nem vesszk ignybe a
toString() metdust. Az objektumokbl most zenettel kell kicsalni az informcit.
20. A Vector s a Collections osztly 20.3. Az equals metdus szerepe 451

Mivel a torpek.get(i) szintaktikailag Object osztly, r kell knyszerteni az Ember


osztlyt. Jobban jrunk, ha a kirs eltt felvesznk egy Ember tpus e objektumot, gy a
kirsban mr nem kell foglalkoznunk a knyszertssel.
void lista3() {
Ember e;
System.out.println("\nEgyni lista:");
for (int i=0; i<torpek.size(); i++) {
e = (Ember)(torpek.get(i));
System.out.println(
"Nv: "+e.getNev()+" Magassg: "+e.getMagassag());
}
}

Egy trpe megkeresse: Most egy adott nev trpt keresnk meg a kontnerben. Ehhez
megint sszelltunk egy hasonlt trpt nulla magassggal, s azt tadjuk az indexOf()
metdusnak, hogy ennek alapjn keresse meg a krdses objektumot a kontnerben. Ha van
ilyen objektum, akkor az indexOf() metdus a tallt objektum poz>=0 indexvel tr vissza.
A get(poz) teht a keresett objektum, ettl mr meg lehet krdezni a konkrt magassgot. A
magassg megkrdezshez azonban r kell knyszerteni az Ember osztlyt, hiszen a vektor az
Ember-knt bedobott objektumot Object-knt adja ki. Mi azonban tudjuk, hogy Ember, s a
knyszertssel nem okozunk bajt:
void kereses() {
System.out.println("\nKeress:");
Ember keresettEmber = new Ember(
Console.readLine("Trpe neve: "));
int poz = torpek.indexOf(keresettEmber);
if (poz >= 0)
System.out.println("Van, magassga:"+
((Ember)(torpek.get(poz))).getMagassag());
else
System.out.println("Nincs ilyen");
}

Fprogram: Ltrehozzuk a vezrlt, melyet felkrnk a bevitelre, a klnbz listzsokra s


a keressre:
public static void main(String[] args) {
TorpeProgram tp = new TorpeProgram();
tp.bevitel();
tp.lista1();
tp.lista2();
tp.lista3();
tp.kereses();
}
}
452 VI. RSZ. KONTNEREK

20.4. A kontner elhagysa az UML diagramrl


A kontnert az osztly-, illetve egyttmkdsi diagramokon csak akkor szoks feltntetni, ha
az segt a megrtsben. A kontner implementcis osztly, az egy-sok kapcsolat
megvalstst szolglja. Ha egy osztlydiagramon az sszes kontnert feltntetnnk, az
zavarn az ttekinthetsget, hiszen minden egyes egy-sok kapcsolathoz tartozik egy kontner,
nem beszlve a sok-sok kapcsolatokrl, amirl ebben a knyvben nem is beszlnk. A kont-
ner kdolsa rutin feladat. Egy tapasztaltabb programoz a kontnert az egy-sok kapcsolat
helyn automatikusan elkpzeli.

A 20.6. bra a TrpeProgram leegyszerstett osztlydiagramjt mutatja. Ahogy azt a kapcsos


zrjelben lev megszortsban lthatjuk, az egy-sok kapcsolatot a Vector osztly fogja meg-
valstani. Ha az osztlydiagramrl elhagyjuk a kontnert, az mg nem jelenti azt, hogy az
egyttmkdsi diagramrl is el kell hagynunk. A TorpeProgramban pldul a karbantart
funkcik a legfontosabbak (torpek.add, torpek.contains stb.), ezrt az egyttmkdsi
diagramot ebben az esetben nem ajnlatos leegyszersteni.

A kontner az osztly-, illetve egyttmkdsi diagramrl elhagyhat. A kontner


osztlyt a multiplicits mellett megszortsknt lehet megadni.

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

20.6. bra. Egyszerstett osztlydiagram a kontner elhagysa

20.5. Interfszek Collection, List, Comparable


A 7. fejezet., rklds fejezetben mr bevezettk az interfsz fogalmt; most ismtlsknt
jra megadjuk a defincijt:
20. A Vector s a Collections osztly 20.5. Interfszek Collection, List, Comparable 453

Az interfsz (interface) metdusfejeket definil abbl a clbl, hogy valamely osztly azt
a ksbbiekben implementlja, megvalstsa. Ez egyfajta szerzds: ha valaki megteszi a
szerzdsben foglaltakat, vagyis egy implementl osztlyban megrja az adott interfsz
metdusait, akkor cserben ezt az osztlyt egy adott krnyezetben hasznlhatja. Szablyok:
- Egy interfszbl nem lehet pldnyt ltrehozni, hiszen annak nincsenek mkdk-
pes metdusai.
- Az interfszek rkthetk. Amikor egy leszrmazott interfszt implementlunk,
akkor az interfsz rklsi gnak sszes metdust implementlnunk kell az osztly-
ban vagy annak egy sben (mg akkor is, ha a blokkot resen hagyjuk).
- rtkadsi kompatibilits: Interfsz tpus vltozval lehet objektumot azonostani.
Az rtkads szerinti kompatibilits szablyban az implementci egyenrtk az
rklssel. Pldul:
Vector szamok = new Vector();
Collection coll = szamok;

interfsz interfsz
java::util::Collection java::util::List

size() : int get(index:int): Object


isEmpty(): boolean set(index:int, element:Object): Object
contains(O: Object): boolean add(index:int, element:Object)
add(element: Object): boolean remove (index:int): Object
remove(element: Object): boolean addAll(index:int, c:Collection):boolean
equals(o: Object): boolean indexOf(o:Object): int
containsAll(c: Collection): boolean lastIndexOf(o:Object): int
addAll(c: Collection): boolean listIterator() : ListIterator
removeAll(c: Collection): boolean listIterator(index:int): ListIterator
retainAll(c: Collection): boolean subList(fromIndex:int, toIndex:int): List
clear()
toArray(): Object[]
toArray(a[]: Object): Object[]
iterator(): Iterator
java::util::Vector

20.7. bra. A Vector osztly implementlja a List interfszt


454 VI. RSZ. KONTNEREK

Az interfsz UML jellse a 20.7. brn lthat:


Az interfszt az interfsz sztereotpussal jelljk.
Ha egy osztly implementl egy interfszt, akkor az osztly egy szaggatott, nyitott
hegy nyllal (nylhegye olyan, mint az rklsnl) mutat az interfszre. (Az brn a
Vector osztly implementlja a List interfszt.)
Az interfszek kztti rklst ugyangy jelljk, mint az osztlyok kztti rklst.
(Az brn a List interfsz rkli a Collection interfszt.)

Megjegyezzk, hogy UML-ben egy osztlyt gy minstnk annak csomagjaival, hogy az


egyes csomagnevek utn dupla kettspontot tesznk.

Collection s List interfszek


A java.util csomagban deklarlt Collection s List interfszek, azok a 20.7. brn
lthat res metdusfejeket definiljk. A List a Collection interfsz utdja ez azt jelenti,
hogy ha egy osztly implementlja a List interfszt, az egyben a Collection interfszt is
implementlja. A Vector osztly implementlja a List interfszt: az brn lthat
Collection s List dobozban felsorolt metdusok mind benne vannak a Vector osztly-
ban (a knyvben nincs az sszes metdus felsorolva). A Vector osztly fejt gy deklarltk:
public class Vector extends AbstractList implements List,
Cloneable, java.io.Serializable

A Vector teht egy lista (List), klnozhat (Cloneable) s szerializlhat (Serializable).

Comparable interfsz
A java.lang.Comparable interfsz mindssze egy metdusfejet definil:
public int compareTo(Object obj)

A Comparable interfszt megvalst osztly objektumai sszehasonlthatk. A compareTo()


metdus formja kttt. Az sszehasonltst vgz kliens arra szmt, hogy a visszaadott rtk
negatv, ha az objektum kisebb (sorrendben elrbb ll), mint a paramterknt meg-
kapott obj;
pozitv, ha az objektum nagyobb (sorrendben htrbb ll), mint a paramterknt meg-
kapott obj;
0, ha a kt objektum egyenl.

A 20.8. brn lthat, hogy a String osztly az Object osztlybl szrmazik, s implemen-
tlja a Comparable interfszt: a String osztlyban valban deklarltak egy compareTo()
metdust.
20. A Vector s a Collections osztly 20.5. Interfszek Collection, List, Comparable 455

interfsz
Comparable
Object +compareTo(obj: Object): int

String
+compareTo(obj: Object): int
...

20.8. bra. A String osztly implementlja a Comparable interfszt

Az interfsz implementlsa
Ahhoz, hogy egy osztly egy interfszt implementljon, az osztly fejben meg kell adni az
implements kulcssz utn az interfsz nevt, az interfszben szerepl metdusokat pedig meg
kell rni.

A String osztly implementlja a Comparable interfszt:

public final class String implements Comparable {

...
public int compareTo(Object o) {
return compareTo((String)o);
}

public int compareTo(String anotherString) {


...
}
}

A String osztlyban kt compareTo metdust rtak. A Comparable interfsz compareTo


metdusnak paramtere ktelezen Object osztly. Ez a compareTo metdus csupn meg-
hvja a String osztly msik, igazi compareTo metdust, melynek paramtere String.
456 VI. RSZ. KONTNEREK

20.6. Collections osztly

A Collections osztly a java.util csomagban tallhat, s a Java kollekci keret-


rendszer rsze. A Collections nem pldnyosthat, statikus metdusai ltalban kont-
nereken rtelmezett algoritmusok: rendezs, megfordts, kevers, minimum- s maxi-
mumszmts, binris keress stb.

Megjegyzs: A Collections osztly nem tvesztend ssze a Collection interfsszel!

A Collections osztly UML brja a 20.9. brn lthat. Statikus metdusai olyan kontne-
reken dolgoznak, amelyek implementltk a Collection interfszt vagy annak utdjt, a
List interfszt. Mivel a Vector osztly egy List (s gy Collection is), a Collections
osztly brmely metdusa paramterknt megkaphat egy vektort.

java::util::Collections java::util::Collection

+sort(list:List) size(): int


*
+reverse(list:List) isEmpty(): boolean
+shuffle(list:List) contains(o: Object): boolean
+min(coll:Collection): Object add(element:Object):boolean
+max(coll:Collection): Object ...
+binarySearch(list:List,key:Object):int

java::util::List
interfsz
*
java::lang::Comparable

+compareTo(obj:Object):int
java::util::Vector

AnyClass

+AnyClass()
+compareTo(obj:Object):int
...

20.9. bra. A Collections s az ltala kezelt AnyClass


20. A Vector s a Collections osztly 20.6. Collections osztly 457

Az osztly algoritmusainak tbbsge gy dolgozik, hogy pronknt sszehasonltja a vektor


elemeit. Ezek a metdusok megkvetelik, hogy a kontnerbe betett objektumok sszehasonlt-
hatk (comparable) legyenek, vagyis hogy implementljk a Comparable interfszt.

Figyelem! Hiba runk compareTo() metdust, ha az osztly fejbl hinyzik az


implements Comparable! A Collections osztly metdusai mindkettt megkvete-
lik!

A Collections osztly metdusai csak akkor mkdnek helyesen, ha az ltala kezelt


vektor elemei sszehasonlthatk, vagyis implementljk a Comparable interfszt!

sszefoglalva: A Vector osztly metdusai az elemek equals metdusait hasznljk a


hasonltshoz; a Collections osztly metdusai a vektor elemeinek compareTo metdu-
sai szerint mkdnek. A vektorba tett objektumoknak teht eszerint kell megadnunk az
equals, illetve compareTo metdusait. Alaprtelmezett equals metdusa minden
objektumnak van, legfeljebb nem az elkpzelsnk szerint mkdik; a compareTo met-
dus implementlsrl azonban a programoznak kell gondoskodnia!

Most nzzk sorra a Collections osztly szmunkra lnyegesebb metdusait!


static void sort(List list)
Rendezi a listt (vektort) a termszetes rendezettsg szerint: az elemek compareTo()
metdusai alapjn. Az elemeknek implementlniuk kell a Comparable interfszt.
static void reverse(List list)
Megfordtja a listt (vektort): az els elem lesz az utols, az utols pedig az els. A
nvekv rendezettsgbl gy cskken rendezettsg lesz.
static void shuffle(List list)
sszekeveri a vektor elemeit, azok rendezetlenek lesznek.
static Object min(Collection coll)
Visszaadja a vektor, illetve kollekci legkisebb elemt. Az elemeknek implementlniuk
kell a Comparable interfszt. A metdus vgighalad a vektor sszes elemn, s a
compareTo() metdus alapjn kivlasztja a legkisebb objektumot. Az egyenlk kzl
(ahol a compareTo visszatrsi rtke 0) a legutolst adja vissza.
static Object max(Collection coll)
Visszaadja a vektor, illetve kollekci legnagyobb elemt. Az elemeknek implementl-
niuk kell a Comparable interfszt. A metdus vgighalad a vektor sszes elemn, s a
compareTo() metdus alapjn kivlasztja a legnagyobb objektumot. Az egyenlk
kzl (ahol a compareTo visszatrsi rtke 0) a legutolst adja vissza.
458 VI. RSZ. KONTNEREK

static int binarySearch(List list, Object key)


A listban (vektorban) binris keresssel megkeresi a key objektumot, s visszaadja
annak indext. A vektort elzleg rendezni kell, az algoritmus csak rendezett lista ese-
tn mkdik helyesen. A keress a compareTo() metdus alapjn trtnik. Tbb
egyenl elem esetn a visszaadott objektum vletlenszer.

Megjegyzs: A termszetes rendezettsgen kvl mg megadhatk egyb rendezettsgek is,


de ezt a lehetsget e ktet nem trgyalja.

Feladat Emberek
Emberek adatait (nevt s szletsi vt) szeretnnk nyilvntartani. A nyilvntarts-
ban szerepelhet kt egyforma nev ember, de akkor a szletsi vnek kell klnbz-
nie! Menbl lehessen vlasztani a kvetkez funkcikat:
1. Felvitel: Krjk be konzolrl egy ember nevt s szletsi vt! Ha van mr ilyen
ember, akkor rjunk ki egy figyelmeztetst, egybknt vigyk fel az adatait!
2. Trls: Krjk be konzolrl egy ember nevt s szletsi vt! Ha nincs ilyen
ember, akkor rjunk ki egy figyelmeztetst, egybknt trljk t a nyilvntartsbl!
3. Eredeti sorrend: Listzzuk ki az embereket a felvitel sorrendjben!
4. Legidsebb: rjuk ki a legidsebb ember adatait!
5. Legfiatalabb: rjuk ki a legfiatalabb ember adatait!
6. Nvekv sorrend: Listzzuk ki az embereket szletsi v s azon bell nv
szerint nvekv rendezettsgben!
7. Cskken sorrend: Listzzuk ki az embereket szletsi v s azon bell nv
szerint cskken rendezettsgben!
8. Vletlen sorend: Listzzuk ki az embereket vletlen rendezettsgben!
9. Vge: Legyen vge a programnak!

Forrskd s a megolds elemzse


import extra.*;
import java.util.*;

Az osztlynak implementlnia kell a Comparable interfszt, mert a Collections.sort()


rendezsi eljrs a compareTo() metdus alapjn fog hasonltani:
class Ember implements Comparable {
private String nev;
private int szulev;

public Ember(String nev, int szulev) {


this.nev = nev;
this.szulev = szulev;
}

public String getNev() { return nev; }


public int getSzulev() { return szulev; }
20. A Vector s a Collections osztly 20.6. Collections osztly 459

Az Ember osztlyban kell, hogy legyen egy equals() metdus, hiszen a contains() ez
alapjn dolgozik. Az equals()akkor ad vissza igaz rtket, ha mind a nv, mind a szletsi v
megegyezik:
public boolean equals(Object obj) {
return (nev.equals(((Ember)obj).getNev()) &&
szulev == ((Ember)obj).getSzulev());
}

A listt majd szletsi v, s azon bell nv szerint fogjuk rendezni a compareTo metdust
eszerint rjuk meg: ha a megszltott objektumban kisebb a szletsi v, mint a paramterben
megadott objektumban, akkor az objektum kisebb, mint a paramter. Ha a szletsi v a kt
objektumban egyenl, akkor a nv dnt:
public int compareTo(Object obj) {
if (szulev < ((Ember)obj).getSzulev())
return -1;
if (szulev > ((Ember)obj).getSzulev())
return 1;
return nev.compareTo(((Ember)obj).getNev());
}

public String toString() {


return Format.left(nev,10) + Format.right(szulev,5);
}
}

public class Emberek {


Vector emberek = new Vector();

A konzolrl bekrt adatok alapjn sszelltunk egy ember objektumot, s ha mg nem sze-
repel az emberek vektorban, akkor azt felvitel esetn beletesszk, trls esetn pedig kivesszk
onnan:
void felvitel() {
Ember ember=new Ember(Console.readLine("\nEmber neve : "),
Console.readInt("szletsi ve: "));
if (emberek.contains(ember))
System.out.println("Mr van ilyen");
else
emberek.add(ember);
}

void torles() {
Ember ember=new Ember(Console.readLine("\nEmber neve : "),
Console.readInt("szletsi ve: "));
if (!emberek.remove(ember))
System.out.println("Nincs ilyen ember");
else
System.out.println(ember+" trlve");
}
460 VI. RSZ. KONTNEREK

A listz metdus az objektumokat soronknt rja ki a toString() implicit meghvsval:


void lista(Vector e) {
for (int i=0; i<e.size(); i++)
System.out.println(e.get(i));
}

void menu() {
Vector rendEmberek; // segdvektor
char valasz;
do {
System.out.print("1:felv - 2:trl - 3:eredeti - 4:legid - "+
"5:legfiat - 6:nvek - 7:cskk - 8:vletlen - 9:vge...?");
do
valasz = Console.readChar();
while (valasz<'1' || valasz>'9');

switch (valasz) {
case '1': // Felvitel
felvitel();
break;
case '2': // Trls
torles();
break;
case '3': // Eredeti lista
lista(emberek);
break;

A legidsebb s legfiatalabb embert a Collections.min(), illetve a Collections.max()


metdusok meghvsval hatrozzuk meg (az a legidsebb ember, aki legkorbban szletett).
A visszaadott objektumot a toString() implicit meghvsval rjuk ki a konzolra:
case '4': // Legidsebb
System.out.println(Collections.min(emberek));
break;
case '5': // Legfiatalabb
System.out.println(Collections.max(emberek));
break;

Az emberek rendezshez nem ldozhatjuk fel az emberek vektort, mert a bevitel sorrendjt
nem felejthetjk el. Felvesznk ezrt egy j, rendEmberek vektort az eredeti, emberek vektor
tmsolsval. Ezzel a vektorral aztn azt tesznk, amit akarunk, hiszen az emberekbl brmi
reproduklhat. Elszr rendezzk a rendEmberek vektort, majd kilistzzuk azt:
case '6': // Nvekv sorrend
rendEmberek = new Vector(emberek);
Collections.sort(rendEmberek);
lista(rendEmberek);
break;
20. A Vector s a Collections osztly 20.6. Collections osztly 461

Mint az elz menpontban, itt is ltrehozunk egy j vektort, hiszen azta jabb embereket is
vehettek fl vagy trlhettek ki. A vektort rendezzk a compareTo() szerint, majd az egsz
vektort megfordtjuk:
case '7': // Cskken sorrend
rendEmberek = new Vector(emberek);
Collections.sort(rendEmberek);
Collections.reverse(rendEmberek);
lista(rendEmberek);
break;
sszekeverjk az emberek vektor elemeit (csak ez a vektor tkrzi a vals llapotot), majd
kilistzzuk:
case '8': // Vletlen sorrend
rendEmberek = new Vector(emberek);
Collections.shuffle(rendEmberek);
lista(rendEmberek);
break;
}
} while (valasz != '9');
}

public static void main(String[] args) {


Emberek enyv = new Emberek();
enyv.menu();
}
}

Feladat Vals szmok


Krjnk be tetszleges sok vals szmot 0 vgjelig! Ezutn rjuk ki
a szmokat a bevitel sorrendjben!
a szmokat nvekv sorrendben!
a legkisebb s a legnagyobb szmot!
Vgl keressnk meg egy szmot a bevittek kztt!

A szmokat vektorba fogjuk tenni a kvetkez okok miatt:


a megjegyzend szmok szma elvileg korltlan, ezrt trolsra a tmb alkalmatlan;
hasznlni szeretnnk a Collections osztly rendez-, minimum- s maximumkeres
metdusait, valamint a Vector osztly indexOf metdust.
Mivel egy vektorba csak olyan objektumot tehetnk, melynek osztlya az Object leszrma-
zottja (primitv adatokat a vektor nem tud kezelni), a szmokat be kell csomagolnunk egy-egy
Double osztly objektumba. Ehhez felhasznljuk a Double osztly valueOf fggvnyt:

public static Double valueOf(String) throws NumberFormatException


A karakterlncbl egy Double tpus objektumot gyrt.
462 VI. RSZ. KONTNEREK

Forrskd
import extra.Console;
import java.util.*;

public class ValosSzamok {

public static void main(String[] args) {


Vector szamok = new Vector();
final double VEGJEL = 0;
double szam;

// Szmok bekrse:
while (true) {
szam = Console.readDouble("Szm: ");
if (szam==VEGJEL)
break;
szamok.add(new Double(szam));
}

if (szamok.isEmpty()) {
System.out.println("Nem adott meg egyetlen szmot sem!");
return;
}

// Szmok kirsa egyenknt:


for (int i=0; i<szamok.size(); i++)
System.out.print(szamok.get(i)+" ");
System.out.println();

// A vektor kirsa egyben, rendezs, jabb kirs...


System.out.println("A szmok: "+szamok);
Collections.sort(szamok);
System.out.println("A szmok rendezve: "+szamok);
System.out.println("Legkisebb : "+Collections.min(szamok));
System.out.println("Legnagyobb: "+Collections.max(szamok));

// Egy szm keresse:


szam = Console.readDouble("Keresend szm: ");
int index=szamok.indexOf(new Double(szam));

if (index==-1)
System.out.println("Nincs ilyen szm");
else
System.out.println("Van ilyen szm, indexe: "+index);
}
}
20. A Vector s a Collections osztly 20.7. Feladat Nobel djasok 463

20.7. Feladat Nobel djasok

Feladatspecifikci
A program tartsa nyilvn a vilg Nobel djasait! Egy Nobel djhoz tartoz adatok:
szakterlet, vszm, nv, orszg. Tegyk fel, hogy ugyanabban az vben egy
szakterleten (mint pldul bke, fizika, irodalom, kmia) legfeljebb egy Nobel djat
adnak ki. A program sorban vgezze el a kvetkez feladatokat:
Krje be a lehetsges szakterleteket!
Vegye nyilvntartsba a Nobel djasokat! Csak rvnyes szakterletet engedjen
megadni, s ne engedjen bevinni kt egyenl szakterlet s vszm Nobel
djast!
Listzza ki az sszes Nobel djast vszm szerinti rendezettsgben!
Ksztse el egy adott szakterlet listjt: krje be a felhasznltl, hogy melyik
szakterletre kvncsi, majd listzza ki e szakterlet Nobel djasait vszm szerint
rendezetten!
rja ki vszm szerint rendezetten, hogy vszmonknt sszesen mennyi Nobel
djas van!
Extra ellenrzseket nem kell vgezni.

Megolds
A NobelDijasok osztlydiagramjt a 20.10. bra mutatja. A NobelDijasok a vezrl
osztly, ebben minden hasznlati esetnek felvesznk egy-egy metdust. A vezrl egy-sok
kapcsolatban ll a szakterletekkel (ezek egyszer String objektumok) s a Nobel djasokkal.
A NobelDijas informcitrol osztly, melynek az adatok kezelsn kvl biztostania kell a
helyes equals s compareTo metdusokat:
equals: Akkor egyenl kt Nobel djas, ha vszmuk s szakterletk is megegyezik
(ilyenbl nem lehet kett a nyilvntartsban). A metdus visszatrsi rtke true, ha
mindkt adat egyenl.
compareTo: A metdus vszm szerint rakja sorba az objektumokat: az egyik objek-
tum akkor kisebb, mint a msik, ha kisebb a benne lev vszm.
Hasznlati esetek:
felvitelSzakteruletek: Itt felvisszk a szakterleteket, a sorrend mindegy.
felvitelDijasok: Mivel nem vihetnk fel kt olyan objektumot, melyben az vszm
s a szakterlet egyarnt megegyeznek, a keresst vszm+szakterletre kell elvgezni.
Az equals pont erre keres r. A ltrehozott Nobel djasokat a dijasok vektorba tesz-
szk, melyet a felvitel vgn rendeznk.
listaDijasok: A Nobel djasok teljes listja vszm szerinti rendezettsgben kszl.
listaSzakteruletSzerint: Az vszm szerint rendezett vektoron vgighaladunk,
s kivlasztjuk azokat az adott szakterlet objektumokat.
464 VI. RSZ. KONTNEREK

evszamGyujtes: Felvesznk egy tmbt, ahol minden vszmnak van egy rekesze.
Vgigmegynk a tmbn (a rendezettsg nem szmt), s az objektum vszmnak
megfelel rekeszt eggyel nveljk. Vgl listzzuk a tmbt.

String
*
szakteruletek NobelDijas
-nev: String
NobelDijasok -orszg: String
-szakterulet: String
-evszam: int
NobelDijasok() dijasok
felvitelSzakteruletek () +NobelDijas(nev,orszag,szak,ev)
felvitelDijasok() * +getSzakterulet(): String
listaDijasok() {rendezett/evszam}} +getEvszam(): int
listaSzakteruletSzerint() +equals(obj): boolean
evszamGyujtes() +compareTo(obj): int
+main(...) +toString(): String

20.10. bra. A NobelDijasok osztlydiagramja

Forrskd
import extra.*;
import java.util.*;

class NobelDijas implements Comparable {


private String nev;
private String orszag;
private String szakterulet;
private int evszam;

public NobelDijas(String iNev, String iOrszag,


String iSzakterulet, int iEvszam){
nev = iNev;
orszag = iOrszag;
szakterulet = iSzakterulet;
evszam = iEvszam;
}

public String getSzakterulet(){


return szakterulet;
}

public int getEvszam(){


return evszam;
}
20. A Vector s a Collections osztly 20.7. Feladat Nobel djasok 465

public boolean equals(Object obj){


NobelDijas dijas = (NobelDijas) obj;
return (evszam==dijas.evszam) &&
(szakterulet.equals(dijas.getSzakterulet()));
}

public int compareTo(Object obj){


return evszam - ((NobelDijas)obj).evszam;
}

public String toString() {


return Format.left(nev,20)+Format.left(orszag,20)+
Format.left(szakterulet,20)+Format.left(evszam,10);
}
}

public class NobelDijasok {


private Vector szakteruletek = new Vector();
private Vector dijasok = new Vector();

// Szakterletek felvitele vgjelig. Kt egyenl nem lehet:


void felvitelSzakteruletek(){
String szakterulet;
while (true) {
szakterulet = Console.readLine("Szakterlet: ");
if (szakterulet.equals(""))
return;
if (szakteruletek.indexOf(szakterulet)>=0)
System.out.println("Mr van ilyen");
else
szakteruletek.add(szakterulet);
}
}

void felvitelDijasok(){
String nev, orszag, szakterulet;
int evszam;
NobelDijas dijas;

System.out.println("\n*** Nobel djasok felvitele ***");


while (true) {
szakterulet = Console.readLine("\nSzakterlet: ");
if (szakterulet.equals(""))
break;
if (szakteruletek.indexOf(szakterulet)<0) {
System.out.println("Nincs ilyen szakterlet");
continue;
}

evszam = Console.readInt("vszm: ");


dijas = new NobelDijas("","",szakterulet,evszam);
if (dijasok.contains(dijas)) {
System.out.println("Ilyen szakterlet + v mr van!");
continue;
}
466 VI. RSZ. KONTNEREK

nev = Console.readLine("Nv: ");


orszag = Console.readLine("Orszg: ");
dijas = new NobelDijas(nev,orszag,szakterulet,evszam);
dijasok.add(dijas);
}
Collections.sort(dijasok);
}

void listaDijasok() {
System.out.println("\n*** Nobel djasok ***");
for (int i=0; i<dijasok.size();i++) {
System.out.println((NobelDijas)dijasok.get(i));
}
}

void listaSzakteruletSzerint(){
NobelDijas dijas;
String szakterulet;
szakterulet = Console.readLine("\nSzakterlet: ");
System.out.println(Format.left("Nv",20)+
Format.left("Orszg",20)+Format.left("vszm",10));
for (int i=0; i<dijasok.size(); i++){
dijas = (NobelDijas)dijasok.get(i);
if (szakterulet.equals(dijas.getSzakterulet()))
System.out.println(dijas);
}
}

void evszamGyujtes() {
int[] gyujto = new int[2010];
for (int i=0; i<dijasok.size(); i++){
int ev = ((NobelDijas)dijasok.get(i)).getEvszam();
gyujto[ev]++;
}
System.out.println("\nNobel djasok szma v szerint");
for (int ev=0; ev<gyujto.length; ev++) {
if (gyujto[ev]!=0)
System.out.println(Format.right(ev,4)+": "+
Format.right(gyujto[ev],6));
}
}

public static void main(String[] args) {


NobelDijasok nd = new NobelDijasok();
nd.felvitelSzakteruletek();
nd.felvitelDijasok();
nd.listaDijasok();
nd.listaSzakteruletSzerint();
nd.evszamGyujtes();
}
}
20. A Vector s a Collections osztly 20.8. Feladat Vrosok 467

20.8. Feladat Vrosok

Feladatspecifikci
rjon programot, amely nyilvntartja a magyar vrosok adatait (vros neve, terlete
2
km -ben, lakosok szma). Kt egyforma nev vros nem ltezhet a nyilvntartsban.
Menbl vlaszthatan legyenek hvhatk a kvetkez funkcik:
j vrosok felvitele
Vrosok listja npsrsg szerint cskken sorrendben: nv, terlet, lakosok
2
szma, npsrsg (f/km ).
Kimutats, amely megadja, hogy hny vros van a nyilvntartsban a lakosok
szma szerinti kvetkez kategrikban:
Lakosok szma Vrosok szma
0- 99999 99
100000- 999999 99
1000000-9999999 99
10000000- 99
Vge
Extra ellenrzseket nem kell vgezni.

Megolds
Varos
Varosok -nev: String
varosok -terulet: int
Varosok() -lakosokSzama: int
felvitel() *
+Varos(nev, terulet, lakosokSzama)
lista() {rendezett/nepsuruseg}} +getNev(): String
kimutatas() +getLakosokSzama(): int
menu() +nepsuruseg(): int
+main(...) +equals(obj): boolean
+compareTo(obj): int
+toString(): String

20.11. bra. A Varosok program osztlydiagramja

A Varosok osztlydiagramjt a 20.11. bra mutatja. A vezrlben minden egyes hasznlati


esetnek egy-egy metdus felel meg, a hasznlati eseteket menbl vezreljk. A vezrl kap-
csolatban ll a vrosokkal: az egy-sok kapcsolatot egy olyan vektorral oldjuk meg, amely np-
srsg szerint rendezett. Egy vrosra hrom adat jellemz: neve, terlete s a lakosok szma
468 VI. RSZ. KONTNEREK

a npsrsg ezekbl szmthat. A keresshez s rendezshez a megfelel metdusok a


kvetkezk:
equals: Mivel kt egyforma nevet nem engednk meg, a vektorban pontosan a nvre
kell rkeresnnk. Kt vros teht akkor egyenl, ha a nevk egyenl.
compareTo: Ahhoz, hogy a npsrsg szerint cskken rendezshez hasznlhassuk a
Collections.sort metdust, ennek a metdusnak akkor kell true rtket vissza-
adnia, ha a vros npsrsge nagyobb, mint a paramterben megadott vros.

A Vrosok vezrl osztly metdusai:


felvitel: Sorban bekrjk a vrosok nevt, vgjelig. Ha mr ltezik ilyen vros,
akkor kirjuk, hogy Mr van ilyen vros!; ha mg nincs ilyen, akkor bekrjk hozz a
tbbi adatot, s a vrost betesszk a varosok vektorba. Vgl rendezzk a vektort.
lista: A vektor elemeit egyenknt kirjuk.
kimutats: Felvesznk egy 4 elem gyjt tmbt. Vgigmegynk az sszes vroson:
minden egyes esetben a lakosok szmt lekpezzk a tmb megfelel elemre, s
eggyel megnveljk azt. Vgl kilistzzuk a gyjttt rtkeket.
menu: A metdus a felhasznl krstl fggen meghvja az elbb megadott eseteket.

Forrskd
import extra.*;
import java.util.*;

class Varos implements Comparable {


private String nev;
private int terulet;
private int lakosokSzama;

public Varos(String nev, int terulet, int lakosokSzama) {


this.nev=nev;
this.terulet=terulet;
this.lakosokSzama=lakosokSzama;
}
public String getNev() {
return nev;
}
public int getLakosokSzama() {
return lakosokSzama;
}
public int nepsuruseg() {
return lakosokSzama/terulet;
}
public boolean equals(Object obj) {
return nev.equals(((Varos)obj).getNev());
}
20. A Vector s a Collections osztly 20.8. Feladat Vrosok 469

public int compareTo(Object obj) {


return nepsuruseg() - ((Varos)obj).nepsuruseg();
}

public String toString() {


return Format.left(nev,10)+ Format.right(terulet,4)+
Format.right(lakosokSzama,14)+
Format.right(nepsuruseg(),12);
}
}

public class Varosok {


private Vector varosok= new Vector();

void felvitel() {
String nev = Console.readLine("\nVros neve : ");
while (!nev.equals("")) {
Varos varos = new Varos(nev,0,0);
if(varosok.contains(varos))
System.out.println("Mr van ilyen vros!");
else {
int terulet = Console.readInt("Vros terlete : ");
int lakosok = Console.readInt("Vros lakossga: ");
varos = new Varos(nev,terulet,lakosok);
varosok.add(varos);
}
nev = Console.readLine("\nVros neve : ");
}
Collections.sort(varosok);
}

void lista() {
System.out.println
("\nVrosok npsrsg szerint rendezve");
System.out.println(
"Nv Terlet Lakosok szma Npsrsg");
for (int i=0; i<varosok.size(); i++) {
System.out.println(varosok.get(i));
}
}

void kimutatas() {
int[] gyujto = new int[4];
for (int i=0; i<varosok.size(); i++) {
Varos varos = (Varos)(varosok.get(i));
// Indexkpzs a jegyek szma alapjn:
int index = (""+varos.getLakosokSzama()).length();
index = index-5;
if (index < 0)
index = 0;
if (index > 3)
index = 3;
gyujto[index]++;
}
470 VI. RSZ. KONTNEREK

System.out.println("\n Lakosok szma Vrosok szma");


System.out.println(" 0- 99999 "+Format.right(gyujto[0],5));
System.out.println(" 100000- 999999 "+Format.right(gyujto[1],5));
System.out.println(" 1000000-9999999 "+Format.right(gyujto[2],5));
System.out.println("10000000- "+Format.right(gyujto[3],5));
}

void menu() {
char valasz;
do {
System.out.println("\n1- Felvitel");
System.out.println("2- Lista");
System.out.println("3- Kimutats");
System.out.print ("0- Kilps ");
valasz=Console.readChar();
switch (valasz) {
case '1': {felvitel(); break;}
case '2': {lista(); break;}
case '3': {kimutatas(); break;}
}
}
while (valasz!='0');
}

public static void main(String[] args) {


new Varosok().menu();
}
}

20.9. Feladat Autelads

Feladatspecifikci
Egy autkereskeds adott tpus s szn autk forgalmazsval foglalkozik. Az
aktulis kszletet (milyen autbl hny darab van), a rendszmtblkat s az eladott
autkat programmal tartjk nyilvn. A program funkcii (menbl vlaszthatk):
Elads: A kuncsaft megmondja a nevt, s hogy milyen tpus s szn autt kr.
Ha van ilyen aut, akkor a program az authoz rendszmtblt rendel, az autt s
a rendszmtblt a kszletbl kiemeli, s az autt eladott autknt nyilvntartja a
tulajdonos (kuncsaft) nevvel egytt.
Aktulis kszlet listja (tpus, szn, darab) tpus, s azon bell szn szerint rendezet-
ten.
Mg fel nem hasznlt rendszmtblk listja rendszm szerint rendezetten.
Eladott autk listja (rendszm, tpus, szn, tulajdonos), rendszm szerint rende-
zetten.
A program elejn vigyk be a kszlet s rendszmtbla adatokat. Az aut-, illetve
rendszmkszlet bvtse nem feladata a programnak.
20. A Vector s a Collections osztly 20.9. Feladat Autelads 471

Megolds
AutoKinalat
-tipus: String
-szin: String
-db: int
+AutoKinalat(tipus,szin,db)
autoKinalatok +AutoKinalat(tipus,szin)
String {Vektor (tipus+szin)} +getTipus(): String
+getSzin(): String
* * +getDb(): int
rendszamok +van(): boolean
{Vektor (abc)} +keszletCsokkent()
+equals(obj): boolean
+compareTo(obj): int
+toString(): String

AutoEladas
EladottAuto
*
AutoEladas() eladottAutok -rendszam: String
rendszamFelvisz() {Vektor (rendszm)} -tulajdonos: String
rendszamLista() -tipus: String
kinalatFelvisz() -szin: String
kinalatLista()
eladas() +EladottAuto(rendszam,
eladottAutokLista() tulajdonos,tipus,szin)
menu() +equals(obj): boolean
+main(...) +compareTo(obj): int
+toString(): String

20.12. bra. Az Autelads osztlydiagramja

A program tervt a 20.12. bra mutatja. Osztlylersok:


AutoKinalat: Az adott tpus s szn autk osztlya. Ezeken az adatokon kvl az
jellemz r, hogy hny darab ilyen aut van a kszletben. A darabszmot eladskor
eggyel cskkentennk kell, ezt vgzi el a keszletCsokkent metdus. A van metdus
megmutatja, hogy van-e egyltaln ebbl az autbl kszleten. Nem lehet kt egyforma
objektum, ugyanazzal a tpussal s sznnel, ezrt az equals metdust eszerint rjuk
meg. A compareTo metdust a tpus+szn szerinti rendezettsg hatrozza meg.
472 VI. RSZ. KONTNEREK

EladottAuto: Egy eladott autra jellemz annak rendszma, tulajdonosa, az aut tpusa
s szne. Kt egyforma rendszm aut nem lehetsges majd, s a rendezettsg rend-
szm szerint lesz.
AutoEladas: Ez a vezrl osztly. Az eladas a legsszetettebb metdus: megnzi,
hogy van-e egyltaln eladni val aut s van-e hozz rendszm. Ha van, akkor bekri
az hajtott aut adatait. Ha van ilyen aut kszleten, akkor kivesz a rendszamok kon-
tnerbl egy rendszmot, cskkenti az autknlatok megfelel autjnak kszlett
eggyel, sszellt egy EladottAut objektumot, melyet betesz az eladottAutok
kontnerbe.

Forrskd
import extra.*;
import java.util.*;

/* AutoKinalat **********************************************/
class AutoKinalat implements Comparable {
private String tipus;
private String szin;
private int db;

public AutoKinalat(String tipus, String szin, int db) {


this.tipus = tipus;
this.szin = szin;
this.db = db;
}

public AutoKinalat(String tipus, String szin) {


this(tipus,szin,0);
}

public String getTipus() { return tipus; }


public String getSzin() { return szin; }
public int getDb() { return db; }
public boolean van() { return db>0; }
public void keszletCsokkent() {
if (db>0) db--;
}

public boolean equals(Object obj) {


AutoKinalat ak = (AutoKinalat)obj;
return tipus.equals(ak.getTipus()) &&
szin.equals(ak.getSzin());
}

public int compareTo(Object obj) {


AutoKinalat ak = (AutoKinalat)obj;
int comp = tipus.compareTo(ak.tipus);
if (comp!=0 )
return comp;
return szin.compareTo(ak.szin);
}
20. A Vector s a Collections osztly 20.9. Feladat Autelads 473

public String toString() {


return Format.left(tipus,10) +
Format.left(szin,10) + Format.left(db,6);
}
}

/* EladottAuto **********************************************/
class EladottAuto {
private String rendszam;
private String tulajdonos;
private String tipus;
private String szin;
public EladottAuto(String rendszam, String
tulajdonos, String tipus, String szin) {
this.rendszam = rendszam;
this.tulajdonos = tulajdonos;
this.tipus = tipus;
this.szin = szin;
}

public boolean equals(Object obj) {


return rendszam.equals(((EladottAuto)obj).rendszam);
}

public int compareTo(Object obj) {


return rendszam.compareTo(((EladottAuto)obj).rendszam);
}

public String toString() {


return Format.left(rendszam,10) + " " +
Format.left(tulajdonos,10) + " " +
Format.left(tipus,10) + " " +
Format.left(szin,10);
}
}

/* AutoEladas ***********************************************/
public class AutoEladas {
private Vector rendszamok = new Vector();
private Vector autoKinalatok = new Vector();
private Vector eladottAutok = new Vector();
void rendszamFelvisz() {
String rendszam = Console.readLine("Rendszm: ");
while (!rendszam.equals("")) {
rendszamok.add(rendszam.toUpperCase());
rendszam = Console.readLine("Rendszm: ");
}
Collections.sort(rendszamok);
}
void rendszamLista() {
System.out.println("Rendszmok listja");
for (int i=0; i<rendszamok.size(); i++)
System.out.println(rendszamok.get(i));
}
474 VI. RSZ. KONTNEREK

void kinalatFelvisz() {
String tipus = Console.readLine("Auttpus: ");
String szin;
int db;
while (!tipus.equals("")) {
autoKinalatok.add(new AutoKinalat(tipus,
Console.readLine("Szn: "),
Console.readInt("Db: ")));
tipus = Console.readLine("Auttpus: ");
}
Collections.sort(autoKinalatok);
}
void kinalatLista() {
System.out.println("Knlatok listja");
for (int i=0; i<autoKinalatok.size(); i++)
System.out.println(autoKinalatok.get(i));
}

void eladas() {
if (autoKinalatok.isEmpty())
System.out.println("Elfogyott az aut!");
if (rendszamok.isEmpty())
System.out.println("Elfogyott a rendszm!");

kinalatLista();
String tipus = Console.readLine("Milyen tpust kr? ");
String szin = Console.readLine("Milyen sznt kr? ");
int index = autoKinalatok.indexOf(
new AutoKinalat(tipus,szin));
if (index<0) {
System.out.println("Nincs ilyen aut");
return;
}
AutoKinalat autoKinalat =
(AutoKinalat)(autoKinalatok.get(index));
if (!autoKinalat.van()) {
System.out.println("Elfogyott");
return;
}

autoKinalat.keszletCsokkent();
String rendszam = (String)rendszamok.remove(0);
String tulajdonos = Console.readLine("Tulajdonos: ");
EladottAuto eladottAuto = new EladottAuto(
rendszam,tulajdonos,tipus,szin);
eladottAutok.add(eladottAuto);
System.out.println("A vsrolt aut adatai: "+eladottAuto);
}

void eladottAutokLista() {
System.out.println("Eladott autk listja");
for (int i=0; i<eladottAutok.size(); i++)
System.out.println(eladottAutok.get(i));
}
20. A Vector s a Collections osztly 20.9. Feladat Autelads 475

public void menu() {


rendszamFelvisz();
rendszamLista();
kinalatFelvisz();
kinalatLista();
char menu;

do {
menu = Character.toUpperCase(Console.readChar
("A(uto eladas)/K(inalatlista)/R(endszamlista)"+
"/E(ladott autok listaja)/V(ege)? "));
switch (menu) {
case 'A' : { eladas(); break; }
case 'R' : { rendszamLista(); break; }
case 'K' : { kinalatLista(); break; }
case 'E' : { eladottAutokLista(); break; }
}
} while (menu != 'V');
}

public static void main (String args[]) {


new AutoEladas().menu();
}
}

Tesztkrdsek

20.1. Jellje meg az sszes helyes lltst a kvetkezk kzl!


a) A kontner ismeri a benne trolt objektumok osztlyt.
b) A Vector egy lekpezs kontner.
c) A vektor mrete az elemek hozzadsval automatikusan bvl.
d) A vektor tartalmazhat akr 5 millird objektumot is.
20.2. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) A vektor elemei indexelhetk.
b) A vektor az elemeket rendezetten trolja.
c) A vektor kt objektuma (egyik s msik) egyenl, ha az
egyik.compareTo(msik)==0.
d) Egy vektor elejre beszrhat egy msik vektor sszes eleme.
20.3. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) A Vector osztly egy objektumot az elemein rtelmezett compareTo metdus
alapjn keres meg.
b) A vektor tadhat paramterknt a println() metdusnak.
c) A Vector osztly a List osztly utdja.
d) A Vector osztly a Collections osztly utdja.
20.4. Jellje meg az sszes helyes lltst a kvetkezk kzl!
a) A szrmaztatott interfsz pldnyosthat.
b) Egy osztly tbb interfszt is implementlhat.
476 VI. RSZ. KONTNEREK

c) A Collections osztly pldnyai kpesek kontnerek rendezsre.


d) A Collection interfsz statikus metdusai segtsgvel egy tetszleges objektu-
mokat tartalmaz kontner elemei rendezhetk.

Feladatok

20.1. (A) Krjen be a felhasznltl egsz szmokat! A szmok szmt nem tudjuk elre
(lehet nagyon sok is), s lehetnek kzttk egyenlk is. rja meg a kvetkez metdu-
sokat a szmsorozattal kapcsolatosan:
a) kirja a szmokat a bevitel sorrendjben;
b) kirja a szmokat fordtott sorrendben;
c) minden negatv szmot nullra cserl;
d) visszaadja a sorozat tlagt;
e) visszaadja, hogy egy adott szmbl hny van a sorozatban;
f) kitrli a sorozatbl a paramterben megadott sszes szmot;
g) kitrli a sorozatbl a paramterben megadott sszes szmot, kivve az elst!
Tipp: csomagolja be a szmokat, s tegye be ket egy vektorba!

Ezutn
h) rja ki a legkisebb s a legnagyobb szmot!
i) rendezze a sorozatot nvekvleg!
j) fordtsa meg a sorozatot!
k) keverje ssze a sorozatot!
l) rendezze megint a sorozatot nvekvleg!
m) binris keresssel keresse meg a bekrt szmot, s rja ki annak indext!
A feladathoz megoldshoz hasznlja Collections osztly metdusait!
(SzamSorozat.java)

20.2. (A) rja t a fejezetben tallhat TorpeProgram.java programot: A bevitel utn rendezze
a trpket nv szerint! (TorpeProgram2.java)

20.3. (B) A 20.3 pontban tallhat Torpek.java programot rja t a kvetkezkppen:


menbl hvhatan ksztse el a kvetkez funkcikat:
a) Vigyen fel j trpket!
b) Trljn egy adott nev trpt!
c) A trpk nvekedhessenek, illetve zsugorodhassanak. Tegye lehetv egy adott
nev trpe magassgnak lltst!
d) rja ki a trpket magassg szerint nvekv rendezettsgben!
e) rja ki a trpket magassg szerint cskken rendezettsgben!
f) rja ki a legalacsonyabb s a legmagasabb trpe nevt s magassgt! Ha tbb van,
akkor rja ki az sszeset.
(TorpeProgram3.java)
20.4. (B) Krjen be a konzolrl dtumokat (v, h, nap). Rendezze a dtumokat nvekv sor-
rendbe! rja ki a dtumok listjt rendezs eltt s utn! (A feladatot sajt dtum
osztllyal oldja meg!) (DatumRend.java)
20. A Vector s a Collections osztly 20.9. Feladat Autelads 477

20.5. (B) A 20.5 pontban tallhat Emberek.java programot vltoztassa meg a kvetkez-
kppen: Ne engedjen felvinni egyforma nev embert mg akkor sem, ha szletsi vk
klnbzik! (Emberek2.java)

20.6. (B) Fejlessze tovbb a 17. fejezet RaktarProgram.java mintaprogramjt gy, hogy a
raktrban elvileg akrhny ru lehet. Egy adott rubl a raktrba be lehet tenni, illetve
onnan ki lehet venni egy adott mennyisget. (RaktarProgram3.java)

20.7. (B) Fejlessze tovbb a 17. fejezet Bank.java mintaprogramjt gy, hogy menbl j
szmlt is lehet nyitni, illetve trlni lehet mr meglv szmlt! A banknak teht tet-
szlegesen sok szmlja lehet. (Bank2.java)

20.8. (B) Egy szervizben a szervizelt autkrl szmtgpes nyilvntartst vezetnek. Egy
autrl a kvetkez adatokat tartjk nyilvn: rendszm, tulajdonos s fogyaszts.
Ksztsen egy konzolos alkalmazst, amelyben menbl vlaszthatan a kvetkez
funkcikat lehet krni:
j aut adatainak felvitele (kt egyforma rendszm autt nem lehet felvinni)
Az sszes aut adatainak kilistzsa a tulajdonos neve szerinti rendezettsgben
Egy adott rendszm aut adatainak kirsa
(Szerviz.java)

20.9. (C) Egy frfi futversenyen ngy fle tvon indulhatnak a versenyzk: 100, 200, 400 s
800 mteren. A program tartsa nyilvn a futverseny nevezseit s eredmnyeit! Neve-
zskor meg kell adni a versenyz nevt s a tvot, amelyen indul. Egy adott nev ver-
senyz csak egy tvon indulhat! Minden nevezshez majd egy eredmny fog tartozni: a
mrt futsi id msodpercben (trt szm is lehet). A program menbl krheten
vgezze el a kvetkez feladatokat:
Vegyen fel nevezseket (az adatokat konzolrl krje be)! A tvot a felknlt lehet-
sgek alapjn szmmal kell megadni (1=100m, 2=200m, 3=400m, 4=800m). A ver-
senyz eredmnye kezdetben 0, ami azt jelenti, hogy mg nincs eredmnye.
Tegye lehetv az eredmny berst!
Listzza ki az sszes versenyzt nevezsi sorrendben!
rja ki az els hrom helyezettet minden egyes tv esetn!
Minden lista a versenyz sszes adatt tartalmazza, igaztva! Extra ellenrzseket nem
kell vgeznie. (FutoVerseny.java)

20.10. (C) Ksztsen a zldsgesnek egy nyilvntart s szmlz programot! A program


trolja minden egyes zldsg nevt, rt, a boltban lev aktulis mennyisget (kg-ban),
valamint az ajnlott minimlis s maximlis mennyisget (ez utbbi kt adat alapjn
trtnik az utnrendels). A program funkcii a kvetkezk:
j ru nyilvntartsba vtele
ru trlse a nyilvntartsbl
ru egysgrnak mdostsa
478 VI. RSZ. KONTNEREK

Vsrls: Kilistzza a vlaszthat zldsgek neveit. A vev vlaszt egy rut, s


megadja a vsrolni kvnt mennyisget. A vev egyms utn tbb rut is krhet. A
vsrls vgn ksztsnk szmlt: a szmln csak azok a zldsgek szerepeljenek,
amelyekbl trtnt vsrls, mgpedig mindegyik csak egyszer. A szmln zlds-
genknt legyen rajta annak neve, egysgra, sszes vsrolt mennyisge s rtke.
Vgl rjuk ki a fizetend sszeget!
Utnrendels: Egy zldsgbl akkor kell rendelni, ha az aktulis mennyisg a mi-
nimlis szint al kerlt. Ekkor annyi rut rendelnk, hogy a kszlet maximlis
legyen. A program rja ki, hogy melyik zldsgbl kell rendelni, s mennyit!
Zrs: Kilps a programbl. rjunk ki egy statisztikt az aznapi vsrlsokrl:
melyik zldsgbl mennyit adtunk el, mibl adtunk el a legtbbet, mibl nem
adtunk el semmit.
(Zoldseges.java)
I. BEVEZETS A PROGRAMOZSBA
1. A szmtgp s a szoftver
2. Adat, algoritmus
3. A szoftver fejlesztse

II. OBJEKTUMORIENTLT PARADIGMA


4. Mitl objektumorientlt egy program?
5. Objektum, osztly
6. Trstsi kapcsolatok
7. rklds
8. Egyszer OO terv Esettanulmny

III. JAVA KRNYEZET


9. Fejlesztsi krnyezet Els programunk
10. A Java nyelvrl

IV. JAVA PROGRAMOZSI ALAPOK


11. Alapfogalmak
12. Kifejezsek, rtkads
13. Szelekcik
14. Itercik
15. Metdusok rsa

V. OSZTLYOK HASZNLATA, KSZTSE


16. Objektumok, karakterlncok, csomagolk
17. Osztly ksztse

VI. KONTNEREK
18. Tmbk
19. Rendezs, keress, karbantarts
20. A Vector s a Collections osztly

FGGELK
A tesztkrdsek megoldsai
Irodalomjegyzk
Trgymutat F
A tesztkrdsek megoldsai

1. A szmtgp s a szoftver
1. ad 2. cd 3. bd 4. b 5. d 6. b 7. abc 8. cd

2. Adat, algoritmus
1. bd 2. ac 3. bd 4. d 5. abc

3. A szoftver fejlesztse
1. bd 2. ac 3. acd 4. ad 5. bcd

4. Mitl objektumorientlt egy program?


1. bd 2. ad 3. ab

5. Objektum, osztly
1. cd 2. c 3. abd 4. bc

6. Trstsi kapcsolatok
1. bc 2. acd 3. abd 4. c

7. rklds
1. b 2. abd 3. bd 4. bc 5. a

8. Egyszer OO terv Esettanulmny


1. ad 2. ab 3. ac 4. cd 5. abc 6. cd

9. Fejlesztsi krnyezet Els programunk


1. cd 2. a 3. abc 4. b 5. cd 6. bcd 7. cd 8. cd 9. a 10. b
11. d 12. a

10. A Java nyelvrl


1. b 2. b 3. d 4. ab 5. c 6. d 7. bcd 8. acd
482 FGGELK

11. Alapfogalmak
1. bc 2. ac 3. cd 4. c 5. ac 6. acd 7. cd 8. c 9. b

12. Kifejezsek, rtkads


1. b 2. b 3. b 4. bd 5. ab 6. ac 7. b 8. a 9. b 10. ab

13. Szelekcik
1. ad 2. bcd 3. c 4. abc 5. abd

14. Itercik
1. acd 2. b 3. abd 4. b 5. abd 6. b 7. c 8. abd

15. Metdusok rsa


1. b 2. cd 3. c 4. bd 5. b 6. bcd 7. c 8. c 9. b 10. c
11. d

16. Objektumok, karakterlncok, csomagolk


1. ad 2. b 3. abd 4. bcd 5. d 6. ad

17. Osztly ksztse


1. cd 2. ad 3. c 4. bd 5. ab 6. d 7. a 8. acd 9. bd

18. Tmbk
1. cd 2. acd 3. c 4. acd 5. c 6. b 7. c

19. Rendezs, keress, karbantarts


1. c 2. c 3. ad 4. abd 5. c

20. A Vector s a Collections osztly


1. c 2. acd 3. b 4. b
Irodalomjegyzk

Magyarul:
[1] Angster Erzsbet: Az objektumorientlt tervezs s programozs alapjai
(UML, Turbo Pascal, C++), 1997
[2] Jamsa, Kris: Java
Kossuth knyvkiad, 1996, fordts
[3] Nykyn G. Judit (szerk.) et al.: Java 2 tikalauz programozknak
ELTE TTK Hallgati Alaptvny, 2000
[4] Nykyn G. Judit (szerk.) et al.: J2EE tikalauz Java programozknak
ELTE TTK Hallgati Alaptvny, 2002
[5] Vg Csaba - dr. Juhsz Istvn: Java - start!
Logos 2000, 1999

Angolul:
[6] Booch, Grady: The Unified Modeling Language User Guide
Addison-Wesley, 1998
[7] Bruce Eckel: Thinking in Java
Prentice Hall, 1999
[8] Cay S. Horstmann, Gary Cornell: Core Java 1.2
Sun MicroSystems Press, 1999
[9] Eriksson, Hans-Erik - Penker, Magnus: UML Toolkit
Wiley, 1998
[10] Fowler, Martin: UML Distilled
Addison-Wesley, 1997
[11] Gamma, Erich - Helm, Richard - Johnson, Ralph - Vlissides, John:
Design patterns
Addison-Wesley, 1997
[12] Jacobson, Ivar: The Unified Software Development Process
Addison-Wesley, 1999
484 FGGELK

[13] Khalid A. Mughal, Rolf W. Rasmussen: A Progremmer's Guide to Java


Certification
Addison-Wesley, 2000
[14] Kruchten, Philippe: The Rational Unified Process - An Introduction
Addison-Wesley, 1999
[15] Rumbaugh, James: OMT Insights
SIGS Books, 1996
[16] Rumbaugh, James: The Unified Modeling Language Reference Manuel
Addison-Wesley, 1999
[17] Y. Daniel Liang: Introduction to Java Programming
Que E&T, 1999
Trgymutat 485

Trgymutat

azonost 187 compareTo 454


elnevezsi konvencik compiler 12
A, 188 Component osztly 128
absztrakci 18, 57 hivatkozsi kr 355 continue 262
adat 23, 67, 72 kpzsi szablyok 187
adatbzis-kezelk 171
adatok feldolgozsa vgjelig
Cs
264 B csomag szint lthatsg
additv opertorok 217 bjtkd 10, 143 109
aktor 46, 74, 122 belpsi felttel 251 csomagols
aktulis paramterek 283 beszrs 407 primitv tpus 325
alacsony szint nyelv 10 bezrs 63, 81 csomagolk 301
alaposztly 104 bin knyvtr 154
algoritmus 23 binris keress 410
tulajdonsgai 39 binris opertor 215 D
algoritmusvezrelt program bitenknti opertorok 219 deklarls 27, 193
117 biztonsgos 176 dekompozci 18
alkalmazsbngsz 136 blokk DeMorgan azonossgok
alkalmazi metdus 199, 282 228
programcsomagok 15 utasts 289 dinamikus 177
llapot 69 Boolean osztly 327 direkt rendezs 407
alosztly 104 bottom-up 19 do while 253
ltalnosts 58, 104 bngsz 174 dokumentls 53
alulrl felfel tervezs 19 bvthetsg 17
analzis 48, 50, 113 bvt konverzi 221
API csomagstruktrja 159 break 262 E,
architektra-semleges 176
editor 11
ArrayIndexOutOfBounds
egsz literl 190
Exception 374 C egsz tpusok 196
ASCII karakter 183
C++ 170 egyg szelekci 237
assembler 10
CASE eszkz 21 egydimenzis tmb 369,
Assembly nyelv 7, 10
Character osztly 327 372
tads 47
ciklusok 30, 34, 251 egyed objektum 83
tlagszmts 267
ciklusok egymsba gyazsa egyegy kapcsolat 90
automatikus befejezs 153
260 egyenlsgvizsglat
automatikus konverzi 221
CLASSPATH 156 objektum 425, 446
automatikus
Collection interfsz 454 String 314
metdusfelknls 152
Collections osztly 456 egyenlsgvizsgl opertor
automatikus szemtgyjts
Comparable interfsz 454 217
308
486 FGGELK

egymsba gyazott IF 241 Bank 253, 345 Program paramter teszt


egymsba gyazott Betgyjts 384 393
szelekcik 241 Csere 321 Raktrprogram 339
Egysgestett eljrs 44, 49 Csillag 140, 257 Rendszm 260
egysok kapcsolat 92 Dtumbonts 332 Sinus 292
egyszeres rkls 106 Dobs-statisztika 379 String rendezett 473
egyszer 176 Egy vagy kt A bet StringTeszt 313
egyszer OO terv 111 218 Szmbekrs 254
egyttmkdsi diagram letkor 382 Szmok 377
63, 113, 338 Els oszthat 263 Szavak 331
Eiffel 171 Els t 259 Szavazatkirtkels 395
eljrs 35, 202, 280 Emberek 458 Szorztbla 261
ellenrizhetsg 17 Faktorilis 291 Szkv 263
elosztott 176 Fizets 239, 258 Szvegek 378
eljel opertor 216 Henger 208 TizedespontCsere 316
elltesztel ciklus 251 Hordkeress 423 Trpk 448
else if 243 Hurra 149 Vals szmok 145, 461
Els programunk 133 Jegyek szma 255 Vrosok 467
equals metdus 446 J szm 241 Vector minta 444
ers kts 18 Kamat 232 Vletlen szm 291
ers tartalmazs 87 Karbantarts, rendezett felelssg 63
ersen tpusos nyelv 221 429 felhasznl 44
rtkads 27, 213, 223 Kis s nagy bc 259 felhasznlbartsg 17
interfsz 452 Kocka 246 felhasznli dokumentci
kompatibilits 223 Kor 244 53
tmb 376 Kr kerlete 264 felmrs 46
rtkads, objektum 307 Kvetkez 286 felttel 227
rtkad opertorok 220 Kvetkez karakter 240 feltteles kirtkels 220
rtkad utasts 203 Krumpli 181 fellrl lefel tervezs 19
rtelmez 13 Legels 314 felvitel 411
escape karakter 184 Legnagyobb 241 for 256
esemnyvezrelt program Maximlis szmla 269 fordts 11, 139, 156
117 Megszmol 266 tbb osztly esetn 161
eszkztr 136 Men 270 fordtsi egysg 161
explicit tpuskonverzi 221 Metdusminta 277 fordtprogram 12
extra.Console osztly 204 Metdusminta2 287 formlis paramterlista
extra.Format osztly 207 Mi igaz 245 282
Milyen karakter? 327 forrskd 11
Minimlis s maximlis szerkezete 197
F kilomter 268 forrskd 14
fehr szkz 186 Minimumok 288 forrskd strukturlsa 37
fejlesztsi ciklus 45 Nobel djasok 463 forrsprogram 51
fejlesztsi dokumentci Objektum paramter forrsprogram szerkezete
120 322 197
fejlesztsi krnyezet 133 Oszthat? 248 f felels 116
fejleszteszkzk 123 sszeg 290 fmen 136
fejleszti dokumentci 53 sszegzs 328 fosztly 104
Feladat Palindrma 323 JFrame osztly 128
A legfiatalabb lny Paramter teszt 392 futs alatti hiba 14
kivlasztsa (1) 24 Prmek 266 futs alatti kts 66
Angol bc 259 Primitv rendezetlen futtats 11, 139, 156
tlag 267 415 fggetlen felttelek
Autelads 470 Primitv rendezett 417 vizsglata 247
Trgymutat 487

fggvny 35, 202, 280 informci elrejtse 19, jre knyvtr 154
63, 81
informcihordoz
G objektum 83 K
gpi brzols 3 inicializl kapcsolat
gpi kd 5 blokk 361 egsz-rsz 87
kifejezs 361 egyegy 90
inicializl blokk egysok 92
Gy tmb 375 foka 89
inicializlk 360 ismeretsgi 59, 86
gyenge tartalmazs 87
Insert 151 ktelez 90
gyjts 379
integrlt fejleszti krnyezet objektumok kztt 85
163 opcionlis 90
H integrits 18
interfsz 106, 452
osztlyok kztt 89
sok-sok 93
hasonlts Interfsz objektum 83 tartalmazsi 59, 85, 87
objektum 425 Internet 173 kapcsolat irnya 85, 89
hasonlt objektum 425 interpretlt 177 kapcsolat neve 85, 89
hasonlt opertor 217 interpreter 13 kapcsolatok 59
hasznlati eset 46 Interpreter 14 karakter literl 191
hasznlati esetek 51, 123 ismeretsgi kapcsolat 59, karakter tpus 197
hatr objektum 83 85 karakterlncok 301
hatkonysg 17 ISO 18 karbantarts 411
htultesztel ciklus 253 iterci 25, 48 karbantartsa
helyessg 17 itercik 30, 251 szvegek 429
helyzetrzkeny help 153
karbantarthatsg 17
hibafeltrs 152
knyszertett konverzi
hibatrs 17 J 221
hibrid nyelv 170
Java 170 kpernyterv 121
hiperszveg 174
tpusok osztlyozsa krelem 62
hivatkozsi kr 355
194 keress 408
hordozhat 177
trtnete 172 ksi kts 66
hordozhatsg 17
Java Fejleszti Kszlet 153 ktg szelekci 240
hozzfrsi md 108, 338
Java nyelv ktdimenzis tmb 385
jellemzi 176 ktimenzis tmb 371
I, Java osztlyknyvtr 159
java.applet 160
kidolgozs 47
kifejezs
if 237 java.awt 160 alkotelemei 213
IF ... THEN ... ELSE IF java.io 161 kifejezsek 213
243 java.lang 161 kifejezsek kirtkelse
if..else 240 java.lang.Math osztly 231 226
igazsgtbla 218, 229 java.util 161 kis szoftver fejlesztse 49
implementls 48, 51 JAVA_HOME 155 kiterjesztett rtkads 225
interfsz 452 Java-kpes 174 kiugrs a ciklusbl 260
implicit tpuskonverzi javalib knyvtr 144 kivtelek 200
221 javaprog 134, 146 kliens 73
importls 199 javax.swing 161 kd jrafelhasznlsa 82
indexels JBuilder 134 kdbeilleszts 152
String 309 JDK 153, 165 kdols 51
tomb 374 knyvtrstruktrja 153 kdolsi konvenci 238
Vector 439 prbafuts 149 kollekci 438
indexes rendezs 407 jdkwork.bat 156 kompatibilits 17
indexkpz algoritmus 382 JIT 13 kompozci 87, 88
488 FGGELK

konstans 194 megrendel 44 adat 67


megszmlls 266 llapot 69
azonossg 70
konstrukci 47 deklarlsa 305
konstruktor 75, 305, 358 megvalsts egyenlsgvizsglat
alaprtelmezs szerinti trstsi kapcsolat 94 308
359 menkszts 270 lete 308
tlterhels 360 metdus 67, 278 rtkads 307
kontner 96, 437 hogyan tervezzk... 292 felelssgei 122
kontnerobjektum 83 metdus 72 inicializlsa 74
kontrollobjektum 83 metdusdeklarci 199 ltrehozsa 74
konverzi irnya 221 metdushvs 74, 201 ltrehozsa sajt
konzol metdusok rsa 277 osztlybl 343
adatbevitel 204 metdusok tlterhelse metdus 67
megjelents 206 286 paramter 322
knyv mellklete 134 minimumkivlaszts 268 szemtgyjts 308
krnyezeti belltsok 155 minimumkivlasztsos sztereotpusa 83
krnyezeti vltozk 155 rendezs 406 objektum alap nyelv 170
kvetelmnyfeltrs 48, minsgi szoftver 16 objektumdiagram 86, 89,
50, 112 mintaprogram 149, 181 113, 338
kvetelmnyspecifikci mnusz 216 objektumorientlt 176
121 mdosts 411 objektumorientlt program
kzvetlen s 104 mdostk 281 f jellemzi 59
kzvetlen utd 104 tag 354 objektumorientlt
kulcs 411 modulris programozs 18 szoftverfejlesztsi
kulcssz 189 multiobjektum 88 mdszer 21
multiplicits 89 ojektum
multiplikatv opertorok ltrehozsa 305
L 217 opercis rendszerek 14
lthatsg 108, 338 munkafzis 46 operandus 213
laza kts 18 munkafolyamat 48, 112 opertor 192, 213
lekpezs 438 oszd meg s uralkodj 18
length konstans 374 osztly 70
lpsenknti finomts 19
N deklarcii 351
lptet ciklus 30, 256 natv kd 5 felptse 351
lptet opertor 216 navigls irnya 85 inicializl blokk 361
leszrmazott 104 naviglsi irny 89 ksztse 337
linker 13 new 305 mintaprogram 339
List interfsz 454 nvekmnyes ciklus 35 osztlydeklarci 199
literl 189 null referencia 304 osztlydiagram 94, 104,
logikai opertorok 217 NullPointerException 311 113, 338
logikai tpus 197 numerikus csomagol osztlylers 113
loklis vltoz 289 osztlyok 328 osztlymetdus 79, 353
osztlyozs 58, 64
osztlytag 353
M Ny osztlyvltoz 79, 353
magas szint nyelv 8 nyilvnos 108, 338
magas teljestmny 177
main metdus 199
nyomkvets 164 ,
Math osztly 231 rkls
maximumkivlaszts 268 O, egyszeres 106
megjegyzs 186 tbbszrs 106
Object osztly 302
megklnbztets 57 objektum 60, 67 rklds 65, 101
Trgymutat 489

sosztly 104 rendezett sorozat 414 szerepnv 89


sszegzs 267 szerkeszts 11

return 285
P robusztus 176 szerver 73
package 159 rutin 35 szignatra 203, 230, 286
paramter szintaktikai hiba 52
program 393 szintaktikai kiemels 153,
paramtertads 229, 283
S 164
objektum 322 segtsg 164 szoftver 4
tmb 392 srthetetlensg 18 szoftver lete 45
parancssor-paramter 393 setjava.bat 156 szoftverek osztlyozsa 14
Pascal 170 Smalltalk 170 szoftverfejleszts 43, 49
PATH 155 soksok kapcsolat 93 szoftverfejleszt 44
pldny 70 sorszmozott tpus 195 szoftverfejleszt rendszerek
pldnydiagram 86, 89 specializls 58, 104 14
pldnymetdus 76, 353 src.zip 155 szoftverkrzis 15
pldnytag 353 statikus metdus 353 szvegliterl 191
pldnyvltoz 76, 353 statikus vltoz 353 szvegszerkeszt 151
plusz 216 sttuszsor 138 szvegszerkeszt program
polimorfizmus 64 String 11
postfix 215 egyenlsgvizsglat sztereotpus 83
pozicionls 151 314 szkt konverzi 221
prefix 215 String osztly 309
primitv tpus 304 StringBuffer osztly 316
csomagols 325 Stringek rendezse 420
T
primitv tpusok 195 StringIndexOutOfBounds tag 353
primitv tpus Exception 311 takars
paramtertads 229 StringTokenizer osztly azonost 355
primitv tpus vltoz 194 329 trgykd 5
privt 108, 338 strukturls 37, 238 trstsi kapcsolat 85
program 3, 4, 53 strukturlt algoritmus 40 megvalsts 94
alkotelemei 185 strukturlt programozs 21 tartalmazsi kapcsolat 59,
program strukturlsa 238 struktrapanel 138 85
programfejlesztsi switch 243 tartalompanel 137
mdszertan 21 tervezs 48, 51, 113
programozsi nyelv 5, 10, tesztadat 52
24 Sz tesztels 48, 52, 114
programszerkeszt program szabvnyossg 18 tevkenysgdiagram 27
13 szakterleti objektummodell this objektumreferencia
programterv 51, 123 51, 122 357
projekt 135 szmtgpes szimulci throws 282
projektpanel 137 112 tpus 25, 192
prototpus 121 szrazteszt 52 tpusknyszerts 221
pszeudokd 33, 126 szekvencia 25, 29, 33 tpuskonverzik 221
szekvencilis keress 410 tpusok osztlyozsa 194
szelekci 25, 238 tiszta objektumorientlt
R egyg 237 nyelv 170
referencia tpus vltoz egymsba gyazott 241 top-down 19
194 tbbg 243 tbbg szelekcik 243
referenciatpus 304 szelekcik 29, 33, 237 tbbdimenzis tmb 371,
rendezs 406 szemantikai hiba 52 390
rendezetlen sorozat 413 szepartor 191 tbbszl 177
490 FGGELK

tbbszrs rkls 106 vizulis fejleszteszkzk


171

W
tmb 369 while 251
deklarlsa 372 World Wide Web 173
rtkads 376
inicializl blokk 375
keress 408
kezdeti rtk 373
paramtertads 392
rendezs 406
szekvencilis
feldolgozsa 377
tmbk msolsa 388
trls 151, 411
tlterhels 203, 286
tlterhelt metdus 229

U,
jrafelhasznlhatsg 17
UML 44, 72, 301
unris opertor 215
unikd karakter 183
URL 174
utasts 200
utd osztly 104

,
gynk 74
zenet 62, 74
zenet 345
zenetpanel 138

V
vals literl 190
vals tpusok 196
vals vilg modellezse 57
vltoz
kezdeti rtk 357
vltoz 25, 192
deklarlsa 193
inicializlsa 194
loklis 289
Vector osztly 439
vdett 108, 338
vezrl 116
vezrlszerkezetek 25, 238
visszatrsi tpus 282
Vge

You might also like