#ifndef STRING_H #define STRING_H /** * \file string2_kesz.h * * Ez a fĂĄjl tartalmazza a * - String osztĂĄly deklarĂĄciĂłjĂĄt * - az inline fĂźggvĂŠnyeket. Ha valamit inline-kÁŠnt akar megvalĂłsĂtani, * akkor azt ebbe a fĂĄjlba Ărja! Tipikusan a rĂśvid kĂłdokat szokĂĄs * inline-kĂŠt megvalĂłsĂtani (pl: c_str). * MĂĄs fĂźggvĂŠnyeket ill. definĂciĂłkat ne Ărjon a .h fĂĄjlba! * * A C-ben megĂrt (string1.c) fĂźggvĂŠnyek most tagfĂźggvĂŠnyekkĂŠ vĂĄltak, ĂŠs * eltĹąnt az elsĹ paramĂŠterĂźk (s0) (ebbĹl lett a this). * A nevĂźk is megvĂĄltozott, mert most mĂĄr az ĂśsszetartozĂĄst, ĂŠs a * paramĂŠterek tĂpusĂĄra valĂł utalĂĄst mĂĄr nem a nĂŠv hordozza, hanem az osztĂĄly. * A createString... alakĂş fĂźggvĂŠnyekbĹl konstruktorok keletkeztek. * A disposeString destruktorrĂĄ alakĂźlt ĂĄt. * Egyes mĹąveletvĂŠgzĹ fĂźggvĂŠnyekbĹl pedig operĂĄtor fĂźggvĂŠny lett. */ /** * Az Ăn feladata a string2.cpp fĂĄjlban megvalĂłsĂtani (definiĂĄlni) az egyes * fĂźggvĂŠnyeket. * * Ahogyan halad a megvalĂłsĂtĂĄssal egyre tĂśbb tesztesetet kell lefuttatni, * ezĂŠrt az ELKESZULT makrĂł ĂŠrtĂŠket folyamatosan nĂśvelje a feladatsorszĂĄmoknak * megfelelĹen! * * TanulsĂĄgos a megvalĂłsĂtĂĄs elĹtt mĂĄr a megnĂśvelt ĂŠrtĂŠkkel is lefordĂtani * a programot, ĂŠs elemezni a kapott hibajelzĂŠst. * */ #define ELKESZULT 13 /** * \section fel Feladat: * A tantermi gyakorlatokon, valamint a 3. laborgyakorlaton is foglalkoztunk egy * olyan sztring (String) adatszerkezet ĂŠs a rajta mĹąveleteket vĂŠgzĹ fĂźggvĂŠnyek * megtervezĂŠsĂŠvel/impelmentĂĄlĂĄsĂĄval ami dinamikusan tĂĄrol ĂŠs annyi memĂłriĂĄt foglal * amennyi a tĂĄrolĂĄshoz szĂźksĂŠges. * * Ezeket ĂŠs a tanultakat felhasznĂĄlva a string2.h ĂŠs a string2.cpp ĂĄllomĂĄnyokban * definiĂĄljon ill. implementĂĄljon egy olyan sztring (String) osztĂĄlyt C++ nyelven, ami * dinamikusan tĂĄrol ĂŠs rendelkezik az alĂĄbbi tulajosnĂĄgokkal! * * 1 A paramĂŠter nĂŠlkĂźl hĂvhatĂł konstruktora Ăźres sztringet hozzon ĂŠtre! * 2. Van olyan tagfĂźggvĂŠnye ( c_str() ), ami C-sztringgel, azaz nullĂĄval lezĂĄrt * karaktersorozatra mutatĂł pointerel (const char *) tĂŠr vissza. * 3. Van olyan konstruktora, ami karakterbĹl hoz lĂŠtre sztringet. * 4. Van olyan konstruktora, ami C-sztringbĹl (const char*) hoz lĂŠtre sztringet. * 5. Az osztĂĄlybĂłl lĂŠtrehozott objektum legyen ĂĄtadhatĂł ĂŠrtĂŠkkparamĂŠterkĂŠnt! * 6. TĂĄmogassa a tĂśbbszĂśrĂśs ĂŠrtĂŠkadĂĄst (b = a = a)! * 7 Legyenek olyan operĂĄrorai (operator+), amivel a sztring vĂŠgĂŠhez sztringet, * ĂŠs karaktert lehet fĹązni! * 8. Lehessen karakterhez is sztringet fĹązni a + operĂĄtorral! * 9. A tĂĄrolt a karakterek legyenek elĂŠrhetĹek a szokĂĄsos mĂłdon indexelĂŠssel! * Az indexelĂŠssel elĂŠr elem legyen hasznĂĄlhatĂł balĂŠrtĂŠkkĂŠnt is! * A konstans objektumok is legyenek indexelhetĹk. * Az indexelĂŠs operĂĄtor hiba esetĂŠn dobjon const char * kivĂŠtelt! * 10. KĂŠszĂtsen olyan << operĂĄtort, amivel egy sztring kiĂrhatĂł egy ostream tĂpusĂş * objektumra! * * Szorgalmi feladatok: * 11. KĂŠszĂtsen olyan fĹązhetĹ >> operĂĄtort, amivel be tud olvasni egy szĂłt egy sztring-be! * A beolvasĂł mĹąkĂśdjĂśn Ăşgy, mint a scanf %s, azaz a szĂł vĂŠgĂŠt white space hatĂĄrolja! * A szĂł eleji white space karaktereket pedig el kell dobni. * *Megj: az istream wshite space kezelĂŠse a flags() tagfĂźggvĂŠnnyel szabĂĄlyozhatĂł * 12. PrĂłbĂĄlja ki az ĂŠkezetes karakterek rendezĂŠsĂŠt is! Ehhez elkĂŠszĂtettĂźnk egy * egyszerĹą kĂłdrĂŠszletet ami qsort() fĂźggvĂŠnyt hasznĂĄl. * Ărtse meg a rendez.cpp fĂĄjlban levĹ kĂłd mĹąkĂśdĂŠsĂŠt ĂŠs futtassa a programot! * 13. A setlocale fĂźggvĂŠnyhĂvĂĄs beĂĄllĂtja a karakterek ĂŠs sztringek ĂśsszehasonlĂtĂĄsĂĄhoz * szĂźksĂŠges nyelvi kĂśrnyezetet (LC_COLLATE) prĂłbĂĄlja ki! VĂĄltozott a rendezĂŠsi * sorrend? */ #include <iostream> /** * Header fĂĄjlokbĂłl megfontoltan kell include-ot hasznĂĄlni. * NĂŠvteret azonban nem cĂŠlszerĹą kinyitni, mert annak hatĂĄsa zavarĂł lehet * ott ahol ez a header include-olva lesz. */ #ifndef MEMTRACE #include "memtrace.h" #endif // MEMTRACE /** * A String osztĂĄly. * A 'pData'-ban vannak a karakterek (a lezĂĄrĂł nullĂĄval egyĂźtt), 'len' a hossza. * A hosszba nem szĂĄmĂt bele a lezĂĄrĂł nulla. */ class String { char *pData; /// pointer az adatra size_t len; /// hossz lezĂĄrĂł nulla nĂŠlkĂźl public: size_t size() const { return len; } size_t getlen(){ return len; } /// Default konstruktor: String() :pData(0), len(0) {} /// C-stringet ad vissza const char* c_str() const { if (pData) return pData; else return "";} /// Konstruktor: egy char karakterbĹl (createStrFromChar) String(char ch); /// Konstruktor: egy nullĂĄval lezĂĄrt char sorozatbĂłl (createStringFromCharStr) String(const char *p); /// MĂSOLĂ konstruktor, ami a createStringFromString-bĹl keletkezett /// @param s1 - String, amibĹl lĂŠtrehozzuk az Ăşj String-et String(const String& s1); /// Destruktor (disposeString) ~String() { delete[] pData; } /// EgyĂŠb tagfĂźggvĂŠnyek: /// KiĂrunk egy Stringet (debug cĂŠlokra) (ez kĂŠsz) /// ElĂśtte kiĂrunk egy tetszĹleges szĂśveget. /// @param txt - nullĂĄval lezĂĄrt szĂśvegre mutatĂł pointer void printDbg(const char *txt = "") const { std::cout << txt << "[" << len << "], " << (pData ? pData : "(NULL)") << std::endl; } /// OperĂĄtorok: /// ĂrtĂŠkadĂł operĂĄtor is kell ! /// @param rhs_s - jobboldali String /// @return baoldali (mĂłdosĂtott) string (referenciĂĄja) String& operator=(const String& rhs_s); bool operator==(const String& tbc); bool operator!=(const String& tbc); String& operator+=(const String& rhs_s) { *this = *this + rhs_s; return *this; } String& operator+=(char c); /// KĂŠt Stringet ĂśsszefĹąz (concatString) /// @param rhs_s - jobboldali String /// @return Ăşj String, ami tartalmazza a kĂŠt stringet egmĂĄs utĂĄn String operator+(const String& rhs_s) const ; /// Sztrinhez karaktert ĂśsszefĹąz (concatString) /// @param rhs_c - jobboldali karakter /// @return Ăşj String, ami tartalmazza a kĂŠt sztringet egymĂĄs utĂĄn String operator+(char rhs_c) const { return *this + String(rhs_c);} /// A string egy megadott indexĹą elemĂŠnek REFERENCIĂJĂVAL tĂŠr vissza. /// charAtString-bĹl keletkezett, de ezt bal oldalon is lehet hasznĂĄlni /// @param idx - charakter indexe /// @return karakter (referencia) /// IndexelĂŠsi hiba esetĂŠn const char* kivĂŠtelt dob (assert helyett). char& operator[](unsigned int idx); /// A string egy megadott indexĹą elemĂŠnek REFERENCIĂJĂVAL tĂŠr vissza. /// charAtString-bĹl keletkezett. Konstans stringre alkalmazhatĂł. /// IndexelĂŠsi hiba esetĂŠn const char* kivĂŠtelt dob (assert helyett). /// @param idx - karakter indexe /// @return karakter (referencia) /// IndexelĂŠsi hiba esetĂŠn const char* kivĂŠtelt dob (assert helyett). const char& operator[](unsigned int idx) const; void erase() { *this = ""; } }; /// GlobĂĄlis fĂźggvĂŠnyek: /// kiĂr az ostream-re (printString) /// Nem cĂŠlszerĹą using-ot hasznĂĄlni, mert ez egy include file. Ăgy ki kell Ărni az std::-t /// @param os - ostream tĂpusĂş objektum /// @param s0 - String, amit kiĂrunk /// @return os /// VigyĂĄzat nem tagfĂźggvĂŠny! Nem is tĹąnik el az s0 ! /// Nem kell, hogy barĂĄt legyen, mert a c_str() segĂt std::ostream& operator<<(std::ostream& os, const String& s0); /// Beolvas az istream-rĹl egy szĂłt egy string-be. /// @param is - istream tĂpusĂş objektum /// @param s0 - String, amibe beolvas /// @return is /// VigyĂĄzat nem tagfĂźggvĂŠny! Nem is tĹąnik el az s0 ! /// Nem kell, hogy barĂĄt legyen mert van Str + ch std::istream& operator>>(std::istream& is, String& s0); /// String operator+(char ch, const String& str); /// Vagy inline, vagy nem itt a helye! /// Nem kell, hogy barĂĄt legyen mert tudunk chr-bĹl str-be konvertĂĄlni /// kĂŠt str pedig ĂśsszeadhatĂł inline String operator+(char ch, const String& str) { return String(ch) + str; } #endif