You are on page 1of 61

Bevezets a programozsba a Jva nyelven keresztl

Szerzk: Paller Gbor, Pskuj Attila Az olvas most egy mersz ksrlettel fog tallkozni. Ebben a cikksorozatban megprblkozunk azzal, hogy egy ltalnos rel tudssal rendelkez olvast beavassunk a szmtgpprogramozsba s erre eszkzl a Jva nyelvet hasznljuk fel. A szoksos mdszer az lenne, hogy a tanul elbb ismerje meg az algoritmikus alapokat s legalbb egy funkcionlis nyelvet, majd ezutn vgjon bele egy olyan relat ve bonyolult rendszer megismersbe, mint a Jva. Ezzel a mdszerrel n egyetrtek, ugyanakkor az elmlt vben sok olyan panaszt hallottam, miszerint a "belpsi szint" a Jvba tl magas, a tanknyvek megrtshez az objektumorientlt programozsi paradigmt mr ismerni kell. Nem mindenkinek van kedve, ideje vagy lehetsge azonban vgigjrnia az alapos tanul tjt s a tapasztalat azt mutatta, hogy ilyen esetekben is j eredmnyek rhetk el megfelelen adaptlt s fkuszlt tananyaggal. A kezd tuds ugyan nem lesz olyan mly s a tanul algoritmikus tudsa is gyengbb lesz hagyomnyos kpzst vgzetteknl, azonban gyakorlattal sok minden ptolhat s igen sok programozsi feladatnl nincs szksg komplex algoritmusok kifejlesztsre vagy kdolsra. Termszetesen a fenti, reduklt cl egyben ints is a diknak: ne gondolja, hogy azrt mert vgigcsinlta ezt a leckesorozatot, azonnal kpzett programoz lett belle. Az algoritmikus alapok bvtsre a ksbbiekben nagy szksg lesz s ez az anyag csak a kezd lpsek megttelben segt. Mindenesetre leckk szorgos vgigcsinlsval megismerhetjk, hogyan kell egyszer algoritmusokat Jva nyelvre lekdolni s ez egy olyan alap, amin b zvst ptkezhetnk tovbb, ha van kedvnk vagy idnk a ksbbiekben. A tananyagban kt sajtos mdszert hasznlunk fel. Elszr is "munkafzet" st lusban ptkeznk, teht az j ismereteket gyakorlatokkal rgztjk. A gyakorlatok elvgzse az anyag integrns rsze, elvgzsk nlkl az ismeretek megfelel rgztdse nem vrhat. A msodik fogs a "varzselemek" mdszere: tekintve, hogy az olvas nem rendelkezik az alaptudssal, viszont azonnal csinlunk valami mkdt, nem magyarzhatunk meg rgtn mindent. Az ilyen rszeket "varzselemnek" nevezzk, a pldaprogramokban kkkel jelljk s az olvastl azt vrjuk, fogadja el, hogy ezek "kellenek". Remlheten az anyag vgre semmi nem marad "kk". Ugyancsak tudatos vlaszts az objektum fogalmnak s hasznlatuknak a ksi bevezetse. Felfogsom szerint az objektumok nagy mret programok s jrahasznlhat komponensek r sban alapvetek, kezd olvasnk problmi azonban msflk lesznek az elejn. Elkvetem azt az eretneksget teht, hogy a tananyag els rszben az objektumokrl szt se ejtek s a Jvt mint sima funkcionlis nyelvet hasznlom, mg ha ezzel ki is h vom az objektumorientlt valls h veinek tkait. Mg egy megjegyzs: ez a tananyag azrt hozzfrhet a Weben, hogy folyamatosan njn, vltozzon. rsa kzben jttem r, milyen rgen voltam magam is kezd s mennyire nem lthatk mr nekem, hol vannak a nehezen rthet rszek. Ha teht ilyet tallsz, rj azonnal egy levelet nekem s n megprblom a krdses rszt vilgosabb tenni. Kln ksznettel tartozunk kollganinknek, akik eljtszottk a ksrleti nyl szerept s elszr szenvedtk t magukat az anyagon, annak ellenre, hogy semmi kzk nem volt korbban a

szmtgpes programozshoz. Vlemnyk, visszajelzseik nagy segtsgnkre voltak az anyag tanthatsgnak javtsban.

Paller Gbor, Pskuj Attila

Tartalomjegyzk
1. Elttnk egy szmtgp: hogy jn mindez a Jvhoz? Processzor, memria s a fejezet maradk: mindezeket programok vezrlik. Programszveg neknk s program a szmtgpnek: a fordtprogramok. Egy rdekes megolds a Jvban: a virtulis gp. Els Jva programunk. 2. Fikos szekrny szilciumbl. A szmtgp mindent kpes trolni, csak mi nem fejezet felejtsk el, mit hov tettnk: a vltozk. Fikmretek s adattpusok. Kt egyszer adattpus, az egsz s a lebegpontos. Nhny alapmvelet kezdetnek. 3. Terelgetjk a szmtgpet; a program futsnak menete. Struktrlt programozs, fejezet ptkezs Matrjoska babkbl. Elgazsok s logikai kifejezsek. Megdolgoztatjuk a gpet: a ciklusok. 4. Megjegyzsek. rni utlunk, ezrt treksznk az jra felhasznlhat programrszekre. fejezet Fggvnyek a matematikban s Jvban. Paramterek, visszatrsi rtkek s vltoz lthatsgi szablyok. 5. Matematikai fggvnyek, a Jva matematikai fggvnyei s azok fejezet hasznlata.Egyszer matematikai problmk programnyelvi megoldsai. Feladatok a fggvnyek hasznlatra. 6. Tovbbi gyakorl feladatok matematikai problmk megoldsra. Cimke. fejezet Tbbszrs elgazs. Kilps programblokkbl: break. Kilps ciklusbl: continue. 2 ismeretlenes lineris egyenletrendszerek megoldsi mdszerei s azok JAVA nyelv megvalstsa. A mtrixelmlet elemei: mtrix, determinns. A 3- s tbbismeretlenes egyenletrendszerek megoldsi lehetsgei s JAVA nyelv megvalstsa. 7. Fikos szekrnyek garmadja, mindegyik hozz val mamval. A Jva fejezet alapptelemei, az objektumok. Objektumok deklarlsa vltozkkal s fggvnyekkel, amelyeket ezek utn metdusoknak fogunk hvni. Objektumok ltrehozsa s halla, letciklus a Jvban. A szemtgyjt. 8. jabb megvilgosods: statikus vltozk s metdusok. Egyedvltozk s fejezet osztlyvltozk kavalkdja. rklds s konverzik. 9. fejezet 10. fejezet Adatok tmegesen: tmbk a Jvban. Tmbtpusok. A Jva tmbk is csak objektumok. Objektumok s tmbk tmbje. Nem csak szmok vannak a vilgon! Dolgozzunk rdekesebb adatokkal: karakterek s azok halmazai. Karaktertpus a Jvban, a char tpus. Karaktersorozatok avagy ismerkeds a String osztllyal. String s StringBuffer, a kt jbart. 11. A Jva osztlyok is csak fjlok; Jva osztlyok elhelyezse s fellelse. Tovbbi fejezet koszteremt eszkzk: package s import. J helyek a fjlrendszeren: a CLASSPATH krnyezeti vltoz.

12. Mindenki a sajt hibinak kovcsa: szemlyre szabott hibajelzsek a Jvban. fejezet Kivtelek lete s halla: throw utasts, a throws kulcssz valamint a try-catch blokk. Folytatsa kvetkezik

(C) 2001, Paller Gbor, Pskuj Attila. Ez a tananyag rszekben vagy egszben, mdostssal vagy anlkl korltozs nlkl felhasznlhat non-profit clokra. Jvedelemszerzs cljbl trtn felhasznlshoz a szerzk elzetes rsbeli engedlye szksges.

1. fejezet
Elttnk egy szmtgp: hogy jn mindez a Jvhoz? Processzor, memria s a maradk: mindezeket programok vezrlik. Programszveg neknk s program a szmtgpnek: a fordtprogramok. Egy rdekes megolds a Jvban: a virtulis gp. Els Jva programunk. Ahhoz, hogy elolvashasd ezt a szveget, szmtgpet kell hasznlnod s a lecke munkafzet jellege miatt is szksged lesz r. Bizonyra a gp hasznlata mr meglehetsen ismert, klnben nem vgtl volna bele egy programozsi tanfolyamba. Mindazonltal tisztzzuk, alapveten milyen vadllat megszeldtsre vllalkoztunk. A szmtgp feladata adatok feldolgozsa. Brmit meg tud velk csinlni, sszeadja, kivonja, mozgatja a memrijban s a hozz csatolt eszkzk kztt. Minthogy ezt jval gyorsabban csinlja, mint egy ember, nem lehet gy irnytani, mint egy markolgpet; mire megkapja a kvetkez emberi parancsot, azalatt elrepl sok milli mvelet vgrehajtsi lehetsge. Ezen okbl a szmtgpnek az elvgzend mveletsorozatot elre mondjk meg, ez a program. A szmtgp memrija szmok trolsra szolgl, gy a programot magt is szmsorozat formjban troljk. Neumann Jnos nagy felismerse volt, hogy a program s az adat alapveten ugyanolyan tpus informci s ezrt ugyanabban a memriban trolhat. Az albbi kpen egy Neumann-tpus szmtgp blokkvzlata lthat.

1. bra: Neumann-szmtgp blokkvzlata A legfontosabb komponens a CPU, a Central Processing Unit, rviden a processzor. Ez a szmtgp kzponti vezrlegysge, ez hajtja vgre a memriban elhelyezett programot. Az egy ramkri lapkn, chip-en (ezek azok a kis fekete lapos dobozok a szmtgp ramkri lapjn) megvalstott processzort mikroprocesszornak nevezzk. Minthogy manapsg szinte mindegyik elterjedt processzor ilyen, a kt elnevezst ma mr felcserlheten hasznljk. A memriban helyezkednek el azok az adatok, amikkel a processzor mveleteket tud vgezni illetve a programja, amit vgrehajt. A memria, mint mr rtam, szmsorozatok formjban trolja a programot. Egy szm, mint programutasts jelentst a processzor tervezsekor dntik el. A

processzor ltal tmogatott sszes utasts szmokhoz rendelse a gpi kd. A pusztn szmokkal lert, a processzor szmra kzvetlenl rtelmezhet programot gpi kdnak nevezzk. A gpi kd jelentse processzortpusonknt vltozik, ez az egyik oka annak, hogy egyik tpus gpre rt program nem megy a msik tpus gpen. Nagyon sokfle memria ltezik, de ebben a pillanatban kt csoportba osztjuk ket: felejt s nem felejt memrikra. A felejt memria tartalma kitrldik, amikor a gpet kikapcsoljuk, ezt RAMnak (Random Access Memory) is nevezik. A felejtsrt cserbe a RAM rhat s olvashat is, mgpedig mindkt mveletet elg gyorsan meg lehet vele csinlni. A msik fajta memria nem felejti el a tartalmt, amikor a gpet kikapcsoljk, ennek egyik alaptpust ROM-nak (Read Only Memory) nevezik. Amint a neve is mondja, a ROM-ot csak olvasni lehet, a tartalmt a gyrts sorn lltjk be. Ezen fell vannak mg kztes tpusok, pl. a Flash memrik, amik nem felejtk s rhatk is, viszont relat ve lass ket rni. A szmtgpnek nem sok haszna van, ha csak a memrijban lev adatokat rendezgeti teljes elszigeteltsgben, valahogy bele kell juttatni adatokat majd kinyerni belle. Erre szolglnak a perifrik vagyis a be-kiviteli egysgek. Perifria pl. a billentyzet, vagy a kperny, amin ezt olvasod, a merevlemez, az egr, a hlzati csatol, stb. Nagyon bonyolult perifrik vannak, legtbbjk (pl. a merevlemezed vagy a billentyzeted) maga is egy kis specializlt szmtgp. A szmtgp egysgeit egy adatt kti ssze, ezt rendszerbusznak nevezzk. Brmely kt (vagy tbb) egysg kpes itt kommuniklni oly mdon, hogy az adatszolgltat egysg rteszi az adatt a buszra, a fogad(k) pedig leolvassa (leolvassk). ltalban a CPU irnytja ezt a tevkenysget, de ez nem trvnyszer, intelligens perifrik maguk is kpesek adatokat a memriba rni. Modern szmtgpekben nem egy busz van, hanem tbb is, de a programoz szmra ltalban csak az reg Neumann-architektra ltszik. Amikor a gpet bekapcsolod, a processzor azonnal vad tevkenysgbe fog s ezt nem is hagyja abba kikapcsolsig. A vad tevkenysg azt jelenti, hogy egy megadott helyen elkezdi vgrehajtani a memriban trolt programot. J, ha ott valami rtelmes program van (ne feledd: minden memriatartalom vgrehajthat, hiszen minden program csak egy szmsor), erre j a ROM. Ide ltalban valami olyan programot tesznek, ami vgeredmnyben lehetv teszi a felhasznlnak, hogy kommunikljon a gppel, begpelje a parancsait s elolvashassa a vlaszt. Azrt rom, hogy "vgeredmnyben", mert a modern nagy szmtgpekben ez egy elg bonyolult folyamat vgeredmnye, mivel az alapprogram is igen nagy. A ROM-ban elhelyezett programocska nem csinl mst, mint valami perifrirl feltlti azt a megalomnis valamit, ami manapsg egy modern opercis rendszer (Operating System, OS). Az opercis rendszer egy programcsomaggyjtemny, ami tartalmazza mindazt, ami egy program s a felhasznl szmra szksges a gp hasznlathoz. Egy program olyan alapfunkcikat ignyelhet az opercis rendszertl, mint egy fjl megnyitsa, trlse, r sa, olvassa, r s a kpernyre, olvass a billentyzetrl, kommunikci ms gpekkel a hlzaton keresztl, stb. A felhasznl szmra lehetv teszi programok indtst, lelltst, bejelentkezst, kijelentkezst, stb. Vannak funkcik, amelyeknl igen nehezen eldnthet, az opercis rendszerhez tartoznak-e, pl. a grafikus fellet kezelse. Egy biztos: a dolog, amivel a gped tbb percig szrakozik bekapcsolsa utn, az opercis rendszer elindtsa. Az sszes tbbi, kevsb ltalnos program az opercis rendszer irnytsa alatt s annak szolgltatsait felhasznlva fut, ezeket alkalmazsoknak h vjuk. Mi is ilyen alkalmazsokat fogunk rni. Az alkalmazsok gpi kdban tltdnek be s rtelmezdnek. Roppant kellemetlen lenne

azonban direkt gpi kdban programot rni s mg kellemetlenebb karbantartani, teht javtani, bvteni. Gondold meg: fejben kell tartani minden utastshoz tartoz kdot s megrteni pedig a szmokbl kell a programot. Ugyancsak nem elnys, hogy a gpi kd utastsok nagyon alacsony szintek, egy bet kpernyre rsa tbb szz sor is lehet. Dacra teht annak, hogy a programunk mindig (mg a Jvban is) a processzor sajt nyelvn, teht gpi kdban fut le, szinte sohase ebben rjk, hanem valamilyen, ember szmra jobban emszthet formban. A legegyszerbb ilyen forma az a kdols, amikor a gpi kd minden egyes utastsnak egy szveges utastst feleltetnek meg, ez a nyelv az assembly. Az assembly-ben knnyebbsg, hogy nem kell szmokra emlkezni, de tovbbra is adott az utastsok egyszersge, assembly-ben nagyon munkaignyes programot rni. Az assembly programot a processzor termszetesen nem kpes vgrehajtani (hiszen az csak ember szmra olvashat (olvashat?) szveg), elbb kell egy program, az assembler, ami gpi kd programot csinl belle. Amita a PC-k olyan nagyok lettek, mint rgen egy miniszmtgp, az assembly hasznlata visszaszorult, de mindenhol hasznljk, ahol az erforrsok (processzor, memria) szksek vagy a feladat olyan gpet prbl, hogy minden teljestmnyt ki kell belle facsarni. A fenti trkkt, miszerint a programot valamilyen ember ltal knnyebben rthet formban rjuk, amit aztn egy msik program segtsgvel etetnk meg a szmtgppel, szles krben hasznljk s nem csak olyan egyszer nyelvekkel, mint az assembly. Ha az ltalunk rt frmedvnyt (avagy zsenilis programot) amgy is el kell olvasnia egy msik programnak, hogy a gppel megetesse, akkor nem kell a gpi utastsok alacsony szintjhez ktdnnk, knyelmesebb nyelveket is ltrehozhatunk zlsnk szerint. gy jttek ltre a szmtgpes nyelvek tucatjai, a LISP, a FORTRAN, a C, a BASIC, a Pascal, a C++ s a Jva, hogy a tbbiekrl ne is beszljnk. Ezek a nyelvek els pillantsra nagyon klnbznek, de igazbl csak nhny alapkoncepci varilsra plnek. Ahogy az egyik kalapcs lehet j s a msik rossz, gy vannak j s rossz nyelvek is. St, ahogy az egyik kalapcs j lehet ktrsre, a msik cipszkedsre, feladathoz is rdemes nyelvet vlasztani. Az eddig legsikeresebbnek bizonyult programozsi nyelv a C ill. az objektumorientlt bvtse a C++, ezt a kt nyelvet a rendszerprogramozstl csillagszati programok ksztsig mindenre fel lehet hasznlni. A Jva nem ennyire sokoldal, azonban felhasznli alkalmazsok, klnsen hlzati alkalmazsok jval gyorsabban s kevesebb hibalehetsggel rakhatk benne ssze, ezrt ebben az alkalmazsi szegmensben gyorsan terjed. Mint megllaptottuk, minden programnl, ami nem gpi kdban rdott, kell egy msik program, ami a gp szjba rgja, mit is akartunk mondani. Pontosan, mintha a munksunk csak eszperantul beszlne, mi pedig netn csak magyarul tudnnk kommuniklni, kell valaki, aki lefordtja neki. Mint az emberi fordtsoknl, itt is sokfle fellls lehetsges. Pldul lerhatjuk az instrukciinkat, azt egy tolmcs lefordthatja eszperantra s odaadhatja a munksnak, aki ezek utn elvgzi a feladatot. Vilgos, hogy a munksnak ez j, hiszen amikor dolgozik, mr nem kell a fordtssal trdnie, ugyanakkor az instrukcik korrekt lefordtsa munkaignyes feladat s meg se vltoztathatjuk ket menet kzben. A fenti pldhoz teljesen hasonl mdon s ugyanazokkal az elnykkel-htrnyokkal mkdnek a compiler-ek vagy magyarul a fordtprogramok. Ezek a programok megeszik az ltalunk rt programot s kzvetlenl vgrehajthat gpi kdot generlnak belle. A legfbb elny a gpi kdra fordtott program gyors futsi sebessge s a j minsg fordts, hiszen a fordtprogramnak egy csom ideje van gondolkodni a legjobb varicin. Pldnak okrt a C, C++ s a FORTRAN nyelvek leggyakoribb implementcii fordtprogramot alkalmaznak.

Msik lehetsg, hogy szinkrontolmcsot alkalmazunk s mikzben mi eladjuk a mondknkat, menetkzben fordtja le eszperantra. Htrny persze, hogy a fordts ideje hozzaddik a munkavgzs idejhez, hiszen am g a munks a tolmcsot hallgatja, nem dolgozik. Bizonnyal a fordts se a legpontosabb. Ugyanakkor kimarad az elzetes fraszt kln fordtsi menet s menetkzben is megvltoztathatjuk az instrukcikat. A fenti sma az interpreter-ek vagyis az rtelmezprogramok megoldsa. Itt a programunkat az rtelmezprogram futsidben fordtja le. Elnye a rendk vl gyors fejlesztsi id (nincsenek lass fordtsi menetek) s elvileg lehet olyan programot is rni, ami jrarja nmagt. Htrny a vgrehajtsi sebessg. A LISP s a BASIC legtbbszr rtelmezprogramos megvalstsban szokott rendelkezsre llni. Tegyk fel, hogy eszperant anyanyelv alkalmazottunk mellett van olyan is, aki csak belgul tud. Akr a fordtprogramos, akr az rtelmezprogramos megoldst vlasztjuk, mindenkppen meg kell duplzni a fordtk szmt. Pontosan ugyanez a problma akkor is, ha szempont az, hogy minnl tbbfajta gpen menjen a programunk. Mindegyikben ms processzor lenne, ami ms gpi kdot rt, ms fordt fog kelleni. thidal megoldsknt kitallhatjuk, hogy soknyelv alkalmazottainkkal piktogrammokkal fogunk kommuniklni. Tolmcsunk az instrukcikat piktogrammnyelvre fordtja, amit kitn munksaink sokkal gyorsabban fognak fel, mintha magyarul mondannk nekik, habr nem olyan gyorsan, mintha az anyanyelvkn volna lerva. Ezzel a nmileg idita hasonlattal el is jutottunk a kzbls kdot alkalmaz nyelvekhez, mint amilyen a Jva. A Jva nyelv nagy grete, s korltai mellett az elterjedsnek legnagyobb segtje, hogy a nyelv egy sajt kis vilgot hoz ltre a hordoz processzoron s opercis rendszerben, amelyben minden Jva program mindenhol lefuthat. Olyan ez, mint amikor vilgutazsunk kzben mindegy, hol trnk be egy McDonald's-ba, Knban vagy Nicaraguban, mindenhol ugyanazt kapjuk. A Jva programok a Jva virtulis processzor gpi kdjra fordtdnak s a Jva virtulis opercis rendszer szolgltatsait veszik ignybe. Ezt persze egy konkrt gpen ill. opercis rendszeren a Jva futtatkrnyezet, a Jva Virtulis Gp (Java Virtual Machine, JVM) kell fogadja s megoldania a Jva gpi nyelv (a Jva bjtkd) futtatst valamint a Jva opercis rendszer szolgltatsainak (a Jva osztlyknyvtrnak) ignybevtelt. Ez idbe kerl, gy Jva programok sohase lehetnek olyan gyorsak, mint pl. a C-ben rtak. A sebessg azonban msodlagos lehet olyan elnyk mellett, hogy pl. a Jva programot gond nlkl lehet PC-n fejleszteni, majd vltoztats nlkl telepteni valami esztelen mret szmtgpre. Maga a Jva futtatrendszer az opercis rendszer szmra egy egyszer alkalmazs, habr trtntek mr ksrletek az opercis rendszerrel val integrlsra. A miltalunk hasznlt vltozat egyszer alkalmazsknt fut. Az albbi brn ez a koncepci lthat. Meg kell jegyezni, hogy a JVM s a Jva osztlyknyvtr implementcija termszetesen szintn fgg az opercis rendszertl s a processzortl, de a rajta fut Jva bjtkd mr ugyanaz.

2. bra. A Jva program, a JVM, az opercis rendszer s a processzor kapcsolata Ennyi csigzs utn taln csapjunk is a lovak kz. Kt dologra lesz szksgnk: egy installlt Jva futtatrendszerre (Java SDK) s egy szvegszerkesztre. A szvegszerkesztnek tudnia kell egyszer szveges fjlokat kezelnie, ilyen pl. a npszer Notepad Windows rendszerekben. Szmos oknl fogva a Word vagy hozz hasonl komoly szvegszerkeszt nem praktikus, habr hasznlhat. rdemes szerezni egy programozknak sznt szvegszerkesztt (n Windows-on a GWD szvegszerkesztt hasznlom), az ilyenek el vannak ltva minden csingilingivel, pldul sz nezik a forrsszveget, ami javtja az ttekinthetsgt. Ha azonban nem akarsz ilyen kalandokba belemenni, j az reg Notepad. Kell mg a Java SDK. Lehet. hogy a gpeden mr meg is van, tesztelskppen add ki a java ill. a javac parancsokat a parancsrtelmez ablakban (Command prompt). Ha ezek vgrehajtdnak (kpernynyi segt szveget rva ki), ms mr nem is kell. Ha nem, fordulj Kitr: a Java SDK installlsa fejezetnkhz. Most pedig lssuk els programunkat:
public class Elso { public void prog( String args[] ) { System.out.println( "Hello, ez az elso Java programunk!" ); } public static void main( String args[] ) { Elso e = new Elso(); e.prog( args ); } }

Mentsd el a fenti szveget az Elso.java nev fjlba. Fontos, hogy a fjl neve mindenkppen ez legyen! Jval ksbb fogjuk kifejteni, mirt , de a forrsban a "public class" mgtt lev nvvel megegyeznek kell legyen a forrsfjl neve .java kiterjesztssel. Most mondd azt: javac Elso.java Ha minden jl ment, a parancs nmi motozs utn zenet ki r sa nlkl befejezi a futst. Ha most megnzed a knyvtrat, ahol a forrsszveg volt, tallsz egy Elso.class nev fjlt. Ez a lefordtott Jva program, ebben van benne a programod Jva bjtkdban. Most mr csak egy Jva virtulis gpet kell tallnunk, ami le is futtatja. A java parancs pont ezt tudja.

java Elso s megjelenik a kvetkez szveg:


Hello, ez az elso Java programunk!

Hihetetlen, mr mkdkpes programot rtunk! Igaz ugyan, hogy az egszbl nem rtnk semmit, de els lpsnek nem rossz! A sok kksggel most ne foglalkozzunk, egy sort azrt elmagyarzok. A System.out.println arra j, hogy amit a mgtte lev zrjelek kz rtunk, kirja a konzolra. Az idzjelek fontosak: ez mondja meg a fordtprogramnak, hogy amit mgtte lt, az nem programszveg, nincs rtelme a szmtgp szmra, csak egy, a gp szmra rtelmetlen, nknyes karaktersorozat, vagyis betk, szmok s szimblumok sora. Errl bvebben majd egy ksbbi fejezetben! Vgl az utastst egy pontosvessz zrja, ez ktelez. Minden Jva utasts vgn pontosvessz kell legyen. Azt tanultuk a fejezet elejn, hogy a szmtgpnek a program elre mondja meg, mit kell majd csinlnia. Ugyan a mi kis programunk elindtsakor mr gy is j sok mindent csinl (el se tudod kpzelni, mennyi mindent!), mgis, demonstrljuk ezt a kpessgt most szuperprogramunk egy jelents bvtsvel: rassunk ki vele egy jabb sort.
public class Masodik { public void prog( String args[] ) { System.out.println( "Hello, ez az elso Java programunk!" ); System.out.println( "Ez pedig egy masodik sor tole" ); } public static void main( String args[] ) { Masodik e= new Masodik(); e.prog( args ); } }

Msoljuk ki a szvegbl a szvegszerkesztbe, mentsk el, fordtsuk le s futtassuk. (Most utoljra sgok: Copy-Paste Notepad-be, elmenteni a Notepad-bl Masodik.java nven, javac Masodik.java, java Masodik). A futtatsi eredmny nem meglep:
Hello, ez az elso Java programunk! Ez pedig egy masodik sor tole

Figyeljk meg, hogy a kt szveg egyms al rdott ki. Ez a System.out.println tulajdonsga, ez minden, ltala kirt karaktersorozat utn egy soremelst is kir. A soremels egy olyan specilis karakter, ami a kvetkez karakter kirsa pozcijt egy j sor elejre lpteti.

Feladat:
rasd ki a sajt nevedet a szmtgppel! Ezzel a lecke vgre is rtnk. Jkora utat jrtunk be, a szmtgp fogalmtl eljutottunk egy mkdkpes Jva programig. A kvetkez fejezetben bemutatjuk, mifle szmtsokat tudunk vgeztetni szilciumagy bartunkkal.

Ellenrz krdsek

I. II. III. IV. V. VI. VII. VIII. IX. X. XI. XII.

Mi a szmtgpes program? Mi a processzor szerepe a szmtgpben? Mi az opercis rendszer? Mirt szksgesek fordtprogramok? Mirt elnys a McDonald's? Mi a klnbsg a gpi kd s a Jva bjtkd kztt? Mi a Jva virtulis gp? Milyen parancs indtja el a Jva fordtprogramot? Milyen parancs indtja el a Jva virtulis gpet? Mi az a Jva szerkezet, amivel a konzolra lehet rni? Mit jelent a karakter fogalma? Mi az a soremels karakter?

2. fejezet
Fikos szekrny szilciumbl. A szmtgp mindent kpes trolni, csak mi nem felejtsk el, mit hov tettnk: a vltozk. Fikmretek s adattpusok. Kt egyszer adattpus, az egsz s a lebegpontos. Nhny alapmvelet kezdetnek. A szmtgp olyan, mint a mamtok fikos szekrnye. Ez egy nagyon j hasonlat, magamtl nem is tudtam volna kitallni, Roger Kaufman rkbecs FORTRAN kpesknyvbl vettem. FORTRAN-t ma mr kevesen hasznlnak, de a knyv mg ma is a legjobb bevezet kezdknek a szmtgpes programozsba. De vissza a fikos szekrnyhez! A szekrnynek, akarom mondani a gpnek rengeteg fikja van a legklnbzbb cuccok trolsra. A gp persze nem zoknikat vagy tbb ves villanyszmlkat trol, hanem adatokat. Hogy a sok fik kztt ne vessznk el, megc mkzzk a fikokat, egyszer s tall neveket adunk nekik. Egy ilyen fiknv egy vltoz neve, tartalma pedig a vltozban trolt rtk. A vltoz egy igen fontos fogalom, ezrt lssunk nhny hasonlatot. Pnztrcnkban lev pnz vltoz mennyisg, ez megfelel a vltoz rtknek. Egy konkrt pnztrca megfelel a vltoznak magnak, holott pnztrck ltalban nincsenek felc mkzve. Vagy vegynk egy teherautt: a rajta lev sder mennyisge vltoz rtk, a teheraut rendszma pedig azonostja, melyik rtket keressk. A vltoz egy analgia, ami lehetv teszi neknk, hogy a gp sok millinyi memriarekeszbl kivlasszuk a minket rdeklt. Egy vltoz mindig egy adag memriarekeszre vonatkozik (hogy mennyire, azt majd az adattpusok trgyalsnl megltjuk) s a Jva nyelv azt a knyelmessget adja

neknk, hogy erre az adag memriarekeszre egy ltalunk vlasztott nvvel hivatkozhatunk. A nvnek egyedinek kell lennie s betvel kezddnie, a tovbbi karakterei lehetnek betk, szmok vagy alhzsjel. Nhny plda rvnyes vltoznevekre: i j17 PI nagyon_hosszu_valtozonev

Itt van hrom rvnytelen is: 32ev a$ nagyon hosszu valtozonev A Jva nyelv klnbznek veszi a kis- s nagybetket, gy a pi s a PI kt kln vltozt jell. Mint ahogy a fik kivlasztsnl is fontos, hogy cetliket trolunk-e benne vagy lbosokat, gy a szmtgpnek is tudnia kell, mennyi memrit kell egy vltozhoz rendelnie. Ezt az hatrozza meg, milyen tpus adatokat trolunk a fikban, akarom mondani a memriarekeszben. A trolni k vnt adat tpust a vltoz adattpusnak megadsval kell meghatroznunk, hasonl mdon, mint ahogy a vltoz nevt is a vltoznvvel. A Jva nyelvnek van nhny beptett adattpusa tovbb a kpessge, hogy j adattpusokat hozhasson ltre a programoz. Most csak kt adattpus vizsglunk meg, az egsz s a lebegpontos tpust. Az egsz tpus a szmtgpnk legalapvetbb tpusa, leginkbb ezzel szeret szmolni a gp, ezrt mi is hasznljuk, ahol csak lehet. Az egsz tpus szm 0-tl nagyjbl 2 millirdig nhet s cskkenhet pozitv s negatv irnyban egyarnt s nevhez illen trtrsze nem lehet. A tpust az int kulcssz le r sval deklarljuk. Pl.: int i; int K,nagyon_hosszu_valtozonev; A deklarci a Jva nyelvben ktelez. Minden vltozt elbb deklarlni kell s csak aztn lehet hasznlni. Deklarls brhol lehet a programban a vltoz felhasznlsa eltt, teht akr a program kzepn is. A deklarls hatsra a vltozhoz hozzrendeldik a trterlet, ahol a vltoz rtkt trolja gpnk, de a vltoz rtkrl semmit sem tudunk. St mi tbb, a Jva fordt, ha felderti, hogy olyan vltozt hasznltunk, aminek az rtkrl mg nem rendelkeztnk, hibazenetet kld. De mit beszlek n itt a vltoz rtknek megadsrl s a vltoz felhasznlsrl, amikor mg csak a deklarlst ismerjk? Ha egy vltozt mr deklarltunk, kvetkez lpsben adjunk neki gyorsan rtket. Pl.: i = 3; K = -10; Ez az rtkad utasts. Fontos, hogy ne tekintsd az rtkad utastst a matematikbl ismert egyenlsg teljes szinon mjnak. A matematikai egyenlsg azt fejezi ki, hogy kt kifejezs a levezets teljes idtartamra bizonyos felttelek mellett megegyezik. Ha teht y = 2x, akkor ez gy van brmilyen x-re a megadott peremfelttelek mellett. Az rtkad utasts azonban, hogy a FORTRAN kpesknyvbl orozzak megint, egy "bemn" jel, teht abban a pillanatban, amikor

kirtkeldik, a jobb oldaln egy szm lesz, ami belerdik, "bemn" a vltoz mgtt meghzd memriba csak egyszer s akkor, amikor az utasts vgrehajtdik. Ha ksbb frissteni akarjuk a vltoz rtkt, jra vgre kell hajtanunk egy rtkad utastst. Ha teht n azt mondom, hogy y = 2*x, akkor a gp veszi az x vltoz rtkt, megszorozza kettvel s beteszi az y vltozba (figyelj, mostantl slamposabban fogalmazok! eddig mindig hangslyoztam, hogy a vltoznv mgtt hozzrendelt memria hzdik meg, de remlhetleg ez mr jl a fejedbe vsdtt. Mostantl csak azt mondom, hogy, belerdik a vltozba). Ez csak egyszer s az x aktulis rtkvel trtnik meg, ha x ksbb megvltozik s fontos, hogy ezt y is kvesse, jra vgre kell hajtani az rtkadst. Suttyomban megint elreszaladtam egy kicsit s lertam egy Jva kifejezst. Vgre is erre tartjuk a szmtgpet, szmoljon gyorsan. A Jva program is mindent kpes kiszmolni, ami lerhat egy vges mveletsorozattal, azaz algoritmussal. A Jva program jnhny mveletet kpes szmokkal elvgezni, ezek kzl nzzk most a ngy alapmveletet. + : sszeads - : kivons * : szorzs / : oszts

A mveletek a matematikban megszokott mdon precedencival rendelkeznek, teht zrjelek nlkl a szorzs s az oszts "ersebb" az sszeadsnl s a kivonsnl. Ezen (szoksos mdon) zrjelekkel vltoztathatunk. Pl. a 5+2*10 rtke 25, mg az (5+2)*10 rtke 70. Zrjeleket tetszleges mlysgben gyazhatunk egymsba, csak prosan legyenek. A kifejezsekben a konstansokat, esetnkben egsz szmokat s a vltozkat egyenrtken hasznlhatjuk. Ha teht az y vltozba az x vltoz ktszerest akarnd tenni, a helyes vlasz: y = x*2. Lssuk ezt egy mkd programban is!
public class Szamit1{ public void prog( String args[] ) { int x,y; x = 5; y = x*2; System.out.println( "Eredmeny: "+y ); } public static void main( String args[] ) { Szamit1 e = new Szamit1(); e.prog( args ); } }

Nem hiszem, hogy a System.out.println sorn k vl brmi is magyarzatot ignyelne. A mr megismert karaktersorozat-konstanshoz (az idzjelek kztt lev rszhez) hozzfztk az y vltozt, ami egy egsz. Ekkor a Jva fordt automatikusan olyan kdot fordt, ami az y-ban lev rtket karaktersorozatt alaktja s hozzfzi a karaktersorozat-konstanshoz. Teht az eredmny:
Eredmeny: 10

Feladat
rj egy olyan programot, ami kirja 2 els nyolc hatvnyt. A ki r si kp legyen teht: 2^0 = 1 2^1 = 2

... 2^7 = .... Oldd meg a feladatot nllan, majd a sajt programodat hasonltsd ssze a megoldssal . Ugye nem rt vratlanul az elz feladatban az n=n+1 tpus rtkads? Matematikailag ez egy teljes csd, de szmtgpl annl tbb rtelme van: vedd az n rtkt, adj hozz egyet, majd trold vissza n-be, vagyis nveld meg n-t eggyel. Most csavarjunk egyet a dolgon es 0-tol kezdve negat v irnyba haladjunk kett hatvnyaival. Vagyis a ki r si kp legyen: 2^0 = 1 2^-1 = 0.5 ... (Ugye emlkszel: valaminek a negat v hatvnya megegyezik a pozit v hatvny reciprokval. Vagyis: 24 = 1/24 ). Ha programunkat lelkesen megmdostannk gy, hogy az sszes n = n + 1-et n = n - 1-re s az sszes x = x * 2-t x = x / 2-re cserlnnk, szomor nyomtatsi kp fogadna. 2^0 = 1 2^-1 = 0 2^-2 = 0 ... ami egyrtelmen helytelen. A baj okra magad is rjhetsz: egsz szmok osztsa sorn elvesznek a trtrszek s a 1/2 oszts 0.5 eredmnye mint 0 troldik vissza x-be. Egszekkel ezt a problmt nem tudod megoldani, szksgnk lesz a Jva egy msik alaptpusra, a lebegpontos tpusra. A lebegpontos vltozt gy deklarlod: double pi; double z0,z1; s gy adhatsz neki rtket: pi = 3.1415927; A lebegpontos szm mr elg nagy ahhoz, hogy nagyobb szmokat rjl le vele, mint amit knyelmesen be tudsz cspelni egy sorba, ezrt jl jhet a tudomnyos szmbrzols. Ha emlkszel, ekkor a szmot egy 0-10 kztti szm s egy 10 hatvny szorzataknt rjuk le. Pl: 2500 = 2.5*1000 = 2.5*103. Jvban ezt gy kell lerni: 2.5E3. Teht: z0 = 2.5e3; Persze ha nem akarod ezt a kis szmot exponencilis brzolsban lerni, nem kell. z1 = 2500; A double-ban lerhat maximlis szm kb. 10308 , a legkisebb 10-308, ugyanez persze negat v irnyban is. Ekkora szmokkal a gp persze jval lassabban szmol, mint egszekkel, gy double-t csak akkor hasznljunk, ha szksges.

Feladat
rjuk meg most az elz, balsiker feladvnyunkat a kett negat v hatvnyaival gy, hogy x-et egsz helyett double-nak deklarljuk. Prbld meg magad megrni, majd ellenrizd a megoldst . Ennyit els kzeltsben a szmokrl s a velk val mveletekrl. A Jva persze jval tbb adattpussal s mvelettel rendelkezik, mint amit eddig lttunk, de a kvetkez rszben inkbb a program vgrehajtst befolysol szerkezetekkel foglalkozunk.

Ellenrz krdsek
I. II. III. IV. V. VI. VII. VIII. IX. X. XI. XII. XIII. XIV. Mi az sszefggs a vltoz neve s rtke kztt? Hogy jn a fikos szekrny a szmtgphez? Mit jelent, hogy egy vltozt deklarlni kell? Hol kell lennie egy vltoz deklarcijnak? Hogyan kell lerni egy egsz tpus vltoz deklarcijt? Mi a legnagyobb s legkisebb rtk, amit egy egsz tpus vltozban trolhatunk? Mi a klnbsg a Jva rtkad utastsa s a matematikai egyenlsg kztt? Mi az algoritmus?

Hogyan kell a zrjeleket elhelyezni a 5+6*3 kifejezsben, hogy a kifejezs rtke 33 legyen? s ha 23-at akarunk? Mi a lebegpontos tpus? Mekkora a legnagyobb s legkisebb szm, ami a lebegpontos tpussal lerhat? Mi az exponencilis szmbrzols? Mennyi 2.001e3? rd le 0.12-t exponencilis brzolsban!

3. fejezet
Terelgetjk a szmtgpet; a program futsnak menete. Struktrlt programozs, ptkezs Matrjoska babkbl. Elgazsok s logikai kifejezsek. Megdolgoztatjuk a gpet: a ciklusok. A szmtgp, mint mondtam, akr szzmilli vagy jabban akr egymillird utastst is kpes vgrehajtani msodpercenknt. A Jva ugyan nagyban lasst rajta, azonban egy modern szmtgp mg a Jva bjtkdot is jcskn msodpercenknt t zmilli utasts felett hajtja vgre. Ekkora

sebessggel szguld vonatot terelgetni kell, nehogy valami falnak tkzzn. Ezt a feladatot ltjk el a programvezrl utastsok. A programvezrl utastsokkal felttellel vagy felttel nlkl a program egy msik pontjra adhatjuk a vezrlst; a felttel valamilyen kifejezs kirtkelsbl addik. Klasszikusan ezt a C vagy a BASIC goto utastsval egyszer bemutatni, ez az utasts egy paramtert kap, amely paramter egy helyet hatroz meg a programban (egy sorszmot vagy egy c mkt pdul). Amikor a goto vgrehajtdik, a program futsa a paramter ltal meghatrozott helyen folytatdik. Jvban nincsen goto s ez egy valls elterjedsnek ksznhet. A strukturlt programozs papjai a 70-es vek elejn kezdtk terjeszteni, hogy nem szp dolog a programot teleszrni goto-val, mert a vgrehajts nagyban kvethetetlen lesz. Ez gy is van. Az egyedl dvzt megolds a valls h vei szerint az egymst teljesen magba foglal, struktrlt programblokkok rendszere. Egy ilyen programblokk egy vagy tbb (vagy sok) Jva utastst foglal magba s ksbb fogjuk megltni, mit lehet velk csinlni. Elzetesknt: feltteltl fggen vgre lehet hajtani a blokkot (vagyis a benne lev utastsokat), ismtelni lehet a blokkot, egy feltteltl fggen jra vgre lehet hajtani, stb. Akrhogy is, struktrlt a program attl lesz, hogy a blokkok hatrai nem keresztezik egymst, a fentebb lev blokk teljesen magban foglalja a benne lev blokkot vagy blokkokat. A Jvban a programblokkot egy { jel vezeti be s egy } jel zrja. Megjegyzend, hogy egy utasts nmagban blokkot kpez, teht ha a kapcsos zrjelek elmaradnak, a blokk csupn egy utastsbl ll. Termszetesen nem hiba egy utastst kapcsos zrjelek kz fogni, csak nem szksges. Legegyszerbb ezt egy pldval megvilgtani! Az if utastsnak van egy paramtere. A paramter kirtkelstl fggen a mgtte lev blokkot vgrehajtja vagy sem. Plda: if( x < 0 ) { System.out.println( "x kisebb volt, mint 0!" ); } Minthogy a blokk csak egy utastsbl ll, a kapcsos zrjelek elhagyhatk. if( x < 0 ) System.out.println( "x kisebb volt, mint 0!" ); A paramter egy j tpus, logikai kifejezs. Ha sszeadunk kt egsz szmot, az eredmny egy jabb egsz lesz. Ha sszehasonltasz kt szmot, az eredmny logikai rtk lesz. Ez egy teljesen szoksos adattpus, a neve boolean s sszesen kt rtke lehet, true s false. Mondhatod teht ezt: boolean f; f = true; St mondhatod ezt: int x,y; boolean f; x = 0; y = 1; f = x < y;

A logikai kifejezsek s opertorok teht pont gy viselkednek mint brmilyen kifejezs s rtkl is adhatk logikai tpus vltozknak. A kvetkez logikai mveletek vannak kt egsz vagy lebegpontos kifejezs kztt. x < y : true az eredmny, ha x kisebb, mint y, klnben false x > y : true az eredmny, ha x nagyobb, mint y, klnben false x == y : true az eredmny, ha x egyenl y-nal x != y : true az eredmny, ha x nem egyenl y-nal x <= y : true ha x kisebb vagy egyenl y-nal x >= y : true, ha x nagyobb vagy egyenl y-nal

Vannak opertorok, amik mr eleve logikai rtkeken dolgoznak. Ezek: x && y : true akkor s csak akkor ha x true s y is true x || y : true akkor, ha x vagy y kzl valamelyik, esetleg mindkett true !x : true, ha x false s viszont. Nzznk akkor egy jpofa logikai kifejezst felttelezve, hogy van x s y egsz tpus vltoznk: ( ( x > -5 ) && ( x < 5 ) ) || ( ( y > -10 ) && ( y < 10 ) ) Ez a kifejezs akkor ad true rtket, ha x -5 s 5 kz esik vagy y 10 s -10 kz esik, esetleg mindkett igaz. De trjnk vissza oda, ahonnan elindultunk, az if-hez. Az if els paramtere egy logikai kifejezs, msodik egy programblokk, amit a kifejezs rtktl fggen vgre kell hajtani vagy tugrani. Lssunk egy praktikus pldt s rjunk egy programot, ami kirja, ha a program paramtere negatv. Ilyet mg nem lttunk s most nem is fogok belemenni a rszletes magyarzatba, legyen elg annyi, hogy t lehet venni a paramtereket, amivel a programot a parancssorban elindtottk.
public class Negativ { public void prog( String args[] ) { int x; try { x = Integer.parseInt( args[0] ); } catch( NumberFormatException ex ) { System.out.println( args[0]+" nem kiertekelheto" ); return; } if( x < 0 ) { System.out.println( x+" negativ" ); } } public static void main( String args[] ) { Negativ e = new Negativ(); e.prog( args ); } }

Ezt a programot, mint rtam, parancssori paramterrel kell futtatni, klnben hibazenetet kapsz (prbld ki!). Prbld ki tovbb klnbz paramterekkel.

java Negativ 5 java Negativ -10 java Negativ 0 java Negativ -29.34 java Negativ 2.3e12 Az utols kt paramter hatsra hibazenetet kapunk. Ennek oka, hogy a szmot egszknt rtkeltk ki s a kt utols paramterrel ezt nem lehet megtenni. Programunknak van egy bartsgtalan vonsa: ha pozit v szmot vagy 0-t kap, nem r ki semmit. Szntessk ezt meg! Megoldhatnnk a feladatot gy, hogy a kt ki r st kt if-hez ktnnk pl. gy: if( x < 0 ) { System.out.println( "Negativ" ); } if( x >= 0 ) { System.out.println( "Pozitiv vagy 0" ); } Nem szp, ugye? Nehz is karbantartani, ha netn megvltoztatnnk a felttelt, a msikat sem szabad elfelejtennk megvltoztatni. Sokkal szebben megoldhat a feladat az if-hez opcionlisan kapcsolhat else-g segtsgvel. Ha az if utastsnak van else ga, az else mgtt lev blokk akkor hajtdik vgre, ha az if felttele hamis volt. Lssuk az elz pldt! if( x < 0 ) { System.out.println( "Negativ" ); } else { System.out.println( "Pozitiv vagy 0" ); }

Feladat
rj egy olyan programot, ami egsz paramterrl kirja, pozitv, negatv, vagy nulla-e. Itt a megolds ellenrzskppen. Ha emlkszel a 2. fejezetre, volt ott egy olyan feladatunk, ahol 2 els 8 hatvnyt rattuk ki. Most mi lenne, ha az els 16 hatvnyra volnnk kivncsiak? Abban a pldaprogramban egy jabb hatvnyhoz egyszeren megismteltk a szksges sorokat. Ha a szmtgpet el tudjuk terelni az egyenes vonal vgrehajtstl, akkor megsprolhatunk j sok gpelst, ha megismteltetjk vele a programblokkot. Ezt Jvban is meg tudjuk csinlni a while utasts segtsgvel. A while paramtere egy logikai kifejezs s ha ez a kifejezs igaz, a while vgrehajtja a mgtte lev programblokkot. Ezek utn a gp jra kirtkeli a kifejezst, jra vgrehajtja a blokkot s ez gy megy addig, amg a felttel hamiss nem vlik. Ha a felttel mr a legels vgrehajtsnl hamis volt, a programblokk egyszer sem hajtdik vgre. A felttel vizsglata teht a programblokk - a ciklusmag - eltt van, ezrt ezt a ciklust elltesztelnek h vjuk. A kvetkez kis pldaprogram kirja a szmokat 1-tl 20ig. int n; n = 1;

while( n <= 20 ) { System.out.println( n ); n = n+ 1; }

Feladat
Csinlj a fenti kis programrszletbl vgrehajthat programot, teht tedd kr mindazt, amitl Jva programm vlik. Ellenrizd a megoldst itt.

Feladat
Most csinld meg azt a programot, ami 2 els 16 hatvnyt. Hasznld fel a 2. fejezet programjt, ami az els 8 hatvnyt rta ki a szmt rutin ismtelgetsvel s szervezd ciklusba, amit akkor egyszer kdismtlssel oldottunk meg. A megoldst itt ellenrizheted. A ciklusok remek dolgok, egy rendes program tartalmaz bellk jcskn. A while ciklusokkal minden feladat megoldhat, de nem mindig ll kzre. A while-nak mindenekeltt van egy htultesztel vltozata, a do-while. Ez ugyanazt tudja, mint a while, azzal a klnbsggel, hogy az ellenrzs a ciklus vgn trtnik, teht a ciklusmag egyszer mindenkppen vgrehajtdik. Plda: int n; n = 1; do { System.out.println( n ); n = n+1; } while( n <= 20 ); A msik fontos szerkezet a fentiekben bemutatott szerkezet zanzstott vltozata, amivel sok r smunka megsprolhat. A for ciklus magba foglalja a ciklusvltoz inicializlst, a ciklusfelttel ellenrzst (elltesztel formban) s a ciklusvltoz megvltoztatst. Az ltalnos forma a kvetkez: for( ciklusvltoz inicializls ; felttel ellenrzs ; ciklusvltoz mdosts ) ciklusmag Elz szmols pldnkat a kvetkezkppen tudod for ciklusba trni. int n; for( n = 0 ; n <= 20 ; n = n + 1 ) System.out.println( n ); Fontos megjegyezni, hogy a for fejnek mindhrom rsze opcionlis, ha elmarad, akkor a ciklusutasts maga nem vgzi el az adott mveletet. Ez lehetv teszi szmunkra, hogy pl. a ciklusvltoz nvelst a ciklus belsejben hajtsuk vgre, ha az olyan bonyolult, hogy egy utastsban nehz lerni. Ad abszurdum a kvetkez program rtelmes: for( ; ; ) System.out.println( "Hello!" );

Ez a programrsz vgtelen ciklusban fogja az zenetet kirni. Nincs inicializls s nincs ciklusvltoznvels valamint a ciklusfelttel elmaradsa azt jelenti, hogy a felttelt nem kell ellenrizni, hanem felttel nlkl folytatni a ciklust.

Feladat
Elz feladatunkat a 2 els 16 hatvnyrl rd t for ciklusos vltozatba! Ha megrtad s mkdik, ellenrizd a megoldst itt!

Feladat
rj egy programot, ami kinyomtatja a kisegyszeregyet! Hasznld fel a System.out.println rokont, a System.out.print-et, ami nem tesz soremelst a kinyomtatott sor vgre, gy tbb eredmnyt nyomtathatsz egy sorba. A szorztbla kinyomtatshoz hasznlj kt for hurkot egyms hasban, a bels hurok nyomtat egy sort, a kls ciklus ismtelgeti a sornyomtat ciklust. Kzdj meg a programmal, majd ellenrizd az eredmnyt! Figyeld meg, a kls ciklus magjt kapcsos zrjelek fogjk kzre, mert az kt utastsbl ll, a bels for-bl s az res szveget (plusz egy soremelst) nyomtat System.out.println-bl. A bels ciklus magja csak egy utastst, a System.out.print-et tartalmaz, gy ott a kapcsos zrjelek nem szksgesek (br ottltk nem lenne hiba). Figyeld meg a struktrlt programozst: a kls ciklus teljesen magba foglalja a belst!

Ellenrz krdsek
I. II. III. IV. V. VI. VII. VIII. IX. X. XI. XII. XIII. XIV. Mit jelent a programblokk? Mit jelent, hogy a programblokkok struktrltak? Hogyan kell egy programblokkot lerni Jvban? Programblokkot alkothat-e egy Jva utasts? Mit jelent a logikai kifejezs? Hogyan kell logikai tpus vltozkat deklarlni? Mit csinl az != opertor? Mit csinl a || opertor? Mi az if utasts Mit jelent, ha az if utastsnak else ga van? Mi a while utasts? Mi a ciklusmag? Mit jelent, hogy a while elltesztel ciklus? Hogyan lehet htultesztel while ciklust rni?

XV. XVI.

Mi a for ciklus? Ell- vagy htultesztel a for ciklus?

XVII. Mit jelent az egymsba gyazott ciklus?

4. fejezet
Megjegyzsek. rni utlunk, ezrt treksznk az jra felhasznlhat programrszekre. Fggvnyek a matematikban s Jvban. Paramterek, visszatrsi rtkek s vltoz lthatsgi szablyok. Programjaink most mr kezdenek kellen bonyolultak lenni ahhoz, hogy magyarzat nlkl ne rtsk ket. Minden programozsi nyelv, kztk a Jva is lehetsget ad arra, hogy ember szmra rtelmes magyarz szvegeket, megjegyzseket tegynk a kdba. A megjegyzseket a szmtgp egyszeren figyelmen k vl hagyja, semmilyen hatsa nincsen a program mkdsre. Nem is neki szlnak, hanem a program olvasjnak. Jvban ktfajta megjegyzs van. Az egyik /* karakterekkel kezddik s a legkzelebbi */ karakterekig tart, a programban brhol llhat, tbb soros is lehet. Pl.
/* Itt egy megjegyzs */ i = 1; /* A sor vgn egy megjegyzs */ /* Hossz, tbb sort tfog megjegyzs */ i /* a vltoz, amit hasznlunk */ = /* rtkad utasts */ 2 /* 2 egy j rtk */;

Az utols varicit nem kell kvetend pldnak tekintened, csak azt akartam vele megmutatni, hogy ez a fajta megjegyzs tnyleg mindenhol lehet. A msikfajta megjegyzst // jelek vezetik be s a sor vgig tart. Kevesebbet kell rni vele, rvid megjegyzseknl ezrt szeretik. Pldk:
// Egy rvid kis megjegyzs i = 3; // Vgl is igazban 3-at szeretnnk i-be // Ha hossz megjegyzst akarunk, // Minden sor elejre kell a // // jel.

Feladat
rjunk egy programot, ami kirja az y=x2 fggvny rtkeit x=(-1,1) intervallumban, 0.1-es lpsenknt. Megjegyzsekkel tedd vilgosabb, mikor mi trtnik! A feladat nem okozhat nehzsget, azrt a biztonsg kedvrt ellenrizd a megoldst!

A megoldsban felhasznltunk egy jdonsgot, a += opertort. Ez az opertor hozzadja a bal oldaln lev vltozhoz a jobb oldaln lev rtket, teht kiveszi a vltoz rtkt, hozzadja az opertor jobb oldaln lev kifejezs rtkt s visszatrolja a vltozba.
x += 0.1;

teht egyenrtk
x = x + 0.1;

kifejezssel. A ki r sban furcsa eredmnyeket tallhattl, pl. me egy rszlet:


... -0.20000000000000015^2=0.04000000000000006 -0.10000000000000014^2=0.01000000000000003 -1.3877787807814457E-16^2=1.9259299443872359E-32 0.09999999999999987^2=0.009999999999999974 ...

Nagyjbl stimmel, de mik ezek a furcsa rtkek a vgn? s plne, mirt nem kapunk 0-t (habr 1016 elg kzel van hozz ...)? Tudnod kell, hogy a szmtgp szmra csak az egsz, int rtkek pontosak. Mivel a gp msknt trolja a szmokat, mint az ember, nem biztos, hogy az olyan szp, kerek rtkek, mint a 0.1 a gp szmra is ugyanolyan szpek. A 0.1 pont egy olyan szm, amit a gp nem tud teljesen pontosan brzolni, ezrt az sszeadsok sorn apr hibk halmozdnak fel. ppen ez okbl a lebegpontos szmokat sose vizsgljuk egyenlsgre, mert knnyen lehet, hogy az egyenlsg sohase teljesl. Esetnkben pldul x sohase lesz pontosan 0 vagy 1, ezrt a furcsa hatrrtksszehasonlts a for ciklusban. Hadd ismteljem meg, hogy ez a problma csak a lebegpontos szmoknl lphet fel, egszeknl soha, ez egy jabb ok arra, hogy mindenhol egszeket hasznljunk, ahol csak lehet. Akrhogy is, nem erre akartam kilyukadni. Maga a kiszmtand fggvny a program kzepben van, ha cserlni akarnnk, ki kellene keresnnk a programszvegbl. Rosszabb, ha a fggvny netn bonyolultabb lenne s nem lehetne egy sorban kiszmolni, netn esetleg bels vltozkat hasznlna, a kiszmtand fggvny kdja teljesen sszekeveredne a tblzatnyomtat program kdjval. Ezen okbl a Jva rendelkezsnkre bocstja a sajt fggvnyek definilsnak lehetsgt. Igazbl mr van kt sajt fggvnynk, de azok vadt kk sznben tndkltek. Lssuk elz programunk mdostst olymdon, hogy az y = x2 szmtst vgz rszt kiemeljk sajt fggvnybe!
public class x2ertek_2 { double fuggveny( double xi ) { double yi; yi = xi * xi; return yi; } public void prog( String args[] ) { double x; for( x = -1 ; x < 1.001 ; x += 0.1 ) { System.out.println( x+"^2="+fuggveny( x )); } }

public static void main( String args[] ) { x2ertek_2 e = new x2ertek_2(); e.prog( args ); } }

Ha a programot lefuttatjuk, persze ugyanazt az eredmnyt kapjuk, mint az elz pldban. Mik akkor a vltozsok? Vegyk mindenekeltt szre a kk sorok drasztikus megfogyatkozst! Vegyk tovbb szre, hogy a tblzatnyomtat ciklusunkban knnyed elegancival kijelentettk, hogy fuggveny( x ) ltal visszaadott rtket is ki akarjuk rni. Ez egy fggvnyhvs.A fggvnyh vs sorn a szmtgp egy alprogram vgrehajtsval folytatja munkjt. Az alprogramot valahol lezrjk egy visszatr utastssal s megmondjk, mi az rtk, amit az alprogram visszaad. Ekkor a szmtgp elkeresi, hol hagyta abba a fprogram vgrehajtst s a fggvnyh vst helyettesti azzal az rtkkel, amit az alprogram visszaadott. A fggvny teht brmilyen kifejezsben llhat, ahol a fggvny visszatrsi rtknek tpusa megegyezik az adott kifejezsben vrt adattpussal. Pldul ha van egy fggvnynk, ami double-t ad vissza, akkor az felhasznlhat double szmokkal dolgoz kifejezsben. double fuggv() { ... } ... double x; x = 3.14*fuggv()+2.5; Maga a fggvny deklarcija brhol lehet a programban, a fggvnyh vs eltt s utn is. Tilos azonban ugyanazt a fggvnyt ktszer deklarlni ugyanazzal az alrssal vagyis ugyanazzal a nvvel, visszatrsi rtkkel s paramterlistval. Azonos nev, de klnbz al r s fggvnyek (teht pldul ahol az egyiknek nincs paramtere, a msiknak pedig van) klnbznek szmtanak, mert a Jva a fggvnyh vs alapjn rjn, hogy melyik fggvnyt kell megh vnia. Plda:
// Els fggvny int fuggv() { ... } // Msodik fggvny int fuggv( int i ) { ... } int i = fuggv(); int k = fuggv( 2 ); // Ez az els fggvnyt hvja meg // Ez a msodik fggvnyt hvja meg

A fggvnynek lehet egy specilis visszatrsi rtke, a void. Ez azt jelenti, hogy a fggvny nem ad vissza rtket, az ilyen fggvnyt nem lehet kifejezsben felhasznlni, de kifejezsen k vl meg lehet h vni. Pont ezen a mdon kell alprogramokat, procedurkat definilni. void fuggv2() { ...

} ... fuggv2(); A fggvnyeknek lehetnek bemeneti paramtereik is. Ezek azok az rtkek, amelyeket tadunk az alprogramnak, hogy szmoljon belle kimeneti rtket. A bemeneti paramtereket a fggvnyfejben soroljuk fel. double fuggv3( double elso_param, int masodik_param ) { double eredm; ... return eredm; } ... double eredm; eredm = fuggv3( 3.14, 4 ); Amikor a fggvnyt megh vod, bonyolult dolgok jtszdnak le. I. II. Kirtkeldnek a fggvny megh vsakor a fggvnynek tadott kifejezsek j kontextus jn ltre a vltozknak, az eddigi hasznlt vltozkat nem lehet tbbet elrni. Ezt ksbb majd pontostjuk (vannak olyan vltozk, amelyek tllik a fggvnyh vst), de most jegyezzk meg inkbb gy, hogy az eddig deklarlt vltozk a fggvny futsa alatt nem ltszanak. Megmaradnak, nem vesznek el, de a fggvny nem ltja ket, mert ket egy msik kontextusban deklarltk. A fggvnynek tadott paramterek megfelel sorrendben hozzrendeldnek a bemeneti paramterekhez. Valjban az trtnik, hogy a bemeneti paramterek mint vltozk ltrejnnek a fggvny sajt kontextusban s kezdrtkl megkapjk a h vsi rtkeket. A pldnkban teht az elso_param nev vltoz rtke 3.14 lesz, a masodik_param- pedig 4. A fggvny futni kezd s gy viselkedik, mint brmely Jva program - teheti, mert valjban is teljes jog program, aminek sajt krnyezete van. Sajt vltozkat deklarlhat, ms fggvnyeket s procedrkat h vhat meg. eljn egyszer az igazsg pillanata s mde befejezi a futst. Ez ktflekppen trtnhet. Elszr is elrhet egy return utastst. A return mgtt a fggvny visszatrsi rtknek megfelel tpus kifejezs vagy - void visszatrsi rtk esetn - semmi sem tallhat. A return hatsra a fggvny befejezi a futst s visszatrnk a fprogramba. Msodik lehetsg csak s kizrlag void visszatrsi rtk fggvnyeknl fordulhat el: ilyenkor egyszeren elrhetjk a fggvnyt lezr kapcsos zrjelt s ezt a gp magtl, mint egy res return; utastst rtelmezi. Ha a fggvny futsa befejezdik, a visszatrsi rtket a gp biztos helyre menti, majd egsz egyszeren felszmolja az sszes vltozt, amit a fggvny kontextusban deklarltak, ezek trldnek s rkre elvesznek. A fggvnyt h v program kontextusa visszalltdik, vltozi lthatv vlnak.

III.

IV.

V.

VI.

VII. A gp most elveszi a biztos helyrl a fggvny visszatrsi rtkt s mintha mi sem trtnt volna, folytatja a kifejezs kirtkelst, amiben a fggvnyh vs volt. Az egsz fggvnyh vs egy darab szmm, a fggvny visszatrsi rtkv zsugorodott ssze s ezzel a szmmal helyettestdik. Hasonlatos ez ahhoz, mint amikor a cikkedhez ki akarsz szmolni egy rtket, de csak a szm rdekel. Nhny sajtpapron elkszted a szmtsokat, a szmot berod a cikkbe, majd a sajtparokat eldobod. gy mkdik a fggvny is, a rszeredmnyek rdektelenek a fggvny lefutsa utn s ami mg fontosabb, a fggvny bels gyei nem zavarjk a program futst. A fggvnybl termszetesen jabb fggvnyt is megh vhatsz s a h vsra ugyanazok a szablyok vonatkoznak. Ezt nem csinlhatod a vgtelensgig, valamekkora korlta van annak, milyen mlysgben hivogathatjk a fggvnyek egymst, de ez sok ezres mlysg. Lssuk, megrtetted-e!

Feladat
Olvasd el az itt lthat programot s mondd meg nekem, mi a nyomtatsi kp! Utna prbld is ki s talld ki az okt, ha netn tvedtl volna. Segtsg: nzd meg, melyik fggvnyh vs melyik fuggv fggvnyt h vja meg. Ahol a fggvnyh vsban paramtert adunk t, ott a paramterrel rendelkez fuggv fut, ahol nem, ott a paramter nlkli. A megjegyzsek hasznlata persze magngy, de taln a fenti plda is demonstrlja, hogy legalbb a fggvnyek fejt (teht a deklarcijnak az elejt, a visszatrsi rtknek, nevnek s paramtereinek megadst) mindenkppen ajnlott megjegyzssel elltni, milyen paramtert vr a fggvny, azokkal mit csinl s mit ad vissza.

Feladat
Bergengciban az adrendszert lnyegesen leegyszerstettk s a Totlis Adtbla XXVIII. lapja a kvetkezkppen nz ki: -100 fbtk* a jvedelem 9%-a 100-250 9+a 100 fbtk fltti rsz 13%-a 250-750 30+a 250 fbtk fltti rsz 25%-a 750180+a 750 fbtk fltti rsz 50%-a
*

- fbtk: konvertibilis fabatka, ves szinten

Az utols pillanatban a Tntet Bergengc Anyk Antidemokratikus Szvetsgnek sikerlt keresztlvinnie kvetelseit s a csaldosokoknak kedvez intzkedsekkel egyszerstettk a tblt. Ezek szerint a 1 gyerek nevelse esetn az ad 2%-t, kett esetn 8%-t, 3 s a felett gyerekenknt 4%-t, de legfeljebb 25%-ot engednek el. rjunk most egy programot, amit megh vhatunk az ves jvedelemmel s a gyerekek szmval s az megmondja az adnkat! Emlkezznk a 3. lecke Negativ programjra, hogyan rtkeltk ki ott a paramtereket! Lebegpontos szmot mg nem rtkeltnk ki, ezrt leshetsz egy kicsit a megoldsban. A programunkban igyekezznk olyan fggvnyt rni, ami a leginkbb lervidti a programot! me a megolds, de csak a paramterek kirtkelst lesheted ki belle, a tbbit neked kell megoldanod!

Ellenrz krdsek
I. II. III. IV. V. VI. VII. VIII. IX. Mire szolglnak a megjegyzsek a programban? Mi a klnbsg a /* */ s a // megjegyzsszintaktika kztt? Mirt nem vizsgljuk a lebegpontos szmokat egyenlsgre? Mi a fggvny al r sa? Mi a void tpus? Mik jtszdnak le egy fggvnyh vskor? Hogyan adja vissza a fggvny a visszatrsi rtkt? Mi trtnik a fggvny ltal deklarlt vltozkkal?

Mi trtnik, ha a h v fggvny s a h vott fggvny megegyez nev vltozkat hasznl? Milyen mlysgben h vhatjk fggvnyek egymst?

5. fejezet
Matematikai fggvnyek, a Jva matematikai fggvnyei s azok hasznlata.Egyszer matematikai problmk programnyelvi megoldsai. Feladatok a fggvnyek hasznlatra. Mint mr emltettk, a szmtgp msodpercenknt tbb millird gpi szint mvelet elvgzsre kpes, mg fggvnyhvsokbl is kpes tbb tzezer elvgzsre. Megfogalmazdik bennnk a krds, hogy miknt is lehetne ezt sszeren hasznlni olyan problmk megoldsra, amelyek a mindennapi letben is elfordulhatnak. A szmtgp igazi ereje akkor mutatkozik meg, ha olyan algoritmus (elemi lpsek vges szm, jl meghatrozott sorozata) vgrehajtsra utastjuk, mely neknk hosszas papron trtn szmolst ignyelne. A ngy alapmveletet kiterjesztend, ismerkedjnk meg a hatvnyozs, gykvons, az exponencilis s trigonometrikusfggvnyek Java nyelvi megfelelivel. A kvetkez program segtsgvel hatvnyozst s gykvonst vgezhetnk, melyek a java.lang csomag Math osztlyban tallhatk. A hatvnyozs fggvnye: A ngyzetgykvons: Nzzk a programot! Math1
public class math1 { public double Hatvany(double x, double n){ return Math.pow(x,n); //A beptett hatvnyfv. Meghvsa }

double pow(double alap, double kitevo) double sqrt(double alap)

public double Negyzetgyok(double y){ return Math.sqrt(y); //A beptett gykfv. meghvsa } public void prog( String args[] ) { System.out.println("Plda a hatvnyozs s gykvonshasznlatra:"); double alap, kitevo; //Vltozt deklarlhatunk itt is /* A fprogram els kt paramtere lesz a hatvnyfggvnyben az alap s a kitevrtke. A 3.-nak megadott paramtert pedig a gykfggvny kapja rtkl.*/ alap=Double.parseDouble(args[0]); kitevo=Double.parseDouble(args[1]); /* A hatvnyfv double rtkeket vr, amit az rtkadsnl gy kzlnk. */ System.out.println(args[0]+"^"+args[1]+"="+Math.round(Hatvany(alap, kitevo))); //Math.round: a double rtket egsz szmknt ratjuk ki. int gyokalap; gyokalap=Integer.parseInt(args[2]); System.out.println(args[2]+"Negyzetgyoke="+Negyzetgyok(gyokalap ) ); } public static void main( String args[] ) { math1 e = new math1(); e.prog( args ); } }

Megjegyzsek: I. II. A Hatvany s a Negyzetgyok fggvnyek double paramtereket fogadnaks adnak is vissza, a fggvnytrzsben megh vjk a Math osztly megfelel (pow s sqrt) fggvnyeit. Az ltalnosts kedvrt az args[] segtsgvel tltjk fel fggvnyeinket paramterekkel. gy minden futtatskor vltoztathatjuk a bemeneti paramterek rtkeit.Az args[] hasznlatt szintn egy ksbbi fejezetben magyarzzuk rszletesen, legyen elg annyi, hogy a programnak a parancssorban megadott 1.,2.,3. stb. paramter rendre az args[0],args[1], args[2] vltozk troljk. Az alap skitevo double tpus vltozkrendre a fprogram els kt paramtert kapjk.Ahhoz, hogy a program az ltalunk megadott rtkeket double-knt kezelje, Double.parseDouble() fggvnyt hasznljuk. Hasonlkppen, a gyokalap vltoz a harmadik fprogram paramter lesz, integer-knt rtelmezve. A hatvnyfggvny double rtketad vissza, amit a Math.round() fggvnnyel als egszrtket kapunk vissza.

III.

IV.

Fordts utn a futtatshoz adjuk ki az albbi parancsot: java math1 1.5 2 8 A futs eredmnye:

Plda a hatvnyozs s gykvons hasznlatra: 1.5^2=2 8 Ngyzetgyke=2.8284271247461903 A hatvnyozsnl lthatjuk, hogy a 2.25 helyett a kerektett rtket kapjuk, mg a 8 ngyzetgykt double alakban, 16 tizedesjegy pontossggal. Az albbitblzatban foglaljuk ssze a Math osztly legfontosabb fggvnyeit: Visszatrsi rtk tpusa Double Double Double Double Fggvnyfej Funkci

abs(double a) cos/sin/tan/asin/acos/atan(double) Exp/log(double) toDegrees/toRadians(double)

Abszolt rtk fv * Trigonometrikus fvek s inverzeik s ln(x) Radin rtk fok-ba vltsa s fordtva

A trigonometrikus fggvnyek hasznlathoz szksgnk lehet a matematika kzpiskolbl jl ismert kt nevezetes konstansra: e-re s pi-re. Ezeket a Math osztly specilis vltoziknt kell kezelnnk, matematikai szempontbl az y=e s y=pi konstansfggvnyek felelnek meg:
public static final double PI public static final double E

Arra, hogy ezek konstans rtk vltozk, arra a final jelz utal (rtkk nem vltozik). Hasznlatuk a program szvegben: Math.PI illetve Math.E hivatkozssal trtnik, vagyis meg kellmondanunk expliciten, hogy a Math osztly konstans rtkvltozirl van sz.

1. Feladat
Egyszer gyakorlatknt rjuk t a kr kerletnek s terletnek kiszmtst elvgz programunkat a Math.PI hasznlatval! Az egyszerstett megoldst itt ellenrizheted.

2. Feladat
Ksztsnk fggvnytblzatot, mely kirja a nevezetesebb hegyesszgek (0, 30, 45, 60, 90) sin, cos,tan, ctg rtkeit! A megoldst itt ellenrizd.

3. Feladat
Ksztsnk programot, mely megoldja a msodfok egyenletet, a megoldhatsg teljes vizsglatval. A fprogram 3 bemeneti paramtere az megoldst itt tallhatod. msodfok egyenlet a, b , c paramtere. A

A Math fggvnyek kzt tallhatunk egy vletlen szmokat generl fggvnyt is:
double random ()

A fggvny al r sbl lthatjuk.hogy paramter nlkli s double rtket advissza, mgpedig egy 0<=x<1 pszeudo-vletlenszmot generl. (A pszeudo jelzs arra utal, hogy nem kaphatunk tkletes vletlenszersget,hiszen a generlt szm valamilyen mdon fgg a pocesszorrajeltl.) A fggvny hasznlata elg egyszer: ha az [a;b] intervallumba es vletlen szmokat szeretnnk generlni, akkor nem kell mst tennnk, mint venni az a+(b-a+1)*Math.random() kifejezst.

4. Feladat
Ksztsnk 5-s s 6-os lott programot a Math osztly vletlenszm genertornak segtsgvel! Elszr rjuk meg gy, hogy ne legyen benne ellenrzs, nem fordul-e el ktszer ugyanaz a lottszm. A megoldst itt ellenrizheted! Ezek utn oldjuk meg, hogy a szmok garantltan klnbzek legyenek. Itt a megolds ellenrzskppen.

5. Feladat*
Ksztsnk tot programot a Math osztly vletlenszm genertornak segtsgvel! A program elksztshez ismerjk meg s hasznljuk a % opertort! A % ugyangy mkdik, mint az oszts (/), de a hnyados helyett a maradkot eredm nyezi. Egszre s lebegpontos szmra is hasznlhat. A megoldst itt ellenrizheted!

6. Feladat*
rjunk programot, mely az Euklidszi algoritmus segtsgvel keresi meg meg kt egsz szm legnagyobb kzs osztjt! me egy plda, hogyan mkdik az algoritmus. Keressk 60 s 22 legnagyobb kzs osztjt.
60 22 16 6 4 = = = = = 2*22 1*16 2*6 1*4 2*2 + + + + + 16 6 4 2 0

2 a legnagyobb kzs oszt, mivel ez volt az utols nem 0 maradk. A megoldst itt ellenrizheted!

Ellenrz krdsek
I. II. III. IV. V. VI. VII. Mit neveznk "beptett" fggvnyknek? Hogyan tudunk a beptett fggvnyekre hivatkozni? Hogyan tudunk trigonometriai feladatokat Java program segtsgvel megoldani? Mit neveznk konstans rtk vltoznak? Mondj pldt konstans rtk Java vltozra! Mire kell vigyznunk a trigonometrikus Java fggvnyek bemeneti paramtereinek megadsnl? Hogyan tudunk java programjainkban kerektett rtkeket hasznlni? Milyen lehetsgeink vannak a Java-ban vletlen szmok generlsra?

6. fejezet
Tovbbi gyakorl feladatok matematikai problmk megoldsra. Cimke. Tbbszrs elgazs. Kilps programblokkbl: break. Kilps ciklusbl: continue. 2 ismeretlenes lineris egyenletrendszerek megoldsi mdszerei s azok JAVA nyelv megvalstsa. A mtrixelmlet elemei: mtrix, determinns. A 3- s tbbismeretlenes egyenletrendszerek megoldsi lehetsgei s JAVA nyelv megvalstsa. Brmely java utastst azonosthatunk gynevezett cmkkkel. Szerkezete: cimke: utasts Egyszer plda egy ciklusbl val kilps val kilps:
kulso: for (int j=100; j>=10;j--){ for (int i=0; i<10;i++){ Math.pow(2,i)*j; if (i>5) break kulso; } }

A fenti ciklus futsa megszakad abban az esetben, ha (i>5).Nzzk mi is trtnik! Elszr is elhelyeztnk egy cimkt a ks ciklusfej el, mely azonostja a ciklust.Ezutn a ks ciklust bizonyos felttel fennllsa esetn megszaktjuk, vagyis kilpnk belle. Ez azt jelenti, hogy a vezrls (vgrehajts) a kls ciklusmag utni, teht a ciklust kvet utastsra kerl. A break utasts, teht arra szolgl, hogy egy ciklust, illetve egy programblokkot elhagyhassunk vele. 2 fle hasznlata ltezik: break; - ekkor a vezrls a break-et tartalmaz utastsblokkbl kilp. break cimke; - ekkor pedig a cimkvel megjellt blokkot hagyjuk el. Ha a fenti pldban a break cimke nlkl llna, akkor csak a bels ciklusbl lpnnk ki. Jl jegyezzk meg, hogy a break utasts nem alkalmas fggvnybl (metdusbl - lsd ksbb) vagy inicializl blokkbl val kilpsre. A msik lehetsgnk egy ciklus norml menetnek megvltoztatsra a continue utasts. Amennyiben continue szerepel a ciklusmagban egy felttel utn, akkor a felttel teljeslse esetn a ciklusmagban lv tovbbi utastsok nem kerlnek vgrehajtsra, a vezrlsa ciklusfejre kerl. pp gy, mint a break esetben,a continue-val sem lehet fggvnybl vagy inicializl programblokkbl kilpni. Mit r ki a kpernyre az albbi programrszlet utols utastsa?
int s=0; for (int i=0;i<=20;i++) { if (i>=10)&&(i<=14)) continue; s=s+i; } System.out.println(s);

A continue hasznos lehet, ha meg szeretnnk k mlni magunkat attl, hogy bonyolult feltteleket rjunk a ciklusmagba.

Feladat
1. Ksztsnk programot, mely 1-100-ig kirja a 3-al, 5-el s 7-el nem oszthat szmokat. A ciklusmagban hasznljuk a continue utastst! Megolds itt. Aki megnzte a msodfok egyenlet megold programjnak megoldst, az valsz nleg bonyolultnak tallta a sok 'if'-es szerkezetet. Ennek orvoslsra a JAVA felk nlja a switch-case szerkezetet. Ezzel az utastssal tbszrs elgazst valsthatunk meg egy egsz rtk kifejezs rtkei szerint. Pldaknt tekintsk az albbi programrszletet:
void osztalyzat(int n){ switch (n){ case 1: System.out.println("Elegtelen"); break; case 2: System.out.println("Elegseges"); break; case 3: System.out.println("Kozepes"); break; case 4: System.out.println("Jo"); break; case 5: System.out.println("Jeles"); default: System.out.println("Gratullok!"); } }

Mi trtnik abban az esetben, ha n=5 s mi, ha n!=5? Amikor a case g vgn break szerepel, akkor a vezrls kilp a switch utastsbl; amennyiben nincs break, a vgrehajts a kvetkez cimkn folytatdik. A default (alaprtelmezett) g hasznlata opcionlis. Ily mdon, ha n=1, akkor a break miatt kilpnk a swith utastsbl, mg, n=5 esetn break hinyban a deafult g is vgrehajtdik, vagyis gratullunk a jeles osztlyzathoz. A teljes programot itt tallod.

Feladat
2. a) Ksztsnk programot, mely a fprogram paramterknt kapott 1..7 kztti egsz szm, mint sorszm fggvnyben kirja szvegesen a ht megfelel napjt! Megolds itt. b) Vegyk alapul a 2001. vet. Fejlesszk tovbb az elz programot gy, hogy a fprogram kt bemen paramtert, rendre a napot s hnapot, rtkelje ki s modja meg, hogy az gy megadott dtum a ht melyik napja. A megolds itt tallhat. Most ksztsnk egy j vltozatot, ami ugyancsak a 2001 vre rvnyes, egy hnapszmot vr paramterl s kinyomtatja az adott hnap naptrt csinos formban, ahogy a zsebnaptrokon megszokott. Ellenrizd a megoldst itt!

Egyenletrendszerek megoldsa
A lineris egyenletrendszerek elg fontos szerepet jtszanak a termszettudomnyokban, klnsen a matematika nhny terletn. Nem r t megismernnk nhny megoldsi mdszert, s persze ennek JAVA megvalstst is. Kzpiskolban tallkoztunk a 2 ismeretlenes lineris egyenletrendszerrel. I. a*x+b*y=p II. c*x+d*y=q ahol a,b,c,d, p, q az egyenlet (pldul vals) konstansai, m g x1, x2 vals vltozk, az egyenletrendszer ismeretlenei. Ennek megoldsa nem jelenthet tl nagy gondot, hiszen a vltoz helyettests mdszervel knnyen clt rnk. Kivlasztjuk az egyik egyenletet, az egyik ismeretlent kifejezzk, majd az gy kifejezett ismeretlent behelyettestjk a msik egyenletbe, mely gy mrcsak egy ismeretlent tartalmaz. Kiszmtva az ismeretlen konkrt rtkt, azt visszahelyettestve a msik, mr kifejezett ismeretlent tartalmaz egyenletbe, ksz vagyunk. Plda: Oldjuk meg a vals szmok halmazn az albbi egyenletrendszert! I. 4x-5y=22 II. 7x+2y=17 --------------II. y=(17-7x)/2 y-t I.-be: 4x-5*[(17-7x)/2]=22 I.. 4x-(85-35x)/2=22 I. 8x-85+35x=44 I. 43x=129 azaz x=3 II. y=(17-21)/2= -2 A msik, az egyenl egytthatk mdszere, amikor is a kt egyenlet mindkt oldalt gy szorzom meg konstans rtkekkel, hogy az egyik ismeretlen egytthati megegyezzenek. Ha pldul az x ismeretlen kikszblse a clunk a fenti ltalnos egyenletrendszerbl, akkor az els egyenletet LKKT(a,c)/c-vel, m g a msodik egyenletet LKKT(a,c)/a-val kell megszoroznunk, ahol a LKKT a kt szm legkisebbkzs tbbszrse. [A LKKT-t legyszerbben gy szmthatjuk ki, ha a kt szm szorzatt elosztom a legnagyobb kzs osztjukkal (LNKO). Ha ez bonyolultnak tnik, akkor megfelel a c-vel, illetve a-val trtn szorzsis.] Ezutn az egyik egyenletbl kivonom a msikat,saz gy kapott egyenlet mr csak 1 ismeretlent tartalmaz. Nzzk meg az elz egyenletrendszer megoldst az egyenl egytthatk mdszervel is:

7* I.: 28x-35y=154 4*II: 28x+8y =68 I-II: -43y=86 azaz y=-2 II: 7x-4=17 azaz x=3 A kt mdszer egyenrtk, brmlyikkel dolgozhatunk. A megoldsok vizsglata sorn 2 esetre kell kitrnnk. 1. Ltezik olyan eset, amikor a kt egyenlet egymssal ekvivalens. Ilyenkor az egyenletrendszer hatrozatlan, azaz az egyik ismeretlent tetszleges t vals paramternek vlasztva, kifejezhetjk a msikat, vagyis ekkor vgtelen sok megolds ltezik. 2. Lehetsges az is, hogy az egyenletrendszer megoldsa sorn ellentmondsra jutunk (tipikusan akkor, ha az talaktsok sorn azt tapasztaljuk, hogy a 2 egyenlet bal oldala egyenl, m g jobb oldaluk nem). Ekkor nincs megolds. me, egy egyszer felttel a hatrozatlansg, illetve ellentmondsossg vizsglatra. Ha a fenti ltalnos egyenletrendszerben: a*d-b*c==0 s 1) p*c==a*q, akkor az egyenletrendszer hatrozatlan; 2) p*c!= a*q, akkor az egyenletrendszer ellentmondsos.

Feladat
A fenti ismeretek rtelmben rjunk programot, mely megold egy 2 ismeretlenes, lineris egyenletrendszert a megoldsi lehetsgek teljes vizsglatval! A mogoldst itt tallod. A helyzet kicsit bonyolultabb 3 ismeretlenes egyenletrendszerek esetn.A megoldsi mdszerek ismerethez szksg van egy kis felsbb 'matek'-ra. Az els fogalom, amit bevezetnk aza mrtix. Egy mtrixot elg gy elkpzelnnk,mint egy n*messzmtblzatot. A mtrix elemeire indexelssel tudunk hivatkozni. Az a(i,j) elem a mtrix i. sornak j. oszpban lv elemet jelenti. Kzpsikolban tanultuk a vektorfogalmt. Nos, a mtrix gy is elkpzelhet, mintegy olyan sorvektor, melynek elemei oszlopvektorok vagy fordtva: olyan oszlopvektor, melynek elemei sorvektorok. Az albbi plda egy 3*3-as mtrixot mutat:

Elnevezsi konvenci, hogy a mtrixokat nagybetvel, elemeit pedig az adott nagybet indexelt kisbetivel jelljk. Ha a fenti mtrixot A-val jelljk, akkor elemeire knnyen hivatkozhatunk: a(1,1)=2, a(1,2)=3, ..., a(3,2)=4, a(3,3)=3 A mtrixok szp matematikai struktrkat alkotnak s nagyszer pldaprogramokat lehet r rni,de ehhez szksg lenne arra, hogy indexelt adatstruktrkat knnyebben kezeljnk. Ennek lehetsge egy ksbbi fejezetben ny lik meg szmunkra, amikor is a JAVA tmb kezelst tanuljuk. A fenti

plda mtrix sorfolytonos fel r sa alatt az A=(2 3 1; 4 2 4; 1 4 3) jellst rtjk.A 3 ismeretlenes egyenletek megoldshoz a mtrixoknak egy fontos jellemzjt,a determinnst, kell megrtennk. Egy n*n-es mtrix ftljt az a(1,1), a(2,2), a(3,3), ..., a(n,n) elemek alkotjk, formlisan: a(i,i) ahol i=1..n A msik tlban elhelyezked elemek a mellktlt alkotjk. A determinns. Az A mtrix determinnst detA-val jelljk. 1. Egy 1*1-es mtrix determinnsa maga az egyetlen eleme. 2. Egy 2*2-es mtrixdeterminnsa alatt a ftlban illetve mellktlbanlv elemek szorzatnak klnbsgtrtjk. Plda: Legyen

Ekkor detB=det(5 3; 4 2)=5*2-4*3=10-12=-2. Tovbb lpnk egyet. Egy n*n-es mtrix egyik elemhez tartoz aldeterminnsa alatt azt az (n1)*(n-1)-es determinnst rtjk, mely azon mtrixnak a determinnsa, mely az adott elemhez tartoz sorba, illetve oszlopban szerepl elemek trlsvel keletkezik. Egy 3*3-as mtrix determinnst gy kpezzk, hogy kivlasztjuk az egyik sort/oszlopot s egy olyan eljelben alternl sszeget kpeznk, melynek tagjai a kivlasztott sor/oszlop elemei megszorozva az elemhez tartoz 2*2-es aldeterminnsokkal. Ez a fenti 3*3-as plda mtrixra nzve, kivlasztva pldul az els oszlopot az albbiak szerint alakul:

detA=2*det(2 4; 4 3)-4*det(3 1; 4 3)+1*det(3 1; 2 4)=2*(-2)-4*5+1*10= -12 Vagyis az els elemhez tartoz aldeterminns az els sor s els oszlop trlsvel keletkez almtrix determinnsa, az a(2,1) elemhez a msodik sor s az els oszlop trlsvel kapott 2*2-es mtrix- , s vgl az a(3,1) elemhez pedig a 3. sor s els oszlop trlsvel kapot 2*2-es mtrix determinnsa tartozik. Formlisan egy n*n-es A mtrix determinnsa a k. oszlop szerint kifejtve:

elemhez tartoz aldeterminns. Egy A mtrix egy

oszlopvektorral val szorzatn azt az oszlopvektort rtjk, melynek i. komponense az a(i,1)*x1+a(i,2)*x2+...+a(i,n)*xn sszeg. Formlisan, ha A n*n-es mtrix s x n-dimenzis oszlopvektor, akkor

Ezzel el is rkeztnk ahhoz a ponthoz, ahonnan foglalkozhatunk az eredeti problmnkkal. A fenti mdszerrel egy egyenletrendszer egytthati egy mtrixot, egy n. egytthat-mtrixot alkotnak, m g a kiszmtand ismeretlenek egy oszlopvektort. Ezltal az egyenletrendszer egyszeren Ax= b alakban rhat fel. Pldul a 3*3-as esetben:

Vegyk szre, hogy az brban szerepl A mtrix-ot soronknt megszorozva az x oszlopvektor elemeivel, akkor ppen az egyenletrendszernk egyenleteit kapjuk: 1) a11*x1+a12*x2+a13*x3=b1 2) a21*x1+a22*x2+a23*x3=b1 3) a31*x1+a32*x2+a33*x3=b1 A 3 vagy tbbismeretlenes egyenletrendszerek megoldsra az egyenl egytthatk mdszernek ltalnostsa a Gauss-fle eliminci, illetve a vltoz helyettests mdszernek ltalnostsaknt ismert Cramer-szably kivlan alkalmas. A Gauss-fle eliminci JAVA megvalstsa a mg nem tanult tmb adatszerekezet ismerete nlkl igencsak krlmnyes lenne, gy most a Cramer-szablyt ismerjk meg.A dolog elg egyszer, mindssze a fentiekben megtanult 3*3-as determinnsok szmtst kell gyakorolnunk.

Amennyiben az A mtrix determinnsa nemzrus (detA!=0), akkor az x1, x2, x3 (...xn) ismeretlenek elllnak a kvetkez hnyadosok kpzsvel: D1/detA, D2/detA, D3/detA, ahol D1, D2, D3, ... azon mtrixok determinnsai, melyeket gy kpeznk, hogy az A mtrix 1, 2, 3, ...oszlopait kicserljk a jobb oldalon szerepl b egytthat vektor elemeivel kicserljk. Pldul:

Amennyiben az egytthat mtrix determinnsa nemzrus, akkor az egyenletrendszer hatrozatlan, ennek vizsglatra azonban tovbbi matematikai ismeretek hinyban nem trnk ki. Nzznk egy konkrt pldt a Cramer-szably alkalmazsval trtn megoldsra!

1) 4x1-3x2+ x3=2 2) x1+ x2-2x3=9 3) 2x1+ x2-3x3=14

azaz mtrixos alakban:

A determinnsokat az els oszlop szerint kifejtve: detA=4*(-3+2)-(9-1)+2*(6-1)=-4-8+10=-2 detD1=2*(-3+2)-9(9-1)+14*(6-1)=-2-72+70=-4 detD2=4*(-27+28)-(-6-14)+2*(-4-9)=-2 detD3=4*(14-9)-(-42-2)+2*(-27-2)=6 Ily mdon a Cramer-szably szerint:x1=-4/-2=2 x2=-2/-2=1 x3=6/-2 =-3 Visszahelyettestssel ellenrizve ksz vagyunk.

Feladat

A fenti ismeretek rtelmben ksztsnk programot, mely megold egy 3*3-as, lineris egyenletrendszert! A program tartalmazzon fggvnyt a 2*2-es, illetve 3*3-as determinns kiszmtsra, valamint vizsglja meg az alapmtrix determinnsnak nemzrus voltt. A megoldst itt tallod.

Ellenrz krdsek
1. Mit neveznk cimknek, hogyan cimkzhetnkutastsokat? 2. Ismertesd a tbbszrs elgazs ksztsre alklamas utastst! 3. Ismertesd a break utasts hasznlatt! 4. Mire hasznlhatjuk a continue utastst? 5. Mikor nem hasznlhatunk case s continue utastsokat? 6. Milyen mdszereket ismersz 2*2-es, linaris egyenletrendszer megoldsra? 7. Mikor mondunk egy 2*2-es egyenletrendszert hatrozatlannak, illetve ellentmondsosnak? Hny megolds ltezik ezekben az esetekben? 8. Mit neveznk mtrixnak? 9. Definild az albbi fogalmakat! Egy mtrix - ftlja, - mellktlja, - determinnsa (2*2-es s 3*3-as esetben). 10. Mit rtnk egy A n*n-es mtrix x n-dimenzis oszlopvektorral val szorzatn? 11. Hogyan hozhat kapcsolatba az egyenletrendszerek megoldsa s a mtrixok? 12. Ismertesd a Cramer-szably-t 3 ismeretlenes, elsfok egyenletrendszerek esetn! Mi a megoldhatsg felttele?

7. fejezet
Fikos szekrnyek garmadja, mindegyik hozz val mamval. A Jva alapptelemei, az objektumok. Objektumok deklarlsa vltozkkal s fggvnyekkel, amelyeket ezek utn metdusoknak fogunk hvni. Objektumok ltrehozsa s halla, letciklus a Jvban. A szemtgyjt. Emlkszel a mamra s a fikos szekrnyre a msodik fejezetben? Eddig hatrozottan egy kszletnyi vltozban s fggvnyben gondolkoztunk. Ez meg is felel a szmtgpprogramozs hagyomnyos modelljnek, ahol van egy darab fikos szekrnynk, azaz adattrolnk s egy rakat fggvnynk, ami ezen az egy llapottroln manipull. Ez nagyon kellemes is mindaddig, m g a programod kellen nagyra nem n, utna azonban ekkor a program klnbz funkcii s azoknak klnbz vltozi igencsak sszekavarjk a dolgokat. Kpzelj el most egy olyan modellt, ahol a program klnbz funkciit a hozzjuk tartoz vltozkkal egy egysgbe fogjuk. Ez mg nem elg: ilyen egysgeket szabadon hozhatunk ltre, egyfajtbl akr tbbet is, mindegyiket sajt vltozkszlettel, h vhatjuk

fggvnyeiket, amelyek a sajt vltozkszleten manipullnak s aztn dnthetnk az egysg elpuszttsrl is, ha nincsen mr r szksgnk. Olyan ez, mintha a programunkat gy pthetnnk, mint valami gpet; elszr megtervezzk az alkatrszeit, majd legyrtjuk bellk a megfelel mennyisget - csavarbl szzval, fdarabbl csak egyet-kettt. Ezek utn megmondjuk, az alkatrszek hogyan legyenek sszektve, majd beindtjuk a gpet, mire az mkdni kezd. A fent lert folyamat vszesen hasonlt az objektumorientlt programok ksztsre, mint amilyeneket Jvban is runk. Az objektumorientlt programozsban az alkatrszeket objektumnak h vjuk. Objektumokat tervrajz alapjn ksztnk, pont annyit, amennyi kell. A tervrajzot, amibl egy bizonyos fajta objektumokat legyrtunk, az adott objektumhoz tartoz osztlynak h vjuk. Az objektumok sszekttetseit az objektum fggvnyeinek, objektumorientlt terminolgival metdusainak h vsval valstjuk meg. Valahnyszor ltrehozunk egy objektumot, lefoglaldik hozz az sszes, az osztllyal deklarlt vltoz (teht nem azok, amelyeket a metdusokban deklarltunk), ezeket a vltozkat egyedvltoznak h vjuk, merthogy minden objektumegyednek van bellk egy teljes kszlet. Minden objektum teht az egyedvltozin keresztl nll egynisg lehet. Hagyjuk most a hosszas fejtegetst s nzznk egy pldt! Ismers?
public class Elso { public void prog( String args[] ) { System.out.println( "Hello, ez az elso Java programunk!" ); } public static void main( String args[] ) { Elso e = new Elso(); e.prog( args ); } }

Van itt egy rettenetes titok, ami az egsz tananyag eleje ta lappang itt a kk kdk mgtt: igazbl mindig is objektumorientlt programokat rtunk, mert Jvban mshogy nem lehet. Minden programunk egy osztlydefinci volt s mindegyikben sajt magunk is ltrehoztunk legalbb egy objektumot. Nzzk most t ezt a programot ebbl a szempontbl! Mindenekeltt definiltuk az Elso nev osztlyt. Ezt a kvetkezkppen tettk:
class Elso { ... }

ahol a kapcsos zrjelek kztt az osztlyhoz tartoz cuccok vannak, ebben az esetben kt metdus. Egszen pontosan nem ezt tettk, hanem mg el rtuk azt, hogy public. Egyelre errl elg annyit tudnunk, hogy a programunk futtathatsga miatt szksges, hogy a program fosztlya (amit a java parancs utn runk) public legyen. Ha egy forrsfjlban van egy public osztly, annak neve meg kell egyezzen a forrsfjl nevvel. Ezen fell a fjlban tetszleges szm egyb class lehet public nlkl. Egyelre jegyezzk meg azt, hogy a nem public osztlyt csak az t tartalmaz forrsfjlbl lehet elrni. Ez nem teljesen pontos gy, de egyelre elg neknk. gyse runk mg olyan programot, aminek forrsa tbb fj lban van. Nzzk meg most ezt a sort:
Elso e = new Elso();

Ez egy rtkads, de furcsa fajtj, nem? Mindenekeltt mi az Elso tpus, mi csak int-et, double-t s boolean-t ismernk. Az Elso egy j tpus, egy objektumreferencia. A referencia tpus vltoz is csak egy fik, de ebben egy adott osztly objektumra hivatkoz referencit, mutatt trolunk. Egy referencit gy lehet elkpzelni, mint egy elrsi instrukcit: vedd balrl harmadik bgrt a msodik polcon. Maga a bgre felel meg az objektumnak. Ha most kicserljk a fikban lev cetlit egy msikra, ami a harmadik polcon a legszlst jelli meg, akkor az, aki kiveszi a cetlit a fikbl, ezt a bgrt fogja megtallni s nem az elzt. Tnyrra mutat cetlit nem lehet a fikba elhelyezni, ez a fik a bgrereferencik. Az e vltoz teht egy Elso objektumra mutat referencit trol, de hogy jutunk ilyenhez? A new opertor hasznlhat arra, hogy egy mr definilt osztlybl egyedeket gyrtson. Most egy Elso osztly objektumbl hoztunk ltre egy j egyedet, erre az egyedre mutat referencit szereztnk a new-tl s ezt rgtn hozz is rendeltk az e vltozhoz. Az e-n keresztl teht most ezt a pldnyt tudjuk elrni. Az objektumreferencia tpusnak egyetlen definilt konstans rtke van, egy specilis referencia, ami nem mutat sehova. Ennek a konstansnak a neve null. Ha egy objektumreferencinak null rtket adunk, ezzel azt jeleztk, hogy a referencia "nem hasznlhat", mert nem ll mgtte objektum. Plda:
e = null;

A null egy klnleges rtk mert nincs t pusa, brmilyen tpus objektumreferencinak rtkl adhat. Mit tudunk tenni egy referenciavltozval, milyen mveletek llnak rendelkezsre ilyen tpus rtkekkel? Mindenekeltt ms megegyez tpus vltoznak lehet rtkl adni. Ha azt mondannk
Elso m; m = e;

akkor az m s az e ugyanarra az objektumra hivatkozik, mindkettn keresztl ugyanazt az objektumpldnyt rhetjk el. Ha ezek utn tovbb varilunk:
e = new Elso();

akkor ltrehoztunk egy j egyedet az Elso-bl s most az e erre mutat. A kt vltozn keresztl most kt klnbz objektumpldnyt rhetnk el. De mit jelent az, hogy elrnk egy objektumot egy referencin keresztl?
e.prog( args );

A referencit most felhasznltuk arra, hogy megh vjuk az ltala hivatkozott objektum egy metdust. A fggvnyh vs pont gy nz ki, mint egy eddigi mezei fggvnyh vs, de most a referencia megadsval jeleztk, hogy nem a sajt objektumunknak, hanem egy msiknak, a referencia ltal mutatottnak a metdust akarjuk. Egyelre nem mondom el, mirt van szksg arra, hogy programunk sajt osztlyt pldnyostsuk, az majd egy kicsit ksbb jn. A static a kulcsz. Minden objektumnak van egy specilis metdusa, amit konstruktornak hivunk. A konstruktor arrl ismerkszik meg, hogy nincsen visszatrsi rtke (void sem!) s a metdusneve megegyezik az osztly nevvel. Paramterei akrhnyan lehetnek s persze egy objektumnak lehet tbb konstruktora

is klnbz fajtj s tpus paramterekkel. Nzznk egy pldt! Ha az Elso objektumnak lenne konstruktora, azt gy kellene lerni.
Elso( int i ) { System.out.println( "Konstruktor lefutott, parameter: "+i ); }

Ez speciel egy olyan konstruktor, ami egy darab egszet vr paramterknt s akkor h vdik meg, ha pont egy egszt adtunk a megh vsakor. De hogyan s mikor h vdik meg a konstruktor? A konstruktort az egyed ltrehozsakor h vja meg a rendszer (teht nem mi) s a paramtereit a new mgtt ll osztlynv mgtt lev gmbly zrjelek kzl szerzi. Ha azt akarjuk, hogy ez a konstruktor hvdjon meg, az Elso egyedet gy kell ltrehozni:
Elso e = new Elso( 2 );

Mint mondtam, minden objektumnak van konstruktora. De akkor hol az Elso konstruktora, nincs olyasmi a kdban, hogy
Elso() { ... }

pedig mi eddig v gan hivatkoztunk r, amikor azt mondtuk


Elso e = new Elso();

A megolds az, hogy a rendszer van olyan kedves s egy konstruktort, a paramter nlklit automatikusan ltrehozza neknk, ha mi nem deklarljuk. gy aztn mg ha nem is foglalkozunk olyan fldi h vsgokkal, mint a konstruktor, objektumunkat biztosan ltrehozhatjuk a paramter nlkli konstruktoron keresztl. A paramter nlkli konstruktort alaprtelmezett konstruktornak (angolul default constructor) h vjuk.

Feladat
Mdostsd npszer Elso programunkat gy, hogy legyen az Elso osztlynak egy paramterrel rendelkez konstruktora is tovbb az is h vdjon meg! Ha valamirt nem megy, itt a megolds , de a lecke szvege tartalmazza az sszes szksges programdarabot, gyhogy ezt meg kell tudni oldanod! Futtasd le a megoldst s rtelmezd az eredmnyt! Ezek utn deklarlj egy paramterek nlkli konstruktort is s alaktsd t a programot gy, hogy az h vdjon meg! A paramter nlkli konstruktorba is tegyl egy ki r st, hogy biztosak legynk, tnyleg az h vdott-e meg. Futtasd le, rtelmezd az eredmnyt majd ellenrizd a megoldst! A konstruktorokat persze elssorban nem arra hasznljk, hogy buta ki r sokat eszkzljenek velk, hanem a szlet objektumpldny bels llapotnak belltsra, vagyis fkpp arra, hogy az objektum egyedvltozi (emlkszel, ezek azok a vltozk, amelyeket nem a metdusok trzsben, hanem az osztly trzsben, a metdusokkal egy szinten deklarlunk) megfelel kezdrtket kapjanak. gy aztn egy osztly trzse gy nzhet ki:
class ValamiOsztaly { int parameter; ValamiOsztaly( int parameter_init ) { parameter = parameter_init; }

void irdkiaParametert() { System.out.println( "Parameter: "+parameter ); } }

Aztn valahol egy felhasznl kdrszletben mondhatunk valami ilyesmit:


ValamiOsztaly v = new ValamiOsztaly( 12 ); ... v.irdkiaParametert();

s ez persze 12-t rna ki. Az objektum ltrehozasakor a konstruktor meghvodik a new utan lev rtkkel. Ezt a konstruktor berakja az objektumegyed parameter nev vltozjba. Amikor ksbb megh vjuk ugyanazon objektumegyed egy metdust, ami a parameter vltozt felhasznlja s mellkesen ki is rja. Egy kicsit olyan, mint az itt-a-piros-hol-a-piros, te tudtad kvetni? Ha mr az egyedvltozknl tartunk, az objektumreferencit felhasznlhatjuk arra, hogy egy egyedvltozt direktben elrjnk. Elz pldnkban pldul azt is mondhatjuk:
int k = v.parameter;

ahol is egy frissen ltrehozott k nev vltozba pakoltuk a v referencival hivatkozott objektum parameter nev vltozjnak rtkt. Megjegyzend, hogy az objektum egyedvltozinak direkt elrse nem javasolt mdszer, az obejktum bels llapott a metdusain keresztl illik mdostani s lekrdezni. Ez azonban nem ktelez, csak affle ajnlott programtervezsi mdszertan.

Feladat
Ragadd meg nagy siker Elso programunkat s alaktsd t Masodik-k! Az j vltozatban prbld ki a kvetkez kunsztokat: I. II. III. IV. V. VI. VII. Legyen az osztlynak egy ertek nev egsz tpus egyedvltozja Az alaprtelmezett konstruktor adja ennek a 0 rtket Legyen egy olyan konstruktor, ami egy egsz paramtert vr s az ertek vltozba rja Legyen az osztlynak egy olyan metdusa, ami kirja az ertek-ben lev rtket A programodban hozzl ltre kt objektumegyedet, az egyiket az alaprtelmezett konstruktorral, a msikat az egsz paramterrel rendelkez konstruktorral. H vd meg mind a kett objektumegyednek az ertek-et kir metdust rd el az ertek vltozt direktben a fprogramodbl s rd ki gy is!

Mindenkppen prbld a programot megrni magad s ha kszen van, nzd meg a megoldst!

Most mr tudunk objektumokat ltrehozni, de hogyan tnnek ezek el? Minden objektumhoz tartozik memriaterlet, amelyet a rendszer lefoglal szmra, amikor az objektum ltrejn. Ha egyre csak foglalgatunk, felesszk elbb-utbb a gp memrijt s a programunkra szomor vg vr. A Jva sajtos mdon oldja meg a mr nem hasznlt objektumok felszabadtst. A httrben egy szemtgyjt programot futtat, ami megtallja a mr nem hasznlt objektumpldnyokat s felszabadtja ket. Mi alapjn dnti el, ki a szksgtelen s ki nem? Minden objektum szksgtelen, amire mr nincsen referencia. Pldul kivl Masodik programunkban ha azt rnnk:
m1 = new Masodik( 3 ); m1 = new Masodik( 4 );

akkor a 3-as paramterrel ltrehozott Masodik egyedre a msodik rtkads utn mr nem mutatna referencia. Ugyanez a trkk akkor is igaz, ha a referenciavltoz automatikusan takartdik el, pldul egy metdus bels vltozjnak megsznse miatt.
void objektumLetrehozo() { Masodik m1 = new Masodik(); }

Ebben az esetben az m1 vltoz megsznik, amikor a metdus visszatr a h vhoz s minthogy a referencit nem mentettk el egy biztos helyre (pl. objektum egyedvltozba vagy a metdus visszatrsi rtkbe, ahol a hv esetleg felhasznlhatja), a ltrehozott Masodik egyed szemtt vlik. A szemtgyjt nem azonnal takartja el a feleslegess vlt objektumokat, hiszen akkor programunkat alaposan lelasstan lland sepregetsvel. Hasonlatosan egy rutinos hzmesterhez, elbb megvrja, hogy elg sok szemt legyen s akkor lendl akciba. Mindez megmagyarzza, mirt olyan hihetetlenl magas a Jva programok memriaignye. Egy jl irnyzott Jva programsorral akr 3-4 szemtobjektumot is tudunk csinlni s egy komoly Jva program terhels alatt akr 2-3KBjt szemetet is ltrehoz msodpercenknt. Ezrt cserbe viszont nem kell trdni az egyik legundokabb hibval, a memriafolyssal, amikor a programoz elfelejti felszabadtani a lefoglalt s mr nem hasznlt memriaterletet s a gp szabad memrija lassan elfogy. A szemtgyjt mkdsnek demonstrlsra nem tudtam ltvnyos s egyszer pldt kitallni, gy sajnos el kell hinned, hogy ez gy van. Lssuk inkbb a lecke finljt, me egy nagyszer

Feladat
rjl egy programot, ami egy jtkost s egy bankot modellez, akik fej vagy r st jtszanak forintos alapon. A jt kos fogad fejre vagy r sra, a bank feldobja a pnzt s ha a jtkos eltallja, kap egy forintot a banktl, ha nem, fizet egyet. A jtkos fogadjon vletlenszeren, jtsszanak ilyen mrkzsbl 10-et majd a vgn rd ki, kinek mennyi pnze maradt. A feladat megoldshoz mindenekeltt meg kell tervezned a programban hasznlt objektumokat. Minden szereplt azonostson egy objektum! Ezek szerint biztosan van Jtkos s Bank objektumunk. rd fel a kt objektum tulajdonsgait a kvetkez formban: xxx objektumnak van - ... (az objektum ltal trolt adatok listja) xxx objektum kpes

- ... (az objektumon vgrehajthat mveletek listja) xxx objektum kommunikl - ... milyen objektumokkal kommunikl az objektum (csak ha mi vagyunk a kezdemnyez) Alkalmazd a fenti mdszert a feladatunkra! A megfejtshez grgess le nhny sort, de ennek mennie kell. A Jtkosnak van - pnze A Jtkos kpes - fogadsokat tenni - kirni, mennyi pnze van A Jtkos kommunikl - A Bankkal, amikor fogadsokat tesz A Banknak van - pnze A Bank kpes - Fogadsokat fogadni, dobni, eldnteni, hogy a jtkos vesztett vagy nyert - kirni, mennyi pnze van A Bank kommunikl - Senkivel, a Jtkos kezdemnyezi a fogadsokat Ezen fell van mg egy szerepl, a Fogad, ami a szlakat mozgatja. veszi r a Jtkost, hogy 10szer fogadjon a Banknl. A Fogadnak van - Jtkos objektuma - Bank objektuma A Fogad kpes - lejtszatni a mrkzst A Fogad kommunikl - A Jtkossal, hogy fogadjon A "van" szekcibl derlnek ki az objektum egyedvltozi. A pldban a Jtkosnak s a Banknak van pnz vltozja, a Fogad meg referencit trol a Jtkos s Bank objektumokra. A "kpes" szekcibl derl ki, milyen metdusai lesznek. A Jtkosnak lesz egy metdusa, amivel fogad s egy msik, ami kirja a Jtkos objektumban trolt pnzt. A Banknak lesz egy metdusa, aminl fogadsokat lehet tenni s egy msik, ami kirja a bank pnzt. A Fogadnak egy metdusa lesz, ami a jtszmt lejtsza. A "kommunikl" szekcibl derl ki, melyik objektum melyik msik metdusait h vja meg, kire trol referencikat. A Jtkos referencit trol a Bankra s megh vja annak fogadskirtkel metdust, a Fogad pedig a Jtkosra trol referencit. A tovbbiak kedvrt a Bank objektumot is a Fogad hozza ltre s passzolja a Jtkosnak a referncijt a Jtkos konstruktorn keresztl. Az albbi brn ezeket a relcikat brzoltam.

A fentiekben lert egyszer mdszert objektumelemzsnek fogom hvni ezutn. A mdszer valban egy profi programozk ltal is hasznlt programtervezsi mdszertan lnyegesen leegyszerstett vltozata, amely most oktatsra teljesen megfelel. A sok duma utn rd meg a programot! Nzd meg az bra fggsgi listjt s ebbl kiderl, clszer a Bankkal kezdeni, mert az nem fgg semmitl, utna jhet a Jtkos, majd a Fogad. Ha kszen van, csinlj egy olyan vltozatot, ahol hrom jtkos jtszik ugyanannl a banknl. Ha nem untad meg, csinlj olyat is, ahol hrom jtkos jtszik hrom klnbz banknl! Pusztn csak ellenrzskppen itt a megolds.

Feladat
rjl egy olyan programot, ami hrom jtkost modellez, akik a k-papr-ollt jtszanak krmrkzses alapon. Ha emlkszel, a k-papr-oll az a klasszikus jtk, ahol a kt jtkos egyszerre vlaszt a hrom trgy kzl s egy krkrs szablyrendszer alapjn dntik el, ki gyztt: a k gyz az oll ellen, de veszt a papr ellen, a papr pedig veszt az oll ellen. Futtasd le a krmrkzst 20-szor s irasd ki, melyik jtkos hnyszor nyert. Minden jtkosnak legyen egy szma, ami azonostja. Elszr vgezd el az objektumelemzst, ezt itt ellenrizheted. Ezutn ksztsd el a programot, ha kszen vagy, ellenrizd a megoldst! Figyeld meg, hogy a megoldsunkban most nem troltuk el a jtkostrs referncijt a sajt objektumunkba (pedig megtehettk volna, hiszen a prok vltozatlanok), hanem a rugalmasabb szerkezet rdekben paramterknt adjuk t a fogad metdusnak. Ha netn eltroltad volna apartner referencijt, az is helyes.

Ellenrz krdsek
I. II. III. IV. V. VI. VII. VIII. IX. Mi az objektum, mi az osztly s mi a kapcsolatuk? Mi az sszefggs a fggvnyek s metdusok kztt? Mi az egyedvltoz? Mi az objektumreferencia Mit jelent a null? Hogyan h vhatjuk meg egy objektum metdusait az objektumreferencin keresztl? Mi a konstruktor? Hogyan h vjuk meg a konstruktort? Mi az alaprtelmezett konstruktor?

X. XI. XII.

Mikor generl alaprtelmezett konstruktort a fordt maga? Hogyan hivatkozhatunk egy objektum egyedvltozira az objektumreferencin keresztl? Mit jelent az, hogy a Jva rendszerben egy szemtgyjt mkdik?

8. fejezet
jabb megvilgosods: statikus vltozk s metdusok. Egyedvltozk s osztlyvltozk kavalkdja. rklds s konverzik. Mint emltettem, egy normlis, mezei osztlynak egyedvltozi vannak, amelyek minden egyedben kln ltrejnnek s kln letet lnek az egyes egyedekben. Miutn ltrejttek, semmi kzk egymshoz. Ugyangy, a mezei osztly metdusai az egyedvltozkon manipullnak, gy amikor megh vunk egy metdust pl.
j1.eredmenyKiiras();

akkor implicit mdon odaadtuk a j1 ltal hivatkozott objektumegyedet is az eredmnykiras metdusnak, ami aztn buzgn felhasznlja ezen objektumegyed vltozkszlett. Ez eddig rendben is van. Lehetnek azonban esetek, amikor nem akarjuk, hogy a vltoz minden egyedben ltrejjjn, hanem csak egyet akarnnk, kzset minden objektumegyednek, ami az adott osztlybl pldnyostdott. Ha netn ilyenben trnnk a fejnket, a statikus vltozk pont neknk valk. A statikus vltoz pont olyan, mint brmely vltoz, csak a tpusdeklarcija el mg oda van rva az hogy static. gy:
static int szamlalo;

Az ilyen vltoz nem jn ltre jra meg jra, valahnyszor az osztlyt pldnyostjuk, csak egyszer, amikor a Jva virtulis gp elszr tlti be az osztlydefincit. A konstruktorral sszehzastva pldul felhasznlhatjuk ezt a fajta vltozt arra, hogy megszmolja, hnyszor pldnyostottk az adott osztlyt. A kvetkez pldban ezt tesszk.
class Szamlalo { static int peldanyok = 0; Szamlalo() { ++peldanyok; } }

Ezek utn valahnyszor azt mondjuk: new Szamlalo(), a peldanyok valtozo megn eggyel. Statikus vltozra ktflekppen hivatkozhatunk: vagy egy referencin keresztl, mint ms becsletes vltozra vagy egyszeren az osztly nevvel pl. gy:
int k = Szamlalo.peldanyok;

Ez utbbi azrt lehetsges, mert a peldanyok vltoz nem az objektumegyedeknek, hanem az osztlynak lefoglalt memriaterleten troldik, elrshez nincs szksg objektumreferencira. A statikus vltozknak ezt a tulajdonsgt elszeretettel hasznljk fel arra, hogy konstansokat deklarljanak vele. Ha pl. a Szamlalo osztlyban azt mondom:
static int Milennium = 2000;

azt ksbb brhonnan knyelmesen elrhetem Szamlalo.Milennium formban anlkl, hogy mindenfle referencikra kellene vadszni. A konvenci szerint (amit a Jva nem tesz ktelezv, csak kvetni ajnljk) a konstansok nevt csupa nagybetvel kell rni, hogy megklnbztessk a vltoz vltozktl. gy e:
static int MILENNIUM = 2000;

Feladat
Vedd el nagy siker k-papr-oll programunkat s valsts meg benne kt szolgltatst a statikus vltozk segtsgvel! Elszr is szmolja meg s a futs vgn rja ki, hny dntetlen eredmny szletett sszesen. A Jatekos osztlyban hozzl ltre egy statikus vltozt s nvelgesd, valahnyszor dntetlen fordult el. Msodszor is a k, papr, oll trgyakhoz rendelt szmokat helyettestsd konstansokkal. me az n vltozatom! Metdusok is lehetnek statikusok. Ha egy metdusnv eltt ll a static kulcssz, ennek hrom kvetkezmnye lesz. I. II. III. A metdus csak statikus vltozkat rhet el. Ne feledd: a statikus metdus h vsakor nem ismeri az objektumegyed kontextust, gy aztn az egyedvltozkat nem tudja elrni. A metdus h vhat osztlynv.metdusnv formban. Plda: Math.random() (ugye ismers?) A metdus nem h vhat nem statikus metdusokat. Ez ugyanazon ok miatt van, amirt egyedvltozkat sem rhet el.

Statikus metdusoknak a legfbb haszna az, hogy nem kell rte pldnyostani az osztlyt, megh vhat egyszeren osztlynv alapjn. Ezzel kitrhetnk a Jva erszakos objektumszemlletbl s mindenhonnan elrhet fggvnyeket rhatunk.

Feladat
Fogd az Elso.java programot s rd el, hogy ne kelljen az Elso-t pldnyostani! Trld ki teht a kvetkez sort Elso e = new Elso(); s tedd meg a szksges vltoztatsokat, utna ellenrizd a megoldst! Most mr taln megrtheted, mirt hagytuk ilyen sokig burjnzani a misztikumot a main-ban tallhat kt sor krl. Minthogy a main statikus ( gy szl a Jva specifikci), mert a Jva virtulis gp nem pldnyostja a java parancs ltal hivatkozott osztlyt, gy nem rhet el nem statikus vltozt vagy

metdust. A sok static megzavart volna s nem is tudtuk volna ilyen knnyedn bevezetni az egyedvltozkat. Mostantl azonban tudjuk, mit csinlunk, gy a programosztlyt csak akkor pldnyostjuk, ha kell. s most valami teljesen ms! Megmutatom, hogyan lehet minimlis munkval okos objektumokat kszteni. Eddig azt tanultuk, hogy az osztlyok vltozit s metdusait neknk kell deklarlni. Ha azonban olyan lusta vagy, mint amilyen n, inkbb vesznk valami kszet s talaktjuk csupn azt mdostva benne, amiben a ksz nem tesz eleget ignyeinknek. A mdszert, ami objektumorientlt rendszerekben erre a clra rendelkezsre ll, rkldsnek h vjuk. rkldssel azt jelenthetjk ki, hogy egy oszt nem a nullrl hozunk ltre, hanem tvesznk egy lyt ltez osztlybl mindent, majd bvtjk illetve flldefiniljuk az j funkcikkal. Vegyk a kvetkez pldt:
class Eredeti { int i; void novel() { ++i; } } class Leszarmazott extends Eredeti { void novel() { i = i + 2; } void csokkent() { i = i -2; } }

A kicsit buta pldnkban (mirt kell ahhoz leszrmazs, hogy megsproljunk egy int i;-t?) a leszrmazott osztlyban fellrtuk a novel() metdust, hogy ezentl kettvel nvelgesse i-t s hozzadtunk egy csokkent metdust, ami cskkentgetni is tud. A Leszarmazott osztlyt pont gy kell hasznlni, mint az Eredeti-t. Mg egy megjegyzs: a konstruktorok nem rkldnek. Ha a leszrmazott osztlynak is szksgk van spci (teht paramtert fogad) konstruktorokra, azt jra kell definilni a leszrmazott osztlyban is. Ha nincs szksg vltoztatsra, hasznlhatod a super() h vst, amivel a szlosztly konstruktora fel passzolhatod a paramtereket. Vegynk egy pldt, ahol egy egsz paramtert passzolunk felfel:
class Leszarmazott extends Eredeti { Leszarmazott( int i ) { super( i ); } ... }

Az rklds kivlan alkalmas arra, hogy bevezessek egy rgen esedkes fogalmat, a tpuskonverzit. Tpuskonverzival hasonl tpus rtkeket alakthatunk egymsba. Kzenfekv

plda a szmok: mirt kell fallal elvlasztani egymstl az int-et s double-t? Nem kell s me egy kis plda, hogyan lehet tpuskonverzival egymsba alaktani ket.
double n = 2.7; int ni = (int)n; n = (double)ni;

Az ni vltozba tkonvertltuk n-t. Csoda azonban most se trtnt, ni-be 2 kerlt, a trtrsz levgdott. A kvetkez lpsben az n-be visszakonvertltuk az ni rtket, minek eredmnyekppen n-ben most 2.0 van. Ez eddig nagyon egyszer, de mik lehetnek hasonl tpusok mg? A Jva nagyon szigor tpuskonverzi tern s a szmok mellett csak a leszrmazott osztlyok referenciit engedi egymsba tkonvertlni. Pldul az elbbi pldnknl maradva ha netn azt mondannk
Leszarmazott l = new Leszarmazott(); Eredeti e = (Eredeti)e;

Ez sikerlne, mert az Eredeti s Leszarmazott "hasonl" tpusok. Azrt megengedett a mvelet, mert az Eredeti legalbb azt tudja, amit a Leszarmazott, mert belle jtt ltre mdostssal. Ha ugyanezt visszafel csinlnnk, kicsit bonyolultabb a helyzet.
Leszarmazott l2 = (Leszarmazott)e;

Ezt a fordt elfogadja, de azrt mg nem biztos, hogy helyes. Ha a hrom utasts gy kvette egymst, ahogy az elbb lertuk, akkor helyes, hiszen e-ben valjban egy Leszarmazott referencija van. Ha azonban netn ez lenne a sorrend:
Eredeti e = new Eredeti(); Leszarmazott l2 = (Leszarmazott)e;

ezt a fordt ugyan nem tekinti hibnak (rokon osztlyok kztt a konverzi megengedett), de a Jva virtulis gp a futs sorn szreveszi a turpissgot s hibazenettel lell. Most mr csak az a krds, ha vesszk az elz pldt
Leszarmazott l = new Leszarmazott(); Eredeti e = (Eredeti)e;

s megh vjuk a novel metdust


e.novel();

vajon eggyel vagy kettvel n-e az i vltoz? A Jva dinamikus tpusfeloldssal rendelkezik, teht mindig annak az osztlynak a metdusai h vdnak meg, ami az osztly valjban, nem pedig a referencia tpusa szerint, i teht kettvel n. Referenciinkat teht nyugodtan konvertlhatjuk a szlosztly fel, ha elhasznljuk a referencit, az a megfelel eredmnnyel fog jrni.

Feladat
Ragadd meg bartunkat, a k-papr-oll programot s csinld meg azt, hogy egy jtkos azzal a "szisztmval" jtszik, hogy mindig pl. kre fogad. Csinlj egy leszrmazottat a Jatekos osztlybl s rd fell a fogadas() metdust megfelelkppen! Ezek utn az egyik jtkost a leszrmazott osztly

szerint hozdd ltre s hasznlj tpuskonverzit a tpushibk elkerlsre! Itt a megolds ellenrzskppen. Ki a buta jtkos?

Ellenrz krdsek
I. II. III. IV. V. VI. VII. VIII. IX. X. XI. Mi a statikus vltoz? Elrhet-e a statikus vltoz nem statikus metdusbl? Milyen referencival lehet elrni a statikus vltozt? Mi a statikus metdus? Elrhet-e norml egyedvltozt statikus metdus? Megh vhat-e statikus metdust norml, nem statikus metdus? Megh vhat-e norml metdust statikus metdus? Mit jelent az, hogy egyik osztly leszrmazottja a msiknak? Lehet-e egy osztlyreferencit a szlosztly fel konvertlni? Lehet-e egy osztlyreferencit a leszrmazott osztly fel konvertlni? Lehet-e Jvban klnbz tpus rtkek kztt rtkads?

XII. Ha ltrehozunk egy egyedet s egy szlosztly tpusa szerinti referencival hivatkozunk r, a szlosztly vagy a leszrmazott osztly szerinti metdus h vdik-e meg?

9. fejezet
Adatok tmegesen: tmbk a Jvban. Tmbtpusok. A Jva tmbk is csak objektumok. Objektumok s tmbk tmbje. Emlkszel lotts pldnkra az 5. fejezetben, ott t vltozban troltuk a lottszmokat. Taln mr akkor megfordult a fejedben, hogy esetleg van egy elegnsabb mdszer egymshoz tartoz azonos tpus adatok trolsra. Ha a fikosszekrnynl maradunk, md van valami olyasmire, mint egy katalgusszekrny, ahol bizonyos kulcs (ltalban kezdbet) alapjn rhetjk el az elemeket. A katalgusszekrnynek megfelel eleme a Jvnak is van, de mi egy egyszerbb adattpussal kezdjk, ahol az elemeket egy szmmal, az indexszel lehet kivlasztani. Ezt az adattpust szinte minden szmtgpes nyelv ismeri, tmbnek h vjk. Legegyszerbb egy pldval kezdeni. Nzzk a kvetkez sort:
int a[] = new int[20];

Klnsebb magyarzat nlkl (majd jn az is!) egyelre fogadjuk el, hogy ez a sor egy 20-elem tmbt krel, amelyben minden tmbelem egy int. Az tmbelemeket egy egsz tpus indexszel vlasztjuk ki: a tmb els eleme a[0], a msodik az a[1], az utols az a[19] (minthogy 0-rl kezdtk a szmllst!) A tmbelemeket ugyangy kezelhetjk, mintha normlis vltozk lennnek, rtket adhatunk nekik:
a[0] = 42;

vagy pedig felhasznlhatjuk az rtkeit kifejezsekben:


a[2] = a[0] + a[1];

Termszetesen az indexnek nem kell konstansnak lennie, tetszleges egsz kifejezs megteszi. Pldnak okrt a kvetkez programrszlettel tlthetjk fel az egsz tmbt 42-vel.
for( int i = 0 ; i < 20 ; ++i ) a[i] = 42;

Ilyen egyszer ez a felsz nen! Most vizsgljuk meg a tmbt ltrehoz sort, mert rdekessgek tallhatk ottan. Az objektumoknl megszokott mdon nzzk a tmbvltozt magt:
int a[];

Ez a vltoz egy int-ekbl ll tmbre mutat referencia. Ugyangy, mint egy objektumreferencia (mint ahogy valjban objektumreferencia is) egy mutatn k vl nincs lefoglalt tr terlet mgtte. A 20 egsz rtknk nem itt van. A referencia akkor lesz hasznlhat, ha ltrehozunk egy tmbobjektumot, amire a referencia mutathat. Ilyen objektumot gyrt az rtkads jobb oldaln ll kifejezs.
new int[20];

Ez a kifejezs 20 egsz szmot befogadni kpes tmbnek foglal helyet s visszatrsi rtke a tmbre mutat referencia. Ezt tesszk bele az "a" tmbreferencira, minek eredmnyekppen az "a" vltozn keresztl indexelni tudjuk a tmbt. Az "a" vltoz - hasonlan brmilyen ms objektumreferncihoz teht attl kap rtelmet, amire mutat. rhatjuk ksbb, hogy
a = new int[40];

Ekkor a rgi tmb, amire "a" imnt mutatott eltnik (vagy elrhet egy msik referencin keresztl, ha volt ilyen) s "a" egy vadi j, ezttal 40 elem tmbt tud elrni. A tmbk teht a Jvban teljesen gy viselkednek, mint az objektumok. Ha van egy tmb tpus referencink, azzal "rmutathatunk" egy mr ltez tmbre, gy kt tmbreferencin keresztl rhetjk el ugyanazt a tmbt. Plda:
int a[] = new int[20]; int b[]; b = a; a[0] = 1; b[1] = 13;

A kt rtkads a programrsz vgn ugyanannak a tmbnek a 0. s az 1. elemt manipullja, minthogy a 3. sorban megtettk, hogy a "b" is ugyanarra a tmbre hivatkozzon.

A tmbk annyira objektumszerek, hogy sajt egyedvltozik is vannak. Minden tmbobjektumnak van egy length egyedvltozja, ami megmondja a tmb mrett. Elz pldnkban
a.length

s
b.length

egyarnt 20-at ad vissza rtkknt (merthogy igazbl ez ugyanaz a tmb). A Jva teljes tpus- s indexhatrellenrzssel rendelkezik. Nem tehetjk meg azt, mint a C-ben, hogy a tmbindexet a tmb mretnl nagyobbra lltjuk s telepiszktjuk a memrit. Amikor egy tmbreferencin keresztl elrnk egy tmbobjektumot, a Jva ellenrzi a tmbobjektum tnyleges mrett (dinamikusan foglaltuk, fordtsidben nem jhet r) s kilvi a programot, ha tlindexelni prblja a tmbt.

Feladat
rjuk t a mr elksztett lott programot gy, hogy a vletlen szmokat egy 5 elem int tpus tmbbe helyezze el! ! Gyakorlskppen hasznljunk statikus metdusokat s adattagokat! A megoldst itt tallhatod.

Feladat
I. Ksztsnk programot, mely feltlt egy 100 elem, vletlen szmokbl ll tmbt, majd az elemeket kilistzza a konzolra! Gyakorlskppen hasznljunk statikus metdusokat s adattagokat! Az osztly neve legyen "Osszegzes"! Bvtsk a programot gy, hogy adjuk ssze az gy generlt tmb elemeit, majd az sszeget rjuk ki a konzolra! Vlogassok le az eredeti tmbbl a pros, illetve pratlan szmokat egy "paros" illetve "paratlan" nevu tmbbe, listzzuk ki kln a pros, illetve pratlan szmokat, illetve rjuk ki ezek arnyt! A megolds az Osszegzes.java programban tallhat, az 2. illetve 3. rszfeladat a zrjelek elhagysval bvthet.

II. III.

Eddig tlsgosan az egsz tpus tmbkre sszpontostottunk, pedig a tmb ltal trolt rtkhalmaz (a tmb alaptpusa) termszetesen akrmilyen Jva tpus lehet. Lehet termszetesen objektumreferencia is s ez agy nagyszer eslyt ad neknk arra, hogy objektumokat nagy szmban ll tsunk el. Eddig ugye mindegyikhez kellett egy kln referenciavltoz, de ha most egy tmbt csinlunk referencikbl, j sok objektumot ltrehozhatunk. Emlksznk mg Elso objektumunkra a 7. fejezetben? Most csinlhatunk belle mondjuk szzat olymdon, hogy ltrehozunk egy Elso tpus referenciatmbt s minden tmbelembe belepakolunk egy j Elso egyed referencijt. Valahogy gy:
Elso et[] = new Elso[100]; for( int i = 0 ; i < 100 ; ++i ) et[i] = new Elso();

Az eredmny szz Elso egyed amelyeket az "et" tmb megfelel indexszelsvel rhetnk el. Pldul mondhatjuk:

et[42].prog( args );

Ekkor a 43. Elso egyed prog metdust h vtuk meg args paramterrel.

Feladat
rd t npszer K-Papr-Oll programunkat a 7. fejezetbl gy, hogy 5 jtkos jtsszon! A Jatekos referencikbl csinlj egy tmbt s ciklusokkal oldd meg. amit az eredeti program kln vltozkkal csinlt! me a megolds. Vedd szre, hogy a megolds rvidebb, mint az eredeti program, tmbkkel sokat lehet sprolni! Mint mondtam, a tmb alapt pusa brmi lehet, teht tmb is. A tmb alaptpus tmbt tbbdimenzis tmbnek h vjuk s nha nagyon jl tudnak jnni. A plda kedvrt tekintsnk egy ktdimenzis tmbt.
double t[][] = new double[100][100];

Ebben 100x100 double elem van, minden double elem 8 bjtot foglal, teht a tmb mrete 80 kilobjt meg egy pici. Ez mr igazn hatkony eszkz. C mezni a tbbdimenzis tmbt is csak gy kell, mint egy egydimenzist:
t[42][45] = 3.14;

Feladat
rjunk programot, ami kiszmolja a heloszlst v zzel teli csben. Azt tudjuk, hogy cs keresztmetszete ngyzetes, az als oldala egyenletes 12 fokon, a teteje egyenletes 90 fokon van, az oldalfalai mellett pedig a hmrsklet egyenletesen 12-rl 90 fokra emelkedik. Oldjuk meg a feladatot olymdon, hogy a cs keresztmetszett bontsuk kis kockkra, mondjuk 100x100-ra. A legszls kockkat (teht a 0. s 99. sorban ill. a 0. s 99. oszlopban levket) tltsk fel a fix hmrskletrtkekkel, a tbbit meg tetszleges rtkkel, pl. 12 s 90 tlagval. Szmoljuk jra minden nem fix hmrsklet kiskocka hmrsklett gy, hogy az a ngy szomszdjnak az tlaga, rjuk vissza az tlagot a kiskockba s tartsuk szmon, mekkora volt a legnagyobb vltozs az tlagszmts eltti s utni rtkekre vonatkoztatva. Ha egy menetben a legnagyobb hmrskletvltozs nem tbb, mint 0.01 fok, nyomtassuk ki a tmbben trolt rtkeket 4 soronknt ill oszloponknt. me a megolds. Mit befolysol az tlagolson tesett kiskockk kezdrtke?

Ellenrz krdsek
I. II. III. IV. V. VI. Mi a tmb? Mi a tmb alaptpusa? Mi lehet Jvban egy tmb alaptpusa? Mit jelent az, hogy Jvban a tmbt tmbreferencival rhetjk el? Mit trol a tmb length egyedvltozja? Mit jelent, hogy egy tmb objektumreferncikat trol?

VII.

Mit jelent a tbbdimenzis tmb?

10. fejezet
Nem csak szmok vannak a vilgon! Dolgozzunk rdekesebb adatokkal: karakterek s azok halmazai. Karaktertpus a Jvban, a char tpus. Karaktersorozatok avagy ismerkeds a String osztllyal. String s StringBuffer, a kt jbart. Taln mr kicsit unalmas, hogy pldink mindig szmokrl szlnak. Ugyan szvegeket llandan runk ki, de nem tudunk velk olyan knnyedn varilni, mint a szmokkal. Ezen lecke vgre ez a hinyrzetnk is megsznik, mert most a Jva karakterkezelsi eszkzeivel foglalkozunk. A szmtgp ugyanolyan knnyedn trol s manipull karakter tpus adatokat (emlkszel az els leckre? A karakterek a szmtgp ltal brzolhat sszes bet, szmjegy, jel sszessge), mint szmokat. Szmra termszetesen ezen adatoknak semmi jelentse nincsen, az egyms utn trolt a,l,m s a betk semmilyen mdon nem idzik fel benne a gymlcst, mint ahogy a 2001 rtk egsz tpus szm sem jelenti szmra a mostani vet. Minthogy a szmtgp nem magnak szmol, hanem neknk, gy aztn elg, ha a karaktereknek csak szmunkra van jelentse. A karakterek trolsra szolgl alaptpus a char. Egy char tpus vltoz egy karaktert kpes trolni. rtkl ltez karakter tpus rtk vagy karakterkonstans adhat. Plda:
char c; c = 'A';

A c vltoz rtke most teht az 'A' karakter, egszen pontosan annak a kdja. A szmtgp szmokkal kpes dolgozni, gy a karaktereket is szmokknt brzolja, minden karakternek sajt kdja van. A szmtgpes gyakorlatban millifle karakterkdols ltezik, a Jva belsleg a Unicode karakterkszletet hasznlja. A Unicode Jva ltal hasznlt vltozata nem egy, hanem kt bjton r le egy karaktert, gy tbb, mint 65000 karaktert kpes brzolni. A fenti gondolatmenet eredmnye az, hogy char s egsz tpusok egymsba alakthatk, minthogy mindegyik csak egsz szm. Plda:
int i = (int)c; char d = (char)i;

Feladat
rj egy programot, ami kirja a Jva karakterkszletet 32 s 127 kztt, a hatrokat belertve. Egy sorba rd ki a karakter kdjt majd a karaktert magt is s ezt vgezd el az sszes kdra. Nagyon egyszer feladat, remlheten menni fog, ha nem, itt van a megolds.

Igazban az esetek tbbsgben nem egyedi karakterek rdekelnek, hanem azokbl sszelltott sorozatok, karaktersorozatok vagyis npszer angol nevkn stringek. Stringet knnyedn csinlhatnnk karakterekbl ksztett tmb segtsgvel
char string[] = new char[20];

a Jva azonban elzkenyen rendelkezsnkre bocstja a String osztlyt, teljes nevn java.lang.Stringet. A csomagokrl, mint pldul a java.lang majd a kvetkez fejezetben olvasunk, most elg annyi, hogy ez az osztly a beptett osztlyknyvtr rsze s alapbl a rendelkezsnkre ll, nem kell rte semmit tennnk, hogy felbukkanjon. A String egy nem megvltoztathat karaktersorozat. Ez azt jelenti, hogy egy Stringet ha egyszer ltrehoztunk adott szveggel, akkor a szveg a tovbbiakban nem vltoztathat meg. Ez nem tnik tl gretesnek, viszont a megvltoztathatatlan String egyedet felhasznlhatjuk tovbbi Stringek ptsre. Stringet lrtehozni nagyon egyszer.
String s = new String( "Hello, Jva" );

A String teht egy mezei objektum, olyan, amilyeneket eddig lttunk, kivve, hogy nem neknk kellett definilnunk, hanem mr megtettk helyettnk. Az s egy String egyedre mutat referencia, ilyet is lttunk mr. Egy trkk van a kpben: a "Hell, Jva" konstans. A String egy kivteles osztly a Jvban abban a tekintetben, hogy String tpus konstansokat a nyelv kzvetlenl tmogat. A "Hell, Jva" igazbl ltrehoz egy String egyedet, amiben a "Hell, Jva" string van, majd ennek alapjn a new String ltrehoz egy j string egyedet. Nem tl hatkony, n is csak azrt rtam le, hogy hatrozottan megmutassam, hogy a String is csak egy objektum. Igazbl elegend lenne ennyi:
String s = "Hello, Jva";

Nzzk, mit is csinltunk elbb. Itt a soha vissza nem tr alkalom, hogy egy pillantst vessnk a Jva knyvtr le r sra, ami elrhet a weben vagy letlthet a Sun-tl a JDK weblapjrl (a cikk r snak a pillanatban a Java 2 1.3-as vltozata a legjabb. Keressk meg innen kiindulva a JDK API dokumentcijt s nzzk a String lapjt! Megtallhatjuk a vlaszt, hogyan mkdtt az els sor. A Stringnek van egy konstruktora, ami Stringet fogad.
String(String value);

Ezt hasznltuk fel az imnt. Kt sorra bontva:


String t = "Hello, Jva"; String s = new String( t );

De sokat beszltnk errl az egyszer sorrl, nzznk valami rdekesebbet! Tekintsk a kvetkez jl ismert sort:
public static void main( String args[] ) ...

Ht igen, ez a main defincija. Most mr megrthetjk a paramter rszt is: a main egy Stringekbl ll tmbt kap, mindegyik Stringben egy paramter. Ha teht a programot gy h vjuk meg:
java Program P1 P2 P3 P4

akkor a main egy 4-elem tmbt fog kapni, a tmb elemeiben egy-egy String egyedre van referencia, s ezek a String egyedek sorban a P1, P2, P3 s P4 karaktersorozatokat troljk. Amint a tmbknl tanultuk, minden tmbnek van egy length nev egyedvltozja, ami megadja a tmb hosszt. Az sszes paramter ki r sa ezek utn nem nehz:
for( int i = 0 ; i < args.length ; ++i ) System.out.println( args[i] );

rjunk most rvid programot, ami kirja az sszes paramtert, amiben megtallhat az "al" karaktersorozat. Teht ezeket mind kirja: alma, fal, falu de nem rja ki az akol vagy az olaj szavakat. Alaposan vgigtanulmnyozva a String metdusainak le r st, megtalljuk az indexOf(String str) metdust, ami megkeresi a String egyedben, amire megh vtk a paramterl kapott stringet s megmondja a pozcijt ill. -1-et ad vissza, ha nem tallja. A program igazn egyszer, de itt a megolds ellenrzskppen. Ha megvan, rd t gy a programot, hogy a keresett rszletet kiemeli gy, hogy el s mg _ jeleket tesz, pl. _al_ma, t_al. Ehhez a substring metdusra lesz szksged, ellenrizheted a megoldst itt. Szp dolog, hogy van egy megvltoztathatatlan String-nk, de sokkal rdekesebb lenne, ha felhasznlhatnnk ms String-ek alkotsra. Kt String-bl egy harmadikat csinlni Jvban nagyon egyszer, mert String objektumokra definilva van a + opertor s sszefzst jelent. Plda:
String s1 = "eleje"; String s2 = "vge"; String s3 = s1 + s2;

A dolog vgn s3 az "elejevge" szveget fogja tartalmazni. Egy baja van ennek a megoldsnak: ha sokat hasznljuk, jcskn teleszemeteli a memrit, minthogy minden lpsben egy nem vltoztathat String keletkezik. A Jva kszti a vltoztathat StringBuffer knyvtri osztllyal oldottk meg a problmt. A StringBuffer arra val, amire a String nem alkalmas: karaktersorozatok manipullsra. A StringBuffer kpes a benne lev karaktersorozat vgre egy msikat fzni, trlni, fellrni a tartalom egy rszt vagy beszrni tetszleges pontra. A knnyedsgnek persze ra van: a StringBuffer tbb helyet foglal, mint egy String. A legjobb, ha mindkettt a helyn hasznljuk s ez nem nehz, mert mindkettnek van olyan konstruktora, amely Stringet vagy StringBuffert tud csinlni a msikbl. Mondhatjuk teht:
String s = "Hello"; StringBuffer sb = new StringBuffer( s ); String s2 = new String( sb );

Igazbl a Jva fordt a Stringek sszefzst is StringBufferrel oldja meg: eleje-vge pldnknl elszr egy ideiglenes StringBuffer jn ltre, ebben sszefzdik a kt String, majd ebbl legyrtdik az s3-ba kerl eredmnystring. Ha mondjuk egy jfle hurokban tesszk ezt, knnyedn legyrthatunk nhny szz ideiglenes objektumot.

Feladat

rj egy programot, ami sszefzi a paramtereit egy Stringg s ezt a Stringet kirja. A paramterek kztt _ jelek legyenek. Hozz ltre egy StringBuffert, ebben fzd ssze a paramtereket, majd az eredmnyt alaktsd Stringg s rd ki! me a megolds ellenrzskppen.

Ellenrz krdsek
I. II. III. IV. V. VI. VII. VIII. IX. Mi a karakter? Hnyfle jelet kpes trolni a Jva char tpus? Hogy h vjk a Jva ltal tmogatott karaktertpust? Mi a karaktersorozat (string?) Mit jelent, hogy a String nem megvltoztathat? Hogyan lehet egy Stringnek kezdrtket adni? Mire val a String indexOf metdusa? Mire val String substring metdusa? Mi a klnbsg a StringBuffer s a String kztt?

11. fejezet
A Jva osztlyok is csak fjlok; Jva osztlyok elhelyezse s fellelse. Tovbbi koszteremt eszkzk: package s import. J helyek a fjlrendszeren: a CLASSPATH krnyezeti vltoz. Ha tnyleg megcsinltad a feladatokat s nem csak vgigfutottl a megoldsokon (ebben az esetben nem fogsz megtanulni Jvul), a jtkterl szolgl knyvtradban jkora zrzavar lehet mr. Az Elso.java-t mr legalbb hromszor fellrtad klnbz vltozatokkal s ki tudja, mi mkdik ott s mi nem. Ha nhny Jva gyakorlprogrammal ekkora zrzavart lehet csinlni, vajon mire lehet kpes egy csapat termelkeny programoz? Vilgos: vgtelen koszra. A kosz ltszlagos rendezettsgnek nvelsre a Jva bevezeti a csomag (package) fogalmt. A csomag vszesen analg a fjloknl megszokott fjlnv-knytrnv szerkezettel. Minden fjlnak van egy neve, de ez mg kevs az elrshez; ltalban tudni kell azt is, milyen knyvtrban van. Hasonlkppen van ez a Jva osztlyokkal; ltalban nem elg, ha a nevket tudjuk, tudni kell, milyen csomagban vannak. me nhny plda Jva osztlynevekre csomagnevekkel kibvtve. java.awt.color.ColorSpace java.util.Vector pelda.Elso

Az els kett egy-egy tnylegesen ltez Jva knyvtri osztlyt jell. Vegyk a msodikat: ez a java.util csomagban elhelyezked Vector osztly. A harmadik az n agyam szlemnye, de attl mg ltezhet. Mindjrt megltjuk, hogyan! Ha a Jva forrsfjlba betesszk a package direktvt, a fjlban mgtte deklarlt osztlyokat abba a csomagba teszi. pl.
package a.b; class C { ... }

A fenti varzslat eredmnye az, hogy az osztly neve nem egyszeren C, hanem a.b.C lesz, vagyis az a.b csomagban tallhat. Mindez nagyon egyszer, de mi hasznunk ebbl? Hogyan lehet elrni csodlatos a.b.C osztlyunkat? Mi sem egyszerbb ennl. Ha egy osztlyra referencit akarunk gyrtani, az osztly nevt kell hasznlni tpusnak. gy ni:
a.b.C ref = new a.b.C();

Egyszer s elegns, nemdebr? Egy apr problma van a dologgal: elbb-utbb bele fogunk unni hossz nev osztlyunk nevnek gpelsbe, plne, ha nem a.b.C az osztly neve, hanem a fent megemltett java.awt.color.ColorSpace s ezzel mg egy szeldebb pldt vlasztottam. Minthogy a programozk lusta npek, meg lehet ezt szni kevesebb gpelsbl is. Ha a programunk elejre odarjuk az import direktvt, megadhatjuk, milyen osztlyoknl vagy csomagoknl nem akarjuk kirni a teljes nevet. Pldul mondhatjuk azt, hogy
import a.b.C;

Ezzel kijelentettk, hogy az a.b.C osztlyra egyszeren, mint C-re kvnunk hivatkozni ebben a forrsfjlban. Lerhatjuk, hogy
C ref = new C();

Mindjrt bartsgosabb. Ennl tbbet is tehetnk, azt is mondhatjuk, hogy a csomagban tallhat sszes osztlyt egyszerstett formban akarjuk ltni.
import a.b.*;

Ez az a.b csomag sszes osztlyt egyszerstett formban teszi elrhetv. Nagyon fontos megjegyezni, hogy az import direkt va csupn azt befolysolja, hogyan oldja fel a fordt az osztlyneveket. Akrmit is varzsolunk, a lefordtott kdba mindenkppen az a.b.C-re val hivatkozs kerl be, import ide vagy oda. Az import ugyancsak nem tlt be semmit se a trba, mint azt na van hinnnk. Szerepe csupn a gpels cskkentsben van, futsidben semmit se szmt. Mg egy fontos megjegyzs: a fordt minden Jva forrsfjl elejre odakpzel egy import java.lang.*; direktvt, gy a java.lang csomagot mindig importlja. A java.lang csomagban rgi

bartaink vannak, pl. a java.lang.Integer, aminek parseInt metdushoz oly sok kedves lmnynk fzdik, vagy a java.lang.Math, amivel a kapcsolat mr tnyleg mlyebb vlt egyszer bartsgnl. De vissza a package-re! Tekintsk a kvetkez programot! Mi lenne ez ms, mint npszer Elso programunknak egy egyszerstett vltozata azzal a csavarral, hogy a programot befoglal osztlyt pelda.Elso-nek neveztk el. Fordtsd le frgn a javac Elso.java paranccsal, majd futtasd le a java pelda.Elso utastssal. (ne feledd: a java parancsnak a futtatand osztly nevt kell megadni, ebben az esetben pelda.Elso-t). Ilyen egyszer egy osztlyt csomagba tenni. Eeeee ... valami nem stimmel? A java pelda.Elso hatsra nem az unalomig ismert ki r s jelent meg, hanem az, hogy a pelda/Elso osztly nem tallhat. Mindez arra vilgt r, hogy mg mindig nem tudunk mindent az osztlyok betltdsrl. Eddig ezzel nem sokat trdtnk. A lefordtott .class fjlokat az aktulis knyvtrban troltuk s elvrtuk, hogy a virtulis gp megtallja ket. A csomagok bevezetsvel a helyzet megvltozik s meg kell ismerkednnk egy osztlyt tartalmaz .class fjl fellelsnek mdjval. Amikor a virtulis gp meglt egy osztlynevet, azonnal elkezdi keresni a CLASSPATH krnyezeti vltoz ltal megadott knyvtrakban. Ha esetleg nem tudnd, mi a krnyezeti vltoz, me egy kis bevezet: 2. kitr: krnyezeti vltozk A Jva a CLASSPATH krnyezeti vltozt hasznlja a kvetkez mdon. A CLASSPATH rtke knytrak sorbl ll (Windows-on pontosvesszvel, Unix-on kettsponttal elvlasztva). Amikor a rendszer keresni kezdi az a.b.C nev osztlyt, veszi az els knyvtrat a CLASSPATH-en. Ehhez hozzfzi a csomag nevt, gy lesz egy alknytrnv s ebben keresi meg az osztlynv.class fjlt. Ha nem tallja, tovbblp a kvetkez knyvtrra a CLASSPATH-en s ezt addig csinlja, am g a knyvtrak a CLASSPATH-en el nem fogynak. Ha nem tudta megtallni azt osztlyt a CLASSPATH-en felsorolt sszes knyvtrban, hibajelzst kld. Lssunk egy egyszer pldt! Tegyk fel, hogy a CLASSPATH rtke a kvetkez: c:\Users\javadev;c:\Users\javalib Tegyk fel tovbb, hogy a rendszer az a.b.C nev osztlyt keresi. Veszi teht az els knyvtrat a CLASSPATH-en, a c:\Users\javadev-et. Ehhez hozzilleszti a csomagnevet, vagyis az a.b-t s kapja a c:\Users\javadev\a\b knyvtrat. Itt megprblja fellelni a C.class fjlt. Tegyk fel, hogy nem tallta meg. Ekkor tovbblp a c:\Users\javalib-re s megprblja ugyanezt, vagyis felkeresi a c:\Users\javalib\a\b\C.class fjlt. Ha ez megvan, siker. Ha nem, hibazenet. Hosszadalmas magyarzat ut vissza a pelda.Elso alkalmazsra! Ha figyelmesen megtanulmnyozod a n fjlokat a knyvtradban, rjhetsz, hol a hiba: a Jva fordt az aktulis knyvtrba pakolta le a .class fjlt. Ez egy hlye tulajdonsga a javac-nak, amely a Jva els vltozata ta ksrt. Tedd helyre olymdon, hogy ltrehozol egy pelda alknyvtrat s tmozgatod az Elso.class-t ebbe. Tedd meg! Ha most kiadod a java pelda.Elso parancsot, kt dolog trtnhet: vagy mkdik, vagy nem. Sohase tudtam rjnni, mirt, de bizonyos Jva installcik ilyenkor kptelenek megtallni a kurrens knyvtrban elhelyezked alcsomagokat, csak ha varzsolunk a CLASSPATH-szel. He netn ez a hiba tn fel undok fejt, vedd fel az aktulis knyvtrat a CLASSPATH-re.
set CLASSPATH=.

mondd a parancspromptnl Windows-on. Ha most megismtled a parancsot, mkdnie kell. A javac-nak a tulajdonsga, miszerint mindenkppen az aktulis knytrba pakolja a .class fjlt, mg ha az valamilyen csomagba fordtdik igazn kellemetlen s erre a Sun-nl is rjttek. A Javac-ot megh vhatod a nagyszer -d kapcsolval, ekkor ltrehozza a csomagok alknyvtrait s mindent a helyre pakol. Prbld ki! Trld le az elbb ltrehozott pelda alknyvtrat a benne lev Elso.classszel egytt, majd mondd azt:
javac -d . Elso.java

ekkor a pelda alknyvtr rendben ltrejn az aktulis knyvtrban s belekerl az Elso.class. Ekkor mr problma nlkl lehet futtatni a java pelda.Elso paranccsal. A csomagok kezelsnek a lehetsge aprsg a Nagy Egszben, de igazn fontos ket ismerni, ha bele akarunk kalandozni a Jva osztlyknyvtrba.

Ellenrz krdsek
I. II. III. IV. V. VI. VII. Mi a hasonlsg az alknyvtrak s a csomagok kztt? Hogyan kell egy Jva osztlyt egy adott csomagba tenni? Mit jelent a package direktva s mi a paramtere? Hogyan lehet egy csomagban lev osztlyt elrni? Mit egyszerst az import direktva? Hogyan leli fel a virtulis gp a class fjlokat? Mi a CLASSPATH krnyezeti vltoz?

VIII. Mi trtnik, ha a CLASSPATH rtke c:\Users\javalib;c:\Users\enyem s az a.b.C nev osztlyt keressk? IX. X. Hova teszi a javac a lefordtott osztlyokat, ha egyszeren csak a forrsfjl nevvel h vjuk meg? Hogyan lehet elrni, hogy a javac a csomagokat a megfelel alknyvtrba tegye?

12. fejezet
Mindenki a sajt hibinak kovcsa: szemlyre szabott hibajelzsek a Jvban. Kivtelek lete s halla: throw utasts, a throws kulcssz valamint a try-catch blokk.

Feladat

rjunk programot, ami kirja a bementi paramter faktorilist. Ha emlkszel, n faktorilisa az 1-tl n-ig terjed egsz szmok szorzata, 0! = 1. Negatv szmokra a faktorilis nincs rtelmezve. A faktorilis rtkek rendk vl gyorsan nnek, gy 20!-nl nagyobb rtkek a long tpusbl (az int 64 bites vltozatbl) is kilgnak. rj egy fggvnyt, amelyiket meg lehet h vni egy egsz szmmal s visszaadja a faktorilis rtket! A fggvny adjon vissza hibajelzst, ha rvnytelen bemeneti rtket kapott. A main fggvny h vja meg ezt a faktorilisszmt fggvnyt az args[0]-ban kapott bemeneti paramterrel (Integer.parseInt ...) majd rja ki a hibazenetet, ha a faktorilisszmt fggvny hibajelzst adott vissza, klnben rja ki az eredmnyt. A feladat nem okozhat gondot, me a megolds. A programban valban nincs semmi jdonsg. Ugye, a 9. lecke utn nem lep meg, hogy a fakt fggvnynek szintn statikusnak kell lennie? (mivel a statikus main-bl h vjuk) A fakt fggvny nmaga nem rhatja ki a hibajelzst (hiszen a fggvnyben nem tudhatjuk, egyltaln szveges hibajelzst kell-e adnunk, gy szlt a feladat kitzse), ezrt negatv rtkkel jelez hibt. Mivel a faktorilis nem lehet negat v szm, ezt szreveheti a h v fggvny s hibt jelezhet. Nem tl ronda ez? De igen. sszekeveredik itt kt dolog, a fggvny visszatrsi rtke s a hibakd. A mostani helyzet viszonylag egyszer, mivel itt egy hibaeset van s a fggvny bizonyos szmokat nem adhat vissza, nehezebb lenne azonban a dolgunk, ha nem lenne ilyen "res tartomny" a visszatrsi rtkek kztt s tbb hibakdunk lenne. A hibk kultrlt jelzsre a Jva az kivtel (exception) eszkzt adja. A kivtelt gy lehet felfogni, mint egy vszfket. Ha a program futsa sorn kivtel keletkezik (akr a rendszer generl egyet, akr mi generljuk) a futs megszakad s a Jva virtulis gp a kivtel feldolgozsval folytatja a tevkenysgt. Hogy ez pontosan hogyan zajlik, arrl egy kicsit ksbb. Most nzzk meg, hogyan generlhatunk kivtelt. Ez roppant egyszer.
throw new IllegalArgumentException();

A throw utasts paramtere egy kivtelobjektum. A kivtelobjektum pont olyan mezei objektum, mint a tbbi; egyetlen specilis tulajdonsga van: a java.lang.Exception knyvtri objektum leszrmazottjnak kell lennie. A pldnkban szerepl java.lang.IllegalArgumentException is ilyen s is rsze az alap objektumknyvtrnak, teht btran hasznlhatjuk minden tovbbi nlkl. Ugye, emlkszel, hogy a minden Jva program elejre egy import java.lang.*; utastst kpzel oda a fordt, bartainkat teht nyugodtan h vhatjuk Exception-nek s IllegalArgumentException-nek. Kivtelekbl lehet de-luxe vltozatot is ltrehozni, ha gynevezett rszletez zenettel (detail message) hozzuk ket ltre. Van ugyanis nekik egy olyan konstruktoruk, ami egy String-et fogad, itt passzolhat t a rszletez zenet. Ennek a szerepe csupn csak annyi, hogy informacit kzvetthet a kivtelt megkap szmra, pontosan mi is volt a baj. Plda:
throw new IllegalArgumentException( "Az argumentum tl kicsi" );

A metdusban generlt kivteleket mindig deklarlni kell a metdus fejlcben, erre val a throws klauza. Plda:
void func() throws IllegalArgumentException { ... throw new IllegalArgumentException();

... }

A Jva fordtnak mindig megvan a mdja r, hogy sszehasonltsa a metdusban dobott kivteleket a throws utn felsoroltakkal (vesszvel elvlasztva tetszleges szm kivtelt felsorolhatunk) s ha eltrst lt, a maga egyenes, de kiss nyers mdjn hibazenetet kld. Prbld ki!

Feladat
rd t a faktorilisszmt programot gy, hogy a fakt metdus IllegalArgumentException-nel jelezze, ha a metdus hibs bemeneti paramtert kapott. Emitt a megoldas. Futtasd le a programot nhny hibs bemen rtkkel s ellenrizd az eredmnyt! Ilyen vlaszt fogsz kapni:
Exception in thread "main" java.lang.IllegalArgumentException: Tul kicsi bemeneti parameter at Faktorialis2.fakt(Faktorialis2.java:5) at Faktorialis2.main(Faktorialis2.java:15)

Ez egy h vsi verem lista. Azt mondja meg, hogy az els sorban rszletezett kivtel a Faktorialis2 osztly fakt metdusban keletkezett, majd tovbbterjedt a main metdusba (methogy a fakt-ot innen h vtk meg) s ezzel elrte a h vsi verem tetejt, a program futst megszaktotta. Ez azrt volt lehetsges, mert primk programunkban nem okozott gondot, hogy a kivtel megszaktsa a program futst. Normlis esetben azonban ennl kifinomultabb kivtelkezelsre van szksg s erre val a trycatch blokk. A try-catch szintaktikja a kvetkezkppen nz ki:
try { ... utastsok ... } catch( Exception1 e1 ) { ... Exception1 tpus hibt lekezel utastsok ... } catch( Exception2 e2 ) { ... Exception2 tpus hibt lekezel utastsok ... } finally { ... Az egsz blokk legvgn (hiba bekvetkezstl fggetlenl) vgrehajtd utastsok ... }

A try utn bekvetkez blokkban vannak az utastsok, amelyek Exception1 vagy Exception2 tpus hibt generlnak. A fordt ellenrizni fogja, tnyleg megvan-e erre a lehetsg (minthogy a megh vott metdusok throws klauzjbl tudja, azok milyen kivtelt dobhatnak), ha valamelyik kivtel nem kvetkezhet be, hibazenetet ad. Ha nem trtnik hiba, a try blokk rendben vgrehajtdik s a finally mgtt lev blokkal folytatdik a program futsa. Ezen blokk vgrehajtsa utn a szerkezet vgetr. Ha azonban a try blokkban kivtel kvetkezik be, a blokk futsa megszakad s a kivtelobjektum (amit a throw-val generltunk) berdik a megfelel catch blokk referenciavltozjba. Ha pldul Exception1 kvetkezett be, az e1 mutat a kivtelobjektumra, amikor a catch blokkba kerlnk s a futs az Exception1 catch blokkjban folytatdik. Ezt elvgezve a finally blokkja kerl sorra, majd

elhagyjuk a szerkezetet. Egynl tbb catch blokk s a finally blokk opcionlis. Legegyszerbb formjban a szerkezet gy nz ki:
try { ... utastsok ... } catch( Exception1 e1 } { ... Exception1 tpus hibt lekezel utastsok ... }

Mostanra eljutottunk oda, hogy le tudjuk rni, pontosan mi trtnik egy kivtel keletkezsekor. Kivtel keletkezsekor a program futsa megszakad s megszakad a h v is, ha nem definilt trycatch blokkot a kivtelre, hanem a throws klauzval azt jelezte, hogy tovbb akarja dobni. gy megy ez addig, am g a h vsi lnc tetejre nem rnk (mint elz pldnkban) vagy bele nem tkznk egy aktv tr -catch blokkba. Ekkor a try blokk megszakad s a futs a megfelel catch blokkon folytatdik. A fentiekbl kvetkezik, hogy ha egy metdust megh vunk, ami dobhat valami kivtelt s ezt jelzi is a throws klauzjban, akkor kt eset lehetsges: vagy elkapjuk try-catch-csel, vagy tovbbdobjuk throws-szal. Harmadik eset nincs, az sszes tovbbi prblkozs szintaktikai hiba. Egy teljesen logikus dolgot megemltenk, amiba kezd, de mg tapasztaltabb Jva programozk is beleesnek: a try blokk minden utastst gy tekinti a fordt, hogy az esetleg nem hajtdik vgre, ezrt a try blokkban elkvetett vltozinicializlsokat nem veszi figyelembe, amikor azt nzi, hogy inicializltk-e a vltozt. A kvetkez teht szintaktikai hiba:
int i; try { i = 1; ... } catch( Exception1 ex ) { ... } System.out.println( "i: "+i );

A System.out.println sornl a fordt figyelmeztetni fog, hogy az i vltozt nem inicializltuk. Ezt a megnyugtatsra meg kell tennnk, teht int i = 0; szksges. Mieltt lecknk zrfeladathoz rkeznnk, mg egy pr szt a nem jelzett kivtelekrl. Ezek valban kivtelesek, mert ltalban rendszerszint programrszek generljk ket gpi kd rszekbl. Sok esetben nincsenek throws-szal jellve, hiszen nagyon sokfle utasts vgrehajtsakor keletkezhetnek. Ilyen pl. minden Jva programoz legszintbb bartja, a NullPointerException, ami akkor lesz, ha null rtk referencit akarunk felhasznlni egy objektumhivatkozsban. Ezt nem metdusok dobjk, hanem rtalmatlan sorok pl. ref.valtozo formj hivatkozs. Nem jelzett kivteleket is elkaphatunk, ha a problms krnykre egy try-catch blokkot teleptnk a catch gban minden kivtel svel, az Exception tpussal. Plda:
Object o = null; try { o.toString(); } catch( Exception ex ) { ... NullPointerException-t lekezel programrsz ... }

Feladat

Bvtsd ki elz programunkat gy, hogy a keletkez kivtelt a main-ben kapd el s rd ki valami kultrlt formban. Hasznld az Exception objektum getMessage() metdust, amivel megszerezheted a rszletez zenetet a catch blokkban. Emitt a megolds.

Ellenrz krdsek
I. II. III. IV. V. VI. VII. VIII. Mi a kivtel? Hogyan lehet kivteleket ltrehozni? Kell-e deklarlni a metdusban ltrehozott kivteleket s ha igen, hogyan? Mire szolgl a try-catch? Hny catch ga lehet egy try-catch szerkezetnek? Hny finally ga lehet egy try-catch szerkezetnek? Mi a teend, ha metdusunk olyan msik metdust h v meg, ami kivtelt generlhat? Mik a nem jelzett kivtelek s hogyan lehet elkapni ket?

You might also like