A 2019-es középszintű matematika érettségi feladatsor 16. feladata inspirált arra, hogy a programozás eszköztárával oldjuk meg ezt a feladatot. Szükséges hozzá néhány programozási tétel: sorozatszámítás, eldöntés, szélsőérték-kiválasztás, másolás. Érdekes belegondolni, hogy mennyire más lehetne a problémamegoldás, ha programozhatnánk a matematika érettségi vizsgán. A teljes feladatsor a megoldásokkal együtt letölthető az oktatas.hu-ról.
16. a) feladat
Péter elhatározza, hogy összegyűjt 3,5 millió Ft-ot egy használt elektromos autó vásárlására, mégpedig úgy, hogy havonta egyre több pénzt tesz félre a takarékszámláján. Az első hónapban 50000 Ft-ot tesz félre, majd minden hónapban 1000 Ft-tal többet, mint az azt megelőző hónapban. (A számlán gyűjtött összeg kamatozásával Péter nem számol.) Össze tud-e így gyűjteni Péter 4 év alatt 3,5 millió forintot?
1. megoldás
1 2 3 4 5 |
static void feladat16a1() { int n=48, a1=50000, d=1000, an=a1+(n-1)*d, sn=(a1+an)*n/2; System.out.println("1. megoldás: összeg = "+sn); } |
Az 1. megoldás egyszerűen behelyettesít a számtani sorozat n-edik elemének ( an) és n-edik összegének ( sn) képleteibe. A kérdés (eldöntés): eléri-e az összeg a 3,5 millió Ft-ot? A válasz igen: a 48. iteráció/hónap után 3528000 Ft-ot kapunk.
2. megoldás
1 2 3 4 5 6 7 8 |
static void feladat16a2() { int n=48, a1=50000, d=1000, sn=0; for(int i=1; i<=n; i++) { int an=a1+(i-1)*d; sn+=an; } System.out.println("2. megoldás: összeg = "+sn); } |
A 2. megoldás a sorozatszámítás programozási tételt használja. Minden hónapra (1-től 48-ig) meghatározzuk az aktuális havi összeget ( an) és növeljük vele a gyűjtőt ( sn).
3. megoldás
1 2 3 4 5 6 7 8 9 10 |
static void feladat16a3() { int n=48, a1=50000, d=1000, elozoHaviOsszeg=a1, sn=elozoHaviOsszeg; for(int i=2; i<=n; i++) { int haviOsszeg=elozoHaviOsszeg+d; sn+=haviOsszeg; elozoHaviOsszeg=haviOsszeg; } System.out.println("3. megoldás: összeg = "+sn); } |
A 3. megoldás során az első hónapot külön kezeljük és a d differenciát/növekményt is folyamatosan – az előző havi összegből kiindulva – növeljük a ciklusban a 2.-tól a 48. hónapig 1000 Ft-tal.
4. megoldás
1 2 3 4 5 6 7 8 9 10 |
static void feladat16a4() { int n=0, a1=50000, d=1000, sn=0, maxOsszeg=3500000; while(sn<maxOsszeg) { int an=a1+n*d; sn+=an; n++; } System.out.println( "4. megoldás: összeg = "+sn+", hónap = "+n); } |
A 4. megoldás során megváltozik a kérdés: hányadik hónapban érjük el (vagy haladjuk meg) a 3,5 millió Ft-ot? A válasz: a 48. hónap/iteráció után és 3528000 Ft-ot kapunk.
16. b) feladat
A világon gyártott elektromos autók számának 2012 és 2017 közötti alakulását az alábbi táblázat mutatja.
Szemléltesse a táblázat adatait oszlopdiagramon!
Ezt most itt nem részletezem, mert hasonló grafikonrajzolásról blogoltunk máshol/máskor lásd:
16. c) feladat
Péter az előző táblázat adatai alapján olyan matematikai modellt alkotott, amely az elektromos autók számát exponenciálisan növekedőnek tekinti. E szerint, ha a 2012 óta eltelt évek száma x, akkor az elektromos autók számát (millió darabra) megközelítőleg az f(x)=0,122*20,822x összefüggés adja meg. A modell alapján számolva melyik évben érheti el az elektromos autók száma a 25 millió darabot?
1. megoldás
1 2 3 4 |
static void feladat16c1() { double x=Math.log(25/0.122)/Math.log(2)/0.822; System.out.println("x: "+x); } |
Egyszerű átrendezést és behelyettesítést követően az x: 9.341731310065603 eredményt kapjuk. Ebből következtethető, hogy 2012 után a 10. évben (azaz 2022-ben) érheti el az elektromos autók száma a 25 millió darabot.
2. megoldás
1 2 3 4 5 6 7 8 9 |
static void feladat16c2() { double f=0, x=0; while(f<25) { f=0.122*Math.pow(2, 0.822*x); System.out.println("x: "+String.format("%.2f", x)+ ", f: "+String.format("%.2f", f)); x+=0.1; } } |
A függvény behelyettesítését tizedenként közelítve végzi a ciklus, amíg el nem éri a 25-öt. Az utolsó eredményből ( x: 9,40, f: 25,84) ugyanaz következtethető, mint az 1. megoldásnál.
16. d) feladat
Egy elektromos autókat gyártó cég öt különböző típusú autót gyárt. A készülő reklámfüzet fedőlapjára az ötféle típus közül egy vagy több (akár mind az öt) autótípus képét szeretné elhelyezni a grafikus. Hány lehetőség közül választhat a tervezés során? (Két lehetőség különböző, ha az egyikben szerepel olyan autótípus, amely a másikban nem.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
static void feladat16d() { String[] autoTomb={ "Hyundai Kona Electric", "Kia Soul EV", "Nissan Leaf", "Peugeot iOn", "Renault Zoe"}; for(int i=1; i<=31; i++) { String i2=String.format("%05d", new BigInteger(Integer.toBinaryString(i))); System.out.print(i+"(10) = "+i2+"(2): "); for(int j=i2.length()-1; j>=0; j--) if(i2.charAt(j)=='1') System.out.print(autoTomb[autoTomb.length-1-j]+", "); System.out.println(); } } |
A metódust futtatva az alábbi eredményt kapjuk. 31-féle különböző reklámfüzet fedőlap készíthető:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
1(10) = 00001(2): Hyundai Kona Electric, 2(10) = 00010(2): Kia Soul EV, 3(10) = 00011(2): Hyundai Kona Electric, Kia Soul EV, 4(10) = 00100(2): Nissan Leaf, 5(10) = 00101(2): Hyundai Kona Electric, Nissan Leaf, 6(10) = 00110(2): Kia Soul EV, Nissan Leaf, 7(10) = 00111(2): Hyundai Kona Electric, Kia Soul EV, Nissan Leaf, 8(10) = 01000(2): Peugeot iOn, 9(10) = 01001(2): Hyundai Kona Electric, Peugeot iOn, 10(10) = 01010(2): Kia Soul EV, Peugeot iOn, 11(10) = 01011(2): Hyundai Kona Electric, Kia Soul EV, Peugeot iOn, 12(10) = 01100(2): Nissan Leaf, Peugeot iOn, 13(10) = 01101(2): Hyundai Kona Electric, Nissan Leaf, Peugeot iOn, 14(10) = 01110(2): Kia Soul EV, Nissan Leaf, Peugeot iOn, 15(10) = 01111(2): Hyundai Kona Electric, Kia Soul EV, Nissan Leaf, Peugeot iOn, 16(10) = 10000(2): Renault Zoe, 17(10) = 10001(2): Hyundai Kona Electric, Renault Zoe, 18(10) = 10010(2): Kia Soul EV, Renault Zoe, 19(10) = 10011(2): Hyundai Kona Electric, Kia Soul EV, Renault Zoe, 20(10) = 10100(2): Nissan Leaf, Renault Zoe, 21(10) = 10101(2): Hyundai Kona Electric, Nissan Leaf, Renault Zoe, 22(10) = 10110(2): Kia Soul EV, Nissan Leaf, Renault Zoe, 23(10) = 10111(2): Hyundai Kona Electric, Kia Soul EV, Nissan Leaf, Renault Zoe, 24(10) = 11000(2): Peugeot iOn, Renault Zoe, 25(10) = 11001(2): Hyundai Kona Electric, Peugeot iOn, Renault Zoe, 26(10) = 11010(2): Kia Soul EV, Peugeot iOn, Renault Zoe, 27(10) = 11011(2): Hyundai Kona Electric, Kia Soul EV, Peugeot iOn, Renault Zoe, 28(10) = 11100(2): Nissan Leaf, Peugeot iOn, Renault Zoe, 29(10) = 11101(2): Hyundai Kona Electric, Nissan Leaf, Peugeot iOn, Renault Zoe, 30(10) = 11110(2): Kia Soul EV, Nissan Leaf, Peugeot iOn, Renault Zoe, 31(10) = 11111(2): Hyundai Kona Electric, Kia Soul EV, Nissan Leaf, Peugeot iOn, Renault Zoe, |
A megoldást valósnak tekinthető adatokkal konkretizáltam. Az autók nevét ötelemű tömb ( autoTomb) tárolja. A számok 1-től 31-ig (tízes számrendszerben) öt biten 00001-től 11111-ig ábrázolhatók (vezető nullákkal) kettes számrendszerben. A bináris alakban előforduló 1-es bit jelöli a kiválasztott autó nevének autoTomb.length-1-j képlettel korrigált indexét (0-tól 4-ig) a tömbben.
A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
Ajánljuk matematika érettségi feladat címkénket, mert a témában évről-évre blogolunk.
A feladat a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 5-8. óra: Vezérlési szerkezetek, 13-16. óra: Tömbök, valamint 21-24. óra: Objektumorientált programozás, 2. rész alkalmaihoz kötődik.
Izgalmas lenne a d) részfeladatot rekurzívan megoldani úgy, hogy kollekciót kap paraméterként a metódus (amiből kiválogat) és listák listáját adja vissza (amiket kiválogatott). Biztos gondoltatok erre is:
[a1]
[a2]
…
[a1, a2]
[a1, a3]
…
[a1, a2, a3]
…
[a1, a2, a3, a4]
…
[a1, a2, a3, a4, a5]
Jó ötlet Péter, köszönöm. Van még többféle megoldásunk is, de mindent nem rakunk ki a szakmai blogba ;-). Ezek elérhetőek ILIAS-on a hallgatóink számára.