500.AJ Megoldó Magyar Magdolna 500.J

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

500.AA Megoldo Arisztid 500.A

1000.AA Megoldo Alfréd 1000.A

1.AA MEGOLDÓ BERCI AA 1.

500.AA Megoldó Kulcsár 500.A

503.AA Megoldo Arisztid 503.A

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.

128. AA Megoldó Alfréd AA 128.

.AA Megoldó Alfréd AA.

500. CC Megoldó Alfréd CC 500.

228. AA Default Konstruktor AA 228.

117. AA Megoldó Alfréd AA 117.

500. DD Megoldó Alfréd DD 500.

C++ Standard Template Library (STL)

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

AA MEGOLDÓ ALADÁR AA

feladat pont min elért

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

Mit ír ki? feladatok megoldásokkal

feladat pont min elért

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

1. Alapok. Programozás II

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

3. Osztályok II. Programozás II

C++ programozási nyelv Konstruktorok-destruktorok

Programozási Nyelvek: C++

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?

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

Fejlett programozási nyelvek C++ Iterátorok

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

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

Pénzügyi algoritmusok

C++ Gyakorlat jegyzet 8. óra

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

Pénzügyi algoritmusok

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

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.

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

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

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

C++ Gyakorlat jegyzet 7. óra

Bevezetés a programozásba 2

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

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

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

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

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.

Alprogramok, paraméterátadás

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

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

Bevezetés a programozásba I.

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

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

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

Globális operátor overloading

Pénzügyi algoritmusok

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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

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

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

Osztály és objektum fogalma

Programozás alapjai 2. (2. ea) C++

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

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

Maximum kiválasztás tömbben

Programozás C++ -ban

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

Objektumok inicializálása

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

Programozás II gyakorlat. 6. Polimorfizmus

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

Programozás C és C++ -ban

5. Gyakorlat. struct diak {

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

C++ Gyakorlat jegyzet 10. óra.

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

C++ Gyakorlat jegyzet 10. óra

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

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

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

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

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

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

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

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

Flex tutorial. Dévai Gergely

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

C++ Gyakorlat jegyzet 12. óra

OOP #14 (referencia-elv)

Szövegek C++ -ban, a string osztály

C++ programozási nyelv

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

Kalapácsvetés 2016 szöveges

Átírás:

Programozás alapjai 2. (inf.) 2. pzh 2017.05.09. gy./l. hiány: / ABCDEF IB.028/1. Z: / / 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! Az IMSC feladatot az alapfeladatok 75%- os teljesítése mellett értékeljük. 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 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! Az első feladatrészben minimum 5 pontot el kell érnie ahhoz, hogy a többi feladatot értékeljük. 1. feladat: Beugró. A feladatok megoldásához használhat STL tárolót és algoritmust! Σ 10 pont a) Mit ír ki az alábbi program a szabványos kimenetre? Válaszát c) Írjon programrészletet, ami a szabványos bemenetről fájl soronként a vonalazott részre írja! (3p) végéig egész számokat olvas be, majd fordított sorrendben kiírja #include <iostream> azokat a standard kimenetre, végül rendezve is írja ki a using std::cout; beolvasott számokat! A megoldáshoz használjon STL using std::endl; eszközöket! (3p) inline void e() { cout << endl; struct J { int i; J() { cout << 'k'; J(const J&) { cout << 'c'; ~J() { cout << 'd'; void f(j& ) { cout << 'f'; J& operator=(j a){ i = a.i; cout << '='; return *this; ; int main() { J *a= new J; e();// k J b = *a; e();// c *a = b; e();// c=d a->f(b); e();// f delete a; e();// d // d Soronként 0.5 p. b) Készítsen generikus függvényt (myswap), ami az std::swap függvényhez hasonlóan felcseréli a paraméterként kapott két generikus adatot! (2p) //Egy lehetséges megoldás: std::vector<int> tar; int a; while (std::cin >> a) tar.push_back(a); f. max. elért jav. 1. 10 2. 10 3. 10 4. 10 Σ 40 Van IMSC megoldásom: IM 10 for (size_t i =tar.size(); i > 0;) std::cout << tar[--i] << " "; std::sort(tar.begin(), tar.end()); for (size_t i = 0; i < tar.size(); ++i) std::cout << tar[i] << " "; //Egy lehetséges megoldás: template <typename T> void myswap(t& a, T& b) { T tmp = a; a = b; b = tmp d) 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 iterátor egy általánosított pointer I H A kivételosztályokat kötelező az std::exception osztályból származtatni. I H Alaposztály destruktorából hívott virtuális tagfüggvény a leszármazottban fut le. I H Függvénysablon példányosítása futási időben történik I H 1

2. Feladat 10 pont a) Készítsen adapter sablont (PyTomb), ami minden olyan szabványos sorozattárolóra alkalmazható, melynek van at() tagfüggvénye. Egy N elemű PyTomb 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é. A -1 az utolsó elemet adja, a -N pedig az első elemet. Úgy alakítsa ki a sablont, hogy alapértelmezésként a tároló az std::vector legyen! Ügyeljen arra, hogy a sorozattárolókra jellemző konstruktorok elérhetőek legyenek! A sorozattároló minden tagfüggvénye legyen elérhető! Példa a használatra: (4p) PyTomb<int> t(3); // int tömb 3 elemmel t[0] = 1; // első elem (=1) std::cout << t[-3]; // ez is az első (=1) t[2] = 3; // utolsó eleme (=3) std::cout << t[-1]; // utolsó (3.) elem (=3) t.push_back(10); // most már 4 elemű! std::cout << t[-1]; // utolsó (4.) elem (=10) template <typename T, class C = std::vector<t> > class PyTomb : public C { PyTomb(size_t n = 0, const T& value = T()) : C(n, value) { template<typename Iter> PyTomb(Iter first, Iter last) : C(first, last) {p T& operator[](int ix) { if (ix < 0) ix += C::size(); return C::at(ix); T operator[](int ix) const { if (ix < 0) ix += C::size(); return C::at(ix); ; b) Hozzon létre az elkészített adapter és az std::deque felhasználásával egy 40 elemű long tömböt! (1p) PyTomb<long, std::deque<long> > t40(40); 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); template<typename I, typename P> int count_if(i first, I last, P pred) { int cnt = 0; while (first!= last) if (pred(*first++)) cnt++; return first; 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 <class T> class KisebbMint { T ref; KisebbMint(const T& a) : ref(a) { bool operator()(const T& a) const { return a < ref; ; e) A részfeladatok eredményeit felhasználva írjon kódrészletet, ami a b) részfeladatban létrehozott tömbben megszámolja a negatív elemeket! (1p) std::cout << count_if(t40.begin(), t40.end(), KisebbMint<long>(0)); 2

IMSC FELADAT: Egészítse ki a PyTomb sablont unique iterátorral! Az iterátort ubegin( ) és uend( ) metódusokkal lehessen lekérni. A unique iterátor ugyanúgy működik, mint a hagyományos iterátor, de a szomszédos ismétlődő elemeket átugorja. Pl ha a tároló tartalma (2,3,4,4,5,5,5,2), akkor a unique iterátor a 2,3,4,5,2 értékeket adja sorban vissza. // PyTomb sablon kiegészítése: (a sablonba ez kerül): typedef typename C::iterator iterator; class unique_iterator; unique_iterator ubegin() { return unique_iterator(c::begin(), C::end()); unique_iterator uend() { return unique_iterator(c::end(), C::end()); class unique_iterator : public C::iterator { iterator e; unique_iterator() { unique_iterator(const iterator& i, const iterator& e) : C::iterator(i), e(e) { unique_iterator& operator++() { iterator first = *this; iterator tmp = *this; while (++tmp!= e && *tmp == *first); *this = unique_iterator(tmp, e); return *this; unique_iterator operator++(int) { unique_iterator tmp = *this; ++(*this); return tmp; ; // iterator class vége ; // PyTomb template vége 3. Feladat 10 pont A Film osztályban házimozinkhoz tárolunk adatokat. class Film { std::string cim; int polc; Film(const std::string& n = "", int p = 0); int getpolc() const; std::string getcim() const; void setpolc(int); void setcim(const std::string&); virtual ~Film(); ; Adott továbbá a Serializable osztály. struct Serializable { virtual void write(std::ostream& os) const = 0; virtual void read(std::istream& is) = 0; virtual ~Serializable() { ; a) A fenti osztályok felhasználásával, de azok módosítása nélkül hozzon létre a Film osztállyal kompatibilis, perzisztens PFilm osztályt! Megoldásában vegye figyelembe, hogy a címben 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! 5p 3

struct PFilm : public Film, public Serializable { PFilm(const std::string& n = "", int p = 0) : Film(n, p) { void write(std::ostream& os) const { os << "PFilm" << endl; os << getcim() << endl; os << getpolc() << endl; void read(std::istream& is) { std::string line; getline(is, line); if (line!= "PFilm") throw std::out_of_range("film szakadas"); getline(is, line); setcim(line); int a; (is >> a).ignore(1); setpolc(a); ;b) Egy rövid kódrészletben hozzon létre egy PFilm példányt a kedvenc filmcímé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 PDiak d1("nagy Elemer", 5.0); d1.write(std::cout); // PFilm\nNagy Elemer\n5.0\n c) Tételezze fel, hogy rendelkezésére áll a gyakorlaton elkészített PKomplex osztály is, ami szintén a Serializable osztály segítségével valósítja meg a perzisztens viselkedést! Egészítse ki megoldását, hogy az alábbi kódrészlet az elvárásoknak megfelelően működjön! 3p PFilm f1("vak asszony visszanez", 1), f2("a destruktor bosszuja", 2); PKomplex k1(2, 4); stringstream ss; f1.write(ss); k1.write(ss); f2.write(ss); PFilm nf1, nf2; PKomplex nk1; ss >> nf1 >> nk1 >> nf2; // elvárjuk, hogy f1 == nf1 && f2 == nf2 && k1 == nk1 legyen // azaz az elmentett állapot álljon elő. std::istream& operator>>(std::istream& is, Serializable& s) { s.read(is); return is; 4

4. Feladat 10 pont Az Állampolgárokat Védő Hivatal (AVH) nyilvántartást (Nyilvantartas) készít a különböző szervezetekről (Organ). Minden szervezetnek van neve (name, string), és lekérhető, hogy mennyi pénzt kapott a gyíkemberektől (getamount()). Több fajta szervezetünk lehet, és ezek száma később nőni fog. A Friend típusú szervezet például mindig 0-t ad vissza, ha gyíkember-pénzről kérdezzük, de van kedvenc focicsapata (team, string). A Civil típusú szervezet egy külön attribútumban tartja nyilván, hogy melyik évben ismerkedett meg a fő gyíkemberrel (soros, int). Vannak gyűjtőszervezetek, amelyek több másik szervezetből állnak (Liga), ezeknél a getamount() mindig a bennük levő szervezetek getamount()-jának összege. Egy Ligába a join metódussal lehet új szervezet felvenni. Minden szervezet ki tudja írni a megadott ostreamre az összes adatát (report). A Liga típusúak rekurzívan a tagszervezetekét is. A nyilvántartásba fel tudunk venni új szervezetet (add), és ki is tudjuk listázni a meglevőket (list), aminek a során az egyes szervezetek egyedi kiíratása fut le. Ha egy nyilvántartás megsemmisül, a tárolt adatok is elvesznek. Ugyanez igaz a Liga típusú szervezetekre is. 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. Nyilvantartas ny3per1; ny3per1.add(new Civil( Lofarok, 1989)); ny3per1.add(new Friend( Szarnyalas, Fertoapati )); Liga* fuveszek = new Liga(); fuveszek->join(new Civil( Spangli420, 2008)); fuveszek->join(new Civil( BobMarley, 1981)); ny3per1.add(fuveszek); ny3per1.list(std::cout); Egy lehetséges megoldás: Rajzoljon UML osztálydiagramot, amin ne szerepeljenek az attribútumok és a metódusok sem. Definiálja az alábbi osztályokat, de a metódusoknak csak a deklarációját adja meg! class Nyilvantartas { vector<organ*> orgs; void add(organ*); void list(ostream&) const; ~Nyilvantartas(); ; class Organ { string name; double amount; Organ(string); virtual double getamount() const; virtual void report(ostream&) const; virtual ~Organ(); ; 5

class Liga : public Organ { vector<organ*> orgs; Liga(string n = "Noname"); double getamount() const; void report(ostream&) const; void join(organ*); ~Liga(); ; class Civil : public Organ { int soros; Civil(string, int); double getamount() const; void report(ostream&) const; ; Implementálja külső definícióval a Liga összes metódusát és konstruktorát, ami a példakód futtatásához szükséges! Liga::Liga(string n) : Organ(n) { void Liga::join(Organ *o) { orgs.push_back(o); void Liga::report(ostream& os) const { Organ::report(os); os << endl; for (size_t i = 0; i <orgs.size(); i++) { orgs[i]->report(os); os << endl; Liga::~Liga() { for (size_t i =0; i <orgs.size(); i++) delete orgs[i]; 6