Bármely java utasítást azonosíthatunk úgynevezett
címkékkel.
Szerkezete:
cimke: utasítás
Egyszerû példa egy ciklusból való kilépés való kilépés:
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 futása megszakad abban az esetben, ha (i>5).Nézzük mi is történik! Elôször is elhelyeztünk egy cimkét a küsõ ciklusfej elé, mely azonosítja a ciklust.Ezután a küsõ ciklust bizonyos feltétel fennállása esetén megszakítjuk, vagyis kilépünk belôle. Ez azt jelenti, hogy a vezérlés (végrehajtás) a külsõ ciklusmag utáni, tehát a ciklust követô utasításra kerül. A break utasítás, tehát arra szolgál, hogy egy ciklust, illetve egy programblokkot elhagyhassunk vele.
A másik lehetôségünk egy ciklus normál
menetének megváltoztatására a continue utasítás.
Amennyiben continue szerepel a ciklusmagban egy feltétel után,
akkor a feltétel teljesülése esetén a ciklusmagban
lévô további utasítások nem kerülnek
végrehajtásra, a vezérlésa ciklusfejre kerül.
Épp úgy, mint a break esetében,a continue-val sem
lehet függvénybôl vagy inicializáló programblokkból
kilépni.
Mit ír ki a képernyõre az alábbi programrészlet utolsó utasítása?
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 szeretnénk kímélni magunkat attól, hogy bonyolult feltételeket írjunk a ciklusmagba.
Feladat
1. Készítsünk programot,
mely 1-100-ig kiírja a 3-al, 5-el és 7-el nem osztható
számokat. A ciklusmagban használjuk a continue utasítást!
Megoldás itt.
Aki megnézte a másodfokú egyenlet megoldó
programjának megoldását, az valószínûleg
bonyolultnak találta a sok 'if'-es szerkezetet. Ennek orvoslására
a JAVA felkínálja a switch-case szerkezetet. Ezzel
az utasítással töbszörös elágazást
valósíthatunk meg egy egész értékû
kifejezés értékei szerint.
Példaként tekintsük az alábbi programrészletet:
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("Gratulálok!"); } }Mi történik abban az esetben, ha n=5 és mi, ha n!=5? Amikor a case ág végén break szerepel, akkor a vezérlés kilép a switch utasításból; amennyiben nincs break, a végrehajtás a következô cimkén folytatódik. A default (alapértelmezett) ág használata opcionális.
A teljes programot itt találod.
Feladat
2. a) Készítsünk programot,
mely a fôprogram paraméterként kapott 1..7 közötti
egész szám, mint sorszám függvényében
kiírja szövegesen a hét megfelelô napját!
Megoldás itt.
b) Vegyük alapul
a 2001. évet. Fejlesszük tovább az elõzõ
programot úgy, hogy a fõprogram két bemenõ
paraméterét, rendre a napot és hónapot, értékelje
ki és modja meg, hogy az így megadott dátum
a hét melyik napja. A megoldás itt
található. Most készítsünk egy új változatot,
ami ugyancsak a 2001 évre érvényes, egy hónapszámot vár
paraméterül és kinyomtatja az adott hónap naptárát csinos
formában, ahogy a zsebnaptárokon megszokott.
Ellenôrizd a megoldást itt!
Egyenletrendszerek megoldása
A lineáris egyenletrendszerek elég fontos
szerepet játszanak a természettudományokban, különösen
a matematika néhány területén. Nem árt
megismernünk néhány megoldási módszert,
s persze ennek JAVA megvalósítását is.
Középiskolában találkoztunk
a 2 ismeretlenes lineáris egyenletrendszerrel.
I. a*x+b*y=p
II. c*x+d*y=q
ahol a,b,c,d, p, q az egyenlet (például valós)
konstansai, míg x1, x2 valós változók, az egyenletrendszer
ismeretlenei.
Ennek megoldása nem jelenthet túl nagy gondot, hiszen a változó helyettesítés módszerével könnyen célt érünk. Kiválasztjuk az egyik egyenletet, az egyik ismeretlent kifejezzük, majd az így kifejezett ismeretlent behelyettesítjük a másik egyenletbe, mely így márcsak egy ismeretlent tartalmaz. Kiszámítva az ismeretlen konkrét értékét, azt visszahelyettesítve a másik, már kifejezett ismeretlent tartalmazó egyenletbe, kész vagyunk.
Példa:
Oldjuk meg a valós számok halmazán az alábbi 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 másik, az egyenlô együtthatók módszere,
amikor is a két egyenlet mindkét oldalát úgy
szorzom meg konstans értékekkel, hogy az egyik ismeretlen
együtthatói megegyezzenek. Ha például az x ismeretlen
kiküszöbölése a célunk a fenti általános
egyenletrendszerbôl, akkor az elsô egyenletet LKKT(a,c)/c-vel,
míg a második egyenletet LKKT(a,c)/a-val kell megszoroznunk,
ahol a LKKT a két szám legkisebbközös többszöröse.
[A LKKT-t legyszerûbben úgy számíthatjuk
ki, ha a két szám szorzatát elosztom a legnagyobb
közös osztójukkal (LNKO).
Ha ez bonyolultnak tûnik, akkor megfelelô a c-vel,
illetve
a-val történô szorzásis.]
Ezután az egyik egyenletbôl kivonom a másikat,saz
így kapott egyenlet már csak 1 ismeretlent tartalmaz.
Nézzük meg az elôzô egyenletrendszer megoldását az egyenlô együtthatók módszerével 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 két módszer egyenértékû, bármlyikkel dolgozhatunk. A megoldások vizsgálata során 2 esetre kell kitérnünk.
1. Létezik olyan eset, amikor a két egyenlet egymással
ekvivalens. Ilyenkor az egyenletrendszer határozatlan, azaz
az egyik ismeretlent tetszôleges t valós paraméternek
választva, kifejezhetjük a másikat, vagyis ekkor végtelen
sok megoldás létezik.
2. Lehetséges az is, hogy az egyenletrendszer megoldása
során ellentmondásra jutunk (tipikusan akkor, ha az átalakítások
soárn azt tapasztaljuk, hogy a 2 egyenlet bal oldala egyenlô,
míg jobb oldaluk nem). Ekkor nincs megoldás.
Íme, egy egyszerû feltétel a határozatlanság,
illetve ellentmondásosság vizsgálatára. Ha
a fenti általános egyenletrendszerben:
a*d-b*c==0 és
1) p*c==a*q, akkor az egyenletrendszer határozatlan;
2) p*c!= a*q, akkor az egyenletrendszer ellentmondásos.
Feladat
A fenti ismeretek értelmében írjunk programot, mely megold egy 2 ismeretlenes, lineáris egyenletrendszert a megoldási lehetôségek teljes vizsgálatával! A mogoldást itt találod.
A helyzet kicsit bonyolultabb 3 ismeretlenes egyenletrendszerek esetén.A
megoldási módszerek ismeretéhez szükség
van egy kis felsôbb 'matek'-ra.
Az elsô fogalom, amit bevezetünk aza
mártix.
Egy mátrixot elég úgy elképzelnünk,mint
egy n*m-esszámtáblázatot. A mátrix elemeire
indexeléssel tudunk hivatkozni. Az a(i,j) elem a mátrix i.
sorának j. oszpában lévô elemet jelenti. Középsikolában
tanultuk a vektorfogalmát. Nos, a mátrix úgy
is elképzelhetô, mintegy olyan sorvektor, melynek elemei oszlopvektorok
vagy fordítva: olyan oszlopvektor, melynek elemei sorvektorok.
Az alábbi példa egy 3*3-as mátrixot mutat:
Elnevezési konvenció, hogy a mátrixokat nagybetûvel,
elemeit pedig az adott nagybetû indexelt kisbetûivel jelöljük.
Ha a fenti mátrixot A-val jelöljük, akkor elemeire
könnyen hivatkozhatunk:
a(1,1)=2, a(1,2)=3, ..., a(3,2)=4, a(3,3)=3
A mátrixok szép matematikai struktúrákat
alkotnak és nagyszerû példaprogramokat lehet rá
írni,de ehhez szükség lenne arra, hogy indexelt adatstruktúrákat
könnyebben kezeljünk. Ennek lehetôsége egy késôbbi
fejezetben nyílik meg számunkra, amikor is a JAVA tömb
kezelését tanuljuk. A fenti példa mátrix sorfolytonos
felírása alatt az
A=(2 3 1; 4 2 4; 1 4 3)
jelölést értjük.A 3 ismeretlenes egyenletek
megoldásához a mátrixoknak egy fontos jellemzôjét,a
determinánst, kell megértenünk. Egy n*n-es mátrix
fôátlóját
az a(1,1), a(2,2), a(3,3), ..., a(n,n) elemek alkotják, formálisan:
a(i,i) ahol i=1..n
A másik átlóban elhelyezkedô elemek a mellékátlót alkotják.
A determináns. Az A mátrix determinánsát
detA-val
jelöljük.
1. Egy 1*1-es mátrix determinánsa maga az egyetlen eleme.
2. Egy 2*2-es mátrixdeterminánsa alatt a fôátlóban
illetve mellékátlóbanlévô elemek szorzatának
küléönbségétértjük.
Példa:
Legyen
Ekkor detB=det(5 3; 4 2)=5*2-4*3=10-12=-2.
Tovább lépünk egyet. Egy n*n-es mátrix egyik
eleméhez tartozó aldeterminánsa alatt azt az
(n-1)*(n-1)-es determinánst értjük, mely azon mátrixnak
a determinánsa, mely az adott elemhez tartozó sorba, illetve
oszlopban szereplô elemek törlésével keletkezik.
Egy 3*3-as mátrix determinánsát úgy képezzük,
hogy kiválasztjuk az egyik sort/oszlopot és egy olyan elôjelben
alternáló összeget képezünk, melynek tagjai
a kiválasztott sor/oszlop elemei megszorozva az elemhez tartozó
2*2-es aldeterminánsokkal.
Ez a fenti 3*3-as példa mátrixra nézve, kiválasztva
például az elsô oszlopot az alábbiak 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ó aldetermináns az
elsô sor és elsô oszlop törlésével
keletkezô almátrix determinánsa, az a(2,1) elemhez
a második sor és az elsô oszlop törlésével
kapott 2*2-es mátrix- , s végül az a(3,1) elemhez pedig
a 3. sor és elsô oszlop törlésével kapot
2*2-es mátrix determinánsa tartozik.
Formálisan egy n*n-es A mátrix determinánsa a
k. oszlop szerint kifejtve:
elemhez tartozó aldetermináns.
Egy A mátrix egy
oszlopvektorral való szorzatán azt az oszlopvektort értjük,
melynek i. komponense az a(i,1)*x1+a(i,2)*x2+...+a(i,n)*xn összeg.
Formálisan, ha A n*n-es mátrix és x n-dimenziós
oszlopvektor, akkor
Ezzel el is érkeztünk ahhoz a ponthoz, ahonnan foglalkozhatunk
az eredeti problémánkkal.
A fenti módszerrel egy egyenletrendszer együtthatói
egy mátrixot, egy ún. együttható-mátrixot
alkotnak, míg a kiszámítandó ismeretlenek egy
oszlopvektort. Ezáltal az egyenletrendszer egyszerûen
Ax= b
alakban írható fel.
Például a 3*3-as esetben:
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 többismeretlenes egyenletrendszerek megoldására
az egyenlô együtthatók módszerének általánosítása
a
Gauss-féle elimináció, illetve a változó
helyettesítés módszerének általánosításaként
ismert Cramer-szabály kiválóan alkalmas. A
Gauss-féle elimináció JAVA megvalósítása
a még nem tanult tömb adatszerekezet ismerete nélkül
igencsak körülményes lenne, így most a Cramer-szabályt
ismerjük meg.A dolog elég egyszerû, mindössze a
fentiekben megtanult 3*3-as determinánsok számítását
kell gyakorolnunk.
Amennyiben az A mátrix determinánsa nemzérus
(detA!=0), akkor az x1, x2, x3 (...xn) ismeretlenek elôállnak
a következô hányadosok képzésével:
D1/detA, D2/detA, D3/detA,
ahol D1, D2, D3, ... azon mátrixok determinánsai, melyeket úgy képezünk, hogy az A mátrix 1, 2, 3, ...oszlopait kicseréljük a jobb oldalon szereplô b együttható vektor elemeivel kicseréljük.
Például:
Amennyiben az együttható mátrix determinánsa
nemzérus, akkor az egyenletrendszer határozatlan, ennek vizsgálatára
azonban további matematikai ismeretek hiányában nem
térünk ki.
Nézzünk egy konkrét példát a Cramer-szabály
alkalmazásával történõ megoldásra!
1) 4x1-3x2+ x3=2
2) x1+ x2-2x3=9
3) 2x1+ x2-3x3=14
azaz mátrixos alakban:
A determinánsokat 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 módon a Cramer-szabály szerint:x1=-4/-2=2
x2=-2/-2=1
x3=6/-2 =-3 Visszahelyettesítéssel ellenôrizve
kész vagyunk.
Feladat
A fenti ismeretek értelmében készítsünk programot, mely megold egy 3*3-as, lineáris egyenletrendszert! A program tartalmazzon függvényt a 2*2-es, illetve 3*3-as determináns kiszámítására, valamint vizsgálja meg az alapmátrix determinánsának nemzérus voltát. A megoldást itt találod.