228. AA Default Konstruktor AA 228.

Hasonló dokumentumok
500. AA Megoldó Alfréd AA 500.

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.

.AA Megoldó Alfréd AA.

500. CC Megoldó Alfréd CC 500.

128. AA Megoldó Alfréd AA 128.

500. DD Megoldó Alfréd DD 500.

117. AA Megoldó Alfréd AA 117.

1.AA MEGOLDÓ BERCI AA 1.

1000.AA Megoldo Alfréd 1000.A

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

503.AA Megoldo Arisztid 503.A

500.AA Megoldo Arisztid 500.A

500.AJ Megoldó Magyar Magdolna 500.J

Tárolók és metódusaik jellegű feladatok megoldásokkal

500.AA Megoldó Kulcsár 500.A

111. AA Megoldó Alfréd AA 111.

Mit ír ki? feladatok megoldásokkal

AA MEGOLDÓ ALADÁR AA

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

1. Alapok. Programozás II

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

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

feladat pont min elért

feladat pont min elért

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

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

C++ Standard Template Library (STL)

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

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

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

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Programozás C++ -ban 2007/4

C++ programozási nyelv Konstruktorok-destruktorok

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

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

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

Programozás C++ -ban

3. Osztályok II. Programozás II

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

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

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

Alprogramok, paraméterátadás

Maximum kiválasztás tömbben

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.

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

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

Pénzügyi algoritmusok

C++ Gyakorlat jegyzet 8. óra

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

Fejlett programozási nyelvek C++ Iterátorok

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

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

Bevezetés a programozásba I.

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

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

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ási Nyelvek: C++

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

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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

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.

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

Programozás C++ -ban 2007/7

Programozás II. 6.Öröklés Dr. Iványi Péter

1. Bevezetés A C++ nem objektumorientált újdonságai 3

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

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

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ás II gyakorlat. 6. Polimorfizmus

Körkörös listák. fej. utolsó. utolsó. fej

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

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

Bevezetés a programozásba 2

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

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

Objektumok inicializálása

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

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

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

Programozás C++ -ban

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

Elemi Alkalmazások Fejlesztése II.

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

5. Gyakorlat. struct diak {

Generikus Típusok, Kollekciók

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

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

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

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás alapjai II. (2. 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

#include <iostream> using namespace std; // struct macska is lehetne class macska { public: int kor; int suly; }; void main() { macska cirmi;

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

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

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

Osztály és objektum fogalma

Programozás C++ -ban

Átírás:

Programozás alapjai 2. (inf.) zárthelyi 2012.05.17. gyak. hiányzás: kzhpont: ABCDEF Q-II/107. nzh: Hftest: Minden beadandó megoldását a feladatlapra, a feladat után írja! A megoldások során feltételezheti, hogy minden szükséges input adat az előírt formátumban rendelkezésre áll. A feladatok megoldásához csak a letölthető C, C++ és STL összefoglaló használható. Elektronikus eszköz (pl. kalkulátor, számítógép, notebook, mobiltelefon, Kindle) nem használható. A feladatokat figyelmesen olvassa el, megoldásukhoz ne használjon fel STL tárolót, kivéve, ha a feladat ezt külön engedi/kéri! Ne írjon felesleges függvényeket ill. kódot! A feladatra koncentráljon! Jó munkát! Elégséges: 8 ponttól 1. Feladat 3 pont Mit ír ki a szabványos kimenetre az alábbi program? Válaszához használja a négyzetrácsos területet! #include <iostream> using namespace std; struct Alap { Alap(int i = 9) { cout << i << "k"; Alap(const Alap&) { cout << "c" << "z";; virtual void f(int i) { cout << "f"; void operator=(const Alap& a) { cout << "=" << "z"; virtual ~Alap() { cout << "d"; ; struct Uj :public Alap { Uj(int a = 228, char *m = "z") { cout << m << "K"; Uj(const Uj& u) :Alap(u) { cout << "C" << "z"; void f(int i) { cout << "F" << i; ~Uj() { cout << "D"; ; void f(uj& u) { u.f(9); int main() { Uj u19(107, "cde"); cout << endl; 9 k c d e K Alap *pa = new Uj; cout << endl; 9 k z K Uj u2 = u19; cout << endl; c z C z u19 = u2; cout << endl; = z pa->f(107); cout << endl; F 1 0 7 f(u19); cout << endl; F 9 delete pa; cout << endl; D d D d D d F. Max. Elért 1 3 2 4 3 4 4 4 5 5 Σ 20 2. Feladat 4 pont Írjon függvénysablont (kivalaszt), ami egy tárolóból összehasonlítással képes kiválasztani egy adott tulajdonságnak (pl. maximum) megfelelő elemet! Ha több, az adott feltételnek megfelelő elemet talál, akkor az első megfelelőt válassza! A függvény első két paramétere két iterátor, ami kijelöli a jobbról nyílt intervallum kezdetét és végét. A harmadik paraméter pedig egy olyan kétparaméterű függvény vagy függvényobjektum, ami a kiválasztáshoz két elemet összehasonlít. A függvény visszatérési értéke a kiválasztott elemre mutató iterátor. Amennyiben helyesen oldja meg a feladatot, akkor az alábbi kódrészlet a következőt írja ki: 37 int v9[] = { 2, -2, 3, 37, -21, 6, 0; cout << *kivalaszt(v9, v9+6, greater<int>()) << endl; Készítsen egy olyan generikus függvényobjektumot, ami alkalmazható lenne a fenti példában a legnagyobb abszolút értékű szám kiválasztására! Adja meg, hogy az elkészített függvényobjektum milyen tulajdonságokat (műveleteket) tételez fel a generikus adatról!

Egy lehetséges megoldás: template<typename Iter, class Pred> Iter kivalaszt(iter first, Iter last, Pred pred) { Iter tmp = first++; while (first!= last) { if (pred(*first, *tmp)) tmp = first; ++first; return tmp; template<class T> struct AbsMax { bool operator()(t i, T j) { return abs(i) > abs(j); ; A függvényobjektum által feltételezett tulajdonságok: Van másoló konstruktora és destruktora, (érték szerint veszi át a paramétert). Működik rá az abs() függvény. 3. Feladat 4 pont Deklaráljon egy verem (Stack) szervezésű generikus tárolót, ami tetszőleges számú adatot képes tárolni. A tároló működését úgy alakítsa ki, hogy amennyiben a tároló dinamikus memóriaterületét növelni kell, úgy ne csak 1 adatnak megfelelő mérettel növeljen, hanem a sablon sablonparaméteréként megadott konstansnak megfelelő mérettel. Ezen sablonparaméter alapértelmezett értéke 100 legyen! A tároló rendelkezzen a következő műveletekkel: konstruktorok/destruktor paraméter nélküli konstruktor üres tárolót hoz létre; kétparaméteres konstruktor a paraméterként kapott 2 iterátornak megfelelő elemekkel tölti fel a tárolót; top() a verem legfelső elemének referenciáját adja; dobjon std::out_of_range kivételt, ha a verem üres; push() elemet tesz a verembe; pop() eldobja a verem legfelső elemét; dobjon std::out_of_range kivételt, ha üres a verem; swap() a verem legfelső 2 elemét felcseréli; dobjon std::out_of_range kivételt, ha a veremben 2-nél kevesebb adat van; size() a tárolóban levő elemek számát adja; empty() igaz értéket ad, ha a tároló üres. Az osztályból példányosított objektum legyen átadható érték szerint függvényparaméterként, kezelje helyesen a többszörös értékadást (s1=s2=s2)! A top tagfüggvény konstans objektumra is működjön! Valósítsa meg az osztály konstruktorait, valamint a push(), swap() és empty() metódusokat! Egy lehetséges megoldás: template<class T, size_t inc = 100> class Stack { T *tar; size_t msiz; size_t siz; Stack(); Stack(const Stack&); template <typename Iter> // template paraméter az iterátor típusa Stack(Iter first, Iter last); Stack& operator=(const Stack&); T& top(); const T& top() const; void push(const T&); void pop(); void swap(); int size() const { return siz; bool empty() const { return siz == 0; ~Stack() { delete[] tar; ;

// lehetne az osztály dekl.val együtt, de a megodás menetének így jobban megfelel Stack<T, inc>::stack(): msiz(0), siz(0) { // konstruktor tar = new T[msiz]; Stack<T, inc>::stack(const Stack& s2) { tar = NULL; *this = s2; // másoló konstruktor template <typename Iter> Stack<T, inc>::stack(iter first, Iter last) :msiz(0), siz(0) { // konstruktor 2 iterátorral tar = new T[msiz]; while(first!= last) push(*first++); void Stack<T, inc>::push(const T& e) { if (siz == msiz) { T *tmp = new T[msiz+inc]; for (size_t i = 0; i < siz; i++) tmp[i] = tar[i]; delete[] tar; tar = tmp; msiz += inc; tar[siz++] = e; void Stack<T, inc>::swap() { if (siz = < 2) throw std::out_of_range("sor::swap: siz<2!"); T tmp = tar[siz-1]; tar[siz-1] = tar[siz-2]; tar[siz-2] = tmp; // További csoportok megoldásai (pop, top) T& Stack<T, inc>::top() { if (siz == 0) throw std::out_of_range("stack::top: empty!"); return tar[siz-1]; const T& Stack<T, inc>::top() const { if (siz == 0) throw std::out_of_range("stack::top: empty!"); return tar[siz-1]; void Stack<T, inc>::pop() { if (siz == 0) throw std::out_of_range("stack::pop: empty!"); siz--;

4. Feladat 4 pont Tételezze fel, hogy a 3. feladat Stack osztálya elkészült, és hibátlanul működik! Ezen osztály felhasználásával deklaráljon Calculator osztályt, ami aritmetikai műveleteket tud végezni double típusú adatokkal! A Calculator osztály rendelkezzen a következő műveletekkel: store() adatot ír a Calculator veremmemóriájába; print() kiveszi a veremből a legfelső elemet és kiírja paraméterként kapott std:ostream-re; add() összeadja a verem két legfelső elemét és az eredményt a verem tetejére teszi; sub() kivonja a verem legfelső elemét az alatta levő elemből és az eredményt a verem tetejére teszi; Amennyiben a kétparaméteres műveletek esetében kevesebb, mint 2 elem van a veremben, dobjon std::out_of_range kivételt! Működjön az elvárásoknak megfelelően az alábbi kódrészlet: Calculator cal9; std::cin >> cal9; // adatot olvas a Calculator veremmemóriájába std::cout << cal9; // kiveszi a Calculator veremmemóriájának legfelső elemét és kiírja Ügyeljen arra, hogy a Stack osztály metódusai ne legyenek publikusan elérhetők! Valósítsa meg a Calculator osztály print() műveletét, valamint a beolvasást a >> operatorral! class Calculator { Stack<double> st; void store(double x); void print(ostream& os); void add(); void sub(); ; void Calculator::store(double x) { st.push(x); void Calculator::print(ostream& os) { os << st.top(); st.pop(); // További csoportok megoldásai (add, sub) void Calculator::add() { double d = st.top(); st.pop(); st.top() += d; void Calculator::sub() { double d = st.top(); st.pop(); st.top() -= d; ostream& operator<<(ostream& os, Calculator& c) { c.print(os); return os; // További csoportok megoldása (opeartor>>()) istream& operator>>(istream& is, Calculator& c) { double d; is >> d; c.store(d); return is; 5. Feladat 5 pont Egy többszereplős kalandjátékot szeretnénk modellezni. A játékosok avatarokat (Avatar) irányítanak. Egy avatarnak van ereje (strength, double), neve (name, string). Az avatarok különböző dolgokat (Item) tudnak felvenni és tárolni, például gyémántot (Diamond), láncfűrészt (Chainsaw). Később szeretnénk a modellt több fajta dologgal is bővíteni. Minden dolognak van neve (name, string), értéke (value, double), és különböző hatással lehetnek más avatarokra. A gyémánt a másik avatár erejét megduplázza, a láncfűrész a másik avatart megöli, stb. Az avatarokat a játékmester (Master) ismeri és lépteti, gondoskodik róla, hogy az avatarok találkozzanak, illetve dolgokat vegyenek fel. Egy avatarnál maximum 5 dolog lehet, ha több lenne nála, akkor a legrégebbi dolgot eldobja, az újat megtartja. A tervezőknek speciális avatarjuk (Immortal) van, amelyik nem tud meghalni, és tetszőleges számú dolgot birtokolhat. A rendszerben az alábbi műveleteket (tagfüggvényeket) kell megvalósítani: Avatar 1. setter/getter metódus az erő módosításához 2. meghalás: életerő lenullázása (die) 3. dolog felvétele (pick) 4. találkozás egy másik avatarral (meet); ekkor az avatár az összes tárgyával hatást gyakorol (affect) a másikra Item 5. hatás egy avatarra (affect) Master 6. új avatar felvétele (newavatar) 7. halott avatarok elhamvasztása (deleteavatar)

Feladatok: Tervezzen egy OO modellt a problémának megfelelően, amelyben van Avatar, Immortal, Item, Diamond, Chainsaw, Master és könnyen bővíthető újabb típusú avatarokkal és dolgokkal, amikben dinamikus memóriakezelés is lehet. Rajzolja fel a modell osztálydiagramját! Használja a dőlt betűs neveket! Jelölje a láthatóságokat is! Deklarálja az objektumokat C++ nyelven! Implementálja (valósítsa meg) az Avatar és Item objektumok die(), pick(), meet(), és affect () tagfügvényét! A megoldáshoz Használhat STL tárolókat, algoritmusokat is! Osztálydiagram: A Master és az Item között nincs feltétlenül kompozíció (tartalmazás) típusú kapcsolat. Jó modell lehet az is, ha az Avatar és az Item között építünk ki tartalmazás típusú kapcsolatot. Osztályok deklarációja (include nem kell): class Master { private: vector<avatar*> avatars; vector<item*> items; void newavatar(avatar* avatar); void deleteavatar(); ; class Avatar { private: string name; double strength; protected: deque<item*> items; double getstrength() const; string getname() const; void setstrength(double value); virtual void die(); virtual void pick(item* item); virtual void meet(avatar* other); virtual ~Avatar(); ; class Immortal :public Avatar { void die(); void pick(item* item); ; class Item { private: string name; double value; virtual ~Item(); virtual void affect(avatar* avatar) = 0; ; struct Diamond : Item { void affect(avatar* avatar); ; struct Chainsaw : Item { void affect(avatar* avatar); ;

Implementációk: void Avatar::die() { setstrength(0); void Avatar::pick(Item* item) { if (items.size() >= 5) items.pop_front(); items.push_back(item); void Avatar::meet(Avatar* other) { for (deque<item*>::iterator it = items.begin(); it!= items.end(); ++it) (*it)->affect(other); Az alábbiakat nem kellett megvalósítani, de a további megértéshez segíthetnek: void Immortal::die() { // nem fog meghalni void Immortal::pick(Item* item) { items.push_back(item); void Master::newAvatar(Avatar *av) { avatars.push_back(av); void Master::deleteAvatar() { // halottak hamvasztása for(vector<avatar*>::iterator it = avatars.begin(); it!= avatars.end(); ) { if ((*it)->getstrength() == 0) { delete *it; it = avatars.erase(it); else it++; struct Chainsaw : Item { void affect(avatar* av) { av->die(); ;