Programozás. C++ típusok, operátorok. Fodor Attila



Hasonló dokumentumok
1. Alapok. Programozás II

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás II. 2. Dr. Iványi Péter

Információs Technológia

A C programozási nyelv III. Pointerek és tömbök.

A C programozási nyelv III. Pointerek és tömbök.

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozási Nyelvek (C++) Összefoglaló

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Programozás II. 4. Dr. Iványi Péter

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

A C# programozási nyelv alapjai

A C programozási nyelv I. Bevezetés

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Fejlett programozási nyelvek C++ Iterátorok

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

A C programozási nyelv I. Bevezetés

Java II. I A Java programozási nyelv alapelemei

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Programozási Nyelvek: C++

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

C++ Standard Template Library (STL)

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Mintavételes szabályozás mikrovezérlő segítségével

Információs Technológia

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Bevezetés a programozásba I.

Maximum kiválasztás tömbben

Programozási technológia

A C++ Standard Template Library rövid összefoglalás

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Bevezetés a programozásba I.

Programozás alapjai. 5. előadás

Pénzügyi algoritmusok

Bevezetés a programozásba. 8. Előadás: Függvények 2.

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

500. AA Megoldó Alfréd AA 500.

500. CC Megoldó Alfréd CC 500.

Alprogramok, paraméterátadás

Java II. I A Java programozási nyelv alapelemei

1. Bevezetés A C++ nem objektumorientált újdonságai 3

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Programozás I gyakorlat. 10. Stringek, mutatók

Bevezetés, a C++ osztályok. Pere László

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

128. AA Megoldó Alfréd AA 128.

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozás 1. Dr. Iványi Péter

3. Osztályok II. Programozás II

Generikus osztályok, gyűjtemények és algoritmusok

Pénzügyi algoritmusok

Programozas 1. Strukturak, mutatok

OOP #14 (referencia-elv)

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

C++ programozási nyelv Konstruktorok-destruktorok

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

117. AA Megoldó Alfréd AA 117.

Pénzügyi algoritmusok

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Programozás C és C++ -ban

Challenge Accepted:C++ Standard Template Library

Programozás alapjai II. (1. ea) C++

Pénzügyi algoritmusok

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás C++ -ban

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Programozás I gyakorlat

Programozás 5. Dr. Iványi Péter

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

A C# PROGRAMOZÁSI NYELV

7. fejezet: Mutatók és tömbök

Osztály és objektum fogalma

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

Kivételkezelés a C++ nyelvben Bevezetés

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Készítette: Nagy Tibor István

Készítette: Nagy Tibor István

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

ISA szimulátor objektum-orientált modell (C++)

Programozás C++ -ban 2007/1

Informatika terméktervezőknek

Programozás II gyakorlat. 8. Operátor túlterhelés

Szövegek C++ -ban, a string osztály

Programozás I gyakorlat

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

1. Gyakorlat. Rövid elméleti összefoglaló. <tárolási osztály>típus <típus > változónév <= kezdőérték><, >;

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Átírás:

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 foa@almos.vein.hu 2010. március 4.

Deklaráció és definíció C++ típusok C++ nyelvben használható típusok, változók, aritmetika Deklaráció Minden névről meg kell mondani mire szeretnénk használni, mert ennek a hiányában a fordító nem tud mit kezdeni az adott névvel A tulajdonságai a következők: típus, tárolási osztály, láthatóság Nem 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 a memó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

A C++ nyelv típusai C++ típusok C++ nyelvben használható típusok, változók, aritmetika Skalár (egyszerű típus) Aritmetikai típusok Egész jellegű típusok char int enum Lebegőpontos típusok float double Mutató típusok Referencia típus void Összetett típus Összeállított típusok Tömb típusok Structúra (struct) típusok Unió (union) típusok Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 3 / 43

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ípusok char int float double enum struct union void (típusnév hiánya; üres típus) Típusmódosítók short (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 nem vá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

C++ típusok Változók mérete (sizeof operátor) C++ nyelvben használható típusok, változók, aritmetika sizeof kifejezés sizeof(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

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

Változók és aritmetika C++ típusok C++ nyelvben használható típusok, változók, 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átorok Logikai operátorok Léptető operátorok Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 7 / 43

C++ típusok Referencia (hívatkozás) típus Referencia 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ékonyan A jelölés jelentése: "Hivatkozás A-ra" int i = 100; int& ref = i; // r és i itt ugyanarra az int-re hivatkoznak int x = ref; // x = 100 ref = 200; // i = 200 A referencia célpontját létrehozáskor meg kell határozni!!! int& ref = i; int& ref2; extern int& ref3; // OK // Hibás referencia megadás // nincsen kezdeti érték megadva // OK (Később kap értéket) Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 8 / 43

C++ típusok Referencia (hívatkozás) típus Referencia 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 referencia int i = 0; int& ref = i; ref++; int* p = &ref; // i növelése // 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

Felhasználói típus C++ típusok 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és Megközelítés: "Döntsd el, mely típusokra van szükség és mindegyikhez biztosíts teljes műveletkészletet." Stroustrup Absztrakt típus (abstract data type, ADT) A felület elszigeteli a felhasználót a megvalósítás részleteitől Konkrét típus A felület nem teljesen szigeteli el a felhasználót a megvalósítás részleteitől Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 10 / 43

C++ típusok Felhasználói típus - példa Felhasználói típus 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

C++ típusok Felhasználói típus - operátor Felhasználói típus Probléma: Milyen műveletek értelmezettek a típuson Összeadás, kivonás, összehasonlítás, stb. I. megoldás Osztályfüggvények alkalmazása Minen művelethez meg kell írni Meg kell hívni egyesével a függvényeket az osztálypéldányon I. megoldás Operátorok alklamazása (+ - * / ==!= stb.) Operátorokat el kell készíteni Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 12 / 43

C++ típusok Felhasználói típus Felhasználói típus operátora - 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

C++ típusok Felhasználói típus Felhasználói típus operátora - 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

C++ típusok Felhasználói típus Felhasználói típus operátora - 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

Mutatók C++ típusok Mutatók, Tömbö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ím A pointer mindig egy meghatározott típusú objektumra mutat Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 16 / 43

Mutatók használata C++ típusok Mutatók, Tömbök Mutató típus definiálása: pointer_tipusa *pointer_neve Változó címének meghatározása: &valtozo_neve Mutató által mutatott változó értéke: *pointer_neve int i, *ip, v[10]; i = 123; ip = &i; *ip = 123; ip = &v[2]; double d, *dp double* dp2; void *p; int **ipp; int* *ipp2; Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 17 / 43

Tömb mérete A fordítóprogram határozza meg az elemtípusok méretének a függvényében A 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énik int i; register int i; //Nagy elemszám esetén for(i=0; i<n; v[i++]=0); Kezdeti érték adása tömböknek tipus tömb_neve[] = érték1, érték2...; A tömb méretét a fordító határozza meg a felsorolt konstansok alapján 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 Tömb alkalmazása C++ típusok Mutatók, Tömbök

Többdimenziós tömbök C++ típusok Mutatók, 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

Sablon/Tamplate osztály C++ típusok Template 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. Verem kezelése template<class T> class CStack T* v; int max_size; int top; public: class Underflow }; // hibakezelés class Overflow }; // hibakezelés CStack(int s); // konstruktor ~CStack(); // destruktor void Push(T); T Pop(); }; Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 20 / 43

Sablon/Template osztály C++ típusok Template osztály 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

Sablon/Template osztály C++ típusok Template osztály Verem kezelése (Függvények megadása) CStack<int> st_int(100); CStack<CComplex> st_cmplx(50); CStack< list<int> > st_list(50); // verem 100 int-nek // verem 50 komplex számnak // 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

C++ típusok Template osztály Sablon/Template osztály használata Adatszerkezetek kezelése Lista Vektor Tömbök (map) stb. Fordítási időben van jelentősége Nem növeli meg futási időt a "hagyományos kódoláshoz" képest Container Class (tároló, konténer) Osztály elnevezés Valamilyen típusú elemek gyűjteményét tartalmazza Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 23 / 43

iostream Standard könyvtárak iostream Adatfolyam-bemeneti és -kimeneti szolgáltatások Kimenetek és bemenetek kezelése A << kimeneti operátor második operandusát beírja az elsőbe A >> bemeneti operátor első operandusát beírja a másodikba Karakterláncok (string) kezelése Listák, vektorok kezelése. #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

Kimenet Standard könyvtárak iostream iostream könyvtár meghatároz egy kimenetet A << kimeneti operátor második operandusát beírja az elsőbe #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() << " std::string str = "Szoveg..."; Re: " << c.getre() << " \n\n"; Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 25 / 43

Névtér Standard könyvtárak iostream Standard könyvtár az std névtérhez tartozik std::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

Névtér beállítása Standard könyvtárak iostream Névtér beállítása using namespace nevter_neve; #include <iostream> #include<string> //... CComplex c(1,0), c2(1,1); std::cout << "Im: "; std::cout << c.getim(); std::cout << " Re: "; std::cout << c.getre(); std::cout << "\n\n"; //Itt nem hagyható el az std:: 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

Bemenet Standard könyvtárak iostream istreams szolgál bemenetek kezelésére A >> bemeneti operátor első operandusát beírja a másodikba #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

Bemenet Standard könyvtárak iostream Egész sor beolvasása getline() függvény segítségével #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

Karakterlánc (string) Standard könyvtárak iostream Karaktersorozatok eltárolására használható típus Karaktrlánc-műveletek Operá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

Karakterlánc (string) Standard könyvtárak iostream Kimenetre, bemenetre átirányítható: string str1 = "Helyes?"; string str2; cout << str1; cin >> str2; Összehasonlítás string str2; cout << "Helyes? (igen/nem); cin >> str2; if (str2 == "igen")... } Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 31 / 43

Karakterlánc (string) Standard könyvtárak iostream 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

Standard könyvtárak iostream Stringeken értelmezhető műveletek/fogalmak Bejárók Az elemek (karakterek) elérése Konstruktor Hibák kezelése, detektálása Értékadás Átalakítás C stílusú karakterláncra Összehasonlítás Beszúrás Összefűzés Keresés Csere Részláncok Méret és kapacitás (memóriakezeléssel kapcsolatos) Ki- és bemeneti műveletek Felcserélés Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 33 / 43

C stílusú string Standard könyvtárak iostream string típus átalakítható Kompatibilítás miatt szükséges/hasznos c_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

Szabványos tárolók Tárolók Tárolók Szabványos tárolók vector<t> Változó hosszúságú vektor list<t> Kétirányú láncolt lista Queue<T> Sor Stack<T> Verem Deque<T> Kétvégű sor Priority_queue<T> Érték szerint rendezett sor set<t> Halmaz Multiset<T> Halmaz, melyben egy érték többször is előfordulhat Map<kulcs,érték> Asszociatív tömb Multimap<kulcs,érték> Asszociatív tömb, melyben egy kulcs többször előfordulhat std névtérhez tartoznak Header állományokat be kell rakni! <vector>, <list>, <map>, stb. Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 35 / 43

Vektor Tárolók Vektor Probléma: C nyelvben rögzített méret C nyelvben fordítási időben meg kell adni a méretet Nem hatékony a memóriakezelés struct VarStar public: string Name; double JD; double Magnitude; }; VarStar Observe[1000]; Observe[2].JD = 2455259.5; Observe[2].Name = "R CRB"; Observe[2].Magnitude = "6.2"; //C++ Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 36 / 43

Vektor Tárolók Vektor Megoldás, hiányosságok pótlása: Futási időben megadható méret Futási időben változtatható méret Hibás indexelés detektálása #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

Vektor kezelése Tárolók Vektor Vektor bejárása Hasonlóan a C-s vektorbejáráshoz 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

Vektor mérete Tárolók Vektor Vektor méretének lekérdezése size() függvény segítségével Vektor méretének megváltoztatása Futási időben változtatható méret Növelhető, Csökkenthető A méret lekérdezhető void AddStars(int n) Observe.resize(Observe.size()+n); } Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 39 / 43

Tartományellenőrzés Tárolók Vektor Alapértelmezés szerint nincsen benne tartományellenőrzés Akár túl is tudjuk indexelni 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ályban Kivételkezeléssel Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 40 / 43

Lista Tárolók Lista A vektor adatszerkezetben az adatok törlése, hozzáfűzése csak nehézkesen oldható meg Megoldás Lista használata #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éhez ObserveList.push_back(obs); // hozzáadás a lista végéhez ObserveList.insert(i, obs); // hozzáadás az i által mutatott el } Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 41 / 43

Asszociatív tömb Tárolók Asszociatív tömb Listában a keresés csak nehezen lehetséges Listában a keresés rossz hatékonyságú Olyan adatszerkezet kellene, amely a következőket tudja: Támogatja a beszúrást Támogatja a törlést Támogatja az érték szerinti keresést Megoldás Standard könyvtár map típusa A map egy értékpár-tároló Léterehozása map<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

Asszociatív tömb - példa Tárolók Asszociatív tömb #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 keres Ha nem talál illeszkedést az a kulcsra (starname), a ObserveMap egy alapértével tér vissza Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 43 / 43