503.AA Megoldo Arisztid 503.A

Hasonló dokumentumok
1000.AA Megoldo Alfréd 1000.A

500. AA Megoldó Alfréd AA 500.

500.AJ Megoldó Magyar Magdolna 500.J

500.AA Megoldo Arisztid 500.A

1.AA MEGOLDÓ BERCI AA 1.

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.AA Megoldó Kulcsár 500.A

500. CC Megoldó Alfréd CC 500.

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

128. AA Megoldó Alfréd AA 128.

117. AA Megoldó Alfréd AA 117.

228. AA Default Konstruktor AA 228.

AA MEGOLDÓ ALADÁR AA

500. DD Megoldó Alfréd DD 500.

C++ Standard Template Library (STL)

Mit ír ki? feladatok megoldásokkal

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

feladat pont min elért

111. AA Megoldó Alfréd AA 111.

Globális operátor overloading

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

feladat pont min elért

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

Pénzügyi algoritmusok

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

Pénzügyi algoritmusok

C++ programozási nyelv Konstruktorok-destruktorok

1. Alapok. Programozás II

3. Osztályok II. Programozás II

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

Programozási Nyelvek: C++

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

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

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

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

OOP #14 (referencia-elv)

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

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

Fejlett programozási nyelvek C++ Iterátorok

5. Gyakorlat. struct diak {

Programozás II. 2. gyakorlat Áttérés C-ről C++-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

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

C++ Gyakorlat jegyzet 8. óra

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.

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

- 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

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

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?

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

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

Alprogramok, paraméterátadás

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

Bevezetés a programozásba 2

Objektumok inicializálása

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 II. 2. Dr. Iványi Péter

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

Programozás II gyakorlat. 6. Polimorfizmus

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

Programozás C++ -ban

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

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

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ó

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

Osztály és objektum fogalma

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

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

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

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

Kivételek, kivételkezelés a C++ nyelvben

Bevezetés a programozásba I.

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

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

C++ Gyakorlat jegyzet 7. óra

Osztályok. 4. gyakorlat

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

Számítógép és programozás 2

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

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

Objektumelvű programozás

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

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

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

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

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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

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

Programozás C++ -ban

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

Programozás I gyakorlat

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

Pénzügyi algoritmusok

OOP: Java 4.Gy: Java osztályok

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

Átírás:

Programozás alapjai 2. (inf.) 2. ZH 2017.04.27. gy./l. hiány: / ABCD123 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. #include <iostream> using std::cout; using std::endl; inline void e() { cout << endl; struct A { A() { cout << 'k'; A(const A&) { cout << 'c'; ~A() { cout << 'd'; void f(a a) { cout << 'f'; A& operator=(const A&){ cout << '='; return *this; int main() { A a; e();// k A b = a; e();// c a = b; e();// = a.f(b); e();// cfd // dd b) Mutassa be az STL sorozattárolók létrehozásának (konstruktor) 4 jellemező használati esetét! (paraméterek száma, típusa)! (2p) IL305/1. kzh: nzh:0 f. max. elért jav. 1. 10 2. 10 3. 10 4. 10 Σ 40 IM 10 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 Adott az alábbi kódrészlet: soronként a vonalazott részre írja! (3p) std::set<int> zha1; long *p21 = new long[100];...// itt további utasítások vannak c) Írjon olyan kódrészletet, ami kiírja a zha1 objektum adatait soronként a szabványos kimenetre! (1p)! for(set<int>::iterator i = zha1.begin(); i!= zha1.end(); ++i;) std::cout << *i; d) Növelje meg a p21 pointer által hivatkozott adatterületet a duplájára úgy, hogy a már meglevő adatok ne vesszenek el! A már nem használt memóriaterületet szabadítsa fel! (2p) long *tmp = new long[200]; for (int i = 0; i < 100; i++) tmp[i] = p1[i]; delete[] p21; p21 = tmp; paraméter nélkül - üres tárolót hoz létre 1 paraméterrel - adott elemszámú tárolót hoz létre default értékkel feltöltve 1 size_t n és egy const T& val paraméterrel - adott (n) elemszámú tárolót hoz létre a megadott (val) értékkel feltöltve 2 db iterátor paraméterrel - az iterátorokkal megadott jobbról nyílt intervallum elemeivel tölti fel a tárolót // for helyett használható az std::copy(p21, p21+100, tmp) // utasítás is, de a feladatban a pointerek // kezelése volt a lényeg. e) 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 feladatra kapott ponttal. (2p) Az iteráror egy általánosított pointer. A kivételosztályokat kötelező az std::exception osztályból származtatni. Alaposztály konstruktorából hívott virtuális tagfüggvény a leszármazottban fut le. Függvénysablon példányosítása futási időben történik.

2. Feladat 10 pont a) Készítsen generikus halmaz osztályt (Set), adott maximális méretű halmaz tárolására! A méretet sablonparaméterként vegye át! Az osztály az implicit módon keletkező tagfüggvényeken kívül csak a következő tagfüggvényekkel rendelkezzen: (5p) size_t size() const; - a tárolóban levő elemek számát adja size_t capacity() const; - a tároló maximális méretét (sablon paraméter) adja int count(const T& ) const; - megadja, hogy a paraméterként kapott elem benne van-e tárolóban (0 vagy 1) void insert(const T&); - beteszi a paraméterként kapott elemet a tárolóba, ha még nincs benne. Amennyiben már nincs több hely a tárolóban dobjon std::out_of_range kivételt! A használatra az alábbi kódrészlet mutat példát: Set<int, 20> fix_halmaz; fix_halmaz.insert(3); fix_halmaz.insert(3); std::cout << fix_halmaz.size(); // kiir: 1 std::cout << fix_halmaz.count(4); // kiir: 0 template <typename T, size_t siz> class Set { size_t cnt; T data[siz]; Set() : cnt(0) { size_t size() const { return cnt; size_t cpacity() const { return siz; int count(const T& val) { for (size_t i = 0; i < cnt; i++) if (data[i] == val) return 1; return 0; void insert(const T& val) { if (count(val) == 1) return; if (cnt >= siz) throw std::out_of_range("set insert"); data[cnt++] = val; virtual ~Set() { b) Az elkészített sablon felhasználásával, annak módosítása nélkül készítsen egy újabb sablont MySet néven! Ez legyen kompatibilis a Set sablonnal, valamint legyen olyan iterátoros konstruktora is, ami iterátorokkal adott intervallum adataival tölti fel. Ügyeljen arra, hogy üres halmazt is létre lehessen hozni, és ne töltse túl a tárolót! Azt az adatot, ami nem fér bele, hagyja figyelmen kívül! A tárolóban levő elemek számát ne adminisztrálja többszörösen! (3.5p) template <typename T, size_t siz> struct MySet : Set<T, siz> { MySet() { template <typename Iter> MySet(Iter first, Iter last) { while (first!= last) if (this->size() < siz) this->insert(*first++); else return; c) Rövid kódrészlettel mutassa be a MySet sablon iterátoros konstruktorának és az insert tagfüggvényének használatát int adatokkal. A kódrészletben mutassa be az esetlegesen keletkező kivétel elkapását is! (1.5p) try { int t[] = { 1, 2, 3, 4, 5, 6, 7 MySet<int, 5> ms2(t, t+7); ms2.insert(99); catch (std::exception& e) { std::cout << e.what();

d) IMSC FELADAT: Egészítse ki a Set sablont iterátorral! Valósítsa meg az összes olyan tagfüggvényt, amit az alábbi kódrészlet felhasznál! for (Set<int, 20>::iterator it = fix_halmaz.begin(); it!= fix_halmaz.end();) cout << *it++ << endl; // A Set kiegészítése (belső iterator osztálya és begin, end tagfüggvénye) class iterator; iterator begin() { return iterator(this); iterator end() { return iterator(this, cnt); class iterator : public std::iterator<std::random_access_iterator_tag, T> { size_t ix; Set<T, siz> *p; iterator(set<t, siz> *p = NULL, size_t ix = 0) : ix(ix), p(p) { iterator& operator++() { if (ix < p->cnt) ix++; return *this; iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; T& operator*() const { return p->data[ix]; bool operator!=(const iterator& it) const { return p!= it.p ix!= it.ix; 3. Feladat 10 pont a) Valósítson meg egy olyan osztályt (Student), ami hallgatók nevének és tanulmányi átlagának tárolására alkalmas! A neveket std::string a pontszámokat pedig valós (double) típusban tárolja. Mindkét adat legyen megadható a konstruktorban és külön-külön legyen lekérdezhető, de közvetlenül ne legyenek elérhetőek! Elképzelhető, hogy az osztályt később alaposztálynak használjuk heterogén gyűjteményben! (3p) class Student { std::string name; double point; Student(const char* n, double p) :name(n), point(p) { const std::string& getname() const { return name; double getpoint() const { return point; virtual ~Student() { b) Valósítson meg egy olyan osztályt (LabGroup), ami egy csoportnevet (std::string) és a csoporthoz tartozó hallgatók adatait tárolja. A hallgatók (Student) tárolásához válasszon megfelelő tárolót az STL tárolói közül! A LabGroup osztálynak legyen olyan tagfüggvénye (add), amivel Student adható a csoporthoz és legyen egy olyan is (list), amivel a hallgatók adatai névsorban kiírathatók a paraméterként kapott std::ostream típusú adatfolyamra! Az adatokat tetszőleges sorrendben tárolhatja, amit bármikor át is rendezhet. Az adattagok közvetlenül ne legyenek elérhetőek! Az osztály használatára az alábbi kódrészlet mutat példát, melyből látnia kell, hogy a dinamikus területen létrejövő objektumok felszabadításáról is kell gondoskodnia. (7p) LabGroup l1("l1r4i"); // csoport neve l1.add(new Student("Fellebeki Atmegel", 4.5)); l1.add(new Student("Bond James Bond", 5)); l1.list(std::cout);

class LabGroup { struct Stcmp { // összehasonlító fv. rendezéshez, vagy építéshez bool operator()(student *s1, Student *s2) { return s1->getname() < s2->getname(); std::string gname; std::set<student*, Stcmp> st; // set rendezetten tárol, utólag is // lehetett rendezni pl. egy listát vagy vektort LabGroup(const char* n) :gname(n) { const std::string& getname() const { return gname; void add(student *s) { st.insert(s); void list(std::ostream& os) const { for (std::set<student*, Stcmp>::iterator it = st.begin(); it!= st.end(); ++it) os << (*it)->getname() << " " << (*it)->getpoint() << std::endl; ~LabGroup() { for (std::set<student*, Stcmp>::iterator it = st.begin(); it!= st.end(); ++it) delete (*it); 4. Feladat 10 pont A Honvédelmi Minisztérium HR osztálya a minisztériumi dolgozók nyilvántartására alkalmas szoftvert fejleszt. A nyilvántartásban (Nyilvantartas) heterogén kollekciót valósítanak meg. Minden dolgozót a Dolgozo osztály (vagy leszármazottja) reprezentálja. Minden dolgozónak van neve (string n). A katonák (Katona) rendfokozattal (rang r) rendelkeznek, az orvosoknál (Orvos) nyilvántartják a doktori cím megszerzésének idejét (date d). Vannak olyanok, aki egyszerre katonák és orvosok (Katonaorvos). A KatonaOrvos kompatibilis mind a Katona, mind az Orvos osztállyal. Az attribútumok getter metódusokkal elérhetők, de privát láthatóságúak és konstruktorból inicializálhatóak. A dolgozók és leszármazottaik a kiir metódusban kiírják a paraméterül kapott std::ostream típusú objektumra az összes adatukat, akár többször is, de getter metódust nem használhatnak! A nyilvántartásból több példány is készülhet. Ha egyet beolvasztunk egy másikba, akkor az első kiürül, a benne levő adatok átkerülnek a másikba. A nyilvántartás ki tudja írni a nyilvántartottak adatait egy paraméterként kapott ostream-re (listáz). 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; // egyik nyilvántartás Nyilvantartas ny3per2; // másik nyilvántartás ny3per1.felvesz(new Katona("Kovács Jolán", rang("őrnagy"))); ny3per2.felvesz(new KatonaOrvos("Szentfazéky Eutanázia", rang("bőrmester"), date(1992, 06,30))); // Sz.E.-t lajstromba vesszük Orvos* ko = new KatonaOrvos("Vastag Béla", rang("huszados"), date(2012, 06,30)); ny3per1.felvesz(ko); // Bélát lajstromba vesszük ny3per2.beolvaszt(ny3per1); // ny3per1 adatai átkerülnek ny3per2-be ny3per2.listaz(std::cout); // ny3per2 adatait kilistázzuk stdout-ra

Rajzoljon UML osztálydiagramot, amin szerepeljenek a metódusok is (konstruktorok nélkül). UML jelöléssel jelölje a láthatóságot is. Nyilvantartas +Nyilvantartas() +felvesz(d: Dolgozo): void +listaz(os: ostream): void +beolvaszt(ny: Nyilvantartas): void +~Nyilvantartas() Definiálja az alábbi osztályokat, de a metódusoknak csak a deklarációját adja meg! class Nyilvantartas { vector<dolgozo*> v; ~Nyilvantartas() ; void felvesz(dolgozo* d); void listaz(ostream& os) const; void beolvaszt( Nyilvantartas& ny); * Dolgozo +Dolgozo(nev: string) <<virtual>>+~dolgozo() <<virtual>> +getnev(): string Katona +Katona(n: string, r: rang) +getrang(): rang Orvos +Orvos(n: string, d: date) +getdoktori(): date class Dolgozo { string n; Dolgozo(string nev); virtual ~Dolgozo(); virtual void kiir( ostream& os) const; string getnev() const; KatonaOrvos +KatonaOrvos(n: string, r: rang, d: date) class Katona : virtual public Dolgozo { rang r; Katona(string n, rang r); rang getrang() const; void kiir(ostream& os) const; class KatonaOrvos : public Katona, public Orvos { KatonaOrvos(string n, rang r, date d); void kiir(ostream& os) const; class Orvos : virtual public Dolgozo { date d; Orvos(string n, date d); date getdoktori() const; void kiir(ostream& os) const; Implementálja a Katonaorvos összes metódusát és konstruktorát. KatonaOrvos::KatonaOrvos(string n, rang r, date d) : Dolgozo(n), Katona(n, r), Orvos(n,d) { void KatonaOrvos::kiir(ostream& os) const { Katona::kiir(os); os << "; "; Orvos::kiir(os);