Barátságos számok

Barátságos számok

Barátságos számokAzokat a számpárokat, amelyekre igaz, hogy az egyik szám önmagánál kisebb osztóinak összege megegyezik a másik számmal és fordítva, külön-külön barátságos számoknak, együtt barátságos számpárnak hívjuk.

Másképpen: legyen d(n) az n természetes szám önmagánál kisebb osztóinak összege. Ha d(a)=b és d(b)=a, ahol ab, akkor a és b barátságos számpár.

Például: (220; 284), hiszen a 220 önmagánál kisebb osztói: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 és ezek összege 284, illetve 284 önmagánál kisebb osztói: 1, 2, 4, 71, 142 és ezek összege 220.

Írjunk Java programot, amely kiírja az 1-10000 zárt intervallumban található barátságos számpárokat!

1. megoldás

A baratsagosSzamparok1() eljárás ciklusai a brute force módszer szerint behelyesítik az összes lehetséges számot. Minimális lépésszám csökkentésre adódik lehetőség, hiszen a belső ciklus j változója i+1-ről indítható (így a megtalált számpárok nem íródnak ki fordítva is, mert teljesül, hogy i<j).

Az osztokOsszege1(n) függvény is minden lehetséges osztót figyelembe vesz 1-től n-1-ig.

2. megoldás

Kisebb módosításokkal a lépésszám csökkenthető. A baratsagosSzamparok2() eljárás külső ciklusánál figyelembe vettem, hogy a legkisebb barátságos számpár kisebb tagja nagyobb 200-nál. Mivel a barátságos számpárok tagjainak paritása mindig megegyezik (azaz mindkettő páros vagy mindkettő páratlan), így a belső ciklus j változója indítható i+2-ről és léptethető kettesével ( j+=2), és továbbra is teljesül, hogy i<j.

Az osztokOsszege2(n) függvényt is módosítottam. Mivel az 1 minden számnak osztója, illetve a 2 minden páros számnak osztója, így s lehet 3 vagy 1 és a ciklus indítható 3-ról. A páros számok esetén a számnál kisebb legnagyobb osztó maximum n/2 lehet, illetve ugyanez páratlan számok esetén n/3 lehet. Ezekre figyelve a max változó adja a ciklus léptetésének felső határát. Az i változó léptetésénél figyelembe vettem, hogy páratlan számnak csak páratlan osztói lehetnek ( i=3-mal szinkronban).

3. megoldás

Az eddigi két egymásba ágyazott ciklus helyett átszervezhető a baratsagosSzamparok3() eljárás. A j>i && osztokOsszege2(j)==i feltétel kiértékelése így sokkal hatékonyabb.

Vajon milyen nagyságrendű különbségek adódnak, ha összehasonlítjuk a három megoldás futási idejét?

Az 1. megoldás futási ideje 1104156 ms, a 2. megoldásé 257055 ms, a 3. megoldásé 121 ms. A konkrét értékek helyett a nagyságrendet megfigyelve a különbség nagyon látványos.

Mindhárom megoldás helyes és megkapjuk az intervallumban található öt barátságos számpárt: (220; 284), (1184; 1210), (2620; 2924), (5020; 5564), (6232; 6368).

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

Források:

A feladat a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 9-12. óra: Metódusok, rekurzió alkalomhoz kötődik.

Denevérek a barlangban

Évekkel ezelőtt hálózatos Java EE esettanulmányt akartunk készíteni Lengyel Borisz kollégával. Ötleteltünk: milyen technológiával és hogyan kommunikáljon egymással a szerver és a kliens(ek). A távoli metódushívás (Remote Method Invocation) mellett döntöttünk és elkészült a denevérek a barlangban projekt, amely evolúciós projektként azóta több változatot is megélt. A felhasználói felület (barlang) betölt néhány képet (denevér kliensek), amelyek a szerver segítségével mozognak.

Ismertetjük a tervezés folyamatát, a kliens és szerver funkcióit részletesen, végül ötleteket adunk a továbbfejlesztésre.

A főbb feladatokat így határoztuk meg:

  • az RMI kommunikációs módszer megismertetése,
  • az RMI szolgáltatás reprezentálása látványos grafikus/swinges klienssel,
  • alternatíva nyújtása a TCP protokoll közvetlenül csatlakozó socket-jére.

Elkészítettük az alábbi osztálydiagramot (persze ez nem az első változat):

Denevérek a barlangban - Osztálydiagram

A szerver és kliens funkcióit megvalósító osztályok/interfészek feladatait így határoztuk meg:

BarlangDenevérInterfész interfész:

  • véletlen 5 és 10 közötti a denevérek száma,
  • méretek a GUI-hoz.

Denevér osztály:

  • megvalósítja az RMI kliens funkciót,
  • JLabel leszármazott, külső képfájlt tölt be ( bat.jpg),
  • egyedi azonosítója van,
  • eldönti mozgásának irányát (4) és léptékét (3), mintha ultrahangot adna,
  • a szerver megadja neki, hogy az új helyre elmozdulhat-e,
  • saját magát képes mozgatni.

Pozíció interfész:

  • öröklődik a java.rmi.Remote interfészből,
  • két távolról hívható metódus fejét tartalmazza.

BarlangSzerver osztály:

  • megvalósítja az RMI szerver funkciót,
  • implementálja a Pozíció interfészt,
  • JFrame leszármazott,
  • figyel arra, hogy a denevérek ne mozogjanak ki a barlangból.

BarlangFelület osztály:

  • JFrame leszármazott,
  • GUI az RMI kliensek megjelenítéséhez.

BarlangSzerverTérkép osztály:

  • JPanel leszármazott,
  • GUI a szerveren a kliensek mozgásának követésére.

Ha futtatjuk az elkészült szerver és kliens programot, akkor ezt láthatjuk:

Denevérek a barlangban - animáció

A fejlesztés és tesztelés közben sok-sok továbbfejlesztési ötletet/javaslatot fogalmaztunk meg:

  • háttérkép a barlangról,
  • a háttérkép megvalósíthat labirintust, koordináta-rendszert,
  • átlátszó illetve egyedi képfájlok a denevéreknek,
  • a denevérek mozgásának tetszőleges iránya (360°),
  • a denevérek mozgásának egyedi léptéke,
  • a denevérek figyeljenek egymásra (ne ütközzenek össze),
  • a denevérek figyeljenek a környezetükre (ne ütközzenek bele sziklákba, cseppkövekbe),
  • a szerver követheti a denevérek útvonalát,
  • a szerver archiválhat, szerializálhat, készíthet statisztikát.

A bejegyzéshez tartozó – több lépésben továbbfejlesztett – forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A feladat a Java EE szoftverfejlesztő tanfolyam 21-24. óra: RMI alapú kommunikáció alkalmához kapcsolódik.

HWSW – Nyári napfordulós Android/Kotlin meetup

HWSW logó

HWSW logó2018. június 19-én délután a HWSW szervezésében a Kotlin programozási nyelvet bemutató meetup-on vettem részt az AnKERT-ben. Az előadások elsősorban a nyelvvel még csak ismerkedők számára szóltak, amolyan kedvcsinálóként lehet rájuk tekinteni.

HWSW : Nyári napfordulós Android/Kotlin meetup

Az első előadó Ekler Péter volt, aki összehasonlította a Java és a Kotlin nyelvet. Miben más az utóbbi, mivel ad többet, mint a Java? Azonnal feltűnő volt a forráskód tömörsége, egyszerűsége. Több esetben is előfordult, hogy nem kellett kiírni egy metódus visszatérési típusát, mert a fordító képes azt kitalálni. Új képességekről is szó esett, például a null érték elleni védekezésről, amelyet a Kotlin nyelv nullable és nem nullable típusokkal old meg. Ez a képesség például a C# nyelvben régóta jelen van. A null értékhez kapcsolódóan új operátorok is bekerültek a nyelvbe, amelyekkel így nagyon tömören és egyszerűen lehet elágazást megvalósítani null esetén. Megjelentek az extension method-ok a nyelvben, amivel egy meglévő osztályt úgy lehet további metódusokkal bővíteni, hogy nem kell azt leszármaztatni. Végül hasznos tippeket kaptunk a Kotlinban való programozás elkezdéséhez, illetve bevezetéséhez. Fontos megjegyezni, hogy egy Kotlin nyelvű program Java bájtkódra (is) fordul le, ezért teljesen illeszkedni tud egy már meglévő Java kódú projektbe. Ezért a tanulás elkezdhető kis modulok megírásán keresztül is.

A második előadó Varga Balázs volt, aki Kotlinos multiplatformos teszteléssel kapcsolatos tapasztalatait osztotta meg. Tőle megtudtuk, hogy a Kotlin számukra többek között azért hasznos, mert közös üzleti logika kódbázissal tudnak dolgozni akár a szerver oldalon, akár a kliens oldali mobilalkalmazásokon vagy JavaScript-et futtató böngészőben. Balázs mutatott egy esettanulmányt, ahol nehézséget okozott számukra, hogy hol válasszák szét a közös kódbázist a platformspecifikus részektől, mert a megvalósítás az Androidos kliensen működött, de az iOS-es kliensen viszont nem.

A harmadik előadó Braun Márton volt. Ő az Android KTX framework-öt mutatta be, ami egy kifejezetten Kotlin nyelven íródott, a nyelv képességeire támaszkodó eljárásgyűjtemény. Feladata, hogy az Androidban körülményesen használható API-kat könnyen kezelhetővé, kevesebb kóddal leírhatóvá tegye. Bár léteznek ehhez hasonló, mások által készített könyvtárak, de a KTX erejét az adja, hogy a Google cég 2017 óta hivatalosan támogatja a Kotlin nyelvet, és ezen belül a KTX könyvtárat is. Láthattunk néhány kódpéldát, ahol szemléletesen mutatta be Márton, mennyivel rövidebben lehet KTX framework-kel elérni ugyanazt az eredményt, mint nélküle.

Az utolsó előadó, Fuszenecker Zsolt egy hibás programsort hozott példaként, amely saját termékükbe került bele, és emiatt az Androidos felhasználóik egy elég kicsi, de mégis jelentős hányadánál nem tudott működni az új funkció, amit a kiadott frissítéssel építettek a programba. Elmondta, hogy nem volt könnyű megtalálni a hibát, mert csak az Android 6.01 verziónál és alatta jelentkezett. A kérdéses hiba egy lambda kifejezés bal oldalán álló két paraméter zárójelezésével oldódott meg, mert a kérdéses kódsort a fordító olyan API rendszerhívásra fordította le, ami csak Android 7.0-tól vált elérhetővé.

Két előadás megtekinthető, illetve a négy előadás prezentációja letölthető.

Multimédia az oktatásban 2018

NJSZT-MMO logó

NJSZT-MMO logóA Neumann János Számítógép-tudományi Társaság (NJSZT) „Multimédia az oktatásban” Szakosztály által – évente – szervezett XXIV. Multimédia az oktatásban című nemzetközi konferencia a Nemzeti Közszolgálati Egyetemen Államtudományi és Közigazgatási Karán került megrendezésre 2018. május 31. és június 2. között.

A konferencia célja

  • elősegítse az oktatás, a kutatás és a fejlesztés különböző területein dolgozó szakemberek tapasztalatcseréjét és találkozását,
  • bemutatkozási lehetőséget adjon az oktatóknak, kutatóknak és PhD hallgatóknak az új kutatási eredmények széleskörű szakmai megismertetésére és megvitatására előadások, kiállítások és kiadványok segítségével.

19 témakörben hirdették meg az előadóknak a jelentkezési lehetőséget, köztük néhány hozzánk kötődő

  • multimédia alkalmazása,
  • mLearning/eLearning és környezete,
  • felhőalapú szolgáltatások,
  • multimédiafejlesztések, eredmények, alkalmazások.

Letölthető a konferencia programja.

Részt vettünk a konferencián

Már többször is részt vettem előadóként ezen a konferencián szakmai előadással, magyar és/vagy angol nyelvű cikkel, poszterrel az oktatói csapat tagjaival együtt. Ezek a publikációs listámban megtalálhatók.

2018-ban előadást tartottam „Az XML feldolgozás lehetőségeinek összehasonlítása Java nyelven” címmel 25 percben, amely a konferencia „Multimédia és a tudományos kutatás összefonódása” című szekciójába került. Az előadás látványos, összefoglaló, rendszerező jellegű volt és a DOM, SAX, JAXP, JAXB, StAX, JAX-RPC, JAX-WS lehetőségeket/technológiákat/osztálykönyvtárakat érintette. Körülbelül 30-an voltak jelen a szekcióban. Hasznos és kellemes élmény volt találkozni sok-sok régi ismerőssel a konferencián.

Berecz Antónia kolléganő is tartott egy előadást az MMO 2018 konferencián „Oktatási stratégia megvalósítása e-learning modellosztályok segítségével” címmel. Ez az előadás a „Tanulási élmény a XXI. században / Multimédiafejlesztések, eredmények, alkalmazások bemutatása” című szekcióba került, amelynek Antónia szekcióelnöki feladatait is ellátta. Antónia korábbi szakdolgozó hallgatói közül négyen az MMO szakdolgozatversenyen I., II. és két III. helyezést értek el. Ehhez személyesen gratuláltam neki a konferenciát záró eseményén, de most írásban is kifejezem elismerésemet.

Az előadásom prezentációjá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 9-12. óra: XML feldolgozás és 13-16. óra: JSON feldolgozás alkalmaihoz kapcsolódik.

Programozási alapok K-MOOC online kurzus az Óbudai Egyetemen

Az Óbudai Egyetemen 2014-ben megalakult a KÁRPÁT-MEDENCEI ONLINE OKTATÁSI CENTRUM (K-MOOC), amelynek egyik fő célja, hogy biztosítson kredittel elismert online oktatási formát a Kárpát-medencei, részben, vagy egészben magyar tannyelvű képzést folytató felsőoktatási intézmények hallgatói számára, illetve egy oktatási formát az élethosszig tartó tanulás megvalósítására. A pályázat célja, hogy a K-MOOC hálózatához csatlakozott felsőoktatási intézmények bekapcsolódjanak a kurzuskészítés és meghirdetés folyamatába. Ezzel gazdagítják a kurzusok tárházát és az elérhető tudományterületeket is. Lehetőséget teremtenek az oktatók számára a meglévő kredit értékű tárgyaik megújítására. A korszerű tananyagok kifejlesztése hozzájárul a képzés színvonalának növeléséhez.

2016 tavaszán az ÓE meghirdette Online kurzusok fejlesztésére magyarországi és határon túli magyar oktatási nyelvű felsőoktatási intézmények oktatói számára című pályázatát.

A pályázat keretében fejlesztett tananyagokaz a K-MOOC keretében publikálták. A tananyagok kidolgozásánál a pályázónak alkalmazói szinten ismernie kellett a kurzust működtető keretrendszert. A Moodle esetében kötelező volt figyelembe venni a Moodle szabványait. A tananyagfejlesztés tevékenységnek minden esetben online elérhető, oktatásban alkalmazható, tantárgykövetelményhez igazodó végtermékkel kell zárulnia. A pályázathoz 4 félévre szóló fenntartási kötelezettség is kötődött. A pályázónak vállalnia kellett, hogy a kurzust 4 oktatási félévig menedzseli a K-MOOC keretében, mialatt a kifejlesztett tananyagot aktualizálni kellett. A kurzus moduljainak minimális száma meghatározott volt, ahogyan egy-egy modul kötelező elemei is: cél, követelmény, időszükséglet, tartalom, önellenőrzés, ellenőrzés.

A Programozási alapok című tananyagommal pályáztam és nyertem.

Az online kurzus célja volt, hogy megismertesse a programozás alapfogalmait, megismertesse az alapvető strukturált és objektumorientált programozási technikákat, megismertesse egy programozási nyelv (Java) és osztálykönyvtár filozófiáját, stabil eligazodást nyújtson különböző feladattípusok, sémák, módszerek, paradigmák és programozási tételek között, tervezési és programozási stílust alakítson ki.

Az online kurzus értékelése így zajlott. Gyakorlati jegyet kellett szerezni a szorgalmi időszakban. Mindig 4 db előre bejelentett számonkérés volt, ebből 2 db elméleti teszt, amely 20-20%-ot jelentett és 2 db kódolási feladat, amely 30-30%-ot jelentett. A tesztkérdések témakörönként véletlenszerű kiválogatása 200-nál több kérdésből álló publikus tesztkérdés-gyűjteményen alapult. A elméleti részek előtt korlátlan számú anomin gyakorlási lehetőség volt adott és a számonkérő alkalmak során egy alkalommal időkorlátosan volt elérhető a teszt. A kódolási feladatok a tantárgyhoz tartozó példatár (200-nál több Java nyelvű forráskód) elemeihez hasonló feladatok voltak, időkorlátosan voltak elkészítendők. A feladatkiírások részletesen specifikáltak voltak, a megoldások konstruktív problémamegoldást igényeltek, értő szövegolvasási készséggel kellett rendelkezni, értelmesen gondolkodni kellett tudni, lépésekre, tanult alapelemekre kellett tudni bontani a tervezés során a feladatot, valamint a megszerzett tudást alkalmazni/átültetni/testre szabni/paraméterezni volt szükséges.

Az online kurzus tematikájának elemei – jelentősen kibővítve – belekerültek a Java SE szoftverfejlesztő tanfolyamunk tematikájába.

Az online kurzus a 2016/2017-es és a 2017/2018-as tanév őszi és tavaszi féléveiben is meghirdetésre került. A pályázathoz kötődő 4 féléves fenntartási kötelezettség a mai nappal lezárult. Sok-sok hallgató felvette a kurzust. Sokan lemorzsolódtak, de sokan teljesítették is. Mindegyik félév szorgalmi időszakában szinte állandó, aktív szakmai párbeszéd folyt az online kurzus fórumain, chat formájában. Döntően önszerveződő volt a kommunikáció, a témák orientálásán túl moderálásra nem volt szükség. Elenyésző volt a „nem találom, hová kell kattintani”, illetve a „lemaradtam a feladat leadási határidejéről, nem-e lehetne-e-e-e még beadni” jellegű üzenetek aránya.