Informatika2-2014/Gyakorlat11

A MathWikiből
(Változatok közti eltérés)
118. sor: 118. sor:
 
* Írj függvényt, mely megszámolja egy egész számokból álló tömb elemeinek a gyakoriságát.
 
* Í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?).
 
* 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 ===
 

A lap 2014. április 22., 10:11-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?).
Személyes eszközök