Kaufmann Zoltán & Kormányos Andor

Programozási alapismeretek és Haladó numerikus módszerek 2021/ő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.

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 az új https://k8plex-edu.elte.hu/hub/ 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





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!

Beküldési határidő: 2020. október 4, 7: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 egymás közelében. Ilyenkor jobban láthatóvá tehetjük a részleteket az ún. "hisztogram kiegyenlítés" módszerrel. 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 azonban megtartjuk az intenzitás értékek sorrendjét. Ez utóbbi ú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, vagyis a pixelek értékét egy monoton függvénnyel transzformáljuk (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 feladathoz tartozó képfájlok a /v/courses/halnum.public/feladat2/ mappában találhatóak.

A feladat teljes szövege innen is letölthető: 2-es feladat

Beküldési határidő: 2021. október 18, 7:00



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 macská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 tipikusan 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 macska 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 feladathoz tartozó adat és képfájlok a /v/courses/halnum.public/feladat3/ mappában találhatóak.

Beküldési határidő: 2021. november 8, 7.00



4. 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 ezzel töltött idő hogyan befolyásolja egy 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ása mellett mennyi időt töltöttek bulizással, és milyen eredménnyel végezték el a tantárgyat. 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: 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: 4-es feladat.

Beküldési határidő: 2021. november 22, 7:00



5. 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 x 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: 5-ös feladat.

Beküldési határidő: 2021. december 6, 7:00