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

Hasonló dokumentumok
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

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

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

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

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

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

117. AA Megoldó Alfréd AA 117.

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

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

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

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

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

228. AA Default Konstruktor AA 228.

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

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

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

.AA Megoldó Alfréd AA.

500. CC Megoldó Alfréd CC 500.

Bevezetés a programozásba 2

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.

1000.AA Megoldo Alfréd 1000.A

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

Programozási tételek újrafelhasználása

Maximum kiválasztás tömbben

503.AA Megoldo Arisztid 503.A

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.

500.AA Megoldo Arisztid 500.A

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

1.AA MEGOLDÓ BERCI AA 1.

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

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

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

500. DD Megoldó Alfréd DD 500.

500.AJ Megoldó Magyar Magdolna 500.J

Mit ír ki? feladatok megoldásokkal

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

Programozás C++ -ban

Generikus Típusok, Kollekciók

128. AA Megoldó Alfréd AA 128.

Bánsághi Anna

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

Programozás II. ATM példa Dr. Iványi Péter

Fejlett programozási nyelvek C++ Iterátorok

Osztály és objektum fogalma

C# osztályok. Krizsán Zoltán

Programozás II gyakorlat. 6. Polimorfizmus

feladat pont min elért

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Bevezetés a C++ programozási nyelvbe

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

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

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

C++ Gyakorlat jegyzet 7. óra

feladat pont min elért

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

Programozási tételek újrafelhasználható osztálysablon könyvtára

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

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

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

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

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

500. AA Megoldó Alfréd AA 500.

Pénzügyi algoritmusok

és az instanceof operátor

Programozási nyelvek Java

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

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

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

félstatikus adatszerkezetek: verem, várakozási sor, hasítótábla dinamikus adatszerkezetek: lineáris lista, fa, hálózat

500.AA Megoldó Kulcsár 500.A

Programozási feladatok megoldása visszavezetéssel egy osztály-sablon könyvtárra támaszkodva 1

3. Osztályok II. Programozás II

Programozás C++ -ban 2007/4

C++ Gyakorlat jegyzet 8. óra

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

Programozás alapjai II. (8. ea) C++ bejárók és egy tervezési példa

Dinamikus láncolt lista 4. GYAKORLAT

Programozás. C++ típusok, operátorok. Fodor Attila

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

OOP #14 (referencia-elv)

Objektumok inicializálása

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

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

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

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

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

Objektumorientált programozás C# nyelven III.

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

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

AA MEGOLDÓ ALADÁR AA

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Adatszerkezetek és algoritmusok

Kivételkezelés a C++ nyelvben Bevezetés

Programozás C++ -ban

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

Osztályok. 4. gyakorlat

Szoftvertechnológia 3. előadás. Objektumorientált tervezés: alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Átírás:

Objektum elvű alkalmazások fejlesztése Verem típus osztály-sablonja Készítette: Gregorics Tibor

Készítsünk olyan újra-felhasználható kódot, amellyel vermeket lehet létrehozni és használni. Egy verem-objektum reprezentációját az határozza meg, hogy adunk-e felső korlátot a verem méretére. Ha igen, akkor statikus (tömbös azaz aritmetikai), ha nem, akkor dinamikus (szétszórt azaz láncolt) ábrázolást alkalmazunk majd. A verem osztályának példányosításnál tetszőlegesen választhassuk meg a verem elemeinek típusát.

Absztrakt ábrázolások: Időbélyeges elemek halmaza: Elején változtatható sorozat: push pop (e 3, 5) (e 2, 2) (e 1, 0) empty top push e 3 e 2 e 1 pop top empty

Statikus reprezentáció Dinamikus reprezentáció 0 size-1 vect e 1 e 2 e 3 h e 3 e 2 e 1 nil top 2 1. Rögzített a lefoglalt memória mérete, ami sokszor vagy feleslegesen nagy vagy kevés. 2. Tömbnyi szabad memória kell. 3. Adatelemek (top illetve vect[top]) elérési ideje konstans. 1. Valódi mérethez igazodik a lefoglalt memória (de a címeket is tárolja) 2. Sok kisméretű memória szelet kell. 3. Adatelemek elérési ideje általában lineáris, de itt csak az első elem kell, tehát konstans.

Stack Stack<int> si1; Stack<int> si2(20); Stack<string> ss; Stack<Test*> st; si1.push(4); ss.push("alma"); st.push(new Kup(2.0, 4.5)); +push() : void +pop() : +top() : +empty() : bool verem maximális mérete statikus reprezentációhoz Stack<> osztály-sablon példányosításai ahol az elemi-típus paramétere main.cpp

template <typename > class Stack { Stack(int max = 0); ~Stack(); void push(const &e); pop(); top() const; bool empty() const; Stack +push() : void +pop() : +top() : +empty() : bool ; private: Hogyan írható le mindkét reprezentáció? stack.hpp

<<interface>> Stack Interfész : a tisztán absztrakt osztály +push() : void +pop() : +top() : +empty() : bool Sajnos a példányosításnál nem írhatunk Stack<int> v(20) vagy Stack<int> v -t. Helyettük az ArrayReprStack<int> v(20) illetve LinkedReprStack<int> v használható. ArrayStackRepr -vect : [] -top : int +ArrayReprStack() +push() : void +pop() : +top() : +empty() : bool LinkedStackRepr -head : Node* +LinkedReprStack() +push() : void +pop() : +top() : +empty() : bool

Stack - *repr <<interface>> StackRepr +Stack(int max=0) +push(): void +pop() : +top() : +empty() : bool if (max==0) repr = new LinkedStackRepr<>(); else repr = new ArrayStackRepr <>(max); +push() : void +pop() : +top() : +empty() : bool ArrayStackRepr Ez esetben használható a Stack<int> v(20) illetve a Stack<int> v LinkedStackRepr repr >push(e) return repr >pop() return repr >top() return repr >empty() -vect : [] -top : int +ArrayStackRepr() +push(): void +pop() : +top() : +empty() : bool -head : Node* +LinkedStackRepr() +push(): void +pop() : +top() : +empty() : bool

template <typename > class Stack { Stack(int max = 0){ if (max==0) _repr = new LinkedStackRepr <>(); else _repr = new ArrayStackRepr <>(max); void push(const &e) { _repr->push(e); pop() { return _repr->pop(); top() const { return _repr->top(); bool empty() const { return _repr->empty(); ; private: StackRepr<> *_repr; stack.hpp

<<interface>> StackRepr +push() : void +pop() : +top() : +empty() : bool enum StackExceptions {EMPTYSTACK, FULLSTACK; template <typename > class StackRepr { virtual void push(const &e) = 0 ; virtual pop() = 0 ; virtual top() const = 0 ; virtual bool empty() const = 0 ; virtual ~StackRepr(){; ; stackrepr.hpp

<<interface>> StackRepr +push() : void +pop() : +top() : template <typename > +empty() : bool class ArrayStackRepr : public StackRepr<> { ArrayStackRepr(int max){ try { _vect.resize(max); catch(std::bad_alloc o){throw FULLSTACK; -top _top=-1; void push(const &e); pop(); -vect top() const; bool empty() const; A vector is egy sablon private: std::vector<> _vect; int _top; ; ArrayStackRepr Array : int arraystackrepr.hpp

template <typename > void ArrayStackRepr<>::push(const & e){ if(_top+1==(int)_vect.size()) throw FULLSTACK; _vect[++_top] = e; template <typename > ArrayStackRepr<>::pop(){ if(_top==-1) throw EMPTYSTACK; --_top; template <typename > ArrayStackRepr<>::top() const{ if(_top==-1) throw EMPTYSTACK; return _vect[_top]; template <typename > bool ArrayStackRepr<>::empty() const { return _top==-1; arraystackrepr.hpp

<<interface>> StackRepr template <typename > class LinkedStackRepr : public StackRepr<>{ +push() : void +pop() : LinkedStackRepr(){ _head = NULL; +top() : LinkedStackRepr(const LinkedStackRepr&); +empty() : bool LinkedStackRepr& operator=(const LinkedStackRepr&); ~LinkedStackRepr(){ destroy(); void push(const &e); pop(); top() const; bool empty() const; private: struct Node{ val; Node *next; ; A Node is egy sablon: Node<> Node(const &e, Node *n):val(e), next(n){; ; Node *_head; void destroy(); void copy(const LinkedStackRepr&); LinkedStackRepr -destroy() : void -copy() : void - *head Node +val : + *next linkedstackrepr.hpp

template <typename > void LinkedStackRepr<>::push(const & e) { try{ _head = new Node(e,_head); catch(std::bad_alloc o) { throw FULLSTACK; template <typename > LinkedStackRepr<>::pop() { if(_head==null) throw EMPTYSTACK; Node *p = _head; _head = _head->next; e = p->val; delete p; return e; template <typename > LinkedStackRepr<>::top() const { if(_head==null) throw EMPTYSTACK; return _head->val; template <typename > bool LinkedStackRepr<>::empty() const { return _head==null; linkedstackrepr.hpp

template <typename > LinkedStackRepr<>:: LinkedStackRepr(const LinkedStackRepr& r) { copy(r); template <typename > LinkedStackRepr<>& LinkedStackRepr<>:: operator=(const LinkedStackRepr& r) { if(this==&r) return *this; destroy(); copy(r); return *this; linkedstackrepr.hpp

template <typename > void LinkedStackRepr<>::copy(const LinkedStackRepr& r){ if(r._head==null) _head = NULL; else { try{ _head = new Node(r._head->value,NULL); Node *q = _head; Node *p = r._head->next; while(p!=null){ q->next = new Node(p->value,NULL); q = q->next; p = p->next; catch(std::bad_alloc o){ destroy(); throw FULLSTACK; félig felépített lista lebontása template <typename > void LinkedStackRepr<>::destroy(){ while(_head!=null){ Node *p = _head; _head = _head->next; delete p; linkedstackrepr.hpp

main.cpp int main() { stack.hpp enum StackExceptions { ; template <typname > class Stack { ; stackrepr.hpp enum StackReprExceptions { ; template <typname > class StackRepr { ; linkedstackrepr.hpp template <typname > class LinkedStackRepr : public StackRepr { ; arraystackrepr.hpp template <typname > class ArrayStackRepr : public StackRepr { ;

int main() { Stack<int> s; // Stack<int> s(10); try{ int i; while( cin >> i ){ s.push(i); catch (StackExceptions e){ if (e == FULLSTACK) cout << " "; while(!s.empty()){ cout << s.pop() << endl; return 0; main.cpp

- *repr +Stack(int max=0)... Stack + createenumerator() : Enumerator* return repr->createenumerator() StackRepr... + createenumerator() <<interface>> Enumerator (first, next, end, current) LinkedStackRepr ArrayStackRepr LinkedStackEnum - p : Node* ArrayStackEnum - ind : int + createenumerator() + createenumerator() bejár bejár (first, next, end, current) * -*ref (first, next, end, current) * -*ref return new LinkedStackEnum(this) return new ArrayStackEnum(this)

template <typename > class Enumerator{ virtual ~Enumerator() {; virtual void first() = 0; virtual void next() = 0; virtual current() const = 0; virtual bool end() const = 0; ; enumerator.hpp

template <typename > class ArrayStackRepr : public StackRepr<>{... class ArrayStackEnumerator : public Enumerator<> { ArrayStackEnumerator(ArrayStackRepr *r){ _ref = r; void first() { _i = 0; void next() { ++_i; current() const { return _ref->_vect[_i]; bool end() const { return _i > _ref->_top; private: ArrayStackRepr *_ref; int _i; ; ; Enumerator<>* createenumerator() { return new ArrayStackEnumerator(this); arraystackrepr.hpp

template <typename > class LinkedStackRepr : public StackRepr<>{... class LinkedStackEnumerator : public Enumerator<> { LinkedStackEnumerator(LinkedStackRepr *r){ _ref = r; void first() { _p = _ref->_head; void next() { _p = _p->next; current() const { return _p->val; bool end() const { return _p == NULL; private: LinkedStackRepr *_ref; LinkedStackRepr::Node *_p; ; ; Enumerator<>* createenumerator() { return new LinkedStackEnumerator(this); linkedstackrepr.hpp

template <typename > class Stack; template <typename > std::ostream& operator<<(std::ostream& out, Stack<>& s); template <typename > class Stack { friend std::ostream& operator<< <> (std::ostream& out, Stack& s); template <typename > ; std::ostream& operator<< (std::ostream& out, Stack<>& s) { out << "["; Enumerator<> *t = s.createenumerator(); t->first(); if(! t->end()) out << " " << t->current(); for( t->next();!t->end(); t->next()) out << ", " << t->current(); out << " ]"; return out; stack.hpp

int main() { Stack<int> s; // Stack<int> s(10); try{ int i; while( cin >> i ){ s.push(i); catch (StackExceptions e){ if (e == FULLSTACK) cout << " "; cout << s << endl; return 0; main.cpp

template <typename = int> class Stack{ ; Stack<int> y; Stack<> y; Stack<Test*> y; template <typename, int maxsize = 100> class ArrayRepr{ ArrayRepr(int max = 0) { try{ vect.resize(maxsize); catch(std::bad_alloc o){ throw FULLSTACK; top=-1; ; Stack<int, 10> y; Stack<int> y;