Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Hasonló dokumentumok
Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 15. Széchenyi István Egyetem, Gy r

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós szeptember 27. Széchenyi István Egyetem, Gy r

A C programozási nyelv III. Pointerek és tömbök.

Programozás I gyakorlat

A C programozási nyelv III. Pointerek és tömbök.

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

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 31. Széchenyi István Egyetem, Gy r

1. Alapok. Programozás II

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

5. Gyakorlat. struct diak {

8. gyakorlat Pointerek, dinamikus memóriakezelés

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Programozás C nyelven (10. ELŐADÁS) Sapientia EMTE

Programozás I gyakorlat

Programozás C nyelven (10a. ELŐADÁS) Sapientia EMTE

Pénzügyi algoritmusok

Programozas 1. Strukturak, mutatok

Programozás C++ -ban

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

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

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

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

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

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

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

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

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

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Mutatók és mutató-aritmetika C-ben március 19.

5. gyakorlat. Konstansok Tömbök Stringek

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

OOP #14 (referencia-elv)

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

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

C++ programozási nyelv Konstruktorok Gyakorlat

Programozás I gyakorlat. 10. Stringek, mutatók

Pénzügyi algoritmusok

Bevezetés a programozásba I.

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Programozási Nyelvek: C++

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Készítette: Nagy Tibor István

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

Maximum kiválasztás tömbben

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16.

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

Programozás 6. Dr. Iványi Péter

10. gyakorlat. Pointerek Tárolási osztályok

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

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

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

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

3. ZH-ban a minimum pontszám 15

3. Osztályok II. Programozás II

Bevezetés a programozásba. 5. Előadás: Tömbök

A C# programozási nyelv alapjai

Java II. I A Java programozási nyelv alapelemei

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

Mintavételes szabályozás mikrovezérlő segítségével

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

Felhasználó által definiált adattípus

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)

1. Jelölje meg az összes igaz állítást a következők közül!

Bevezetés a C++ programozási nyelvbe

ő ű É Ó Ü É É É É Ü Ö É É É ű É Ö É Ü É Ú Ó ő Ó

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

C string műveletek (string.h alkalmazása)

Bevezetés a programozásba Előadás: A const

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

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

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

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

C++ programozási nyelv Konstruktorok-destruktorok

Programozás I gyakorlat

Java II. I A Java programozási nyelv alapelemei

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

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

500. AA Megoldó Alfréd AA 500.

Programozási nyelvek Java

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

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

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

A TANTÁRGY ADATLAPJA

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

117. AA Megoldó Alfréd AA 117.

Smalltalk 2. Készítette: Szabó Éva

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

Memóriakezelés, dinamikus memóriakezelés

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

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Programozás II gyakorlat. 6. Polimorfizmus

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Érdekes informatika feladatok

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

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

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.

Átírás:

Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. április 4.

Számok rendezése Feladat: Fejlesszük tovább úgy a buborék rendez algoritmust bemutató példát, hogy a felhasználó adhassa meg a rendezend adatokat! (Adatbevitelnek vége negatív adatra.) Nem adhat meg több számot, mint a tömb elemszáma! Problémák: Fordítási id ben tudni kellene a rendezend adatok számát Túl kicsi tömb nem férnek el az adatok Túl nagy tömb pazaroljuk a memóriát Inkább nagyobb legyen a tömb, mint túl kicsi!

Számok rendezése Kimenet1 Adjon meg nemnegativ szamokat! 1. szam: 2 2. szam: 4 3. szam: 1 4. szam: 3 5. szam: -1 Rendezes utan: 1 2 3 4 Kimenet2 Adjon meg nemnegativ szamokat! 1. szam: 5 2. szam: 4 3. szam: 3 4. szam: 2 5. szam: 1 Rendezes utan: 1 2 3 4 5

Számok rendezése 3 #d e f i n e OSSZES 5 37 i n t main ( ) { 38 i n t h a s z n a l ; // E n n y i e l e m e t h a s z n a l u n k eppen 39 i n t szamok [ OSSZES ] ; 40 c o u t << " Adjon meg n e m n e g a t i v szamokat! \ n" ; 41 b e o l v a s ( szamok, &h a s z n a l ) ; 42 b u b o r e k ( szamok, h a s z n a l ) ; 43 c o u t << " R endezes utan : \ n" ; 44 t o m b K i i r ( szamok, h a s z n a l ) ; 45 r e t u r n 0 ; 46 }

Számok rendezése 5 v o i d b e o l v a s ( i n t szamok, i n t h a s z n a l ) { 6 i n t u j ; 7 h a s z n a l = 0 ; 8 do { 9 c o u t << h a s z n a l + 1 << ". szam : " ; 10 c i n >> u j ; 11 i f ( uj >=0 and h a s z n a l <OSSZES) { 12 ( szamok + h a s z n a l ) = u j ; 13 ( h a s z n a l )++; 14 } 15 } w h i l e ( uj >=0 and h a s z n a l <OSSZES ) ; 16 }

Dinamikus memóriakezelés Dinamikus memóriakezelés A programozó dönt a dinamikus változók élettartamáról Memória foglalás: new operátorral Visszaadott mutató típusa: mindig megfelel, nincs szükség típuskényszerítésre Sikertelen memóriafoglalás esetén NULL értéket kapunk ellen rizni kell Terület felszabadítása: delete Ugyanaz a terület nem szabadítható fel többször NULL mutató felszabadítása nem okoz gondot

Dinamikus memóriakezelés 5 char pc ; // d e k l a r a c i o k 6 i n t p i ; 7 double pd ; 8 9 pc = new char ; // m e m o r i a f o g l a l a s o k 10 p i = new i n t ; 11 pd = new double ; 12 13 i f ( pc == NULL) { // e l l e n o r z e s 14 c e r r << " S i k e r t e l e n m e m o r i a f o g l a l a s! \ n" ; 15 r e t u r n 1 ; 16 }

Dinamikus memóriakezelés 18 pc = 'X ' ; // e r t e k a d a s o k 19 p i = 4 2 ; 20 pd = 3. 1 4 ; 21 22 d e l e t e pc ; // memoria f e l s z a b a d i t a s 23 d e l e t e p i ; 24 d e l e t e pd ; A lefoglalt terület inicializálható 9 pc = new char ( 'X ' ) ; // m e m o r i a f o g l a l a s o k 10 p i = new i n t ( 4 2 ) ; // i n i c i a l i z a c i o k 11 pd = new double ( 3. 1 4 ) ;

Dinamikus memóriakezelés Struktúráknak is foglalható memória dinamikusan, amit akár inicializáció is követhet 4 s t r u c t h a l l g a t o { 5 s t r i n g nev ; 6 i n t e l e t k o r ; 7 } ; 10 h a l l g a t o h = { " G i z i ", 19 } ; // L o k a l i s v a l t o z o 11 h a l l g a t o ph1 = new h a l l g a t o ; // Memoria f o g l a l a s 12 ph1 >nev = " Mari " ; // E r t e k a d a s o k 13 ph1 >e l e t k o r = 2 0 ; 14 // Mar l e z e t o s t r u k t u r a v a l i n i c i a l i z a l h a t o 15 h a l l g a t o ph2 = new h a l l g a t o ( h ) ; 16 h a l l g a t o ph3 = new h a l l g a t o ( ph1 ) ; 17 h a l l g a t o ph4 = new h a l l g a t o { " L i l i ", 21 } ; // C++11

Dinamikus memóriakezelés Tömböknek is lehet dinamikusan memóriát foglalni 7 c h a r pc = new c h a r [ 1 0 ] ; // Tomb f o g l a l a s a 8 // F u t a s i d o b e n k i s z a m o l t meret sem okoz gondot 9 s r a n d ( t i m e (NULL ) ) ; 10 i n t p i = new i n t [ rand ( ) % 5 0 ] ; 11 d o u b l e pd = new d o u b l e [ 1 0 0 ] ; 12 13 // B e e p i t e t t t i p u s o k b o l a l l o tomb 14 // nem i n i c i a l i z a l h a t o : ( 15 16 d e l e t e [ ] pc ; // F e l s z a b a d i t a s 17 d e l e t e [ ] p i ; 18 d e l e t e [ ] pd ;

Számok rendezése 37 i n t main ( ) { 38 i n t h a s z n a l ; // E n n y i e l e m e t h a s z n a l u n k eppen 39 i n t szamok = new i n t [ OSSZES ] ; 40 c o u t << " Adjon meg n e m n e g a t i v szamokat! \ n" ; 41 b e o l v a s ( szamok, &h a s z n a l ) ; 42 b u b o r e k ( szamok, h a s z n a l ) ; 43 c o u t << " R endezes utan : \ n" ; 44 t o m b K i i r ( szamok, h a s z n a l ) ; 45 d e l e t e [ ] szamok ; 46 r e t u r n 0 ; 47 }

Számok rendezése Megjegyzések Javaslat A megoldás nem használta ki, hogy futásid ben is eldönthet a tömb elemszáma A lefoglalt terület felszabadítható, másik is foglalható Foglaljunk valamennyi memóriát a program indulásakor, majd ha elfogyott, mindig növeljük a területet a duplájára! Régi adatokat át kell mozgatni az új helyükre

Számok rendezése 49 i n t main ( ) { 50 i n t h a s z n a l ; // E n n y i e l e m e t h a s z n a l u n k eppen 51 i n t szamok ; // Tomb cime 52 c o u t << " Adjon meg n e m n e g a t i v szamokat! \ n" ; 53 szamok = b e o l v a s (& h a s z n a l ) ; 54 b u b o r e k ( szamok, h a s z n a l ) ; 55 c o u t << " R endezes utan : \ n" ; 56 t o m b K i i r ( szamok, h a s z n a l ) ; 57 d e l e t e [ ] szamok ; 58 r e t u r n 0 ; 59 }

Számok rendezése 4 i n t b e o l v a s ( i n t h a s z n a l ) { 5 i n t uj, o s s z e s = 1 ; 6 i n t szamok = new i n t [ o s s z e s ] ; 7 h a s z n a l = 0 ; 8 do { 9 c e r r << "\ t [ F e l h a s z n a l v a : " << h a s z n a l 10 << ", tombelemek szama : " << o s s z e s << " ] \ n" ; 11 c o u t << h a s z n a l + 1 << ". szam : " ; c i n >> u j ; 12 i f ( u j >= 0) { 13 i f ( h a s z n a l == o s s z e s ) { 14 c e r r << "\ t [ M e m o r i a f o g l a l a s + mozgatas ] \ n" ; 15 o s s z e s = 2 ; 16 i n t szamok2 = new i n t [ o s s z e s ] ; 17 f o r ( i n t i =0; i < h a s z n a l ; i ++) { 18 szamok2 [ i ] = szamok [ i ] ; 19 }

Számok rendezése 20 d e l e t e [ ] szamok ; 21 szamok = szamok2 ; 22 } 23 szamok [ h a s z n a l ] = u j ; 24 ( h a s z n a l )++; 25 } 26 } w h i l e ( u j >= 0 ) ; 27 r e t u r n szamok ; 28 }

Számok rendezése Kimenet Adjon meg nemnegativ szamokat! [Felhasznalva: 0, tombelemek szama: 1] 1. szam: 9 [Felhasznalva: 1, tombelemek szama: 1] 2. szam: 8 [Memoriafoglalas + mozgatas] [Felhasznalva: 2, tombelemek szama: 2] 3. szam: 7 [Memoriafoglalas + mozgatas] [Felhasznalva: 3, tombelemek szama: 4] 4. szam: 6 [Felhasznalva: 4, tombelemek szama: 4] 5. szam: 5 [Memoriafoglalas + mozgatas] [Felhasznalva: 5, tombelemek szama: 8] 6. szam: 4 [Felhasznalva: 6, tombelemek szama: 8] 7. szam: 3 [Felhasznalva: 7, tombelemek szama: 8] 8. szam: 2 [Felhasznalva: 8, tombelemek szama: 8] 9. szam: 1 [Memoriafoglalas + mozgatas] [Felhasznalva: 9, tombelemek szama: 16] 10. szam: 0 [Felhasznalva: 10, tombelemek szama: 16] 11. szam: -1 Rendezes utan: 0 1 2 3 4 5 6 7 8 9

Téglalapok rajzolása Alakítsuk ár a téglalap rajzoló programot is hasonlóan, de most mindig ugyanannyival növeljük a tömb méretét, ha elfogy a hely a tömböt lefoglaló és feltölt függvény adja vissza az elemek számát, a tömb címét pedig írja a paraméterként kapott címre! 91 i n t main ( ) { 92 t e g l a l a p t t ; i n t db ; 93 c o u t << " Rajzprogram a d j a meg a t é g l a l a p o k a d a t a i t! \ n" ; 94 db = b e k e r e s (& t t ) ; 95 r a j z o l ( t t, db ) ; 96 d e l e t e [ ] t t ; 97 r e t u r n 0 ; 98 }

Téglalapok rajzolása 58 i n t b e k e r e s ( t e g l a l a p t t ) { 59 i n t db=0, o s s z e s = 2, b f x ; 60 b o o l f o l y t a t ; 61 t t = new t e g l a l a p [ o s s z e s ] ; 62 do { 63 c e r r << "\ t [ F e l h a s z n a l v a : " << db << ", elemszam : " 64 << o s s z e s << " ] \ n" ; 65 f o l y t a t = bekerbfx ( db+1, MINX, MAXX 1, &b f x ) ; 66 i f ( f o l y t a t ) { 67 i f ( db == o s s z e s ) { 68 c e r r << "\ t [ M e m o r i a f o g l a l a s + mozgatas ] \ n" ; 69 o s s z e s += 2 ; 70 t e g l a l a p t t 2 = new t e g l a l a p [ o s s z e s ] ; 71 f o r ( i n t i =0; i <db ; i ++) { 72 ( t t 2+i ) = ( ( t t )+ i ) ; 73 }

Téglalapok rajzolása 74 d e l e t e [ ] t t ; 75 t t = t t 2 ; 76 } 77 ( t t ) [ db ]. b f. x = b f x ; 78 ( t t ) [ db ]. b f. y = b e k e r ( db+1, "BF s a r o k Y", 79 MINY, MAXY 1); 80 ( t t ) [ db ]. j a. x = b e k e r ( db+1, "JA s a r o k X", 81 ( t t ) [ db ]. b f. x +1, MAXX) ; 82 ( t t ) [ db ]. j a. y = b e k e r ( db+1, "JA s a r o k Y", 83 ( t t ) [ db ]. b f. y +1, MAXY) ; 84 c o u t << db+1 << ". t e g l a l a p r a j z o l ó k a r a k t e r e : " ; 85 c i n >> ( t t ) [ db ]. c ; 86 db++; 87 } 88 } w h i l e ( f o l y t a t ) ; 89 r e t u r n db ; 90 }

Téglalapok rajzolása Kimenet 1/2 Rajzprogram - adja meg a téglalapok adatait! [Felhasznalva: 0, elemszam: 2] 1. teglalap BF sarok X: [0, 78] (negativra vege) 0 1. teglalap BF sarok Y[0, 23] 0 1. teglalap JA sarok X[1, 79] 5 1. teglalap JA sarok Y[1, 24] 5 1. teglalap rajzoló karaktere: * [Felhasznalva: 1, elemszam: 2] 2. teglalap BF sarok X: [0, 78] (negativra vege) 2 2. teglalap BF sarok Y[0, 23] 2 2. teglalap JA sarok X[3, 79] 7 2. teglalap JA sarok Y[3, 24] 7 2. teglalap rajzoló karaktere: [Felhasznalva: 2, elemszam: 2] 3. teglalap BF sarok X: [0, 78] (negativra vege) 4 [Memoriafoglalas + mozgatas] 3. teglalap BF sarok Y[0, 23] 4 3. teglalap JA sarok X[5, 79] 9 3. teglalap JA sarok Y[5, 24] 9 3. teglalap rajzoló karaktere: - [Felhasznalva: 3, elemszam: 4] 4. teglalap BF sarok X: [0, 78] (negativra vege) -1 Kimenet 2/2 ****** ****** ** ** ** ------ ** ------ ------ ------ ------ ------

C-stílusú karakterláncok A C nyelv karakterláncai C-ben nincs string típus karakteres tömbök tárolják a jelek ASCII kódjait, a lánc végét a 0 kódú karakter ('\0') jelzi Minden eddig látott karakterlánc literál valójában konstans C karakterlánc (tömb) volt! char str[] = "abc"; Automatikusan bekerül a lánczáró karakter a tömb végére! Karakterláncok kezelése: a cstring (string.h) függvényeivel, pl. size_t strlen(const char *s); hossz lekérdezése char *strcat(char *dest, const char *src); összef zés char *strcpy(char *dest, const char *src); másolás A programozó felel ssége, hogy az eredmény elférjen a dest helyen! C++ string C-karakterlánc: string::c_str()

C-stílusú karakterláncok 1 #i n c l u d e <i o s t r e a m > 2 #i n c l u d e <s t r i n g > 3 #i n c l u d e <c s t r i n g > // s t r l e n, s t r c o p y, s t r c a t 4 u s i n g namespace s t d ; 5 6 v o i d k i i r ( c o n s t char c s t r ) { 7 c o n s t char ment = c s t r ; 8 c o u t << " ASCII : \ t " ; 9 c s t r ; 10 do { 11 c s t r ++; 12 c o u t << i n t ( c s t r ) << ' \ t ' ; 13 } w h i l e ( c s t r!= ' \0 ' ) ; 14 c o u t << "\ nolv. : \ t " ; 15 f o r ( c s t r=ment ; c s t r!= ' \0 ' ; c s t r ++) { 16 c o u t << c s t r << ' \ t ' ; 17 } 18 c o u t << e n d l ; 19 }

C-stílusú karakterláncok 21 i n t main ( ) { 22 k i i r ( "" ) ; 23 k i i r ( "C" ) ; 24 k i i r ( "C s t i l u s " ) ; 25 s t r i n g h = " H e l l o " ; 26 k i i r ( h. c _ s t r ( ) ) ; 27 c h a r v [ ] = " v i l a g! \ n" ; 28 c h a r c s = new c h a r [ h. l e n g t h ( ) + s t r l e n ( v ) + 1 ] ; 29 s t r c p y ( cs, h. c _ s t r ( ) ) ; 30 s t r c a t ( cs, v ) ; 31 c o u t << c s ; 32 d e l e t e [ ] c s ; 33 r e t u r n 0 ; 34 }

C-stílusú karakterláncok Kimenet ASCII: 0 Olv.: ASCII: 67 0 Olv.: C ASCII: 67 45 115 116 105 108 117 115 0 Olv.: C - s t i l u s ASCII: 72 101 108 108 111 0 Olv.: H e l l o Hello vilag!

Mátrixok Mátrix: azonos típusú elemek kétdimenziós tömbje A C++-ban csak egydimenziós tömbök léteznek, de ezeket tetsz leges mélységben egymásba lehet ágyazni! mátrix = vektorokból álló vektor A = 11 12 13 14 21 22 23 24 31 32 33 34 A[1][2] int A[3][4] = { {11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34} }; 0 1 2 m 0 1 2 m 0 1 2 m......... A[0] A[1] A[n]... Mátrixok összeadása: (A + B)[i, j] = A[i, j] + B[i, j], ahol A és B két n m méret mátrix.

Mátrixok 5 #d e f i n e SOROK 3 6 #d e f i n e OSZLOPOK 4 7 8 i n t main ( ) { 9 // d e k l a r a c i o, i n i c i a l i z a c i o 10 i n t a [SOROK ] [ OSZLOPOK] = { 11 { 11, 12, 13, 14 }, 12 { 21, 22, 23, 24 }, 13 { 31, 32, 33, 34 } 14 } ; 15 i n t b [SOROK ] [ OSZLOPOK], c [SOROK ] [ OSZLOPOK ] ; 16 s r a n d ( t i m e (NULL ) ) ; 17 f o r ( i n t s =0; s<sorok; s++) { // mtx. f e l t o l t e s e 18 f o r ( i n t o =0; o<oszlopok ; o++) { 19 b [ s ] [ o ] = 10 + r a n d ()%40; 20 } 21 }

Mátrixok 22 f o r ( i n t s =0; s<sorok; s++) { // mtx. ek o s s z e a d a s a 23 f o r ( i n t o =0; o<oszlopok ; o++) { 24 c [ s ] [ o ] = a [ s ] [ o ] + b [ s ] [ o ] ; 25 } 26 } 27 f o r ( i n t s =0; s<sorok; s++) { // m e g j e l e n i t e s 28 f o r ( i n t o =0; o<oszlopok ; o++) { 29 c o u t << a [ s ] [ o ] << ' ' ; 30 } 31 c o u t << ( s==sorok/2? "+ " : " " ) ; 32 f o r ( i n t o =0; o<oszlopok ; o++) { 33 c o u t << b [ s ] [ o ] << ' ' ; 34 } 35 c o u t << ( s==sorok/2? "= " : " " ) ; 36 f o r ( i n t o =0; o<oszlopok ; o++) { 37 c o u t << c [ s ] [ o ] << ' ' ; 38 } 39 c o u t << e n d l ; 40 } 41 r e t u r n 0 ; }

Mátrixok Kimenet 11 12 13 14 33 49 36 12 44 61 49 26 21 22 23 24 + 20 45 24 18 = 41 67 47 42 31 32 33 34 19 10 11 42 50 42 44 76 Hogyan adható át egy mátrix függvénynek? OK void fv(int t[sorok][oszlopok]) { //... void fv(int t[][oszlopok]) { //... void fv(int (*t)[oszlopok]) { //... Hiba X Ez mutatótömb, nem mátrix! void fv(int *t[oszlopok]) { //...

Mátrixok 45 i n t main ( ) { 46 i n t a [SOROK ] [ OSZLOPOK], b [SOROK ] [ OSZLOPOK], 47 c [SOROK ] [ OSZLOPOK ] ; 48 s r a n d ( t i m e (NULL ) ) ; 49 g e n e r a l ( a ) ; 50 g e n e r a l ( b ) ; 51 o s s z e a d ( a, b, c ) ; 52 m e g j e l e n i t ( a, b, c ) ; 53 r e t u r n 0 ; 54 }

Mátrixok 5 #d e f i n e SOROK 3 6 #d e f i n e OSZLOPOK 4 7 8 v o i d g e n e r a l ( i n t t [ ] [ OSZLOPOK ] ) { 9 f o r ( i n t s =0; s<sorok; s++) { 10 f o r ( i n t o =0; o<oszlopok ; o++) { 11 t [ s ] [ o ] = 10 + r a n d ()%40; 12 } 13 } 14 } 15 16 v o i d o s s z e a d ( c o n s t i n t ( a ) [ OSZLOPOK], 17 c o n s t i n t ( b ) [ OSZLOPOK], 18 i n t ( c ) [ OSZLOPOK ] ) { 19 f o r ( i n t s =0; s<sorok; s++) { 20 f o r ( i n t o =0; o<oszlopok ; o++) { 21 c [ s ] [ o ] = ( a [ s ] + o ) + ( ( b+s ) + o ) ; 22 } 23 } 24 }

Mátrixok 26 v o i d m e g j e l e n i t ( c o n s t i n t a [ ] [ OSZLOPOK], 27 c o n s t i n t b [ ] [ OSZLOPOK], 28 c o n s t i n t c [ ] [ OSZLOPOK ] ) { 29 f o r ( i n t s =0; s<sorok; s++) { 30 f o r ( i n t o =0; o<oszlopok ; o++) { 31 c o u t << a [ s ] [ o ] << ' ' ; 32 } 33 c o u t << ( s==sorok/2? "+ " : " " ) ; 34 f o r ( i n t o =0; o<oszlopok ; o++) { 35 c o u t << b [ s ] [ o ] << ' ' ; 36 } 37 c o u t << ( s==sorok/2? "= " : " " ) ; 38 f o r ( i n t o =0; o<oszlopok ; o++) { 39 c o u t << c [ s ] [ o ] << ' ' ; 40 } 41 c o u t << e n d l ; 42 } 43 }

Mátrixok Probléma: rugalmatlan függvények, mert az oszlopok száma rögzített Megoldás: hozzunk létre dinamikusan vektorokat (pl. int*-gal címezhet k), majd ezek címeit tároljuk egy újabb, dinamikus vektorban (int**, mutatótömb)! int** 0 1 2... n int* 0 1 2 m int A[0] A[0][1] A[n]......

Mátrixok 56 i n t main ( ) { 57 s r a n d ( t i m e (NULL ) ) ; 58 i n t s o r o k = 1 + r a n d ()%4; 59 i n t o s z l o p o k = 1 + r a n d ()%4; 60 i n t a = l e f o g l a l ( s o r o k, o s z l o p o k ) ; 61 i n t b = l e f o g l a l ( s o r o k, o s z l o p o k ) ; 62 i n t c = l e f o g l a l ( s o r o k, o s z l o p o k ) ; 63 g e n e r a l ( a, s o r o k, o s z l o p o k ) ; 64 g e n e r a l ( b, s o r o k, o s z l o p o k ) ; 65 o s s z e a d ( a, b, c, s o r o k, o s z l o p o k ) ; 66 m e g j e l e n i t ( a, b, c, s o r o k, o s z l o p o k ) ; 67 f e l s z a b a d i t ( a, s o r o k ) ; 68 f e l s z a b a d i t ( b, s o r o k ) ; 69 f e l s z a b a d i t ( c, s o r o k ) ; 70 r e t u r n 0 ; 71 }

Mátrixok 6 i n t l e f o g l a l ( i n t s o r o k, i n t o s z l o p o k ) { 7 i n t t = new i n t [ s o r o k ] ; 8 f o r ( i n t s =0; s<s o r o k ; s++) { 9 t [ s ] = new i n t [ o s z l o p o k ] ; 10 } 11 r e t u r n t ; 12 } 13 14 v o i d g e n e r a l ( i n t t, i n t s o r o k, i n t o s z l o p o k ) { 15 f o r ( i n t s =0; s<s o r o k ; s++) { 16 f o r ( i n t o =0; o<o s z l o p o k ; o++) { 17 t [ s ] [ o ] = 10 + rand ()%40; 18 } 19 } 20 }

Mátrixok 22 v o i d o s s z e a d ( i n t a, i n t b, i n t c, 23 i n t s o r o k, i n t o s z l o p o k ) { 24 f o r ( i n t s =0; s<s o r o k ; s++) { 25 f o r ( i n t o =0; o<o s z l o p o k ; o++) { 26 c [ s ] [ o ] = ( a [ s ] + o ) + ( ( b+s ) + o ) ; 27 } 28 } 29 } 49 v o i d f e l s z a b a d i t ( i n t t, i n t s o r o k ) { 50 f o r ( i n t s =0; s<s o r o k ; s++) { 51 d e l e t e [ ] t [ s ] ; 52 } 53 d e l e t e [ ] t ; 54 }

Mátrixok Alternatív megoldás: utánozzuk a statikus tömbök memóriabeli szerkezetét, azaz valójában vektornak foglalunk helyet, és erre képezzük le a mátrix elemeit A[2*sorhossz+1] int* 0 1 2 m 0 int 1 2......... n...............

Mátrixok 45 i n t main ( ) { 46 s r a n d ( t i m e (NULL ) ) ; 47 i n t s o r o k = 1 + r a n d ()%4; 48 i n t o s z l o p o k = 1 + r a n d ()%4; 49 i n t a = l e f o g l a l ( s o r o k, o s z l o p o k ) ; 50 i n t b = l e f o g l a l ( s o r o k, o s z l o p o k ) ; 51 i n t c = l e f o g l a l ( s o r o k, o s z l o p o k ) ; 52 g e n e r a l ( a, s o r o k, o s z l o p o k ) ; 53 g e n e r a l ( b, s o r o k, o s z l o p o k ) ; 54 o s s z e a d ( a, b, c, s o r o k, o s z l o p o k ) ; 55 m e g j e l e n i t ( a, b, c, s o r o k, o s z l o p o k ) ; 56 d e l e t e [ ] a ; 57 d e l e t e [ ] b ; 58 d e l e t e [ ] c ; 59 r e t u r n 0 ; 60 }

Mátrixok 6 i n t l e f o g l a l ( i n t s o r o k, i n t o s z l o p o k ) { 7 r e t u r n new i n t [ s o r o k o s z l o p o k ] ; 8 } 9 10 v o i d g e n e r a l ( i n t t, i n t s o r o k, i n t o s z l o p o k ) { 11 f o r ( i n t s =0; s<s o r o k ; s++) { 12 f o r ( i n t o =0; o<o s z l o p o k ; o++) { 13 t [ s o s z l o p o k + o ] = 10 + r a nd ()%40; 14 } 15 } 16 } 17 18 v o i d o s s z e a d ( i n t a, i n t b, i n t c, 19 i n t s o r o k, i n t o s z l o p o k ) { 20 f o r ( i n t s =0; s<s o r o k ; s++) { 21 f o r ( i n t o =0; o<o s z l o p o k ; o++) { 22 c [ s o s z l o p o k+o ] = a [ s o s z l o p o k+o ] + b [ s o s z l o p o k+o ] ; 23 } 24 } 25 }

Mátrixok Inline függvények: javaslat a fordítónak, hogy a függvény kódját helyettesítse be minden hívás helyére csak egyszer, rövid függvényekkel javasolt használni függvény hívási id megtakarítható kódméret növekszik 10 i n l i n e i n t i d x ( i n t s, i n t o, i n t o s z l o p o k ) { 11 r e t u r n s o s z l o p o k + o ; 12 } 13 14 v o i d g e n e r a l ( i n t t, i n t s o r o k, i n t o s z l o p o k ) { 15 f o r ( i n t s =0; s<s o r o k ; s++) { 16 f o r ( i n t o =0; o<o s z l o p o k ; o++) { 17 t [ i d x ( s, o, o s z l o p o k ) ] = 10 + r a n d ()%40; 18 } 19 } 20 }