LA C++ programozási nyelv Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./0. lRokonok, barátok lÚj műveletek hozzárendelése az.

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

C++ programozási nyelv Gyakorlat hét
Összetett adattípusok 8/b tétel
Tömbök C#-ban.
Kifejezések, operandusok, operátorok
LFüggvények Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 20./0. lFüggvények deklarációja és prototípusa lA függvénydefiníció lHivatkozás.
LRendezés minimális elem kiválasztással Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./0. lAz algoritmus működése lRávezető feladat.
Öröklődés 2..
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Programozás alapjai.
Dinamikus tömbök.
Bevezetés a Java programozásba
5. előadás (2005. március 22.) Függvények definíciója, deklarációja, hívása Enumerációs adattípus 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 7. Gyakorlat Operator overloading.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 8. Gyakorlat Operator overloading II.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Parancssori argumentumok Primitív típusok Operátorok Vezérlési szerkezetek Tömbök Ürmös Beáta, 2011.
Függvények, mutatók Csernoch Mária.
Mutatók, tömbök, függvények
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
A C++ programozási nyelvSoós Sándor 1/14 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/10 C++ programozási nyelv Gyakorlat - 5. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
LDinamikus tömbök, kétdimenziós tömbök Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 21./0. lVektorok létrehozása futásidőben, dinamikusan.
C# tagfüggvények.
C# tagfüggvények.
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
További vektor, mátrix algoritmusok
Ficsor Lajos Template-ek CPP8/ 1 Template-ek. Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan.
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Objektumorientált tervezés és programozás II. 3. előadás
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Java programozási nyelv Metódusok
1 Objektum orientált programozás Öröklődés: többszörös öröklődés, konstruktorok, destruktorok, overloading Nagy Szilvia.
Objektumorientált alapjai ISZAM III.évf. részére Bunkóczi László.
Függvények a C nyelvben 1 Függvényeket a következő esetekben szokás írni: Ha ugyanazt a tevékenységet többször is el kell végeznünk ugyanolyan típusú,
Ficsor Lajos CPP2 / 1 Származtatási mechanizmus a C++ nyelvben Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 1 Osztály és objektum fogalma.
Típuskonverzió a C++ nyelvben
Ficsor Lajos Objektumok inicializálása CPP4 / 1 Objektumok inicializálása Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
Objektum orientált programozás 4. Mutatók, típusok és struktúrák Nagy Szilvia.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
Informatikai gyakorlatok 11. évfolyam
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
LA C++ programozási nyelv Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 16./0. lA világ objektum alapú szemlélete lSzoftverfejlesztési.
A szoftver mint komplex rendszer: objektumorientált megközelítés.
A C++ programozási nyelv
a programegységek között
Programozási nyelvek típusossága.
A C++ programozási nyelv
A C++ programozási nyelv
Beépített függvények használata programozáskor
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
String osztály létrehozása
A struct, az union és az enum típus
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Konverziós operátorok
Feladat Készítsünk programot, amely ciklikusan egy egyenest forgat 8 fokonként, mialatt 3 db vektort mozgat és forgat 5, 6 ill 7 fokonként, és kijelzi.
Függvénysablonok használata
Előadás másolata:

lA C++ programozási nyelv Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./0. lRokonok, barátok lÚj műveletek hozzárendelése az operátorokhoz Rokonok, barátok. Operátorok átdefiniálása lObjektumok dinamikus létrehozása

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./1. lObjektumok dinamikus létrehozása Az objektumok program futás közbeni létrehozása azzal az előnnyel jár, hogy a menetközben meghatározott értékektől függő paraméterezéssel, ill. darabszámban hozhatjuk létre az objektumokat. Az értékek származhatnak a felhasználótól is. A dinamikusan létrehozott objektumok a Heap memóriában jönnek létre és addig léteznek, amíg a programnak szüksége van rájuk. Megszüntetésüket és ezáltal a memória felszabadítását is a program végzi. Az objektumok dinamikus létrehozását is a new, megszüntetésüket a delete operátorral végezzük. Az ilyen módon létrehozott objektumoknál szintén meghívásra kerül a konstruktor és megszűnésükkor a destruktor. Példa: Egyetlen objektum és objektumvektor dinamikus létrehozása Lista * listamut, * dinamlistak; // mutatók definiálása az első lépés listamut = new Lista(12); // egyetlen listaobjektum 12 elemű belső vektorral dinamlistak = new Lista[ 3 ] ; // három listaobjektumot tartalmazó vektor // objektumvektor létrehozásakor nem adhatjuk meg az elemszámokat // az objektumok használata zajlik itt delete listamut; delete [ ] dinamlisták; // Milyen kényelmes, hogy a konstruktorok és a destruktorok végzik a belső nevek vektor // dinamikus létrehozását és törlését!

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./2. lRokonok, barátok A C++ nyelvben az azonos őstől származtatott objektumok egymás rokonai. Az adatrejtés ezek között gyengébb a teljesen idegen objektumok adattagjainak és nem publikus tagfüggvényeinek elérhetetlenségéhez képest. Adódhatnak azonban ritkán olyan esetek, amikor egyes függvényeknek több osztály adattagjához is van kötődése. Ilyen esetekben a friend (barát) jelzéssel felvéve a függvényt a barát osztályba lehetővé tesszük számára a privát adattagokhoz és privát tagfüggvényekhez való hozzáférést. A függvény eredetileg lehet valamelyik osztály tagfüggvénye és ily módon egy másik osztályhoz is hozzáférhet, vagy lehet az osztályokon kívül álló, de a barátként befogadó osztályok adataihoz ily módon hozzáférő. Nézzünk egy példát az utóbbi esetre! Tárolja a korábban megismert Lista típusú objektumunk hallgatók egy csoportjának a nevét. Egy másik, új osztályba tartozó objektum tárolja egy adott időszakban tanulmányi emlékérmet kapott hallgatók nevét és érmének színét! Ugyanaz a hallgató többször is szerepelhet benne. Szeretnénk meghatározni, hogy az első csoportba tartozó hallgatók összesen hány arany érmet szereztek. Érezhetően a választ megadó függvény nem köthető szorosan egyik osztályhoz sem. A megoldáshoz az első csoport minden tagjára meg kell nézni, van-e vele egyező nevű az érmet szerzettek között, ha van és arany érmet kapott, figyelembe kell venni a számlálásban.

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./3. Az alábbiak a korábban adott osztályhierarchia kiegészítéseként értendőek és csak az új részeket mutatják. #define DSZ 50 // dijazott hallgatók száma, az egyszerűség kedvéért itt megadva enum eremtip { arany, ezust, bronz }; … class Dijazottak; // előrehivatkozás a Dijazottak osztályra, hogy hivatkozhassunk rá … class Lista {… public: friend int AranyermekSzama(Lista& lista, Dijazottak& dijazottak); // referencia paramétereket használunk a vektorok másolásának // elkerülésére... }; // folytatódik

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./4. class Dijazottak; { private: nevtip dijazottvekt [DSZ]; // egyszerűség kedvéért adott méretű eremtip eremvekt[DSZ]; public: void DijMegadasa(int i, nevtip nevbe, eremtip erembe) {strcpy(dijazottvekt [ i ], nevbe); eremvekt [ i ]= erembe; } void DijLekerdezese(int i, nevtip nevki, eremtip& eremki ) { strcpy(nevki, dijazottvekt [ i ] ); eremki = eremvekt [ i ]; } friend int AranyermekSzama(Lista& lista, Dijazottak& dijazottak); }; int AranyermekSzama(Lista& lista, Dijazottak& dijazottak) { int db=0; for (int i =0; i<lista.elemszam; i++) // közvetlen adattagelérés! for ( int j =0; j<DSZ; j++) { if (!strcmp(dijazottak.dijazottvekt[ j ], lista.nevek[ i ]) && dijazottak.eremvekt[ j ]==arany) db++; // közvetlen adattagelérés! } return db; } //folytatódik

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./5. … Lista lista(40); Dijazottak dijazottak; void main(void) { … // feltöltés: lista nevtip nevbe; eremtip erembe; for (int m=0; m<lista.Elemszama(); m++) { printf("\nA %d. hallgató neve: ", m); gets(nevbe); lista.ElemMegadasa(m, nevbe); } // feltöltés: dijazottak for (m=0; m<DSZ; m++) { printf("\nA %d. dijazott hallgato neve: ", m); scanf("%s", nevbe); printf("\nA %d. dijazott hallgato érme (0,1,2): ", m); // egyszerűség kedvéért.. scanf("%d",&erembe); dijazottak.DijMegadasa(m, nevbe, erembe); } printf("A listán szereplők %d aranyermet szereztek. ", AranyermekSzama(lista, dijazottak) ); // a függvény hívása }...

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./6. lOsztály tagfüggvényének hozzáférése más osztály privát részéhez Ezt az esetet az alábbi vázlattal szemléltetjük: class A { … void fvA( );... }; class B { private: … public: void fvB( ); friend void A:: fvA(); // használhatja B privát tagjait … }; Végül megjegyezzük, hogy ha egy osztály (pl. A) több tagfüggvénye számára szeretnénk egyszerre engedélyezni egy másik (pl. B) privát tagjainak a közvetlen elérését, akkor az egyes függvények helyett B magát az A osztályt fogadhatja barátjának.

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./7. lÚj műveletek hozzárendelése az operátorokhoz A valós világban különböző objektumokon is elvégezhetünk azonos névvel illetett tevékenységeket, pl. összeadhatunk jegyespárt, két vektort, két halmazt, két listát, két szöveget, vagy két számot. Az utóbbi két esetre a Pascal nyelvben a + operátort használhatjuk. A C++ lehetővé teszi nekünk a + jel alkalmazását az összes esetre. Ezt a lehetőséget, amely nélkül gyakorlatilag nem lehet C++ programot írni, a nyelv az operátorátdefiniálás (operátor overloading) révén nyújtja. Ez a lehetőség tulajdonképpen a többalakúság operátorok esetében. Az átdefiniálás nem változtatja meg az operátor precedenciáját, egy- vagy kétoperandusos jellegét és az alkalmazandó szintaxist. Nézzünk meg néhány egyszerűbb példát a Lista osztály lehetőségeinek kibővítésére! Előnyös lenne, ha a nevek vektornak oly módon is elérhetnénk az elemeit, mintha az objektumnak lennének az elemei, azaz az objektum lenne indexelhető. Egy másik lehetőség, hogy a < operátornak olyan értelmezést is adjunk, hogy két Lista típusú objektumot hasonlítson össze l1 < l2 formában és igaz értéket (1-et) adjon, ha a l1 elemszáma kisebb l2 elemszámától, egyébként pedig hamis (0) értéket.

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./8. A += operátort értelmezhetnénk a Lista típusunk esetében úgy, hogy az l1 += l2 jelentse az l2 lista tartalmának az l1 lista végéhez fűzését és az elemszám aktualizálását, l2 tartalmának változatlanul hagyása mellett. A megoldások: … class Lista {… public: nevtip& operator[ ] (int i ) {return nevek[ i ];} // az objektum indexelhető int operator< (Lista masiklista) {return elemszam < masiklista.elemszam ; } void operator += (Lista masiklista); // deklaráció csak … }; … // masiklista objektum adattagjai elérhetők közvetlenül, mert családtag void Lista::operator+= (Lista masiklista) // definíció { nevtip * nevekuj = new nevtip[elemszam+masiklista.elemszam]; for (int i =0; i <elemszam; i++) strcpy(nevekuj [ i ], nevek[ i ] ); for (i =0; i<masiklista.elemszam; i++) strcpy(nevekuj [elemszam+i ], masiklista.nevek[ i ] ); delete [ ] nevek; // az eredeti tartalom már felszabadítható a Heap-ben nevek= nevekuj; // ráállítjuk az egyesített listára a mutatót elemszam+= masiklista.elemszam; // hogy az új hosszt tartalmazza }

Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./9. … // az operátorok használata: strcpy( lista[2], "Kuczug Balázs"); // értékadás a lista objektumbeli vektor 2. elemének puts(lista[2]); // hivatkozás ugyanarra az elemre, azaz a nevek vektor 2. elemére Lista l1(5), l2(6); // létrehozunk egy 5 elemű és egy 6 elemű lista objektumot if (l1 =l2"); // a < operátor használata listák között strcpy(l1[2], "Balogh Lujza"); // az 5 elemű lista 2 indexű elemét feltöltöttük strcpy(l2[2], "Nagy Teofil"); // a 6 elemű lista 2 indexű elemét feltöltöttük l1 += l2; // l2 lista tartalmának hozzáfűzése az l1 lista végéhez a += operátorral puts(l1[2]); // "Balogh Lujza" puts(l1[5+2]); // "Nagy Teofil", a lista tényleg hosszabb lett! … Milyen függvényhívással egyenértékű a lista[2] kifejezés? lista.operator[ ] (2) // egy referenciát ad Milyen függvényhívással egyenértékű az l1 < l2 kifejezés? l1.operator< (l2) // 0, vagy 1 Milyen függvényhívással egyenértékű az l1 += l2; utasítás? l1.operator+= (l2); // összetett műveleteket végez