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

érettségi logó

érettségi logóA 2021-es középszintű matematika érettségi feladatsor 12. 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, megszámolás, kiválogatás. Többféle megoldás/megközelítés is előkerül. É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.

12. feladat

A háromjegyű pozitív egész számok közül véletlenszerűen kiválasztunk egyet. Mennyi annak a valószínűsége, hogy a kiválasztott szám számjegyei különbözők? Megoldását részletezze!

1. megoldás

Az 1. megoldás egymásba ágyazott ciklusokkal behelyettesíti a szóba jöhető 900 db háromjegyű szám számjegyeit. A feltétel 648 esetben teljesül. Három számjegy azonosságát két részfeltétel és kapcsolatával eldönthetnénk a trichotómia miatt. Három számjegy különbözőségéhez három részfeltétel és kapcsolatából áll össze a feltétel. A válasz a kedvező és összes eset aránya/hányadosa, azaz 0,72. Másképpen 648 db szám a 900 db háromjegyű szám közül. A megoldás lépésszáma 900.

2. megoldás

Az egymásba ágyazott ciklusok lépésszáma összeszorzódik. A legbelső ciklus az előtte lévő feltételtől függően kevesebbszer is végrehajtódhat, hiszen a százas és tízes helyiértéken lévő számjegyek egyezése esetén nincs értelme az egyes helyiértéken lévő számjegy vizsgálatának. Így a 2. megoldás lépésszáma 810, azaz 10%-kal kevesebb. Ez a három részből álló feltétel két részre bontásával érhető el.

3. megoldás

A 3. megoldásban egyetlen ciklus végzi a vizsgálatot, a megszámolást. A ciklusváltozó már nem számjegy, hanem maga a háromjegyű szám, amiről döntést kell hozni: különbözik-e mindegyik számjegye vagy sem. Három beszédes nevű segédváltozó segít értelmezni a Java forráskódot. Ezek az egész osztás és a maradékos osztás műveleteivel állíthatók elő.

4. megoldás

A 4. megoldás logikai visszatérési értékű segédfüggvényt alkalmaz. Ez egy menekülőutas megoldás. Ha kizáró feltétel szerint már döntést tudunk hozni (például megegyezik a százas és a tízes helyiértéken lévő számjegy), akkor hamis értékkel menekülünk. Egyébként ág nélkül ezután következhet az egyes helyiértéken lévő számjegy összehasonlítása a többivel. A második feltétel az eddigiekhez képest tagadott, mert a menekülés a cél. Ha nincs menekülés amiatt, hogy volt két megegyező számjegy, akkor – a feltételek egymásra épülése miatt – nincs más hátra, mint igaz értékkel visszatérni (ami azt jelenti, hogy nem volt egyezés, azaz minden számjegy különbözött).

5. megoldás

Az 5. megoldás segédfüggvénye a háromjegyű szám esetén a különböző számjegyek darabszámával tér vissza. A röptében előállított százaz, tízes, egyes helyiértékeken lévő számjegyekből folyam adatszerkezet készül, aminek feldolgozását a Stream API műveletei (egyediesítő, megszámoló) végzik el. Ezt a vezérlő ciklusban hárommal összehasonlítva léptethető a megszámolást megvalósító változó, hiszen ha teljesül a feltétel, akkor eggyel több megfelelő szám van, mint előtte volt.

6. megoldás

Az 6. megoldás újra másképpen közelít. Ha könnyebbnek tűnik az a feltétel, hogy mikor nem jó (kedvezőtlen) nekünk egy szám, akkor beépíthetjük ezt is. Megszámoljuk azokat a háromjegyű számokat, amelyeknél egy vagy két számjegy azonos, majd ez kivonjuk a háromjegyű számok darabszámából.

7. megoldás

A 7. megoldás már mindent folyamokkal old meg, azok képességeire építve. Az összes háromjegyű számot előállítja, majd rajtuk kiválogatás programozási tételt (szűrőt) használ (az 5. megoldás segédfüggvényére építve), végül a folyamban maradó számokat megszámolja. Ez a megoldás már olyan haladóknak való, akik magabiztosan építik össze a Stream API műveleteit és a lambda kifejezéseket. Mindent egyben. Persze hol itt a hatékonyság? Hozzászólásokban megbeszélhetjük.

8. megoldás

A 8. megoldás szintén folyam adatszerkezettel működik, de négy egymást követő lépésben végez szűrést (kiválogatást). A 900 db háromjegyű számból indulunk ki. Az 1. szűrő kihagyja a 9 db AAA számot, amelyek számjegyei azonosak és így marad utána 891 db szám. A 2. szűrő után marad 810 db szám, mert kimarad az a 81 db AAB alakú szám (ahol a százas és tízes helyiértéken lévő számjegyek megegyeznek) az összesen 90 db-ból, ami még a folyamban maradt az 1. szűrő után. A 3. szűrő kihagy 81 db ABB alakú számot és meghagy 729 db számot. A 4. szűrő kihagy 80 db ABA alakú számot és meghagy 648 db ABC alakú számot.

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. és 3. rész alkalmaihoz kötődik.

 

Organogram készítése

Organogram logó

HR-organogram-logoAz Oracle HR sémából építünk organogramot, amivel megjeleníthető a szervezeti hierarchia. Személyenként készítünk csomópontokat. (Másképpen is lehetne: például részlegenként.) A megvalósítás során kétszer konvertálunk A-ból B-be. Először az adatbázisból/adatforrásból SQL lekérdezéssel jutunk hozzá a szükséges adatokhoz, amelyeket generikus listába képezzük le. Ezután a listát feldolgozva generálunk HTML fájlt, amely tartalmaz egy Organization Chart diagramot.

Hasonló feladat: Ki kinek a vezetője?, rekurzív lekérdezéssel. Érdemes összehasonlítani a kétféle szemléletmódot.

Tervezés

Most pedig azt használjuk fel, hogy az Oracle HR sémában az EMPLOYEES táblában reflexió van, amelyet az EMPLOYEE_ID és a MANAGER_ID mezők biztosítanak.

Az Organization Chartnál három adatsor adható meg. Ezek most testre szabva (mindegyik szöveges): 'Employee lastname', 'Job ID', valamint jelmagyarázatként további három mező összefűzve: 'Employee name, Department name, Job title'. Az organogramon megjelenő adatok például: "Raphaely", "PU_MAN", valamint a csomópontra fókuszálva megjelenő tooltip: "Employee: Den Raphaely, Department: Purchasing, Job: Purchasing Manager". A DEPARTMENTS táblából – az EMPLOYEES-zel a DEPARTMENT_ID-vel összekötve – megkapjuk a DEPARTMENT_NAME-t. A JOBS táblából pedig – az EMPLOYEES-zel a JOB_ID-vel összekötve – megkapjuk a JOB_TITLE-t.

A lekérdező parancs

SQL-organogram

Az EMPLOYEE_ID elsődleges kulcs, vagyis kötelező. A MANAGER_ID nem kötelező, a hierarchia tetején álló vezetőnél ez a mező null értékű. Mivel a MANAGER_ID nem kötelező, így külön lekérdező parancsban kell előállítani a 15 középvezetőt együtt a 2 felső vezetővel, valamint az egyetlen felső vezetőt, akinek a MANAGER_ID-ja null. Ezt a két részeredményt össze kell fűzni ( UNION).

Az eredménytábla

SQL-eredménytábla

Az adatfeldolgozás lépései

Java programozási nyelven kötelező a kivételkezelés a JDBC kapcsolatfelvétel, SQL parancs futtatása, valamint a fájlkezelés során. A JDBCConnection interfészben definiált szöveges konstansok: DRIVER, URL, USER, PASSWORD (az adatbázis-szerverrel való kommunikációhoz), SQL (a lefuttatandó lekérdező parancs). Az OrganizationChart interfészbe került a HTML_FILE_PATH (a generálandó HTML fájl Path útvonala) és a HTML (konstans váz az organogram testre szabott HTML+JavaScript forráskódja). Az SQL parancs ResultSet eredménytáblájának feldolgozása során áll elő az orgChartDataList generikus lista. A HTML konstans szövegben lévő #OrgChartData# elemet ki kell cserélni a generikus listából Stream API-val dinamikusan összefűzött adatokra. A fenti példa ide kapcsolódó része: "[{'v':'Raphaely', 'f':'Raphaely<div style="color:red; font-style:bold">PU_MAN</div>'}, 'King', 'Employee: Den Raphaely, Department: Purchasing, Job: Purchasing Manager']". Ezt követően a java.nio csomag Files osztályának write() metódusával fájlba menthető az előállított fájltartalom. A konkrét Java forráskódot most nem részletezem.

Az elkészült organogram

HR-organogram

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 adatbázis-kezelő tanfolyam 9-12. óra: Oracle HR séma elemzése, 13-16. óra: Konzolos kliensalkalmazás fejlesztése JDBC alapon, 1. rész, 33-36. óra: Grafikus kliensalkalmazás fejlesztése JDBC alapon, 2. rész alkalomhoz kapcsolódik.

ADA 2020

A Debreceni Egyetem Informatikai Kara 2020. december 15-16-án megrendezte az ADA konferenciasorozat harmadik konferenciáját (ADA 2020), amely az informatika és a STEM területei iránt érdeklődők konferenciája volt.

A konferencia célja

Az ADA konferenciasorozat elsődleges célja, hogy lehetőséget és közeget biztosítson az informatikai és a STEM területeken dolgozó, kutató vagy még a tanulmányaikat folytató nők szakmai megjelenésének, kommunikációjának. A konferencia kiemelt figyelmet kíván fordítani a kapcsolódó szakterületek munkaerő utánpótlásának problémáira, az érdeklődők pályaválasztási motivációja növelésének, illetve az orientáció kialakításának lehetőségeire. A konferenciasorozat szeretne hozzájárulni a nők arányának növekedéséhez a fenti területekhez tartozó szakmákban és kutatásokban.

Kiknek érdemes részt venni?

Mindenkinek, aki érdeklődik az informatika és a STEM területeinek új eredményei iránt! Minden kutatónak, oktatónak, felsőoktatásban tanuló vagy doktori tanulmányokat folytató hallgatónak, akik tudományos eredményeiket szeretnék bemutatni egy szélesebb szakmai közönség előtt.

Akik az informatikához, a STEM területekhez, illetve ezek oktatásához kapcsolódó munkájuk és tapasztalatuk alapján kialakult jó gyakorlatukat kívánják megosztani a szakmabeliekkel.

Az eseményről

Mindkét nap 1-1 plenáris előadással indult. 11 szekcióban (Számítástudomány, Természettudomány, Okos város és okos otthon, Női tapasztalatok a STEM területén, Nők a tudományban, Virtuális valóság, Virtuális valóság és vizualizáció, Középiskolai oktatás, Új didaktikai irányvonalak, Digitális eszköztár használata, Robotika) zajlott a 40 szekció előadás. A konferencia a Webex online platformon zajlott.

Elérhető a konferencia programja: keddi program és szerdai program, valamint az absztraktok is.

2020-ban előadást tartottam „Koronavírus Java projekt – a tervezés és megvalósítás mérföldkövei” címmel, amely a konferencia Digitális eszköztár használata szekciójába került. Az absztrakt: „Az előadás/cikk egy szoftverfejlesztő OKJ képzésen használt/használható esettanulmányt ismertet. A Java projekt két különböző weboldalról ment adatokat, ezek: https://koronavirus.gov.hu/elhunytak és https://www.worldometers.info/coronavirus/country/hungary/. Az adatokat helyi állományrendszerben tárolja, konvertálja, összefésüli, végül némi adattisztítást követően feldolgozza. A Java alkalmazások gyakorlat tantárgy tematikájának kapcsolódó elemei: OOP-MVC, swing GUI, eseményvezérelt programozás, szövegfájlok kezelése, hálózati kommunikáció, kivételkezelés. Az előadás/cikk ismerteti a Java projekt tervezésének és megvalósításának fontosabb lépéseit, mérföldköveit.”

Az előadásom prezentációját és az Java projekt/esettanulmány forráskódját ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

Az előadásom témája a Java EE szoftverfejlesztő tanfolyam több alkalmához is kötődik.

Részt vettem az ADA 2019 konferencián is.

Fibonacci-spirál

Fibonacci nap

Fibonacci nap 2018A Fibonacci-spirál a népszerű Fibonacci-sorozat elemei által meghatározott oldalhosszúságú négyzetekbe rajzolt maximális sugarú negyedkörök megfelelően összeillesztett darabjaiból/sorozatából áll. Sokszor hasonlítják az arany spirálhoz (jól közelíti), amely az aranymetszéshez kötődik.

A Fibonacci-spirál

Vegyük a Fibonacci-sorozat első 10 elemét! Rajzoljuk egymás mellé az alábbi elrendezésben belülről kifelé haladva az 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 oldalhosszúságú négyzeteket (az alábbi ábrán vékony sárgával jelölve). Piros színnel rajzoljuk bele a négyzetekbe a négyzet oldalhosszával megegyező sugarú negyedköröket. A negyedkörök megfelelő elrendezésben folytonos görbét alkotnak, és ezt nevezzük Fibonacci-spirálnak (az alábbi ábrán vastag pirossal jelölve).

Fibonacci-spirál 1

A rajzolás bármeddig folytatható, mert a sorozat végtelen, a négyzetek illeszkednek és az ábra rekurzív, önhasonló. Az alábbi animáció mutatja, hogyan alakul a spirál a nézőpont közelítésével. A viselkedés távolítás során is azonos lenne.

Fibonacci-spirál 2

Korábban blogoltunk már a Fibonacci napról, amelyet minden évben november 23-án ünneplünk. A sorozat első néhány eleméből összeáll a 11.23. és értelmezhető dátumként. Most nem a sorozat elemeinek előállítására fókuszálunk, hanem arra, hogy ezekből felépítsük a Fibonacci-spirált.

Készítsünk Java programot!

Grafikus felületű Java programot készítünk, amely 21 animációs fázisban mutatja be a Fibonacci-sorozat első 10 eleméből álló Fibonacci-spirál felépítését. A rajzolás fázisai:

  • Az 1. fázis a kiindulópontként tekinthető fehér, üres rajzlap. A rajzlap fekvő, mérete 890*550 pixel, amelyre éppen elfér a 10 negyedkörből álló spirál.
  • A 2-11. fázisban megfelelő pozícióba/koordinátákra kerülnek fel az ábra vázát alkotó négyzetek, belülről kifelé haladva. A négyzetek oldalainak hosszúsága a sorozat elemeinek megfelelő. A szomszédos négyzetek különböző színekkel kitöltöttek és mindegyikben megjelenik a sorozat megfelelő eleme.
  • A 12-21. fázisban – szintén belülről kifelé haladva – a négyzetek törlődnek és helyükre a spirált alkotó negyedkörök kerülnek fekete színnel. A 21. fázist tekintjük végeredménynek.

A fázisok kézzel, nyilakkal jelölt (Első, Előző, Következő, Utolsó) vezérlő nyomógombokkal megjeleníthetők, illetve egyben, időzítve animációként is lejátszható a rajzolási folyamat. Az elkészült program működése megfigyelhető az ábrán:

Fibonacci-spirál Java program

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 Java SE szoftverfejlesztő tanfolyamunkon, a szakmai modul Objektumorientált programozás témakörét követő 29-36. óra Grafikus felhasználói felület alkalmain már tudunk egyszerűbb szimulációs programot tervezni, kódolni, tesztelni.

LEGO Education módszertani képzés / Robotika Mindstorms EV3 robottal

„A LEGO® Education olyan, tanulást segítő megoldásokat fejleszt, melyek betekintést nyújtanak tudomány és technológia rövid történetébe, miközben a tanulás folyamatát egy élménnyé teszik. A termékeinket úgy terveztük, hogy a kísérletekben résztvevő diákok aktív közreműködésüknek köszönhetően első kézből, saját bőrükön szerzett tapasztalatokkal fejlesszék a szerkezetekkel, azok működésével valamint a programozási technikákkal kapcsolatos ismereteiket.” – írják a H-Didakt Kft. honlapján, a LEGO® MINDSTORMS® Education EV3 terméklapján. Az önálló felfedezés izgalmát így határozzák meg: „A LEGO® Education megoldásai olyan gyakorlati tanulási technikákon alapulnak, melyek segítik a gyerekeket, hogy elsajátítsák a dinamikus tanulás képességét. Ahelyett, hogy egyszerű memorizálásra bátorítana, a diákokat olyan kihívás elé állítja, melyek arra késztetik őket, hogy használják a képzeletüket, javítsák a problémamegoldó készségüket, valamint a másokkal való együttműködésre is késztet. A diákok átélhetik az önálló felfedezés izgalmát, valamit olyan létfontosságú készségekre tehetnek szert, mely jövőbeli sikerük záloga lehet.”

Élményalapú tanulás

A hagyományosnak tekinthető tanítási paradigmákat fokozatosan leváltják az alternatív pedagógia módszerei. A változás okai ismertek: a szakképzés sajátos igényei, a felnőttoktatás terjedése, a tudomány és a technika felgyorsult fejlődése, az informatika és a hírközlés átalakulása. Az alternatív tanulási stratégiák alapvető célja az, hogy a tanuló ne a passzív „elszenvedője” legyen az ismeretek elsajátításának, hanem aktív tevékenysége (vagy legalábbis annak szimulációja) alapján vonjuk be őt ebbe a folyamatba. Ennek hatására váljék számára élményszerűvé az új tudás elsajátítása és belsővé válása is. A fenti cél alapján nevezzük az ilyen módszereket összefoglalóan élményalapú tanulásnak.” Néhány pedagógiai módszer/eszköz a tanulási élmények elérésére: kooperatív tanulás, drámapedagógia, projektmódszer, médiapedagógia, felfedezéses tanulás, számítógépes tanulás.

Kolb négy lépésből álló tapasztalati tanulási ciklust javasolt: tapasztalat, reflexió, általánosítás, alkalmazás. „Minden összetevőben megjelenik a cselekvés, az önálló és az együttes munka. Így az élménypedagógiai alapokon nyugvó tanulási folyamat a cselekvés általi tanulás és fejlődés sajátos változata, multiszenzoros tanítási folyamat. Az élménypedagógia a helyzetek teremtésének nagymestere, ezáltal cselekvésre készteti a résztvevőt, provokál, sikert kínál. A résztvevők/tanulók próbára teszik tudásukat, képességeiket, kreativitásukat. Mindezek által feltárva a fizikai, és pszichikai képességeiket. Az élménypedagógia a személyes élményre, megélésre, tapasztalat-és ismeretszerzésre koncentrál. A saját tapasztalati tanulás lényege az önirányítás”, foglalta össze Molnár Katalin.

Módszertani képzés

2020. szeptember 21-én részt vettem a H-Didakt Kft. LEGO Education módszertani képzés / Robotika Mindstorms EV3 robottal című tanári felkészítésén. A helyszínt a győri Széchenyi Egyetem Apáczai Csere János Kar biztosította, amely saját Lego Robot laborral rendelkezik. A blog bejegyzésben látható fényképek ott készültek.

Megismerkedtünk a LEGO MINDSTORMS Education EV3 szoftver alapfunkcióival. Kaptunk ötleteket arra, hogy a különböző életkorú diákok/tanulók/hallgatók számára milyen projektfeladatok az ideálisak. Bemutatták a hazai és nemzetközi versenyeket, ami a csoportmunkában megvalósuló kooperációt kiegészítendő kiváló megmérettetési lehetőséget jelenthet. Én magam is voltam már zsűritag FLL robotversenyen. Mindannyian átélhettük az élményt: milyen összeépíteni, beállítani egy robotot, elkészíteni majd rátölteni a problémát megoldó szoftvert, kipróbálni, finomhangolást végezni. Informatikatanárként nyilván triviális a szoftver használata és az egész folyamat, de újszerű megközelítésnek éreztem azt, hogy szinte minden tantárgyhoz összeállítható olyan projektfeladat, amelyhez felhasználható a robot. Persze át kell élni az első buktatókat is: például amikor nagyon vártam, hogy ugató vagy nyávogó hangot adjon a robot, ha piros vagy sárga színt érzékel, de ehhez nem ártott volna megfelelően összedugni a kábeleket sem. 😉 A robot programozásához szükséges az alapvető algoritmikus építőkockák és érzékelők ismerete. A többi a kreativitáson múlik, aminek a fejlesztését kiváló oktatóvideók és példatárak is segítik. A sok segédanyag közül kiemelem Kiss Róbert: Robotika feladatgyűjteményét.

Többször is elhangzott, hogy ugyanannak a feladatnak több – különböző szintű – jó/helyes/elfogadható megoldása is lehet/van. Matematika szakos tanárként rögtön a Pólya-féle problémamegoldás lépései jutottak eszembe: megértés, tervezés, megoldás, ellenőrzés.

Például: juttassunk el a robottal a Marsról a Földre szállítmányt!

Ha profi megoldást szeretnék, akkor a robotnak meg kell találnia a csomagot, tolnia kell, kanyarodik vele, tovább tolja, végül megáll. Persze a kereséshez érzékelők és tesztelős ciklus kell, a kanyarodáshoz ciklus induló- és célfeltétellel, a haladáshoz tesztelős ciklus, a megálláshoz célfeltétel. Például kanyarodni akkor kell, amikor a robot előtt „megjelenik az út közepén” a fekete pályán egy ferde fehér csík. Ha csalok, vagy csak egyszerűbben gondolkodom, akkor kezdetben a robot irányba áll, halad előre kb. 40 cm-t, fordul balra kb. 45°-ot, majd halad előre kb. 70 cm-t a célig. Ilyenkor 1-2-3 teszt/finomhangolás során 3 szekvenciával is megoldható a feladat. A fordulás is lehet profin tervezett, kiszámolt, vagy történhet tapasztalati úton is: ha balra kell fordulni, akkor a robot jobb oldali kerekének fél fordulatával lemérhető, hogy az hány fokos elfordulást jelent. Persze számíthat, hogy mekkora ívben kell fordulni: kis ív esetén a robot jobb kereke fordulhat előre felet, miközben a bal kereke is fordul (negyedet, felet), de hátrafelé. Izgalmasnak tűnt.

Rögtön eszembe jutott a Bloom-féle taxonómia négy gondolkodási/műveleti szintje is: ismeret, megértés, alkalmazás és magasabb rendű műveletek (analízis, szintézis, értékelés). Ezekre a szintekre tudatosan hivatkozunk Java SE szoftverfejlesztő tanfolyamunkon is, amikor egy-egy programozási feladatot többféleképpen is megoldunk. Ezeket evolúciós projekteknek tekintjük.

A tanári felkészítést Kállai Balázs Lego tréner tartotta. Biológia szakos tanárként több olyan példát is említett, amelyek interdiszciplináris jellegűek, így jól összefogják például a természettudományos és/vagy STEM alaptantárgyakat, alkalmasak tematikus napok/hetek megvalósítására. Vendégelőadóként Kövecsesné Dr. Gősi Viktória – az SZE oktatási dékánhelyettese – a módszertani és érzékenyítésről szóló részben ismertette A léleknek idő kell című tantárgyának tematikáját. A kollégák abszolút elhivatottak voltak, célorientáltan és bármilyen szakos tanár kollégák számára is közérthetően foglalták össze a gyakorlatban kiválóan használható ötleteiket, tapasztalataikat. A szemléletformáló tanári felkészítést ajánlom az érdeklődő kollégák számára!