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:
- Keresse meg a vektor legkisebb elemét, és írja ki annak indexét és értékét is! (A)
- Írjunk egy függvényt, ami visszaadja az adatsor átlagát és a szórását, és a program írja ki ezeket! (A)
- Í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)
- 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)
- 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)
- 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