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