AA MEGOLDÓ ALADÁR AA

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

1.AA MEGOLDÓ BERCI AA 1.

500. AA Megoldó Alfréd AA 500.

1000.AA Megoldo Alfréd 1000.A

500.AA Megoldo Arisztid 500.A

503.AA Megoldo Arisztid 503.A

.AA Megoldó Alfréd AA.

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.

128. AA Megoldó Alfréd AA 128.

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

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

228. AA Default Konstruktor AA 228.

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

500.AA Megoldó Kulcsár 500.A

500.AJ Megoldó Magyar Magdolna 500.J

Pénzügyi algoritmusok

111. AA Megoldó Alfréd AA 111.

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

117. AA Megoldó Alfréd AA 117.

Mit ír ki? feladatok megoldásokkal

C++ programozási nyelv Konstruktorok-destruktorok

3. Osztályok II. Programozás II

Objektumok inicializálása

Programozási Nyelvek: C++

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

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

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

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

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

1. Alapok. Programozás II

Programozás II gyakorlat. 6. Polimorfizmus

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. Osztályok, Származtatott osztályok. Fodor Attila

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

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.

C++ programozási nyelv

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

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

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

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

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

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

feladat pont min elért

Osztályok. 4. gyakorlat

Pénzügyi algoritmusok

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

Programozás C++ -ban

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

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

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

feladat pont min elért

Programozási nyelvek Java

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

OOP #14 (referencia-elv)

Programozás C++ -ban

Globális operátor overloading

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

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

Programozás módszertan

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

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

5. Gyakorlat. struct diak {

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++ Standard Template Library (STL)

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

Java és web programozás

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

Sztringkezelő függvények. A string típusú változók kezelése, használata és szerepük a feldolgozás során

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

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ó

Programozás C++ -ban 2007/4

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

A C programozási nyelv III. Pointerek és tömbök.

Elemi Alkalmazások Fejlesztése II.

Objektumorientált programozás C# nyelven

Pénzügyi algoritmusok

Programozás C++ -ban 2007/7

C programozási nyelv Pointerek, tömbök, pointer aritmetika

200. Megoldó Alfréd 200.

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

A C programozási nyelv III. Pointerek és tömbök.

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

Bevezetés a Python programozási nyelvbe

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

Objektumorientált programozás C# nyelven III.

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

Maximum kiválasztás tömbben

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

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

BME MOGI Gépészeti informatika 8.

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozási nyelvek Java

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

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

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

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

Objektumelvű programozás

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

Bevezetés, a C++ osztályok. Pere László

Átírás:

Programozás alapjai 2. (inf.) 1. zárthelyi 2015.03.30. gyak./lab. hiányzás: 3/2 G3-QB309 ZEZFCE 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! 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, 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 (beugró) minimum 5 pontot el kell érnie ahhoz, hogy a többit értékeljük. IB.028/1. fel. max. elért jav. 1. 10 2. 10 3. 10 4. 10 Σ 40 1. feladat: Beugró Σ 10 pont a) Definiáljon C++ osztályt, melynek a konstruktora a d) Mi a hiba az alábbi programrészletben? (1p) szabványos kimenetre kiírja, hogy Hello, a másoló using std::string; konstruktora, hogy Copy, az értékadó operátora hogy Assign, a destruktora pedig, hogy ByeBye! (2p) string *sp = new string[10]; delete sp; using std::cout; struct A { A() { cout << "Hello"; A(const A&) { cout << "Copy"; A& operator=(const A&) { cout << "Assign"; return *this; ~A() { cout << "ByeBye"; ; delete[] kell. Így nem fut le a tömb minden elemére a destruktor, ami miatt memóriaszivárgás léphet fel. e) Valósítsa meg C++ nyelven az alábbi osztálydiagramon szereplő osztályokat! (2p) b) Az a) feladatban készített osztály felhasználásával írjon olyan programrészletet, amiben legalább egyszer meghívódik mind a négy tagfüggvény. Adja meg, hogy melyik utasítás/sor hatására mit ír ki a program! (2p) { A a; // Hello A b = a; // Copy a = b; // Assign // ByeBye Néhány lehetséges megoldás: class B { ; class A { B b; ; struct B { ; struct A { private: B b; ; f) Valósítsa meg C++ nyelven az alábbi osztálydiagramon szereplő osztályokat! (2p) c) Mi a hiba az alábbi programrészletben? (1p) int& novel(int i) { return ++i; Értékparaméter referenciával tér vissza. A paraméter a visszatérés pillanatában megszűnik. A referencia érvénytelen lesz! Néhány lehetséges megoldás: class C { ; class D : public C { ; sruct C { ; struct D : private C { ; class C { ; class D : C { ; sruct C { ; struct D : C { ;

2. Feladat 10 pont Karaktersorozat dinamikus tárolására alkalmas sztring osztályt kell létrehozni String_2 néven. Meg kell valósítani az alábbi műveleteket: operator[] Egy karakter direkt elérése (indexelés). Nincs indexhatár ellenőrzésoperator+ két sztring összeadása (összefűzés) operator+ sztring + karakter összeadása (karaktert a string végére fűzi) operator+= két sztring összeadása (összefűzés), az eredmény a bal oldali op. length sztring hosszát adja c_str a szokásos C stílusú sztringre konvertál find karakter első előfordulásának indexét adja vissza erase üres sztringet állít be is_null igaz értéket ad, ha a sztring üres ("") 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. Úgy döntöttek, hogy a karaktersorozatot lezáró nullával együtt tárolják, de a tárolt hosszba (len) a nullát nem számolják bele. Abban is megállapodtak, hogy ha lehet, használják a C sztringkezelő függvényeit <cstring>. Azt is megbeszélték, hogy az üres sztringet ("") is tárolják. A megállapodást az alábbi kommentezett deklaráció rögzíti, amin nem lehet változtatni. Követelmény, hogy az osztály legyen átadható érték szerint függvényparaméterként, és működjön helyesen a többszörös értékadás is. class String_2 { char *str; // Pointer a dinamikus adatterületre. Ezen a területen tároljuk a karaktereket. size_t len; // A string tényleges hossza, amibe a lezáró nulla nem számít bele. String_2(const char *s = ""); // Létrehoz sztringet s-ből. Feltételezhető, hogy s soha sem null String_2(char ch); // Létrehoz egy sztringet egy karakterből String_2(const String_2&); // Másoló konstruktor. String_2& operator=(const String_2&);// értékadó (String_2 = String_2) String_2& operator+=(char); // értékadó (String_2 += String_2) char& operator[](size_t); // indexoperátor; nincs indexhatár ellenőrzés const char& operator[](size_t) const; // indexoperátor, nincs indexhatár ellenőrzés String_2 operator+(const String_2&) const; // String_2 + String_2 String_2 operator+(char) const; // String_2 + char const char* c_str() const; // C stílusú sztringre konvertál size_t length() const; // Visszaadja a sztring tényleges hosszát; size_t find(const char) const; // egy karakter első előfordulását keresi, ha nem talál, -1-et ad vissza void erase(); // üres sztringet állít be ~String_2(); // megszünteti az objektumot ; A tagfüggvények elkészítését felosztották egymás között. Önre az értékadó operátorok (=, +=), a length és a find tagfüggvények megírása jutott. Valósítsa meg a 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. A feladat szövegében az operator+= függvény paramétere és a komment sajnos ellentmondó. Ezért minden a szövegből kiolvasható módon elfogadtuk a megoldást. Az egyes csoportoknak más-más tagfüggvényeket kellett megvalósítani az alábbiakban megvalósítunk minden, a feladatokban feladatként előforduló tagfüggvényt: // értékadó operátor String_2& String_2::operator=(const String_2& rhs_s) { if (this!= &rhs_s) { delete[] str; len = rhs_s.len; strcpy(str, rhs_s.str); return *this;

// ez is értékadó operátor String_2& String_2::operator+=(const String_2& rhs_s) { *this = *this + rhs_s; // visszavezettük op+ -ra // ez is értékadó operátor String_2& String_2::operator+=(char rhs_c) { *this = *this + rhs_c; // visszavezettük op+ -ra // length sztring hosszát adja size_t String_2::length() const { return len; size_t String_2::find(const char ch) const; for (size_t i = 0; i < len; i++ if (ch == str[i]); return i; return -1; String_2 String_2::operator+(const String_2& rhs_s) const { String_2 temp; // temp (a konstruktor memóriát foglal) temp.len = len + rhs_s.len; delete[] temp.str; //a konstruktor memóriát foglal, ezért fontos a felszabadítás temp.str = new char[temp.len+1]; strcpy(temp.str, str); strcat(temp.str, rhs_s.str); return temp; String_2 String_2::operator+(char rhs_c) const { return *this + String_2(rhs_c); // visszavezettük szring + sztringre void String_2::erase(){ *this = ""; // visszavezettük op=-re // c_str nullával lezárt karaktersorozatra (C stringre) mutató pointert ad const char* c_str() const { return str; // konstruktor String_2::String_2(char ch) { len = 1; str[0] = ch; str[1] = '\0'; // konstruktor String_2::String_2(const char *p) { len = strlen(p); strcpy(str, p);

// másoló konstruktor String_2::String_2(const String_2& s1) { len = s1.len; strcpy(str, s1.str); // destruktor String_2::~String_2() { delete[].str; // index operátor char& String_2::operator[](size_t i) { return str[i]; // konstans index operátor const char& String_2::operator[](size_t i) const { return str[i]; 3. Feladat 10 pont Tételezze fel, hogy a 2 feladat String_2 osztálya a specifikációnak megfelelően elkészült! A String_2 osztály felhasználásával, annak módosítása nélkül hozzon létre olyan osztályt (MyString_2), ami pontosan ugyanúgy viselkedik, mint a String_2 osztály, de vannak at() tagfüggvényei is! Ezek az indexeléshez hasonlóan működnek, azonban ellenőrzik az indexhatárokat, s hiba esetén std::out_of_range kivételt dobnak Készítsen olyan fűzhető inserter operátort (<<), ami képes kiírni a MyString_2 objektumban tárolt karaktersorozatot egy ostream típusú objektumra! Mutassa be egy rövid programrészleten az inserter és az at() tagfüggvények (mindkettő) használatát. Kapja el ez esetlegesen keletkező kivételt! class MyString_2 : public String_2 { // analitikus örökléssel MyString_2(const char *s = "") : String_2(s) {; // konstruktorok delegálása MyString_2(char ch) : String_2(ch) {; char& at(size_t i) { if (i >= length()) throw std::out_of_range("index"); // indexhatár ellenőrzés return (*this)[i]; const char& at(size_t i) const { if (i >= length()) throw std::out_of_range("index"); // indexhatár ellenőrzés return (*this)[i]; ; // inserter (nem tagfüggvény!) std::ostream& operator<<(ostream& os, const MyString_2& s) { return os << s.c_str(); // használat bemutatása try { MyString_2 str; MyString_2 hell("hello"); std::cout << hell << std::endl; std::cout << hell[100]; catch (expection&) { cout << "Megcsíptük! Oszi!";

4. Feladat 10 pont Micimackó, a legokosabb mackó a Százholdas Pagonyban, éppen az üres csuprok (Jar) hasznosításán töprengett, amikor rájött, hogy azokban különféle tárgyakat (Object) lehet tartani. Így pl. ceruzát (Pencil), térképet (Map) és még mást is, de más éppen nem jutott eszébe. Azt azonban tudta, hogy minden, amit be akar tenni a csuporba, eltérő attribútumokkal rendelkezik. Mackó számára a térképet a neve (std::string), a ceruzát pedig a hossza (int) jellemzi a legjobban. Segítsen modellezni a feladatot Micimackónak! (Bagoly mesélt valami heterogén kollekcióról, de ezt sajnos Mackó nem értette meg.) Követelmény, hogy Mackó meg tudja mutatni a csuporba tett tárgyakat és azok attribútumát Robert Gidának. Ehhez a csupor show tagfüggvényét akarja használni, ami a csuporba tett tárgyak nevét és jellemzőit kiírja a paraméterként kapott std::ostream típusú objektumra. Ha a csupor összetörik, akkor a benne levő tárgyak is megsemmisülnek. Egy csuporba maximum 20 tárgy fér. A modellben megvalósítandó műveleteket az alábbi kódrészlettel mutatjuk be: Jar *j1 = New Jar; // Ez lesz a csupor j1->add(new Map("Északi-sark"));// Térkép létrehozása és berakása j1->add(new Pencil(3)); // Ceruza létrehozása és berakása j1->show(std::cout); // Csupor tartalmának megmutatása delete j1; // Csupor és tartalmának megsemmisítése Feltételezheti, hogy a Jar osztályból példányosított objektumot nem akarjuk paraméterként átadni és értékadás jobb, ill. bal oldalán sem szerepel. Tervezzen meg és rajzoljon fel egy olyan osztályhierarchiát, ami alkalmas a feladat megvalósítására és könnyen bővíthető újabb tárgyakkal! Az osztálydiagramban jelölje az adattagok és metódusok láthatóságát is, valamint a virtuális függvényeket is! A string osztályt nem kell lerajzolni, arra típusként hivatkozzon! Ügyeljen a helyes jelölésekre! Deklarálja C++ nyelven a Jar, Object, és Map osztályokat! Csak a Jar osztály konstruktorát, destruktorát, valamint az add(), és show() metódusát valósítsa meg! class Object { virtual void show(std::ostream&) = 0; virtual ~Object(); ; class Map :public Object { std::string name; Map(std::string); void show(std::ostream&); ; class Jar { Object* objs[20]; int numobjs; Jar() :numobjs(0) { void add(object* obj) { objs[numobjs++] = obj; void show(std::osteram& os) { for (int i = 0; i < numobjs; i++) objs[i]->show(os); ~Jar(){ for (int i = 0; i < numobjs; i++) delete objs[i]; ; Amennyiben nem ősosztály pointert tárolt, úgy maximum 4 pontot kaphatott a feladatra. Ha a tárolóból származtatta a tároltakat, azt 0 ponttal jutalmaztuk.