500.AA Megoldo Arisztid 500.A

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

500.AJ Megoldó Magyar Magdolna 500.J

1000.AA Megoldo Alfréd 1000.A

500.AA Megoldó Kulcsár 500.A

1.AA MEGOLDÓ BERCI AA 1.

503.AA Megoldo Arisztid 503.A

.AA Megoldó Alfréd AA.

500. AA Megoldó Alfréd AA 500.

128. AA Megoldó Alfréd AA 128.

500. CC Megoldó Alfréd CC 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.

228. AA Default Konstruktor AA 228.

117. AA Megoldó Alfréd AA 117.

AA MEGOLDÓ ALADÁR AA

500. DD Megoldó Alfréd DD 500.

C++ Standard Template Library (STL)

feladat pont min elért

feladat pont min elért

111. AA Megoldó Alfréd AA 111.

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

Fejlett programozási nyelvek C++ Iterá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) {} };

Programozási Nyelvek: C++

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

Mit ír ki? feladatok megoldásokkal

OOP #14 (referencia-elv)

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

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

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

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?

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

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

Bevezetés a programozásba 2

3. Osztályok II. Programozás II

1. Jelölje meg az összes igaz állítást a következők közül!

Kalapácsvetés 2016 szöveges

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

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

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

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

Objektumorientált programozás C# nyelven

1. Alapok. Programozás II

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

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

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

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

C++ Gyakorlat jegyzet 8. óra

C++ Gyakorlat jegyzet 10. óra

C++ programozási nyelv Konstruktorok-destruktorok

Pénzügyi algoritmusok

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

Bevezetés a programozásba I.

Alprogramok, paraméterátadás

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

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

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

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

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

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

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

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

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ó

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

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

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

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

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

BME MOGI Gépészeti informatika 8.

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

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

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Programozási technológia

ELTE SAP Excellence Center Oktatóanyag 1

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

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

Bánsághi Anna

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

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

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

Objektumok inicializálása

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

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Globális operátor overloading

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

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.

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

C++ Gyakorlat jegyzet 12. óra

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

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

C++ Gyakorlat jegyzet 7. óra

Programozási nyelvek Java

Programozás módszertan

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

Programozás II. 4. 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

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

Fejlett programozási nyelvek C++

Átírás:

Programozás alapjai 2. (inf.) 2. ZH 2018.05.07. lab. hiányzás: 1+2 a/a/1 ABCD123 a/1. kzh: 4 E:3 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! Jelölje a táblázatban, ha oldott meg IMSC feladatot. Ezt csak az alapfeladatok 75%-os teljesítése mellett é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. tablet, notebook, mobiltelefon) nem használható. A feladatokat figyelmesen olvassa el! Ne írjon felesleges függvényeket ill. kódot! Súlyos hibákért (pl. privát változó külső elérése, memóriakezelési hiba, stb.) pontot vonunk le. Az első feladatban minimum 5 pontot el kell érnie ahhoz, hogy a többi feladatot értékeljük.. 1. feladat: Beugró. Használhat STL tárolót és algoritmust! Σ 10 pont a) Jelölje (pl. karikázza be), hogy az állítás igaz (I), vagy hamis (H) a C++ nyelvre! Minden bejelölt válasz 0.5 pont, ha helyes, -0.5p pont, ha hibás! Az esetleges negatív eredmény is összeadódik a többi részfeladatra kapott ponttal. (2p) Az implicit értékadó operátor nem hívja meg az ősosztály értékadó operátorát. I H Statikus tagfüggvénynek nincs this pointere. I H Az iterátor egy általánosított pointer. I H A konstruktor előbb hajtja végre a programozott törzset, és csak ezután hívja az ősosztályok konstruktorát. I H b) Az alábbi függvénnyel egész számokat tartalmazó vektorból szeretnénk eltávolítani az ismétlődő elemeket úgy, hogy azokból csak egy maradjon a vektorban! Teszteléskor észrevettük, hogy a kódrészlet nem tökéletes. Javítsa ki a függvényt! (2p) void tisztit(std::vector<int>& vec) { sort(vec.begin(), vec.end()); std::vector<int>::iterator i = unique(vec.begin(), vec.end()); f. max. elért jav. 1. 10 2. 10 3. 10 4. 10 Σ 40 IM. 10 Van megoldott IMSC: vec.erase(i, vec.end()); c) Adott az alábbi deklaráció: class Tarolo : public std::vector<double> { std::string duma; t1; Jelölje (pl. karikázza be), hogy az állítás igaz (I), vagy hamis (H)! Minden bejelölt válasz 0.5 pont, ha helyes, -0.5p pont, ha hibás! Az esetleges negatív eredmény is összeadódik a többi részfeladatra kapott ponttal. (2p) Tarolo t2 = t1; utasítás helyes. I H t1 = t1 = t2; utasítás hibás, mert az implicit operator= nem támogatja a többszörös értékadást. I H t1[4] = 56.78; utasítás hibás, mert a Tarolo nem indexelhető. Meg kellene valósítani az operator[] függvényt. I H t1.push_back(45); utasítás helyes. I H d) Készítsen az std::for_each algoritmushoz hasonló generikus algoritmust (for_each2nd), ami sorozattároló minden második elemével meghív egy paraméterként kapott függvényt! Írjon rövid kódrészletet, melyben létrehoz egy sorozattárolót, mely egész elemeket tartalmaz, és a for_each2nd sablon segítségével kiírja minden második elemét a szabványos kimenetre! (4p) template <typename T, class F> void for_each2(t first, T last, F func) { while (first!= last) { func(*first++); if (first!= last) ++first; void f(int i) { std::cout << i << ","; std::vector<int> v; for_each2(v.begin(), v.end(), f);

2. Feladat 10 pont a) Készítsen adapter sablont (PhyTomb), ami minden olyan szabványos sorozattárolóra alkalmazható, ami indexelhető (operator[])! Egy N elemű PhyTomb elemei pozitív és negatív indexértékkel is elérhetők. Míg a pozitív indexértékek a szokásos elérést eredményezik, addig a negatív indexek a tömb végétől haladnak visszafelé. Azaz a -1 az utolsó elemet adja, a -N pedig az első elemet. Úgy alakítsa ki a sablont, hogy alapértelmezésként N = 3, a sorozattároló pedig az std::vector legyen! A sorozattároló minden tagfüggvénye legyen elérhető, kivéve az at()! Ügyeljen a sorozattárolókra jellemző konstruktorok megvalósítására is! (5p) Példa a használatra: PhyTomb<int> t3; t3[0] = 1; std::cout << t3[-3]; t3[2] = 3; std::cout << t3[-1]; // 3 elemű int tömb, nullával feltöltve // első eleme // ez is az első, ezért 1-et ír ki! // utolsó eleme // ez is az utolsó, ezért 3-at ír ki! b) Hozzon létre az elkészített adapter és az std::deque felhasználásával egy 40 elemű long elemeket tartalmazó tömböt! (1p) c) Írjon C++ függvénysablont (count_if), ami iterátorokkal megadott adatsorozatban megszámolja azokat az elemeket, amire a paraméterként átadott predikátum igaz értéket ad! A függvény első két paramétere két iterátor, amivel a szokásos módon megadjuk a jobbról nyílt intervallumot. A függvény 3. paramétere pedig egy predikátum, ami egy egyparaméteres függvény vagy függvényobjektum. Ha jól oldja meg a feladatot, akkor az alábbi kódrészlet lefutása után az eredmény 2. (2p) bool negativ(int a) { return a < 0; int sorozat[] = { 1, 4, 9, -16, 25, 3, -72, 100, 3; // a sorozat int eredmeny = count_if (sorozat, sorozat+9, negativ); d) Készítsen olyan függvényobjektum sablont, ami a count_if sablonnal felhasználva alkalmas az olyan elemek megszámolására, amelyek kisebbek a függvényobjektum konstruktorában megadott értéknél! (2p) template <typename T, int N = 3, class C = std::vector<t> > class PhyTomb : public C { T& at(size_t ix); T at(size_t ix) const; PhyTomb(size_t n = N, const T& value = T()) : C(n, value) { template<typename Iter> PhyTomb(Iter first, Iter last) : C(first, last) { T& operator[](int ix) { if (ix < 0) ix += N; return C::operator[](ix); const T& operator[](int ix) const { if (ix < 0) ix += N; return C::operator[](ix); ; PhyTomb<long, 40, std::deque<long> > p40; template <class I, class P> int count_if(i first, I last, P pred) { int cnt=0; while (first!= last) if (pred(*first++)) cnt++; return cnt; template <class T> class KisebbMint { T ref; KisebbMint(const T& a) : ref(a) { bool operator()(const T& a) const { return a < ref; ;

3. Feladat 10 pont A Diak osztályban diákok adatait tároljuk. Adott továbbá a Serializable osztály. class Diak { struct Serializable { std::string nev; virtual void write(std::ostream&) const = 0; virtual void read(std::istream&) = 0; Diak(const std::string& n = ""); virtual ~Serializable() { std::string getnev() const; ; void setnev(const std::string&); virtual ~Diak(); ; a) A fenti osztályok felhasználásával, de azok módosítása nélkül hozzon létre a Diak osztállyal kompatibilis, perzisztens PDiak osztályt! Megoldásában vegye figyelembe, hogy a névben szóköz is lehet! Az elmentett állapot visszatöltésekor az osztály végezzen ellenőrzést, hogy jó adatokat kap-e, azonban nem kell bombabiztos megoldás! Hiba esetén dobjon std::out_of_range kivételt! Működjön helyesen az alábbi kódrészlet: 5p Diak d("gaz Edoemer"); PDiak pd = d; b) Egy rövid kódrészletben hozzon létre egy PDiak példányt a saját nevével! Mentse ki az objektum adatait a szabványos kimenetre! Kommentben adja meg, hogy mit írt ki! Jelölje a nem látható karaktereket is! 2p c) Készítsen olyan fűzhető inserter (operator<<) és extraktor (operator>>) operátorokat, melyeket Serializabe osztályból származó objektumpéldányokra alkalmazva aktivizálódik az osztály megfelelő read ill. write metódusa! 3p Működjön helyesen az alábbi kódrészlet: PDiak d1("nagy Edoemer"), d2("kiss Zaszlo"); std::stringstream ss; ss << d1 << d2; PDiak nd1, nd2; ss >> nd1 >> nd2; // elvárjuk, hogy d1 == nd1 && d2 == nd2, azaz az elmentett állapot //álljon elő az nd1 és nd2 objektumokban! struct PDiak : public Diak, public Serializable { PDiak(const std::string& n = "") : Diak(n) { PDiak(const Diak& d) : Diak(d) { void write(std::ostream& os) const { //FONTOS, hogy úgy írjon ki, hogy azt be is tudja olvasni os << "PDiak:" << std::endl; os << getnev() << std::endl; void read(std::istream& is) { // FONTOS, hogy úgy olvasson be, ahogy kiírt std::string line; getline(is, line); if (line!= "PDiak:") throw std::out_of_range("pdiak!= " + line); getline(is, line); setnev(line); ; PDiak d1("sajat Nevem"); d1.write(std::cout); // PDiak:\nSajat Nevem\n std::istream& operator>>( std::istream& is, Serializable& s){ s.read(is); return is; std::ostream& operator<<( std::ostream& os, const Serializable& s) { s.write(os); return os;

503.AA Megoldo Arisztid 503.A IMSC FELADAT: Tételezze fel, hogy a 2. feladat PhyTomb osztálya, valamint a 3. feladat c) részfeladata is elkészült és hibátlanul működik! A PhyTomb osztály felhasználásával készítsen egy perzisztens viselkedésű PPhyTomb generikus osztályt, ami kompatibilis a PhyTomb osztállyal! Feltételezheti, hogy az osztályt pointerek tárolására nem használják. Tudjuk továbbá, hogy amennyiben a tárolt típus nem elemi, úgy az a Serializable osztályból származik (3. feladat). Az alábbi kódrészlettől elvárjuk, hogy deserializáláskor kivételt dob (a tárolt adattípusok eltérnek). 10 p std::stringstream ss; PPhyTomb<int> pi; ss << pi; PPhyTomb<double> pd; ss >> pd; template <typename T, int N = 3, class C = std::vector<t> > struct PPhyTomb : PhyTomb<T, N, C>, Serializable { using PhyTomb<T, N, C>::size; // többszörös öröklés miatt... PPhyTomb(size_t n = N, const T& value = T()) : PhyTomb<T, N, C>(n, value) { template<typename Iter> PPhyTomb(Iter first, Iter last) : PhyTomb<T, N, C>(first, last) { PPhyTomb(const PhyTomb<T, N, C>& pt) : PhyTomb<T, N, C>(pt) { void write(std::ostream& os) const { using std::string; string id = string("pphytomb_") + typeid(t).name() + ": "; os << id << size() << std::endl; for (size_t i = 0; i < size(); i++) os << (*this)[i]; void read(std::istream& is) { using std::string; string id = string("pphytomb_") + typeid(t).name() + ":"; string line; is >> line; if (id!= line) throw std::out_of_range(id + "!= " + line); int siz; (is >> siz).ignore(2, '\n'); this->resize(siz); for (size_t i = 0; i < size(); i++) is >> (*this)[i]; ;

503.AA Megoldo Arisztid 503.A 4. Feladat 10 pont Egy gázszerelő cégnyilvántartását (Portfolio) szeretnénk modellezni. Nyilván kell tartani a vétel (Vetel) dátumát (datum, előre definiált date osztály), a kifizetett összeget (osszeg, double), valamint a megvett cég minden jellemzőjét (ceg, Ceg). A nyilvántartásból kiíratható az összes cégvásárlás adata, ami szűrhető egy adott napra is. A Portfolió a céghez közvetlenül nem férhet hozzá! Miután számtalan cég (Ceg) lehet, melynek a jellemzői előre nem ismertek, olyan megoldást kell választani, ami könnyen bővíthető tetszőleges céggel. Heterogén kollekció alkalmazása mellett döntöttünk. Ami biztos: minden cégnek van neve (string) és adószáma (string). Jelenleg az alábbi konkrét cégtípusokat kell támogatni: Zrt: részvények száma (db, int), részvények névértéke (ertek, double) KKV: alakulás éve (ev, int). Tervezzen objektum-orientált megoldást a fenti leírás alapján a dőlt betűs megnevezések felhasználásával! Az attribútumok kivétel nélkül legyenek privátok és konstruktorban állíthatók. A megoldásban használja ki az STL adta lehetőségeket! Az alábbi kódrészlet mutatja az egyes metódusok és konstruktorok paraméterezését és használatát. Portfolio port; // egyik nyilvántartás // 2018-02-03-án 23Mrd Ft-ért: Zabhegyező Zrt, adó 123456-1-13, 20 részvény, 2300Ft/részvény port.megvesz(date(2018, 2, 3), 23e9, new Zrt("Lencselaposító Zrt", "123456-1-13", 20, 23000 // 2016-05-01-jén 1000 Ft-ért: Éliás Kft, adószám 234567-4-11, alapítva: 2013-ban. port.megvesz(date(2016, 5, 1), 1000, new KKV("Éliás Kft", "234567-4-11", 2013); port.listaz(std::cout); // kilistázza az összes cégvásárlást port.listaz(std::cout, date(2018, 2, 3)); // kilistázza az összes cégvásárlást 2018-02-03-án // Egy lehetséges megoldás: Rajzoljon UML osztálydiagramot, amin csak az osztályok neve szerepeljen! (1p) Definiálja az alábbi osztályokat! A metódusoknak csak a deklarációját adja meg! class Portfolio vector<vetel> v; void megvesz(date d, double osszeg, Ceg* d); void listaz(ostream& os) const; void listaz(ostream& os, date& d) const; ~Portfolio() ; ; class Vetel date datum; double osszeg; Ceg* ceg; Vetel(date d, double o, Ceg* c); void kiir(ostream& os) const; double getosszeg() const; date getdatum() const; ~Vetel(); ; class Ceg string nev, adoszam; Ceg(string n, string a); virtual void kiir(ostream& os) const = 0; virtual ~Ceg(); ; class KKV : public Ceg int ev; KKV(string n, string a, int e); void kiir(ostream& os) const; ; { // (1p) Implementálja a Portfolio osztály dátum alapján listázó tagfüggvényét. Feltételezheti, hogy a date osztály összehasonlítható. (2p) void Portfolio::listaz(ostream& os, const datum& d) { for (int i = 0; i < v.size(); i++) { if (v[i].getdatum() == d) { v[i].kiir(os); os << std::endl;