Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#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