Info2/2008tavasz/kuka

A MathWikiből
A lap korábbi változatát látod, amilyen Wettl (vitalap | szerkesztései) 2008. március 14., 07:41-kor történt szerkesztése után volt.

Tartalomjegyzék

4. előadás (2008-03-14)

Tömbök és függvények átadása paraméterként (csak mutatókkal)

Index jelölés

ld. a gyakorlaton: ~/info2/mx.c

Mutató jelölés, típuskényszerítés (casting)

~/info2/mx2.c

#include <stdio.h>

#define SOROKSZ 10
#define OSZLOPOKSZ 10

int legnagyobb(int *a, int oszsz, int ssz, int osz)
{
  int i, j;
  int mx = *a;
 
  for( i = 0; i < ssz; i++)
    for( j = 0; j < osz; j++)
      if (  *(a + i*oszsz + j) > mx)
        mx =  *(a + i*oszsz + j);
  return mx;
}

int main()
{
  int t[SOROKSZ][OSZLOPOKSZ] = { {21, 42, 13},
                                 {35, 20, 15} };
  int ssz = 2;
  int osz = 3;
  int m;
 
  m = legnagyobb( (int *)t, OSZLOPOKSZ, ssz, osz);
  
  printf("A legnagyobb érték %d.\n", m);
  return 0;
}

Függvény átadása

Függvénymutató deklarálása:

int (*mutfv)( int )

Ez így még nem mutat sehová, csak egy mutatót deklarál, mely csak olyan függvényre mutathat majd, amelynek egyetlen egész argumentuma van, és amely egy egészt ad vissza.

A zárójel kell, mert

int *mutfv( int )

olyan függvényt deklarálna, mely egészre mutató mutatót ad vissza.

~/info2/fvmut.c

#include <stdio.h>

int ossz(int, int);         // fv prototípusok
int szor(int, int);

int main(void)
{
  int a = 4;
  int b = 3;
  int e = 0;                // eredmény
  int (*fvm)(int, int);     // függvény mutató deklaráció

  fvm = ossz;               // az ossz() függvényre mutat
  e = fvm(a, b);            // ossz(a, b) meghívása
  printf("Az összeg = %d\n", e);
 
  fvm = szor;
  e = fvm(a, b);
  printf("A szorzat = %d\n", e);

  return 0;
}

int ossz(int x, int y) {
  return x + y;
}

int szor(int x, int y) {
  return x * y;
}


Véletlen sorozat generálása

Véletlen számok generálása: rand() az stdlib.h betöltése után egy [0,RAND_MAX] = [0,INT_MAX] intervallumba eső egészt generál. random seed: srand( <szám> ) hívással befolyásolható az elsőnek generált -- és ezzel az összes -- szám, mivel ez csak álvéletlen sorozat. Valódi véletlenség látszatához használjuk a time( NULL ) függvényt.

~/info2/rand.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (void) {
  int i;

  srand( (unsigned int) time( NULL ));         // seed
  for (i=0; i<5; ++i) printf("%d ",rand()%64); // [0..RAND_MAX]
  printf("\n");

  return 0;
}

Struktúra

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  struct allat                  // struktúra deklaráció
  {
    char nev[20];
    int db;
    struct allat *kov;          // mutató a következőre
  };

  struct allat *elso = NULL;    // mutató az első állatra
  struct allat *ez   = NULL;    // mutató erre az állatra
  struct allat *utso = NULL;    // mutató az előzőre

  char c = '\0';

  for( ; ; )
  {
    printf("\nBeviszed egy allat adatait? (i/n) ");

    scanf(" %c",&c);
    if(c == 'n' || c == 'N') break;

    // memóriaallokáció
    ez = (struct allat*) malloc(sizeof(struct allat));

    if(elso == NULL) elso = ez; // mutató az első állatra

    if(utso!= NULL) utso -> kov = ez; 

    printf("\nAz allat neve? ");
    scanf("%s", ez -> nev);

    printf("\nHany %s lesz a hajon? ", ez -> nev);
    scanf("%d", &ez -> db);

    ez->kov = NULL;             // lehet, hogy ez az utolsó
    utso = ez;                  // áttesszük az utso-ba
  }

                               // állatok listájának kiírása
  ez = elso;

  while (ez != NULL)            // amíg ez egy érvényes mutató
  {
    printf("\n%d darab %s,\n", ez->db, ez->nev);
    utso = ez;                  // mentés memóriafelszabadításhoz
    ez = ez->kov;               // mutató a következőre
    free(utso);                 // memóriafelszabadítás
  }
  return 0;
}


Struktúra átadása paraméterként

#include <stdio.h>
#include <stdlib.h>

struct allat *uj_allat(void);

struct allat                  // struktúra deklaráció
{
  char nev[20];
  int db;
  struct allat *elozo;        // mutató az előzőre
  struct allat *kov;          // mutató a következőre
};

int main(void)
{
  struct allat *elso = NULL;    // mutató az első állatra
  struct allat *ez   = NULL;    // mutató erre az állatra
  struct allat *utso = NULL;    // mutató az előzőre
  char c = '\0';

  for(;;)
  {
    printf("\nBeviszed %segy allat adatait? (i/n) ", 
           elso == NULL ? "" : "meg " );
    scanf(" %c",&c);
    if(c == 'n' || c == 'N') break;

    // memóriaallokáció
    ez = uj_allat();

    if(elso == NULL)
    {
      elso = ez;
      utso = ez;
    }
    else
    {
      utso->kov = ez;
      ez->elozo = utso;
      utso = ez;
    }
  }

  /* KIÍRÁS */
  ez = elso;
  while (ez != NULL)            // amíg ez egy érvényes mutató
  {
    printf("%d darab %s,\n", ez->db, ez->nev);
    utso = ez;                  // mentés memóriafelszabadításhoz
    ez = ez->kov;               // mutató a következőre
    free(utso);                 // memóriafelszabadítás
  }
  return 0;
}

struct allat *uj_allat(void)
{
  struct allat *a;

  a = (struct allat*) malloc(sizeof(struct allat));

  printf("\nAz allat neve? ");
  scanf("%s", a -> nev);

  printf("\nHany %s lesz a hajon? ", a -> nev);
  scanf("%d", &a -> db);

  a->kov = a->elozo = NULL;

  return a;
}
Személyes eszközök