43
Programozás C++ típusok, operátorok Fodor Attila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék [email protected] 2010. március 4.

Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Embed Size (px)

Citation preview

Page 1: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

ProgramozásC++ típusok, operátorok

Fodor Attila

Pannon EgyetemMűszaki Informatikai Kar

Villamosmérnöki és Információs Rendszerek Tanszék

[email protected]

2010. március 4.

Page 2: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok C++ nyelvben használható típusok, változók, aritmetika

Deklaráció és definíció

DeklarációMinden névről meg kell mondani mire szeretnénk használni, mert enneka hiányában a fordító nem tud mit kezdeni az adott névvelA tulajdonságai a következők: típus, tárolási osztály, láthatóságNem történik memória foglalás

DefinícióHa az a cél, hogy a deklarációnak megfelelő objektum is létrejöjjön amemóriában akkor DEFINÍCIÓT kell alkalmazni.A DEFINÍCIÓ olyan DEKLARÁCIÓ, amely helyfoglalással jár.

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 2 / 43

Page 3: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok C++ nyelvben használható típusok, változók, aritmetika

A C++ nyelv típusai

Skalár (egyszerű típus)Aritmetikai típusok

Egész jellegű típusokcharintenumLebegőpontos típusokfloatdouble

Mutató típusokReferencia típusvoid

Összetett típusÖsszeállított típusok

Tömb típusokStructúra (struct) típusok

Unió (union) típusok

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 3 / 43

Page 4: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok C++ nyelvben használható típusok, változók, aritmetika

Alaptípusok, Típusmódosítók, Típusminősítők, Típuselőírás

Alaptípusokcharintfloatdoubleenumstructunionvoid (típusnév hiánya; üres típus)

Típusmódosítókshort (a tárolási hosszat szabályozza)long (a tárolási hosszat szabályozza)signed (előjeles)unsigned (előjel nélküli)

Típusminősítők: const (olyan objektum definiálható, amely nemváltozatható meg (olvasható objektum))Típuselőírás: (alaptípus, típusmódosítók, típusminősítők)

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 4 / 43

Page 5: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok C++ nyelvben használható típusok, változók, aritmetika

Változók mérete (sizeof operátor)

sizeof kifejezéssizeof(típus)sizeof(char) ⇒ 1 byte (8 bit)sizeof(short) ≥ 2 byte (16 bit)sizeof(long) ≥ 4 byte (32 bit)sizeof(short) ≤ sizeof(int)sizeof(int) ≤ sizeof(long)Az int mindig az adott arcitektúrán a gépi szó mérete

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 5 / 43

Page 6: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok C++ nyelvben használható típusok, változók, aritmetika

Az MS Visual Studio-ban használható típusok

(Nem csak ANSI C++ típusok)

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 6 / 43

Page 7: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok C++ nyelvben használható típusok, változók, aritmetika

Változók és aritmetika

Aritmetikai műveletek: char, int, float, double, enum+ // összeadás vagy előjel, egy- és kétoperandusú is lehet- // kivonás vagy előjel, egy- és kétoperandusú is lehet* // szorzás/ // osztás% // maradékképzés

Összehasonlító műveletek: char, int, float, double, enum== // egyenlő!= // nem egyenlő< // kisebb> // nagyobb<= // kisebb vagy egyenlő>= // nagyobb vagy egyenlő

Bitenkénti operátorokLogikai operátorokLéptető operátorok

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 7 / 43

Page 8: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Referencia típus

Referencia (hívatkozás) típus

Egy objektum "álneve" (alias)Függvények (és túlterhelt operátorok) paramétereinek és visszatérésiértékeinek megadására használható hatékonyanA jelölés jelentése: "Hivatkozás A-ra"Példa:

int i = 100;int& ref = i; // r és i itt ugyanarra az int-re hivatkoznakint x = ref; // x = 100ref = 200; // i = 200

A referencia célpontját létrehozáskor meg kell határozni!!!Példa:

int& ref = i; // OKint& ref2; // Hibás referencia megadás

// nincsen kezdeti érték megadvaextern int& ref3; // OK (Később kap értéket)

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 8 / 43

Page 9: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Referencia típus

Referencia (hívatkozás) típus

A referencián nem hajtódik végre utasítás (nem változik az értéke)Az utasítás mindig azon hajtódik végre, amire mutat a referenciaPélda:

int i = 0;int& ref = i;ref++; // i növeléseint* p = &ref; // p az i-re mutat

void cplusplus(int& c) { c++; }

Egyes fordítók fizikailag referenciával valósítják meg a referencia típust

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 9 / 43

Page 10: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Felhasználói típus

Felhasználói típus

Absztrakt típus (abstract data type, ADT)Felhasználói típus (user-defined type)A beépített típusokkal közel azonos viselkedésMegközelítés:"Döntsd el, mely típusokra van szükségés mindegyikhez biztosíts teljes műveletkészletet."StroustrupAbsztrakt típus (abstract data type, ADT)

A felület elszigeteli a felhasználót a megvalósítás részleteitőlKonkrét típus

A felület nem teljesen szigeteli el a felhasználót a megvalósításrészleteitől

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 10 / 43

Page 11: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Felhasználói típus

Felhasználói típus - példa

Példa:Complex számok kezelése

class CComplex{private:

double Im, Re;public:

CComplex(double x, double y, bool IsImRe=1);CComplex() {Im=0; Re=0;};double GetIm() const {return Im;};double GetRe() const {return Re;};double GetR() const {return sqrt(Re*Re+Im*Im);}double GetPhi();double SetIm(double x) {Im = x;};double SetRe(double x) {Re = x;};

};

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 11 / 43

Page 12: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Felhasználói típus

Felhasználói típus - operátor

Probléma:Milyen műveletek értelmezettek a típusonÖsszeadás, kivonás, összehasonlítás, stb.

I. megoldásOsztályfüggvények alkalmazásaMinen művelethez meg kell írniMeg kell hívni egyesével a függvényeket az osztálypéldányon

I. megoldásOperátorok alklamazása (+ - * / == != stb.)Operátorokat el kell készíteni

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 12 / 43

Page 13: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Felhasználói típus

Felhasználói típus operátora - példa

Példa:Complex számok kezelése

class CComplex{private:

double Im, Re;public:

CComplex(double x, double y, bool IsImRe=1);CComplex() {Im=0; Re=0;};double GetIm() const {return Im;};double GetRe() const {return Re;};double GetR() const {return sqrt(Re*Re+Im*Im);}double GetPhi();double SetIm(double x) {Im = x;};double SetRe(double x) {Re = x;};

friend CComplex operator+(CComplex a1, CComplex a2);friend CComplex operator-(CComplex a1, CComplex a2);friend CComplex operator/(CComplex a1, CComplex a2);friend CComplex operator*(CComplex a1, CComplex a2);friend bool operator==(CComplex a1, CComplex a2);friend bool operator!=(CComplex a1, CComplex a2);

};

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 13 / 43

Page 14: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Felhasználói típus

Felhasználói típus operátora - példa

Példa:Complex számok kezelése

CComplex operator+(CComplex a1, CComplex a2){

return CComplex(a1.Re+a2.Re, a1.Im+a2.Im);}

CComplex operator-(CComplex a1, CComplex a2){

return CComplex(a1.Re-a2.Re, a1.Im-a2.Im);}

bool operator==(CComplex a1, CComplex a2){

return ((a1.Re==a2.Re)&&(a1.Im==a2.Im))?true:false;}

bool operator!=(CComplex a1, CComplex a2){

return ((a1.Re==a2.Re)&&(a1.Im==a2.Im))?false:true;}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 14 / 43

Page 15: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Felhasználói típus

Felhasználói típus operátora - példa

Példa:Complex számok kezelése

ComplexExample(){CComplex c1(1,0);

CComplex c2(1,1);

CComplex c3 = c1 + c2*CComplex(1, 2);// ...if (c1 != c2)

c3 = (c1/c2) + c2;else

c3 = (c1/c2);}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 15 / 43

Page 16: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Mutatók, Tömbök

Mutatók

Minden változó memóriában levő helye (címe) képezhetőMinden függvény memóriában levő helye (címe) képezhetőEz a cím mutató típusban (pointerben) tárolhatóA pointer típus értékkészlete egy memória címA pointer mindig egy meghatározott típusú objektumra mutat

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 16 / 43

Page 17: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Mutatók, Tömbök

Mutatók használata

Mutató típus definiálása: pointer_tipusa *pointer_neveVáltozó címének meghatározása: &valtozo_neveMutató által mutatott változó értéke: *pointer_neve

int i, *ip, v[10];

i = 123;ip = &i;*ip = 123;ip = &v[2];

double d, *dpdouble* dp2;void *p;

int **ipp;int* *ipp2;

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 17 / 43

Page 18: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Mutatók, Tömbök

Tömb alkalmazása

Tömb méreteA fordítóprogram határozza meg az elemtípusok méretének afüggvényébenA méret mindig fordítási időben döl el!Méret meghatározása: sizeof(tömb_neve)/sizeof(elem_típusa);int v[50];int n=sizeof(v)/sizeof(int);

Tömb bejárásaÁltalában for ciklussal történikint i;register int i; //Nagy elemszám eseténfor(i=0; i<n; v[i++]=0);

Kezdeti érték adása tömböknektipus tömb_neve[] = érték1, érték2...;A tömb méretét a fordító határozza meg a felsorolt konstansok alapjánPélda:int adatok[] = 1, 2, 3, 4, 5;char szoveg[] = "alma";char szoveg2[] = 65, 76, 77, 65, 0 ;

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 18 / 43

Page 19: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Mutatók, Tömbök

Többdimenziós tömbök

Megadása: típus tömb_neve[méret_dim1][méret_dim2]típus tömb_neve[méret_dim1][méret_dim2][méret_dim3]típus tömb_neve[méret_dim1][méret_dim2]...[méret_dim_n]

int i,j;int tomb2d[100][50]

for(i=0; i<100; i++)for(j=0; j<50; j++)

tomb2d[i][j]=0;

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 19 / 43

Page 20: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Template osztály

Sablon/Tamplate osztály

Ötlet:Az osztály általánosítása → sablon létrehozása

template<class T> előtag T-t az utána következő deklarációparaméterévé teszi.Példa:Verem kezelése

template<class T> class CStack{

T* v;int max_size;int top;

public:class Underflow { }; // hibakezelésclass Overflow { }; // hibakezelésCStack(int s); // konstruktor~CStack(); // destruktorvoid Push(T);T Pop();

};

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 20 / 43

Page 21: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Template osztály

Sablon/Template osztály

Példa:Verem kezelése (Függvények megadása)

template<class T> void CStack<T>::Push(T c){

if (top == max_size) throw Overflow();v[top] = c;top = top + 1;

}

template<class T> T CStack<T>::Pop(){

if (top == 0) throw Underflow();top = top - 1;return v[top];

}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 21 / 43

Page 22: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Template osztály

Sablon/Template osztály

Példa:Verem kezelése (Függvények megadása)

CStack<int> st_int(100); // verem 100 int-nekCStack<CComplex> st_cmplx(50); // verem 50 komplex számnakCStack< list<int> > st_list(50); // verem 50, int-ből álló lista számára

void StackExample(){

st_int.push(100);if (st_int.pop() != 100){

//... //Hiba a veremkezelésben}

st_cmplx.push(Ccomplex(0,0));if (st_cmplx.pop() != CComplex(0,0)){

//... //Hiba a veremkezelésben}

}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 22 / 43

Page 23: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

C++ típusok Template osztály

Sablon/Template osztály használata

Adatszerkezetek kezeléseListaVektorTömbök (map)stb.

Fordítási időben van jelentőségeNem növeli meg futási időt a "hagyományos kódoláshoz" képestContainer Class (tároló, konténer)

Osztály elnevezésValamilyen típusú elemek gyűjteményét tartalmazza

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 23 / 43

Page 24: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

iostream

Adatfolyam-bemeneti és -kimeneti szolgáltatásokKimenetek és bemenetek kezelése

A << kimeneti operátor második operandusát beírja az elsőbeA >> bemeneti operátor első operandusát beírja a másodikba

Karakterláncok (string) kezeléseListák, vektorok kezelése...Példa:

#include <iostream>#include<string>#include<list>

CComplex c(1,0), c2(1,1);std::cout << "Im: " << c.GetIm() << " Re: " << c.GetRe() << " \n\n";

std::string str = "Szoveg...";

int i;std::in >> i;

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 24 / 43

Page 25: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Kimenet

iostream könyvtár meghatároz egy kimenetetA << kimeneti operátor második operandusát beírja az elsőbePélda:

#include <iostream>#include<string>#include<list>//...CComplex c(1,0), c2(1,1);

printf("Im: %lf \nRe : %lf \n\n", c.GetIm(), c.GetRe());

std::cout << "Im: ";std::cout << c.GetIm();std::cout << " Re: ";std::cout << c.GetRe();std::cout << "\n\n";

std::cout << "Im: " << c.GetIm() << " Re: " << c.GetRe() << " \n\n";std::string str = "Szoveg...";

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 25 / 43

Page 26: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Névtér

Standard könyvtár az std névtérhez tartozikstd::cout helyett, ha cout nem működik

#include <iostream>#include<string>

//...CComplex c(1,0), c2(1,1);

cout << "Im: ";cout << c.GetIm();cout << " Re: ";cout << c.GetRe();cout << "\n\n";

string str = "Szoveg...";

Hiba:complex.cpp(130) : error C2065: ’cout’ : undeclared identifier

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 26 / 43

Page 27: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Névtér beállítása

Névtér beállításausing namespace nevter_neve;

#include <iostream>#include<string>

//...CComplex c(1,0), c2(1,1);

std::cout << "Im: "; //Itt nem hagyható el az std::std::cout << c.GetIm();std::cout << " Re: ";std::cout << c.GetRe();std::cout << "\n\n";

using namespace std;cout << "Im: " << c.GetIm() << " Re: " << c.GetRe() << " \n\n";string str = "Szoveg...";

Hiba: (a névtér beállítása előtt hanyagoljuk el a beállítást)complex.cpp(130) : error C2065: ’cout’ : undeclared identifier

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 27 / 43

Page 28: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Bemenet

istreams szolgál bemenetek kezeléséreA >> bemeneti operátor első operandusát beírja a másodikbaPélda:

#include <iostream>\\...

using namespace std;\\...

int i;cin >> i;double d;cin >> d;

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 28 / 43

Page 29: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Bemenet

Egész sor beolvasásagetline() függvény segítségévelPélda:

#include <iostream>#include <string>\\...

using namespace std;\\...

string str;

cout << "Írja be a nevét!\n";getline(cin,str);cout << "Helló, " << str << "!\n";

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 29 / 43

Page 30: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Karakterlánc (string)

Karaktersorozatok eltárolására használható típusKaraktrlánc-műveletekOperátorok használata (pl.: + - == !=)

#include <iostream>#include<string>

//...using namespace std;

string str1 = "Programozás ";string str2 = "Előadás ";string TantargyNev = str1+str2;

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 30 / 43

Page 31: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Karakterlánc (string)

Kimenetre, bemenetre átirányítható:string str1 = "Helyes?";string str2;

cout << str1;cin >> str2;

Összehasonlításstring str2;

cout << "Helyes? (igen/nem);cin >> str2;if (str2 == "igen"){

...}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 31 / 43

Page 32: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Karakterlánc (string)

Paraméterként átadható#include <iostream>\\...

using namespace std;\\...

void AddNewLine(string& str1, string& str2){

str1 = str1 + ’\n’;str2 += ’\n’;

}

\\ ...

string str1="123";string str2="1234";AddNewLine(str1, str2);cout << str1 << " " << str2 << " ";

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 32 / 43

Page 33: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

Stringeken értelmezhető műveletek/fogalmak

BejárókAz elemek (karakterek) eléréseKonstruktorHibák kezelése, detektálásaÉrtékadásÁtalakítás C stílusú karakterláncraÖsszehasonlításBeszúrásÖsszefűzésKeresésCsereRészláncokMéret és kapacitás (memóriakezeléssel kapcsolatos)Ki- és bemeneti műveletekFelcserélés

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 33 / 43

Page 34: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Standard könyvtárak iostream

C stílusú string

string típus átalakíthatóKompatibilítás miatt szükséges/hasznosc_str() tagfüggvény végzi az átalakítást

#include <iostream>#include <string>\\...

using namespace std;\\...

void 2_C_String(string& str1){

printf("Szoveg: %s\n",str1.c_str());}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 34 / 43

Page 35: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Tárolók

Szabványos tárolók

Szabványos tárolókvector<T> Változó hosszúságú vektorlist<T> Kétirányú láncolt listaQueue<T> SorStack<T> VeremDeque<T> Kétvégű sorPriority_queue<T> Érték szerint rendezett sorset<T> HalmazMultiset<T> Halmaz, melyben egy érték többször is előfordulhatMap<kulcs,érték> Asszociatív tömbMultimap<kulcs,érték> Asszociatív tömb, melyben egy kulcstöbbször előfordulhat

std névtérhez tartoznakHeader állományokat be kell rakni!<vector>, <list>, <map>, stb.

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 35 / 43

Page 36: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Vektor

Vektor

Probléma:C nyelvben rögzített méretC nyelvben fordítási időben meg kell adni a méretetNem hatékony a memóriakezelés

Példa:struct VarStar{public:

string Name; //C++double JD;double Magnitude;

};

VarStar Observe[1000];

Observe[2].JD = 2455259.5;Observe[2].Name = "R CRB";Observe[2].Magnitude = "6.2";

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 36 / 43

Page 37: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Vektor

Vektor

Megoldás, hiányosságok pótlása:Futási időben megadható méretFutási időben változtatható méretHibás indexelés detektálása

Példa:#include <string>#include <vector>using namespace std;

class CVarStar{public:

string Name;double JD;double Magnitude;

};

vector<CVarStar> Observe(1000);Observe[2].JD = 2455259.5;Observe[2].Name = "R CRB";Observe[2].Magnitude = "6.2";

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 37 / 43

Page 38: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Vektor

Vektor kezelése

Vektor bejárásaHasonlóan a C-s vektorbejáráshozPélda:

void PrintStar(int i){

cout << Observe[i].Name << ’ ’ << Observe[i].JD << ’ ’ <<Observe[i].Magnitude << ’\n’;

}

void PrintObserve(){

for(i=0; i<Observe.size(); i++)PrintStar(i);

}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 38 / 43

Page 39: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Vektor

Vektor mérete

Vektor méretének lekérdezésesize() függvény segítségévelVektor méretének megváltoztatása

Futási időben változtatható méretNövelhető, CsökkenthetőA méret lekérdezhetőPélda:

void AddStars(int n){

Observe.resize(Observe.size()+n);}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 39 / 43

Page 40: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Vektor

Tartományellenőrzés

Alapértelmezés szerint nincsen benne tartományellenőrzésAkár túl is tudjuk indexelniPélda:

VarStar Observe[1000];Observe[1001].JD = 2455259.5;Observe[1002].Name = "R CRB";Observe[1003].Magnitude = "6.2";

Gondoskodni kell az ellenőrzősről!Saját függvénnyel leszármaztatott osztálybanKivételkezeléssel

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 40 / 43

Page 41: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Lista

Lista

A vektor adatszerkezetben az adatok törlése, hozzáfűzése csaknehézkesen oldható megMegoldás

Lista használataPélda:

#include <list>

using namespace std;

list<CVarStar> ObserveList;void AddStar(const CVarStar& obs, list<CVarStar>::iterator i){

ObserveList.push_front(obs); // hozzáadás a lista elejéhezObserveList.push_back(obs); // hozzáadás a lista végéhezObserveList.insert(i, obs); // hozzáadás az i által mutatott elem elé

}

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 41 / 43

Page 42: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Asszociatív tömb

Asszociatív tömb

Listában a keresés csak nehezen lehetségesListában a keresés rossz hatékonyságúOlyan adatszerkezet kellene, amely a következőket tudja:

Támogatja a beszúrástTámogatja a törléstTámogatja az érték szerinti keresést

MegoldásStandard könyvtár map típusaA map egy értékpár-tároló

Léterehozásamap<tipus_)kulcs,tipus_ertek> asszociativ_tomb_neve;

Szokásos elnevezései: map / asszociatív tömb / szótár

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 42 / 43

Page 43: Programozás - C++ típusok, operá · PDF fileProgramozás C++típusok,operátorok FodorAttila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek

Tárolók Asszociatív tömb

Asszociatív tömb - példa

Példa:#include <list>#include <string>

using namespace std;

map<string,double> ObserveMap;void PrintOneObserve(const string& starname){

if (double i = ObserveMap[starname])cout << starname << ’ ’ << i << ’\n’;

}

Illeszkedést keresHa nem talál illeszkedést az a kulcsra (starname), a ObserveMap egyalapértével tér vissza

Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 43 / 43