Egy matematika érettségi feladat megoldása programozással 2019

érettségi logó

érettségi logó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

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

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

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

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.

16_feladat_b_táblázat

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

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

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.)

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

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.

Digitális Témahét 2019

A Digitális Témahét 2016-ban indult országos rendezvénysorozat. Fő célja a digitális pedagógia módszertanának népszerűsítése és elterjesztése. A program fontos törekvése, hogy a digitáliskompetencia-fejlesztés az informatikán túl kiterjedjen más tantárgyakra is. A résztvevő pedagógusok és diákok változatos és kreatív iskolai projektek keretében fejleszthetik képességeiket technológiával támogatott tanulás során. A Digitális Témahét rendezvény minden meghirdetett programja ingyenes.

A 2018/2019-es tanévben a rendezvény április 8-12. között valósul meg. Kiemelt témakörök/szempontok:

  • a multidiszciplináris megközelítés: a matematika, a természet- és mérnöki tudományok, valamint a művészet- és társadalomtudományok együttes megjelenítése;
  • a digitális technológia alkotó használata és az algoritmikus gondolkodás fejlesztése;
  • a kiemelt figyelmet igénylő tanulók fejlesztése és bevonása;
  • a nevelési-oktatási intézmények közötti együttműködés élénkítése;
  • a határon túli magyar pedagógusok és oktatási intézmények bevonása;
  • ebben a tanévben is a digitális gyermekvédelem, a médiatudatosság, a közgyűjtemények digitális tartalmainak nevelésben, oktatásban történő megjelenése.

Az it-tanfolyam.hu 2019-ben is csatlakozott a rendezvénysorozathoz. Meghirdettünk hat programot a https://digitalistemahet.hu weblapon. A programjainkra 2019. április 6-án 9:00-12:00 óráig kerül sor.

Rendezvényünk plakátja

Ízelítő a meghirdetett programból

Bemutatjuk, hogy lottószelvények előállítása során nem mindig mehetünk biztosra. A problémák szintje különböző:

  • elemi probléma: egyetlen 1 és 90 közötti egész véletlenszám előállítása,
  • lokális léptékű probléma: egyetlen ötöslottó-szelvény előállítása, azaz 5 db különböző 1 és 90 közötti egész véletlenszám előállítása,
  • globális léptékű probléma: sok különböző ötöslottó-szelvény előállítása.

Sok olyan algoritmust és implementált Java programot ismerünk, oktatunk, amelyek biztosra mennek. Másképpen: képesek érvényes szelvényt generálni. Kísérletet végzünk, mi történik, ha nem megyünk mindig biztosra. Például, mi történik, ha a lokális léptéknél nem figyelünk a véletlenszámok különbözőségére. Generálunk 1000 számsorozatot, és kiválogatjuk a pozitív teszteseteket, azaz ezek közül azokat a számsorozatokat, amelyek érvényes lottószelvények. Megkapjuk, hogy 89% körül ingadozik a helyes és 11% körül pedig a hibás tesztesetek aránya.

Átgondoljuk, miket tehetünk, ha egy ilyen nem tökéletes, nem biztosra menő implementált algoritmus köré kell építeni olyan környezetet, hogy szükség esetén vissza tudjunk kapni előre megadott számú érvényes lottószelvényt. Vajon hogyan alakul a 89-11 arány a hatoslottó, heteslottó esetén? Ki fog derülni. Például, mi történne, ha sok gépi szelvénnyel játszunk és van közöttük két azonos nyertes szelvény? Gondot jelent ez? Meg kell oldani, hogy ez ne forduljon elő? Ha igen, hogyan? Ha nem, miért nem? Ez is ki fog derülni.

Köszönöm oktató kollégáimnak, hogy örömmel csatlakoztak szakmai előadással, interaktív kódoló-tesztelő foglalkozással, gamifikációs elemekkel. Biztosan jól fogjuk érezni magunkat. Bízom abban, hogy jó hangulatú, valódi szakmai párbeszéd alakul majd ki a jelenlévők és köztünk a rendezvényünkön. Várjuk a jelentkezőket, hogy Java programozáshoz kötődően együtt töltsünk egy izgalmas szombat délelőttöt. A részvétel ingyenes, de előzetes regisztrációhoz kötött.

ASCII művészet Java-ban

ASCII Art 4

ASCII Art 1Átte­kint­jük a ka­rak­ter­a­la­pú raj­zo­lás le­he­tő­sé­ge­it Java 2D gra­fi­ká­val, illetve a ka­rak­ter­fü­zé­rek kép­ként va­ló ke­ze­lé­sé­nek újabb le­he­tő­sé­ge­it is.

Az ASCII művészet jelentése és kezdete

Az ábécék betűiből/szövegeiből kialakított ábrák egyidősek lehetnek az írásbeliséggel. A technológiától függetlenül a karakterekből kialakított kép megjeleníthető: papír és penna vagy írógép, illetve számítógép és nyomtató vagy monitor segítségével.
Az ASCII művészet (ASCII art) tágabb értelemben a szövegalapú vizuális művészetre vonatkozik. Szűkebb értelemben véve a számítógépes grafika részterületének tekinthető. Az ASCII művészet számítógépet használ nyomtatható standard ASCII kompatibilis karakterekből álló képek készítéséhez és megjelenítéséhez. A képeken a képi elemek a nyomtatható karakterek, amelyek a pointilizmushoz hasonló optikai effektust mutatnak.
A művészeti ág indulása arra vezethető vissza, hogy a korai nyomtatókkal nem lehetett grafikát nyomtatni, a monitorokon nem lehetett grafikát megjeleníteni. Cégek, programok bannerjeinek, logóinak készítésére pedig akkor is volt igény. Ezek mellett például prezentációkhoz, kapcsolási rajzokhoz is használták az ASCII művészetet, valamint természetesen a korai e-mailekben is. A grafikus kártyák megjelenése előtti időkben pedig a videójátékok „grafikája” is ezzel a technikával készült.
Most nézzünk meg néhány lehetőséget saját programmal való képkészítésre.

ASCII képek rajzolása programozási alapismeretek tanulásakor

Saját programmal már az alapok tanulásakor készíthetők ASCII képek a vezérlő szerkezetek megismerése kapcsán. Az alábbi képek bemutatják a lehetőségeket.

ASCII Art 2

További sok-sok kép található az alábbi weboldalakon:

A 2D grafikával való szövegrajzoláshoz használható BufferedImage osztály

A BufferedImage osztály a java.awt.image csomag része. Az Image osztály utódja. Hozzáférhető képadat-puffert tartalmaz, colorModel-ből és képadatok raster-éből áll. A raster sampleModel-jében a sávok számának és típusainak illeszkedniük kell a színt és átlátszó (alpha) komponenseket megadó colorModel által megkívánt számhoz és típusokhoz. A BufferedImage típusú objektumnak van bal felső koordinátája (0, 0), ezért a létrehozásához használt raster-nek kell legyen minX=0 és minY=0 értéke. A BufferedImage osztály a raster fetch és set metódusaira, valamint a colorModel színmódosítási módszereire támaszkodik.

Szöveg képként megjelenítése karakterekkel a konzolon

A kép méretét beállítjuk. A Graphics2D osztály drawString() metódusával String-et képként jeleníthetünk meg. Bár elég „munkás”, de Java-ban gyakran BufferedImage példány létrehozásával oldjuk ezt meg, és a Graphics példányt attól kérjük el. A Graphics2D osztály karakterfüzérek rajzolásakor egyszerű mátrixszerű technikát használ. A String-et kirajzoló mátrixrészek nullától különböző értéket kapnak. A megjelenítendő terület értékét egyszerű adatként, például int-ként kell megadnunk, nem RGB színértékekkel. Ehhez a képtípust int-módba állítottuk: BufferedImage.TYPE_INT_RGB. Az ASCII képek alapötlete az, hogy a képmátrix nem nulla indexeihez hozzárendelt értékeket a kívánt művészi karakterrel helyettesítjük. A nulla értékű mátrixindexeknek szóközt adunk. A nulla integer-módban -16777216-tal egyenlő. Ezután a Java 2D grafika haladó renderelő beállításainak használatához kasztoljuk a Graphics objektumot Graphics2D példánnyá. Majd beállítjuk a kívánt renderelési paramétereket, végül meghívjuk a drawString() metódust egy karakterlánccal.

Íme az elkészült szöveg/képernyőkép:

ASCII Art 3

A karakterek cserélgetésével a pozitív képből könnyen kaphatunk inverz/negatív képet is. A generált/renderelt képet fájlban is tárolhatjuk, például a javax.imageio.ImageIO osztállyal és adott a lehetőség a kép méretének megadására, a rajta megjelenő szöveg betűtípusának beállítására, háttérszín és szövegszín alkalmazására is.

A Java BufferedImage osztály néhány lehetőségének áttekintése után jó szórakozást kívánunk az ASCII képek létrehozásához, a lehetőségek további tanulmányozásához. Aki nem programból szeretne karakterekből/szövegekből felépülő képeket készíteni, használhat online alkalmazásokat is, például az Image to HTML/ASCII-t.

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A feladat a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 21-24. óra: Objektumorientált programozás, 2. rész alkalmához kötődik.

Doktoranduszok programoznak

it-tanfolyam.hu doktoranduszok programoznak

it-tanfolyam.hu doktoranduszok programoznakSaját doktorandusz csoporttársaimmal többször beszélgettünk már arról, hogyan tudnák/tudják használni a programozás eszköztárát, módszereit, lehetőségeit saját kutatási munkájukban, beépítve a kutatási folyamat egyes lépéseibe, illetve disszertációjuk elkészítésébe.

Mivel a 10 fős csoportban mindenkinek más az alapvégzettsége, így szoftverfejlesztéshez, programozáshoz közös szókincs és terminológia haladó szinten természetesen nincs, viszont közös bennünk, hogy mindannyian alkotunk különféle modelleket és elemzünk adatokat.

Különféle modelleket alkotunk

  • a mérnökök, fizikusok, geográfusok, biológusok többféle kísérletet végeznek el, szimulációkat terveznek és futtatnak, mérőeszközöket és műszereket használnak,
  • az informatikusok különböző matematikai eszközöket alkalmazva objektumorientált – vagy másféle – modellezést végeznek, szoftvereket terveznek, javítanak, újraírnak.

Adatokat is elemzünk, ki-ki előképzettségének megfelelően

  • kérdőívező szoftverekből exportálva valamit,
  • Excel munkalapokon, függvényekkel, adatbázis-kezelő funkciókkal, kimutatásokkal (Pivot táblák),
  • különböző fájlformátumokkal (CSV, XML, JSON, egyedi) dolgozunk és konvertálunk A-ból B-be,
  • távoli adatbázisokhoz, felhőbeli adattárházakhoz csatlakozunk, lekérdezünk és kapunk valamilyen – többnyire szabványos – adathalmazt,
  • matematikai, statisztikai szoftvereket használunk, például: MATLAB, Derive, Maple, SPSS.

Önszerveződően összeállítottunk egy olyan két részből álló tematikát, ami mindannyiunk számára hasznos. A 64 óra két 32 órás modulból áll: Java programozás és SPSS programrendszer.

Java programozás modul

  • 1-8. óra: Objektumorientált modellezés, MVC rétegek, algoritmus- és eseményvezérelt programozás
  • 9-16. óra: Fájlkezelés és szövegfeldolgozás (XLS, CSV, XML, JSON formátumú adatok írása, olvasása, feldolgozása)
  • 17-24. óra: Adatbázis-kezelés JDBC alapon (SQL parancsok, CRUD műveletek, hierarchikus lekérdezések)
  • 25-32. óra: Komplex adatfeldolgozási feladatok megoldása programozási tételek használatával

SPSS programrendszer modul

  • 1-8. óra: Bevezetés az SPSS-be, interakciós eszközök, adatmátrix, menük: Transform, Analyze, szkriptek futtatása
  • 9-16. óra: Alapstatisztikák kérése, kereszttáblázatok készítése, hipotéziselmélethez kötődő funkciók, normalitásvizsgálat, minták összehasonlítása t-próbával
  • 17-24. óra: Regresszió-analízis: lineáris, nemlineáris, többváltozós; Idősorok elemzése: szűrés, periodogram, trendelemzés
  • 25-32. óra: Mesterséges neuronhálózatok: matematikai modell és működése

Mivel mindenki doktorandusz a csoportban, így a különböző MSc-s alapvégzettsége ellenére mindannyiunknak vannak strukturális programozáshoz kötődő alapismeretei, valamint adatok elemzéséhez szükséges elméleti matematikai/statisztikai alapjai. Az én részem a 32 órás Java programozás modul, ami 2018.10.28-án kezdődött és 2018.12.09-ig fog tartani hétvégi napokon. Ez nagyban lefedi a Java SE szoftverfejlesztő tanfolyamunk tematikáját és kapcsolódik a Java EE szoftverfejlesztő tanfolyamunk és a Java adatbázis-kezelő tanfolyamunk tematikájához is.

A koncepciót once-in-a-lifetime jelleggel dolgoztuk ki azzal a fő szándékkal, hogy hatékonyabban működjünk együtt a jövőben.

Stream API lambda kifejezésekkel

lambda kifejezés logo

lambda kifejezés logoKorábban blogoltunk már a Stream API-ról és a lambda kifejezésekről: Ismerkedjünk lambda kifejezésekkel! Most másképpen közelítve újra foglalkozunk a témával.

Tanfolyamainkon szinte minden adatszerkezethez, tömbhöz, kollekcióhoz, fájlkezeléshez kötődő témakörben használjuk mindkettőt. Áttekintjük az ezekhez szükséges minimális verziószámot, a szintaktika fejlődését, az együttes használat elvi és gyakorlati lehetőségeit. A szükséges alapfogalmakat definiáljuk: hozzárendelési szabály, funkcionális interfész, metódus referencia, alapértelmezett metódusok, típus kikövetkeztetés képessége, generikus és funkcionális programozás. párhuzamos adatfeldolgozás lehetőségei.

Összehasonlításokat is végzünk: a lambda előtti verziók lehetőségei, korlátai, tipikus lambda hibák, mikor mit érdemes és mit nem érdemes használni, paraméterek típusait megadjuk vagy elhagyjuk, hagyományos kollekciós műveletek (azért a generikusság előtti időkre már nem térünk ki) és folyam feldolgozás (adatforrás meghatározása, közbenső és végső műveletek).

Most azokat a Stream API-hoz és lambda kifejezésekhez kötődő bevezető mintapéldákat ismertetjük, amiket részletesen elemzünk tanfolyamaink szakmai moduljának kontakt óráin. Ezek közül közösen meg is írunk néhányat, kombinálunk is néhányat egy-egy összetett adatfeldolgozó művelet megvalósítása során. Programozási tételenként specifikáljuk a feladatokat és megmutatunk néhány megoldást.

1. Adatforrás

100 db olyan véletlen kétjegyű számot állítunk elő generikus listában, amelyek között biztosan előfordul legalább egyszer a 80.

2. Elemi programozási tételek

2.1. Sorozatszámítás

Kiírjuk, hogy mennyi a listában lévő számok összege:

2.2. Eldöntés

Két kérdésre adunk választ. Van-e a listában lévő számok között 35 (konkrét elem), illetve páros (adott tulajdonságú elem)?

2.3. Kiválasztás

Kiírjuk, hogy a biztosan előforduló (legalább 1 db közül balról az első) 80, hányadik helyen (index) található meg:

2.4. Keresés

Keressük a 35-öt az eldöntés és a kiválasztás összeépítésével:

2.5. Megszámolás

Kiírjuk, hogy hány db öttel osztható szám (adott tulajdonságú elem) található a listában:

2.6. Szélsőérték-kiválasztás

Kiírjuk a listában lévő legkisebb számot (értéket, nem indexet):

3. Összetett programozási tételek

3.1. Másolás

Készítünk egy másolatot a lista elemeiről (közben esetleg mindegyiket meg is változtathatjuk):

3.2. Kiválogatás

A listában lévő számok közül kiválogatjuk az öttel osztható számokat:

3.3. Szétválogatás

Külön-külön szétválogatjuk a listában lévő páros és páratlan számokat:

3.4. Unió

A korábban szétválogatott páros és páratlan számokat tartalmazó halmazok unióját állítjuk elő:

3.5. Metszet

A korábban szétválogatott páros és páratlan számokat tartalmazó halmazok metszetét állítjuk elő:

3.6. Összefésülés

A korábban szétválogatott páros és páratlan számokat összefésüljük:

4. A program eredménye a konzolon

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A feladat a Java SE szoftverfejlesztő tanfolyam, a Java EE szoftverfejlesztő tanfolyam és a Java adatbázis-kezelő tanfolyam szakmai moduljának több alkalmához és az orientáló moduljának 1-4. óra: Programozási tételek alkalmához is kötődik. A Stream API-val és a lambda kifejezésekkel sokszor foglalkozunk.

Korábban is blogoltunk már a Stream API-ról és a lambda kifejezésekről: Ismerkedjünk lambda kifejezésekkel!