Informatika3-2024/Gyakorlat6
(Új oldal, tartalma: „== Feladatok == Minden feladathoz nyiss új projektet IDE-ben vagy írd új file-ba ha parancssorból dolgozol! '''Mostantól .cpp kiterjesztésû file-okban dolgozzu…”) |
|||
99. sor: | 99. sor: | ||
</c> | </c> | ||
− | ==== String | + | ==== String konkatenálás ==== |
− | + | Írjuk meg a korábbi gyakon már említett, de közösen meg nem oldott C string konkatenáló függvényt. Most oldjuk ezt meg oszályon kívül, csak a függvényt. | |
+ | |||
+ | Tehát a cél, hogy ha a függvényünk kap két string-et, akkor adjon vissza egy új stringet aminek az eleje az első teljes string, a vége a második teljes string. | ||
+ | |||
+ | Pl: | ||
<c> | <c> | ||
− | + | char s1[] = "kis"; | |
− | + | char s2[] = "kutya"; | |
+ | char s3 = concat(s1, s2); | ||
+ | cout << s3 << endl; // kiskutya-t kellene kiirnia | ||
</c> | </c> | ||
− | + | Próbáljuk lépésről lépésre megközelíteni a problémát! | |
+ | * Megfelelő méretű char tömböt kell lefoglalnunk, ehhez kell tudni a 2 kapott string méretét. Írjunk meg egy string hossz-t számoló függvényt! | ||
+ | * Használva a 2 string hosszát hozzuk létre dinamikusan az új string-et. Dinamikusan kell (new-val), mert különben törlődik, ha vége a függvénynek. | ||
+ | * Egy for ciklussal másoljuk az első stringet az elejére. | ||
+ | * Majd egy másik for ciklussal másoljuk a másodikat ezután, vigyázzunk az indexelésre, itt ugye elcsúszik az új string és a második string indexelése. | ||
+ | * Ne felejtsük el a végére a lezáró nullát. | ||
+ | |||
+ | ==== String oszály ==== | ||
+ | |||
+ | Írjunk meg most String osztályt, amit lehet konstruálni C stringből és az operator+ metódusa a fenti konkatenálást végzi el két string-en. | ||
==== Dictionary ==== | ==== Dictionary ==== | ||
− | + | Írjunk osztályt Dictionary néven, ami python szótárat imitál. A kulcsok string-ek legyenek. Az értékek egészek. | |
− | + | Ez hasznos lehet, egy példa dinamikusan létrehozott két dimenziós char tömbre: | |
<c> | <c> | ||
char** keys = new char*[100]; | char** keys = new char*[100]; | ||
121. sor: | 136. sor: | ||
</c> | </c> | ||
− | + | Az nem gond, ha a kulcsok hosszának van felső határa, de próbáljuk úgy megoldani, hogy akárhány elemet behelyezhessünk a szótárba. | |
− | + | Példa a operator[]-ra: | |
<c> | <c> | ||
int& operator[](int index); | int& operator[](int index); | ||
</c> | </c> | ||
− | + | A mi esetünkben a paraméter char* lenne (C string). | |
− | + | Fontos, hogy referenciát adunk vissza az operator[]-ban, így lehet balértékként is használni a metódus visszatérési értékét. Például: | |
<c> | <c> | ||
dict["batman"] = 1; | dict["batman"] = 1; | ||
</c> | </c> | ||
− | + | Ezek legyenek meg: | |
− | * Default constructor: | + | * Default constructor: üres szótár |
− | * operator[]: | + | * operator[]: lehessen új elemeket hozzáadni ezzel (azaz működjön jobb és bal értékként is). Ha meghívjuk egy kulccsal amihez nem tartozik még érték, akkor hozza létre ezt a kulcs/érték párt. |
− | * | + | * Lehessen cout-olni. Amikor kiírjuk akkor látszódjon a teljes tartalma (minden pár). A formázás nem lényeges. |
− | * remove(char*): | + | * remove(char*): törölje az adott kulcshoz tartozó kulcs/érték párt. |
* Destructor | * Destructor | ||
− | + | Megoldhatjátok dinamikusan növekvő tömbbel is, de sokkal szebb megoldás a korábban megoldott láncolt listát módosítani, hogy párokat tároljon és azt használni. |
A lap 2024. április 18., 14:11-kori változata
Tartalomjegyzék |
Feladatok
Minden feladathoz nyiss új projektet IDE-ben vagy írd új file-ba ha parancssorból dolgozol!
Mostantól .cpp kiterjesztésû file-okban dolgozzunk!
Complex osztály operátorokkal
Módosítsuk az elõadás "Complex" osztályát, hogy operator+, operator* is mûködjön, valamint tudjunk cout-al kiírni komplexeket.
Emlékeztetõül:
Complex operator+(Complex other); friend ostream& operator<<(ostream& os, Complex& c);
#include<iostream> #include<cmath> using namespace std; class Complex { private: float re; float im; public: Complex(); Complex(const Complex& other); Complex(float r); Complex(float r, float i); Complex add(Complex other); Complex times(Complex other); float abs(); void print(); ~Complex(); }; Complex::Complex() { re = 0; im = 0; } Complex::Complex(const Complex& other) { re = other.re; im = other.im; } Complex::Complex(float r) { re = r; im = 0; } Complex::Complex(float r, float i) { re = r; im = i; } Complex Complex::add(Complex other) { return Complex(this->re + other.re, this->im + other.im); } Complex Complex::times(Complex other) { float real = this->re * other.re - this->im * other.im; float imag = this->re * other.im + this->im * other.re; return Complex(real, imag); } float Complex::abs() { return sqrt(this->re * this->re + this->im * this->im); } void Complex::print() { cout << re << " + " << im << "i" << endl; } Complex::~Complex() { } int main(void) { Complex a; Complex b = Complex(1,2); Complex c = a.times(b); a.print(); b.print(); c.print(); (b.add(c)).print(); cout << b.abs() << endl; return 0; }
String konkatenálás
Írjuk meg a korábbi gyakon már említett, de közösen meg nem oldott C string konkatenáló függvényt. Most oldjuk ezt meg oszályon kívül, csak a függvényt.
Tehát a cél, hogy ha a függvényünk kap két string-et, akkor adjon vissza egy új stringet aminek az eleje az első teljes string, a vége a második teljes string.
Pl:
char s1[] = "kis"; char s2[] = "kutya"; char s3 = concat(s1, s2); cout << s3 << endl; // kiskutya-t kellene kiirnia
Próbáljuk lépésről lépésre megközelíteni a problémát!
- Megfelelő méretű char tömböt kell lefoglalnunk, ehhez kell tudni a 2 kapott string méretét. Írjunk meg egy string hossz-t számoló függvényt!
- Használva a 2 string hosszát hozzuk létre dinamikusan az új string-et. Dinamikusan kell (new-val), mert különben törlődik, ha vége a függvénynek.
- Egy for ciklussal másoljuk az első stringet az elejére.
- Majd egy másik for ciklussal másoljuk a másodikat ezután, vigyázzunk az indexelésre, itt ugye elcsúszik az új string és a második string indexelése.
- Ne felejtsük el a végére a lezáró nullát.
String oszály
Írjunk meg most String osztályt, amit lehet konstruálni C stringből és az operator+ metódusa a fenti konkatenálást végzi el két string-en.
Dictionary
Írjunk osztályt Dictionary néven, ami python szótárat imitál. A kulcsok string-ek legyenek. Az értékek egészek.
Ez hasznos lehet, egy példa dinamikusan létrehozott két dimenziós char tömbre:
char** keys = new char*[100]; for(int i = 0; i < 100; i++) { keys[i] = new char[20]; }
Az nem gond, ha a kulcsok hosszának van felső határa, de próbáljuk úgy megoldani, hogy akárhány elemet behelyezhessünk a szótárba.
Példa a operator[]-ra:
int& operator[](int index);
A mi esetünkben a paraméter char* lenne (C string).
Fontos, hogy referenciát adunk vissza az operator[]-ban, így lehet balértékként is használni a metódus visszatérési értékét. Például:
dict["batman"] = 1;
Ezek legyenek meg:
- Default constructor: üres szótár
- operator[]: lehessen új elemeket hozzáadni ezzel (azaz működjön jobb és bal értékként is). Ha meghívjuk egy kulccsal amihez nem tartozik még érték, akkor hozza létre ezt a kulcs/érték párt.
- Lehessen cout-olni. Amikor kiírjuk akkor látszódjon a teljes tartalma (minden pár). A formázás nem lényeges.
- remove(char*): törölje az adott kulcshoz tartozó kulcs/érték párt.
- Destructor
Megoldhatjátok dinamikusan növekvő tömbbel is, de sokkal szebb megoldás a korábban megoldott láncolt listát módosítani, hogy párokat tároljon és azt használni.