Gpszeti informatika BMEGEMIBXGI 5 Laboratriumi foglalkozs Fink Nndor
Gépészeti informatika (BMEGEMIBXGI) 5. Laboratóriumi foglalkozás Fink Nándor
Elmélet: Memóriakezelés: • Verem (Stack): LIFO (Last In First Out) adatkezelési stratégia. Úgy működik, mintha egy verembe pakolnánk be dolgokat. Az első elemet belehelyezzük, majd ennek „tetejére” rakjuk a másodikat, és így tovább. Ha ki szeretnénk venni belőle valamelyik elemet, akkor azt csak úgy tehetjük meg, hogy először leszedjük szépen sorban a többi, rajta lévő elemet. Tehát az elemet tudjuk elsőként kiszedni, amelyik utoljára került a verembe. • Halom (Heap): A fordító által lefoglalt nyers memóriaterület. A bonyolultabb elemek, mint például referencia típusok tárolására használjuk. Reiter I. 25 – 30 oldal
Elmélet: • Érték típus: Amikor egy érték típusra hivatkozunk, akkor a fordító ténylegesen annak értékét fogja felhasználni. Tehát: int x = 1; int y = x; Esetén x és y két különálló memóriaterületen lesz eltárolva, és mindkét terület értéke 1 lesz. Ezután x és y különálló változók lesznek, értékük egymástól függetlenül módosítható lesz! Ide sorolhatóak a numerikus (int, double. . )-, felsorolás (enum)-, logikai (bool)-, karakter (char) típusok és a struktúrák (struct). Reiter I. 25 – 30 oldal
Elmélet: • Referencia típus: Amikor egy referencia típusra hivatkozunk, akkor a fordító egy úgynevezett álnevet (alias) hoz létre. Minden System. Object-ből származó típus, a stringek és az osztályok (class) tartoznak ide. Másolásuk esetén (példányosítás, még nem tanultuk): Saját. Osztály példány 1 = new Saját. Osztály(); Saját. Osztály példány 2 = példány 1; példány 2 és példány 1 egy és ugyanazon objektum elnevezései lesznek. (Tehát itt nem az történik, hogy „lemásolom” az értékeit, és két különálló „változót” kapok. ) Látszólag „bármelyik” példányt módosítom, „mindkét” példány változni fog, valójában viszont csak példány 1 van, példány 2 pedig megmutatja, hogy példány 1 hol található a memóriában. (Nem összekeverendő a pointerekkel. Egy pointer egy bizonyos memóriacímre mutat, az objektumunk megszűnése után is ugyan oda mutatna. A referencia viszont ugyanúgy null-értékre fog hivatkozni. ) Reiter I. 25 – 30 oldal
Elmélet: Értéktípusok tárolása: Cél a kis memóriafoglalás, ezért nem tartalmaznak típusinformációt, metódustáblát stb. Mi történik, ha ki akarok íratni pl. egy egész számot egy labelre? private void button 1_Click(object sender, Event. Args e) { int a = 3; label 1. Text += a; } A fordító meghívja, a To. String metódust, ami string-é, szöveggé alakítja a-t, és hozzáfűzi a label Text tulajdonságához. A To. String metódust a System. Object deklarálja, tehát minden referenciatípus rendelkezni fog vele, de az értéktípusok nem. Emellett szüksége van a konvertálni kívánt változó típusára (ilyen adatot nem tárol az értéktípus). A konvertálás előtt tehát el kell látni az érték típusú változónkat a megfelelő információkkal, gyakorlatilag egy referencia típusú objektummá kell alakítanunk, és ez történik dobozoláskor. Kiíratás Stringgé konvertálás metódusa Dobozolás Érték Reiter I. 25 – 30 oldal
Elmélet: Osztályok felépítése: • MEZŐ : tulajdonságokat tároló változók • FELÜLET: metódusok (műveletek) Az osztály definiálása még nem jelenti az objektum létrehozását. Tekintsünk rá úgy, mint egy receptre. Tartalmazza a szükséges információkat az étel elkészítéséhez, de nem tudjuk megenni. Ahhoz, hogy valóban dolgozhassunk, műveleteket végezhessünk vele előbb példányosítanunk (instance) kell. Azaz az osztályunkban definiáltaknak megfelelően létrehozunk egy objektum példányt. A példányosítás az úgynevezett konstruktor segítségével történik, amely egy olyan metódus, ami felépíti az objektumunk vázát (definiálja a metódusokat, deklarálja a változókat) és adott esetben beállítja a kezdőértékeket. Osztálynév objektumnév = new Osztálynév(); C# 37 -37 oldal
Struktúrák: • Értéktípusú, felhasználói adattípus. • Nincs rá értelmezve az öröklés és a polimorfizmus. • Konstruktorírás: Ø Alapértelmezett konstruktora mindig létezik, ezt nem írhatjuk felül. Ø Konstruktor készítése esetén minden adattag inicializálása kötelező. Ø Ha a konstruktorban alkalmazott formális paraméterek nevei egyeznek a struktúra paramétereinek nevével, akkor a this. név jelöli a struktúra paramétereit. Ø A konstruktorok egymást is hívhatják: Public Konstruktor(int a): this(a, a) {} Itt az egy argumentummal rendelkező konstruktor meghívja a két argumentummal rendelkezőt. (Ez után persze definiálni kell a két argumentumú konstruktort. ) C# könyv 37 -55 oldal
struct Komplex { // Alapértelmezetten private lesz, ami másik osztályból NEM elérhető public double Re; public double Im; //Konstruktorok public Komplex (double Im. Re) : this (Im. Re, Im. Re) { } } public Komplex (double Re, double Im) { this. Re = Re; this. Im = Im; Definiáltunk egy „Komplex” nevű struktúrát } hierarchikus elhelyezkedése: namespacen belül private void button 1_Click(object sender, Event. Args e) { Komplex c = new Komplex(); Példányosítás c. Re = 15; c objektum tulajdonságainak értékadás c. Im = 22; label 1. Text = String. Format("{0} + {1} * i", c. Re, c. Im); }
Tömbök: Tömbök deklarálása: típus [] név = new típus [méret]; // Deklarálás: int [] vektor = new int [3]; // vektor néven létrehoztunk egy 3 elemű tömböt // Értékadás: vektor [0]=1; vektor [1]=2; vektor [2]=3; // Deklarálás kezdeti értékkel: int [] vektor = {1, 2, 3}; // Többdimenziós tömb: int [ , ] vektor = new int [3, 2]; // 3 * 2 mátrix
Tömbök: • A tömbök lehetnek egydimenziósak, ilyenkor vektorként képzelhetjük el őket. • Elemein forciklussal mehetünk végig, indexelésük minden esetben 0 -tól kezdődik: for (int i=0; i<tomb. Length; i++) { tomb[i] = i; } i=0 0 i=1 1 2 i=2
Tömbök: • A tömbök lehetnek kétdimenziósak, ilyenkor mátrixként képzelhetjük el őket. • Elemein 2 egymásbaágyazott forciklussal mehetünk végig, indexelésük itt is 0 -tól kezdődik: for (int i=0; i<tomb. Get. Length(0); i++) { i=0 j=0 i=0 j=1 i=0 j=2 i=1 j=0 i=1 j=1 i=1 j=2 i=2 j=0 i=2 j=1 i=2 j=2 } 0 1 2 10 11 12 20 21 22 for (int j=0; j<tomb. Get. Length(1); j++) { tomb[i, j] = i*10+j ; }
Tömbök: • A tomb. Length tulajdonság a tömb nagyságát adja vissza. Ez szolgálhat a futóparaméterünk maximumának definiálására egydimenziós tömbök esetében, azonban a kétdimenziós tömb esetén (pl. tomb[3, 3] esetén 3*3=9) az indexelésünk így definiálva kivezetne a tömbünk határaiból. • Többdimenziós tömbök esetén a tomb. Get. Length(dimenzió) metódussal kérdezhetünk rá az egyes dimenzióinak a nagyságára. • A tömbök metódusoknak átadva minden esetben, és alapvetően referenciaként viselkednek, hiszen referencia típusok. (Így értékként átadni nem lehetséges őket, külön referenciaként pedig ( Metódus(ref tomb) ) felesleges, és hozzá nem értést tükröz. )
Felhasznált irodalom • http: //www. mogi. bme. hu/letoltes/ALKALMAZOT T%20 INFORMATIKAI%20 TÁRGYAK/INFORMATIKA I%20 RENDSZEREK%202015/C%23. pdf • http: //www. mogi. bme. hu/letoltes/ALKALMAZOT T%20 INFORMATIKAI%20 TÁRGYAK/INFORMATIKA I%20 RENDSZEREK%202015/C_%20 programozás% 20 lépésről%20 lépésre%20%20 Reiter%20 István%20(frissitett%20 tartalomm al%202012. 10. 15). pdf • Dr. Tamás Péter óravázlatai • Microsoft Visual Studio 2013 súgója
Köszönöm a megtisztelő figyelmet!
- Slides: 14