Zoltán Kaufmann & Andor Kormányos

Programozási alapismeretek és Haladó numerikus módszerek 2020/ősz - Laborgyakorlat

A jegyszerzés feltételei

1. A labor látogatása kötelező. A Tanulmányi- és Vizsgaszabályzat értelmében a félév során legfeljebb három igazolatlan hiányzás esetén szerezhető jegy. A távolléti oktatás keretében ez azt jelenti, hogy a gyakorlat elején be kell lépni a megfelelő Teams csoportba és részt venni a megbeszélésen, ezt a gyakorlatvezető ellenőrizni fogja. A gyakorlat ideje alatt pedig elérhetőnek kell lenni gyakorlatvezetővel való konzultációra, illetve a konzultációt a hallgató is kezdeményezheti.

2. Az elégséges jegyhez kötelező az alább található házi feladatok közül az alapfeladatok (A) kidolgozása, határidőre történő beküldése, és kérés esetén óra keretében történő bemutatása. Jobb jegy eléréséhez szükséges a (T) jelű feladatrészekből is minél többet megoldani.

A gyakorlaton elhangzott elméleti anyag

Szept. 8.
1. gyakorlat
Code:Blocks és alapszintű programok
Szept. 15.
2. gyakorlat
Egymásba ágyazott ciklusok, tömbök beolvasása fájlból

Programozási feladatok

A feladatok megoldására a Code::Blocks nevű programozási környezetet javasoljuk, mely egy szintaxiskiemelővel ellátott szövegszerkesztőből, a programok fordítására szolgáló eszközökből és egy hibakeresőből áll. A Code::Blocks tetszőleges operációs rendszerre letölthető innen: http://www.codeblocks.org/

Természetesen más elterjedt fejlesztő környezet is használható, illetve egy egyszerű editor és a gcc fordító segítségével is elkészíthető a program.

A programozási feladatok megoldását szabványos C nyelven (és nem C++ nyelven) kell elkészíteni.

A házi feladatokat a kooplex-edu.elte.hu weboldalon keresztül kell beküldeni.

Szorgalmi feladatok

Szept. 8.
Első szorgalmik


Beadandó feladatok

Figyelem! Csak olyan feladatot tudunk kiértékelni, melyet a gcc fordítóval le lehet fordítani. Szintaktikailag hibás program automatikusan 0 pontot ér.

1-5. beadandó feladat eredményei és az érdemjegyek





1. feladat

Készítsünk egy programot, amely egy fájlból beolvassa egy vektor elemeit és elvégzi az a)-e) pontokban felsorolt műveleteket.
- a program fejlesztése közben kis adatfájllal dolgozzunk, végén pedig próbáljuk ki egy nagy fájllal is, pl. ezzel!
- a programot strukturáltan írjuk meg: a logikailag különálló műveletek külön függvényekben legyenek ebben és a későbbi feladatokban is!
- a paramétereket parancssori argumentumként adjuk be ebben a sorrendben: az adatfájl neve, a vektor mérete, egy keresendő szám értéke

A program ezeket a műveleteket végezze el egymás után:

  1. Keresse meg a vektor legkisebb elemét, és írja ki annak indexét és értékét is! (A)

  2. Írjunk egy függvényt, ami visszaadja az adatsor átlagát és a szórását, és a program írja ki ezeket! (A)

  3. Írjunk egy függvényt, ami kiírja, hogy a parancssori paraméterként megadott keresett szám szerepel-e a vektor elemei között, és ha igen, hányadik indexnél! Írja ki azt is, hogy ehhez hány összehasonlításra volt szükség! (A)

  4. Rendezze növekvő sorrendbe a beolvasott vektor elemeit a buborékos rendezés segítségével, és írja ki az elvégzett összehasonlítások számát! Ha legfeljebb 20 eleme van a vektornak, akkor írja ki a sorrendezett vektort is! (T)

  5. Tekintsük a d) feladatrészben sorbarendezett vektort! Keresse meg a program ebben a vektorban a parancssori bemenetként megadott számot és írja ki az indexét, valamint az összehasonlítások számát! Találjunk olyan algoritmust, hogy minél kevesebb összehasonlításra legyen szükség! (T)

  6. Szorgalmi: Ismerkedjünk meg a quick sort algoritmussal és írjunk egy saját implementációt, amely sorbarendezi a beolvasott vektor elemeit! Írja ki az elvégzett összehasonlítások számát! Ha legfeljebb 20 eleme van a vektornak, akkor írja ki a sorrendezett vektort is! Hasonlítsuk össze a saját algoritmus gyorsaságát az stdlib qsort függvénynével!

Beküldési határidő: 2020. október 4, 16:00



2. feladat. Képkontraszt növelés

Előfordul, hogy egy fényképen nehezen kivehetőek egyes részletek, mert sok hasonló árnyalatú képpont van ott egymás közelében. Ilyenkor jobban láthatóvá tehetjük a részleteket az ún. "hisztogram kiegyenlítés" módszerrel, bár ezzel az eredeti intenzitásarányokat jelentősen megváltoztatjuk. A módszer lényege, hogy úgy transzformáljuk a képpontok intenzitásértékeit, hogy a gyakorisági hisztogram, (azaz a lehetséges intenzitás értékek gyakorisága az érték függényében nézve) közel konstanssá váljon, ugyanakkor lényegében megtartjuk az intenzitásuk sorrendjét. Utóbbi tulajdonság úgy értendő, hogy ha egy pixel intenzitása a másikénál nagyobb, akkor a transzformáció után is nagyobb vagy egyenlő lesz. (A pixelek értékét egy monoton függvénnyel transzformáljuk). Ez bővebben szerepel az alábbi c) pontban (Lásd még pl. a Wikipedia Histogram_equalization című cikkét.)
Írjunk C programot, ami az a) és b) pontbeli előkészítés után kipróbálja ezt a módszert, egymás után végrehajtva az alább részletezett lépéseket. Az első parancssori argumentum legyen az átalakítandó képfájl neve. Második és harmadik a kép vízszintes és függőleges mérete pixelben. A készített C programot és notebook fájlt kell a feladat2 könyvtárba tenni.

A feladat teljes szövegét innen lehet letölteni 2-es feladat

A feladathoz tartozó fekete-fehér képfájlok: photo1c1280x720.dat, photo2c1280x720.dat, secret1280x720.dat .
A feladathoz tartozó színes képfájlok: Auronzo1280x720rgb.dat, Braies1280x720rgb.dat.
Összehasonlító képek: Auronzo.jpg, Braies.jpg.

Beküldési határidő: 2020. október 25, 23:59



3. feladat. Alakfelismerés macskákra

Közismert, hogy a macskás gif-ek milyen fontos szerepet játszanak/játszottak az Internet fejlődésében. Egy másik mostanában nagyon fontos kérdéskör pedig a számítógépes alak és arcfelismerés. Ez a két megatrend inspirálta a következő feladatot.

Egy kedves ismerősünknek elszöktek a cicái. Ez gyakran előfordul, ezért automatizáljuk a keresést. Írjunk programot, ami a környező házaknál elhelyezett webcamok képein megtalálja őket! Elsőként az egyik elveszett cicáról adunk egy képet:

Mivel 4 egyforma macskáról van szó, egy cica képe elegendő lesz. Az egyik szomszéd verandáját mutató képen több olyan cicát is felfedezünk, amelyek nagyon hasonlítanak a mi elveszett macskáinkra:


Azt kell kiderítenünk, hogy valóban a mi macskáink vannak-e ezen a képen. Az ilyen típusú feladatokat pl neurális hálózatokkal szokták megoldani, de mi most egy egyszerűbb megközelítést fogunk alkalmazni.
A kereséshez és összehasonlításhoz az elveszett cica képét egy mátrixban tároljuk. Ezután kiszámoljuk ennek a képnek és a verandát mutató kép egyes részleteinek a korrelációját és feljegyezzük, hogy a nagy kép mely részein lesz a korreláció egy bizonyos határértéknél nagyobb.

A feladat teljes szövegét innen lehet letölteni: 3-es feladat.

A korrelációt számoló függvény tesztelésére használható kisméretű adatfájlok: smiley10x11.dat, sad10x11.dat, tree10x11.dat, smileybig24x19.dat. Megtekintésre gif formátumban: smiley, sad, tree, smileybig
A feladathoz tartozó adatfájlok: Elveszett cica (lost-cat80x57.dat) , Hol van a mi macskánk? (cat-search640x360.dat).

Beküldési határidő: 2020. november 12, 23.59
Új határidő: 2020. november 15, 23.59



4. feladat. Kincskeresés vektorosan

Ismerősünk ismét segítségünket kérte. Nagyapja naplójában talált egy feljegyzést arról, hogy hol van az ő nagyapjától kapott kincs elrejtve: "Lépj előre x_0 lépést, jobbra fordulva x_1 lépést, majd balra fordulva x_2 lépést, és ezt ismételd!" Azt sejti, hogy honnan kell indulni, csakhogy nagyapja a hely eléréséhez szükséges lépések számából álló x vektort beszorozta egy A mátrixszal és az eredményül kapott b vektort írta le. Szerencsére eszébe jutott, hogy nagyapjával matekot is játszottak régebben, és elővette "Játékos matek" feliratú dossziéját. Ebben két megfelelő méretű mátrixot is talált, ezek egyike lehet, amit nagyapja használt.

Készítsünk C programot, mely megvalósítja a Gauss-Jordan-elimináció algoritmusát, vagyis megoldja az A x = b lineáris egyenletrendszert! Itt A egy n*n méretű adott mátrix, x és b pedig n elemű oszlopvektorok tetszőleges n értékkel.

A feladat teljes szövegét innen lehet letölteni: 4-es feladat.

A program teszteléséhez használható fájlok: A3x3.dat.dat, b3x1.dat, x3x1.dat.
A feladathoz tartozó adatfájlok: Beauty6x6.dat, Beast6x6.dat, b6x1.dat.

Beküldési határidő: 2020. november 28, 23.59



5. feladat. Tanulni és/vagy bulizni

A hallgatók alapesetben (Covid-19 előtt/után) a tanulás mellett még sok időt töltenek bulizással is. Vizsgáljuk meg, hogy az ezekkel töltött idő hogyan befolyásolja e tantárgy sikeres elvégzésének esélyét! Ehhez megkérdeztük 1001 korábbi hallgatónkat visszamenőleg 42 évig, hogy a 2. éves programozás jellegű tantárgyak tanulásával és bulizással mennyi időt töltöttek, és milyen eredménnyel. Ha valaki átment, akkor azt "1"-gyel jelöltük, ha nem ment át, akkor "0"-val.
A kérdés vizsgálata során két dolgot fogunk megtanulni (természetesen a tanulással töltött időbe beszámítható módon): Igen/nem kimenetelű kísérletek (mérések, vagy próbálkozások) eredményeihez valószínűségi eloszlásfüggvény illesztését (logisztikus regresszió) és többdimenziós minimumkeresést (azon belül a gradiens módszert).
Az elméleti alapokat az elméleti weboldalról kell elsajátítani. A feladat szövegében csak a legfontosabb pontokat foglaljuk össze.

A feladat teljes szövegét innen lehet letölteni: 5-es feladat.

A feladathoz tartozó adatfájl: tanul.dat

Beküldési határidő: 2020. december 12, 23.59