128. AA Megoldó Alfréd AA 128.

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

500. CC Megoldó Alfréd CC 500.

.AA Megoldó Alfréd AA.

117. AA Megoldó Alfréd AA 117.

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

1000.AA Megoldo Alfréd 1000.A

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.

500. DD Megoldó Alfréd DD 500.

1.AA MEGOLDÓ BERCI AA 1.

503.AA Megoldo Arisztid 503.A

500.AA Megoldo Arisztid 500.A

228. AA Default Konstruktor AA 228.

500.AJ Megoldó Magyar Magdolna 500.J

500.AA Megoldó Kulcsár 500.A

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

111. AA Megoldó Alfréd AA 111.

feladat pont min elért

Mit ír ki? feladatok megoldásokkal

feladat pont min elért

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

AA MEGOLDÓ ALADÁR AA

3. Osztályok II. Programozás II

C++ programozási nyelv Konstruktorok-destruktorok

1. Alapok. Programozás II

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

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

Pénzügyi algoritmusok

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

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

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

Bevezetés a programozásba I.

Maximum kiválasztás tömbben

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

C++ Standard Template Library (STL)

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

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

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

- 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: C++

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

Körkörös listák. fej. utolsó. utolsó. fej

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

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

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

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.

Bevezetés a programozásba 2

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

Algoritmizálás + kódolás C++ nyelven és Pascalban

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 II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

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ás II. 3. gyakorlat Objektum Orientáltság C++-ban

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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

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

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

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

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

Programozás C++ -ban 2007/4

OOP #14 (referencia-elv)

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

Pénzügyi algoritmusok

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

Objektumok inicializálása

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

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

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

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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

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

Alprogramok, paraméterátadás

Programozás II gyakorlat. 6. Polimorfizmus

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

C++ programozási nyelv

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

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

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

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

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

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Programozási nyelvek Java

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Elemi Alkalmazások Fejlesztése II.

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

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

Bevezetés a programozásba. 11. Előadás: Esettanulmány

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

BME MOGI Gépészeti informatika 8.

Programozás C és C++ -ban

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?

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

Programozás C++ -ban

C++ Gyakorlat jegyzet 7. óra

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?

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

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.

5. Gyakorlat. struct diak {

Átírás:

Programozás alapjai 2. PótZH 2010.05.20. gyakorlat: Hiány:0 ZH: MEGOLD SEHOL/5. Hftest: 0 ZHp: Minden beadandó megoldását a feladatlapra, a feladat után írja! 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 és C++ összefoglaló használható. Számítógép, notebook, menedzser kalkulátor, organiser, mobiltelefon 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! Ne írjon felesleges függvényeket ill. kódot, a feladatra koncentráljon! Jó munkát! Értékelés: 0-8:1, 9-11:2, 12-14:3, 15-17:4, 18-20:5 F. Max. Elért 1 3 2 4 3 5 4 4 5 4 Σ 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! #include <iostream> using namespace std; class Adat { int adat; Adat(int i = 9) :adat(i) { cout << adat << 'k'; Adat(const Adat&) :adat(2) { cout << adat << 'c'; Adat& operator=(const Adat& a) { cout << a.adat << 'e'; return *this; ~Adat() { cout << 'd'; ; class Ma { Adat *ap; const char *s; Ma(const Ma&); Ma& operator=(const Ma&); Ma(const char *s = "A", int i = 0) :s(s) { ap = new Adat(i); cout << s << "Mk"; ~Ma() { delete ap; cout << "Md"; ; int main() { Ma me6("megold", 6); cout << endl; 6 k M E G O L D M k Adat a1, a2(6); cout << endl; 9 k 6 k a1 = a2; cout << endl; 6 e Ma* p = new Ma[1]; cout << endl; 0 k A M k delete[] p; cout << endl; d M d return(0); d d d M d 2. Feladat Σ 4 pont Tervezzen generikus dinamikus tömb (Tomb) osztályt! A tömb mérete a konstruktorban legyen megadható. Az osztály: Legyen képes tetszőleges típusú elemeket tárolni! Legyen indexelhető a szokásos index operátorral ([ ]). Ha a kapott index nagyobb vagy egyenlő, mint a tömb mérete, akkor dobjon std::range_error kivételt! Ügyeljen arra, hogy az index operátorral elért elem balértékként is szerepelhessen! Legyen átméretezhető a resize() tagfüggvénnyel! Amennyiben az új méret nagyobb mint a régi, akkor a keletkező elemek a tárolt elemtípus alapértelmezett értékével (default konstruktor) legyenek feltöltve! Legyen lekérdezhető a tömb aktuális mérete (size())! Legyen átadható érték szerint függvényparaméterként! Kezelje helyesen a többszörös értékadást (t1=t2=t3, ahol t1, t2, t3 ugyanazzal a típussal, de nem feltétlen azonos mérettel létrehozott objektum példányok)!

Készítse el a sablont C++ nyelven úgy, hogy a tagfüggvényeket ne valósítsa meg (ne definiálja)! (1.5p) Valósítsa meg (definiálja) a következőket: alapértelmezett és egyparaméteres konstruktor, destruktor, operator[], resize (2.5p) Egy lehetséges megoldás: class Tomb { T* adatp; // pointer az adatok tömbjére unsigned int siz; // ennyi adatunk van Tomb(unsigned int siz = 0); Tomb(const Tomb& t); // nem kellett megvalósítani unsigned int size(); // nem kellett megvalósítani void resize(unsigned int ns); T& operator[](unsigned int i); Tomb& operator=(const Tomb& t); // nem kellett megvalósítani ~Tomb(); ; Tomb<T>::Tomb(unsigned int siz) : siz(siz) { adatp = new T[siz]; for (unsigned int i = 0; i < siz; i++) adatp[i] = T(); // alapértelmezett értékkel töltjük fel Tomb<T>::~Tomb() { delete[] adatp; void Tomb<T>::resize(unsigned int ns) { if (ns!= siz) { T* tmp = new T[ns]; unsigned int i = 0; unsigned int j = siz < ns? siz : ns; for (; i < j; i++) tmp[i] = adatp[i]; while (i < ns) tmp[i++] = T();// alapértelmezett értékkel töltjük fel delete[] adatp; adatp = tmp; siz = ns; T& Tomb<T>::operator[](unsigned int i) { if (i < siz) return adatp[i]; throw range_error("indexelesi hiba"); Másik csoportnak resize és [] helyett: Tomb<T>::Tomb(const Tomb& t) { adatp = 0; // visszavezetjük az értékadásra *thist = t; Tomb<T>& Tomb<T>::operator=(const Tomb& t) { if (thist!= &t) { delete[] datap; siz = t.siz; adatp = new T[siz]; for (unsigned int i = 0; i < siz; i++) adatp[i] = t.adatp[i]; retrun *this;

3. Feladat Σ 5 pont Tételezze fel, hogy a 2. feladat Tomb sablonja hiánytalanul rendelkezésre áll. Készítsen a sablon felhasználásával int elemeket tároló halmaz (Halmaz) osztályt! Az osztálynak legyen előre haladó iterátora, amivel végig lehet járni a halmaz elemeit! Az osztály tegye lehetővé az alábbi műveleteket: elem beszúrása a halmazba (berak()); annak eldöntése, hogy egy elem benne van-e a halmazban (eleme_e()); halmaz számosságának lekérdezése (meret()); szokásos iterátor műveletek (*, ++,!=, begin(), end()). (csak pre incremens) Az osztály kezelje helyesen a többszörös értékadást és legyen átadható a halmaz függvényparaméterként. Segítségül megadjuk az osztály hiányos deklarációját. Megoldását a pontozott helyekre írja (több helyet hagytunk)! A pontok helyén a megoldás látható sárga kiemeléssel: class Halmaz { Tomb<int> adat; class iterator { // a halmaz iterátora Halmaz* hpoi6; // pointer a halmazra (az iterátor erre vontakozik) unsigned akt_index; // erre az elemre mutat az iterátor iterator(halmaz* h = 0, unsigned i = 0) : hpoi6(h), akt_index(i) { iterator& operator++() { akt_index++; return *this; ; int& operator*() { return hpoi6->adat[akt_index]; bool operator!=(const iterator &it6) { return hpoi6!= it6.hpoi6 akt_index!= it6.akt_index; iterator begin() { return iterator(this); iterator end() { return iterator(this, meret()); ; // halmaz tagfüggvényei void berak(int e) { if (eleme_e(e)) return; adat.resize(adat.size() + 1); adat[adat.size() - 1] = e; bool eleme_e(int e) { for (unsigned i = 0; i < adat.size(); i++) if (adat[i] == e) return true; return false; unsigned int meret() { return adat.size();

4. Feladat Σ 4 pont Készítsen egy olyan függvénysablont (valaszt), amely képes kiválasztani egy tárolóból a paraméterként kapott szempontnak leginkább megfelelő (pl. minimális) elemet. A függvénysablon a szokásos módon függvényparaméterként kap két iterátort, és egy predikátum objektumot, vagy függvényt, ami két elemről eldönti, hogy melyik felel meg jobban az adott kiválasztási szempontnak! A visszatérési érték a kiválasztott elem legyen! (2p) Működjön az elvárásoknak megfelelően a következő kódrészlet! double v[] = { 1.2, 4.5, 6.7, -3.6, -2 ; cout << valaszt<double>(v, v+5, less<double>()) << endl; Mutassa be az elkészített sablon működését a 3. feladat Halmaz osztályából létrehozott objektumpéldányra! Tételezze fel, hogy a 3. feladat Halmaz osztálya hiánytalanuk elkészült! (0.5p) Készítsen egy olyan generikus predikátumobjektumot, vagy függvényt, amellyel az abszolútértékek minimuma kiválasztható (1p)! Sorolja fel, hogy mely operatorok meglétét tételezte fel ez utóbbi részfeladatban (0.5p)! Egy lehetséges megoldás: template <class T, class I, class S> T valaszt(i elso, I utolso, S pred) { T tmp; // kell egy temp if (elso!= utolso) // lehet, hogy üres az intervallum tmp =*++elso; // elsőt eltesszük while (elso!= utolso) { if (pred(*elso, tmp)) tmp = *elso; ++elso; return tmp; // predikátum mondja meg, hogy eltegyük-e // a kiválasztott Halmaz h1; cout << valaszt<int>(h1.begin(), h1.end(), less<int>()) << end; struct Abs_minimum { bool operator()(t t1, T t2) { if (t1 < 0) t1 = -t1; if (t2 < 0) t2 = -t2; return t1 < t2; ; 5. Feladat: Σ 4 pont Egy egyetem (Egyetem) polgárait (Polgar), tanszékeit (Tanszek), oktatóit (Oktato), demonstrátorait (Demonstrator) és azok kapcsolatát szeretnénk modellezni. A demonstrátorok olyan oktatók, akik hallgatók is egyben. A feladatanalízis során a szereplők attribútumait az alábbiakban határoztuk meg: Egyetem (Egyetem) Oktató: (Oktato) o egyetem neve (string) o egyetem polgárai o fizetés/megbízási díj (double) o egyetem tanszékei Hallgató (Hallgato) Tanszék: (Tanszek) o tanszék neve (string) o neptunkód (string) o tanszékvezető (Oktato) Demonstrátor (Demonstrator) o tanszéken oktatók (demonstrátor is) Polgár (Polgar) o neptunkód (string) o fizetés/megbízási díj (double)

Egy oktató ill. demonstrátor több tanszéken is oktathat. Kezdeti modellünk csak minimális funkciókkal rendelkezik: o objektumok létrehozása (minden attribútum - kivéve a listák elemei - legyen megadható a konstruktorban); o objektumok megszüntetése; o tanszék létrehozása az egyetemen belül (letrehoz()) (ld. kódrészlet); o polgár felvétele az egyetemre (felvesz()); o oktató ill. demonstrátor tanszékhez rendelése (hozzarendel()); o polgár, oktató, hallgató és demonstrátor nevének kiírása a standard kimenetre (print()); (demonstrátorok esetében a név mellett a demonstrator hallgato szöveg is jelenjen meg) o tanszéken oktatók ill. egyetem polgárainak névsora (nevsor()). Az objektummodellt megterveztük, de sajnos az osztálydiagramból az összes felirat eltűnt! Egészítse ki a mellékelt osztálydiagramot! Jelölje a tagváltozók és tagfüggvények láthatóságát is! (1p) Deklarálja C++ nyelven a modellt megvalósító osztályokat! Használja a dőlt betűs azonosítókat! (1.5p) Valósítsa meg az Egyetem osztály konstruktorát, destruktorát, minden objektum print() tagfüggvényét, valamint a Tanszek hozzarendel() és nevsor() metódusát! (1.5p) A megoldásban használja fel az std::vector vagy az std::list sablont és az std::string osztályt! Polgar Egyetem -nev: string -nev: string -polgarok: vector<polgar*> -tanszekek: vector<tanszek *> +letrehoz(sting,oktato*):tanszek* +felvesz(polgar *): void +nevsor(): void Tanszek Hallgato Oktato -nev: string -tvez: Oktato* -oktatok: vector<oktato*> -neptun: string -fizetes: double +hozzarendel(polgar *):void +nevsor(): void Demonstrator Működjön helyesen az alábbi kódrészlet: Egyetem bme("bme"); Oktato *tvez = new Oktato("Szirmay", 1); bme.felvesz(tvez); Tanszek *iit = bme.letrehoz("iit", tvez); Oktato *op = new Oktato("Szebi", 2); bme.felvesz(op); iit->hozzarendel(op); Demonstrator *dp = new Demonstrator("Peti", "ha1234", 3); bme.felvesz(dp); iit->hozzarendel(dp); iit->nevsor(); bme.nevsor ();

Egy lehetséges megoldás: class Polgar { string nev; Polgar(string nev); virtual void print() { cout << nev; // virtuális! virtual ~Polgar(); // virtuális! ; class Oktato : virtual public Polgar { double fizetes; Oktato(string nev, double fizu); ; class Hallgato : virtual public Polgar { string neptun; Hallgato(string nev, string nept); ; class Demonstrator : public Hallgato, public Oktato { Demonstrator(string nev, string nept, double fizu); void print() { Polgar::print(); cout << " demonstrator hallgato"; ; class Tanszek { string nev; Oktato *tvez; vector<oktato*> oktatok; Tanszek(string nev, Oktato *tvez); void hozzarendel(oktato* okt) { oktatok.push_back(okt); // pointert vár! void nevsor(); ; void Tanszek::nevsor() { cout << "Tanszek: " << nev << "tanszekvezeto: "; tvez->print(); cout << endl; for (size_t i = 0; i < oktatok.size(); i++) { oktatok[i]->print(); cout << endl; class Egyetem { string nev; vector<polgar*> polgarok; // pointereket kell tárolni, mert heterogén vector<tanszek*> tanszekek; // itt nem lenne fontos a pointer, de... Egyetem(string nev) : nev(nev) { Tanszek* letrehoz(string nev, Oktato *tvez);// pointert ad vissza(ld. kód) void felvesz(polgar* polg); // pointert vár (ld. kód) void nevsor(); ~Egyetem(); ; Egyetem::~Egyetem() { for (size_t i = 0; i < polgarok.size(); i++) delete polgarok[i]; // megszűnnek a polgárok is for (size_t i = 0; i < tanszekek.size(); i++) delete tanszekek[i]; // megszűnnek a tanszékek is