Funkcionální programování

Save this PDF as:
 WORD  PNG  TXT  JPG

Rozměr: px
Začít zobrazení ze stránky:

Download "Funkcionální programování"

Transkript

1 Funkcionální programování Scheme ale i trochu C#, Boo, Perlu, Smalltalku apod. Jiří Fišer MMVIII

2 Funkcionální paradigma funkcionální paradigma je jedním z klasických paradigmat programování (podobně jako paradigma imperativní nebo logické) je založeno na striktním matematickém základě (tzv. lambda kalkulu) čistě funkcionální jazyky resp. jazyky primárně funkcionální nejsou příliš rozšířené (první jsou přibližně v druhé desítce nejužívanějších jazyků) funkcionální rysy se však vyskytují u většiny moderních jazyků (které dnes typicky podporují více paradigmat)

3 Základní rysy (postačující) jediné výkonné entity programu jsou funkce (= uzavřené rutiny vracející nově vytvořené hodnoty) funkce nemají žádné postranní efekty (tj. mimo jiné vždy platí f(x) = f(x), při každém volání funkce f) hodnoty nejsou modifikovatelné a program nelze popsat jako posloupnost paměťových stavů (tj. neexistuje klasické přiřazení). program není lineární, ale je prováděn jako strom vyhodnocení, který navíc může být vyhodnocen i lenivě (až když je skutečně potřeba)

4 Další typické rysy funkce jsou plnohodnotné (first-class) hodnoty, tj. lze s nimi pracovat v zásadě stejně jako s čísly, řetězci apod. (samozřejmě s jinými operacemi např. skládáním funkcí). Není např. nutné odlišovat funkci a ukazatel na funkce (delegát v názvosloví.net). velkou roli hraje rekurze (nahrazuje cykly, jejichž běžná implementace vyžaduje změnu stavu) velkou roli hrají tzv. funkce vyšších řádů (tj. zjednodušeně funkce nad funkcemi)

5 Proč se učit funkcionální jazyky? získáte jiný pohled na programování (což Vám umožní podívat se na běžné jazyky zvnějšku) uvidíte elegantní způsob řešení některých algoritmů a programových obratů většinu lze navíc přímo použít i v některých moderních OOP jazycích (hlavně C# a Pythonu) navíc je dosti pravděpodobné, že se s některým z funkcionálních jazyků setkáte v dalším studiu nebo dokonce i v praxi.

6 Scheme jazyk Scheme je jedním z nejrozšířenějších dialektů jazyka Lisp, což je nejstarší a stále v praxi nejrozšířenější funkcionální jazyk. jazyk Scheme je relativně jednoduchý (v oblasti syntaxe dokonce minimalistický), kvalitně navržený a snadno popsatelný (je formálně definován a standardizován) Lisp divergence sjednocení Common Lisp Scheme

7 Hello, world program "hello, World" lze sice napsat i ve Scheme, není však pro tento jazyk příliš typický: (display "Hello, world") typičtější program (a navíc čistě funkcionální) (define delka (lambda (seznam) (cond ((null? seznam) 0) (else (+ 1 (delka (cdr seznam)))) ) ) )

8 Syntaxe syntaxe jazyka Scheme je (stejně jako u Lispu) je identická se syntaxí dat, které program zpracovává podobně jako např. u strojového kódu (avšak na mnohem vyšší úrovni abstrakce) platí: data se mohou stát programem (mohou být vykonávány) a naopak program může být snadno zpracováván jako data

9 Atomy základní syntaktickou jednotkou jsou atomy (z hlediska syntaxe nedělitelné) symboly (posloupnost alfanumerických znaků, včetně některých speciálních:! $ % & * + -. / : < = ^ _ ~). Symbols are objects whose usefulness rests on the fact that two symbols are identical (in the sense of eqv?) if and only if their names are spelled the same way. číselné literály například: 2, -3, 2.5, 2.5e3, 2/3, 2+3i, #b10010, #x10fe

10 Atomy II řetězcové literály (v uvozovkách) znakové literály (#\a, #\space, #\newline) boolovské literály (#t, #f) prázdný seznam - označovaný literálem () vektory a porty (pozornost jim budeme věnovat později)

11 Tečka-dvojice z atomů lze budovat složitější struktury pomocí tzv. tečky-dvojice [dotted-pair], což je uspořádaná dvojice výrazů ( atom. atom ) např. ( 2. "dvě"), ( single. #f) tečka-dvojice lze samozřejmě rekurzivně vnořovat a tak lze representovat binární stromovou strukturu ((2. 3). (5. (6. 8)))

12 Seznam pomocí rekurzivních tečka-dvojic jsou ve Scheme representovány i seznamy seznam tvořený prvky p 1,p 2,... p n lze zapsat (p 1. (p 2. (... (p n. () )... ))) resp. i jednodušeji: (p 1 p 2... p n ) p 1 p 2 p n ()

13 Příklad seznamu příklad víceúrovňového seznamu ( (a b) c (c) () ) a c b () = (pomocí tečka dvojic) ((a. (b. ())). (c. ((c. ()). ((). ())))) c () () ()

14 Shrnutí syntaxe data zpracovávaná jazykem Scheme mají podobu tzv. s-výrazů [symbolic expression] s-výraz je: atom (symbol nebo literál) tečka-dvojice = uspořádaná dvojice s-výrazů, která může být zapsána jako: přímý (tečkový) zápis (s-výraz. s-výraz) seznamový zápis [jen struktury, jejichž listový prvek nejvíce vpravo je prázdný seznam] smíšený zápis (např. (2 3. 5)), málo užíván (je však někdy vidět jako chybný výstup)

15 Vyhodnotitelné s-výrazy určitá podmnožina s-výrazů je vyhodnotitelná jako program (tyto s-výrazy jsou označovány jako e-výrazy nebo jako form) při vyhodnocení se kromě syntaxe projevuje i sémantika (která, je odlišná od elementární sémantiky s-výrazů) (+ 2 3) základní sémantika: seznam o třech prvcích (z nichž první je symbol, další dva číselné literály) eval-sémantika: sečtení dvou čísel (výsledek je hodnota 5). První prvek seznamu je symbol vázaný na funkci sčitání, další dva jsou parametry)

16 Vázání pro vyhodnocovací sémantiku (eval-sémantiku) je typické, že symboly neoznačují sami sebe, ale hodnoty které jsou na ně vázány (symbol je pouze referent jiné hodnoty) x 10 hobit Frodo + stroj. kód pro sčítání ostatní typy atomů (literály) v zásadě označuji sami sebe, resp. (přesněji) odkazují na na pevně vázanou hodnotu (literál je totiž také druhem symbolu a nikoliv přímo hodnota). Vazbu literálu není nutné definovat, nelze ji změnit (symbol 3 nemůže odkazovat na hodnotu 2), ale více různých symbolů může odkazovat stejnou hodnotu např a 2e2)

17 Prostředí jako prostředí [environment] je ve Scheme označována množina aktuálních vazeb (užívá se i označení (aktuální) svět [world] po spuštění interpretu nebo překladače již existuje globální prostředí, v němž jsou navázány základní funkce na standardní symboly (např. základní aritmetické operace) vazby v globálním prostředí jsou určeny standardem jazyka (a tvoří tak nejmenší společný základ všech programů ve Scheme.

18 Vyhodnotitelné výrazy I vyhodnotitelné atomy nejjednodušší vyhodnotitelné výrazy, vyhodnotí se na hodnotu spojenou se symbolem (= musí být předem navázán) resp. s literálem příklad: 2, 2+3i, +, sin volání funkce syntakticky se jedná o seznam, v němž je prvním prvkem výraz, jenž je vyhodnocen na funkci (typicky symbol vázaný na funkci), další prvky jsou případné parametry (musí to být vyhodnotitelné výrazy). Vyhodnocují se náhodném pořadí (resp. paralelně) příklad: (sin 2), (+ 2 3), (= (sin 3) (cos (+ 2 3))

19 Vyhodnotitelné výrazy II speciální formy syntakticky se jedná opět o seznamy první prvek určuje sémantiku speciální formy (má podobný význam jako symbol funkce) ostatní parametry se vyhodnocují podle speciálních pravidel (některé nemusí být vůbec vyhodnoceny a jsou interpretována jako data, resp. jsou vyhodnoceny v přesně definovaném pořadí) některé jsou vestavěné, jiné jsou definovány pomocí tzv. maker. příklad: (if (< a b) 0 1), (begin (display a) (display b))

20 Základní speciální formy define = váže symbol na hodnotu (mění prostředí) (define x 2), naváže hodnotu symbolu 2 (paměťová representace dvojky) na symbol x první parametr (zde x) není vyhodnocen (je interpretován jako datový s-výraz) druhý parametr vyhodnocen je (zde 2) quote = nevyhodnocuje svůj první operand (umožňuje tak používat symboly a tečka-dvojice jako data uvnitř programů), srovnej podobné využití uvozovek v textu (např. slovo "je" je sloveso) (quote a), (quote (a b)), (quote 2) [zbytečné] lze zkrátit na 'a, '(a b), '2 (zbytečné)

21 Funkce nad tečka-dvojicemi car (první část dvojice): cons -> * (car '(a. b) ) a cdr (druhá část dvojice): cons -> * (car '(a. b) ) b cons (spojí dva s-výrazy do tečka dvojice) (cons 'a 'b) (a b) názvy funkcí jsou klasické, převzaté z Lispu a souvisí s instrukčním souborem prvé lispovské platformy. angl. výslovnost je / ˈkɑ r/, resp. / ˈkʌdə r/ or / ˈkʊdər/

22 Funkce nad seznamy nad seznamy se používají stejné funkce jako nad tečkadvojicemi, je však nutné si zapamatovat jejich speciální (odvozenou) sémantiku car = první člen seznamu (head) (car '(a b)) a cdr = seznam bez prvního prvku (zbytkový seznam, tail) (cdr '(a b)) (b) nikoliv pouhé b!! (car (cdr '(a b)) b (druhý člen), lze krátit na (cadr '(a b)) cons = přidání nového prvku zleva (na první pozici) (cons 'a '(b c)) (a b c) přidání prvku zprava (na konec) není pomocí cons možné (cons '(a b) 'c) ((a b). c) což není (a b c)!!!

23 Seznamové operace (strom) základní seznamové operace lze snadno znázornit na stromové representaci daného seznamu (důležité). (cadr list) (cdr list) (car list) (caar list) a b () (cdar list) (cdaddr list) c (cddr list) c () () ()

24 Funkce nad čísly většina funkcí nad čísly je vázána na běžně používané symboly. Pozor však na prefixovou notaci (volání začíná závorkou a symbolem funkce). Je to nezvyklé, ale nemusíte si pamatovat žádné priority. (sin (+ 2 x (* 3 y (sqrt z)))) použít lze i relační operátory (=, <, >, >=), zbytek pod dělení (modulo, remainder), běžné transcendentální funkce, konverze (number->string, string->number), apod. Viz Revised^5 Report 6.2.

25 Predikáty jako predikáty se označují funkce vracející logické hodnoty. Pro predikáty se používají symboly zakončené otazníkem (úzus) predikáty shody eq? = porovnání symbolů (eq? 'a 'a) #t, (eq? e2) #f (!, obecně nedef.) eqv? = hodnotové porovnání (mělké, u seznamů umístění) (eq? e2) #t (eqv? '(1 2) '(1 2)) #f (!) ale (define x '(1 2)) (eqv? x x) #t equal? = hodnotové porovnání (hluboké) (equal? '(1 2) '(1 2)) #t

26 Klasifikační predikáty klasifikace podle datového typu hodnoty number?, complex?, real?, string?, symbol?, boolean?, pair?, char?, procedure? detailnější klasifikace null? (prázdný seznam), list? (libovolný seznam), even? (sudé číslo), zero? (nula), char-alphabetic?, apod.

27 Lambda forma lambda speciální forma (λ-forma,nepřesně lambda funkce) umožňuje vytvářet hodnoty typu funkce matematická definice funkce jméno funkce vázané proměnné (vazba je lokální) f(x, y) = x + y 2 poziční pojmenované parametry (důležitá je pozice) při definici funkce jako hodnoty není důležité jméno nově vytvářené funkce (= funkce je anonymní) (lambda (x, y) (+ x (* y y)) funkce (shodná s f)

28 Pojmenované funkce lambda formu lze využít jako první prvek v zápisu volání funkce: ((lambda (x) (* x x)) 2) 4 pokud je však funkce využita vícekrát je lepší ji navázat na (volný) symbol: (define sqr (lambda (x) (* x x))) (sqr 2) tento zápis se používá ve Scheme velmi často (programy a knihovny jsou tvořen definicemi funkcí) a proto pro něj existuje syntaktická zkratka: (define (sqr x) (* x x))

29 Lokální prostředí při vyhodnocování těla lambda formy (ke které dochází, až při volání příslušné funkce) jsou e-výrazy vykonávány v tzv. lokálním prostředí lokální prostředí = prostředí v lexikálním rozsahu [scope] definice funkce + vazby parametrů důležité je, že lokální prostředí je dáno prostředím v lexikálním rozsahu definice (lexikální vazba) nikoliv v okamžiku volání funkce (dynamická vazba) (define x 'global) (define printx (lambda () (display x))) (define testwithx (lambda (x) (printx))) (define x 'new-global) (testwithx 'local) new-global (!!!)

30 Lexikální vers. dynamická vazba lexikální vazba je typická pro imperativní (algolské) jazyky (např. C, C# atd.). Je navíc přehlednější pro programátory (kolize identifikátorů jsou méně časté) na druhou stranu komplikuje představu (a implementaci) vazby. Symbol může mít v jednom okamžiku více navázaných hodnot (pro každý lexikální rozsah nejvýše jednu) dynamická vazba byla typická pro původní Lisp, dnes je podporována jen jako specializovaná varianta v několika málo jazycích (Common Lisp, Perl)

31 Dynamická vazba v Perlu $x = "global"; sub printx () { print $x; } sub testwithx ($) { local $x = shift; #prevzeti parametru printx; } $x = "new-global"; testwithx("local"); print "\n"; print $x; #pro kontrolu (globalni x nezmeneno)

32 Uzávěr použití lexikální vazby však vede k zajímavému efektu, který lze nejsnadněji ilustrovat u funkcí vracející nově vytvořenou (anonymní) funkci (define novyvypisovac (lambda (text) (lambda () (display text));vraci anon. fci )) (define pozdrav (novyvypisovac "ahoj")) (pozdrav) vypíše "ahoj" Nově vytvořená (a následně pojmenovaná) funkce v sobě totiž uzavírá prostředí lexikálního rozsahu, v němž byla definována (které by zde jako lokální zaniklo tj. byly by uvolněny i vázané hodnoty parametrů ). Funkce + prostředí lexikálního rozsahu = uzávěr [closure]

33 Uzávěr II uzávěry vznikají v případě, že tělo funkce má tzv. volné symboly (tj. symboly na které nejsou vázány parametry lambda formy). Užitečné jsou především uzávěry, vzniklé z lokálního prostředí (umožňuji totiž generovat uzávěry s různými vazbami na požádání) uzávěry hrají důležitou roli ve funkcionálním programování, neboť umožňují vytvářet funkce spojené se svými daty (ty se pak nemusí předávat jako parametry). V zásadě se jedná o OOP objekt naruby (u něj jsou naopak data spojena s metodamifunkcemi)

34 Uzávěry v Boo většina moderních jazyků, podporujících funkce jako first-class hodnoty, podporuje i uzávěry (např. Python, Boo, Perl, Smalltalk, Rubby [zde jsou zvlášť důležité]). Zápis v Boo: def novyvypisovac (text as string): return { print text; } pozdrav = novyvypisovac("ahoj") pozdrav() Mechanismus je tedy stejný jako u Scheme (syntaxe je však převzata z Pythonu)

35 Uzávěry v C# některé další jazyky podporují uzávěry omezeně (pouze pro speciální třídu vykonávatelných entit). Například v C# jsou uzávěry podporovány pouze u anonymních delegátů (od verze 2.0, verze 3.0 přináší jednodušší syntaxi) do (uzavřeného) lexikálního prostředí zde kromě lokálních proměnných patří i objekt this (je-li uzávěr vytvořen v instanční metodě)

36 C# - ukázka using System; delegate void Action(); class Program { } static Action NovyVypisovac(string text) { return delegate () {Console.WriteLine(text);}; } public static void Main() { } Action pozdrav = NovyVypisovac("ahoj"); pozdrav();

37 Uzávěry ve Smalltalku v objektovém jazyce Smalltaku, hrají anonymní funkce a uzávěry centrální roli (nazývají se zde bloky) pomocí uzávěrů jsou implementovány i tak základní konstrukce jako podmíněné vykonávaní nebo cykly (částečně se tomu blíží jazyk Ruby, který však podporuje i běžné procedurální konstrukce) num > 5 iftrue: [num:=1] iffalse: [num:=num+1]. oba bloky jsou parametry metody iftrue:iffalse, která je volána na boolovský objekt získaný vyhodnocením (num>5). Vykonán je pouze jeden z nich. 1 to: 5 do: [num transcript print:num] zde je adresátem hlavní metody do: objekt rozsahu (1 to: 5)

38 Uzávěry v C++ v jazyce C++ nejsou (prozatím) uzávěry podporovány, lze je však funkčně nahradit pomocí objektů (nesoucích uzavřené informace) implementujících operátor volání funkce (tj. i syntakticky napodobují uzávěry) v nově navrhovaném standardu jazyka (C++ 0X), jsou však uzávěry přímo podporovány (v několika verzích). (pojetí je však poněkud netradiční, ale odpovídá imperativnímu charakteru jazyka)

39 Currying standardní zápis lambda funkce např. (lambda (x, y) (+ x (* y y)) (zde s uvedením dvou pozičních parametrů) lze přepsat do tvaru (např.): (lambda (x) (lambda (y) (+ x (* y y)))) jenž používá jen funkce o jednom parametru a odpovídá tak přímo zápisu λ-kalkulu: λx. λy. x + y 2 sémantika: vnější funkce (s parametrem x) je aplikována na první parametr, a vrací další funkci-uzávěr (s parametrem y), která je následně aplikována na druhý parametr. Převod funkce s více parametry na funkce s jedním parametrem se nazývá currying. Má velký význam teoretický, a je plně podporován v Haskellu.

40 Podmínky I Ve funkcionálních jazycích existují konstrukce pro podmíněné vyhodnocování (obdoba příkazu if) klasická (lispovská) speciální forma pro podmíněné výrazy je cond (a je opravdu speciální) (cond ) (p 1 e 1 ) (p 2 e 2 )... (p n e n ) (else e n+1 ) Nejdříve jsou vyhodnocovány postupně výrazy (podmínky) p 1 až p n. Pokud je podmínka p i pravdivá pak je vyhodnocen výraz e i a vyhodnocení cond končí (hodnotou cond je hodnota e i ) (= vykoná se pouze první větev s pravdivou podmínkou). Symbol else je (pouze zde) synonymem pro #t, to jest poslední (nepovinná) podmínka je splněna vždy (není-li pravdivá žádná z předchozích podmínek e n+1 se vyhodnotí vždy.

41 Podmínky II (define (factorial n) (cond ( ( = n 1) 1) ( else (factorial (- n 1) ) ) Kromě cond(ition) existuje i speciální forma if, která odpovídá ternárnímu operátoru jazyka C (Java, C#) (if podmínka true-výraz false-výraz) nejdříve se vyhodnotí podmínka, podle výsledků pak jeden z následujících výrazů. Forma if je však méně pružná a není ani výrazně přehlednější ( nebudu ji užívat)

42 Rekurze rekurze hraje ve funkcionálním programování klíčovou roli, neboť kromě běžných rekurentně orientovaných algoritmů se rekurze používá jako náhrada cyklů velmi významná je především tzv. tail-rekurze, kdy je poslední vyhodnocovanou operací funkce rekurzivní volání, tj. na výsledek rekurzivně volané funkce se již neaplikuje žádná další operace (výše uvedený faktoriál je tohoto typu) Tail-rekurzi lze v imperativním jazyce snadno (ručně) přepsat na iteraci, v funkcionálním jazyce to za Vás udělá interpret či kompilátor. Paměťová náročnost se sníží z O(n) na O(1).

43 Rekurze II (define (spoj s1 s2) (cond ((null? s1) s2) (else (cons (car s1) (spoj (cdr s1) s2))) ) ) Tento rekurzivní algoritmus není tail-rekurze (na výsledek je volána operace cons). Je však typický, neboť rozkládá operaci na dvě fáze: 1) nejdříve se při vnořování rekurze (tj. volání dalších rekurzivních instancí funkce) rozkládá (pomocí car,cdr původní seznam, zde s1). Rekurzivní volání se volá vždy na zbytkový tj. menší podseznam) 2) při výstupu (vynořování), tj. návratu z rekurzivních volání se konstruuje nový seznam

44 Rekurze III graf (rozpis) volání (spoj '(a b) '(c)) ('a. (spoj '(b) '(c)) ) ('a. ('b. (spoj '() '(c)) ) ) ('a. ('b. '(c) ) ) ('a. '(b c) ) '(a b c) vnořování / rozklad substituce podle koncové podmínky vynořování / konstrukce nového seznamu

45 Speciální forma and a or funkce and resp. or by mohly být definovány jako běžné funkce nad alespoň jednou logickou hodnotou. pro efektivnější vykonávání se však jedná o speciální formy se zkráceným vyhodnocováním (u neparalelní implementace s postupným vyhodnocováním) (and p1 p2... pn) výrazy p i se vyhodnocují postupně. Je-li nějaký nepravdivý pak se vyhodnocení ukončí a funkce vrací #f, pokud jsou všechny pravdivé pak #t. Speciální forma or je definována obdobně.

46 Příklad (and) (define test-leaf (lambda (tree predicate) (cond ((pair? tree) (and (test-leaf (car tree) predicate) (test-leaf (cdr tree) predicate) )) ) ) ) ((null? tree) #t) (else (predicate tree) Funkce zjišťuje, zda všechny (listové) prvky stromu tečka dvojic splňují daný predikát.nezohledňuje přitom prázdné seznamy, což umožňuje použití funkce i pro (obecně víceúrovňové) seznamy. Predikát musí mít aritu 1.

47 Funkcionály funkcionály resp. funkce vyšších řádů jsou funkce nad funkcemi (= funkce, jejichž parametry jsou další funkce) příkladem funkcionálu je i výše uvedená funkce testleaf (lze ji chápat jako funkci nad predikátem) nejobecnějším běžně používaným funkcionálem je skládání funkcí (samozřejmě obě aritou 1): (define (compose g f) (lambda (x) (g (f x))) )

48 Funkcionály nad seznamy důležitou roli v praktickém programování ve Scheme hrají funkcionály pracující se seznamy. Tyto funkcionály umožňují stručnější zápis rozsáhlé třídy algoritmů. Obecně je lze používat pro různé druhy iterací, čímž se lze vyhnout explicitnímu použití rekurze (ta není eliminována, ale je skryta v kódu funkcionálů) mezi nejčastěji používané seznamové funkcionály patří: map, zip, fold, filtr.

49 Map nejdůležitějším seznamovým funkcionálem je map (zkratka z anglického mapping) funkce (map f list), vytváří nový seznam, který je tvořen prvky seznamu list, na něž byla aplikována unární funkce f. funkce map může být také označována jako transform (C++), collect (Smalltalk), resp. Select (LINQ) x 1 x 2 x 3 x 4 x 5 f f f f f f(x 1 ) f(x 2 ) f(x 3 ) f(x 4 ) f(x 5 )

50 Zip funkcionál (zip f list1 list2) vrací nový seznam, který vznikne aplikováním binární funkce f na (pozičně) si odpovídající prvky seznamu list1 a list. typické využití je například pro sčítaní dvou vektorů (číselných seznamů): (zip + v1 v2) x 1 x 2 x 3 x 4 x 5 f(x 1, y 1 ) f(x 2, y 2 ) f(x 3, y 3 ) f(x 4, y 4 ) f(x 5, y 5 ) y 1 y 2 y 3 y 4 y 5

51 Foldr funkcionál (foldr f seznam) přejímá binární funkci a seznam. Převede seznam na jedinou hodnotu, tím, že aplikuje binární funkci f mezi prvky seznamu. Lze jej přesněji definovat rekurzivně: (define (foldr f list) (cond ((jednoprvkovy? list) (car list)) (else (f (car list) (foldr f (cdr list)))) ) )) foldr[+, (1 2 3)] = 1 + foldr[+, (2 3)] = = 1 + (2 + foldr[+,(3)]) = (1 + (2 + (3)) = 6 = suma[(1,2,3)] foldr = right fold = fold from right = sviň (slož) zprava

52 Foldr II funkci foldr lze zobecnit přidáním dalšího parametru počáteční hodnoty: (foldr f initval list) pokud je tato hodnota zadána, pak se první akumulační operace provede mezi poslední hodnotou seznamu a počáteční hodnotou (foldr f p (x 1 x 2 x 3 x 4 )) f x 1 x 2 x 3 x 4 p zobecnění zjednoduší implementaci, vždy lze nalézt ekvivalentní volání (např. (foldr + 0 seznam) pro sumu), ale především rozšiřuje možnosti použití: (foldr (lambda (p s) (cons (cons p s) '())) '() '(a b c d)) f

53 Foldl sesterskou funkcí funkce foldr je funkce foldl (left fold), která při výpočtu postupuje z opačné strany (zleva). Nejdříve aplikuje akumulační funkci na počáteční hodnotu a první prvek hodnotu, potom na mezivýsledek a druhý prvek, atd. (foldl + 0 '(1 2 3)) (((0 + 1) + 2) + 3) pro komutativní operace je foldl ekvivalentní funkci foldr (zde doporučuji používat foldl), jiná situace je u nekomutativních operací: (foldl (lambda (list item) (cons item list)) '() '(a b c))

54 Fold v programovacích jazycích pro skupinu funkcí fold používají se i alternativní názvy: reduce (Python, JavaScript), accumulate (C++), Aggregate (LINQ), resp. inject (Rubby, Smalltalk? ). Většinou se jedná o levou variantu a ve většině jazyků jsou k dispozici i ve tvaru s počáteční hodnotou. ve Scheme jsou v základní knihovně dispozici až od šesté revize (R 6 RS) pod jmény fold-right a fold-left (s počáteční hodnotou)

55 Filtr funkcionál (filtr list predikát), vytváří nový seznam, v němž jsou jen prvky, pro něž je (unární) predikát pravdivý. (filtr number? '(a b 2 c)) (2) kromě jména filter (Haskell, Scheme R6 RS, Python, JavaScript), se používají i varianty na remove-if (C++, CLisp), grep (Perl) resp. Where (LINQ)

56 Praktický příklad na funkcionály (define (prumer s) ) (foldr / 1 (foldr (lambda (x suma) (list (+ x (car suma)) (+ 1 (cadr suma)))) '(0 0) s)) výpočet pomocí: (/ (foldl + 0 s) (length s)) je také možný, vyžaduje však dvojí procházení seznamu (což zde nevadí)

57 Datové struktury I v praktických programech se často vyskytuje požadavek na representaci strukturovaných údajů. Ty lze samozřejmě representovat i ve Scheme: seznamové (list-like) representace údaj je representován jako (nehomogenní) seznam přímých dat, význam údajů je dán pouze pozicí ("Frodo Pytlík" hobit #t 50) slovníková (directory-like) representace údaj je representován jako seznam dvojic: identifikátor, hodnota (na pořadí nezáleží) ((jmeno. "Smíšek") (druh. hobit) (drzitel-prstenu. #f) (vek. 30))

58 Datové struktury II explicitní využívání identifikátorů je vhodnější pro rozsáhlejší struktury (odpovídá slovníkové implementaci tříd v jazycích jako je JavaScript, Perl, Python) pro přístup k seznamové representaci je možno použít indexaci resp. cad{0,3}r funkce pro přístup ke slovníkové representaci je nutno použít uživatelské funkce (define (field key dict) (cdar (filtr (lambda (pair) (eq? (car pair) key)) dict)) )

59 Funkcionály nad strukturami pro zpracování seznamů struktur je vhodné používat funkcionály úkol: nalézt průměrný věk držitelů prstenu v seznamu postav Pána prstenů (se slovníkovou representací) (define (field-getter key) (lambda (dict) (field key dict)) ) (prumer (map (field-getter 'vek) (filtr (field-getter 'drzitel-prstenu) postavy ) ) ) funkce field-getter vrací uzávěr pro získaní pole se seznamu.

60 Funkcionály v Boo funkcionály lze použít i v Boo. Příklad ukazuje výpočet hodnoty polynomum jenž je založen na Hornerově schématu (a užívá pomocného uzávěru) def horner(x as double) as BinOp: return {acc as double, next as double return x*acc + next} reducewith(horner(2), 2, 3, 4) //foldr nebo foldl kde reducewith je uživatelská funkce, specializovaná pro zipovací funkce typu (double, double) double [statické typování znevýhodňuje použití obecných funcionálů]. callable BinOp(x as double, y as double) as double def reducewith(op as BinOp, *xs as (double)) as double

61 Funkcionály v C# (Linq) nový mechanismus Linq přináší sílu funkcionálů i do jazyka C# (a to přímo na úrovni jeho syntaxe) var result = postavy.where(p => p.drzitelprstenu).select(p => p.vek).average(); OOP syntax var result = (from p in postavy query comprehension syntax (SQL like) where p.drzitelprsten select p.vek).average();

62 Funkcionály v C# (II) funkcionály lze v C# aplikují nad libovolným typem podporujícím generické rozhraní: IEnumerable<T> vykonávání je odložené (deffered) resp. lenivé (lazy), tj. další prvky jsou z enumerátoru (iterátoru) převzaty až v okamžiku, kdy jsou potřeba některé funkcionály tak lze volat i na nekonečné (neohraničené) iterátory (viz později Haskell) integers.first(x => DokonaleCislo(x)) -- integers může být neohraničený iterátor

63 Scheme jako imperativní jazyk Scheme není ve skutečnosti čistě funkcionální jazyk, ale podporuje i některé imperativní konstrukce: funkce s vedlejšími efekty (typicky IO funkce) speciální formu begin (posloupnost postupně vykonávaných funkcí) resp. podobné rozšíření formy lambda. přiřazení set! (mění se obsah paměťového místa ne vazba) cyklus do (se změnou stavu), for-each (podobně jako map ale pro postranní efekty) přímé modifikace tečka dvojic (set-car!, set-cdr!)

64 Scheme jako imperativní jazyk II imperativní konstrukce (především ty tvrdé (hard), označené v identifikátoru vykřičníkem jsou sice přípustné, ale podobně jako goto ve strukturovaných jazycích mohou zcela eliminovat výhody funkcionálního zápisu. na druhou stranu mohou program podstatně zrychlit a zmenšit jeho paměťovou náročnost (významné je např. menší zatížení garbage kolektoru)

65 Pokračování (continuation) pokračování je hodnota zapouzdřující aktuální stav výpočtu (prostředí + rámce vykonávaných funkcí). pokračování do hodnoty zabalená budoucnost umožňuje ve Scheme implementovat skoky (nebezpečné), výjimky (užitečné), resp. dokonce korutiny (povznášející) pokračování jsou ve Scheme dostupná pomocí funkce call-with-current-continuation. Běžně se používá zkratka call/cc (není podporována ve standardním globálním prostředí)

66 Call-with-current-continuation v místě, v němž si chceme zapamatovat stav provádění (k němuž se hodláme vrátit), musí být volána funkce call-with-current-continuation. tato funkce má jediný parametr, jímž je funkce, které je po vytvoření hodnoty pokračování předáno řízení a jako parametr je jí předáno pokračování (= je volána with current continuation, kde continuation je parametr) uvnitř této funkce můžeme použít pokračování jako funkci. Po jejím vyvolání s jedním parametrem, je obnoven stav v okamžiku volání funkce call-withcurrent-continuation a ta se následně ukončí s hodnotou parametru předaného pokračování.

67 Pokračování (return) nejjednodušší použití pokračování je implementace předčasného ukončení funkce (s přenosem návratové hodnoty tj. return) (define (search wanted? lst) (call/cc (lambda (return) (for-each (lambda (element) normální návrat obnovení pokračování )) (if (wanted? element) (return element))) lst) #f)

68 Pokračování vícenásobné vyvolání pokračování, která jsou obnovitelná pouze z vnořených funkcí (a pouze jednou) se označují jako úniková (escape) Scheme však nabízí pokračování, která lze obnovit z libovolného místa programu a to i vícenásobně. (define inc #f) (+ 1 (call/cc (lambda (c) (set! inc c) 1))) ;; vrátí 2 (inc 2) ;; obnoví vykonávání v místě pokračování a vrátí 3 (inc 3) ;; znovu obnoví a vrátí 4 příklad je umělý (inkrementaci lze definovat mnohem snadněji a elegantněji) je to však první krok ke korutinám.

69 Korutiny korutina = rutina, která má více vstupních a výstupních bodů zpracování korutiny může být přerušeno (ve výstupním bodě) a řízení předáno jiné korutině. poté může být provádění korutiny opět obnoveno (nejčastěji ve stejném bodě, kde bylo přerušeno) korutiny jsou implementací kooperativních vláken (threadů)

70 Pokračování (korutiny) (define continuation #f) (define (coroutine list) (for-each (lambda (item) (display item) (set! continuation (call/cc (lambda (c) (continuation c)))) ) list )) (set! continuation (lambda (c) (set! continuation c) (coroutine '(a b c)))) ;;počáteční nastavení (coroutine '(1 2 3)) 1a2b3c

71 Korutiny v C# jazyk C# poskytuje jen omezenou podporu korutin. Ty jsou navíc primárně specializovány pro jediný účel: vytváření enumerátorů (přesněji generátorů) public static IEnumerable<int> integers () { int i = 0; while(true) //nekonečný generátor yield return ++i; } korutiny lze řídit (opětně volat) jen prostřednictvím metody Next rozhraní IEnumerable<T> (to je neomezuje, jen je to nepohodlné), nemohou být přerušeny v podřízené rutině a nemohou jim být opakovaně předávány parametry (jen při jejich vytváření, tj. při prvním volání), viz (řešení pro Python)

72 Scheme - striktní jazyk jazyk Scheme je striktní tj. před voláním funkce jsou všechny její parametry vyhodnoceny (i když to nemusí být pro další výpočet nutné) striktní jsou svou podstatou všechny imperativní jazyky opakem striktního vyhodnocení je lenivé [lazy] vyhodnocení lenivé vyhodnocení je u většiny jazyků (včetně Scheme) omezeno na některé operátory (např. logické) ve funkcionálních jazycích lze lenivé vyhodnocení implementovat pomocí anonymních funkcí, kdy je výpočet zapouzdřen pomocí lambda formy. Musí to však být explicitním zápisem a je to nepraktické.

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY KATEDRA INFORMATIKY, PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY VÝVOJ TOHOTO UČEBNÍHO MATERIÁLU JE SPOLUFINANCOVÁN EVROPSKÝM

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

Lokální definice (1) plocha-kruhu

Lokální definice (1) plocha-kruhu Lokální definice (1) syntaxe: (local (seznam definic) výraz) definice jsou dostupné pouze uvnitř příkazu local příklad: (local ( (define Pi 3.1415926) (define (plocha-kruhu r) (* Pi r r)) ) (plocha-kruhu

Více

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v DSL manuál Ing. Jan Hranáč 27. října 2010 V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v současné době krátký) seznam vestavěných funkcí systému. 1 Vytvoření nového dobrodružství Nejprve

Více

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech 7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,

Více

Program a životní cyklus programu

Program a životní cyklus programu Program a životní cyklus programu Program algoritmus zapsaný formálně, srozumitelně pro počítač program se skládá z elementárních kroků Elementární kroky mohou být: instrukce operačního kódu počítače příkazy

Více

Datové typy strana 29

Datové typy strana 29 Datové typy strana 29 3. Datové typy Jak již bylo uvedeno, Java je přísně typový jazyk, proto je vždy nutno uvést datový typ datového atributu, formálního parametru metody, návratové hodnoty metody nebo

Více

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda 1. Lze vždy z tzv. instanční třídy vytvořit objekt? 2. Co je nejčastější příčinou vzniku chyb? A. Specifikace B. Testování C. Návrh D. Analýza E. Kódování 3. Je defenzivní programování technikou skrývání

Více

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Využití OOP v praxi -- Knihovna PHP -- Interval.cz Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování

Více

4.4.2012. Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

4.4.2012. Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady Základy programování (IZAPR, IZKPR) Přednáška 5 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky Příkazy cyklu -

Více

MQL4 COURSE. By Coders guru www.forex-tsd.com. -4 Operace & Výrazy

MQL4 COURSE. By Coders guru www.forex-tsd.com. -4 Operace & Výrazy MQL4 COURSE By Coders guru www.forex-tsd.com -4 Operace & Výrazy Vítejte ve čtvrté lekci mého kurzu MQL4. Předchozí lekce Datové Typy prezentovaly mnoho nových konceptů ; Doufám, že jste všemu porozuměli,

Více

Kód. Proměnné. #include using namespace std; int main(void) { cout << "Hello world!" << endl; cin.get(); return 0; }

Kód. Proměnné. #include <iostream> using namespace std; int main(void) { cout << Hello world! << endl; cin.get(); return 0; } Jazyk C++ Jazyk C++ je nástupcem jazyka C. C++ obsahuje skoro celý jazyk C, ale navíc přidává vysokoúrovňové vlastnosti vyšších jazyků. Z toho plyne, že (skoro) každý platný program v C je také platným

Více

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování Vzdělávací oblast Informatika a informační a komunikační technologie pro vzdělávací obor Programování

Více

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39 Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy

Více

Základní datové struktury

Základní datové struktury Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013

Více

Maturitní témata Školní rok: 2015/2016

Maturitní témata Školní rok: 2015/2016 Maturitní témata Školní rok: 2015/2016 Ředitel školy: Předmětová komise: Předseda předmětové komise: Předmět: PhDr. Karel Goš Informatika a výpočetní technika Mgr. Ivan Studnička Informatika a výpočetní

Více

Z. Kotala, P. Toman: Java ( Obsah )

Z. Kotala, P. Toman: Java ( Obsah ) Z. Kotala, P. Toman: Java ( Obsah ) 13. Výjimky Výjimka (exception) je definována jako událost, která nastane během provádění programu a která naruší normální běh instrukcí. Výjimka je vyvolána například

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu 1 Podklady předmětu pro akademický rok 2006/2007 Radim Farana Obsah 2 Obsah předmětu, Požadavky kreditového systému, Datové typy jednoduché, složené, Programové struktury, Předávání dat. Obsah předmětu

Více

Seminář Java II p.1/43

Seminář Java II p.1/43 Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii

Více

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4 Obsah Obsah 1 Jednoduché datové typy 1 2 Strukturované datové typy 2 2.1 Pole.................................. 2 2.2 Záznam................................ 3 2.3 Množina................................

Více

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování. Delphi lekce 6 Minimum z Object Pascalu Vrátíme se ještě k základům Object Pascalu. Struktura programu Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově

Více

scalaz-stream Radek Miček

scalaz-stream Radek Miček scalaz-stream Radek Miček Obsah 1. Jednoduché zpracování proudů C# + standardní knihovna vs Scala + scalaz-stream 2. Použití knihovny scalaz-stream v naší aplikaci O naší aplikaci Architektura naší aplikace

Více

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007 WSH Windows Script Hosting OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007 Co je skript? Skriptování nástroj pro správu systému a automatizaci úloh Umožňuje psát skripty jednoduché interpretované programové

Více

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci Základy programovaní 4 (Java) Stream API Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci Petr Krajča (UP) KMI/ZP4JV 5. listopad, 2014 1 / 10 Stream API Java 8 nový přístup k práci s kolekcemi

Více

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR): Mezi příkazy pro manipulaci s daty (DML) patří : 1. SELECT 2. ALTER 3. DELETE 4. REVOKE Jaké vlastnosti má identifikující relace: 1. Je relace, která se využívá pouze v případě modelovaní odvozených entit

Více

Architektury počítačů a procesorů

Architektury počítačů a procesorů Kapitola 3 Architektury počítačů a procesorů 3.1 Von Neumannova (a harvardská) architektura Von Neumann 1. počítač se skládá z funkčních jednotek - paměť, řadič, aritmetická jednotka, vstupní a výstupní

Více

7. Datové typy v Javě

7. Datové typy v Javě 7. Datové typy v Javě Primitivní vs. objektové typy Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů

Více

Profilová část maturitní zkoušky 2013/2014

Profilová část maturitní zkoušky 2013/2014 Střední průmyslová škola, Přerov, Havlíčkova 2 751 52 Přerov Profilová část maturitní zkoušky 2013/2014 TEMATICKÉ OKRUHY A HODNOTÍCÍ KRITÉRIA Studijní obor: 78-42-M/01 Technické lyceum Předmět: TECHNIKA

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Rozšíření ksh vůči sh při práci s proměnnými

Rozšíření ksh vůči sh při práci s proměnnými Rozšíření ksh vůči sh při práci s proměnnými (X36UNX, Jan Skalický, 2006) Pole homogenní lineární struktura implicitn ě s číselným rozsahem index ů 0...1023 (někde 4095) implicitn ě řetězcov ě orientovaná

Více

Datové struktury. alg12 1

Datové struktury. alg12 1 Datové struktury Jedna z klasických knih o programování (autor prof. Wirth) má název Algorithms + Data structures = Programs Datová struktura je množina dat (prvků, složek, datových objektů), pro kterou

Více

Vývojové diagramy 1/7

Vývojové diagramy 1/7 Vývojové diagramy 1/7 2 Vývojové diagramy Vývojový diagram je symbolický algoritmický jazyk, který se používá pro názorné zobrazení algoritmu zpracování informací a případnou stručnou publikaci programů.

Více

Modely datové. Další úrovní je logická úroveň Databázové modely Relační, Síťový, Hierarchický. Na fyzické úrovni se jedná o množinu souborů.

Modely datové. Další úrovní je logická úroveň Databázové modely Relační, Síťový, Hierarchický. Na fyzické úrovni se jedná o množinu souborů. Modely datové Existují různé úrovně pohledu na data. Nejvyšší úroveň je úroveň, která zachycuje pouze vztahy a struktury dat samotných. Konceptuální model - E-R model. Další úrovní je logická úroveň Databázové

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

PHP. nejen pro začátečníky. $c; echo { Martin Pokorný. Vzdìlávání, které baví www.c-media.cz. Nakladatelství a vydavatelství.

PHP. nejen pro začátečníky. $c; echo { Martin Pokorný. Vzdìlávání, které baví www.c-media.cz. Nakladatelství a vydavatelství. }else{ { if($b >$ c){ echo $max=$b; // vypí }else{ echo $max=$c; // vypí?> cas se }e B : se{ echo B ; default: ($b>$c){ echo C ; } $max=$b; }else{ $max=$c; PHP nejen pro začátečníky k;?> $c; echo { Martin

Více

Sekvenční a podmíněné provádění

Sekvenční a podmíněné provádění Programování v Bourne shellu Sekvenční a podmíněné provádění Sekvenční provádění znamená vykonávání jednoho příkazu za druhým bez ohledu na okolnosti. Pro oddělení příkazů při sekvenčním provádění se používá

Více

Seminář IVT. MS Excel, opakování funkcí

Seminář IVT. MS Excel, opakování funkcí Seminář IVT MS Excel, opakování funkcí Výuka Opakování z minulé hodiny. Založeno na výsledcích Vašich domácích úkolů, podrobné zopakování věcí, ve kterých děláte nejčastěji chyby. Nejčastější jsou následující

Více

Složitější domény. Petr Štěpánek. S využitím materialu Krysztofa R. Apta

Složitější domény. Petr Štěpánek. S využitím materialu Krysztofa R. Apta Složitější domény Petr Štěpánek S využitím materialu Krysztofa R. Apta 2006 Logické programování 11 1 V této části se budeme zabývat seznamy a binárními stromy. Naším cílem není tyto datové struktury podrobně

Více

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4 Uložení dat v počítači Data = užitečné, zpracovávané informace Kódování (formát) dat = způsob uložení v počítači (nutno vše převést na čísla ve dvojkové soustavě) Příklady kódování dat Text každému znaku

Více

1. Téma 03 - Rozhodování

1. Téma 03 - Rozhodování 1. Téma 03 - Rozhodování Cíl látky Seznámit se a prakticky si vyzkoušet zápis rozhodování v jazyce Java 1.1. Úvod Jednou z nejčastěji používanou konstrukcí při programování je rozhodování. Právě této problematice

Více

2 Datové typy v jazyce C

2 Datové typy v jazyce C 1 Procedurální programování a strukturované programování Charakteristické pro procedurální programování je organizace programu, který řeší daný problém, do bloků (procedur, funkcí, subrutin). Původně jednolitý,

Více

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ 2014 5.9 10/14

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ 2014 5.9 10/14 ZÁKLADY PROGRAMOVÁNÍ Mgr. Vladislav BEDNÁŘ 2014 5.9 10/14 Co je vhodné vědět, než si vybereme programovací jazyk a začneme programovat roboty. 1 / 31 0:40 Programovací jazyky Programovací jazyky jsou jazyky

Více

Jakub Čermák jakub@jcermak.cz, http://www.jcermak.cz Microsoft Student Partner

Jakub Čermák jakub@jcermak.cz, http://www.jcermak.cz Microsoft Student Partner Jakub Čermák jakub@jcermak.cz, http://www.jcermak.cz Microsoft Student Partner Co paralelizace přinese? Jak paralelizovat? Jak si ušetřit práci? Jak nedělat běžné paralelizační chyby? Race condition, deadlocky

Více

Kolekce, cyklus foreach

Kolekce, cyklus foreach Kolekce, cyklus foreach Jen informativně Kolekce = seskupení prvků (objektů) Jednu již známe pole (Array) Kolekce v C# = třída, která implementuje IEnumerable (ICollection) Cyklus foreach ArrayList pro

Více

1 Příklady pro druhý semestr PGL

1 Příklady pro druhý semestr PGL 1 Příklady pro druhý semestr PGL Jiří Fišer 1.1 Formátovač 1.1.1 Vytvoření aplikace pro snadné vytváření jednoduše strukturovaných dokumentů. Strukturované dokumenty musí podporovat sekce (=kapitoly) a

Více

Prezentace a vysvětlení programového prostředí NXC

Prezentace a vysvětlení programového prostředí NXC Úvod Další jazyk, který je možno použít pro programování NXT kostky je NXC Not exatly C Na rozdíl od jazyku NXT-G, kde jsme vytvářeli program pomocí grafických prvků přesněji řečeno pomocí programovacích

Více

ROZHODOVACÍ PROCEDURY A VERIFIKACE PAVEL SURYNEK, KTIML HTTP://KTIML.MFF.CUNI.CZ/~SURYNEK/NAIL094

ROZHODOVACÍ PROCEDURY A VERIFIKACE PAVEL SURYNEK, KTIML HTTP://KTIML.MFF.CUNI.CZ/~SURYNEK/NAIL094 10 ROZHODOVACÍ PROCEDURY A VERIFIKACE PAVEL SURYNEK, KTIML HTTP://KTIML.MFF.CUNI.CZ/~SURYNEK/NAIL094 Matematicko-fyzikální fakulta Univerzita Karlova v Praze 1 ROZHODOVÁNÍ TEORIÍ POMOCÍ SAT ŘEŠIČE (SMT)

Více

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write(\nPrumerna teplota je {0}, tprumer); Pole (array) Motivace Častá úloha práce s větším množstvím dat stejného typu o Př.: průměrná teplota za týden a odchylka od průměru v jednotlivých dnech Console.Write("Zadej T pro.den: "); double t = Double.Parse(Console.ReadLine());

Více

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný typem proměnné - ukazatel je tedy adresa společně s

Více

Jazyk C++ II. Šablony a implementace

Jazyk C++ II. Šablony a implementace Jazyk C++ II Šablony a implementace AR 2013/2014 Jazyk C++ II Úvod Dědičnost a kompozice nejsou vždy tou správnou odpovědí na požadavky znovupoužitelnosti kódu. Proto máme možnost definování určité třídy

Více

Semestrální práce KIV/PC

Semestrální práce KIV/PC Semestrální práce KIV/PC Václav Löffelmann 2014-12-31 1 Zadání Naprogramujte v ANSI C přenositelnou konzolovou aplikaci, která jako vstup obdrží soubor obsahující obrázek ručně psané číslice a soubor s

Více

Roman Lukáš email: lukas@fit.vutbr.cz

Roman Lukáš email: lukas@fit.vutbr.cz ZADÁNÍ PROJEKTU Z PŘEDMĚTŮ IFJ A IAL Roman Lukáš email: lukas@fit.vutbr.cz 22. září 2008 1 Obecné informace Název projektu: Implementace interpretu imperativního jazyka IFJ08. Informace: diskusní skupina

Více

Algoritmy a datové struktury

Algoritmy a datové struktury Algoritmy a datové struktury 1 / 34 Obsah přednášky Základní řídící struktury posloupnost příkazů podmínka cyklus s podmínkou na začátku cyklus s podmínkou na konci cyklus s pevným počtem opakování Jednoduchá

Více

Hierarchický databázový model

Hierarchický databázový model 12. Základy relačních databází Když před desítkami let doktor E. F. Codd zavedl pojem relační databáze, pohlíželo se na tabulky jako na relace, se kterými se daly provádět různé operace. Z matematického

Více

Groovy agilní Java. Pavel Kříž Filip Malý

Groovy agilní Java. Pavel Kříž Filip Malý Groovy agilní Java Pavel Kříž Filip Malý Úvod Dynamický skriptovací jazyk pod JVM Navržen pro platformu Java, zcela interoperabilní (na úrovni bajtkódu) s běžnými programy v Javě, silně objektově orientovaný

Více

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová

Více

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni! Java práce s řetězci Trochu povídání.. Řetězce jsou v Javě reprezentovány instancemi tříd StringBuffer a String. Tyto třídy jsou součástí balíčku java.lang, tudíž je možno s nimi pracovat ihned bez nutného

Více

Objektově orientované programování v jazyce Python

Objektově orientované programování v jazyce Python Objektově orientované programování v jazyce Python Co to je objektově orientované programování Python není přímo objektově orientovaný jazyk, ale podporuje nejdůležitější části objektově orientovaného

Více

Znaky. IAJCE Přednáška č. 10. každému znaku je nutné přiřadit nějaké číslo (nezáporné přímé mapování znak <->

Znaky. IAJCE Přednáška č. 10. každému znaku je nutné přiřadit nějaké číslo (nezáporné přímé mapování znak <-> Znaky každému znaku je nutné přiřadit nějaké číslo (nezáporné přímé mapování znak číslo) kódování jiný příklad kódování existuje mnoho kódů pojmy: morseova abeceda problémy o znaková sada které znaky

Více

24. XML. Aby se dokument XML vůbec zobrazil musí být well-formed (správně strukturovaný). To znamená, že splňuje formální požadavky specifikace XML.

24. XML. Aby se dokument XML vůbec zobrazil musí být well-formed (správně strukturovaný). To znamená, že splňuje formální požadavky specifikace XML. 24. XML Úvod Značkovací jazyk XML (extensible Markup Language) vznikl ze staršího a obecnějšího jazyku SGML (Standard Generalized Markup Language). XML byl vyvinut konsorciem W3C, aby poskytl standardní

Více

Databázové systémy I

Databázové systémy I Databázové systémy I Přednáška č. 8 Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky jiri.zechmeister@upce.cz Skupinové a souhrnné dotazy opakování Obsah Pohledy syntaxe použití význam Vnořené

Více

PHP tutoriál (základy PHP snadno a rychle)

PHP tutoriál (základy PHP snadno a rychle) PHP tutoriál (základy PHP snadno a rychle) Druhá, vylepšená offline verze. Připravil Štěpán Mátl, http://khamos.wz.cz Chceš se naučit základy PHP? V tom případě si prostuduj tento rychlý průvodce. Nejdříve

Více

DBS Konceptuální modelování

DBS Konceptuální modelování DBS Konceptuální modelování Michal Valenta Katedra softwarového inženýrství FIT České vysoké učení technické v Praze Michal.Valenta@fit.cvut.cz c Michal Valenta, 2010 BIVŠ DBS I, ZS 2010/11 https://users.fit.cvut.cz/

Více

Základy PHP. Úvod do jazyka PHP a principů skriptování na straně serveru

Základy PHP. Úvod do jazyka PHP a principů skriptování na straně serveru Základy PHP Úvod do jazyka PHP a principů skriptování na straně serveru Princip fungování web serveru Server se podívá do svého datového úložiště Hypertext Transfer Protocol Internet Internet Nalezne požadovaný

Více

6. blok část B Vnořené dotazy

6. blok část B Vnořené dotazy 6. blok část B Vnořené dotazy Studijní cíl Tento blok je věnován práci s vnořenými dotazy. Popisuje rozdíl mezi korelovanými a nekorelovanými vnořenými dotazy a zobrazuje jejich použití. Doba nutná k nastudování

Více

Skriptovací jazyky. Obsah

Skriptovací jazyky. Obsah Skriptovací jazyky doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah Co je to skriptovací jazyk? Výhody a nevýhody

Více

Abstraktní datové typy: zásobník

Abstraktní datové typy: zásobník Abstraktní datové typy: zásobník doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Abstraktní datové typy omezené rozhraní

Více

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

PRVNÍ ELASTICKÝ INFORMAČNÍ SYSTÉM : QI

PRVNÍ ELASTICKÝ INFORMAČNÍ SYSTÉM : QI PRVNÍ ELASTICKÝ INFORMAČNÍ SYSTÉM : QI Cyril Klimeš a) Jan Melzer b) a) Ostravská univerzita, katedra informatiky a počítačů, 30. dubna 22, 701 03 Ostrava, ČR E-mail: cyril.klimes@osu.cz b) DC Concept

Více

8.2 Používání a tvorba databází

8.2 Používání a tvorba databází 8.2 Používání a tvorba databází Slide 1 8.2.1 Základní pojmy z oblasti relačních databází Slide 2 Databáze ~ Evidence lidí peněz věcí... výběry, výpisy, početní úkony Slide 3 Pojmy tabulka, pole, záznam

Více

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události Petr Blaha Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události Cykly Základní funkce (matematické, textové,

Více

Datové typy a struktury

Datové typy a struktury atové typy a struktury Jednoduché datové typy oolean = logická hodnota (true / false) K uložení stačí 1 bit často celé slovo (1 byte) haracter = znak Pro 8-bitový SII kód stačí 1 byte (256 možností) Pro

Více

Ukládání a vyhledávání XML dat

Ukládání a vyhledávání XML dat XML teorie a praxe značkovacích jazyků (4IZ238) Jirka Kosek Poslední modifikace: $Date: 2014/12/04 19:41:24 $ Obsah Ukládání XML dokumentů... 3 Ukládání XML do souborů... 4 Nativní XML databáze... 5 Ukládání

Více

VY_32_INOVACE_08_2_04_PR

VY_32_INOVACE_08_2_04_PR Ing. Petr Stránský VY_32_INOVACE_08_2_04_PR Příkazy vstupu - definice Výstupním zařízením může být obrazovka, tiskárna nebo soubor. Jednotlivé údaje se zapisují pomocí příkazu WRITE nebo WRITELN. Příkaz

Více

Správnost XML dokumentu

Správnost XML dokumentu Realizováno za finanční podpory ESF a státního rozpočtu ČR v rámci v projektu Zkvalitnění a rozšíření možností studia na TUL pro studenty se SVP reg. č. CZ.1.07/2.2.00/29.0011 Správnost XML dokumentu Správně

Více

J. Zendulka: Databázové systémy 4 Relační model dat 1

J. Zendulka: Databázové systémy 4 Relační model dat 1 4. Relační model dat 4.1. Relační struktura dat... 3 4.2. Integritní pravidla v relačním modelu... 9 4.2.1. Primární klíč... 9 4.2.2. Cizí klíč... 11 4.2.3. Relační schéma databáze... 13 4.3. Relační algebra...

Více

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz) Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz) Autor: Radek Vystavěl Díl 12: Algebra Lineární transformace MATEMATIKA Lineární transformace, neboli přeet hodnoty x podle

Více

Seznámení s datovými typy a operátory

Seznámení s datovými typy a operátory Knihovny tříd Javy KAPITOLA 2 Seznámení s datovými typy a operátory Klíčové dovednosti a pojmy Seznámení s primitivními typy jazyka Java. Používání literálů. Inicializace proměnných. Seznámení s pravidly

Více

Úvod do programování. Lekce 5

Úvod do programování. Lekce 5 I N V E S T I C E D O R O Z V O J E V Z D Ě L Á V Á N Í Inovace a zvýšení atraktivity studia optiky reg. č.: CZ.1.07/2.2.00/07.0289 Úvod do programování Lekce 5 Tento projekt je spolufinancován Evropským

Více

Programovací jazyk F#

Programovací jazyk F# Programovací jazyk F# Speciální programovací jazyky Jiří Fišer MMXI F# programovací jazyk primárně funcionální jazyk vytvořený Microsoft Resarch pro platformu.net původně port jazyka OCaml pro platformu.net,

Více

Metody tvorby ontologií a sémantický web. Martin Malčík, Rostislav Miarka

Metody tvorby ontologií a sémantický web. Martin Malčík, Rostislav Miarka Metody tvorby ontologií a sémantický web Martin Malčík, Rostislav Miarka Obsah Reprezentace znalostí Ontologie a sémantický web Tvorba ontologií Hierarchie znalostí (D.R.Tobin) Data jakékoliv znakové řetězce

Více

Použití databází na Webu

Použití databází na Webu 4IZ228 tvorba webových stránek a aplikací Jirka Kosek Poslední modifikace: $Date: 2010/11/18 11:33:52 $ Obsah Co nás čeká... 3 Architektura webových databázových aplikací... 4 K čemu se používají databázové

Více

Kapitola 3: Relační model. Základní struktura. Relační schéma. Instance relace

Kapitola 3: Relační model. Základní struktura. Relační schéma. Instance relace - 3.1 - Struktura relačních databází Relační algebra n-ticový relační kalkul Doménový relační kalkul Rozšířené operace relační algebry Modifikace databáze Pohledy Kapitola 3: Relační model Základní struktura

Více

7.5 Diagram tříd pokročilé techniky

7.5 Diagram tříd pokročilé techniky 7.5 Diagram tříd pokročilé techniky Stereotypy - jeden ze základních prostředků rozšiřitelnosti UML - pro modelovací konstrukce neexistující v UML, ale podobné předdefinované v UML definované uživatelem

Více

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C Identifikační údaje školy Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace

Více

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM CÍLE KAPITOLY Využívat pokročilé možnosti formátování, jako je podmíněné formátování, používat vlastní formát čísel a umět pracovat s listy. Používat

Více

Čísla a číselné soustavy.

Čísla a číselné soustavy. Čísla a číselné soustavy. Polyadické soustavy. Převody mezi soustavami. Reprezentace čísel. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK.

Více

10 Balíčky, grafické znázornění tříd, základy zapozdření

10 Balíčky, grafické znázornění tříd, základy zapozdření 10 Balíčky, grafické znázornění tříd, základy zapozdření Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům balíčkům, grafickému

Více

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy Volné stromy Úvod do programování Souvislý, acyklický, neorientovaný graf nazýváme volným stromem (free tree). Často vynecháváme adjektivum volný, a říkáme jen, že daný graf je strom. Michal Krátký 1,Jiří

Více

Algoritmy I, složitost

Algoritmy I, složitost A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??

Více

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto: 20. Programovací techniky: Abstraktní datový typ, jeho specifikace a implementace. Datový typ zásobník, fronta, tabulka, strom, seznam. Základní algoritmy řazení a vyhledávání. Složitost algoritmů. Abstraktní

Více

Analýza a modelování dat 3. přednáška. Helena Palovská

Analýza a modelování dat 3. přednáška. Helena Palovská Analýza a modelování dat 3. přednáška Helena Palovská Historie databázových modelů Relační model dat Codd, E.F. (1970). "A Relational Model of Data for Large Shared Data Banks". Communications of the ACM

Více

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost Projekt je realizován v rámci Operačního programu Vzdělávání pro konkurence

Více