Transcript Prezent
Oblast platnosti identifikátoru (1)
• Oblast ( rozsah ) platnosti identifikátoru je část programu , v níž je daný identifikátor viditel ný ( 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-04-30
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-04-30
2
Oblast platnosti identifikátoru (3)
• Proměnné definované uvnitř bloku : – jazyk C rovněž povoluje, aby proměnné byly de finová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-04-30
3
Oblast platnosti identifikátoru (4)
• Poznámka: – identifikátory označující formální parametry funkce mají oblast platnosti pouze uvnitř pro váděné funkce (podobně jako lokální proměnné ) – identifikátory definované direktivou
#define
jsou platné až do konce souboru nění definice pomocí direktivy nebo do odstra-
#undef
• příklad:
#define N 100
2020-04-30
#undef N 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 globální proměnná ) může být překrytý (např. identifiká torem, který je stejně pojmenován na nižší úrovni (např. a je definován lokální proměnná ) • Poznámka: – identifikátory: • reprezentující formální parametry • definované pomocí direktivy
#define
nemohou být překryty 2020-04-30
5
Funkce bez parametru
• Globálních proměnných parametrů je možné využít pro komunikaci funkce se svým okolím namísto komunikace pomocí formálních a skutečných • 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-04-30
6
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-04-30
7
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-04-30
8
Rekurze (1)
• Schopnost objektů definovat se pomocí sebe sama • Jazyk C umožňuje definovat tzv. rekurzivní funkce • Říkáme, že funkce je rekurzivní (je defino vána rekurzivně ), jestliže se použití její de finice vyskytuje uvnitř definice samotné 2020-04-30
9
Rekurze (2)
• Základní typy rekurze: – přímá : • funkce volá sama sebe – nepřímá : • funkce volá jinou funkci, která potom volá opět funkci výchozí – lineární : • funkce se v jednom průchodu vyvolá jen jednou – stromová : • funkce se v jednom průchodu vyvolá vícekrát 2020-04-30
10
Rekurze (3)
• Výpočet faktoriálu čísla n : – lze využít vztahu: 0! = 1 n! = n.(n–1).(n–2). ... .1 = n.(n – 1)! pro n > 0 – jedná se o nepříliš vhodné použití rekurze – zápis algoritmu pomocí rekurze nebude jedno dušší než zápis bez ní – výsledný program bude pomalejší režií při vyvolávání funkce) (způsobeno 2020-04-30
11
Rekurze (4)
• Výpočet NSD čísel m, n : – NSD (m,0) = m – NSD (m,n) = NSD (n, m mod n) pro n > 0 – tento postup redukuje problém nalezení NSD (m, n) na problém nalezení NSD (n, m mod n), kde 0 m mod n < n – tento proces musí po konečném počtu kroků vést k NSD (a, b), kde b = 0 – vykazuje stejný problém ( je pomalejší ) jako rekurzivní výpočet faktoriálu 2020-04-30
12
Rekurze (5)
• Při použití rekurze je nutné vždy dávat po zor, aby počet rekurzivních vyvolání funkce (tzv. hloubka rekurze ) nebyl příliš vysoký, nebo dokonce nekonečný • Je tedy nutné, aby v definici rekurzivní fun kce byla vždy správně uvedena tzv. ukončo vací podmínka 2020-04-30
13
Rekurze (6)
• Fibonacciho posloupnost : – fib 1 = fib 2 – fib n+2 = fib = 1 n+1 + fib n pro n > 0 – použití rekurze je naprosto nevhodné protože pro n >1 počet volání roste exponenciálně 2020-04-30
14
Rekurze (7)
• Pravidlo : – je-li možné jednoduše použít iterace ( zápisu pomocí cyklu ), pak se rekurzi vyhneme – rekurzi použijeme v případě, že daný problém je definován rekurzivně • Platí : – každý iterativní algoritmus lze napsat rekurziv ně a naopak 2020-04-30
15
Rekurze (8)
• Problém Hanoiská věž : Odkud Kam Pom • Tento problém lze vhodně řešit pomocí rekurze (stromové) 2020-04-30
16
Rekurze (9)
• Při použití nepřímé rekurze je nutné, aby jedna z funkcí byla volána dříve než uvedena její definice je • V takovém případě musíme ještě dříve než použijme vyvolání dosud nedefinované funkce provést zápis jejího prototypu 2020-04-30
17
Rekurze (10)
void void { funkceG( double funkceF( int x) a, int b); funkceG(10.2, 5); } void { funkceG( double a, int b) funkceF(8); }
2020-04-30
18
Hilbertovy křivky (1)
H 1 H 2 H 3 • H i – Hilbertova křivka i-tého řádu • H i+1 dostaneme kompozicí ním třemi přímkami čtyř křivek H i po loviční velikosti, jejich pootočením a spoje 2020-04-30
19
Hilbertovy křivky (2)
• Označme čtyři části křivky H i (Hilbertovy křivky nižšího řádu H i-1 ) symboly A , B , C , D a spojující přímky šipkou odpovídajícího směru • Dostáváme rekurzivní schéma : A: D B: C A B A B A B C: B D: A C D C D D C 2020-04-30
20