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.

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

500. AA Megoldó Alfréd AA 500.

500. CC Megoldó Alfréd CC 500.

228. AA Default Konstruktor AA 228.

128. AA Megoldó Alfréd AA 128.

503.AA Megoldo Arisztid 503.A

1.AA MEGOLDÓ BERCI AA 1.

500. DD Megoldó Alfréd DD 500.

1000.AA Megoldo Alfréd 1000.A

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

500.AJ Megoldó Magyar Magdolna 500.J

500.AA Megoldo Arisztid 500.A

117. AA Megoldó Alfréd AA 117.

500.AA Megoldó Kulcsár 500.A

Mit ír ki? feladatok megoldásokkal

C++ Standard Template Library (STL)

111. AA Megoldó Alfréd AA 111.

AA MEGOLDÓ ALADÁR AA

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

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

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

C++ programozási nyelv Konstruktorok-destruktorok

feladat pont min elért

3. Osztályok II. Programozás II

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

Bevezetés a programozásba 2

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

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

feladat pont min elért

Pénzügyi algoritmusok

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

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

Programozási Nyelvek: C++

1. Alapok. Programozás II

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

Pénzügyi algoritmusok

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

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

C++ Gyakorlat jegyzet 8. óra

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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 alapjai II. (4. ea) C++

Programozás C++ -ban 2007/4

Fejlett programozási nyelvek C++ Iterátorok

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?

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

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

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

Alprogramok, paraméterátadás

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

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

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

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

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

XIII. STL. Tároló Bejáró Algoritmus. XIII.1 A vector #include <vector> #include <vector> #include <algorithm> using namespace std;

C++ Gyakorlat jegyzet 7. óra

Objektumok inicializálása

Osztályok. 4. gyakorlat

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

Globális operátor overloading

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

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

Elemi Alkalmazások Fejlesztése II.

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

- 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]++;

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

Programozás C++ -ban

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

5. Gyakorlat. struct diak {

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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

BME MOGI Gépészeti informatika 8.

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

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

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

Programozási nyelvek Java

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

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

Programozás C++ -ban

OOP #14 (referencia-elv)

Bevezetés a programozásba I.

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

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

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. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

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

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.

Pénzügyi algoritmusok

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

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

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

Java és web programozás

C++ Gyakorlat jegyzet 10. óra.

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

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

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Programozási nyelvek Java

Átírás:

Programozás alapjai 2. (inf.) pót zárthelyi 2014.05.22. gyak. hiányzás: 2 n/kzhp: n/11,5 ABCDEF IB.028/2. Hftest: 4 (2,4p) Minden beadandó megoldását a feladatlapra, a feladat után írja! Készíthet piszkozatot, de csak a feladatlapra írt megoldásokat értékeljük! 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! Minimálisan elérendő pontszám: 8 F. Max. Elért 1 3 2 3 3 4 4 4 5 6 Σ 20 1. Feladat 6*0.5=3 pont Mit ír ki a szabványos kimenetre az alábbi program? Válaszához használja a négyzetrácsos területet! Abba a sorba írjon, ahol a kiírás keletkezik! Figyeljen a változók élettartamára! #include <iostream> struct Pr { static int sor; int kell; Pr(bool kell = 0) :kell(kell) { std::ostream& operator()() { return std::cout; std::ostream& operator[](int) { return std::cout << sor << std::endl; ~Pr() { if (kell){ std::cout << std::endl; sor++; ; int Pr::sor = 0; class Adat { int a; Adat(int i = 3) :a(i) { Pr()() << a << 'k'; Adat(const Adat&) :a(2) { Pr()() << a << 'c'; Adat& operator=(const Adat& m) { Pr()() << m.a << 'e'; return *this; ~Adat() { Pr()() << 'd'; ; class Ma { Adat a; Ma(const char *s = "A", int al = 2) :a(al) { Pr()() << s << "K"; ~Ma() { Pr()() << "D"; ; int main() { static Pr end(3); Pr(1); Ma icc("abcdef", 3); Pr(1); 3 k A B C D E F K Ma b1 = icc; Pr(1); 2 c b1 = icc; Pr(1); 3 e Ma *ma = new Ma[1]; Pr(1); 2 k A K Pr()[2]; 5 return 0; D d D d 1 / 6

2. Feladat 3 pont Készítsen egy LIFO (Stack) adapter sablont, ami a paraméterként átadott tárolóból verem működésű tárolót hoz létre. A verem rendelkezzen a következő műveletekkel: konstruktor csak paraméter nélküli konstruktora van, ami létrehoz egy üres vermet empty() igaz, ha a verem üres; size() visszaadja, hogy hány elem van a veremben; top() verem legfelső elemének elérése; push() elem betétele a verembe; pop() verem legfelső elemének eldobása; Tételezze fel, hogy a sablonparaméterként átadott tároló megvalósítja a következő műveleteket: back(), push_back(), pop_back(), empty(), size(). Ezek funkciója és működése megegyezik az STL tárolóknál megismert azonos nevű metódusok funkcióival. A sablon használatát az alábbi kódrészlet szemlélteti: Stack<int, std::dequeue<int> > st; st.push(123); Egy lehetséges megoldás: template<class T, class S> class Stack { S store; bool empty() const { return store.empty(); size_t size() const { return store.size(); T& top() { return store.back(); void push (const T& x) { store.push_back(x); void pop() { store.pop_back(); ; 3. Feladat 4 pont Készítsen egy olyan fix méretű generikus tárolót (FixTar), ami rendelkezik a 2. feladatban megadott tulajdonságokkal, azaz alkalmazható rá a 2. feladatban elkészített adapter! Ezen felül legyen a tárolónak előre haladó iterátora, ami rendelkezik preinkremens (++a), egyenlőtlenség vizsgáló (!=), valamint indirekció/dereferáló (*a) operátorokkal! A tároló méretét sablonparaméterként vegye át, melynek alapértelmezett értéke legyen 1000! A push_back metódus dobjon std::out_of_range kivételt, ha a tároló megtelik, vagy ha üres tároló pop tagfüggvényét hívják! Valósítsa meg a push_back,valamint az iterátor használatához szükséges összes tagfüggvényt! Egy legetséges megoldás: template<class T, size_t siz = 1000> class FixTar { T tar[siz]; size_t count; FixTar():count(0) { class iterator { T* p; iterator(fixtar* e, size_t i=0):p(e->tar+i) { const iterator& operator++() { p++; return *this; bool operator!=(const iterator& i2) {return p!= i2.p; T& operator*() { return *p; ; iterator begin() { return iterator(this); iterator end() { return iterator(this,count); void push_back(const T& x) { if (count == siz) throw std::out_of_range("fixtar::push_back"); tar[count++]=x; void pop_back(); bool empty(); size_t size(); ; 2 / 6

A feladatban az iterátorral egy tömböt kell bejárni, és az iterátor működésére nincs semmilyen speciális kikötés (pl. dobjon kivételt, stb), ezért egy pointerrel helyettesíthető. Ezt kihasználó alternatív, teljes (minden tagfüggvény) megoldás: template<class T, size_t siz = 1000> class FixTar2 { T tar[siz]; size_t count; typedef T* iterator; FixTar2():count(0) { iterator begin() { return tar; iterator end() { return tar+count; void push_back(const T& x) { if (count == siz) throw std::out_of_range("fixtar::push_back"); tar[count++]=x; void pop_back() { if (!count) throw std::runtime_error("fixtar::pop_back "); count--; bool empty() const { return count == 0; size_t size() const { return count; ; 4. Feladat 4 pont Klónozhatónak nevezünk egy objektumot, ha létezik a clone() tagfüggvénye, ami dinamikusan létrehoz egy eredetivel megegyező típusú és tartalmú objektumot, és visszaadja annak címét. Tételezze fel, hogy rendelkezésére áll a ClonableEvent osztály, ami klónozható. a) A 3. feladatban elkészített Tar osztály felhasználásával készítsen egy olyan klónozható tárolót (ClonableCollection), ami ClonableEvent pointereket tárol és klónozható, azaz a clone() tagfüggvénye úgy másolja le önmagát, hogy a pointerekkel hivatkozott objektumokat is lemásolja. Ügyeljen arra, hogy a tároló megszüntetésekor a tárolt objektumok is megszűnjenek! Az alábbi kódrészlet az tároló használatát mutatja: ClonableCollection store; store.push_back(new ClonableEvent); store.push_back(new ClonableEvent); ClonableCollection* masolat = store.clone(); delete masolat; b) Valósítsa meg a ClonableEvent osztályt úgy, hogy az alapját képezhesse (alaposztálya lehessen) egy klónozható heterogén kollekciónak, azaz a ClonableEvent osztályból származtatott osztály példányai tárolhatók legyenek a store-ban! Egy legetséges megoldás: class ClonableCollection : public FixTar<ClonableEvent*> { ClonableCollection* clone() { ClonableCollection *tmp = new ClonableCollection; for (iterator i = begin(); i!= end(); ++i) tmp->push_back((*i)->clone()); return tmp; ~ClonableCollection() { for (iterator i = begin(); i!= end(); ++i) delete *i; ; struct ClonableEvent { virtual ClonableEvent* clone() { return new ClonableEvent(*this); virtual ~ClonableEvent() { ; 3 / 6

5. Feladat 6 pont Nyuszinak (Rabbit) sok ismerőse (Liaison) van, akik vagy barátok (Buddy), vagy üzletfelek (Partner), de ez később bővülhet. Minden ismerősnek van neve (name) és több-kevesebb vagyona (wealth), utóbbinak egysége a váltópénz nélküli tallér. Nyuszi nem kispályás, sötét ügyeihez (doprank metódus) időnként mindenkitől kér pénzt (borrow metódus). Ekkor a barátok vagyonuk felét adják neki, az üzletfelek 5%-ot, de maximum 10 tallért. A barátoknak születésnapja is van (birthday) valamilyen szöveges formátumban tárolva, az üzletfeleknek pedig számlaszáma (accountnumber), ami egy nagy egész szám. Nyuszival meg lehet ismertetni új személyeket (meet metódus). Ha Nyuszi lebukik (megsemmisül), akkor magával rántja a teljes brancsot. Nyuszi fel tudja sorolni (ostream-re listázni) névsor szerint az ismerőseit (list metódus), minden adatukkal együtt. Feladatok: Tervezzen a fenti mesére olyan OO modellt, amely könnyen bővíthető további ismerősökkel! Rajzolja fel a modell osztálydiagramját! Ne tüntesse fel a tagfüggvényeket az UML ábrán! Használja a dőlt betűs neveket! Deklarálja és implementálja a Rabbit, Liason, Buddy, Partner osztályokat és tagfüggvényeit! A Rabbit osztály ne legyen másolható, és az értékadás művelet használata is okozzon fordítási hibát! A vagyon legyen privát tag! A doprank metódus térjen vissza a kölcsönkért teljes összeggel! Használja a dőlt betűs neveket! Írjon egy olyan kódrészletet, amiben Nyuszi megismerkedik néhány illetővel, valami sötét ügyet intéz, majd felsorolja az ismerősöket (névsorban)! A feladat megoldásához használhat STL algoritmust és/vagy tárolót. class Liaison { string name; double wealth; Liaison(string n, double w) :name(n), wealth(w) { double getwealth() const { return wealth; string getname() const { return name; void setwealth(double w) { wealth = w; virtual double borrow() = 0; virtual ostream& printme(ostream& os) const { return os << name << ":" << wealth; virtual ~Liaison(){ ; class Buddy : public Liaison { string birthday; public : Buddy(string n, double w, string bd) : Liaison(n, w), birthday(bd) { double borrow() { double w = getwealth()/2; setwealth(w); return w; ostream& printme(ostream& os) const { return Liaison::printMe(os) << ", " << birthday; ; 4 / 6

class Partner : public Liaison { long accountnumber; public : Partner(string n, double w, long a) : Liaison(n, w), accountnumber(a) { double borrow() { double w = getwealth()*0.05; if (w > 10) w = 10; setwealth(getwealth()-w); return w; ostream& printme(ostream& os) const { return Liaison::printMe(os) << ", " << accountnumber; ; // segédobjektum (predikátum) a rendezéshez struct LiaisonCmp { bool operator() (Liaison* v1, Liaison* v2) { return v1->getname() < v2->getname(); ; // segédfüggvény (funktor) a kiíráshoz void printit(const Liaison* lp) { lp->printme(cout) << endl; class Rabbit { set<liaison*, LiaisonCmp> ls;// a set rendezetten tárol, de lehetett rendezni is Rabbit(const Rabbit&); Rabbit& operator=(const Rabbit&); typedef set<liaison*, LiaisonCmp>::iterator iter; Rabbit() { void meet(liaison* l) { ls.insert(l); void list() { // nem kell utólag rendezni, mert rendezetten tárolunk for_each(ls.begin(), ls.end(), printit); double doprank() { // itt az accumulate használata kézenfekvő lenne double d = 0; for (iter it = ls.begin(); it!= ls.end(); it++) d+= (*it)->borrow(); return d; ~Rabbit() { for (iter it = ls.begin(); it!= ls.end(); it++) delete *it; ; Rabbit r; r.meet(new Partner("Malacka", 1000, 1234)); r.meet(new Buddy("Fules", 30, "Majus 5")); r.meet(new Buddy("Robert Gida", 50, "Majus 9")); cout << r.doprank() << endl; r.list(); 5 / 6