10. gyakorlat Struktúrák, uniók, típusdefiníciók
Házi - (f0218) Olvass be 5 darab maximum 99 karakter hosszú szót úgy, hogy mindegyiknek pontosan annyi helyet foglalsz, amennyi kell! A sztringeket írasd ki, majd szabadítsd fel a lefoglalt területet! (Természetesen beolvasáskor használhatsz egy átmeneti tárolót.)
Házi - (f0230) Egy számsorozat negatív és nemnegatív elemeit kell szétválogatni. A program inputja egy A számsorozat "(n)[a_1,...,a_n]" alakban megadva. A kimenet első sora az A negatív elemeiből, a második sora az A nemnegatív elemeiből képzett számsorozat, az inputhoz hasonló formában megadva. A két részsorozatban az elemek sorrendje megegyezik az eredeti sorozatban megadott sorrendjükkel.
Feladat (f0187) Fordítsd le és futtasd a rekordok.c programot. Figyeld meg és magyarázd el, mi a különbség a struct és a union között! Most alakítsd át a programot úgy, hogy előbb hajtsd végre az összes értékadást, és csak utána a kiíratásokat. Most mit tapasztalsz? Miért? Minden egyes kiíratáskor írasd ki az éppen kiírt mező kezdőcímét is. Mit tapasztalsz?
Struktúrák Eddig adatokat két módon tárolhattunk Változókban: egy típusa lehet, előre meg kell adni és egyszerre egy értéket tárolhat Tömbökben: egy típusa lehet, előre meg kell adni, viszont egyszerre több (előre megadott) számú értéket tárolhat A gyakorlatban sokszor előfordul, hogy logikailag összetartozik több adat, azok viszont nem azonos típusúak mit tehetünk ilyenkor?
Struktúrák Tárolhatjuk az elemeket egy-egy megfelelő típusú tömbben, és valahogy számon tartjuk őket, mi tartozik össze Pl. ha egy személy adatait akarjuk tárolni, akkor lehet egy int tömbünk a születési évnek, egy a hónapnak és egy a napnak, egy string tömb (2D char tömb) pedig a neveknek Ennek nehézkes a használata, nem elég átlátható A struktúra arra való, hogy összekapcsoljon különböző típusú, de logikailag összetartozó adatokat egy egységbe
Uniók Az uniók nagyon hasonlítanak a struktúrára, azaz Logikailag összetartozó, de különböző típusú értékeket tárolnak egyben Azonban nem foglal a rendszer minden tulajdonságnak külön memóriát, hanem egy helyen kezdődnek kevesebb helyet foglal egyszerre csak az egyiket használhatjuk
Struktúrák - létrehozása Létrehozás struct szemely { char nev[40]; int kor; int nem; }; Ezután a struct szemely utasítást egy új típusként használhatjuk: struct szemely user;
Struktúrák - typedef Szebbé tehetjük typedef haszálatával typedef struct szemely { } szemely; Ekkor a létrehozás: szemely user; a struct utáni és az utolsó szónak nem kell megegyezni, az utóbbi lesz a típusnév
Struktúrák - mezőhivatkozás Egy struktúra tulajdonságait mezőknek, elemeknek, attribútumoknak nevezhetjük Ezeket a. operátorral érhetjük el user.kor = 20; Ha a struktúra pointer, akkor. Helyett a -> operátort kell használni
Struktúra - mezők inicializálása A struktúra tulajdonságait megadhatjuk deklarációkor, mint egy tömb elemeit szemely user = {.nev = Admin,.kor = 20};
Struktúra egymásba ágyazhatóság Egy struktúrában egy tulajdonság lehet másik struktúra/unió is Deklarálhatjuk helyben is struct my_struct { int k; union {int i, j; } inner; }; struct my_struct s = {.inner.i = 3,.k = 5}; Anonim módon is struct my_struct { int k; union {int i, j; }; }; struct my_struct s = {.i = 3,.k = 5};
Feladat (f0181) Írj egy programot ami három oldalhosszból kiszámítja egy háromszög kerületét és területét! A számítást egyetlen függvény végezze, a főprogram csak a bemenetkimenetért feleljen. A terület és kerület tárolására hozz létre egy struct adattípust, a számítást végző függvény egy ilyen típusú értékkel térjen vissza. Hérón képlet
Feladat (f0182) - önállóan Írj egy programot ami három kétdimenziós koordináta-párból kiszámítja egy háromszög kerületét és területét! Az érdemi számításokat függvények végezzék, a főprogram csak a bemenet-kimenetért feleljen. A kétdimenziós pont tárolására, valamint a terület és kerület együttes tárolására is hozz létre struct adattípusokat, és a számítást végző függvények ezeket használják (ahol ez lehetséges). Euklideszi távolság
Feladat (f0222) Egészítsd ki a matrixszorzas-1d.c programot a foglal() és megszuntet() függvények implementációjával úgy, hogy a program helyesen lefusson. A többi függvényt ne módosítsd! A cim() függvényből következtess vissza, hogy hogyan tárolódnak a mátrix értékei.
Feladat (f0223) Egészítsd ki a matrixszorzas-2d.c programot a foglal() és megszuntet() függvények implementációjával úgy, hogy a program helyesen lefusson. A többi függvényt ne módosítsd! A cim() függvényből következtess vissza, hogy hogyan tárolódnak a mátrix értékei. Hasonlítsuk össze az előző megoldással. Milyen különbségeket láttunk?
Feladat (f0227) Számítsuk ki egy mátrix skalárral való szorzatát. A program inputja egy s valós szám (a skalár), a mátrix mérete "(n,m)" alakban (ahol n a sorok, m az oszlopok száma), majd a mátrix valós elemei sorfolytonosan "[a_11,a_12,...,a_1m,a_21,...,a_n1,...,a_nm]" alakban. A program kimenete a skalárszorzás eredménye az input mátrixhoz hasonló "(n,m)[b_11,b_12,...,b_1m,b_21,...,b_n1,...,b_nm]" alakban. Dinamikus memóriafoglalással dolgozzunk.
Következő ZH-k A jövő heti ZH-n tömbös algoritmikus és szemantikai hibajavító feladatok lesznek. A két héttel ezután következő (azaz utolsó) zh-n struktúrákkal kapcsolatos algoritmikus és 1 illetve 2 dimenziós dinamikus tömbfoglalással kapcsolatos feladatok lesznek.