25/04/20151 Znakový typ (1) Používán pro reprezentaci konečné uspořá- dané množiny znaků, které umí: –vstupní zařízení akceptovat –výstupní zařízení publikovat Konstanty znakového typu se zapisují jako znaky uzavřené mezi apostrofy –např. ’*’, ’A’, ’B’, ’c’ atd. Pro zápis hodnot znakového typu je také možné použít řídící posloupnost: –uvozena symbolem \ podobně jako v řetězco- vém literálu:
25/04/20152 Znakový typ (2) ’\n’ přechod na nový řádek ’\t’ horizontální tabulátor ’\\’ zpětné lomítko ’\’’ apostrof ’\xhh’ kde hh označuje číslo v šestnáctkové soustavě požadovaného znaku ’\ooo’ kde ooo označuje číslo v osmičkové soustavě požadovaného znaku Patří mezi integrální datové typy Jeho hodnoty jsou celá čísla a mohou se po- užít ve výrazech jako celočíselné operandy
25/04/20153 Znakový typ (3) Jazyk C rozlišuje tři druhy znakového typu: –prostý – char –se znaménkem – signed char –bez znaménka – unsigned char Každý z těchto typů zaujímá stejné množ- ství paměti (1 B sizeof(char) = 1 ), ale může reprezentovat různé hodnoty Interpretace prostého znakového typu (se znaménkem nebo bez znaménka) je závislá na konkrétní implementaci
25/04/20154 Znakový typ (4) Hlavičkový soubor limits.h definuje pojmenované konstanty udávající rozsahy jednotlivých druhů znakového typu: JménoHodnotaVýznam SCHAR_MIN –128 Minimální hodnota pro signed char SCHAR_MAX 127 Maximální hodnota pro signed char UCHAR_MAX 255 Maximální hodnota pro unsigned char CHAR_MIN –128 Min. hodnota pro char CHAR_MAX 127 Max. hodnota pro char
25/04/20155 Znakový typ (5) Na dvojice hodnot znakového typu lze apliko- vat relační operátory ( ==, !=, =, > ) Musí splňovat následující požadavky: –podmnožina dekadických číslic ’0’ až ’9’ musí být numericky uspořádaná a souvislá –podmnožina velkých písmen ’A’ až ’Z’ a pod- množina malých písmen ’a’ až ’z’ musí být abecedně uspořádané (nemusí být souvislé)
25/04/20156 Znakový typ (6) Číselné hodnoty znakových konstant jsou od- vozeny z odpovídající kódové tabulky, např. rozšířené množiny ASCII (American Standard Code for Information Interchange): –platí: X < Y pro X ’A’ ; ’Z’ Y ’a’ ; ’z’ neplatí tedy např. ’a’ < ’Z’ –jestliže rozšířená část ASCII obsahuje znaky ná- rodní abecedy, tak jejich množina není souvislá ani uspořádaná
25/04/20157 Znakový typ (7) Poznámky: –desítková číslice jako konstanta znakového ty- pu nepředstavuje svou numerickou hodnotu. Tuto hodnotu můžeme vypočítat pomocí: c – ’0’, kde c ’0’ ; ’9’ –pro zobrazení (načtení) hodnoty znakového typu prostřednictvím funkce printf ( scanf ) je možné použít specifikaci %c –funkce printf (při použití formátovací znač- ky %c ) zobrazuje znak po převodu na unsigned char
25/04/20158 Funkce getchar Deklarována v: stdio.h Prototyp: int getchar(void); Funkce: –načte znak ze standardního vstupu Vrácená hodnota: –v případě bezchybného načtení vrací načtený znak jako hodnotu typu int –v případě chyby nebo dosažení konce souboru vstupních dat vrací hodnotu EOF (-1) –vrácená hodnota by měla být přiřazována do proměnné typu int (nikoliv char )
25/04/20159 Funkce putchar Deklarována v: stdio.h Prototyp: int putchar(int c); Funkce: –zobrazí znak specifikovaný parametrem c na standardní výstup Vrácená hodnota: –v případě bezchybného výstupu vrací stejný znak, který byl vypsaný –v případě chyby vrací hodnotu EOF (-1)
25/04/ Výčtový typ (1) Představuje množinu celočíselných hodnot reprezentovaných identifikátory Použité identifikátory se nazývají výčtové konstanty Definice výčtového typu: enum jmTypu {id 1, id 2, …, id n }; Příklad: enum den {po, ut, st, ct, pa, so, ne};
25/04/ Výčtový typ (2) Poznámka: –žádný identifikátor se nesmí vyskytovat v sez- namu prvků více než u jednoho výčtového typu Na základě definovaného výčtového typu je možné následně definovat proměnné: enum jmTypu p 1, p 2, …, p n ; kde p 1, p 2, …, p n označují identifikátory proměnných typu jmTypu Příklad: enum den d1, d2; definuje proměnné d1 a d2 typu den
25/04/ Výčtový typ (3) Definici výčtového typu a odpovídajících proměnných lze spojit do jednoho zápisu Příklad: enum barva {cervena, zelena, modra} zaklBarva; Výčtový typ patří mezi integrální typy jeho hodnoty lze používat jako celočíselné operandy (je možné na ně aplikovat stejné operátory)
25/04/ Výčtový typ (4) Celočíselné hodnoty výčtového typu jsou dány pořadím jednotlivých identifikátorů v definici typu (není-li uvedeno jinak): –první identifikátor má hodnotu 0 –hodnoty dalších identifikátorů se zvyšují po jedné Jazyk C také dovoluje konkrétní hodnotě výčtového typu přiřadit libovolné celé číslo
25/04/ Výčtový typ (5) Příklad: enum cisla {nula, jedna,dve,tri, deset = 10, jedenact, dvanact, trinact, dvacet = deset + 10}; Jednotlivé hodnoty výčtového typu pak mají následující celočíselné hodnoty: nula jedna dve tri deset jedenact dvanact trinact dvacet
25/04/ Příkaz switch (1) Slouží k vícenásobnému větvení Testuje, zda (řídící) výraz odpovídá jed- nomu z několika konstantních výrazů Řídící výraz musí být integrálního typu Jednotlivé konstantní výrazy jsou uvozeny klíčovým slovem case a musí být vzájem- ně odlišné, tj. stejný konstantní výraz nesmí být v rámci jednoho příkazu switch po- užitý vícekrát)
25/04/ Příkaz switch (2) Obecný tvar: switch (výraz) { case konst_výraz 1 : příkazy 1 case konst_výraz 2 : příkazy 2 case konst_výraz n : příkazy n default: příkazy n+1 } Nepovinná část
25/04/ Příkaz switch (3) Funkce: –vyhodnotí se řídící výraz –je-li hodnota řídícího výrazu ( výraz ) rovna konst_výraz i ( i = 1, 2, …, n ) za klíčo- vým slovem case, pak se začnou provádět příkazy i –není-li hodnota řídícího výrazu rovna žádnému z konst_výraz i a je-li použito klíčové slovo default, pak se prove- dou příkazy n+1 není-li použito klíčové slovo default, pak se po- kračuje příkazem následujícím bezprostředně za příkazem switch
25/04/ Příkaz switch (4) Předá-li se řízení na příkazy i ( i = 1, 2, …, n ), pak se provádějí postupně všechny příkazy j ( j = i, i+1, …, n ( n+1 )) Provádění pokračuje tak dlouho, dokud se: –nedosáhne konce příkazu switch –nepřejde ven z příkazu switch prostřednict- vím příkazu break, return nebo goto
25/04/ Příkaz switch (5) Poznámka: –je-li zapotřebí, aby se pro více různých hodnot řídícího výrazu provedly stejné příkazy, je možné zapsat více klíčových slov case následovaných různými konstantními výrazy –jako oddělovač (mezi konstantním výrazem a klíčovým slovem case ) se používá symbol :
25/04/ Reálné typy (1) Zahrnují konečnou podmnožinu těch reálných čísel, která jsou zobrazitelná v paměti počítače (v jistém rozsahu a s jistou přesností) Hodnoty reálných typů jsou v paměti zobraze- ny jako čísla v pohyblivé desetinné čárce, tj. jako dvojice čísel (a, b), kde: –a je mantisa –b je exponent
25/04/ Reálné typy (2) V jazyce C se zapisují s desetinnou tečkou nebo ve tvaru aEb (tento zápis odpovídá matematickému zápisu a.10 b ) Je-li alespoň jeden z operandů reálného ty- pu (druhý může být typu celočíselného), dává aplikace operátorů +, –, *, / výsledek reálného typu Hodnoty reálných typů je možné porovná- vat pomocí relačních operátorů
25/04/ Reálné typy (3) V jazyce C je možné pracovat se třemi růz- nými reálnými typy: –float reálné číslo s jednoduchou přesností –double reálné číslo s dvojitou přesností –long double Jazyk C nepředepisuje, jaké velikosti mají být pro jednotlivé reálné typy použity
25/04/ Reálné typy (4) Musí platit: –hodnoty typu float jsou podmnožinou hodnot typu double –hodnoty typu double jsou podmnožinou hod- not typu long double Hlavičkový soubor float.h definuje poj- menované konstanty dokumentující charak- teristiku jednotlivých reálných typů
25/04/ 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 float DBL_ pro typ double LDBL_ pro typ long double –pokračuje zápisem udávajícím konkrétní charak- teristiku, 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
25/04/ 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 FLT_MIN FLT_MAX DBL_EPSILON DBL_MIN DBL_MAX LDBL_EPSILON LDBL_MIN LDBL_MAX E– E– E E– E– E E– E– E B 8 B 12 B
25/04/ Poznámka – vstup/výstup (1) Při zobrazování hodnot reálných typů pomocí funkce printf se používá: –pro hodnoty typu float nebo double specifi- kátor f, e, E, g nebo G –pro hodnoty typu long double modifikátor délky L následovaný příslušným specifikátorem ( f, e, E, g nebo G ) Lf, Le, LE, Lg nebo LG
25/04/ Poznámka – vstup/výstup (2) Pro načítání hodnot reálných typů pomocí funkce scanf se používá: –pro hodnoty typu float operace f, e, g –pro hodnoty typu double modifikátor velikosti l následovaný operací f, e, g ( lf, le, lg ) –pro hodnoty typu long double modifikátor velikosti L následovaný operací f, e, g ( Lf, Le, Lg )
25/04/ Knihovní funkce (1) Hlavičkový soubor math.h poskytuje konstanty (typu double ): M_E hodnota e (Eulerova čísla) M_LOG2E hodnota log 2 e 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 /4 M_1_PI hodnota 1/
25/04/ Knihovní funkce (2) M_2_PI hodnota 2/ M_2_SQRTPI hodnota 2/ 1/2 M_SQRT2 hodnota 2 1/2 M_SQRT1_2 hodnota 1/2 1/2 –funkce, např.: goniometrické (argument musí být vždy v radiánech): –double sin(double x); sin x –double cos(double x); cos x –double tan(double x); tg x cyklometrické (výsledek je vždy v radiánech): –double asin(double x); arcsin x –double acos(double x); arccos x –double atan(double x); arctg x
25/04/ Knihovní funkce (3) hyperbolické: –double sinh(double x); sinh x –double cosh(double x); cosh x –double tanh(double x); tgh x hyperbolometrické: –double asinh(double x); arcsinh x –double acosh(double x); arccosh x –double atanh(double x); arctgh x logaritmické: –double log(double x); ln x –double log10(double x); log x –double logb(double x); log 2 x
25/04/ Knihovní funkce (4) další: –double exp(double x); e x –double fabs(double x); |x| –double sqrt(double x); x 1/2 –double cbrt(double x); x 1/3 –double pow(double x, double y); x y –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
25/04/ Knihovní funkce (5) Poznámky: –jestliže při použití výše uvedených funkcí dojde k chybě, tak se nastaví hodnota proměnné errno na hodnotu různou od nuly –hodnota errno rovna: EDOM značí, že argument funkce je mimo její definiční obor ERANGE značí, že výsledek je příliš velký nebo příliš malý, tj. nelze jej reprezentovat typem, který funkce vrací –konstanty EDOM a ERANGE jsou definovány v hlavičkovém souboru errno.h
25/04/ Knihovní funkce (6) –pokud je zapotřebí testovat hodnotu errno, pak by před voláním funkce měla být proměnná errno nastavena na hodnotu 0