Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Hasonló dokumentumok
Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása. Biztonságos adattípusok megvalósítása

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

Alkalmazott modul: Programozás 6. előadás. Strukturált programozás: újrafelhasználható adattípusok

Bevezetés a Programozásba II 5. előadás. Objektumorientált programozás és tervezés

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Osztályok. 4. gyakorlat

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

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

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

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Bevezetés a programozásba. 9. Előadás: Rekordok

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

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

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

Objektumelvű programozás

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

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

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

OOP #14 (referencia-elv)

Java II. I A Java programozási nyelv alapelemei

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

Java II. I A Java programozási nyelv alapelemei

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Bevezetés a programozásba I.

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Már megismert fogalmak áttekintése

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

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

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Szoftvertechnológia 3. előadás. Objektumorientált tervezés: alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

JAVA PROGRAMOZÁS 2.ELŐADÁS

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

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

Globális operátor overloading

C++ programozási nyelv Konstruktorok-destruktorok

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

Programozás módszertan

Interfészek. PPT 2007/2008 tavasz.

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

Programozási nyelvek Java

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Az UPPAAL egyes modellezési lehetőségeinek összefoglalása. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

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

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

Programozási nyelvek Java

Programozási nyelvek Java

Programozási Nyelvek: C++

5. Gyakorlat. struct diak {

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

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

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

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

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Pénzügyi algoritmusok

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

A modell-ellenőrzés gyakorlata UPPAAL

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Maximum kiválasztás tömbben

Programozás C és C++ -ban

Programozás alapjai 8.Gy: Program struktúra

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Web-technológia PHP-vel

Programozás alapjai 9.Gy: Struktúra 2.

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

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

3. Osztályok II. Programozás II

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Operációs rendszerek gyak.

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

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

Alkalmazott modul: Programozás

Apple Swift kurzus 3. gyakorlat

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

Objektum-orientált programozás

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Informatika terméktervezőknek

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Számítógép és programozás 2

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

Átírás:

Pázmány Péter Katolikus Egyetem Információs Technológiai és Bionikai Kar Bevezetés a Programozásba II 2. előadás Adattípusok megvalósítása egységbe zárással 2014.02.17. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Adattípusok Adattípus = értékhalmaz + művelethalmaz, ahol értékhalmaz: a felvehető értékek halmaza (mindig véges, mivel a lefoglalható memóriaterület mérete is véges) művelethalmaz: az értékhalmazon (esetlegesen más értékhalmazokon) értelmezetett műveletek Pl.:,,,,, ahol :, 2147483648,, 2147483647,,,,,,, ahol PPKE ITK, Bevezetés a programozásba II 2:2 Adattípusok A programozási nyelvek számos típussal rendelkeznek a gépi szinten számára értelmezhető, egyszerű típusokat nevezzük elemi, vagy primitív típusoknak a további típusok az összetett típusok, amelyek a típuskonstrukciók segítségével hozhatóak létre, úgymint: iterált, vagy sorozat (, vagy ), azonos típusú elemek sorozatát adja gyakran használt (pl. tömb) direktszorzat ( ), különböző típusú elemek együttes kombinációja, gyakran használt (pl. rekord) unió ( ), értékei különböző típusok értékei lehetnek, ritkán használt PPKE ITK, Bevezetés a programozásba II 2:3 Adattípusok elemi eszközökkel A típuskonstrukció megadja az értékhalmazt, pl.: struct Rational { // racionális szám rekordja ; Emellett tetszőleges műveleteket valósíthatunk meg alprogramok segítségével, pl.: Rational operator*(rational r1, Rational r2) { // két racionális szám szorzata Rational res; // eredmény változó res.numerator = r1.numerator * r2.numerator; return res; // az eredményt adjuk vissza PPKE ITK, Bevezetés a programozásba II 2:4 Feladat: Valósítsuk meg a téglalapok típusát. A téglalap szélességével, illetve magasságával reprezentálható, illetve lekérdezhető a területe, valamint a kerülete. létrehozzuk a téglalap rekordját (Rectangle), amely tartalmazza a két adatot (width, height) a rekord mellé megvalósítjuk a két lekérdező műveletet (area, perimeter), amelyek paraméterben kapják meg a téglalapot, és visszatérési értékben adják meg az eredményt a könnyű használhatóság végett a beolvasó (>>), illetve kiíró (<<) operátorokat is megvalósítjuk a főprogramban beolvasunk egy téglalapot, majd kiírjuk az értékekeit PPKE ITK, Bevezetés a programozásba II 2:5 struct Rectangle { // téglalap rekordja double width; // szélesség double height; // magasság ; double area(rectangle rec) { // téglalap területe return rec.width * rec.height; istream& operator>>(istream& s, Rectangle& rec) { // beolvasó operátor s >> rec.width >> rec.height; return s; PPKE ITK, Bevezetés a programozásba II 2:6 1

Feladat: Készítsük el a racionális szám típusát a beolvasás, kiírás, összeadás és szorzás műveletével. A főprogramban olvassunk be 5 racionális számot, és adjuk meg a szorzatukat és összegüket. készítsünk rekordot a racionális számnak (Rational), amely tartalmazza a számlálót (numerator) és a nevezőt (denominator) a műveleteket, beleértve a beolvasást és kiírást,operátorok segítségével valósítjuk meg (+, *, <<, >>), ügyelve arra, hogy a racionális számok egész számokkal is kompatibilisek (így többféle művelet kell), illetve, hogy a műveletek összevonhatóak értékadással (+=, *=) struct Rational { // racionális szám rekordja ; istream& operator>>(istream& s, Rational &r){ // s lesz az adatfolyam s >> r.numerator >> r.denominator; // s-ről beolvassuk a két értéket return s; // s-t visszaadjuk PPKE ITK, Bevezetés a programozásba II 2:7 PPKE ITK, Bevezetés a programozásba II 2:8 Rational operator*(rational r1, Rational r2) { Rational operator*(rational r, int e) { Rational operator*(int e, Rational r) { // összeadás értékadással: Rational operator+=(rational& r1, Rational r2) { Rational operator+=(rational& r, int e) { int operator+=(int& e, Rational r) { Adattípusok elemi eszközökkel Az adattípusok megvalósításának célja, hogy az összetett szerkezetű adatok is jól, könnyen kezelhetővé váljanak amennyiben csak egy programban használnánk az új típust, akkor nem térülne meg a befektetett energia, ezért törekednünk kell, hogy a típusok újrafelhasználhatóak legyenek Az újfelhasználhatóságot a C++ számos eszközzel támogatja: egységbe zárás, láthatóság kezelés fordítási egységek használata konstansok kezelése (const correctness) sablonok használata PPKE ITK, Bevezetés a programozásba II 2:9 PPKE ITK, Bevezetés a programozásba II 2:10 Az egységbe zárás A típushoz megadott művelethalmazt célszerű szorosan összefűzni az értékhalmazzal, hogy valóban együttest képezzen, ezt egységbe zárásnak (enkapszulációnak) nevezzük a rekordot összeillesztjük a hozzá tartozó művelethalmazzal, így alkotva az egységes típust a típus adatai a mezők (vagy attribútumok), műveletei a metódusok lesznek a metódusok közvetlenül láthatják a mezőket, így nincs szükség paraméterekre A típushoz létrehozásához továbbra is a struct konstrukciót használjuk, de alprogramokat is helyezünk az adatok mellé Metódusok használata A metódusok deklarációja hasonlít a sima függvénydeklarációhoz, csak a rekord belsejében végezzük: struct <rekordnév>{ <típus> <metódusnév>(<paraméterek>){ <metódustörzs> ; A metódusokat csak változón keresztül érhetjük el, ezért mindig kell legyen egy példány a típusból, ekkor <változónév>.<metódusnév>(<paraméterek>) formában meghívhatjuk a függvényt PPKE ITK, Bevezetés a programozásba II 2:11 PPKE ITK, Bevezetés a programozásba II 2:12 2

Feladat: Módosítsuk a téglalap megvalósítását úgy, hogy a kerület és terület lekérdezés metódus legyen. nincs szükségünk paraméterátadásra, a művelet közvetlenül futtatható a változóra a formális paraméter helyett közvetlenül használhatjuk a mezőket struct Rectangle { // téglalap típusa double width; // szélesség (mező) double height; // magasság double area() { // téglalap területe (metódus) // a paraméterre már nincs szükségünk return width * height; // a mezők közvetlenül elérhetőek double perimeter() { // téglalap kerülete (metódus) return (width + height) * 2; ; PPKE ITK, Bevezetés a programozásba II 2:13 PPKE ITK, Bevezetés a programozásba II 2:14 int main() { Rectangle rec1; cout << "Area: " << rec1.area() << endl; // további műveletek használata // (metódusként) cout << "Perimeter: " << rec1.perimeter() << endl; Amikor a példányosítunk egy típust, kezdeti értékeket kell beállítanunk a mezőinek, ezt inicializálásnak nevezzük pl. négyzet méretei, racionális szám számlálója, nevezője amennyiben ezt kihagyjuk, a példány nem megfelelő kezdőállapottal indul (mint egy változó kezdeti értékadás nélkül) Az inicializálás automatikusan elvégezhető konstruktor művelet használatával return 0; egy olyan metódus, amely mindig példányosításkor fut le, és feladata a kezdeti értékek beállítása a mezőknek neve megegyezik a típussal, visszatérési értéke nincs PPKE ITK, Bevezetés a programozásba II 2:15 PPKE ITK, Bevezetés a programozásba II 2:16 A konstruktorra ugyanazon szabályok vonatkoznak, mint más metódusokra (paraméterezhető, túlterhelhető, látja a mezőket): struct <típusnév>{ <típus> <mező>; <típusnév>() { <tag> = <érték>; // 0 paraméteres konstruktor <típusnév>(<típus> <változó>) { // 1 paraméteres konstruktor (túlterhelés) <mező> = <változó>; // egyéb metódusok ; A konstruktorra futtatása automatikusan történik példányosításkor, de amennyiben paraméteres, akkor paraméterrel kell a példányt létrehozni: <rekordnév> <változónév>; // ekkor lefut a 0 paraméteres konstruktor <rekordnév> <változónév>(<érték>); // ekkor lefut az 1 paraméteres konstruktor, // amennyiben a típusok egyeznek Ha nem hozunk létre saját konstruktort, a típus egy alapértelmezett (0 paraméteres) konstruktort kap bármilyen konstruktor létrehozása esetén az alapértelmezett megszűnik PPKE ITK, Bevezetés a programozásba II 2:17 PPKE ITK, Bevezetés a programozásba II 2:18 3

Feladat: Egészítsük ki a racionális szám típusát három konstruktorral, egy 0 paraméteressel, amely a 0 racionális számot állítja elő, illetve egy 1 paraméteressel, amely egy egész szám alapján hozza létre a racionálist, illetve 2 paraméteresen, amely nevezőt és számlálót kap. 2 paraméteresnél ellenőrizzük, hogy a nevező megfelelő-e struct Rational { // racionális szám rekordja // mezők // konstruktorok: Rational() { // 0 paraméteres konstruktor numerator = 0; denominator = 1; Rational(int nr) { // 1 paraméteres numerator = nr; denominator = 1; Rational(int num, int denom) { // 2 paraméteres numerator = num; denominator = denom!= 0? denom : 1; ; PPKE ITK, Bevezetés a programozásba II 2:19 PPKE ITK, Bevezetés a programozásba II 2:20 Rational sum; // 0 paraméteres konstruktor hívása, vagyis // 0/1-t kapunk // ugyanez: // Rational sum(0); // Rational sum(0, 1); Rational mult(1); // 1 paraméteres konstruktor hívása, vagyis // 1/1-t kapunk // ugyanez egy sorban: // Rational sum, mult(1); PPKE ITK, Bevezetés a programozásba II 2:21 Érték inicializálás A kezdő értékeknek van egy még speciálisabb megadási lehetősége, az érték inicializálás kettőspont után megadjuk a mező nevét, majd a formális paramétert zárójelben, ha többet akarunk megadni, akkor vesszővel választjuk el: <típusnév>(<típus> <paraméter>) : <mezőnév>(<kezdőérték>), // inicializálások <mezőnév>(<kezdőérték>), { // konstruktortörzs hivatkozás mezők (&) esetén szükséges, alapesetben használata egyenértékű a konstruktortörzsben történő értékadással PPKE ITK, Bevezetés a programozásba II 2:22 Deklaráció és definíció szétválasztása Metódusok (beleértve a konstruktort is) esetén is szeparálhatjuk a deklarációt a definíciótól, ekkor a rekordba csak a függvény szintaxisát írjuk, a törzsét később a törzsnél meg kell jelölnünk, melyik típus tagja a :: (scope) operátor segítségével: struct <típusnév>{ <típus> <metódusnév>(<paraméterek>); ; <típus> <típusnév>::<metódusnév>(<param.>) { <metódustörzs> Feladat: Módosítsuk a téglalap típusát úgy, hogy adunk hozzá érték inicializálást használó konstruktorokat, illetve a metódusok törzsét leválasztjuk. struct Rectangle { // téglalap típusa Rectangle() : width(0), height(0) { // konstruktor művelet, amelyben érték // inicializálást használunk Rectangle(double w, double h) : width(w), height(h) { // 2 paraméteres konstruktor művelet PPKE ITK, Bevezetés a programozásba II 2:23 PPKE ITK, Bevezetés a programozásba II 2:24 4

double area(); // téglalap területe (metódus deklarációja) double perimeter(); // téglalap kerülete (metódus deklarációja) ; double Rectangle::area() // téglalap területe (metódus definíciója) { return width * height; // a mezők közvetlenül elérhetőek Operátorok metódusként Lehetőségünk van operátorok megfogalmazására egységbe zárás mellett is, ekkor egy speciális szabály, hogy az operátor első paramétere az a típuspéldány lesz, amelybe beágyaztuk azaz minden operátornak eggyel csökken a paraméterszáma, így pl. a + operátornak nulla és egy paraméteres változata lesz metódusként bizonyos operátorok (értékadás, indexelés) csak metódusként, bizonyos operátorok (adatátvitel, bizonyos speciális értékadások) csak a típuson kívül írhatóak meg általában az operátorokat külön szoktuk deklarálni a típusokhoz PPKE ITK, Bevezetés a programozásba II 2:25 PPKE ITK, Bevezetés a programozásba II 2:26 Feladat: Módosítsuk a racionális szám típusát úgy, hogy az egyszerű operátorokat a típuson belül valósítjuk meg. struct Rational { // racionális szám típusa // konstruktorok: Rational(); Rational(int); Rational(int, int); // operátor metódusok: Rational operator+(rational); Rational operator+(int); Rational operator*(rational); Rational operator*(int); ; // további operátorok a típushoz: Rational operator+(int e, Rational r); Rational operator*(int e, Rational r); istream& operator>>(istream& s, Rational &r); ostream& operator<<(ostream &s, Rational r); PPKE ITK, Bevezetés a programozásba II 2:27 PPKE ITK, Bevezetés a programozásba II 2:28 5