417. AA Megoldó Alfréd AA 417.



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

1. BB Megoldó Béla BB 1.

200. Megoldó Alfréd 200.

500. CC Megoldó Alfréd CC 500.

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

Programozás I gyakorlat

128. AA Megoldó Alfréd AA 128.

500. DD Megoldó Alfréd DD 500.

485. AA Megoldó Alfréd AA 485.

.AA Megoldó Alfréd AA.

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

111. AA Megoldó Alfréd AA 111.

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

500. AA Megoldó Alfréd AA 500.

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

503.DD #HIÁNYZIK Megoldó Alfréd DD 503.

191. BB Megoldó Alfréd BB 191.

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

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.

4. DD Megoldó Alfréd (A) DD 4.

Programozás C++ -ban 2007/4

Bevezetés a programozásba 2

Osztály szint tagok. Krizsán Zoltán 1 [2012. március 12.] Objektumorientált programozás C# alapokon tananyag

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

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

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

503.AA Megoldo Arisztid 503.A

1000.AA Megoldo Alfréd 1000.A

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

228. AA Default Konstruktor AA 228.

Származtatási mechanizmus a C++ nyelvben

1.AA MEGOLDÓ BERCI AA 1.

CAD-CAM

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

INFORMATIKAI ALAPISMERETEK

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

Géptermi zh-írás forgatókönyve

Mit ír ki? feladatok megoldásokkal

MATEMATIKA ÍRÁSBELI VIZSGA május 3.

XIII. STL. Tároló Bejáró Algoritmus. XIII.1 A vector #include <vector> #include <vector> #include <algorithm> using namespace std;

500.AA Megoldo Arisztid 500.A

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Maximum kiválasztás tömbben

Érettségi feladatok Algoritmusok egydimenziós tömbökkel (vektorokkal) 1/6. Alapműveletek

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

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

Objektumok inicializálása

Osztály és objektum fogalma

Programozás C++ -ban

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

500.AJ Megoldó Magyar Magdolna 500.J

3. Osztályok II. Programozás II

Fókuszban a formahibák. Konzultációs nap Minőségfejlesztési Iroda szeptember 18. Fekete Krisztina

Előre is köszönjük munkádat és izgatottan várjuk válaszaidat! A Helleresek

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

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Segítünk online ügyféllé válni Kisokos

1. Alapok. Programozás II

C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat

Bevezetés a C++ programozásba

INFORMATIKAI ALAPISMERETEK

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

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

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

AA MEGOLDÓ ALADÁR AA

Az új modulrendszer tapasztalatai

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

C++ Standard Template Library (STL)

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

C# osztályok. Krizsán Zoltán

3. Gyakorlat Ismerkedés a Java nyelvvel

Párhuzamos programozás

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

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

BOLYAI MATEMATIKA CSAPATVERSENY FŐVÁROSI DÖNTŐ SZÓBELI (2005. NOVEMBER 26.) 5. osztály

Programozás 5. Dr. Iványi Péter

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

Minta programterv a 1. házi feladathoz

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK KÖZÉPSZINT Függvények

Azonosító jel: Matematika emelt szint

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

Bevezetés a C++ programozási nyelvbe

Shared IMAP beállítása magyar nyelvű webmailes felületen

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

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

1. Metrótörténet. A feladat folytatása a következő oldalon található. Informatika emelt szint. m2_blaha.jpg, m3_nagyvaradter.jpg és m4_furopajzs.jpg.

EPER E-KATA integráció

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

A táblázatkezelő felépítése

Elemi adatszerkezetek

Bánsághi Anna

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

Programozás I ZH, Név:... EHA:... A. csoport. 25 pont. Gyakorlatvezető:...

Programozás C++ -ban

SJ5000+ MENÜBEÁLLÍTÁSOK. E l e c t r o p o i n t K f t., B u d a p e s t, M e g y e r i ú t F s z. 1. Oldal 1

Programozás II gyakorlat. 6. Polimorfizmus

INFORMATIKAI ALAPISMERETEK

Átírás:

Programozás alapjai 2. (inf.) zárthelyi 2008.05.14. gyakorlat: / Érdemjegy: 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, rádiótelefon nem használható. A feladatokat figyelmesen olvassa el, megoldásukhoz ne használjon fel STL tárolót, kivéve, 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 Megold/1. Hftest: 1200 F. Max. Elért 1 3 2 3 3 5 4 4 5 5 Σ 20 1. Feladat 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 A { const char *s; A(const char *s = "A") :s(s) { cout << s << 'k'; virtual ~A() { cout << 'd'; ; class B :public A { B(const char *s ="ABCDEF") :A(s){ cout << 'K'; B(const B&) { cout << 'C'; ~B() { cout << 'D'; ; int main() { A ab4; cout << endl; A k B b1("lo4"); cout << endl; l o 4 k K B b2 = b1; cout << endl; A k C A *ap = new B("lo4"); cout << endl; l o 4 k K delete ap; cout << endl; D d return(0); D d D d d Nagyon sokan nem vették figyelembe, hogy ha felüldefiniáljuk a másoló konstruktort, és abban explicit nem hívjuk meg az ős osztály másoló konstruktorát, akkor az ős alapértelmezett konstruktora hívódik meg. Előadáson többször elmondtam, laboron pedig legalább 2-szer gyakoroltuk ezt, a tartalmazott objektumok hasonló viselkedésével együtt!

2. Feladat Σ 3 pont Egy modellezési feladathoz egy olyan osztályt (F12) kell készítenie, ami egyrészt átadható a rajzol(rajz &) függvénynek, másrészt átadható a mukodtet(modell &) függvénynek. A Rajz ill. Modell osztályok deklarációját nem tudja megváltoztatni. Annyit tud róluk, hogy mindkettőből egy-egy függvényt kell megvalósítania a feladatához. A Rajz osztály esetében ez a void paint() függvény, a Modell osztály esetében ez a void run() függvény. Deklarálja az F12 osztályt és definiálja a paint() és run() tagfüggvényeket! A paint() függvény a standard kimenetre írja ki hogy Paint_1, a run() függvény pedig azt, hogy Run_1! (2 pont) Mutasson példát arra, hogy hogyan nézhet ki a Rajz osztály deklarációja! A kódrészlet tartalmazza az osztály deklarációjának első sorát és a paint() függvény deklarációját! (1 pont) Egy lehetséges megoldás: class F12 :public Rajz, public Modell { void paint() { cout << Paint_1 ; void run() { cout << Run_1 ; ; class Rajz... {... virtual void paint();... ; Többszörös öröklés egyik legfontosabb alkalmazása, hogy agy osztály több arcot tudjon mutatni. Előadáson több példa volt erre. Laboron is gyakoroltuk. Aki pedig megcsinálta a hftest 12. feladatát, az értette, hogy miért F12-nek hívták ezt az osztályt :) 3. Feladat Σ 5 pont Egy generikus Vec4 osztályt kell létrehozni, ami egy dinamikusan nyújtózkodó tömböt valósít meg. A tömb kezdeti mérete, és elemeinek kezdőértéke a konstruktorban adható meg. A tömb az indexelés során képes nyújtózkodni. Ilyenkor az új elemek a konstruktorban megadott értéket (iv) veszik fel. Az osztály megvalósításán többen dolgoznak egyszerre, akikkel megállapodtak az osztály belső adatszerkezetében, és a tagfüggvények funkcióiban. A megállapodást az alábbi kommentezett deklaráció rögzíti, amin nem lehet változtatni. class Vec4 { T* v; // Pointer a dinamikus adatterületre. Ezen a területen tároljuk az adatokat int siz; // Tárolt elemek száma, azaz ekkora dinamikus területet foglalunk. T iv; // Kezdeti érték, ezzel kell feltölteni az új elemeket. Vec4 (int n = 0, T iv = T());// Létrehoz egy n elemű vektort, feltölti iv értékkel, inicializál // nulla elemszámhoz is foglal területet, hogy később ne legyen vele baj Vec4 (const Vec4&); // Másoló konstruktor. Vec4& operator=(const Vec4&);// Értékadó op. Támogatja a többsz. értékadást. Önmagát is ell. void resize(int n); // Átméretezi a vektort. Ha n kisebb, mint a pillanatnyi méret, akkor az // első n elem megmarad, a többi elveszik. Ha nagyobb, akkor az új elemeket feltölti iv-vel int size() const; // Visszaadja a vektorban tárolt elemek számát T& operator[](int);// Index operátor, ami képes nyújtani a tömböt (nyújtáskor iv értékkel tölt) void erase(); // Felszabadítja a dinamikus területet. Olyan állapotba hozza az objektumot, // hogy hibamentesen működjön tovább (pl. értékadás) ~Vec4(); // Megszünteti az objektumot ;

A tagfüggvények elkészítését felosztották egymás között. Önre a a konsruktorok megírása jutott. Valósítsa meg feladatul kapott tagfüggvényeket! Vegye figyelembe, hogy a mások által írt függvények belső megoldásait nem ismeri, azaz nem használhat ki olyan működést, ami a fenti kódrészletből, vagy annak megjegyzéseiből nem olvasható ki (3 pont). Definiáljon egy olyan függvénysablont (add), amivel egy Vec4<T> vektort egy újabb elemmel lehet bővíteni! (2 pont) Működjenek helyesen a következő kódrészletek: Vec4<int> ab, ab2(8, -4); add(ab, 1); // a vektor 0. eleme 1 lett add(ab, 2); // a vektor 1. eleme 2 lett A csoport megoldása (kontruktorok): Vec4<T>::Vec4(int n, T iv) :iv(iv), siz(n){ v = new T[siz]; v[i] = iv; Vec4<T>::Vec4(const Vec4& f) { v = new T[siz = 0]; *this = f; B csoport megoldása (másoló+értékadó): Vec4<T>::Vec4(const Vec4& f) { v = new T[siz = 0]; *this = f; Vec4<T>& Vec4<T>::operator=(const Vec4& f) { if (this!= &f) { delete[] v; v = new T[siz = f.siz]; v[i] = f.v[i]; iv = f.iv; return *this; C csoport megoldása (index+size): T& Vec4<T>::operator[](int ix) { if (ix >= siz) { reize(ix+1); return v[ix]; int Vec4<T>::size() const { return siz; D csoport megoldása (resize+size): void Vec4<T>::resize(int n) { if (n!= siz) { T *tmp = new T[n]; int m = n < siz? n : siz; for (int i = 0; i < m; i++) tmp[i] = v[i]; delete[] v; v = tmp; while (i < n) v[i++] = iv; siz = n; int Vec4<T>::size() const { return siz; 2. részfeladat megoldása minden csoportnak: (Vigyázat, az add esetünkben nem tagfüggvény!) void add(vec4<t>& vec, T val) { vec[vec.size()] = val; Akik nem jöttek rá, hogy a másolóban fel lehet használni az értékadást ill. az indexben pedig a resize()-t, azok kicsi többet írtak, de az sem volt sok: Vec4<T>::Vec4(const Vec4& f){ v = new T[siz = f.siz]; v[i] = f.v[i]; iv = f.iv; ab.erase(); ab = ab2 = ab2; Vec4<int> ab3 = ab; cout << ab3[412]; T& Vec4<T>::operator[](int ix) { if (ix >= siz) { T *tmp = new T[ix+1]; tmp[i] = v[i]; delete[] v; v = tmp; while (i <= ix) v[i++] = iv; siz = ix + 1; return v[ix];

4. Feladat Σ 4 pont Az STL vector sablonjának, vagy a 3. feladat Vec4 sablonjának felhasználásával készítsen valós értékeket tároló verem osztályt! Valósítsa meg következő műveleteket: push elemet tesz verem tetejére pop elemet vesz le verem a tetejéről. A függvény visszatérési értéke a kivett elem legyen! empty true értéket ad, ha a sor üres. Az osztály legyen átadható érték szerint függvényparaméterként, és kezelje helyesen a többszörös értékadást (s1=s2=s3)! (Az STL vector fontosabb műveletei: at, front, back, push_back, pop_back, insert, empty, resize, =, [] ) Egy lehetséges megoldás: class Verem { Vec4<double> adat; // STL vector sablonnal is hasonló a megoldás void push(double d) { adat[adat.size()] = d; double pop() { double d = adat[adat.size()-1]; adat.resize(adat.size()-1); return d; bool empty() { return adat.size() == 0; ; Akik felüldefiniálták a másoló konstruktort és/vagy az értékadást, azok feleslegesen dolgoztak, hiszen a Verem osztály nem kezel dinamikus adattagot, csak a tartalmazott objektum (adat), ami viszont a feltételezésünk szerint jól működik. Csak akkor kell a másoló konstruktort és/vagy az értékadást felüldefiniálni, ha az alapértelmezés szerinti működés nem jó valamiért! A feladat szerint vagy az STL vector sablonját, vagy a 3. feladat Vec4 sablonját fel kellett használni!

5. Feladat Σ 5 pont Egy étterem informatikai rendszerében az egyes asztalok rendelését egy-egy rendelési listában szeretnénk tárolni. Egy rendelés több tételből állhat, mint pl: leves, főétel, ital, desszert, stb. A tételek megnevezése mellett mindegyikről különböző adatokat kell tárolni: bor esetében az évjárat, leves esetében az adag mérete, főétel esetében a köret megnevezése. Egy rendelés maximum 54 tételből állhat, amit list() tagfüggvénnyel lehet kiíratni. Pl: Leves: Erdei vargányaleves javasasszony módra, csésze Ital: Soproni Cabernet Franc, 1904 Főétel: Rozmaringos párolt nyúlgerinc, hagymás törtburgonya. Tervezzen meg egy olyan OO modellt, mely alapját képezheti a rendelést támogató programnak! Kezdetben csak 2 tétel (Foetel, Leves) tárolását tegye lehetővé, de legyen a modell könnyen bővíthető! Használhat STL tárolókat is! Rajzolja fel a modell osztálydiagramját! Használja fel a következő osztályneveket: Foetel, Leves, Asztal, Tetel! Implementálja a fenti osztályokat! Ne legyen egy függvénytörzsben sem felesleges kód! Az osztályokat olyan módon készítse el, hogy újabb ételfajta felvételekor a már meglevő kódot ne kelljen módosítani! Írjon egy egyszerű programrészletet, ami felvesz 2 tételt a példában szereplő ételek közül egy rendelési listára, és kilistázza azt! Osztálydiagram segítségével mutassa meg, hogy hogyan lehet az elkészített modellt felhasználni egy olyan étterem (Etterem) osztályhoz, melyben 8-44 Asztal van! Egy lehetséges megoldás: class Tetel { string megn; // Használjuk az STL string sablonját Tetel(const char *n) :megn(n) { virtual void kiir() { cout << megn; ; class Leves :public Tetel { string adag; Leves(const char *megn, const char *adag) :Tetel(megn), adag(adag) { void kiir() { cout << "Leves: "; Tetel::kiir(); cout << ", " << adag << endl; ; class Foetel :public Tetel { string koret; Foetel(const char *megn, const char *koret) :Tetel(megn), koret(koret) { void kiir() { cout << "Foetel: "; Tetel::kiir(); cout << ", " << koret << endl; ; class Asztal { vector<tetel*> v; // Használjuk az STL string sablonját void rendel(tetel *t) { v.push_back(t); void rendeles() { for (vector<tetel*>::size_type i = 0; i < v.size(); i++) v[i]->kiir(); ;... Asztal a1; a1.rendel(new Leves("Erdei vargányaleves jasasasszony módra", "csésze")); a1.rendel(new Foetel("Rozmaringos párolt nyúlgerinc", "hagymás törtburgonya")); a1.rendeles();

Nem tudom, hogy milyen úton terjed, de kérem, hogy a nevemben rúgják bokán (minimum) azt: 1. Aki a konstruktorban (bármelyikben) delete utasítást használ. Nem állítom, hogy tejesen lehetetlen olyan kódot írni, amiben ez értelmes lenne, de a konstruktor a létrehozásért van és nem a megszüntetésért. Különösen megdöbbentő a delete this fordulat. Ez csak azoknak ajánlott, akik a faágra kiülve, maguk alatt szokták fűrészelni a fát! 2. Aki a konstruktorban return *this utasítást használ! 3. Aki if (this!=...) utasítást használ a másoló konstruktorban úgy, hogy a... helyén a paraméterként kapott obj. példány címe van. Ez ugyanis mindig teljesülni fog, kár leírni! 4. Aki az egyenlőség operátort akarja visszavezetni a másoló konstruktor hívására. Igaz, hogy ezzel keletkezik egy másolat, de rossz helyen, amit valahogy a helyére (a this által mutatott objektumba) kellene tenni, ami általában bonyolult, és könnyen elrontható. 5. Aki azt képzeli, hogy egy pointer értékét csak a new operátor tudja megváltoztatni. Köszönöm!