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.

Hasonló dokumentumok
A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Feladat. Ternáris fa. Típusspecikáció. Reprezentáció. Absztrakt implementáció. Érdi Gerg EAF II. 4/3.

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

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

Fejlett programozási nyelvek C++ Iterátorok

Cekla. Készítette Doxygen Tue Sep :13:44

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

Programozás I gyakorlat

500. AA Megoldó Alfréd AA 500.

Tervminták II. (Híd, Bejáró, Gyártófüggvény) Halmaz és bejárása Osztály-sablonok

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

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

503.AA Megoldo Arisztid 503.A

1000.AA Megoldo Alfréd 1000.A

500. DD Megoldó Alfréd DD 500.

Adatszerkezetek és algoritmusok

Programozási technológia

C++ programozási nyelv

500. CC Megoldó Alfréd CC 500.

500.AJ Megoldó Magyar Magdolna 500.J

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

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

500.AA Megoldó Kulcsár 500.A

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

1.AA MEGOLDÓ BERCI AA 1.

Objektumelvű programozás

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

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

C++ Standard Template Library (STL)

228. AA Default Konstruktor AA 228.

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

500.AA Megoldo Arisztid 500.A

128. AA Megoldó Alfréd AA 128.

3. Osztályok II. Programozás II

Buborékrendezés: Hanoi Tornyai: Asszimptótikus fv.ek: Láncolt ábrázolás: For ciklussal:

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

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

Collections. Összetett adatstruktúrák

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

A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista.

.AA Megoldó Alfréd AA.

Dinamikus láncolt lista 4. GYAKORLAT

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

OAF Gregorics Tibor: Minta dokumentáció a 4. házi feladathoz 1. Feladat. Megoldás

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

feladat pont min elért

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Programozási nyelvek Java

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

Objektumok inicializálása

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) {} };

Globális operátor overloading

117. AA Megoldó Alfréd AA 117.

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..

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

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

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

EAF II Feladat dokumentáció IV. feladat 4. házi feladathoz

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1.

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

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Egyirányban láncolt lista

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1. Készítette: Gregorics Tibor

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

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Táblázatok fontosabb műveletei 1

Programozás I gyakorlat

feladat pont min elért

10. előadás Speciális többágú fák

Osztály és objektum fogalma

C++ Gyakorlat jegyzet 8. óra

Magas szintű programozási nyelvek 2 Előadás jegyzet

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

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

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

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

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

C++ programozási nyelv Konstruktorok-destruktorok

Imperatív programozás

Objektum-orientált programozás

Adatszerkezetek és algoritmusok

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

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3

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

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

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

.Net adatstruktúrák. Készítette: Major Péter

Fejlett programozási nyelvek C++

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

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Osztályok. 4. gyakorlat

ZH mintapélda. Feladat. Felület

Programozási nyelvek II.: JAVA, 3. gyakorlat

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

Algoritmusok és adatszerkezetek II.

Átírás:

Érdi Gerg EF II. 2/2. Feladat Készítsen egy zsák típust! lkalmazzon osztályt! zsákokat rendezett láncolt listával ábrázolja! Implementálja a szokásos m veleteket, egészítse ki az osztályt a kényelmes és biztonságos használat érdekében megfelel metódusokkal (zsákbeolvasó operátor, zsákkiíró operátor), alkalmazzon kivételkezelést, készítsen teszt környezetet, és bontsa modulokra a programját! teszt környezet hívjon meg egy olyan barát-operátort is, amely kiszámítja két zsák unióját (a közös elemek el fordulása összegz dik)! z unióképzés m veletigénye: O(m + n), ahol m és n a két zsáknak megfelel halmazok elemszáma. Zsák Típusspecikáció zsák olyan halmaz, amelyben az elemeknek multiplicitása van, tehát a halmaz egyfajta általánosításaként fogható fel: egy halmazban az operátor L-be képez, de deniálható pl. a következ operátor: mul : S T N 1 ha t S mul(s, t) := 0 egyébként Zsákban pedig mul(b, t) tetsz leges nemnegatív értéket felvehet. Reprezentáció Itt egyszer a dolgunk: a feladatkiírásban szerepel, hogy rendezett, láncolt listát kell használnunk. lista elemei (elem, multiplicitás) =: (e, m) párok. rendezettséget a hozzáadó és az eltávolító m veletek tartják fent. Ha egy elem multiplicitása nullára csökken, akkor az elemhez tartozó lista-elemet kitöröljük a listából. Új elem beszúrásakor megkeressük a listában az elemhez tartozó helyet, és ha már létezik a listában megfelel elem, akkor növeljük annak a multiplicitását, ha pedig nem, akkor beszúrunk egy új elemet. bsztrakt implementáció Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk. i, found : nd(e) i : begin(l), j : end(l) i j i.t.e < e i : next found := (i j) (i.t.e = e)

Érdi Gerg EF II. 2/2. Hozzáadás, Törlés b : add(e) b : remove(e) i, found : nd(e) i, found : nd(e) found i.t.m := i.t.m + 1 l : insert(i, (e, 1)) found i.t.m = 1 l : remove(i) i.t.m := i.t.m 1 HIB Elem multiplicitásának lekérdezése m : mul(e) i, found : nd(e) found m := i.t.m m := 0 Zsákok uniója Természetesen elegend lenne az eddigi insert m velet is két zsák uniójának kiszámolásához, azonban ez egyrészt minden elemet annyiszor dolgozna fel, amennyi a multiplicitása, másrészt nem használná ki azt, hogy a két forrás-zsákot reprezentáló lista maga is már rendezve van. Ezért az alábbi, az elemenkénti feldolgozásra épul, O(n 1 + n 2 ) m veletigény unió-m veletet használjuk: z : (x, y) i x : begin(x.l), j x : end(x.l) i y : begin(y.l), j y : end(y.l) i x j x i y j y j : end(z.l) i x j x i y j y i x.t.e == i y.t.e i x j x (i y = j y i x.t.e < i y.t.e) i y j y (i x = j x i y.t.e < i x.t.e) z.l : insert (j, (i x.t.e, i x.t.m + i y.t.m)) z.l : insert (j, (i x.t.e, i x.t.m)) z.l : insert (j, (i y.t.e, i y.t.m)) i x : next i y : next i x : next i y : next Fekete doboz-tesztelés 1. Üres zsákba elem berakása 2. Új elem berakása zsákba 3. Bentlév elem újbóli berakása zsákba 4. Egynél többször szerepl elem törlése 5. Egyszer szerepl elem törlése

Érdi Gerg EF II. 2/2. 6. Zsákban nem lév elem törlési kísérlete 7. Üres zsákok uniója 8. Üres és nemüres zsák uniója 9. Diszjunkt zsákok uniója 10. Nem-diszjunkt zsákok uniója

Érdi Gerg EF II. 2/2. C++ implementáció zsák típust természetesen mint osztály-sablon implementáljuk, a sablon típusparamétere az elemek típusa, és ezek rendezése. z elemek eltárolására egy megfelel elem-típusú láncolt listát használunk. template<typename T, typename Compare=s t d : : l e s s <T> > class Bag public : typedef T elem_t ; typedef Compare compare_t ; private : struct l i s t e l e m _ t elem_t elem ; int m; ; l i s t e l e m _ t ( const elem_t &elem_, int m_ = 1 ) : elem ( elem_ ), m (m_) typedef L i s t <l i s t e l e m _ t > l i s t _ t ; typedef typename l i s t _ t : : i t e r a t o r l i s t _ i t e r a t o r ; typedef typename l i s t _ t : : c o n s t _ i t e r a t o r c o n s t _ l i s t _ i t e r a t o r ; l i s t _ t l i s t ; //... ; Konstruktor, destruktor Default konstruktorra tulajdonképpen nincs szükség: a láncolt lista alaphelyzetben üresen indul, ami pont megfelel az üres zsáknak. Bag ( ) ; Értékadás, másolás Másoló konstruktort és értékadó operátort is készítünk osztályunkhoz, természetesen mindkét m velet egyszer en az (elem, multiplicitás) párok listájának átmásolását jelenti. // Copying, assignment Bag ( const Bag &o t h e r ) : l i s t ( o t h e r. l i s t ) Bag& operator= ( const Bag &o t h e r ) i f ( this == &o t h e r ) return this ; l i s t = o t h e r. l i s t ; return this ; Iterálás Jogos igény, hogy zsákunk kövesse az STL konténerek interfész-mintáit. Ezért a zsák elemeit iterator és const_iterator típusú iterátorokkal járhatjuk be. Bejáráskor minden egyes elemet

Érdi Gerg EF II. 2/2. a multiplicitásának megfelel ször kapjuk. Ezt úgy implementáljuk, hogy az iterátorban bennevan az is, hogy éppen hányadik példányt jelenti: class i t e r a t o r l i s t _ i t e r a t o r i t e r ; int i ; i t e r a t o r ( const l i s t _ i t e r a t o r &i t e r _ ) : i t e r ( i t e r _ ), i ( i t e r? i t e r >m : 0) friend class Bag ; public : typedef elem_t& r e f e r e n c e ; typedef elem_t p o i n t e r ; r e f e r e n c e operator ( ) return i t e r >elem ; p o i n t e r operator > ( ) return i t e r >elem ; i t e r a t o r& operator++() next ( ) ; return this ; const i t e r a t o r operator++(int ) i t e r a t o r r e t = this ; ++ this ; return r e t ; bool operator== ( const i t e r a t o r &o t h e r ) const return o t h e r. i t e r == i t e r && o t h e r. i == bool operator!= ( const i t e r a t o r &o t h e r ) const return! ( o t h e r == this ) ; private : void next ( ) i f ( i ) return ; ; ++i t e r ; i = i t e r? i t e r >m : 0 ; // c o n s t _ i t e r a t o r h a s o n l ó a n i t e r a t o r b e g i n ( ) return i t e r a t o r ( l i s t. b e g i n ( ) ) ; c o n s t _ i t e r a t o r b e g i n ( ) const return c o n s t _ i t e r a t o r ( l i s t. b e g i n ( ) ) ; i t e r a t o r end ( ) return i t e r a t o r ( l i s t. end ( ) ) ; c o n s t _ i t e r a t o r end ( ) const return c o n s t _ i t e r a t o r ( l i s t. end ( ) ) ; Hozzáadás, elvétel, multiplicitás, unió tárgyalt absztrakt programok egyszer implementációi. void Bag<T, Compare > : : add ( const elem_t &elem ) l i s t _ i t e r a t o r i ; i f ( f i n d ( elem, i ) ) ++i >m; else l i s t. i n s e r t ( i, l i s t e l e m _ t ( elem, 1 ) ) ;

Érdi Gerg EF II. 2/2. void Bag<T, Compare > : : remove ( const elem_t &elem ) l i s t _ i t e r a t o r i ; i f ( f i n d ( elem, i ) ) i f (! i >m) l i s t. remove ( i ) ; else throw s t d : : runtime_ error ( " Trying to remove element not i n bag " ) ; int Bag<T, Compare > : : operator [ ] ( const elem_t &elem ) const c o n s t _ l i s t _ i t e r a t o r i ; i f ( f i n d ( elem, i ) ) return i >m; else return 0 ; Bag<T, Compare> operator+ ( const Bag<T, Compare> &l h s, const Bag<T, Compare> &r h s ) typedef Bag<T, Compare> bag_t ; typedef typename bag_t : : l i s t _ t l i s t _ t ; typedef typename bag_t : : l i s t e l e m _ t l i s t e l e m _ t ; typedef typename bag_t : : compare_t compare_t ; bag_t r e t ; typename l i s t _ t : : c o n s t _ i t e r a t o r i = l h s. l i s t. b e g i n ( ) ; typename l i s t _ t : : c o n s t _ i t e r a t o r j = r h s. l i s t. b e g i n ( ) ; while ( i!= l h s. l i s t. end ( ) j!= r h s. l i s t. end ( ) ) i f ( i!= l h s. l i s t. end ( ) && j!= r h s. l i s t. end ( ) && i >elem == j >elem ) r e t. l i s t. i n s e r t ( r e t. l i s t. end ( ), l i s t e l e m _ t ( i >elem, i >m + j >m) ) ; ++i ; ++j ; else i f ( i!= l h s. l i s t. end ( ) && ( j == r h s. l i s t. end ( ) compare_t ( ) ( i >elem, j >ele r e t. l i s t. i n s e r t ( r e t. l i s t. end ( ), l i s t e l e m _ t ( i >elem, i >m) ) ; ++i ; else i f ( j!= r h s. l i s t. end ( ) && ( i == l h s. l i s t. end ( ) compare_t ( ) ( j >elem, i >ele r e t. l i s t. i n s e r t ( r e t. l i s t. end ( ), l i s t e l e m _ t ( j >elem, j >m) ) ; ++j ; return r e t ;

Érdi Gerg EF II. 2/2. Beolvasás/kiírás zsák tartalmát úgy szerializáljuk, hogy kiírjuk a lista elemeinek számát, majd egymás után a lista elemeit multiplicitás elem formátumban: s t d : : ostream& operator<< ( s t d : : ostream &s t r, const Bag<T, Compare> &bag ) typedef Bag<T, Compare> bag_t ; s t r << bag. l i s t. s i z e ( ) << ' ' ; for (typename bag_t : : l i s t _ t : : c o n s t _ i t e r a t o r i = bag. l i s t. b e g i n ( ) ; i!= bag. l i s t. end ( ) ; ++ s t r << i >m << ' ' << i >elem << ' ' ; return s t r ; s t d : : i s t r e a m& operator>> ( s t d : : i s t r e a m &s t r, Bag<T, Compare> &bag ) typedef Bag<T, Compare> bag_t ; bag. c l e a r ( ) ; s i z e _ t s ; for ( s t r >> s ; s t r && s ; s ) int m; typename bag_t : : elem_t elem ; s t r >> m >> elem ; i f ( s t r ) bag. l i s t. i n s e r t ( bag. l i s t. end ( ), typename bag_t : : l i s t e l e m _ t ( elem, m) ) ; return s t r ; Tesztelési terv 1. (l. absztrakt implementációs rész) 2. Zsák kiírása stream-be 3. Zsák beolvasása stream-b l

Érdi Gerg EF II. 2/2. Függelék: Láncolt lista Típusspecikáció Típusérték-halmazunk L = T, vagyis a T elem-típusú sorozatok. M veleteink a beszúrás, a törlés, és a végiglépdelés. Ezek formális leírásához szükségünk lenne az L T feletti iterátor típusra, annak m veleteire, stb. Ezekt l itt eltekintünk. feladat kiírásában szerepl rendezett láncolt lista ebb l az egyszer, láncolt listából jön létre olymódon, hogy a zsák típus a reprezentációjául szolgáló listát speciális módon kezeli. Reprezentáció láncolt listát (min meglep ) láncoltan reprezentáljuk, a kezd - és a vég-csomópont eltárolásával, az iterátorok pedig egy (el z, aktuális) mutató-párt tartalmaznak. bsztrakt implementáció Beszúrás Beszúráskor az i. prev = NIL esettel reprezentált legel re-beszúrás speciálisan kezelend (mivel a feladat kiírása nem tartalmazta, hogy fejelemes listát használjunk). s : insert(i, t) new(p) p t := t i. prev = NIL p next, rst := rst, p p next, i. prev next := i. curr, p last := p i. curr = NIL SKIP Törlés Törléskor el ször kiláncoljuk az iterátor által mutatott elemet, majd elvégezzük a felszabadítást, végül, ha az utolsó vagy az els elemet töröltük, akkor értelemszer en frissítjük az utolsó/els mutatót: s : remove(i) rst := rst next last := i. prev i. prev = NIL i. curr = last dispose(i. curr) HIB i. curr = NIL SKIP i. prev next := i. curr next SKIP

Érdi Gerg EF II. 2/2. Fekete doboz-tesztelés 1. Üres listába beszúrás 2. Beszúrás nem üres lista elejére, végére, közepére 3. Egyelem listából elem törlése 4. Nemlétez elem törlése