Programozás alapjai C nyelv 10. gyakorlat Szeberényi Imre BME IIT
<
[email protected]>
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
-1-
Standard függvények • Standard függvények amelyeket ismerni kell: – stringkezelő <string.h>, – karakter osztályozó
, – konvertáló <stdlib.h>, – matematikai <math.h>, – input/output <stdio.h>
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
-2-
Union • A struktúrához hasonlóan különböző típusú adatok tárolására alkalmas, de egy adott időpillanatban csak egy fajta adata lehet. • Használatának helytakarékossági oka lehet, vagy valamilyen konverziós trükk. • Deklarációja és használata formailag megegyezik a struktúrával. union_spec: union union_tip_azonopc { dekl_lista }
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
-3-
1
Union példák union trukkos { char by[2]; int integ; } u;
u1.integ = 623; low = u.by[0]; high = u.by[1];
struct takarekos { enum {kar, integ, valos } tip; union { char kar; if (uzen.tip == kar) int integ; ch = uzen.adat.kar; float valos; else if (uzen.tip == valos) } adat; fl = uzen.adat.valos; } uzen; ... Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
-4-
Bitmező • Adott számú bitet tartalmazó változó. • Használatának egyetlen oka a helytakarékosság. • Deklarációja és használata formailag hasonlít a struktúrához. struct_spec: struct struct_tip_azonopc { deklaratoropc : állandó } struct bitek { int ketbit:2; int hatbit:6; int sep:0; int egybit:1; } bit;
bit.ketbit = 3; bit.hatbit = 8; biztosan új szóban kezdődjön
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
-5-
Függvénypointer • Nem csak változót, hanem függvényt is elérhetünk indirekten. • Fontos, mert így lehet átadni függvényt paraméterként. • Függvényre mutató pointer: int (*fp)(float x); int típusú
fügvényre mutató pointer
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
float paraméterrel 2005.11.21.
-6-
2
Példa: gyökkeresés • Írjunk függvényt, ami egy folytonos függvény nullahelyét megkeresi intervallumfelezéssel. • A függvény paraméterként kapja: – az intervallumot ([a,b]) – a hibahatárt (eps) – függvény pointerét – eredményre mutató pointert Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
-7-
Gyököl int gyokol(double a, double b, double eps, double (*f)(double x), double *gyok) { double x, y; do { x = (a+b) / 2; /* felezünk */ y = (*f)(x); if (fabs(y) <= eps) break; /* hiba kicsi, kilep */ if ((*f)(a) * y < 0) b = x; /* előjelet vált ? */ else if (*f)(b) * y < 0) a = x; else return(0); /* azonos parton van */ } while (1); /* nem itt lep ki */ *gyok = x; /* megvan a gyök */ return(1); } Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
-8-
Gyököl (2) #include <stdio.h> #include <math.h> int gyokol(.....) main() { int ret; double a = -0.1, b = 2.9, x; ret = gyokol(a, b, 0.01, cos, &x); printf("ret: %d [%f, %f] %f\n", ret a, b, x); ret = gyokol(a, b, 0.01, sin, &x); printf("ret: %d [%f, %f] %f\n", ret a, b, x); } Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
-9-
3
qsort() • quick sort algoritmus általános célra • összehasonlító függvényt paraméterként kapja: void qsort(void *base, size_t num, size_t width, int (*cmp)(void *e1, void *e2));
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
- 10 -
qsort példa #include <stdio.h> #include <stdlib.h> #include <string.h> int cmp(const char **s1, const char **s2) { return(strcmp(*s1, *s2)); } main() { char *t[] = {"szilva", "cseresznye", "alma", "barack"}; int n = sizeof(t)/sizeof(char*), i;
}
qsort(t, n, sizeof(char *), cmp); for (i = 0; i
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
- 11 -
Függvénypointerek tömbje • Rugalmas programstruktúrát és/vagy általános megoldást tesz lehetővé. • Pl: általános menükezelő, ami a menüszövegek mellett paraméterként kapja az aktivizálandó függvényeket is: void menu(char *t[], void (*f[])()); int típusú
int (*fp[10])(float x);
fügvényre mutató pointer Programozás alapjai I. (C nyelv, gyakorlat)
tömb © BME-IIT Sz.I.
float paraméterrel 2005.11.21.
- 12 -
4
Jelölések int a - int int *a - int pointer int *a[] - int pointerek tömbje int (*a)[] - int tömbre mutató pointer int a() - int függvény int *a() - int pointerrel visszatérő függvény int (*a)() - int függvényre mutató pointer int (*a[])() - int függvényre mutató pointereket tartalmazó tömb Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
- 13 -
Goto • Nem szeretjük, mert nehezen átlátható, nem a strukturált programozás elveivel ellentétes. • Néha azonban megkerülése felesleges bonyodalmakkal jár (többszörösen egymásba ágyazott ciklusok).
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
- 14 -
Goto fajtái • Lokális (függvényen belül) – goto cimke; – Szalonképesebb változat: break, continue
• Globális (függvények között) Nem nyelvi elem. – setjmp, longjmp – Csak nagyon indokolt esetben és körültekintően.
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.11.21.
- 15 -
5