Informatika2-2014/Gyakorlat11

A MathWikiből
(Változatok közti eltérés)
(Új oldal, tartalma: „== Elmélet == === 2013 előadás === * Mivel az előadás előtt járunk, itt a múlt év előadásának anyaga: http://wiki.math.bme.hu/view/Informatika2-2013/Eloadas…”)
 
2. sor: 2. sor:
 
=== 2013 előadás ===
 
=== 2013 előadás ===
 
* Mivel az előadás előtt járunk, itt a múlt év előadásának anyaga: http://wiki.math.bme.hu/view/Informatika2-2013/Eloadas
 
* Mivel az előadás előtt járunk, itt a múlt év előadásának anyaga: http://wiki.math.bme.hu/view/Informatika2-2013/Eloadas
 +
=== Mutatók ===
 +
* Először tekintsünk egy egyszerű modellt a számítógép memóriájára, illetve az ebben történő adattárolásra.
 +
* A memóriát képzeljük el diszkrét adattároló egységeknek. Minden egységnek külön tároljuk a címét a memóriában.
 +
* Az egységeket külön-külön, vagy tömbösítve tudjuk kezelni.
 +
* Ezek alapján értlemezzük a nyelv absztrakt szintjén a tömböket és pointereket.
 +
* Memóriacím egy egész szám, amely kijelöli a memória egy bájtját.
 +
* Az '''&''' operátor hívása adja meg az adott változó '''címét''' a memóriában.
 +
* '''Pointernek''' nevezzük azt a változót, amely egy másik változó memóriacímét tartalmazza.
 +
* Pointer típusa: milyen típusú adatra vagy függvényre mutat a pointer.
 +
* Ha '''*''' operátort (melynek neve indirekció) egy pointerre hattatjuk, akkor visszaadja az adott pointer által megcímzett értéket.
 +
* Pointerek deklarációja:
 +
<C>
 +
int *p;
 +
</C>
 +
* NULL pointer: olyan, külön erre a célra fentartott értékű pointer, mely nem mutat semmilyen értékre:
 +
 +
<C>
 +
int *p=NULL;
 +
</C>
 +
 +
=== Tömbök ===
 +
* Tömbök esetén "tömbösítve" foglaljuk le a változók helyét a memóriában.
 +
* Példa deklarációra:
 +
<C>
 +
int a[10];
 +
</C>
 +
* Példa inicializálásra:
 +
<C>
 +
int t[10]={6,8,-2,6,123,-8,3,4,2,1};
 +
</C>
 +
* A tömb elemei 0-tól indexelődnek.
 +
* Deklaráláskor tehát '''le kell rögzítenünk egy konstanssal a tömb méretét'''
 +
* Fontos, hogy a méretet csak konstanssal adhatjuk meg. Néhány fordító támogatja a tömb méretének változóval való megadását, de ezt általánosan nem alkalmazhatjuk.
 +
* Ha fordítási időben nem ismert, mekkora tömbre lesz szükség, használjuk dinamikus tömböt. (lsd. később)
 +
* Mindig kötelező a tömbnek méretet adni.
 +
* A tömb nem másolható az = operátorral, végig kell iterálnunk elemenként a két tömbön  másoláskor:
 +
* Sztringeket karaktertömbökként tárolunk.
 +
* A sztring utolsó eleme mindig a "szöveg végét" jelölő "\0" karakter. Tehát a sztringben lévő karakterek számánál mindig egyel nagyobb a tároló karaktertömb mérete.
 +
* az '''a''' és &a[0] jelölések ekvivalensek, és a tömb első elemére mutatnak. A következő kód végén a pa változó pedig az a tömb 6. (indexe 5) elemére mutat:
 +
<C>
 +
int *pa;
 +
pa = &a[0];
 +
pa = &a;
 +
*(pa + 5);
 +
</C>
 +
 +
* Lehetőségünk van többdimenziós tömbök deklarálására.
 +
* Többdimenziós tömbök sorfolytonosan tárolódnak a memóriában, tehát a következő két inicializálás (mely egyben példa is) ekvivalens:
 +
<C>
 +
int t[3][4][2]={34,-5,3,20,12,5,-1,0,4,77,12,-3,-14,3,1,23,75,2,10,24,78,1,2,7};
 +
</C>
 +
<C>
 +
int t[3][4][2]={{{34,-5},{3,20},{12,5},{-1,0}},{{4,77},{12,-3},{-14,3},{1,23}},{{75,2},{10,24},{78,1},{2,7}}};
 +
</C>
 +
 +
=== Dinamikus memória foglalás ===
 +
* Függvények:
 +
** '''malloc''' megadott byte-ot foglal le a memóriában,
 +
** '''realloc''' a már lefoglalt memória-tömb méretét változtatja meg,
 +
** '''calloc''' memóriafoglalás és a lefoglalt memória byte-jainek 0-ra állítása egyben,
 +
** '''free''' üríti a megadott memória-részt.
 +
* Példa a '''malloc''' függvény használatára
 +
 +
* Példa egydimenziós, dinamikusan foglalt tömb lefoglalására és használatára:
 +
  <C>
 +
  ...
 +
  int m;
 +
  scanf("%d",&M); 
 +
  int *vec = (int *) malloc(M * sizeof (int));
 +
  ...
 +
  int i;
 +
  for(i=0; i<M; i++){
 +
    vec[i]=1/(double)i;
 +
  }
 +
  ...
 +
  </C>
 +
* Példa kétdimenziós, dinamikusan foglalt tömb lefoglalására és használatára:
 +
  <C>
 +
  ...
 +
  int M,N;
 +
  scanf("%d",&M);
 +
  scanf("%d",&N); 
 +
  int **matrix = (int **) malloc(M * sizeof (int *));
 +
  int i;
 +
  for (i = 0; i < M; i++){
 +
    matrix[i] = (int *) malloc(N * sizeof (int));
 +
  }
 +
  ...
 +
  int j;
 +
  for(i=0; i<M; i++){
 +
    for(j=0; j<N; j++){
 +
      matrix[i][j]=(i+1)*(j+1);
 +
    }
 +
  }
 +
  </C>
  
 
== Feladatok ==
 
== Feladatok ==

A lap 2014. április 21., 15:39-kori változata

Tartalomjegyzék

Elmélet

2013 előadás

Mutatók

  • Először tekintsünk egy egyszerű modellt a számítógép memóriájára, illetve az ebben történő adattárolásra.
  • A memóriát képzeljük el diszkrét adattároló egységeknek. Minden egységnek külön tároljuk a címét a memóriában.
  • Az egységeket külön-külön, vagy tömbösítve tudjuk kezelni.
  • Ezek alapján értlemezzük a nyelv absztrakt szintjén a tömböket és pointereket.
  • Memóriacím egy egész szám, amely kijelöli a memória egy bájtját.
  • Az & operátor hívása adja meg az adott változó címét a memóriában.
  • Pointernek nevezzük azt a változót, amely egy másik változó memóriacímét tartalmazza.
  • Pointer típusa: milyen típusú adatra vagy függvényre mutat a pointer.
  • Ha * operátort (melynek neve indirekció) egy pointerre hattatjuk, akkor visszaadja az adott pointer által megcímzett értéket.
  • Pointerek deklarációja:
int *p;
  • NULL pointer: olyan, külön erre a célra fentartott értékű pointer, mely nem mutat semmilyen értékre:
int *p=NULL;

Tömbök

  • Tömbök esetén "tömbösítve" foglaljuk le a változók helyét a memóriában.
  • Példa deklarációra:
int a[10];
  • Példa inicializálásra:
int t[10]={6,8,-2,6,123,-8,3,4,2,1};
  • A tömb elemei 0-tól indexelődnek.
  • Deklaráláskor tehát le kell rögzítenünk egy konstanssal a tömb méretét
  • Fontos, hogy a méretet csak konstanssal adhatjuk meg. Néhány fordító támogatja a tömb méretének változóval való megadását, de ezt általánosan nem alkalmazhatjuk.
  • Ha fordítási időben nem ismert, mekkora tömbre lesz szükség, használjuk dinamikus tömböt. (lsd. később)
  • Mindig kötelező a tömbnek méretet adni.
  • A tömb nem másolható az = operátorral, végig kell iterálnunk elemenként a két tömbön másoláskor:
  • Sztringeket karaktertömbökként tárolunk.
  • A sztring utolsó eleme mindig a "szöveg végét" jelölő "\0" karakter. Tehát a sztringben lévő karakterek számánál mindig egyel nagyobb a tároló karaktertömb mérete.
  • az a és &a[0] jelölések ekvivalensek, és a tömb első elemére mutatnak. A következő kód végén a pa változó pedig az a tömb 6. (indexe 5) elemére mutat:
int *pa;
pa = &a[0];
pa = &a;
*(pa + 5);
  • Lehetőségünk van többdimenziós tömbök deklarálására.
  • Többdimenziós tömbök sorfolytonosan tárolódnak a memóriában, tehát a következő két inicializálás (mely egyben példa is) ekvivalens:
int t[3][4][2]={34,-5,3,20,12,5,-1,0,4,77,12,-3,-14,3,1,23,75,2,10,24,78,1,2,7};
int t[3][4][2]={{{34,-5},{3,20},{12,5},{-1,0}},{{4,77},{12,-3},{-14,3},{1,23}},{{75,2},{10,24},{78,1},{2,7}}};

Dinamikus memória foglalás

  • Függvények:
    • malloc megadott byte-ot foglal le a memóriában,
    • realloc a már lefoglalt memória-tömb méretét változtatja meg,
    • calloc memóriafoglalás és a lefoglalt memória byte-jainek 0-ra állítása egyben,
    • free üríti a megadott memória-részt.
  • Példa a malloc függvény használatára
  • Példa egydimenziós, dinamikusan foglalt tömb lefoglalására és használatára:
  ...
  int m;
  scanf("%d",&M);  
  int *vec = (int *) malloc(M * sizeof (int));
  ...
  int i;
  for(i=0; i<M; i++){
    vec[i]=1/(double)i;
  }
  ...
  • Példa kétdimenziós, dinamikusan foglalt tömb lefoglalására és használatára:
  ...
  int M,N;
  scanf("%d",&M);
  scanf("%d",&N);  
  int **matrix = (int **) malloc(M * sizeof (int *));
  int i;
  for (i = 0; i < M; i++){
    matrix[i] = (int *) malloc(N * sizeof (int));
  }
  ...
  int j;
  for(i=0; i<M; i++){
    for(j=0; j<N; j++){
      matrix[i][j]=(i+1)*(j+1);
    }
  }

Feladatok

Előző gyakorlat feladatai

Összeg

  • Írj függvényt, mely összeadja egy tömb elemeit.

Rendezés

  • Írj függvényt, mely nagyság szerint rendezi egy tömb elemeit.

Sakktábla

  • Rajzolj ki egy NxN-es sakktábla mintát, ahol X-szel jelöljük a fekete mezőket, és üresen hagyjuk (egy szóköz) a fehéreket. Nem kell keretet adni a táblának.
  • A sakktábla méretét (N) a felhasználótól kérd be.

Mátrixok, 2 dimenziós tömbök

  • Írd ki egy 2 dimenziós tömb elemeit a képernyőre. Próbáld ki a függvényt úgy, hogy egy main függvényen belül hozol létre egy példa tömböt.
  • Hasonlóan számold ki és jelenítsd meg a mátrix transzponáltját és négyzetét is.
  • Írj függvényt, mely összead / kivon egymásból / összeszoroz 2 mátrixot és a megoldást megjeleníti a képernyőn.

Prímtényezõ keresés

  • Írj programot, ami megkeresi egy a felhasználó által adott szám prímtényezõit és sorban kiírja azokat.
  • Meg lehet oldani úgy is, hogy egyesével megpróbáljuk elosztani az adott számunkat 2-tõl kezdve egyesével haladva egész számokkal, amíg 1-hez nem jutunk.
  • A maradék képzés (modulo) jele C-ben is a %

Gyakoriság, hisztogram

  • Írj függvényt, mely megszámolja egy egész számokból álló tömb elemeinek a gyakoriságát.
  • A függvény paraméterként kapja meg a vizsgált tömböt és annak méretét. Feltételezzük, hogy a tömbben 20-nál kisebb, vagy egyeblő értékek szerepelnek (miért van erre szükség?).

Új feladatok

Személyes eszközök