-
Barta Máté Zsombor authoredBarta Máté Zsombor authored
string5.h 8.90 KiB
#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; }
std::istream& getline(std::istream& is, String& str);
#endif