Přednáška Cvičení Písemka IB001 Úvod do programování skrze C Cvičení 7 Petr Velan velan@mail.muni.cz Fakulta informatiky Masarykova univerzita 29.10.2012 Petr Velan (Fl MUNI) IB001 29.10.2012 1 /25 Přednáška Cvičení Písemka Reálné datové typy • Uchovávají se ve tvaru (mantisa, exponent) • Zapisují se s desetinnou tečkou nebo exponentem • 3.14159 • 0.314159E1 • 0.314159E+1 • 31.4159E-1 • float, double, long double • printf modifikátory: f, e, E, g, G (float, double), Lf, Le, LE, Lg, LG (long double) • scanf modifikátory: f, e, g (float), If, le lg, (double), Lf, Le, Lg, (long double) Petr Velan (Fl MUNI) IB001 29.10.2012 2/25 Přednáška Cvičení Písemka Reálné typy (5) Označení těchto konstant má následující tvar: - začíná zápisem specifikujícím reálný typ: • FLT_ pro typ f loat • DBL_ pro typ double • LDBL_ pro typ long double - pokračuje zápisem udávajícím konkrétní charakteristiku, např.: • EPSILON minimální x > 0.0 takové, že 1.0+x != 1.0 • MIN minimální normalizované kladné číslo • MAX maximální reprezentovatelné konečné číslo Petr Velan (Fl MUNI) IB001 29.10.2012 3/25 Přednáška Cvičení Písemka Reálné typy (6) Pro běžnou reprezentaci reálných čísel danou standardem ANSI/IEEE 754 - 1985 platí (uvedené hodnoty jsou zaokrouhlené): FLT EPSILON 1.19209290E-007 FLT MIN 1.17549435E-038 4B FLT MAX 3.40282347E+038 DBL EPSILON 2.2204460492503131E-016 DBL MIN 2.2250738585072014E-308 8B DBL MAX 1.7976931348623157E+308 LDBL EPSILON 1.0842021724855 044E-019 LDBL MIN 3.3 62103143112093 5E^t932 12 B LDBL MAX 1.1897314953572318E+4932 Petr Velan (Fl MUNI) IB001 29.10.2012 4/25 Přednáška Cvičení Písemka Knihovní funkce (1) • Hlavičkový soubor math. h poskytuje konstanty (typu double): • M_E hodnota e (Eulerova čísla) •M_LOG2E hodnota log2e •M_LOG10E hodnota log e • M_LN2 hodnota ln 2 • M_LN10 hodnota ln 10 • M_PI hodnota % • M_PI_2 hodnota %/2 • M_PI_4 hodnota jc/4 • M_1_PI hodnota 1/jc 28/10/12 28 Petr Velan (Fl MUNI) IB001 29.10.2012 5/25 Přednáška Cvičení ANSI • Konstanty nejsou k dispozici pokud je definované makro _STRICT_ANSI_ • Nutné použít -std=gnu99 místo -std=c99 Petr Velan (Fl MUNI) IB001 29.1 Přednáška Cvičení Písemka Knihovní funkce (2) • M_2_PI hodnota 21% ' M_2_SQRTPI hodnota 2lnm ' M_SQRT2 hodnota 2m • M_SQRT1_2 hodnota l/2m - funkce, např.: • goniometrické (argument musí být vždy v radiánech): "double sin (double x) ; sinx "double cos (double x) ; COS x "double tan (double x) ; tg x • cyklometrické (výsledek je vždy v radiánech): S "double asin (double x) ; arcsinx ~ double acos (double x) ; arccos x ~ double atan (double x) ; arctg x 28/10/12 29 Petr Velan (Fl MUNI) IB001 29.10.2012 7/25 Přednáška Cvičení Písemka Knihovní funkce (3) • hyperbolické: ■ ~~ double sinh(double x) ; sinh x ~~ double cosh(double x) ; coshx ~~ double tanh(double x) ; tghx • hyperbolometrické: ~~ double asinh(double x) ; arcsinh x ~~ double acosh(double x) ; arccosh x ~~ double atanh(double x) ; arctgh x • logaritmické: s ~~ double log(double x) ; ln x ~ double loglO(double x) ; logx - double logb(double x) ; logjX 28/10/12 30 Petr Velan (Fl MUNI) IB001 29.10.2012 8/25 Přednáška Cvičení Písemka Knihovní funkce (4) ~~ double exp(double x) ; ex ~~ double f abs (double x) ; |x| ~~ double sqrt(double x) ; x12 ~ double cbrt (double x) ; x1'3 ~~ double pow(double x, double y) ; xy ~~ double ceil(double x) ; nejmenší celočíselná hodnota, která není menší než x "double floor(double x) ; největší celočíselná hodnota, která není větší než x ~~ double fmod(double x, double y) ; zbytek po dělení čísla x číslem y ~~ double rint(double x) ; zaokrouhlení čísla x Petr Velan (Fl MUNI) IB001 29.10.2012 9/25 Přednáška Cvičení Písemka errno.h • Řízení chyb knihovních funkcí • Pokud matematické funkce selžou, bude proměnná errno nastavená na nenulovou hodnotu • EDOM - argument funkce mimo definiční obor • ERANGE - výsledek je mimo obor hodnot výsledného typu • Konstanty a proměnná jsou definovány v hlavičkovém souboru errno.h • Používejte manuál ke knihovním funkcím, návratové hodnoty a hodnoty errno jsou popsány • strerror(3), perror(3) Petr Velan (Fl MUNI) IB001 29.10.2012 10/25 Přednáška Cvičení Písemka #include #include #include #include < s t d i n t.h> errno.h i n t main(void) { double x = logl 0(10); if (errno != 0) { perror (" log 1 0 : ") ; } printf ("%f" , x) ; return 0; Petr Velan (Fl MUNI) IB001 29.10.2012 11 /25 Přednáška Cvičení Písemka Typ ukazatel • Ukazatele uchovávají paměťovou adresu • Hodnota ukazatele říká, kde v paměti se nachází objekt daného datového typu • Datový typ se specifikuje při definici ukazatele • int *pointerNalnt; Dereferenční operátor: * - pro získání hodnoty z paměti odkazované ukazatelem. • Referenční operátor: & - pro získání adresy proměnné int a = 5; int *ptrA = &a; printf ("%d" , *ptrA) ; Petr Velan (Fl MUNI) IB001 29.10.2012 12/25 Přednáška Cvičení Písemka Typ ukazatel (4) Nechť: int *ptrlnt; int k = 11; adresa ptrlnt—i i— adresa Adresy 1000 1032 1064 1096 Hodnoty 11 adresa ptrlnt" adresa k ptrlnt = &k ; *ptrlnt = 80; Adresy 1000 1032 1064 1096 Hodnoty 1064 80 Petr Velan (Fl MUNI) IB001 29.10.2012 13/25 Přednáška Cvičení Písemka Prázdný ukazatel • Konstanta NULL • Definice ve stdio.h • Vhodné inicializovat ukazatele na tuto konstantu • Univerzální pro všechny datové typy i n t i = 42, *ptrl = NULL; Petr Velan (Fl MUNI) IB001 29.10.2012 14/25 Přednáška Cvičení Písemka Typ ukazatel • Na jeden objekt je možné držet více ukazatelů • Hodnoty ukazatelů je možné porovnávat (ukazují na stejný objekt?) • Obecný ukazatel: void *ukazatel • Lze přetypovat na libovolný ukazatel • Lze přiřadit libovolnému ukazateli i n t a = 5; void *ptrA = &a; printf ("%d" , *( int *) ptrA) ; Petr Velan (Fl MUNI) IB001 29.10.2012 15/25 Přednáška Cvičení Písemka Typ ukazatel void změn (i n t * ptr) { * ptr = 42; } i n t main(void) { i n t a = 5; zmen(&a); printf " , a) ; return 0; } Petr Velan (Fl MUNI) IB001 29.10.2012 16/25 Přednáška Cvičení Agregované datové typy Kompozitní typy: struktury pole • Homogenní datový typ: pole • Heterogenní datový typ: struktura Petr Velan (Fl MUNI) IB001 Přednáška Cvičení Písemka Datový typ pole • Datový typ pole uchovává více hodnot stejného datového typu • Proměnná v poli se nazývá prvek • K jednolivým prvkům lze přímo přistupovat pomocí jména pole a indexu V jazyce C je pole spojitá oblast v paměti, první prvek je na nejnižší adrese • Jednorozměrná a vícerozměrná pole Petr Velan (Fl MUNI) IB001 29.10.2012 18/25 Přednáška Cvičení Písemka Jednorozměrné pole • datovýtyp identifikátor[velikost] • datovýtyp - datový typ jednotlivých prvků pole • identifikátor - název pole • velikost - počet prvků v poli, indexy začínají od 0 i n t pole[10]; for (int i = 0; i<10; i++) { pole [ i ] = i *2; } for (int i = 0; i<10; i++) { printf ("%d " , pole[ i ]) ; } • Pozor na zápis za poslední index pole Petr Velan (Fl MUNI) IB001 29.10.2012 19/25 Přednáška Cvičení Písemka Datový typ pole • Při definici pole je možné provést inicializaci • Hodnoty ve složených závorkách se postupně přiřazují prvkům pole • Pokud není výčet úplný, zbylé prvky se nastaví na 0 i n t pole[10] = {0,2,4,6,8,10,12,14,16,18}; for (i n t i = 0; i <10; i+ + ) { printf ("%d " , pole[ i ]) ; } Petr Velan (Fl MUNI) IB001 29.10.2012 20/25 Přednáška Cvičení Písemka Datový typ pole • Při inicializaci je možné inicializovat pouze prvky na konkrétních indexech • Navíc je při inicializaci možné nechat určit velikost pole kompilátor (minimální velikost do které se vejdou všechny inicializované prvky) • Neexistuje operátor pro přiřazení polí, je nutné kopírovat jednotlivé prvky i n t pole[] = {0,2,4,6,8,[10] = 18, 20}; for (i n t i = 0; i 0) { p r i n t f ("%d " , pole[ i ]) ; } } return 0; PetrVelan (Fl MUNI)-IBOTI-29.10.20(2-WT?5 Přednáška Cvičení P Písemka • 5.11.2012 • Procvičení práce s poli znaků • Maximálně 25 bodů • Doba trvání cca 50 minut • Bez použití materiálů, pouze nápověda ke knihovním funkcím Petr Velan (Fl MUNI) IB001 29.10.2012