Dinamikus láncolt lista 4. GYAKORLAT

Hasonló dokumentumok
3. Osztályok II. Programozás II

C++ programozási nyelv

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

C++ programozási nyelv Konstruktorok-destruktorok

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

500. AA Megoldó Alfréd AA 500.

4. Öröklődés. Programozás II

Fejlett programozási nyelvek C++ Iterátorok

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Programozás II gyakorlat. 8. Operátor túlterhelés

Pénzügyi algoritmusok

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Szoftvertechnolo gia gyakorlat

Programozás II gyakorlat. 6. Polimorfizmus

Objektumok inicializálása

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás C++ -ban

1. Alapok. Programozás II

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Felhasználó által definiált adattípus

Osztályok. 4. gyakorlat

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

OOP #14 (referencia-elv)

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Bevezetés a programozásba I.

Bevezetés a programozásba 2

Programozási alapismeretek 4.

500. DD Megoldó Alfréd DD 500.

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Programozási nyelvek Java

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

Adatszerkezetek és algoritmusok

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Bevezetés a programozásba Előadás: A const

Programozás I gyakorlat

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

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

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

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

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Osztály és objektum fogalma

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

Objektumorientált programozás C# nyelven

OOP: Java 8.Gy: Abstract osztályok, interfészek

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

C++ Standard Template Library (STL)

JAVA PROGRAMOZÁS 2.ELŐADÁS

500. CC Megoldó Alfréd CC 500.

C++ Gyakorlat jegyzet 8. óra

C++ Gyakorlat jegyzet 7. óra

Programozás C++ -ban 2007/4

Bevezetés, a C++ osztályok. Pere László

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

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

Programozási Nyelvek: C++

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Abstract osztályok és interface-ek. 7-dik gyakorlat

Szövegek C++ -ban, a string osztály

128. AA Megoldó Alfréd AA 128.

Java és web programozás

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

RESIDENT EVIL CODENAME: NIK

Java programozási nyelv 5. rész Osztályok III.

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Globális operátor overloading

Bevezetés a programozásba előadás: Öröklődés

503.AA Megoldo Arisztid 503.A

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

C++ programozási nyelv

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

Elemi alkalmazások fejlesztése II. 2. Beadandó feladat Juhász Ádám

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Java II. I A Java programozási nyelv alapelemei

117. AA Megoldó Alfréd AA 117.

Java II. I A Java programozási nyelv alapelemei

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

Google C++ style guide

Java és web programozás

1.AA MEGOLDÓ BERCI AA 1.

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Programozási technológia

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

Programozási nyelvek II. JAVA

A C++ Standard Template Library rövid összefoglalás

A C programozási nyelv I. Bevezetés

Átírás:

Dinamikus láncolt lista 4. GYAKORLAT

Szekvenciális adatszerkezet A szekvenciális adatszerkezet olyan <A, R> rendezett pár, amelynél az R reláció tranzitív lezártja teljes rendezési reláció. Szekvenciális adatszerkezetben az egyes adatelemek egymás után helyezkednek el, van egy logikai sorrendjük. Az adatok között egy-egy jellegű a kapcsolat: minden adatelem alapvetően csak egy helyről érhető el és az adott elemtől csak egy másik látható. Két kitüntetett elem: az első és az utolsó.

Láncolt listák Egyirányú láncolt lista pl.: A láncolt dinamikus sor nagyon hasonló egy ilyen listához (Csak a műveletek mások.) L NIL Kétirányú láncolt lista (Ezen a gyakorlaton ezzel fogunk foglalkozni) L NIL NIL

Node osztály class Node { public: int data; // Az adat, amelyet tárol Node* prev; // Az előző elemre mutató pointer Node* next; // A következő elemre mutató pointer Node(const int& data); // konstruktor Node(const int& data, Node* prev, Node* next); // konstruktor }; Mivel láncolt ábrázolásról van szó, kell egy Node osztály, ami tartalmazza az értéket, és hivatkozást a szomszédos elemekre. A head megelőzője és a tail rákövetkezője NULL.

Kétirányú láncolt lista osztály class List { private: class Node { }; // Ez a default láthatóság, de szebb, ha kiírjuk }; public: A Node osztály a listának egy belső osztálya (enkapszuláció), és mivel private a listán belül, a listán kívüli programrész nem is látja, nem is tud a létezéséről. Csak a belső szerkezet megvalósítására használjuk. A Node-nak minden adattagja public, ami azt jelenti, hogy a lista bármikor láthatja a Node belsejét.

Láncolt lista elemei class List { protected: Node *head; // A lista eleje Node *tail; // A lista vége Node *act; // Az aktuális elem }; Három kitüntetett elem van. A lista eleje, a vége és egy 'aktuális' elem. Ezzel az aktuális elemmel járhatjuk be az egész listát.

Láncolt lista metódusai Nyissuk meg a DinLinkedList_int project list.hpp fájlját Nézzük át közösen a láncolt lista metódusainak specifikációját Írjuk meg közösen a következő három dián bemutatott metódusokat

Láncolt lista - insertfirst Példa 1: insertfirst(int e) Node* p = new Node(e); if (isempty()) { act = head = tail = p; } else { p->next = head; head->prev = p; Head Act act = head = p; } p NULL adat adat adat e

Láncolt lista - insertbefore Node* p = new Node(e, act->prev, act); Példa 2: insertbefore(int e) act->prev->next = p; act->prev = p; act = p; p Act adat adat adat e

Láncolt lista - removeact Példa 3: removeact() Node* p = act; act = act->next; p->next->prev = p->prev; p->prev->next = p->next; delete p; p Act adat adat adat

Láncolt lista A megírt metódusok alapján írjátok meg a hiányzó metódusokat! insertlast insertafter removefirst removelast

String-eket tartalmazó lista Nyissátok meg a DinLinkedList_string projectet Másoljátok át a list.hpp fájlt ebbe a mappába és adjátok hozzá a projecthez Módosítsátok, hogy string-eket lehessen betölteni a listába Teszteljétek a mellékelt main.cpp-vel

String vs. int Szinte ugyanaz a kód Biztos van valami jó megoldás...

Sablon (Template) Egy függvény vagy osztály definíciója során megtehetjük, hogy a paraméterek, változók vagy épp a visszatérési érték típusát nem egy előre ismert típusként adjuk meg, hanem egy típust jelző változóval helyettesítjük (típusparaméter). Tehát az adott kódot csak egyszer kell megírnunk és az több típus kezelésére is alkalmas lesz sablonok használatával.

Template - példa void swap(int &a, int &b) { int c = a; a = b; b = c; } int a(3), b(4); swap(a, b); template <typename T> void swap(t &a, T &b) { T c = a; a = b; b = c; } int a(3), b(4); swap<int>(a, b); swap(a, b); //spec. eset

Template Template-tel paraméterezett függvény hívásakor, ha a fordító egyértelműen el tudja dönteni a típusparamétert, nem szükséges explicit módon megadni. (A példában a második függvényhívás: swap(a,b); ). template <typename T> void f() { } template <typename T> void g(t x) { }

Template Template-tel paraméterezett kód esetén a fordító a használat alkalmával készíti el az adott típushoz tartozó tárgykódot. Azaz a swap<int>(a, b); és a swap<long>(a, b); hívások során két külön verzió készül a swap függvény kódjából. Emiatt minden template-tel paraméterezett kódnak a header file-ban kell lennie.

Template - osztály A template-es osztályok szintaxisa a következő: template <typename T> class A { T data; T f(); }; template <typename T> T A<T>::f() { } Amint látható, a megvalósításnál is jeleznünk kell a template paramétert A deklarációnak és a megvalósításnak itt is egy fájlban kell lennie A két relációs jel között a typename és a class kulcsszó általában ugyanazt jelenti

Template Jó tudni: C++-ban nem tudunk megszorításokat tenni a típusparaméterre. Ennek következménye, hogy, ha a típusra nem létezik egy adott művelet/változó/stb., akkor a problémához csak részben kapcsolódó, nehezen értelmezhető hibaüzenetet kapunk.

Általános kétirányú láncolt lista Nyissátok meg a DinLinkedList_template projectet Írjuk át a meglévő list.hpp fájlokat sablonos verzióra

Általános kétirányú láncolt lista Továbbra is a DinLinkedList_template projectet nézzük Írjuk meg az új clear() segéd eljárást. Most már tesztelhetjük a main.cpp-vel

Iterátorok Speciális objektumok, általában egy gyűjtemény bejárására Hasznos eszközök a felhasználói ciklikus léptetések elrejtésére, így sokkal tömörebb, érthetőbb kódot kapunk Példa - STD tárolók használatánál: vector<int> v(5); vector<int>::iterator it = v.begin(); // az első elemre // mutató iterátor Minden osztály definiálhat többféle iterátort is

List osztály - Iterátora A List osztály Iterator osztályának operátorai: Operátor Funkció == azonos-e a két iterátor!= különböző-e a két iterátor ++ a következő elemre lép -- az előző elemre lép * dereferencia Ezekre az operátorokra van szükségünk az alapvető bejárás kivitelezéséhez Ezenkívül szükséges iterátor függvények: Iterator begin() const; // a lista elejére állítja az iterátort Iterator end() const; // a lista végére állítja az iterátort Iterator last() const; // a lista utolsó elemére állítja az iterátort

Iterátorok példa bejárásra Iterátorok használata lehetővé teszi az adatszerkezetünk egyszerű bejárását. Például: for (List<int>::Iterator it = list.begin(); it!= list.end(); ++it) { cout << *it << ' '; } cout << endl; Az elemek tárolt értékének eléréséhez szükségünk van dereferencia (*) operátorra

Iterátor osztály Nyissuk meg a DinLinkedList_iterator project list.hpp fájlját Nézzük át a kódot és közösen készítsük el az iterátor osztályt és metódusait. Készítsük el az új lista metódust is, mely a keresett elemre mutató iterátort adja vissza Iterator find(const T& e) const; Készítsünk egy saját kiíró operátort (Az iterátor segítségével, lásd list.hpp fájl vége)! cout << list;

Gyakorló feladat G04F01 Pályaudvar szimulátor A pályaudvar fix darabszámú vágányból áll Egy vágányon egyszerre több vonat is tartózkodhat Egy vágányról az a vonat indulhat el először (értelemszerűen), aki elsőnek érkezett A pályaudvar vágányaira vonatok érkeznek, amelyek különböző darabszámú vagonnal rendelkeznek Egy vagon tartalma szöveges. pl.: 'biciklis kocsi', 'marhavagon', 'első osztály', stb. Nem kell külön osztály a vagonoknak! A vonathoz bárhova hozzá lehet illeszteni egy új vagont. Kiválasztjuk az aktuális vagont, és elé, vagy utána új vagont illesztünk be

Gyakorló feladat G04F01 (folytatás) A program véletlenszerűen érkeztet néhány vonatot a pályaudvarra (Egy vágányra több vonat is érkezzen!) Néhány vágányon egy-egy vonathoz tegyen a program egy új vagont! (pl. az első vágányon levő második vonat végéhez hozzáteszi a 'gyerekkocsi' vagont.) Néhány véletlenszerű vágányról elindít egy-egy vonatot!

Gyakorló feladat G04F02 Egyszerű adatbázis Készíts egy adatbázis programot, ami egy eltárolt fájlt képes beolvasni, a benne levő elemeket módosítani, majd visszaírni a fájlba. Az adatbázisban tárolt elemek egyszerű string-ek. A fájlban az elemeket soronként tárold. A program induláskor beolvassa a fájl tartalmát egy listába. Ezután egy konzolos menü interfészt ad, amelyen keresztül a felhasználó kiírathatja az összes elemet, eltávolíthat, hozzáadhat. A program kilépéskor írja be az elemeket a fájlba, így következő induláskor megint láthatóak a tárolt elemek.

Gyakorló feladat G04F03 Lista statikus implementációval A lista elemeit nem dinamikus láncolással, hanem statikusan, egy tömbben tárold. A tömb elemei érték-index párok. A lista az összes lista műveletet implementálja. Iterátorokkal is rendelkezzen. Copy constructor és assignment operator is legyen rajta definiálva. Figyelj arra, hogy a statikus ábrázolás miatt a lista nem csak alul-, hanem túl is csordulhat!

Gyakorló feladat G04F04 Írj egy befűző függvényt, amely paraméterül kap egy másik listát,és az elemeit befűzi az aktuális elem utánra (és írd meg azt is ami az aktuális elem elé szúrja be)! A függvény legyen a lista tagfüggvénye. Profiknak: A függvény ne legyen része az alap listának! Ezen kívül a befűzés konstans időben fusson le, és a befűzendő listát ürítse ki! Ezek után használd a listát mint stringet, tehát tárolj benne karaktereket (char)! Kérj be a konzolból egy szöveget, és töltsd fel vele a listát! Ezután kérj be egy másik szöveget, és egy karaktert, majd a szöveget fűzd be az első szövegbe úgy, hogy az a bekért karakter első előfordulása után kezdődjön!

Gyakorló feladat G04F05 Valósítsunk meg kétszeresen, körkörösen láncolt listát fejelemmel! A körkörös láncolás azt jelenti, hogy a begin() iterátor a fejelem rákövetkezőjére mutat, az end() a fejelemre, a last() pedig a fejelem megelőzőjére Head end() begin() last() Ez azt eredményezi, hogy a lista végén nincs nullpointer, hanem a láncot visszaakasztjuk a lista elejére Az insert művelet így lényegesen leegyszerűsödik, hiszen nem kell vizsgálni a külön eseteket, minden elemnek van előző és következő eleme

Házi feladat G04F06 A feladat egy gyártósor felépítése. A sor egyes állomásait node-ok reprezentálják, amik egyéni (elemi) feladatokat tudnak elvégezni. De ahhoz, hogy egy termék elkészülhessen ezen alegységek együttműködésére van szükség. Legyenek előre definiált feladatokat elvégző node-ok. Egy szöveges fájlból lehessen megadni az egyes alfeladatokat. A szöveges fájl alapján építsük fel a feladatot elvégezni képes gyártósort, majd végezzük el a feladatot. Az első node fogadja a bemenő paramétereket (input node), az utolsó node pedig megadja a végleges terméket (Kiírja a paramétereit egy szöveges fájlba.) Input Task01 Task02 Output

Házi feladat folyt. G04F06 Feladat: Autó összeszerelő gyártósor: Szükséges node-ok: karosszéria gyártó, elektronika beszerelő, festő, A gyártósor egy tényleges autó objektumon dolgozzon. Az egyik node adjon hozzá egy motor objektumot az autóhoz (lehessen paraméterezni: sebesség, gyári szám), a másik rendeljen hozzá színt és rendszámot. Majd végül az output node jelenítse meg az autó paramétereit. Bemeneti txt péda: // input node feldolgozza az adatokat Audi // karosszéria node létrehozza az autót (súlya is van a karosszériának) 140,100 // beszereli a létrehozott motor objektumot (sebesség, gyári szám) Fekete,ABC-001 // színt ad az autónak és rendszámot Kulcsszavak: polimorfizmus, dinamikus kötés, láncolt lista

Házi feladat folyt. G04F06 Házi feladat hint: Az órán megírtunk egy template-es láncolt listát. Ezt fel tudjuk használni mégpedig úgy, hogy Egy ős szerelő osztály típusú listát hozunk létre. LinkedList<Szerelo> list; // a data adattag Szerelő típusú lesz Ennek a szerelő ősosztálynak van egy pl.: dosomething() metódusa, amit a leszármazottaknak felül kell definiálni. Tehát az Input node beolvas egy fájlt. A motor szerelő létrehozza a motort és beszereli. Mikor felépült a lista, akkor meghívunk pl.: egy start() metódust, vagyis bejárjuk a listát, miközben minden egyes nodnak lefut a saját dosomething() implementációja és elkészül a termék.