500.AA Megoldó Kulcsár 500.A

Hasonló dokumentumok
500.AA Megoldo Arisztid 500.A

1000.AA Megoldo Alfréd 1000.A

500.AJ Megoldó Magyar Magdolna 500.J

1.AA MEGOLDÓ BERCI AA 1.

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

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.

C++ Standard Template Library (STL)

117. AA Megoldó Alfréd AA 117.

Fejlett programozási nyelvek C++ Iterátorok

AA MEGOLDÓ ALADÁR AA

500. DD Megoldó Alfréd DD 500.

feladat pont min elért

feladat pont min elért

3. Osztályok II. 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) {} };

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

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

OOP #14 (referencia-elv)

Globális operátor overloading

C++ programozási nyelv Konstruktorok-destruktorok

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.

111. AA Megoldó Alfréd AA 111.

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

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

Mit ír ki? feladatok megoldásokkal

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

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

Objektumok inicializálása

1. Alapok. Programozás II

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

Pénzügyi algoritmusok

Alprogramok, paraméterátadás

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

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

Bevezetés a programozásba 2

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

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

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

Tájékoztató. Használható segédeszköz: -

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

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

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

Pénzügyi algoritmusok

Programozás módszertan

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

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

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

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

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

C++ programozási nyelv

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

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

Programozási nyelvek Java

Bevezetés a programozásba I.

Programozási nyelvek II. JAVA

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

A C programozási nyelv I. Bevezetés

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

Pénzügyi algoritmusok

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ó

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.

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

Programozás II gyakorlat. 6. Polimorfizmus

ELTE SAP Excellence Center Oktatóanyag 1

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

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

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

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

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

C++ programozási nyelv

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

Objektumorientált programozás C# nyelven

A C programozási nyelv I. Bevezetés

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

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

Osztályok. 4. gyakorlat

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

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Programozási nyelvek Java

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

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

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

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

C++ Gyakorlat jegyzet 10. óra.

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

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

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

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

Programozás C++ -ban 2007/7

JAVA PROGRAMOZÁS 2.ELŐADÁS

Átírás:

Programozás alapjai 2. (inf.) 2. ZH 2019.05.14. lab. hiányzás: + / HFt: ABC123 IL.305./1. p: e: 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 A konstruktor előbb hajtja végre a programozott törzset, és csak ezután hívja az ősosztályok konstruktorát. I H Az iterátor egy általánosított pointer. I H b) Az alábbi függvénnyel egész számokat tartalmazó tárolóból szeretnénk eltávolítani elemeket. Teszteléskor észrevettük, hogy a függvény hívása után a tárolóban levő elemek száma nem változott. Mi lehet a baj? Javítsa ki a függvényt! (2p) void torol(std::list<int>& v, int elem) { std::list<int>::iterator it; it = std::remove(v.begin(), v.end(), elem);. v.erase(it, v.end()); c) Adott az alábbi deklaráció: class Listam: public std::list<int> { int azon[10]; f. max. elért jav. 1. 10 2. 10 3. 10 4. 10 Σ 40 IM. 10 Van megoldott IMSC: t1, t2; 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) Listam t3 = 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; utasítás hibás, mert t1 nem indexelhető. I H t1.push_front(45); utasítás helyes. I H d) Készítsen az std::count_if algoritmushoz hasonló generikus algoritmust (count_if_not), ami megszámolja, hogy az iterátorokkal megadott adatsorban hány olyan elem van, amire NEM teljesül a predikátum. Írjon rövid kódrészletet, melyben létrehoz egy sorozattárolót, mely egész elemeket tartalmaz, és a count_if_not sablon segítségével a standard kimenetre kiírja, hogy hány nullától különböző elem van a tárolóban! (4p) template <typename Iter, typename Pred> size_t count_if_not(iter first, Iter last, Pred pred) { size_t cnt = 0; while (first!= last) if (!pred(*first++)) cnt++; return cnt; std::list<int> l(8, 8); std::cout << count_if_not(l.begin(), l.end(), std::bind2nd(std::equal_to<int>(), 0));

2. Feladat 10 pont a) Készítsen adapter sablont (Traversable), ami minden szabványos sorozattárolóra alkalmazható, és van traverse tagfüggvénye. A traverse() függvény a tároló minden elemével hívja meg a paraméterként kapott egyoperandusú függvényt! Úgy alakítsa ki a sablont, hogy az alapértelmezett tárló az std::vector legyen! A sorozattároló minden publikus tagfüggvénye legyen elérhető! Ne felejtse el megvalósítani a sorozattárolókra jellemző konstruktorokat! (5p) Példa a Traversable sablon használatra: void func(long i) { std::cout << i << ","; // kiírja a paraméterét és egy vesszőt... Traversable<long> tv(20, -3); tv.traverse(func); // létrehoz egy 20 elemű tárolót, -3-mal feltöltve // kiírja az elemeket b) Hozzon létre az elkészített adapter és az std::list felhasználásával egy int típusú elemeket tartalmazó üres tárolót! (1p) c) Írjon kódrészletet, ami a fenti tárolóba a szabványos inputról a fájl végéig számokat olvas be! (1p) d) Készítsen olyan funktort (kiirnagyobb), ami alkalmazható a traverse() függvény paramétereként és segítségével kiírhatók a szabványos kimenetre a c) részfeladatban beolvasott adatok közül azok, amelyek egy referenciaértéknél nagyobbak! A számokat vesszővel válassza el egymástól. A referenciaértéket a funktor konstruktorában lehessen megadni! Mutassa be a funktor használatát egy rövid kódrészlettel, melyben vesszővel elválasztva írja ki a nullától nagyobb értékeket a tárolóból! (3p) a) template <typename T, typename C = std::vector<t> > struct Traversable : public C {// Delegáció nem jó, mert nem tudjuk, milyen fv-ei vannak a tárolónak Traversable(size_t n = 0, const T& value = T()) : C(n, value) { template<typename Iter>// Traversable(Iter first, Iter last) : C(first, last) { ; template<typename F> //t F traverse(f func) { typename C::iterator first = C::begin(); typename C::iterator last = C::end(); while (first!= last) func(*first++); return func; b) Traversable<long, std::list<lint> > tar; c) int adat; while (cin >> adat) tar.push_back(adat); d) struct kiirnagyobb { int ettol; kiirnagyobb(int ettol) :ettol(ettol) { void operator()(int adat) const { if (adat > ettol) std::cout << adat << ","; ; tar.traverse(kiirnagyobb(0));

IMSC FELADAT: Az std::copy_if(inputiterator first, InputIterator last, OoutputIterator result, UnaryPredicate pred) algoritmus átmásolja az iterátorokkal megadott adatsor azon elemeit, amelyek eleget tesznek a predikátumnak. e) Készítsen olyan generikus funktort, amelyet a traverse() függvény operandusaként használva a copy_if funkcionalitása kiváltható! f) A c) részfeladatban feltöltött tárolóból a traverse() függvényt, használva rövid kódrészlettel másolja át a 100-nál kisebb elemeket egy tárolóba, a 100-nál nagyobbakat pedig egy másik tárolóba! Csak STL elemeket használjon, kivéve az e) részfeladatban készített funktort! Ügyeljen arra, hogy a céltárolóban legyen elegendő hely! A másolás után pedig ne maradjon szemét! e) template <typename O, typename F> struct copyf { O outiter; F func; copyf(o outp, F func) :outiter(outiter), func(func) { template <typename T> void operator()(t adat) { if (func(adat)) *outiter++ = adat; ; // Ez a sablon nem szükséges a megoldáshoz, de segítségével a sablonparamétereket a fordító le tudja vezetni, // így nem kell azokat kiírni. template <typename O, typename F> copyf<o, F> copy(o o, F f) { return copyf<o, F>(o, f); f) Traversable<int> tar2(tar.size()); Traversable<int>::iterator it = tar.traverse(copy(tar2.begin(), std::bind2nd(std::less<long>(), 10))).outIter; tar2.erase(it, tar2.end()); tar2.traverse(func);

3. Feladat 10 pont Számítógép hálózat felett elosztott játékot készítünk. A játéknak vannak migrálható objektumai, melyek az egyik gépről a másikra át tudnak menni a migrateto() és a migratefrom() metódusok segítségével. Ezeket a metódusokat a játékot működtető keretrendszer hívja meg a megfelelő szöveges stream paraméterekkel. A tagfüggvények feladata, hogy az objektum állapotát kiírják a stream-re (migrateto) ill. beolvassák azt arról (migratefrom). Az alábbiakban megadjuk a Mouse és a Migratable osztályok definícióját: class Mouse { std::string name; // egér neve unsigned age; // egér kora Mouse(const std::string& n = "", unsigned a = 0); std::string getname() const; unsigned getage() const; void setname(const std::string&); void setage(unsigned); virtual ~Mouse(); ; struct Migratable { virtual void migrateto(std::ostream&) const = 0; virtual void migratefrom(std::istream&) = 0; virtual ~Migratable() { ; a) A fenti osztályok felhasználásával, de azok módosítása nélkül hozzon létre a Mouse osztállyal kompatibilis, migralható MigratableMouse osztályt! Megoldásában vegye figyelembe, hogy a névben szóköz is lehet! A stream-re történő kiíráskor írjon ki egy azonosítót is (pl: M ), ami beolvasáskor alkalmas annak ellenőrzésre, hogy jó objektumból származik-e a beolvasott adat. Nem kell bombabiztos megoldás! Hiba esetén dobjon std::domain_error kivételt! b) Egy rövid kódrészletben hozzon létre egy MigratableMouse példányt Mickey névvel, majd egy std::stringstream típusú objektum segítségével migrálja azt át egy másik gépre (hozzon létre egy újabb egeret, és oda migrálja)! c) Tételezze fel, hogy létezik egy MigratableCat osztály is, ami képes kiírni saját állapotát egy adatfolyamra. Olvassa be ezt egy MigratableMouse példányba! A keletkező kivételt kezelje le! struct MigratableMouse : public Mouse, public Migratable { MigratableMouse(const std::string& n = "", unsigned a = 0) : Mouse(n, a) { MigratableMouse(const Mouse& d) : Mouse(d) { void migrateto(std::ostream& os) const { os << "Mouse" << std::endl; os << getname() << std::endl; os << getage() << std::endl; void migratefrom(std::istream& is) { std::string line; getline(is, line); if (line!= "Mouse") throw std::domain_error("mouse!= " + line); getline(is, line); setname(line); unsigned int a; (is >> a).ignore(1); setage(a); ; b) MigratableMouse mm1("mickey"), mm2; std::stringstream ss; mm1.migrateto(ss); mm2.migratefrom(ss); c) try { MigratableCat cat("figaro"); cat.migrateto(ss); mm2.migratefrom(ss); catch (std::exception& e) { cout << e.what(); 5p 3p 2p

500.DD Pontozó Dezső 500.D 4. Feladat 10 pont Tudományos akadémiák kutatóhálózatát (Network) szeretnénk modellezni. A kutatóhálózatban különféle szervezetek (Org) vesznek részt. Mindnek van neve (name, string) és alapítási éve (year, int), ezek getter metódussal lekérhetők. A szervezetek közé tartoznak az Intézetek (Institute), a laborok (Laboratory), stb. Ezek újabb típusokkal bővülhetnek. Az intézeteknek van vezetője (head, string), a laboroknak van értéke (value, double). A print metódus meghívásakor a szervezetek kiírják adataikat a paraméterként megkapott ostream-re. Az intézeteknek lehet saját laborja is (a setlab metódussal rendelhető hozzá), ilyenkor a print rekurzívan a saját laboron is meghívódik. A kutatóhálózatba felvehetők újabb szervezetek (add), de meglevő szervezeteket törölni is lehet a referenciájuk megadásával (remove). Ha a kutatóhálózat megszűnik, a benne levő szervezetek is megszűnnek. A listall metódussal a kutatóhálózat minden szervezete kiíródik a szabványos kimenetre. Ha a metódusnak van egy int paramétere, akkor az adott évszám után alapított szervezetek listázódnak csak. 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 alábbi kódrészlet mutatja az egyes metódusok és konstruktorok paraméterezését és használatát. Network mta; // egyik kutatóhálózat Laboratory* l1 = new Laboratory("Bölcsészlabor", 1876, 123456.789); Laboratory* l2 = new Laboratory("Sugárlabor", 1978, 98765432.1); Institute* i1 = new Institute("Innovatív intézet", 2001, Dr. Eher Kevin ); i1->setlab(l2); mta.add(l1); mta.add(i1); mta.listall(1920); Definiálja az osztályokat! Az attribútumok kivétel nélkül legyenek privátok és konstruktorban állíthatók. Elegendő a fenti példa működéséhez szükséges getterek/setterek deklarációja. A megoldásban használja ki az STL adta lehetőségeket! 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 Network { // (2p) Network Org vector <Org*> v; void add(org* o); void remove(org&); void listall(int year = 0) const; ~Network() ; ; Institute 0..1 Laboratory class Org { // (2p) string name; int year; Organization(string n, int y) virtual void print(ostream& os) const; virtual ~Organization(); int getyear(); string getname(); ; class Institute : public Org { // (2p) string head; Instutite(string n, int y, string h); void print(ostream& os) const; setlab(laboratory* l); ~Institute(); ; class Laboratory : public Org {// (1p) int ev; Laboratory(string n, int y, double v); void print(ostream& os) const; ; Implementálja a Network osztály évszám alapján listázó tagfüggvényét iterátor használatával. (2p) void Network::listAll(int year) { for (vector<org*>::iterator it = v.begin(); it!= v.end(); it++) { if ((*it)->getyear() > year) { (*it)->print(std::out); std::out << std::endl;