Info2/2008tavasz/kuka
A MathWikiből
(Változatok közti eltérés)
1. sor: | 1. sor: | ||
== 4. előadás (2008-03-14) == | == 4. előadás (2008-03-14) == | ||
− | === Tömbök átadása paraméterként === | + | === Tömbök és függvények átadása paraméterként (csak mutatókkal) === |
==== Index jelölés ==== | ==== Index jelölés ==== | ||
− | ld a gyakorlaton: ~/info2/mx.c | + | ld. a gyakorlaton: ~/info2/mx.c |
==== Mutató jelölés, típuskényszerítés (casting) ==== | ==== Mutató jelölés, típuskényszerítés (casting) ==== | ||
42. sor: | 42. sor: | ||
} | } | ||
+ | ==== 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; | ||
+ | } | ||
A lap 2008. március 14., 08:41-kori változata
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; }