C++ programozási nyelv Struktúrák a C++ nyelvben



Hasonló dokumentumok
C++ programozási nyelv Konstruktorok-destruktorok

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

C++ programozási nyelv

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

C++ programozási nyelv

Java programozási nyelv 4. rész Osztályok II.

C++ programozási nyelv Konstruktorok Gyakorlat

Programozás C++ -ban

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

Pénzügyi algoritmusok

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

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

Java programozási nyelv 5. rész Osztályok III.

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

Objektumorientált szoftverfejlesztés alapjai

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

Programozás I gyakorlat

OOP #14 (referencia-elv)

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

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

Objektumok inicializálása

Programozás C++ -ban

5. Gyakorlat. struct diak {

C++ programozási nyelv

3. Osztályok II. Programozás II

Programozási alapismeretek 4.

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

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

Java és web programozás

OOP. Alapelvek Elek Tibor

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

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

Osztály és objektum fogalma

és az instanceof operátor

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?

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozás II. 6.Öröklés Dr. Iványi Péter

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

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

Java III. I I. Osztálydefiníció (Bevezeté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

Java III. I I. Osztálydefiníció (Bevezetés)

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozás II gyakorlat. 6. Polimorfizmus

Bevezetés a C++ programozási nyelvbe

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

Objektumorientált programozás C# nyelven

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

Osztályok. 4. gyakorlat

Objektumelvű programozás

OOP: Java 8.Gy: Abstract osztályok, interfészek

Elemi Alkalmazások Fejlesztése II.

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

Java és web programozás

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

Java és web programozás

Bevezetés a programozásba előadás: Öröklődés

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

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

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Programozás módszertan p.1/46

Java programozási nyelv

Bevezetés a Python programozási nyelvbe

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

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

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

Programozás C++ -ban 2007/7

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Adatstruktúrák, algoritmusok, objektumok

Adatszerkezetek 2. Dr. Iványi Péter

Programozási nyelvek II. JAVA

BME MOGI Gépészeti informatika 8.

Már megismert fogalmak áttekintése

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

500. AA Megoldó Alfréd AA 500.

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

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

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

Osztálytervezés és C++ implementációs ajánlások I.

Virtuális függvények (late binding)

Objektum orientált kiterjesztés A+ programozási nyelvhez

Programozas 1. Strukturak, mutatok

Programozás C++ -ban 2007/4

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

A C++ szigorúbban kezeli a típuseltéréseket, mint a C nyelv Lehetséges típuskonverziók:

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

C++ programozási nyelv

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

Globális operátor overloading

Szoftvergyártás: gyártásvezérlés kód-figyeléssel

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

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.

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) {} };

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Átírás:

C++ programozási nyelv Struktúrák a C++ nyelvben Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. szeptember A C++ programozási nyelv Soós Sándor 1/37

Bevezetés A struktúra, record fogalma Különbségek a C és a C++ között szintaktika tagfüggvények automatikusan lefutó függvények konstruktorok destruktorok hozzáférési hatáskörök szabályozása öröklés A C++ programozási nyelv Soós Sándor 2/37

Szintaktikai különbségek A struktúra nevének használata I. Adott a következő struktúra: struct Valami int x; Hogyan definiálunk egy ilyen típusú változót C-ben? 1. A struct Valami típusazonosítóval: void main() struct Valami v; 2.Typedef-fel elnevezzük a típust: typedef struct Valami Akarmi; void main() Akarmi v; A C++ programozási nyelv Soós Sándor 3/37

Szintaktikai különbségek (folyt.) A struktúra nevének használata I. (folyt.) Hogyan definiálunk egy ilyen típusú változót C-ben? 3. Az 1. és 2. megoldás összevonva: typedef struct Valami int x; Akarmi; void main() Akarmi v; A C++ programozási nyelv Soós Sándor 4/37

Szintaktikai különbségek (folyt.) A struktúra nevének használata I. (folyt.) Hogyan definiálunk egy ilyen típusú változót C++ -ban? Nincs szükség typedef-re, az új név struct nélkül is használható. struct Valami int x; ; void main() Valami v; // ez C-ben hibás lenne A C++ programozási nyelv Soós Sándor 5/37

Szintaktikai különbségek (folyt.) A struktúra nevének használata II.: Önhivatkozó struktúrák C-ben az önhivatkozó struktúrában mindenképpen ki kell tennünk a struct kulcsszót a mutató deklarációjánál. struct Valami int x; struct Valami *Kovetkezo; Ez akkor is így van, ha typedef-et alkalmazunk: typedef struct Valami int x; struct Valami *Kovetkezo; Akarmi; C++ -ban nincsen szükség a struct kulcsszó kiírására: struct Valami int x; Valami *Kovetkezo; // C++ -ban ez helyes ; A C++ programozási nyelv Soós Sándor 6/37

Struktúrák és osztályok Az objektum orientált nyelvek új lehetőségei C++ struktúrák (struct) osztályok (class) Csak apró eltérések vannak a kettő között A C-vel való kompatibilitás megtartása érdekében maradt meg a struct. A C++ programozási nyelv Soós Sándor 7/37

Új fogalom: tagfüggvény (metódus, method) Miről van szó? Adott a korábbi Valami struktúra: struct Valami int x; Írjunk egy függvényt, ami megduplázza az x mező értékét! Hogyan oldanánk meg ezt a feladatot C-ben, illetve C++ -ban? A C++ programozási nyelv Soós Sándor 8/37

Tagfüggvény (folyt.) A feladat megoldása C-ben: void ValamiDuplaz(struct Valami* VP) VP->x *= 2; void main() struct Valami v1,v2; v1.x = 3; ValamiDuplaz(&v1); // v1 x-ét duplázzuk printf("v1.x: %d\n",v1.x); // Kimenet: v1.x: 6 v2.x = 4; ValamiDuplaz(&v2); // v2 x-ét duplázzuk printf("v2.x: %d\n",v2.x); // Kimenet: v2.x: 8 A C++ programozási nyelv Soós Sándor 9/37

Tagfüggvény (folyt.) C++ -ban van egy másik megoldás is, definiáljunk egy tagfüggvényt: A deklaráció: struct Valami int x; void Duplaz(); // tagfüggvény ; A függvény definíciója: void Valami::Duplaz() x *= 2; A C++ programozási nyelv Soós Sándor 10/37

Tagfüggvény (folyt.) Hogyan használjuk a tagfüggvényt? void main() Valami v1,v2; v1.x = 3; v1.duplaz(); // tagfüggvény hívása printf("v1.x: %d\n",v1.x); // Kimenet: v1.x: 6 v2.x = 4; v2.duplaz(); // tagfüggvény hívása printf("v2.x: %d\n",v2.x); // Kimenet: v2.x: 8 Hasonlítsuk össze a két megoldást: Hagyományos függvény: ValamiDuplaz(&v1); Tagfüggvény: v1.duplaz(); A C++ programozási nyelv Soós Sándor 11/37

Tagfüggvény (folyt.) Hasonlítsuk össze a két megoldást: Hagyományos függvény: ValamiDuplaz(&v1); Tagfüggvény: v1.duplaz(); Tagfüggvény hívása megegyezik a mezőhivatkozással pointer esetén is: Valami v1; Valami *vp; vp = &v1; vp->x = 3; vp->duplaz(); A C++ programozási nyelv Soós Sándor 12/37

Tagfüggvény (folyt.) Mikor használjunk tagfüggvényt és mikor hagyományos "szabad" függvényt? Erről szól az objektum-orientált programtervezés Erről fog szólni ez a tantárgy Végső megoldás: Java - Csak tagfüggvény létezik! A C++ programozási nyelv Soós Sándor 13/37

Konstruktorok Hogyan inicializálunk egy struktúrát C-ben? void ValamiKonstruktor(struct Valami* VP) VP->x = 0; Az inicializáló fv. meghívása: void main() struct Valami v1; ValamiKonstruktor(&v1); // inicializálás A C++ programozási nyelv Soós Sándor 14/37

Konstruktorok (folyt.) Mi a helyzet dinamikusan allokált struktúra esetén? struct Valami *vp; vp = malloc(sizeof(struct Valami)); ValamiKonstruktor(vp); Miért nem biztonságos ez a megoldás Mi történik, ha elfelejtkezünk az inicializálásról? Hogyan lehetne elkerülni ezt a veszélyt? A megoldás C++ -ban: "szabad" függvény helyett legyen tagfüggvény az inicializáló fv. A szükséges időben hívja meg a rendszer automatikusan. Ez a konstruktor A C++ programozási nyelv Soós Sándor 15/37

A konstruktor fogalma C++ -ban Hogyan ismeri meg a rendszer a konstruktort? neve megegyezik a struktúra nevével nincs visszatérő értéke (nem void!!!) Példánkban: struct Valami int x; Valami(); // konstruktor deklarációja ; Valami::Valami() // konstruktor definíciója x = 0; printf("konstruktor\n"); // demonstráció A C++ programozási nyelv Soós Sándor 16/37

Hogyan működik most a programunk? Ha deklarálunk egy Valami típusú változót, akkor automatikusan lefut a konstruktor: void main() Valami v; // itt lefut a konstruktor! A fordítóprogram helyettünk dolgozik. Amikor létrejön egy új struktúra, akkor megnézi, hogy létezik-e konstruktora. Ha igen, akkor annak meghívását automatikusan beleteszi a kódba. A C++ programozási nyelv Soós Sándor 17/37

A new operátor Mi a helyzet a dinamikusan allokált struktúrák esetén? malloc függvény helyett new operátor A new operátor: lefoglalja a memóriát lefuttatja a konstruktort visszaadott érték Például: NULL, ha nem sikerült a memóriafoglalás egyébként egy pointer, ami az új struktúrára mutat void main() Valami *vp; vp = new Valami; A C++ programozási nyelv Soós Sándor 18/37

Destruktorok A konstruktor párja A struktúra megszűnésekor elvégzendő tevékenységek file-ok lezárása memória felszabadítás hálózati kapcsolatok lezárása C-ben: írhatunk egy függvényt a struktúra felszámolása előtt meghívjuk ezt a függvényt ugyanazok a veszélyek fennállnak, mint az inicializáló függvény esetében C++ destruktor A C++ programozási nyelv Soós Sándor 19/37

A destruktor fogalma C++ -ban Hogyan ismeri meg a rendszer a destruktort? neve: ~ jel + a struktúra neve (~: jobb oldali Alt + 1) nincs visszatérő értéke (nem void!!!) A C++ programozási nyelv Soós Sándor 20/37

A destruktor fogalma C++ -ban (folyt.) Példa: struct Valami int x; Valami(); ~Valami(); ; // konstruktor deklarációja // destruktor deklarációja Valami::Valami() // konstruktor definíciója x = 0; printf("konstruktor\n"); // demonstráció Valami::~Valami() // destruktor definíciója printf("destruktor\n"); // demonstráció A C++ programozási nyelv Soós Sándor 21/37

A destruktor fogalma C++ -ban (folyt.) A főprogram: void main() Valami v; A program kimenete a következő lesz: Konstruktor Destruktor A C++ programozási nyelv Soós Sándor 22/37

A delete operátor A new operátor párja C-ben a free függvénnyel szabadítjuk fel a dinamikusan foglalt tárterületet C++ -ban a delete operátorral szabadítjuk fel a new operátorral létrehozott objektumokat delete operátor meghívja a destruktort felszabadítja az objektum által foglalt tárterületet A C++ programozási nyelv Soós Sándor 23/37

new és delete operátor példaprogram void main() Valami *vp; printf("new előtt\n"); vp = new Valami; // meghívja a konstruktort... delete vp; // meghívja a destruktort printf("delete után\n"); Az eredmény: new előtt Konstruktor Destruktor delete után A C++ programozási nyelv Soós Sándor 24/37

Hozzáférési hatáskörök szabályozása Adatelrejtés: minden adattagról és tagfüggvényről eldönthetjük, hogy ki férhet hozzá. private csak az osztály tagfüggvényei férhetnek hozzá class esetében ez az alapértelmezés public minden külső függvény hozzáférhet az adott taghoz struct esetében ez az alapértelmezés protected később, az öröklődéskor fogunk róla beszélni mint a private, de a leszármazottak tagfüggvényei hozzáférhetnek A C++ programozási nyelv Soós Sándor 25/37

A private hozzáférés Vegyük a korábbi példánkat: struct Valami private: int x; void f1(); ; void main() Valami v; v.x = 7; // ez hiba! De: void Valami::f1() x = 7; // ez rendben van, mert f1 tagfüggvény! A C++ programozási nyelv Soós Sándor 26/37

A private hozzáférés (folyt.) Nem csak adattag lehet private, hanem tagfüggvény is: struct Valami public: void PublikusFv(); // public függvény private: void PrivatFv(); // private függvény ; void Valami::PrivatFv() printf("privatfv"); void Valami::PublikusFv() PrivatFv(); // Ez szabályos Ekkor: void main() Valami v; v.publikusfv(); // ez rendben van! v.privatfv(); // ez hiba, private fv. itt nem látszik A C++ programozási nyelv Soós Sándor 27/37

A private hozzáférés (folyt.) Hogyan férhetünk hozzá a private adattagokhoz? Az osztály tagfüggvényeiből közvetlenül A külvilág számára írhatunk olyan public tagfüggvényeket, amelyek szabályozott módon engednek hozzáférést a private adattagokhoz. Példa a következő dián A C++ programozási nyelv Soós Sándor 28/37

A private hozzáférés (folyt.) struct Valami int GetX(); // az x-et kiolvasó függvény void SetX(int ax); // az x-et beállító függvény private: int x; ; int Valami::GetX() return x; void Valami::SetX(int ax) x = ax; // ez engedélyezett void main() Valami v; int a; v.setx( 10 ); a = v.getx(); A C++ programozási nyelv Soós Sándor 29/37

Mire jó ez az egész? Miért korlátozza magát a programozó a private tagokkal? 1. példa: Készítsünk egy listát egész számok tárolására! Ehhez definiáljuk a következő struktúrát: struct Lista int Tomb[100]; int N_Elemek; Miért veszélyes ez? A struktúrát használó programozónak tisztában kell lennie a használat módjával: nem tehet 100-nál több elemet a listába megfelelően léptetni kell az N_Elemek mezőt, stb. Ha úgy döntünk, hogy megváltoztatjuk a használt adatszerkezetet, akkor a teljes programot módosítani kell. A megoldás: Rejtsük el a külvilág elől az adatstruktúra belsejét (private). A C++ programozási nyelv Soós Sándor 30/37

Mire jó ez az egész? Miért korlátozza magát a programozó a private tagokkal? 2. példa: Nem a teljes adatszerkezetet változtatjuk, csak az adattípust. Egy üzlet adatait kezeljük egy programmal. Tegyük fel, hogy először forintban tartjuk nyilván az árakat. Nem kezelünk filléreket, ezért az áru árát egész típusú változóban tároljuk. Később áttérünk eurora, ezért szükség van a centek tárolására is. Ehhez módosítanunk kell a belső adattípust, de például a havi és éves forgalmi adatokat visszaadó függvényeket nem kell módosítani, azok maradhatnak egész típusúak. A C++ programozási nyelv Soós Sándor 31/37

Mire jó ez az egész? Miért korlátozza magát a programozó a private tagokkal? 3. példa: Bizonyos esetekben csak együtt változhat meg két vagy több adatmező, vagy csak több mező felhasználásával lehet visszaadni egy értéket. Az előző üzleti példában egy áru eladását be kell jegyezni az eladások listájába, ugyanakkor csökkenteni kell az árukészletet is. Ha ezeket külön-külön kell elvégeznie a programozónak, akkor fennáll a veszélye, hogy nem lesz szinkronban a két adatbázis. Ennek elkerülésére írhatunk egy Eladás tagfüggvényt, ami elvégzi mindkét műveletet. A C++ programozási nyelv Soós Sándor 32/37

Mire jó ez az egész? Miért korlátozza magát a programozó a private tagokkal? 4. példa: Vannak esetek, amikor csak bizonyos szabályok betartásával szabad beállítani egy mező értékét. Vannak olyan azonosító kódok, amelyek nem lehetnek tetszőlegesek. Ilyenek például a TAJ szám, vagy a hajdan volt személyi szám. Ezek egy ellenőrző algoritmust tartalmaznak, amivel egy adott számról eldönthető, hogy helyes-e. Ha ezt a mezőt private-tá tesszük és csak egy tagfüggvénnyel engedünk hozzáférést, akkor biztosíthatjuk, hogy mindig csak hibátlan adatok kerülhessenek az adatbázisba. A C++ programozási nyelv Soós Sándor 33/37

Az információrejtés elve adatbezárás, encapsulation A tényleges, fizikai tárolást végző adatszerkezetet elrejtjük a struktúra belsejébe (private adattagok) Publikus tagfüggvényként azokat a műveleteket deklaráljuk, amelyek megvalósítják a struktúra szolgáltatásait. Például új elem hozzáadása, törlés stb. Ily módon a struktúra egy szolgáltatóvá válik, amitől szolgáltatásokat lehet kérni, de hogy azt hogyan hajtja végre, azt nem kell tudnia a felhasználónak. Természetesen mindez alapos tervezést, kísérletezést igényel! Az objektum-orientált tervezést is meg kell tanulni! Ha azonban egyszer megtanultuk ezt a gondolkodás módot, akkor el sem tudjuk képzelni, hogy eddig hogyan gondolkoztunk és programoztunk másképp. A C++ programozási nyelv Soós Sándor 34/37

Öröklődés, örököltetés Ezzel a témakörrel külön előadásokon fogunk foglalkozni. Egyelőre annyit jegyezzünk meg róla, hogy ez az objektumorientált nyelvek talán legfontosabb újítása a "hagyományos" nyelvekhez képest. Röviden arról van szó, hogy egy struktúra, illetve osztály definiálásakor felhasználhatjuk egy már meglévő osztály tulajdonságait. Az új, ún. leszármazott osztály örökli az ősosztály tulajdonságait (adatmezőit és tagfüggvényeit). Ráadásul ezt anélkül tudjuk megtenni, hogy hozzáférnénk az eredeti osztály forráskódjához. A leszármazott osztály az örökölt tulajdonságokat módosíthatja és újakat is hozzájuk tehet. A C++ programozási nyelv Soós Sándor 35/37

Hogyan tovább? Mire van szükség az objektum-orientált programozás elsajátításához? a nyelvi eszközök megtanulására az eszközök célszerű használatának megtanulására A nyelvvel kapcsolatban megtanulandó témakörök: A C++, illetve az objektum-orientált írásmód megszokása A program működésének megértése összetett struktúrák esetében milyen sorrendben futnak le a konstruktorok, destruktorok mikor generál a fordítóprogram önállóan egy függvényt (konstruktort, másoló operátort) mi történik egy kivétel kiváltásakor, stb. A hozzáférési jogosultságok alapos megértése, különösen az örökléssel kapcsolatban A C++ esetében különösen fontos feladat a dinamikus memóriakezelés megértése! A C++ programozási nyelv Soós Sándor 36/37

Mi a megoldás! Folytonosan legyünk tisztában azzal, hogy kétféle területen kell előrehaladnunk: a nyelv megismerésében, illetve a programtervezés módszereinek elsajátításában. Egy adott feladatra szinte mindig érdemes többféle megoldást kipróbálni, pl. először szabad függvénnyel, aztán tagfüggvénnyel valósítjuk meg az adott funkciót; egyszer örököltetést, egyszer kompozíciót (struktúrák egymásba ágyazását) használunk, stb. Legjobban összehasonlításokon keresztül ismerhetők meg az eszközök! A hozzáférési jogosultságokat érdemes először lazán (public) hagyni, majd amikor egy-egy programrész már kialakult, lépésenként elrejteni a tagokat. Ha már a kezdet kezdetén sok private tagot definiálunk, nagyon nehézzé, áttekinthetetlenné válnak az első kísérletező lépések. Induljunk ki egy olyan (pl. kevésbé objektum-orientált) megoldásból, amelyet eddigi tapasztalataink alapján meg tudunk írni és próbáljuk meg lépésenként átalakítani! Ne keseredjünk el (nagyon), ha nehéznek érezzük ezt a témát. Tényleg az. A C++ programozási nyelv Soós Sándor 37/37