Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Hasonló dokumentumok
Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

A programozás alapjai 1 Rekurzió

Programozás Minta programterv a 1. házi feladathoz 1.

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

1. Alapok. Programozás II

A félév során előkerülő témakörök

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Rekurzió. Dr. Iványi Péter

BABEŞ-BOLYAI TUDOMÁNYEGYETEM MATEMATIKA-INFORMATIKA KAR Felvételi verseny - minta Informatika írásbeli

INFORMATIKA javítókulcs 2016

Programozás II. 2. Dr. Iványi Péter

Maximum kiválasztás tömbben

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

2018, Diszkrét matematika

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Gyakorló feladatok Gyakorló feladatok

Bevezetés a programozásba I.

Információs Technológia

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Java programozási nyelv

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Adatszerkezetek 7a. Dr. IványiPéter

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

A C# programozási nyelv alapjai

Bevezetés a programozásba I.

Rekurzív algoritmusok

ALGORITMIKUS SZERKEZETEK ELÁGAZÁSOK, CIKLUSOK, FÜGGVÉNYEK

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

Bevezetés a programozásba I.

Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

Térinformatikai algoritmusok Elemi algoritmusok

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Bevezetés az informatikába

Programozás Minta programterv a 2. házi feladathoz 1.

Térinformatikai algoritmusok Elemi algoritmusok

Programozás C nyelven 5. ELŐADÁS. Sapientia EMTE

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Dinamikus programozás II.

Webprogramozás szakkör

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Hatékonyság 1. előadás

Informatika terméktervezőknek

Alkalmazott modul: Programozás

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

A rész (30 pont) A.1. Vajon mit csinál? (5 pont) A generál(n) algoritmus egy n természetes számot dolgoz fel (0 < n < 100).

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Felvételi tematika INFORMATIKA

BME MOGI Gépészeti informatika 5.

Programozás alapjai II. (7. ea) C++

Java programozási nyelv 4. rész Osztályok II.

Függvények int, long 1. Adott a mellékelt f alprogram.

2015, Diszkrét matematika

ISA szimulátor objektum-orientált modell (C++)

Objektumorientált Programozás VI.

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

INFORMATIKA tétel 2018

A C programozási nyelv II. Utasítások. A függvény.

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

INFORMATIKA tétel 2019

Amortizációs költségelemzés

1. beadandó feladat: Programozási tételek alkalmazása. Közös követelmények:

Python tanfolyam Python bevezető I. rész

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Matlab alapok. Baran Ágnes. Baran Ágnes Matlab alapok Elágazások, függvények 1 / 15

Algoritmizálás + kódolás C++ nyelven és Pascalban

Szoftvertervezés és -fejlesztés I.

Generikus osztályok, gyűjtemények és algoritmusok

Fibonacci számok. Dinamikus programozással

1. Jelölje meg az összes igaz állítást a következők közül!

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Programozás C és C++ -ban

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Algoritmusok helyességének bizonyítása. A Floyd-módszer

Alkalmazott Modul III 3. előadás. Procedurális programozás: alprogramok, kivételkezelés

Algoritmusok és adatszerkezetek II.

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Dinamikus programozás vagy Oszd meg, és uralkodj!

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás 4. előadás Procedurális programozás: iteratív és rekurzív alprogramok Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Iteráció Elemenkénti feldolgozásnak nevezzük azon algoritmusokat, amely a bemenetként megadott adatsorozat minden egyes elemére alkalmaznak egy adott műveletet 1 ) pl. összegzés, lineáris keresés, maximumkeresés az algoritmus magját ekkor egy ciklus adja, amely valamilyen sorrendben (szekvenciában) bejárja az adatsorozatot, ezt iterációnak nevezzük az iterációt végző alprogramokat nevezzük iteratív alprogramoknak ELTE IK, Alkalmazott modul: Programozás 4:2 Az iteráció sorrendjét az adatsorozat szerkezetének megfelelően a programozó adja meg egyes adatsorozatok (pl. konzol képernyő) csak egyféleképpen, más mások többféleképpen is feldolgozhatóak sokszor eleve a sorozat szerkezete sem szekvenciális pl. mátrixok esetén két gyakori módszer: sorfolytonos bejárás (a sorban vízszintesen feldolgozzuk az összes elemet, majd haladunk a következő sorra) oszlopfolytonos bejárás (az oszlopban függőlegesen feldolgozzuk az összes elemet, majd haladunk a következő oszlopra) ELTE IK, Alkalmazott modul: Programozás 4:3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sorfolytonos bejárás: 1, 2, 3, 4, 5, 6, 7, 8, oszlopfolytonos bejárás: 1, 5, 9, 13, 2, 6, 10, 14, mivel a mátrixok sor és oszlop szerint indexeltek, ezért a bejárás két futóindex szerint halad, vagyis két, egymásba ágyazott ciklussal 1 1 ) ELTE IK, Alkalmazott modul: Programozás 4:4 Feladat: Mátrixban tároljuk egy osztály adatait, minden sora egy diák, minden oszlopa egy tantárgy, a mátrix értékei a jegyek. Adjuk meg a legjobb jegyet. Tervezés: stdnr, clnr maximumkeresést kell végeznünk a teljes mátrixra, az elemek maximumát keressük, ezt kihelyezzük egy alprogramba readmarks (stdnr,clnr, matrix) mivel újrafelhasználható alprogramot készítünk, fel kell készülnünk arra, hogy a mátrix üres, ezért feltételes maximumkeresést végzünk a mátrix feltöltését is elemenkénti feldolgozással végezzük, és sorfolytonosan haladunk maxsearch (matrix, max) max main a diákok és tárgyak számát bekérjük a főprogramban ELTE IK, Alkalmazott modul: Programozás 4:5 ELTE IK, Alkalmazott modul: Programozás 4:6 1

bool maxsearch(vector<vector<int> > matrix, int& max) // feltételes maximumkeresés bool l = false; // ha üres a mátrix, akkor hamissal térünk // vissza // maximumkeresés a teljes mátrixra for (int i = 0; i < matrix.size(); i++) for (int j = 0; j < matrix[i].size(); j++) return l; if (!l) l = true; max = matrix[i][j]; else if (matrix[i][j] > max) max = matrix[i][j]; ELTE IK, Alkalmazott modul: Programozás 4:7 ELTE IK, Alkalmazott modul: Programozás 4:8 int main() int stdnr, clnr, max; vector<vector<int> > ; cout << "Hallgatók száma: "; cin >> stdnr; cout << "Tantárgyak száma: "; cin >> clnr; if (!readmarks(stdnr, clnr, )) // beolvasás, amely lehet sikertelen cout << "A beolvasás sikertelen!" << endl; return 1; // sikeres volt a beolvasás if (!maxsearch(, max)) // maximumkeresés, amely lehet sikertelen cout << "Nincsenek adatok!" << endl; return 2; // sikeres maximumkeresés cout << "A legjobb jegy: " << max << endl; return 0; ELTE IK, Alkalmazott modul: Programozás 4:9 ELTE IK, Alkalmazott modul: Programozás 4:10 Az adatsorozatot nem csak egy, de több lépésben is feldolgozhatjuk egyes részsorozatokat külön feldolgozunk, majd a kapott részeredményeket ismételten feldolgozhatjuk pl. egy mátrix esetén külön végezhetünk maximumkeresést a sorokra, majd a sorok maximumára A részsorozatok feldolgozására és a részeredmények feldolgozására használhatunk külön programozási tételt pl. ha a sorok átlagának maximumát akarjuk megállapítani, a sorokon összegzést, az átlagokon maximumkeresést végzünk ekkor beágyazzuk az egyik tételt a másikba, és keletkezik egy külső és egy belső programozási tétel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 4 8 12 16 ezeket a tételeket külön alprogramokba helyezhetjük, mindkét alprogram egyszerű ciklussal végez elemenkénti feldolgozást a belső alprogram általában csak a megfelelő részsorozatot kapja meg, pl. mátrix egy sorát ELTE IK, Alkalmazott modul: Programozás 4:11 ELTE IK, Alkalmazott modul: Programozás 4:12 2

Feladat: Mátrixban tároljuk egy osztály adatait, minden sora egy diák, minden oszlopa egy tantárgy, a mátrix értékei a jegyek. Adjuk meg, van-e olyan hallgató, akinek évet kell ismételnie (legalább három tárgyból bukott). egy számlálást kell végeznünk a hallgatókon (a mátrix sorai), amelynek feltétele a legalább három tárgyból bukás lineáris kereséssel megállapítjuk, hogy van-e olyan hallgató, akire a számlálás legalább hármat adott Tervezés: readmarks (stdnr,clnr, matrix) search(matrix) stdnr, clnr main tehát egy lineáris keresésbe ágyazunk számlálást matrix[i] c a lineáris keresés a mátrix sorain megy végig, míg a számlálás a sorokon belül dolgozik (tehát elég a mátrix sorát átadni paraméterként) count(vect) ELTE IK, Alkalmazott modul: Programozás 4:13 ELTE IK, Alkalmazott modul: Programozás 4:14 int count(vector<int> vect) int c = 0; // számlálás tétele for (int i = 0; i < vect.size(); i++) if (vect[i] == 1) c++; return c; bool search(vector<vector<int> > matrix) // lineáris keresés bool l = false; for (int i = 0; i < matrix.size() &&!l; i++) l = (count(matrix[i]) >= 3); // átadjuk a mátrix egy sorát return l; ELTE IK, Alkalmazott modul: Programozás 4:15 ELTE IK, Alkalmazott modul: Programozás 4:16 int main() if (!search()) // keresés cout << "Nincs évismétlő diák!" << endl; else cout << "Van évismétlő diák!" << endl; return 0; Deklaráció és definíció szétválasztása Lehetőségünk van szétválasztani az alprogram deklarációját a definíciójától a deklaráció tartalmazza az alprogram nevét, típusát, valamint paramétereinek típusát (a nevük nem kötelező): <típus> <név>(<paraméterek típusa>); a definíció megegyezik magával az alprogrammal: <típus> <név>(<paraméterek>) <utasítások> ezáltal átláthatóbbá tehető a programkód, pl.: void func(int); // deklaráció a főprogram előtt int main() /* itt használhatjuk Func-t */ void func(int a) /* utasítások */ ELTE IK, Alkalmazott modul: Programozás 4:17 ELTE IK, Alkalmazott modul: Programozás 4:18 3

Túlterhelés Lehetőségünk van ugyanolyan névvel különböző paraméterezésű alprogramok létrehozására, ezt az alprogram túlterhelésének nevezzük az alprogramok neve megegyezik, visszatérési típusa különbözhet, formális paramétereinek száma, vagy típusa kötelezően különböző kell, hogy legyen a program az átadott aktuális paraméterek száma, illetve típusa függvényében dönti el, melyik túlterhelt változatot futtatja akkor hasznos, ha ugyanazon tevékenységet különböző értékekkel, vagy befolyásoló tényezőkkel szeretnénk elvégezni Túlterhelés Pl.: int max(int a, int b) // két szám maximuma return a > b? a : b; string max(string a, string b) // két szövegé return a.length() > b.length()? a : b; int max(int a, int b, int c) // 3 szám maximuma return max(a, max(b, c)); int max(vector<int> v) // egy vektor maximuma x = max(10, 3, 8); // a 3. változatot hívja meg y = max("hello", "world"); // ez a 2. változatot ELTE IK, Alkalmazott modul: Programozás 4:19 ELTE IK, Alkalmazott modul: Programozás 4:20 Feladat: Mátrixban tároljuk egy osztály adatait, minden sora egy diák, minden oszlopa egy tantárgy, a mátrix értékei a jegyek. Adjuk meg, hány hallgatónak kell évet ismételnie (legalább három tárgyból bukott). egy számlálást kell végeznünk a hallgatókon (a mátrix sorai), amelynek feltétele a legalább három tárgyból bukás a bukások számát szintén számlálással tudjuk megadni, az előző számlálás eredményeiből kiindulva Tervezés: readmarks (stdnr,clnr, matrix) count(matrix) stdnr, clnr c main tehát egy számlálásba ágyazunk másik számlálást matrix[i] c a két alprogramot nevezhetjük ugyanúgy, hiszen más a paraméterezésük, így túlterhelés lép életbe count(vect) ELTE IK, Alkalmazott modul: Programozás 4:21 ELTE IK, Alkalmazott modul: Programozás 4:22 // alprogram deklarációk: bool readmarks(int stdnr, int clnr, vector<vector<int> >& matrix); int count(vector<int> vect); // túlterhelést használunk a count függvényre int count(vector<vector<int> > matrix); // főprogram: int main() int count(vector<vector<int> > matrix) int c = 0; // számlálás tétele a teljes mátrixon for (int i = 0; i < matrix.size(); i++) if (count(matrix[i]) >= 3) c++; // átadjuk a mátrix egy sorát return c; ELTE IK, Alkalmazott modul: Programozás 4:23 ELTE IK, Alkalmazott modul: Programozás 4:24 4

Mivel alprogram hívhat másik alprogramot, az is engedélyezett, hogy meghívja saját magát, ezt rekurziónak nevezzük, pl.: void func( ) func( ) esetén be kell tartanunk bizonyos szabályokat: az alprogram lefutása nem vezethet minden esetben rekurzív híváshoz az átadott paraméterek nem egyezhetnek meg a kapott paraméterekkel a paramétereknek az átadáskor úgy kell változnia, hogy idővel befejeződjön a rekurzió Pl. a faktoriális számítás megadható az! 1! képlettel itt mindkét oldalon szerepel a faktoriális, így kifejezhető rekurzióval: 1 0 1 0 0 1 1 ELTE IK, Alkalmazott modul: Programozás 4:25 ELTE IK, Alkalmazott modul: Programozás 4:26 itt teljesülnek a rekurzív függvény követelményei egy rekurzív hívás van, elágazás után, amely a paramétert vizsgálja a paraméter értéke minden lépésben csökken, idővel eléri a nem rekurzív ágat megvalósítás: int fact(int n) if (n > 1) return n * fact(n - 1); // rekurzív hívás else return 1; ELTE IK, Alkalmazott modul: Programozás 4:27 Pl. a Fibonacci-számok esetén az előző kettő összegét vesszük, vagyis itt jobb oldalon kétszer is szerepel a bal oldali eredmény: 0 0 1 1 1 2 1 0 1 1 1 1 1 2 ELTE IK, Alkalmazott modul: Programozás 4:28 megvalósítás: int F(int n) if (n == 0) return 0; if (n == 1) return 1; // az elágazás elhanyagolható return F(n - 1) + F(n - 2); // rekurzív hívás A rekurzió lehet egyszeres: egy rekurzív hívás történik, pl. elemenkénti feldolgozások esetén (faktoriális) többszörös: több rekurzív hívás történik, pl. Fibonacciszámok, elágazó adatszerkezetek bejárása (fa, gráfok) Sok feladatra iteratív és rekurzív megoldás is adható, azonban hatékonyságuk különbözhet pl. a Fibonacci számok esetén a rekurzív változat a köztes értékeket többször is kiszámítja: 1 2 2 3 2 ELTE IK, Alkalmazott modul: Programozás 4:29 ELTE IK, Alkalmazott modul: Programozás 4:30 5

átalakítása iterációra Elemenkénti feldolgozás esetén a rekurzió könnyen átfogalmazható iteratívra az iteratív ciklus léptetése megfelel a rekurzív hívásnak pl. a faktoriális iteratív megfogalmazása (összegzéssel): 1, 1 1 átalakítása iterációra A rekurzív alprogramok iteratív átalakítására szolgál a rekurzív függvények kibontásának programozási tétele lényege, hogy az értékeket iteratívan számoljuk, a korábban kiszámolt értékeket pedig ne számoljuk ki újra, hanem tároljuk el, és léptessük az értékeket pl. a Fibonacci számítás iteratív megfogalmazása: 1, 0, 2,, 1 ELTE IK, Alkalmazott modul: Programozás 4:31 ELTE IK, Alkalmazott modul: Programozás 4:32 átalakítása iterációra megvalósítás: int F(int n) int f = 1, x = 0; // inicializálás for (int i = 2; i <= n; i++) int y = f + x; // a következő érték számítása x = f; // értékek léptetése f = y; return f; // eredmény átalakítása iterációra működése: f = 1, x = 0 függvény futása y = 1, f = 1, x = 0 y = 1, f = 1, x = 1 y = 2, f = 2, x = 1 y = 3, f = 3, x = 2 y = 5, f = 5, x = 3 cikluslépés ELTE IK, Alkalmazott modul: Programozás 4:33 ELTE IK, Alkalmazott modul: Programozás 4:34 6