Oblast platnosti identifiktoru 1 Oblast rozsah platnosti identifiktoru
Oblast platnosti identifikátoru (1) • Oblast (rozsah) platnosti identifikátoru je část programu, v níž je daný identifikátor viditelný (dostupný) lze jej použít • Identifikátorem rozumíme např. identifikátor proměnné, funkce nebo typu • Definice identifikátorů (např. proměnných) lze rozdělit na: – globální definice – lokální definice 2020 -11 -03 1
Oblast platnosti identifikátoru (2) • Globální definice (proměnných): – definuje proměnné, jejichž oblast platnosti je od místa definice až do konce souboru – vyskytují se vně definic funkcí • Lokální definice (proměnných): – definuje proměnné, jejichž oblast platnosti je od místa definice až do konce funkce, v níž jsou definovány – vyskytují se uvnitř definic funkcí 2020 -11 -03 2
Oblast platnosti identifikátoru (3) • Proměnné definované uvnitř bloku: – jazyk C rovněž povoluje, aby proměnné byly definovány uvnitř složeného příkazu (bloku) – oblast platnosti těchto proměnných je od místa definice až do konce složeného příkazu • Proměnné definované v cyklu for: – u příkazu cyklu for je možné v části inicializace definovat řídící proměnnou cyklu – oblast platnosti této proměnné je omezena na právě prováděný cyklus 2020 -11 -03 3
Oblast platnosti identifikátoru (4) • Poznámka: – identifikátory označující formální parametry funkce mají oblast platnosti pouze uvnitř prováděné funkce (podobně jako lokální proměnné) – identifikátory definované direktivou #define jsou platné až do konce souboru nebo do odstranění definice pomocí direktivy #undef • příklad: #define N 100 #undef N 2020 -11 -03 4
Oblast platnosti identifikátoru (5) • Jazyk C umožňuje, aby některé identifikátory byly překryty (zastíněny): – identifikátor definovaný na vyšší úrovni (např. globální proměnná) může být překrytý identifikátorem, který je stejně pojmenován a je definován na nižší úrovni (např. lokální proměnná) • Poznámka: – identifikátory: • reprezentující formální parametry • definované pomocí direktivy #define nemohou být překryty 2020 -11 -03 5
Funkce bez parametru • Globálních proměnných je možné využít pro komunikaci funkce se svým okolím namísto komunikace pomocí formálních a skutečných parametrů • Jsou-li uvnitř funkce globální proměnné měněny nežádoucím způsobem, může dojít k tzv. vedlejšímu efektu (side effect) • Proto se pro zajištění vazby funkcí na své okolí preferuje užití formálních a skutečných parametrů 2020 -11 -03 6
Ukazatele na funkce (1) • Jazyk C dovoluje definovat proměnnou jako ukazatel na funkci vracející hodnotu určitého datového typu • Tato proměnná může následně obsahovat adresu, kde se v operační paměti nachází předem definovaná funkce • Definice proměnné, jež reprezentuje ukazatel na funkci se provádí: datový_typ (*ptr. Fun) (typy formálních parametrů); 2020 -11 -03 7
Ukazatele na funkce (2) – datový_typ: • typ hodnoty, kterou funkce (na níž bude ukazovat proměnná ptr. Fun) vrací – ptr. Fun: • identifikátor proměnné typu ukazatel na funkci • musí být zapsán v kulatých závorkách – typy formálních parametrů: • seznam (pouze) datových typů • specifikuje, jaké jsou typy formálních parametrů funkce, na níž bude proměnná ptr. Fun ukazovat • jednotlivé typy se oddělují symbolem čárka 2020 -11 -03 8
Ukazatele na funkce (3) • Příklad: double (*ptr. Fun) (int, int); definuje proměnnou ptr. Fun, která může obsahovat ukazatel na libovolnou funkci, jež má dva formální parametry typu int a vrací hodnotu typu double • Nechť je dána např. funkce: double prumer(int x, int y) { return (x+y)/2. 0; } 2020 -11 -03 9
Ukazatele na funkce (4) • Potom lze provést přiřazení: ptr. Fun = prumer; • Proměnná ptr. Fun nyní obsahuje ukazatel (adresu), kde se v operační paměti nachází funkce prumer • Proměnnou ptr. Fun lze nyní použít pro vyvolání funkce prumer • Příklad: double z; z = ptr. Fun(2, 3); 2020 -11 -03 10
Ukazatele na funkce (5) • Ukazatelů na funkce lze využít pro předání funkce jako parametru jiné funkci • Příklad: double vypocet(int x, int y, double (*p. F) (int, int)) { return p. F(x, y); } z = vypocet(2, 3, prumer); 2020 -11 -03 11
Ukazatele na funkce (6) • Funkce qsort: – deklarována v: stdlib. h – prototyp: void qsort(void *base, size_t num, size_t size, int (*compar) (const void *, const void *)); – funkce: • seřadí num prvků pole, na jehož začátek ukazuje ukazatel base • každý prvek řazeného pole zabírá v operační paměti size bytů 2020 -11 -03 12
Ukazatele na funkce (7) • pořadí prvků je určováno funkcí compar, která je opakovaně volána, aby provedla porovnání dvou prvků • funkce compar musí: – mít následující hlavičku: int compar(const void *p 1, const void *p 2); – vracet hodnotu: <0 jestliže prvek odkazovaný pomocí p 1 předchází prvek odkazovaný pomocí p 2 0 jestliže prvek odkazovaný pomocí p 1 je roven prvku odkazovanému pomocí p 2 >0 jestliže prvek odkazovaný pomocí p 1 následuje prvek odkazovaný pomocí p 2 • jako řadící algoritmu se používá metoda Quick sort – vrácená hodnota: • funkce nevrací žádnou hodnotu 2020 -11 -03 13
Ukazatele na funkce (8) • Funkce bsearch: – deklarována v: stdlib. h – prototyp: void *bsearch(const void *key, const void *base, size_t num, size_t size, int (*compar) (const void *, const void *)); – funkce: • hledá zadaný klíč (na nějž ukazuje ukazatel key) v poli, na jehož začátek ukazuje ukazatel base • prohledávané pole obsahuje num prvků a každý prvek pole zabírá v operační paměti size bytů 2020 -11 -03 14
Ukazatele na funkce (9) • porovnávání prvků je prováděno funkcí compar, pro kterou platí stejná pravidla jako u funkce qsort • jako vyhledávací metoda je použito binární vyhledávání prvky v zadaném poli musí být nejprve seřazeny – vrácená hodnota: • jestliže je prvek nalezen, pak funkce vrací ukazatel na nalezený prvek • v opačném případě funkce vrací hodnotu NULL • Poznámka: – datový typ size_t je chápán jako celočíselný typ bez znaménka 2020 -11 -03 15
Makra (1) • Pro realizaci jednodušších výpočtů lze místo funkcí využít i tzv. makra • Makra je možné definovat pomocí direktivy preprocesoru #define • Příklad: #define PRUMER(A, B) (((A)+(B))/2) • Dříve definované makro lze následně použít x=PRUMER(3+5, 2*8); 2020 -11 -03 16
Makra (2) • Makra jsou zpracovávána preprocesorem na úrovni zdrojového kódu • Preprocesor provede odpovídající náhradu makra jeho definicí: • Např. : x=(((3+5)+(2*8))/2)); 2020 -11 -03 17
M 2160 Úvod do programování II (1) • • • Rekurze Řetězce Datový typ struktura Pojmenované datové typy Datový typ union Práce se soubory: – textové soubory – binární soubory • Dynamické proměnné 2020 -11 -03 18
M 2160 Úvod do programování II (2) • Dynamické datové struktury: – zásobník – fronta – binární vyhledávací strom • Předávání parametrů z příkazové řádky OS • Složitost algoritmů • Úvod do objektově orientovaného programování – jazyk C# • Tvorba aplikací s grafickým uživatelským rozhraním (GUI) 2020 -11 -03 19
- Slides: 19