Professional Documents
Culture Documents
AngsterErzsebet Java1
AngsterErzsebet Java1
Java
ELS KTET
ii
Elsz
A Java nyelv igazn korszer, objektumorientlt programozsi nyelv. Szinte minden informati-
khoz kzel ll cg keres Java fejlesztket.
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.
2003. janur 5.
iv
Tartalomjegyzk
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
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
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
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.
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:
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>... ;
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...
xiii
Forrskd
// Ez egy Java program els sora:
import java.util.*; // 1
//...
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
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
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
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.
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):
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
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
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
Feladat
rjunk egy assembly programrszletet, mely az A cmen lev egsz rtket (a 7-et)
megszorozza 5-tel! Az eredmny az A cmen keletkezzk!
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.
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.
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.
int a=7;
i, n, t, Backspace, t, ...
Space, a, =, 7, ;, ... Notepad.exe
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.
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
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.
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).
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
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.
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.
Modul
Rendszer
Modulok kztti
kapcsolat
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.
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
Tesztkrdsek
2. Adat, algoritmus
A fejezet pontjai:
1. Az algoritmus fogalma
2. Vltoz, tpus
3. Tevkenysgdiagram
4. Pszeudokd
5. Az algoritmus tulajdonsgai
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.
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 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.
Vltoz
Az aktulis tanul adatlapja gy fest (a legtanul adatlapja ugyanilyen, csak a doboz neve ms):
aktTanul:Tanul
nv: String lny: boolean szlDtum: Date
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.
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 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.
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.
tevkenysg
Csompont
Haladsi irny (tmenet): Felttel: (elgazsi pont, gyjtpont):
[felttel]
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.
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:
[else]
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:
[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.
tevkenysg
2. Adat, algoritmus 2.3. Tevkenysgdiagram 31
Adatok:
Algoritmus:
Az algoritmus tevkenysgdiagramja a 2.2. brn lthat. Elemezzk az algoritmust:
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]
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
Szekvencia
tevkenysg1
tevkenysg2
...
tevkenysg1, tevkenysg2 stb. egyms utn kerlnek vgrehajtsra.
Szelekcik
Egyg szelekci
if felttel
tevkenysg
end if
34 I. RSZ. BEVEZETS A PROGRAMOZSBA
Tbbg szelekci
if felttel1
tevkenysg1
else if felttel2
tevkenysg2
else if felttel3
tevkenysg3
...
else
tevkenysgN
end if
Ciklusok
Egy tevkenysg a megadott felttel fggvnyben ismtelten vgrehajtdik.
Elltesztel ciklus
while felttel
tevkenysg
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
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
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 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!
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 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!
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.
Tesztkrdsek
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.
Megjegyzs: Elkpzelhet olyan eset is, hogy a szoftverfejleszt maga a megrendel vagy a
felhasznl (ha valaki a sajt rszre kszt programot).
Id
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.
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.
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.
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.
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.
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.
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
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
Tesztkrdsek
A fejezet pontjai:
1. A vals vilg modellezse
2. Az objektumorientlt program fbb jellemzi
ltalnosts
llat Bvebb kategria
Osztly
Csonti Specializls
Kutya Papagj Oroszln
Szkebb kategria
Leo
Ropi Elza
Ricsi
Pldny
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
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
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)
zldsgBolt2
elkszt(hsleves)
erzsbet zldsgBolt3
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.
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
Pldnya
Frfi Hlgy
laci (fggsgi kapcsolat)
elkszt(...) vanKedv?
elkszt(...)
vsrol(...) zsfi
fz()
rklsi kapcsolat mosogat()
SzerelmesHlgy GyakorlottHlgy
kati erzsbet
fz() fz()
Bolt
ruk (nv, mennyisg, r)
nyitva?
van(...)?
elad(...)
zldsgBolt1
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).
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
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
5.1. Az objektum
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)
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
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
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
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
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
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
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 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.
zenet
(krelem)
kliens szerver
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.
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
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)
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
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 .
.
.
.
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.
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 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!
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
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)
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 informci elrejtse (information hiding) azt jelenti, hogy az objektum elrejti bel-
gyeit, azokat csak az interfszn t "hagyja" megkzelteni.
Implementci
Interfsz
metdus1
metdus2
metdus3 Adatok
.
.
.
metdusN
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.
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.
Ikonok:
hatr
Informcihordoz:
Frame Frame
Hatr:
Kontroll:
Tesztkrdsek
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.
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.
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
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
3
felgyeli
pageNum: InputLine
printDialog:
Dialog ok: Button
cancel: Button
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.
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.
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
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.
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
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
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.
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
1
Tanfolyamok: Hallgatk:
Kpzi
Jr gprs andi
Tanfolyam 1..* 2..10 Hallgat
angol gyuszi
szmtech. anita
dvid
2
Hallgatk:
gbor
kliens szerver
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();
Ki ez az aut? Senki?
:Ember egyik:Aut
dvid
nv=Dvid tpus=Peugeot
aut=msik rendszm=BIT745
s ez kzs?
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()
...
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()
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.
Tesztkrdsek
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)
2
1 Ember 2 Dialog Button
pozci(x,y) location(x,y)
IQ size(width,height)
megy()
setLocation() sosztlyok
tanul()
setSize()
beszl()
Ember
pozci
IQ gerg
megy()
tanul()
beszl()
Hallgat Tanr
zsolt
osztlyzat elrhetsg
tananyag goston
tanul() tant()
bea
beszl()
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).
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.
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
Laks Kocsi
LakKocsi
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.
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.
interfsz interfsz
Repl UtasSzllt
felszll() ltszm() Interfszek
leszll() beszll(utas)
repl() kiszll(utas)
Az osztly deklarciit az ell kell vagy lehet vdeni, aki az osztlyt hasznlni akarja. Egy ksz
osztlyt lnyegben ktflekppen lehet hasznlni:
Osztly objektum.publikusAdat
+publikusAdat
objektum.publikusMetdus
#vdettAdat objektum
-privtAdat :Osztly
+publikusMetdus
objektum.vdettAdat
#vdettMetdus
objektum.vdettMetdus
-privtMetdus
objektum.privtAdat
objektum.privtMetdus
Osztly
+publikusAdat
#vdettAdat
-privtAdat
+publikusMetdus
#vdettMetdus
-privtMetdus
Hivatkozsok a metdusban:
UtdOsztly
publikusAdat
vdettAdat
privtAdat
egyMetdus
publikusMetdus
vdettMetdus
privtMetdus
Tesztkrdsek
A fejezet pontjai:
1. A fogalmak tisztzsa
2. Gyuszi jtka fejlesztsi dokumentci
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
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.
Kvetelmnyfeltrs
Analzis
Tervezs
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 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.
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.
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
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.
Belpsi pont
main
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 (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.
F belpsi pont
main
Belpsi pont
(mouseClicked)
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.
Gyuszi
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
A Gyuszi jtka program kpernyterve (itt most prototpusa) a 8.3. brn lthat.
Szakterleti objektummodell
A jtk objektummodelljt a 8.4. bra mutatja.
aut
aut
aut
aut
Egr
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.
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:
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.
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)
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
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
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
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
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
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
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 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.
Pldul:
C:/javaprog/_OOTPJava1/Esettanulmanyok
GyusziJateka
GyusziJateka.jpx // projektfjl
src // a projekt forrsfjljai
classes // a projekt bjtkdjai
...
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)
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.
Projektfjl
Tartalompanel
Projektfa Projektpanel
Struktrapanel
zenetpanel
Nzet flek
Fut projekt
9.2. bra. A GyusziJateka projekt a JBuilderben
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
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.
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).
Bjtkdok trlse
Most mr a kt ktet sszes programja futtathat vagy nll projektknt, vagy a javaprog
projekt segtsgvel.
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).
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.
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.
Feladat Hurr
rjunk olyan Java programot, amely konzolra rja a kvetkez szveget:
Hurr, fut az els Java programom!
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[])
Hurra
+main(args: String[])
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
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.
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.
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)
...
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
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
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
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
| | ...
| ...
A lang csomagot minden program automatikusan ltja, ezrt a kvetkez importls pldul
felesleges:
import java.lang.System;
Megkeresi az
Applikacio.class main JVM
metdust, s lefuttatja. java Applikacio
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
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
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
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.
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.
OO adatbzis-kezelk
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)
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.
<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>
Tesztkrdsek
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
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
+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
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 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).
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!").
Fehr szkz
A fehr szkz (white space) elvlasztja a program alapelemeit. Fehr szkznek nevezzk
a szkzt, a tabultort, a sor- s lapvgjeleket:
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
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!
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
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
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.
Literl
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
Opertor
Az opertor vagy mveleti jel a kifejezs rsze (pldul fejadag*letszam).
Java opertorok pldul:
* / % + - < <= > >= ++ != && || = +=
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.
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 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:
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
Java tpus
Primitv Referencia
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>... ;
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
}
}
Karakter tpus
A karakter tpus vltozba egy karakterliterlt tehetnk bele.
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.
C1 CN App
v1, ...vN
... ... +main
+m1
...
+mN
Egy Java forrsprogram szerkezete a kvetkez (rszletek a 11.3. brn tallhat osztlyok
forrskdjbl):
// App.java forrsprogramja
import java.util.*; Csomagok importlsa
import extra.*;
class CN {
...
}
Importls
A java.lang-ban van tbbek kztt a System osztly. A java.util egy API csomag, az
extra egy sajt osztlyokat tartalmaz csomag.
Osztlydeklarci
Blokk
Lthattuk, hogy az osztlynak s a metdusnak is van blokkja. Ksbb ltni fogjuk, hogy bizo-
nyos utastsoknak is lehet blokkjuk.
Utasts
Kivtelek
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
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
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
Pldul a println() metdus paramtere lehet long, double vagy String is. Ez a metdus
annyiszor szerepel a PrintStream osztlyban, ahny klnbz paramterezse van.
letszam fejadag
10 0.21
letszam * fejadag
= 2.1
osszesen
?
Pldul:
letszam = 10; fejadag = 0.21;
osszesen = fejadag*letszam; // osszesen rtke 2.1 lesz
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
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.
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.
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
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.
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:
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 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
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 + sin(5)
Kifejezsek pldul:
alfa
Math.sin(alfa) + 5
-98E4
(j<5) || (j>10)
!(Math.sqrt((n+3)/2)==0)
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.
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
+ (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.
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
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
! (NEM)
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 || mvelet a rvid kirtkels (short circuit) vltozat. A kvetkez program arra plda,
hogy a rvid s a teljes kirtkels ms vgrehajtst eredmnyez:
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 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
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;
rtkad opertorok
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
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.
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!!!
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
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
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
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 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
- 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
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;
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
//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
Pldul:
a==b & a%2==0 | !a+b<10
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)
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)
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
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
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
Pldul:
int min(int a, int b) // metdus feje
Itt x+2-nek int-nl szkebb, vagy int tpusnak kell lennie, azaz x csak byte, short, int
vagy char tpus lehet.
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).
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.
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
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
(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:
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)
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.
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
[felttel]
utasts
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.*;
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);
}
}
}
[felttel] [else]
utasts1 utasts2
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");
}
}
Feladat Legnagyobb
Krjnk be hrom szmot, majd rjuk ki ezek kzl a legnagyobbat!
Forrskd
import extra.*;
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
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;
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
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.*;
switch
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.*;
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!");
}
}
}
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
Feladat Oszthat?
Krjnk be egy szmot! rjuk ki, hogy az oszthat-e 2-vel, 3-mal, illetve 5-tel (kln-
kln)!
Forrskd
import extra.*;
Tesztkrdsek
13.1. Mi igaz az albbi strukturlatlan kdrszletre? Jellje meg az sszes igaz lltst!
if (f1)
if (f2)
u1;
else
u2;
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;
...
}
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.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
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
[felttel]
utasts
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).
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.");
}
}
utasts
[felttel]
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.");
}
}
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 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
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!
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
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;
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
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
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+" ");
}
}
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
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
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");
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:
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;
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
import extra.Console;
// 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
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
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!");
}
}
Szm: 3
Szm: 0
sszeg= 17
Darab = 3
tlag = 5.67
Legknnyebb dolgunk akkor van, ha elre tudjuk a sorozat elemeinek szmt, s ez nem nulla.
Ilyen a kvetkez feladat:
Forrskd
import extra.Console;
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.
Forrskd
import extra.*;
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);
Futs
E(gyik) / M(sik) / V(ge)? e
Egyik funkci vgrehajtsa
Tesztkrdsek
14.5. Melyik ciklus hajtdik vgre legalbb egyszer a kvetkez deklarci mellett? Jellje
meg az sszes j vlaszt!
int a=10; b=12;
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.8. (B) Krjen be egy egsz szmot, s llaptsa meg, hogy hny 0 jegy szerepel benne!
(NullaJegyek.java)
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
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.
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.
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.*;
A program elemzse
MetodusMinta
+main(args: String[])
vonalhuz()
jegyekSzama(n: int): int
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);
Metdusfej
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
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
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:
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!
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
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.
...
System.out.println
("Jegyek szma: "+jegyekSzama(szam));
...
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 {
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.
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 {
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 {
A forrskd elemzse
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 loklis vltozk nem kapnak kezdrtket a blokkba val belpskor, arrl a programo-
znak kell gondoskodnia. A nem inicializlt loklis vltoz hasznlata fordtsi hibt
eredmnyez.
Pldul:
290 IV. RSZ. JAVA PROGRAMOZSI ALAPOK
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.
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;
}
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);
Forrskd
import extra.*;
public class Faktorialis {
A program futsa
5 faktorilisa: 120
6 faktorilisa: 720
7 faktorilisa: 5040
Forrskd
import extra.*;
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)
}
}
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
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
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
Feladatok
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
java::lang java::util
Object java::lang::Object
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
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 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;
Ember(...)
d ember
nv="Erika"
68.9
szlv=1953
ember
null
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
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()
...
//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");
//1 :String
Object ember1 ember3
"Tmea"
//3
String :String //4
ember2 obj
//2
"Roland"
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
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");
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
//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.
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 !
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.
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!
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
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 elemzse
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.
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 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
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 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).
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.
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
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");
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
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
//1 //2
:StringBuffer hegy1
hegy1 :StringBuffer
"Machu"
"Machu Picchu"
hegy2
//3
hegy1
:StringBuffer
"Ez is Machu Picchu"
hegy2
//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".
Feladat Csere
Krjnk be egy szveget, majd cserljk ki az sszes & jelet az and szra!
Forrskd
import extra.*;
public class Csere {
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.
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!
Forrskd
import extra.*;
A program elemzse
null
str str
:StringBuffer :StringBuffer
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!
Forrskd
import extra.*;
public class Palindroma {
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
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 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.
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:");
}
}
}
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.*;
System.out.println("--------");
System.out.println(Format.right(osszeg,8,2));
}
}
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).
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
2 * 3 a z n h a 5 !
tokenek
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
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.*;
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.*;
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
Feladatok
String osztly
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)
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
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)
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
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.
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
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.
Az egyes akcik kztt kpernyre rjuk az aru objektumot ekkor kzvetve meghvjuk
annak toString() metdust.
Forrskd
// RaktarProgram.java
class Aru { //1
private String nev; //2
private double egysegar; //3
private double menny; //4
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
}
344 V. RSZ. OSZTLYOK HASZNLATA, KSZTSE
1. 2.
program:RaktarProgram program:RaktarProgram
RaktarProgram() RaktarProgram()
akciok() akciok()
RaktarProgram StartRaktarProgram
main(...) main(...)
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();
}
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.
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
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.
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
case '2': {
ugyfelKiszolgalas(szamla2);
break;
}
case 'A': {
JoSzerencse.setArfolyam(
Console.readDouble("j rfolyam: "));
break;
}
}
} while (valasz!='V');
}
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
extends <OsztlyAzon>
A deklarcik fajtit a 17.4. bra mutatja. Az egyes deklarcikat kln pontok trgyaljk. A
bels osztlyokrl a 2. ktetben lesz sz.
Osztlymetdus Pldnymetdus
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 pldnytagjai
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.
class JoSzerencse {
int joSzerencse; //1
//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.
Pldul:
class Proba {
int szam=1; //1
static char kar='A'; //2
//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 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.
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
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.
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 konstruktor tlterhelse
Pldul:
public JoSzerencse(String tulajdonos,String kedvezmenyezett) {
szamlaSzam = ++utolsoSzamlaSzam;
this.tulajdonos = tulajdonos;
this.kedvezmenyezett = kedvezmenyezett;
jegyDb = 0;
}
...
szamla1 = new JoSzerencse("Arany Dniel","Ezst Hajnalka");
szamla2 = new JoSzerencse("Fejr Lipt"); // nincs kedvezm.
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
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);
}
}
Inicializl blokk
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
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
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.
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.
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)
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)
... ... ... ... ... ...
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!
Pldul:
int[] iArray1; // iArray1 egy tmb
int iArray2[]; // iArray2 is egy tmb!
0. 1. 2. 3. 4.
iArray1 12 56 0 -9 26
0. 1. 2.
iArray2 2 98 10
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
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.
Indexels
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
0. 1. 2. 3.
sArray
Inicializl blokk
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
0. 1. 2. 3.
iArray1 1 3 5 7
0. 1.
iArray2 10 20
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 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
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:
Forrskd
import extra.*;
// 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
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
1. 2. 3. 4. 5. 6.
1 1 2 0 0 3
+1
+1 +1
...
33612666114622... a dobsok
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
// Eredmny kirsa:
System.out.println(d1);
System.out.println(d2);
}
}
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
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: ");
}
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
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.
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
Pldaknt vegyk a szamok tmbt, melynek 3 sora s 5 oszlopa van, elemtpusa int:
int[][] szamok = new int[3][5];
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]
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.*;
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!
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
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.
Forrskd
public class ParamTeszt {
A program futsa
0 5
99 0 0 0 -5
Mozart Wagner Beethoven
Monteverdi Corelli
A program elemzse
Forrskd
public class ProgParamTeszt {
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.
A program terve
Szavazatok
katSzam : int
SzavazatKiertekeles szavazat : int[][]
Szavazatok(versenyzokSzama: String[])
main(args: String[]) feldolgozas()
print()
gyoztesVersenyzok()
kategoriaOssz(kat: int): int
gyoztesKategoriak()
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
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;
// 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])];
}
// 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();
}
}
System.out.println("Gyztes kategorik:");
for (int i=1; i<szavazat.length; i++)
if (kategoriaOssz(i) == max)
System.out.print(i+" ");
System.out.println();
}
}
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
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.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)
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.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 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
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
1. 2. 3. 4. 5. n-1. n.
...
Eddig mr rendezett
5. lps:
1. 2. 3. 4. 5. n-1. n.
...
Eddig mr rendezett
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.
Indexes rendezs
4 6 3 5 2 1
1 2 3 4 5 6
Finn Aladr Zentai Bla Cirok Emil Murok Jen Bor Kzmr Abafi Vilmos
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");
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
???
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.
19.3. Karbantarts
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.
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.
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.
Ezektl fggen a beszrs, mdosts s trls funkcik alapveten msok lesznek. Ngy
esetet kell vgignznnk:
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
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
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.
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
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
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
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;
}
}
return -1;
}
} // Kontener
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
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();
}
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;
}
}
A program futsa
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.
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();
}
if (i != minIndex) {
String seged = tomb[i];
tomb[i] = tomb[minIndex];
tomb[minIndex] = seged;
}
}
}
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.
hasonltHord
(tmr,magassg) (60,20)
kapacits ??
meretKereses() rendez()
kapacitasKereses()
nincs ilyen tulajdonsga). A keresst inkbb gy vgezzk el, hogy sorban minden
egyes hordnak lekrdezzk a kapacitst, s sszehasonltjuk a keresett rtkkel.
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();
}
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
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;
}
}
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;
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;
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
SortedStringContainer
-array: String[]
-capacity, size: int
-current: int
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;
}
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
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
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!");
}
Tesztkrdsek
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)
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
add(element)
Object
remove(element)
size()
AnyClass isEmpty()
contains(element)
+metdus get(i) :AnyClass
kliens :Kontner
:AnyClass
.
.
.
((AnyClass)element).metdus
element :AnyClass
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.
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
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
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.
initialCapacity capacityIncrement
0 1 2 3 4
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
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.
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.*;
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.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
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
0 1 2 size()-1
equals(hasonlt)?
Ember.equals() metdus:
hasonlt
public boolean equals(Object obj) {
nev = "Morg" return nev.equals(((Ember)obj).getNev());
magassag: ??? }
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.
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) {...}
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
class Ember {
private String nev;
private int magassag;
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());
}
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 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
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");
}
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
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
Comparable interfsz
A java.lang.Comparable interfsz mindssze egy metdusfejet definil:
public int compareTo(Object obj)
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
...
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.
...
public int compareTo(Object o) {
return compareTo((String)o);
}
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
java::util::List
interfsz
*
java::lang::Comparable
+compareTo(obj:Object):int
java::util::Vector
AnyClass
+AnyClass()
+compareTo(obj:Object):int
...
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!
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());
}
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
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;
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');
}
Forrskd
import extra.Console;
import java.util.*;
// 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;
}
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
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
Forrskd
import extra.*;
import java.util.*;
void felvitelDijasok(){
String nev, orszag, szakterulet;
int evszam;
NobelDijas dijas;
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));
}
}
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
Forrskd
import extra.*;
import java.util.*;
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
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');
}
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
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;
/* 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;
}
/* 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
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');
}
Tesztkrdsek
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.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)
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
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
11. Alapfogalmak
1. bc 2. ac 3. cd 4. c 5. ac 6. acd 7. cd 8. c 9. b
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
18. Tmbk
1. cd 2. acd 3. c 4. acd 5. c 6. b 7. c
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
Trgymutat
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
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
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