Alkalmazott modul: Programozás
5. Gyakorlat
Típusok
• Mi az adattípus?
▫ Értékhalmaz és művelethalmaz összessége
• Értékhalmaz
▫ Típusban szereplő adatok
▫ Általában rekorddal megvalósított
• Művelethalmaz
▫ Az adatszerkezeten értelmezett műveletek
▫ Függvényekkel és eljárásokkal megvalósított
Típusok
• Beépítve kétféle típus található meg
▫ Elemi, vagy primitív típusok
Egyszerűbb típusok, mint pl.: int
▫ Összetett típusok
Típuskonstrukciók segítségével létrehozott típusok
Primitív típusokból építkezve
• A beépített típusokon felül van lehetetőség saját típus létrehozásá
Típusok - típuskonstrukciók
• 3 fajta konstrukció létezik
▫ Iterált, vagy sorozat
Azonos típusú sorozatok előállítására
Tömbbel megvalósított általában
▫ Unió
Ritkán használt
Nehézkes
▫ Direktszorzat
Gyakran használt
Saját típusok megvalósításának alapvető eszköze
Rekorddal megvalósított
Rekord
• Különböző típusú adatok gyűjteménye
• Közös, összetett értéket alkot
• A vele létrehozott típus rendelkezik értékhalmazzal
▫ Művelethalmaz is rendelhető hozzá
• A rekordba helyezett értéket nevezzük adattagnak, vagy mezőnek
▫ Rekorddal együtt jönnek létre
▫ Külön módosíthatók és lekérdezhetők
Rekord
• C++ megvalósítás
struct <név>
{ <típus> <azonosító>;
<típus_2> <azonosító_2>;
// … };
• Függvényeken kívül kell deklarálni őket
• FONTOS: a végén pontosvesszőt kell rakni!
• Rekord típusai lehetnek
▫ Beépített típusok
▫ Saját típusok
▫ tömbök
Rekord
• Deklaráció után saját típusként lehet használni:
<rekord_nev> <azonosító>;
• Az adattagokat
▫ módosíthatjuk
▫ lekérdezhetjük az értékeiket
▫ <azonosító>.<tag>
• Tömböket is létre lehet hozni:
▫ <rekord_nev> <azonosító>[<méret>];
<azonosító>[<index>].<tag>;
Feladat
1. Készítsétek el az Employee rekordot.
Tartalmazza a munkahelyre belépés dátumát, illetve a fizetését, és a nevét. A belépés dátuma a Date saját típus legyen. Ez tartalmazza az
évet, hónapot, és a napot.
A főprogramban töltsetek fel egy 5 elemű tömböt Employeekkal, és legyen lehetőség lekérdezni egy adott napon belépett emberek neveit.
Művelethalmaz
• Rekord adattagjai jelentik az értékhalmazt
• Saját típushoz szükség van még a művelethalmazra is
• Művelethalmaz olyan alprogramok, ahol
▫ deklarációban szerepel az adott típus
visszatérési értékként, vagy paraméterként
• Tetszőleges számú művelet írható
Feladat
2. Saját típus létrehozása: Hozzátok létre a polinom típust, ahol a polinomot a fokával és az
együtthatókat tartalmazó tömbbel reprezentáljuk.
Valósítsátok meg hozzá az alábbi műveleteket:
a) Összeadás b) Kivonás c) Beolvasás d) Kíírás
e) Helyettesítési érték
f) Adott fokszámú együttható lekérdezése g) Szorzás
Operátorok
• C++ biztosítja, hogy saját típusainkhoz operátorokat készítsünk
▫ Standard módon hívhatóak meg
▫ Működésüket mi határozzuk meg
▫ Függvényként adjuk meg őket
▫ Függvénynév operator<jel> pl.: operator-
▫ Paraméterek száma és visszatérési érték megléte kötött
▫ Paraméterek és visszatérési érték típusa szabad
Operátorok
• Felüldefiniálható operátorok
▫ 1 paraméteresek
-, +, ++, --
!
▫ 2 paraméteresek
Első paraméter a balérték, a második a jobbérték
+, -, *, /, %
||, &&, ^, &, |
+=, -=, *=, /=
<, >, <=, >=, !=, ==
<<, >>
Operátorok - Példa
• Complex osztályra kivonás:
Complex operator-(Complex lv, Complex rv) { Complex res;
res.re = lv.re – rv.re;
res.im = lv.im – rv.im;
return res;
}
Complex c1, c2, c3;
// értékek beállítása c1 = c2 – c3;
Operátorok
• Lehetőség van túlterhelésre ahogy egy egyszerű alprogramnál is
▫ Lehetőség van különböző típusok közötti műveletekre
• A kétparaméteres alprogramoknál a paraméterek a megadás sorrendjének megfelelően helyettesítődnek be
▫ Következemény: kommutatív műveletek esetén
mind a két oldalra meg kell külön írni az operátort
Operátorok
• Lehetőség van adatátviteli operátorok (<<,>>) létrehozására is
• Speciális paraméterezést igényelnek
▫ Meg kell kapni az adatfolyamot, amin a műveletet el kell végezni
▫ Meg kell kapni az adatot, amin végezzük a műveletet
▫ Visszatérési érték szintén adatfolyam
▫ Az adatfolyam lehet
Bemeneti: istream
Kimeneti: ostream
Cím szerinti paraméterátadás kell!
Konstruktorok
• Rekordok létrehozásánál az adattagok beállítása hosszú és körülményes lehet
• Egyszerűbb módszer, ha írunk egy beállító függvényt, ami minden értéket megad
• Még jobb megoldás: konstruktor művelet használata
▫ Egy változó létrehozásakor automatikusan meghívódik
▫ Több félét is készíthetünk
Konstruktorok
• A rekord belsejében kell definiálni a változók mellett
• Tetszőleges paraméterei lehetnek és túl is terhelhetjük
• Inicializálja az adattagokat
• Automatikusan meghívódik
• Neve kötelezően meg kell, hogy egyezzen a rekord nevével és nem írunk le visszatérési értéket
Konstruktorok
struct Complex { int re;
int im;
Complex() { re = 1; im = 1; } Complex( int re_, int im_) {
re = re_;
im = im_;
};
Complex c1; // nulla paraméteres konstruktor hívódik meg
Complex c2(1,2); // két paraméteres konstruktor hívódik meg, ha jók a típusok