Programozás alapjai C nyelv 10. gyakorlat Szeberényi Imre BME IIT <szebi@iit.bme.hu> 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ó <ctype.h>, 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_azon opc { dekl_lista Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.21. -3-
union trukkos { char by[2]; int integ; u; Union példák u1.integ = 623; low = u.by[0]; high = u.by[1]; struct takarekos { enum {kar, integ, valos tip; union { char kar; int integ; float valos; adat; uzen; if (uzen.tip == kar) ch = uzen.adat.kar; else if (uzen.tip == valos) fl = uzen.adat.valos;... 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_azon opc { deklarator opc : á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 float paraméterrel Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.21. -6-
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- #include <stdio.h> #include <math.h> int gyokol(...) Gyököl (2) 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-
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 <n; i++) printf("%s\n", t[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ú fügvényre mutató pointer int (*fp[10])(float x); tömb float paraméterrel Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.21. -12-
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-