6. fejezet

További gyakorló feladatok matematikai problémák megoldására. Cimke. Többszörös elágazás. Kilépés programblokkból: break. Kilépés ciklusból: continue. 2 ismeretlenes lineáris egyenletrendszerek megoldási módszerei és azok JAVA nyelvû megvalósítása. A mátrixelmélet elemei: mátrix, determináns. A 3- és többismeretlenes egyenletrendszerek megoldási lehetõségei és JAVA nyelvû megvalósítása.

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.
2 féle használata létezik:
   break; - ekkor a vezérlés a break-et tartalmazó utasításblokkból kilép.
   break cimke; - ekkor pedig a cimkével megjelölt blokkot hagyjuk el.
Ha a fenti példában a break cimke nélkül állna, akkor csak a belsõ ciklusbõl lépnénk ki.
Jól jegyezzük meg, hogy a break utasítás nem alkalmas függvénybôl (metódusból - lásd késôbb) vagy inicializáló blokkból való kilépésre.

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.
Ily módon, ha n=1, akkor a break miatt kilépünk a swith utasításból, míg,  n=5 esetén break hiányában a deafult ág is végrehajtódik, vagyis gratulálunk a jeles osztályzathoz.

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:
matrix1
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
 


matrix2


 


 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:
 


matrix1


 


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:
 
 


det


 






elemhez tartozó aldetermináns.

Egy A mátrix egy
 


x

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

Ax

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:

33er
Vegyük észre, hogy az ábrában szereplô A mátrix-ot soronként megszorozva az x oszlopvektor elemeivel, akkor éppen az egyenletrendszerünk 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 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:
 


d1


 


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:
 


pelda33

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.

Ellenõrzõ kérdések

1. Mit nevezünk cimkének, hogyan cimkézhetünkutasításokat?
2. Ismertesd a többszörös elágazás készítésére alklamas utasítást!
3. Ismertesd a break utasítás használatát!
4. Mire használhatjuk a continue utasítást?
5. Mikor nem használhatunk case és continue utasításokat?
6. Milyen módszereket ismersz 2*2-es, linaáris egyenletrendszer megoldására?
7. Mikor mondunk egy 2*2-es egyenletrendszert határozatlannak, illetve ellentmondásosnak? Hány megoldás létezik ezekben az esetekben?
8. Mit nevezünk mátrixnak?
9. Definiáld az alábbi fogalmakat!
    Egy mátrix
        - fôátlója,
        - mellékátlója,
        - determinánsa (2*2-es és 3*3-as esetben).
10. Mit értünk egy A n*n-es mátrix x n-dimenziós oszlopvektorral való szorzatán?
11. Hogyan hozható kapcsolatba az egyenletrendszerek megoldása és a mátrixok?
12. Ismertesd a Cramer-szabály-t 3 ismeretlenes, elsôfokú egyenletrendszerek esetén! Mi a megoldhatóság feltétele?

Kovetkezo leckeTartalomjegyzek