Egyedi grafikus komponens fejlesztése

Az objektumorientált programozás három pilléren nyugszik: egységbezárás, öröklődés, polimorfizmus. Most az öröklődésre fókuszálunk. Ezzel valósul meg az egyedi grafikus komponens fejlesztése.

Elméleti háttér

Öröklődés (inheritance, extension) során a már meglévő ősosztály tulajdonságait bővíthetjük, újabb metódusokkal egészíthetjük ki, felüldefiniálhatjuk meglévő metódusait, így létrehozva az utódosztályt. Az öröklés meglévő osztály tovább­fejlesztése. Az öröklés kapcsolat a meglévő (ősosztály) és a leszármaztatott (utódosztály) között. Egy ősből több (korlátlan mennyiségű) utód is létrehozha­tó. Az öröklés tranzitív, az osztályhierarchia mélysége tetszőleges. Az ősosztály nem tud arról, hogy van(nak)-e utódosztálya(i). Az utódosztály(ok) tudják, hogy melyik osztályból származnak. Az öröklés osztályok közötti kapcsolat, ősosztály és utódosztály van, de ősobjektum és utódobjektum nincs! Az utód valamilyen szempontból mindig más, mint az ős, eltér attól, specializált.

Öröklődés során kétféle mód közül választhatunk:

  • specializálás során egy dolog (objektum) leírásához (osztályához) új, egyedi jellemzőket adunk hozzá,
  • általánosítás során több dolog (objektum) leírásából (osztályaikból) kiemeljük a közös jellemzőket.

A jellemzők lehetnek tulajdonságok, adatok, adattagok, illetve viselkedés, metó­dusok is. Az osztály deklarációinak láthatóságaira most nem térünk ki, bővebben lásd: Programozás Java nyelven könyv – új, 2022-es kiadás.

Ha nem nevezzük meg az új osztály ősosztályát, akkor a Java nyelvben az Object osztály lesz az ős (implicit ős). A Java nyelv egyszeres öröklést támo­gat, azaz egy utódosztálynak csak egyetlen közvetlen ősosztálya lehet. A több­szörös öröklés a Java nyelvben interfészek alkalmazásával valósítható meg.

A Java nyelvben az utódosztály nevét követő extends kulcsszó utal az örök­lésre ( public class UtodOsztaly extends OsOsztaly {...}), tehát az OsOsztaly-ból származik az UtodOsztaly, másképpen az OsOsztaly-nak kiterjesztése az UtodOsztaly.

Az osztályok közötti öröklési kapcsolatot UML-ben folytonos vonalból álló nyíl­lal jelöljük. A nyíl vége üres háromszög. A nyíl mindig az utódosztálytól mutat az ősosztály felé. Az osztályok közötti öröklési kapcsolatot (és csak azt) bemu­tató UML ábrát osztályhierarchia diagramnak nevezzük.

Feladat

Egyszerű módszer van arra, hogy az 2, 3, …, N természetes számok közül „kiszitáljuk” a nem prímeket. Írjuk fel sorban e számokat, és húzzuk át először a párosakat, vagyis 2 összes többszöröseit, majd a legkisebb megmaradt szám összes többszöröseit, és így tovább. Ha ezt addig folytatjuk, míg a legkisebb megmaradt szám nem éri el y/N-t, csak a [y/N, N] intervallumban lévő prímszámok maradnak áthúzatlanul. Ez az eljárás/módszer az Eratoszthenész szitája.

Öröklődés segítségével fejlesszünk olyan Java programot, amely grafikus felhasználói felülettel rendelkezik és bemutatja az Eratoszthenész szitája algoritmus működését. Ez matematikai oktatóprogram elkészítését jelenti. Az N legyen kiválasztható egy listából. A megoldás mutassa be prímszita működését az N=64 esetre.

Megoldás

 

Az öröklődés saját Panel osztály segítségével valósul meg. A Panel osztály őse a javax.swing keretrendszerben/csomagban beépített JPanel osztály. Az ősosztály testre szabása a feladat igényeihez kapcsolódóan történik. Ezek az igények kétféle csoportba sorolhatók: egyrészt a működéshez kötődő igények (eseménykezelés, vezérlés), másrészt a megjelenítéshez kötődő igények (rajzolás, színezés). A két igénycsoport közös eleme az állapotkövetés.

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

Ez a feladat a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 5-8. óra: Vezérlési szerkezetek, illetve 9-12. óra: Metódusok, rekurzió alkalmához, a 29-36. óra Grafikus felhasználói felület alkalmaihoz, valamint minden tanfolyamunk orientáló moduljának 1-4. óra: Programozási tételek alkalmához kapcsolódik.

Kutatók éjszakája 2024

Kutatók éjszakája logó

Kutatók éjszakája logó

A Kutatók éjszakája nemzetközi rendezvénysorozat 2005-ben indult. Magyarország 2006-ban csatlakozott. Azóta évről-évre egyre több intézmény nyitja meg hazánkban kapuit, szervez érdekes programokat, sok-sok településen, több száz helyszínen, több ezer eseményt meghirdetve sok tízezer érdeklődő/résztvevő látogatónak biztosít tartalmas estét.

Bár a kezdeményezés elsősorban a kutatói pálya népszerűsítését szolgálja, ezért leginkább a tizen- és huszonévesekre számít, az események vonzók és elég érdekesek ahhoz, hogy a kisgyerekektől a legidősebbekig mindenki megtalálja a számára izgalmas programokat. Korábban nagyobb felsőoktatási intézmények és kutatóintézetek szerepeltek döntően, de az utóbbi néhány évben egyre több kisebb intézmény, tehetséggondozással foglalkozó középiskola, cég, egyesület is csatlakozott a rendezvényhez. A Kutatók éjszakája rendezvény minden meghirdetett programja ingyenes.

Rendezvényünk plakátja

Az it-tanfolyam.hu 2024-ben is hirdetett programokat az eseményhez kötődően. Programjainkat elsődlegesen követőinknek, aktív hallgatóinknak és az alumni csoportunkban hirdettük meg, de persze nyílt rendezvényként valósult meg. Az eseményekre regisztrálni kellett a weblapon. A regisztrációs időszak két hétig tartott, szeptember 13-26-ig. Programjainkra szeptember 27-én 21:00-23:55-ig került sor.

21:00-21:25 – Kiss Balázs: OpenAI GPT nyelvi modell – tippek a hatékony használatához
Az előadó az egyike volt a Doktoranduszok programoznak – újratöltve 24 órás Mesterséges intelligencia modul oktatóinak. Saját tapasztalatait összegzi az alábbi hívószavak alapján. Alap AI funkcionalitás, megerősítéses és gépi tanulás lehetőségei és korlátai, nyelvi modellek képességei. Említ néhány generatív AI funkciót a kép, ábra, grafikon, térkép, hang, animáció, videó generálása és ezek tömeges feldolgozása kapcsán. Előkerülnek a programozási tételek, valamint alkalmazásuk multimédia analitikával együtt. Ha lesznek haladók a látogatók között, akkor az előadó bemutat néhány objektum- és aspektusorientált tervezés során használható AI eszközt, illetve igény esetén néhány kutatómunkát támogató AI eszközt is.

21:35-21:55 – Kaczur Sándor: Algoritmusok vesebeteg-donorok párosítására
Hogyan működik 2007 óta Nagy-Britanniában a vesebeteg-donorok párosítása? Sima csere 2 pár esetén adódik. 3 pár esetén körbeadják a vesét egymásnak – ez már jóval összetettebb. A felépített óriási adatbázisban akár több száz lehetőség is adódhat. A probléma megfelelő párosítási algoritmus és számítógép nélkül, pusztán emberi erővel megoldhatatlan lenne. Az implementált algoritmus futási ideje mindössze 30 perc. A párosítást követően a következő lépés a műtétek egyidejűsége, és a donor szervek „utaztatása” minden lehetséges földi, vízi, légi úton és lehetséges közlekedési eszközzel. Hogyan működik mindez a gyakorlatban? Milyen korlátok, problémák vannak? Milyen adatok alapján dönthető el a betegek „kompatibilitása”? Ezek közül mi kapcsolódik az egészségügyhöz és a szállításhoz? Az előadó próbál válaszokat adni, de lehet, hogy a végén több lesz a kérdés, mint a válasz. Vajon egyáltalán felmerül a párosítási algoritmus hatékonysága ekkora társadalmi hasznosság mellett? A program a Java tanfolyamaink orientáló moduljához kötődik. A tavalyi előadás anyaga kiegészült néhány igazán látványos animációval, szimulációval.

22:00-22:25 – Szegedi Kristóf: Játékprogramok nyerő stratégiáinak elemzése
A tudásalapú rendszerek elméleti alapjaihoz tartoznak a mesterséges intelligencia különböző megoldáskereső módszerei, az állapottér-reprezentáció és a klasszikus keresési stratégiák, heurisztikák. Egy játék állapotait nyilvántartjuk egy adatszerkezetben. Lehet, hogy néhány lépést előre kalkulálunk (kiterjesztünk) és ezek elágazásaiból fát (fa adatszerkezet) tudunk építeni. Ezeket hatékonyan karban kell tartani konstrukciós és szelekciós műveletekkel. Heurisztika alapján döntéseket kell hozni. Vajon melyik állapot a jobb, vagy kevésbé rossz, legalább olyan jó mint ahol járunk? Ki kell értékelni és abba az irányba érdemes haladni, amelyben végül a döntések sokasága igazolja és egyben adja a nyerő stratégiát. Ha ez nem megy, akkor még mindig játszhatunk nem vesztő stratégiával, azaz lehet cél a hosszabb játékmenet, vagy akár a döntetlen állapot is. Az előadás ismertet néhány tipikus problémaszituációt, játékteret leképező reprezentációs gráfbeli navigációt és összehasonlít néhány fabejáró/gráfbejáró stratégiát. A program mindhárom Java tanfolyamunk orientáló moduljához kötődik. Előismeretként feltételezünk némi jártasságot a programozási alapismeretek, programozási tételek, ciklusok, metódusok, tömbök témakörökből.

22:30-22:55 – Hollós Gábor: Algoritmikus gondolkodás fejlesztése: mintaprogramok, esettanulmányok
Az előadó bemutat néhány olyan mintaprogramot/esettanulmányt – természetesen a fokozatosság elve alapján -, amelyek kiválóan alkalmasak a közös eszmecserére. Az algoritmusok átgondolása segíti a szabályalapú megközelítést. Sémák, programozási tételek is előkerülnek – sőt ezek egymásba ágyazása is előkerül. Iteráció vs. rekurzió. Különböző adatszerkezetek képességei, funkciói, konstrukciós és szelekciós műveletei. Az algoritmikus megközelítés szemléletmód állandóságot, stabilitást jelent gondolkodásunkban, tágítja szellemi tevékenységünk körét, célt és formát ad egy probléma megoldásának. Az előadó abban bízik, hogy a fentiek érzékeltetésére alkalmas problémákat, programokat gyűjtögetett össze.

23:00-23:25 – Falus Anita, Ménesi Viktor: Karrierváltás után – az álláskeresés és néhány hónap KKV-s tapasztalatai szoftverfejlesztőként
Mennyire könnyű ma szoftverfejlesztőként elhelyezkedni szakirányú felsőfokú végzettség nélkül? Milyen kihívásokkal találkozhatunk a felvételi folyamat során? Milyen elvárásokat támasztanak a munkaadók egy junior szakemberrel szemben? Hogyan telnek a beilleszkedés után a hétköznapok junior fejlesztőként kis létszámmal működő informatikai profilú kisvállalkozásnál? A tanfolyamainkon 2021-től 2023-ig végzett előadók karrierváltó junior szakemberként személyes tapasztalataikról számolnak be és válaszolnak a kérdésekre. A program a Java tanfolyamaink orientáló moduljához kötődik.

23:30-23:55 – Kaczur Sándor: Gondolkodjunk logikusan!
Az előadás során áttekintjük az intelligencia, a kreatív problémamegoldó és logikus gondolkodás összefüggéseit és izgalmas feladatokból válogatva közösen megoldunk néhány fejtörő feladatot. Néhány példa: Hány éves a kapitány?CHOO + CHOO = TRAIN, Logikus gondolkodás teszt. Minden feladathoz adunk rávezető példákat – ha esetleg egyik-másik nem menne, akkor ebből ki fog derülni, hogy miket érdemes gyakorolni ahhoz, hogy sikerüljön. A korábbi évek anyagát az előadó kiegészítette néhány Java algebrai csomag funkcionalitásának bemutatásával és látványos, szinte önmagyarázó grafikus ábrákkal.

 

A programjaink népszerűek voltak. 52 érdeklődő látogatót fogadtunk. Többségük végig velünk tartott. Elgondolkodtató párbeszéd alakult ki a mesterséges intelligencia témakörében, illetve sok-sok kreatív megoldás került elő a logikus gondolkodás program fejtörőivel kapcsolatosan. Néhányan megragadták a lehetőséget, hogy több budapesti helyszínt is meglátogassanak – ahogyan ez megszokott a Kutatók éjszakája rendezvényeken hosszú évek óta. Kellemes hangulatban, tartalmasan töltöttük együtt ezt a három órát, aminek igazán örülök.

Szeretném megköszönni az előadó oktató kollégák és alumni hallgatóink színvonalas munkáját, igényes felkészülését. Köszönjük mindenkinek, aki részt vett a Kutatók éjszakája 2024 rendezvényünkön. Az előadások prezentációit tanfolyamaink hallgatói számára – a témához kapcsolódó témakörökhöz, ILIAS-ra feltöltve – tesszük elérhetővé.

Dátumok csoportosítása

dátumintervallumok logó

dátumintervallumok logóEbben a Java projektben dátumok csoportosítását oldjuk meg, többféleképpen is. Mikor van erre szükség? Jelentés, kimutatás, riport, lista készítése során.

Példaként tekintsünk egy blogot. A blogban rendszeresen jelenik meg új tartalom (bejegyzés, poszt). Azért, hogy a blog hosszabb távon, sok bejegyzéssel is könnyen kereshető, átlátható, böngészhető legyen/maradjon a felhasználók, látogatók számára, célszerű:

  • taxonómia kialakítása. Ez kategóriákat és címkéket jelent. Ebből címkefelhő vagy szófelhő is készíthető, ahogyan erről blogoltunk már: Címkefelhő generálása.
  • marketing analitika használata. Ezek általában toplisták valamilyen könnyen hozzáférhető adat alapján. Például: látogatottság, népszerűség, eltöltött idő, hozzászólások száma, megosztások száma, egérmutató mozgása alapján hőtérkép. Ezek általában toplisták, amelyek eleje listázódik csökkenő sorrendben.
  • dátum szerint is csoportosítani a blog bejegyzéseit. Érdemes megjeleníteni a legújabbtól a régebbi felé haladó (retrospektív) listát, hierarchikus fa struktúrát, lenyíló panelt. Mindez kombinálható toplistával. A csoportosítás elvégezhető igény szerint tetszőlegesen, például évente, negyedévente, havonta.

Lássuk, hogyan lehet megvalósítani a dátumok csoportosítását Java programozás nyelven!

Milyen adatokra van szükség?

Egy megadott zárt dátumtartományban véletlenszerűen előállítunk néhány dátumot. Nem számít, hogy különböznek-e. A dátumokat tároló listát érdemes csökkenő sorrendben tárolni. Minden dátum múltbeli, így ez a sorrend a jelenhez legközelebbitől halad a legtávolabbi felé. Például a Java program ezekkel a dátumokkal dolgozik (lapozható):

Milyen eredményeket kaphatunk?

Az évenkénti csoportosítás így jelenik meg:

A havonkénti csoportosítás így jelenik meg (lapozható):

Természetesen blog esetén gyűjtőoldalra mutató hivatkozást kell tenni a megjelenő elemekre. Azok az évek és hónapok nem jelennek meg, ahol nincs dátum (blog bejegyzés).

Hogyan kapjuk meg az eredményeket?

Természetesen Java nyelven programozva készítünk megoldást, sőt többféle megoldást. Ezek szépen összevethetők és mindenki kiválaszthatja azt, amit szívesen használna. A dátumobjektumok tárolása generikus listában történik, aminek típusa LocalDate. A dátumok formátuma: DateTimeFormatter.ofPattern("yyyy.MM.dd.").

1. megoldás

Ez a hagyományosnak tekinthető megoldás. Végigjárja a dátumobjektumokat tartalmazó dateList dátumlista adatszerkezetet. Két egymásba ágyazott ciklussal csoportváltást valósít meg. Feltételezi – nem ellenőrzi -, hogy az adatok sorrendje megegyezik az eredmény kiírásának megfelelő sorrenddel. Amíg két egymást követő dátum GROUP_BY_FORMAT formátuma azonos, addig ugyanabba a csoportba tartoznak. A csoportváltáskor az eredmény TYPE_FORMAT formátumú. Közben a beépített megszámolás programozási tétel is működik.

A groupByDate1() függvény képes az évente és havonta csoportosítás megvalósítására. Mindez a paraméterezésén múlik. Évente csoportosít, ha így hívja meg a vezérlés:

Évenkénti csoportosítás során például a 2024.02.26. és a 2024.01.30. (dátumként, nem szövegként értelmezve) azért tartozik egy csoportba, mert a dátumobjektumoktól elkért év "2024" szövegként mindkettő esetében megegyezik.

A groupByDate1() függvény havonta csoportosít, ha így hívja meg a vezérlés:

Havonkénti csoportosítás során például a  2023.06.14. és a 2023.06.08. (szintén dátumként értelmezve) azért tartozik egy csoportba, mert mindkettő illeszkedik a "202306" szövegmintára.

2. megoldás

Ez a Stream API-t és funkcionális programozást használó, újabb megoldás. Ciklus helyett beépített műveletek vannak. A groupByDate2() függvény a dátumok évenkénti csoportosítását képes megoldani:

A groupByDate3() függvény a dátumok havonkénti csoportosítására készült. A YearMonth osztály beépített ( java.time csomag). A DateCount saját POJO. Konstruktora 4 paramétert kap: YearMonth key, Long value, DateTimeFormatter format és String groupText, valamint van két hasznos metódusa. Az egyik az örökölt és felüldefiniált toString() a formázott kiíráshoz, a másik pedig a Comparable interfésztől implementált compareTo() a sorrend kialakításához szükséges összehasonlításhoz.

A funkcionális programozáshoz kötődő lambda műveletekről többször is blogoltunk már, így azokat most nem részletezem. Helyette ajánlom a szakmai blog lambda kifejezés címkéjét.

Továbbfejlesztés

Érdemes átgondolni az 1. és 2. megoldás markáns különbözőségeit, illetve egymást kiegészítő gondolatmenetét. Zárjuk két ötlettel a továbbfejlesztésre vonatkozóan:

  • A 2. megoldás két függvénye megoldható egyetlen függvénnyel, amely hasonlóan paraméterezhető, mint az 1. megoldás függvénye. Ezáltal univerzális(abb)nak tekinthető megoldás is készülhetne. Aki kellően motivált és végiggyakorolja a fentieket, biztosan meg tudja oldani. Várjuk hozzászólásban, vagy az ILIAS-ban a megoldást!
  • A csoportosítás egyben hierarchiát jelent, amiből fa szerkezet építhető. A fa vizuális komponensen is megjeleníthető, ahogyan blogoltunk is róla: Fát építünk.

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.

A Pi grafikus ábrázolása

A nemzetközi Pi nap alkalmából (március 14) Java programmal grafikusan ábrázoljuk a π számjegyeit. Kiindulunk egy négyzet alakú grafikus felület középpontjából. Ezt tekintjük origónak. Sorra vesszük a π első néhány számjegyét: 100, 1000, 10000 paraméterezhető módon. Minden számjegyet egy rövid szakasszal ábrázolunk. A szakaszok egymást követik. Az előző végpontja megegyezik a következő kezdőpontjával. A rajzolás elejét és végét kör jelzi.

Tervezés

Az alábbi szabály alapján döntjük el, hogy a π előforduló számjegyei esetén melyik irányba és milyen színnel rajzolunk szakaszt:

A π első 100000 db számjegyét tároljuk egy szövegfájlban. Ömlesztve, sortörés, tizedesvessző nélkül. Így a π első 30 számjegye: 314159265358979323846264338327. A szövegfájl helyét a String PI_FILE  konstans jegyzi meg. A paraméternek megfelelően ebből vesszük az első N db számjegyet. Ezt a Java program beolvassa egy String típusú pi szövegobjektumba. A számjegyek összetartozó adatait egy Digit osztály rendeli egymáshoz. Ennek három adattagja van: melyik számjegy: int digit, melyik irányba kell szakaszt rajzolni java.awt.Point direction, milyen színnel kell szakaszt rajzolni java.awt.Color color. A tízféle színt egy konstans tömb tárolja: Color[] COLORS.

Részletek a Java forráskódból

A π tízféle számjegyéből az alábbi forráskód-részlettel létrejön egy tömb adatszerkezet: Digit[] digits. A koordináták/vektorok kiszámítása követi az analóg óra számlapjának 36 fokonként való felosztását.

A rajzoláshoz szükséges még néhány konstans: milyen vastag vonalat kell rajzolni: double PEN_RADIUS, mekkora átmérőjű kör jelzi a rajzolás kezdő- és végpontját: double POINT_RADIUS, milyen hosszú vonalat kell rajzolni: int LINE_LENGTH, a rajzterületet mekkorára kell méretezni/skálázni: int SCALE.

Mindezek alapján az alábbi forráskód-részlet vizualizálja a π számjegyeit:

Eredmény

Eredményül ezek az ábrák készíthetők el:

A rajzoláshoz felhasználtuk az StdDraw osztályt, amely ennek a tankönyvnek a példatárából származik: Robert Sedgewick, Kevin Wayne: Computer Science: An Interdisciplinary Approach, 1st edition, Princeton University, Addison-Wesley Professional, 2016, ISBN 978-0134076423. Az osztály metódusaival könnyen beállítható a nézőpont, a vízszintes/függőleges skála, a rajzoláshoz használt toll mérete/színe és a grafikai primitívek közül csak a kör és szakasz ábrázolása szükséges.

Korábban is megemlékeztünk néhány közelítő algoritmus – Viète-féle sor, Leibniz-féle sor, Wallis-formula, Csebisev-sor – implementálásával erről az ünnepnapról: Nemzetközi Pi nap. Ajánljuk korábbi blog bejegyzéseinket rajzolás, animáció, grafika címkékkel, illetve ASCII művészet Java-ban.

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 5-8. óra: Vezérlési szerkezetek, 13-16. óra: Tömbök, 17-28. óra: Objektumorientált programozás, 29-36. óra: Grafikus felhasználói felület, 37-44. óra: Fájlkezelés alkalmaihoz kötődik.

Nemzeti pizza nap

Az USA-ban és még néhány országban február 9-én ünneplik a nemzeti pizza napot. Ehhez kötődően kreatív ötletekkel és persze finom pizzákkal vonzzák az éttermek a vendégeket.

Kreatív ötletekkel a mi oktatói csapatunk is rendelkezik. A nemzeti pizza nap inspirált bennünket az alábbi feladat megoldására.

Osszunk szét igazságosan 9 db egyforma pizzát 10 fő között!

Az igazságost úgy értelmezzük, hogy mindenkinek ugyanannyi (ugyanakkora szelet) pizza jut. Két megoldást mutatunk be grafikusan. Ötleteket adunk ahhoz, hogyan programozható le mindez Java nyelven: swing grafikus felületen, grafikai primitívekkel vagy ismert algoritmusokkal. Ábrákkal mutatjuk be a megoldásokat, színekkel kiemelve az azonos/különböző méretű pizzaszeleteket.

1. megoldás

Mind a 9 db pizzából vágjunk ki egytized méretű szeletet. Marad 9 db kilenctized méretű pizzaszelet és a 9 db egytizedből összeállítható a 10. főnek járó szintén kilenctized méretű pizzaszelet/adag.

2. megoldás

A 9 db pizzából 5 db pizzát vágjunk ketté. Keletkezik 10 db fél pizza. A maradék 4 db pizzát harmadoljunk fel. Keletkezik 12 db egyharmad pizza. A keletkező 2 db egyharmad pizzát osszuk fel 5-5 részre. Keletkezik 10 db egytizenötöd méretű pizzaszelet. Az egyharmad ötödrésze adja az egytizenötöd részt. A 10 főnek járó adaghoz rakjuk össze a 30 db részből a különbözőket: egy adag kilenctized, ami egy fél és egy harmad és egy tizenötöd részből áll össze. Másképpen: 9/10 = 27/30 = 15/30 + 10/30 + 2/30.

Ötletek a Java nyelvű megvalósításhoz

  • A JFrame osztályból származtatott ablak utódosztály tartalompaneljére ráhelyezhető egy öröklődés útján testre szabott JPanel utódosztályból létrehozott objektum. Ennek van grafikus vászna ( Graphics objektum), amely saját koordináta-rendszerrel és pixelszintű hozzáféréssel rendelkezik. Rendelkezésre áll számos grafikai primitív rajzolására használható metódus, például vonal/szakasz, téglalap, ellipszis. A grafikai primitíveknek rajzolható adott színű körvonala és lehetnek adott színnel kitöltöttek is. Például: drawArc(x, y, width, height, startAngle, arcAngle), vagy az azonos paraméterezésű fillArc(...) metódus. A két szög értelmezése: a startAngle az analóg órán a 3 óra irányába néz, valamint az arcAngle pozitív szög fokban megadva az óramutató járásával ellenkező irányba mutat.
  • A beépített grafikus primitívek helyett használhatunk klasszikus algoritmusokat is. Például a Bresenham vonalrajzoló algoritmus, vagy ennek általánosítása a Bresenham körrajzoló (felezőpont) algoritmus. Ezekhez hasznos némi koordináta-geometria és többféle koordináta-rendszer ismerete.

Ötletek továbbfejlesztéshez

  • Megpróbálhatjuk általánosítani a problémát: osszunk szét igazságosan n db egyforma pizzát n+1 fő között!
  • A statikus képek előállítását követően időzítéssel ellátott animációt is készíthetünk, amely megfelelően mozgatja, forgatja a pizzaszeleteket. Így fázisonként megmutathatók a feladat megoldásának lépései. Ehhez többrétegű vászontechnika szükséges, amelyen könnyen mozgatható a nézőhöz közelebbi réteg úgy, hogy a háttér nem változik meg.
  • A saját rajzolt elemek időzítővel – javax.swing.Timer – történő mozgatására példáink java.swing-ben: Hóesés szimuláció és Naprendszer szimuláció – megvalósítás Java nyelven.
  • A saját rajzolt elemek kézi – eseménykezelővel megvalósított – mozgatásához felhasználható példánk JavaFX-ben: Kígyókocka grafikus felületen.
  • A fázisokból lépésenként vezérelhetően felépülő ábrák elkészítéséhez példáink: Fibonacci-spirál és Koch-görbe rajzolása.

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 matematikai háttértől eltekintve – a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 21-24. óra: Objektumorientált programozás 2. rész, valamint a 29-36. Grafikus felhasználói felület alkalmaihoz kötődik.