Pseudonáhodná čísla (1) Někdy také nepřesně označována jako náhod-ná čísla Čísla generovaná deterministickým algorit-mem vytvářející posloupnost, která se zdá být náhodná Používána v okamžiku, kdy je pro nějakou ap-likaci potřeba náhodnost, kterou na determi-nistickém počítači nelze přímo dosáhnout 22/05/2018
Pseudonáhodná čísla (2) Pseudonáhodná čísla lze použít např. pro: počítačové hry numerické metody (metoda Monte Carlo) kryptografii Poznámka: posloupnost generovaných čísel je periodická po určité (velmi dlouhé) době se začne opakovat Programovací jazyk C umožňuje generování pseudonáhodných čísel pomocí knihovních funkcí 22/05/2018
Pseudonáhodná čísla (3) Funkce rand: deklarována v: stdlib.h prototyp: int rand(void); funkce: generuje celé pseudonáhodné číslo, které je v rozmezí 0 až RAND_MAX RAND_MAX je konstanta definovaná v hlavičkovém souboru stdlib.h (např. 32767) vrácená hodnota: vygenerované pseudonáhodné číslo 22/05/2018
Pseudonáhodná čísla (4) Funkce srand: deklarována v: stdlib.h prototyp: void srand(unsigned int seed); funkce: inicializuje generátor pseudonáhodných čísel hodnotou seed vrácená hodnota: funkce nevrací žádnou hodnotu poznámka: hodnota předávaného parametru seed se většinou od-vozuje z aktuálního času 22/05/2018
Pseudonáhodná čísla (5) Funkce time: deklarována v: time.h prototyp: time_t time(time_t *timer); funkce: slouží ke zjištění aktuálního času vrácená hodnota: aktuální čas zakódovaný jako objekt typu time_t jestliže parametr timer je různý od hodnoty NULL, pak je vrácená hodnota rovněž uložena do proměnné, jejíž adresa byla v době volání funkci předána 22/05/2018
Pseudonáhodná čísla (6) poznámka: zakódování vráceného času pomocí time_t je závislé na konkrétní platformě většinou se používá počet sekund, které uběhly od 1. 1. 1970, 00:00 UTC programy by k vrácené hodnotě funkcí time neměly přistupovat přímo, ale měly by pro její zpracování využívat další knihovní funkce 22/05/2018
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: 22/05/2018
Znakový typ (2) Patří mezi integrální datové typy ’\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 22/05/2018
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 22/05/2018
Znakový typ (4) Hlavičkový soubor limits.h definuje pojmenované konstanty udávající rozsahy jednotlivých druhů znakového typu: Jméno Hodnota Vý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 22/05/2018
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é) 22/05/2018
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á 22/05/2018
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 22/05/2018
Funkce getchar Deklarována v: stdio.h Prototyp: int getchar(void); 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) 22/05/2018
Funkce putchar Deklarována v: stdio.h Prototyp: int putchar(int c); 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) 22/05/2018
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 {id1, id2, …, idn}; Příklad: enum den {po, ut, st, ct, pa, so, ne}; 22/05/2018
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 p1, p2, …, pn; kde p1, p2, …, pn označují identifikátory proměnných typu jmTypu Příklad: enum den d1, d2; definuje proměnné d1 a d2 typu den 22/05/2018
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) 22/05/2018
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 22/05/2018
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 tri 3 dvanact 12 jedna 1 deset 10 trinact 13 dve 2 jedenact 11 dvacet 20 22/05/2018
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) 22/05/2018
Příkaz switch (2) Obecný tvar: switch (výraz) { case konst_výraz1: příkazy1 case konst_výraz2: příkazy2 case konst_výrazn: příkazyn default: příkazyn+1 } Nepovinná část 22/05/2018
Příkaz switch (3) Funkce: vyhodnotí se řídící výraz je-li hodnota řídícího výrazu (výraz) rovna konst_výrazi (i = 1, 2, …, n) za klíčo-vým slovem case, pak se začnou provádět příkazyi není-li hodnota řídícího výrazu rovna žádnému z konst_výrazi a je-li použito klíčové slovo default, pak se prove-dou příkazyn+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 22/05/2018
Příkaz switch (4) Předá-li se řízení na příkazyi (i = 1, 2, …, n), pak se provádějí postupně všechny příkazyj (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 22/05/2018
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 : 22/05/2018