Dinamikus mátrixok. Dinamikus többdimenziós tömbök

Hasonló dokumentumok
10. gyakorlat. Pointerek Tárolási osztályok

8. gyakorlat Pointerek, dinamikus memóriakezelés

Alapműveletek mátrixokkal

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

1. Alapok. Programozás II

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

Programozas 1. Strukturak, mutatok

INFORMATIKA tétel 2017

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

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

Pointerek C-ben, C++-ban

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

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

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.

Megnevezték azokat a személyeket, akik elnyerték a 2013-as Nobel-díjakat

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

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

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

INFORMATIKA tétel 2019

INFORMATIKA tétel 2018

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

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 C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Bevezetés a C++ programozási nyelvbe

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

Bevezetés a C++ programozási nyelvbe

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

5. gyakorlat. Konstansok Tömbök Stringek

Maximum kiválasztás tömbben

INFORMATIKA javítókulcs 2016

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

5. Gyakorlat. struct diak {

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

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

OAF Gregorics Tibor : Memória használat C++ szemmel (munkafüzet) 1

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

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

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

Java II. I A Java programozási nyelv alapelemei

3. Osztályok II. Programozás II

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

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

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

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

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

Struktúra nélküli adatszerkezetek

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

I. Egydimenziós tömb elemeinek rendezése

A 2011/2012 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Körkörös listák. fej. utolsó. utolsó. fej

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

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

Felvételi tematika INFORMATIKA

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

Láncolt lista. az itt adott nevet csak a struct deklaráción belül használjuk

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

hatására hátra lép x egységgel a toll

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

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

Programozási nyelvek Java

Problémaosztályok algoritmusok. Ciklusok

Programozás II. segédlet

Java II. I A Java programozási nyelv alapelemei

3


Bevezetés a programozásba I.

PROGRAMOZÁSI TÉTELEK

Programozás II gyakorlat. 6. Polimorfizmus

int tokeletes(int szam) { int i,oszto=0; for(i=1; i<szam; i++) { if(szam %i == 0) { oszto+=i; }

7. gyakorlat Sorozatok, Fájlkezelés

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

Algoritmusok és adatszerkezetek I. 1. előadás

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

C++ programozási nyelv Konstruktorok-destruktorok

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Feladatok, amelyek gráfokkal oldhatók meg 1) A königsbergi hidak problémája (Euler-féle probléma) a

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

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

Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök Gyakorló feladatok V 1.0 ÓE-NIK-AII,

Programozás II. Fájlkezelés

Occam 1. Készítette: Szabó Éva

Programozás alapjai 5. gyakorlat Vezérlési szerkezetek egymásba ágyazása

Megoldott programozási feladatok standard C-ben

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

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

malloc free malloc free int sum(int a[4]) { return a[0] + a[1] + a[2] + a[3]; }

Programozási Nyelvek: C++

Programozás C++ -ban

2014. szeptember 24. és 26. Dr. Vincze Szilvia

Egyszerű programozási tételek

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

félstatikus adatszerkezetek: verem, várakozási sor, hasítótábla dinamikus adatszerkezetek: lineáris lista, fa, hálózat

Algoritmizálás, adatmodellezés 1. előadás

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

3. TÖMBÖK A tömb absztrakt adattípus Legyen T az E alaptípus feletti k ( 1) dimenziós tömb típus. Vezessük be az I I1

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3

Átírás:

Fém /H arány 0,03 0,02 0,01 0,01 0,001 ~ 0 Kor (év) < 10 8 10 8-10 9 10 9-10 10 1-1,2 10 10 >1,2 10 1 >1,3 Összesített tömeg (Mo) Legfényesebb csillagok Főbb képviselők, markerek 2-3 10 9 5 10 9 4,7 10 10 4,7 10 10 1,6 10 10? - 8 mg - 8 mg - 3 mg - 3 mg - 3 mg? spirálkarok fiatal csillagai, aszszociációk A típ. csillagok, dme galaktikus mag csill., RR Lyr (P<0,4 d) Runaway csillagok (v z>30 km/s) 0 gömbhalmazok, RR Lyr (P>0,4 d) 10 10 3,6 IR fénylés? 8. képmelléklet A Spitzer űrtávcsővel 3,6 mm-en készített felvétel a Draco csillagkép 6x12 ívperces darabjáról (felső kép) és a csillagok, galaxisok levonása után maradt derengés (alsó) a sejtések szerint az egykori primordiális (a keresett III. populációs) csillagok fénylése Hegedüs Tibor Dinamikus mátrixok. Dinamikus többdimenziós tömbök 1. feladat Valósítsunk meg dinamikusan egy n m-elemű kétdimenziós tömböt (mátrixot)! Olvassuk be a tömb elemeit, majd írjuk ki a képernyőre. 1. megoldás A feladatot visszavezethetjük egydimenziós dinamikus tömbökre. Legyen a következő a mátrixunk: n=3, m=4. 1 2 3 4 5 6 7 8 9 10 11 12 Ez a mátrix a fentiek alapján ekvivalens a következő tömbbel: 1 2 3 4 5 6 7 8 9 10 11 12 2013-2014/3 9

És dinamikusan helyet foglalunk az n m nagyságú tömbnek. Ebben az esetben nyilván nem használhatjuk a kettős [i][j] indexelést, hanem a tömb egy elemét a [j+i*m] index segítségével érhetjük el. 2. megoldás A mátrix sorait külön-külön lefoglaljuk. Az egyes sorokhoz tartozó pointereket egy pointertömbbe tesszük (n elemű), amelyet dinamikusan foglalunk le, majd minden pointer egy m elemű tömbre mutat. Így a lefoglalt tömböt a megszokott módon használhatjuk a kettős [i][j] indexeléssel. Az első indexelés (i) a pointerek tömbjéből kiválaszt egy pointert, a második indexelés pedig már a pointerrel mutatott tömbön történik. Előbb a pointerek tömbjét kell lefoglalni, majd utána a sorokat. A felszabadításnál ugyanez visszafelé történik: először a sorokat szabadítjuk fel, majd a pointerek tömbjét. A módszer hátránya az, hogy sok malloc() hívás kell hozzá, ami lassabb, mintha csak egy vagy kettő lenne. A módszer nagy előnye viszont az, hogy a soroknak nem feltétlenül kell ugyanolyan hosszúaknak lenniük! ** * 1 2 3 4 * 5 6 7 8 * 9 10 11 12 #include<stdio.h> int **t; int n, m; scanf("%i", &m); t = (int**)calloc(n, sizeof(int*)); t[i] = (int*)calloc(m, sizeof(int)); scanf("%i", &t[i][j]); printf("%3i", t[i][j]); free(t[i]); 10 2013-2014/3

Vagy ha C++-ban programozunk: #include<iostream> using namespace std; int** t; int n, m; cin>>n; cin>>m; t = new int*[n]; t[i] = new int[m]; cin>>t[i][j]; cout<<t[i][j]<<'\t'; cout<<endl; delete [] t[i]; delete [] t; 3. megoldás A fenti két módszert keverhetjük is: az sorfolytonos, linearizált tömböt egyetlen calloc() hívással lefoglaljuk, mint az első megoldásnál. Deklarálunk egy másik dinamikus tömböt, amely pointerekből áll, mint a második megoldásnál, és ezek a pointerek a sorfolytonos tömb belsejébe mutatnak, mégpedig oda, ahol a kétdimenziós tömb leképezett sorainak elejei vannak. Így, ha indexeljük a pointerekből álló tömböt, egy pointert kapunk, amely a sorfolytonos tömb belsejébe mutat, majd azt is indexelve megkapjuk a keresett elemet. Ez a módszer gyorsabb foglalást eredményez mint az előző (tehát kiküszöböli az előző megoldás hátrányát), mert mindössze két darab calloc() hívásra van hozzá szükség. Először lefoglaljuk a pointertömböt, majd az elemek tömbjét, végül pedig a sorfolytonos tömb belsejébe mutató pointereket számítjuk ki. ** * 1 2 3 4 5 6 7 8 9 10 11 12 * * 2013-2014/3 11

#include<stdio.h> int** t; int n, m; scanf("%i", &m); t=(int**)calloc(n, sizeof(int*)); t[0]=(int*)calloc(n*m, sizeof(int)); for(i=1; i<n; ++i) t[i]=t[0]+i*m; scanf("%i", &t[i][j]); printf("%3i", t[i][j]); free(t[0]); 2. feladat Valósítsunk meg dinamikusan egy háromszög alakú kétdimenziós tömböt (mátrixot)! Megoldás #include<stdio.h> 1 2 3 4 5 6 7 8 9 10 int **t; int n; 12 2013-2014/3

t = (int**)calloc(n, sizeof(int*)); for(i=0;i<n;++i) t[i] = (int*)calloc(n-i, sizeof(int)); for(j=0; j<n-i; ++j) scanf("%i", &t[i][j]); for(j=0; j<n-i; ++j) printf("%3i", t[i][j]); for(i=0;i<n;++i) free(t[i]); Házi feladat Valósítsuk meg dinamikusan a következő alakú tömböt: 1 2 3 4 5 6 7 8 9 10 11 12 13 3. feladat Valósítsunk meg dinamikusan egy n m o-elemű háromdimenziós tömböt! Olvassuk be a tömb elemeit, majd írjuk ki a képernyőre. Megoldás A háromdimenziós tömböt úgy foghatjuk fel, mint egy téglatestet. Például, ha n=5, m=4, o=3, a következő téglatestet kapjuk, és ez egy 5 4 3-as tömb: 2013-2014/3 13

Vagy, ha az egyes rétegeket külön jelenítjük meg: Tehát a következő szerkezetet kell hogy megvalósítsuk pointerekkel: A program: #include<stdio.h> int*** t; int n, m, o; int i, j, k; scanf("%i", &m); scanf("%i", &o); t=(int***)calloc(n, sizeof(int**)); t[i]=(int**)calloc(m, sizeof(int*)); 14 2013-2014/3

t[i][j]=(int*)calloc(o, sizeof(int)); for(k=0; k<o; ++k) scanf("%i", &t[i][j][k]); for(k=0; k<o; ++k) printf("%i:\n", k); printf("%3i", t[i][j][k]); printf("\n\n"); for (j=0; j<m; ++j) free(t[i][j]); free(t[i]); Megjegyzés A fenti megoldás általánosítható tetszőleges dimenziójú tömbökre is. Kovács Lehel A szilícium és szilíciumtartalmú ásványok I. rész A szilícium nevű kémiai elem a periódusos rendszer 14. csoportjának (IV. főcsoport) második eleme: 14Si. Előfordulási gyakorisága szerint a világmindenségben a hetedik, a földkéregben a második leggyakoribb elem, mivel a földkéreg kőzetei és ezek mállástermékei (talajok, agyagok, homok) majdnem teljesen, megközelítőleg 95%-ban szilikátásványokból és szilícium-dioxidból állnak. Az ezekben előforduló, természetes szilíciumnak három stabil izotópja van: 28 Si (92,23%), 29 Si (4,67%) és 30 Si (3,1%). Földi körülmények között a szilícium soha nem fordul elő szabadon, elemi állapotban, mindig csak oxigénhez kapcsolódva (a SiO 4-egységnek megfelelő négyes koordinációban). Az 2013-2014/3 15