Programovací jazyk F#

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

Download "Programovací jazyk F#"

Transkript

1 Programovací jazyk F# Speciální programovací jazyky Jiří Fišer MMXI

2 F# programovací jazyk primárně funcionální jazyk vytvořený Microsoft Resarch pro platformu.net původně port jazyka OCaml pro platformu.net, v současnosti (verze 2) i některé vlastní rysy staticky typovaný striktní multiparadigmatický jazyk podporovaná paradigmata (pořadí podle důležitosti) funkcionální paradigma (ve stylu jazyka ML) objektové paradigma (OOP model platformy.net) procedurální paradigma

3 Rodokmen jazyka F# F# (2003) Clojure (2007) OCaml (1996) Haskell (1990) Caml (1985) Miranda (1985) Common Lisp (1984) ML(1973) Scheme (1975) Lisp (1958)

4 Pro a proti: pro kvalitní vývojové prostředí (Visual Studio 2010), resp. rozšíření v Monodevelopu proti praktická použitelnost, včetně nabídek na pracovním trhu (ČR) dostatečná dokumentace a knihy (v angličině) komplikovanější syntaxe a sémantika (dáno především spojením původních funkcionálních prostředků a prostředků.net) ne zcela jednotný typový systém (ML vers. NET)

5 Struktura jazyka.net integrace OOP rozšíření (OCaml) funkcionální jádro Caml tao presentace se zaměřuje především na funkcionální jádro jazyka vrstvy se částečně prolínají, např. OOP třídy jsou potřeba pro poporu monád tj. čistě funkcionálního prostředku funkcionální nadstavba nad IEnumerable<T>

6 Základní pravidla syntaxe ve F# hraje odsazení syntaktickou roli tj. je nutné jej ; důsledně dodržovat tato pravidla: odsazovat lze jen mezerami jednotky na stejné synt. úrovni musí být zarovnány (zleva) podřízené synt. jednotky jsou odsazeny F# rozlišuje velká a malá písmena (navíc je zde dost silný úzus jejich používání!) poznámky: // řádkové (* dlouhé i víceřádkové *)

7 Funkce funkce jsou v F# běžnými hodnotami tj. lze je anonymně vytvářet, předávat do jiných funkcí či z funkcí vracet (stejně jako například čísla) F# podporuje všechny základní funkcionální mechanismy rekurze (s optimalizací koncové rekurze) lexikální vazbu a uzávěry currying funkce vyšších řádů (funkcionály) funkce a metody standardní knihovny.net jsou integrovány jen částečně (nefunguje currying,nejsou kompatibilní s běžnými funkcionály)

8 Definice funkce funkce jsou definovány pomocí konstrukce let: let mean x y = (x + y)/2.0 konstrukce váže v aktuálním kontextu funkci na symbol (s lexikální vazbou volných proměnných) překladač automaticky odvodí statický typ funkce, zde (float = System.Double): float -> float -> float zkratka za float -> (float -> float) funkce je automaticky curryovaná, tj. je interpretována jako funkce s jedním parametrem vracející funkci s n-1 parametry mean x y = (mean x) y

9 Volání funkce ve volání funkce nemusí být parametry uzávorkovány a neoddělují se čárkou mean závorky se používají jen pro změnu priorit, přičemž samo volání má vyšší prioritu než operátory závorky kolem složitějších parametrů mean (x + 2.0) (2.0 * y) závorky kolem celého volání funkce (mean 3.0 x)

10 Lokální vazby a vnořené funkce uvnitř funkcí lze provádět lokální vazby (= vazby v lokálním kontextu) vazby běžných hodnot let root a b c = let d = b*b 4.0 * a * c -b + sqrt d vazby funkcí (tzv. vnořené funkce, běžný ideom) let flip f = let g y x = f x y g

11 Operátory binární operátory jsou v F# de facto binární funkce (liší se jen jejich infixová aplikace) lze je volat jako funkce (prefixově) (+) 2 3 lze je definovat jako funkce (identif. musí být speciál. znaky) let (~~) x y = mean x y 5.0 ~~ 10.0 unární operátory se definují podobně, využívají se však pouze prefixově některé běžné operátory podporované přímo.net knihovnami mají speciální chování (+, *, <, &&, apod.): mohou být přetížené (různé chování pro různé typy) pokud je lze předefinovat tak jen objektově (obdoba C#)

12 Rekurzivní funkce rekurze se v F# běžně používá (je to funkcionální jazyk) rekurzovní funkce musí být explicitně definována pomocí konstrukce let rec koncová (tail) rekurze je optimalizována tj. O M (1) let fact x = let rec fact' x acc = if x = 1 then acc else fact' (x 1) (x * acc) fact' x 1 pomocná (vnořená) funkce fact' provádí výpočet s dodatečným parametrem pro akumulaci hodnoty, vnější funkce je jen jednoduchá (nerekurzivní) obálka

13 Elementární datové typy základní datové typy jsou stejné jako v C# pozor na rozdíly v názvech! int16 namísto short int64 namísto long float32 namísto float float namísto double, apod. přidány jsou nové typy (typické pro funkc. jazyky), např. bigint = System.Numeric.BigInteger literál: 2500I F# powerpack nabízí i BigRational

14 Implicitní přetypování F# nikdy neprovádí implicitní přetypování!! dokonce ani mezi číselnými objekty, např. int na float (double) float32 (float) na float (double) int16 (short) na int důsledek: u literálů je nutno důsledně uvádět datový typ (často pomocí suffixů) 2 int 2uy byte 2.0 float 2y byte 2.0F float32 2I bigint 2u uint 2UL uint64

15 Explicitní typování F# staticky odvozuje (infer) typy všech vázaných symbolů v programu (symbol odkazuje vždy jen jednu hodnotu během celé své existence v daném kontextu) v některých případech to však může být nejednoznačné či nemožné čísla (operace jsou přetíženy pro všechny číselné typy) let add x y = x + y //implicitně int -> int -> int let bigadd (x:bigint) (y:bigint) = x + y let hypot (x:float) (y:float) = sqrt (x*x + y*y) //povinné explicitní typy je třeba uvádět i u složitejších OOP objektů (především je-li využit objektový polymorfismus)

16 N-tice (tuple) nejednoduššími strukturovanými hodnotami jsou n- tice jsou neměnitelné (typické pro funkc. jazyk!) musí mít určen počet prvků (navíc nelze jednoduše transformovat n-tice s různými počty prvků) mohou být nehomogenní (= mouhou mít položky různých typů) zápis: (1, 2) ( Bill, m) ((true, 5), OK ) specifikace typu: int * int string * decimal (bool * int) * string

17 Použití n-tic representace strukturované hodnoty (náhrada záznamu, struktury, položky databáze) ( Jiří Fišer, 40, jf@jf.cz ) zabalení více návratových hodnot do jedné (podobně jako OOP vzor přepravka) let divmod x y = ( x / y, x % y) předání více parametrů jako jediné n-tice, což je bližší syntaxi a sémantice.net let max (a,b) = if a > b then a else b důsledně užíváno pro běžné.net metody a funkce nepodporuje currying nevhodné pro funkc. konstrukce

18 Seznam (list) standardní kolekcí jazyka F# je nemodifikovatelný seznam lispovského typu. Je izomorfní se seznamem ve Scheme a vnitřně representovaný binárním stromem. literály: [1; 2; 3], [ Eliška, Čertice ] [['a'], ['c', 'd', 'e']] pro čísla: [1..100], [ ] seznamy musí být homogenní (položky stejného typu) syntaktická zkratka za strom vytvořený operací :: (přidání do seznamu zleva tj. cons) 1 :: 2 :: 3 :: [ ] tj. 1 :: ( 2 :: ( 3 :: [ ])) namísto (destrukčních) operací car a cdr se využívá mechanismu tzv. unifikace vzorů

19 Označení typů kolekcí pokud je potřeba označit typ hodnoty (resp. je vypsán v interaktivním shellu fsi), pak lze n-tice a seznamy vyjádřit následujícími typy n-tice: typ 1 * typ 2 *... * typ n, kde typ i je typ i-té položky a n je počet položek příklady: int * int, (int * string) * float seznam: typ list kde typ je typ všech položek příklady: int list, (string * int) list

20 Unifikace vzorů (pattern matching) prostředek pro větvení programu na základě struktury a typu dat (vysokoúrovňová náhrada switch) let rec length s = match s with [] -> 0 //hodnota je prázdný seznam x :: xs -> 1 + length xs //struktura x::xs rozhodovat lze i na základě shody jednoduché hodnoty let simplenumber n = match n with 1 -> jedna 2 -> dve _ -> mnoho //univerzální vzor

21 Polymorfismus jazyk F# podporuje polymorfismus tj. lze vytvářet funkce které mohou zpracovávat hodnoty více než jednoho typu například funkce length zpracovává seznamy bez ohledu na typ jejich položek symbolické vyjádření typu funkce length je: 'a list -> int kde 'a je symbol libovolného typu (typová proměnná) skutečný typ je odvozen a kontrolován při každém využití polymorfní funkce (v místě volání funkce) a to již při překladu tj. polymorfismus je statický je tudíž obdobou generických typů v C# (generika a funkcionální polymorfismus jsou v F# částečně sjednoceny)

22 Složitější vzory vzory mohou být vnořené předpokládejme následující strukturu seznamu [( jf, 1); ( pk, 2); ( jf, 3); ( jf, 2); ( pk, 1)] kde řetězec je označení osoby a číslo známka let rec prumerprojf s = match s with ( jf, znamka) :: xs -> znamka + prumerprojf xs _ :: xs -> prumerprojf xs [] -> 0.0

23 Shrnutí vzorů vzor příklad s čím se shoduje vazba literál 1 jen se shodnou hodnotou ne symbol n s čímkoliv ano univerzální _ s čímkoliv ne složený x::xs se shodně strukturovanou hodnotou možná u podvzorů

24 Strážní podmínky unifikace vzorů není schopna nahradit konstrukce s podmínkami (např. if), neboť testovat lze pouze strukturální shody a rovnost s literály unif. vzorů je proto nutno rozšířit o strážní podmínky, které umožňují testovaní libovolné relace nad navázanými hodnotami let rec contains item s = //typ 'a -> 'a list -> bool match s with x::_ when x = item -> true _::xs -> contains item xs [] -> false ve vzoru se proměnná může vyskytovat nejvýše jednou (x,x) nutno použít (x,y) when x=y

25 Funkce s integrovanou unifikací funkce, jejichž tělo tvoří pouze unifikace jednoho z parametrů s různými vzory jsou v F# dosti běžné a tudíž pro bě existuje syntaktická zkratka (pozor: unifikovaný parametr musí být poslední) funkcionál map: ('a -> 'b) -> 'a list -> b' list let rec map f s = match s with [] -> [] x::xs -> (f x)::(map f xs) let rec map f = function [] -> [] x::xs -> (f x)::(map f xs) ve zkráceném zápise mizí poslední parametr (tj. ten, jehož hodnota je unifikována se vzory. Kam zmizel? Odpověď je spojena s anonymními funkcemi.

26 Lambda funkce anonymní (lambda) funkce: fun seznam-parametrů -> výraz příklady (v poznámce typ funkce): fun x -> x + 1I //bigint -> bigint fun a b -> (a, b) //'a -> 'b -> 'a * 'b fun (a,b) -> (b,a) //'a * 'b -> 'b * 'a fun x y -> if x > y then x else y //'a -> 'a -> 'a when 'a : comparison někdy lze místo λ-fce použít částečné volání (currying) (max 5), List.map (max 5) //(int list -> int list)

27 Kde je chybějící parametr? nyní se můžeme vrátit k chybějícímu parametru: let rec map f = function [] -> [] xs::xs -> (f x)::(map f xs) definuje formálně funkci s jedním parametrem (f), která je však definována pomocí anonymní funkce s dalším (v zápise skrytým) parametrem tj. v podobě explicitně curryované) zápis lze rozepsat pomocí běžné lambda funkce takto: let rec map f = fun x -> match x with [] -> [] x::xs -> (f x)::(map f xs)

28 Funkcionály F# podporuje všechny běžné funkcionály a to buď přímo (operátory, komprehenze), nebo pomocí knihovních funkcí běžné skládání funkcí (f g) f << g //('a -> 'b) -> ('c -> 'a) -> 'c -> 'b obrácené skládání funkcí (přehlednější zápis) f >> g //('a -> 'b) -> ('b -> 'c) -> 'a -> 'c reverzní volání (místo f x), běžný F# ideom x > f //'a -> ('a -> 'b) -> 'b lze řetězit více volání (tzv. pipeline česky datovod) s > filter (fun x -> x>0) > fold (fun x y -> x * y) > log10

29 Seznamové funkcionály map List.map //('a -> 'b) -> 'a list -> 'b list zip List.map2 //('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list fold left List.fold // ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a fold right List.foldBack // ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b filter List.filter //('a -> bool) -> 'a list -> 'a list

30 Seznamová komprehenze funkcionály map a filter se používají relativně málo, neboť je zahrnuju speciální zápis tzv. seznamová komprehenze [for var in list do if condition then yield item-expression] var = lokální proměnná (postupně jsou na ní vázány položky) list = původní seznam (při mapování se nemění!) condition = filtrovací podmínka (část s if je nepovinná) item-expression = mapovací výraz (= map. funkce aplikovaná na proměnou var) for x in seznam do if x > 0 yield 2*x sum (for x in seznam do yield List.length x)

31 Seznamová komprehenze (flat) F# seznamové komprehenze podporují i tzv. řetězení podseznam tj. operaci flat yield vloží svůj argument jako jediný prvek versus yield! vloží postupně jednotlivé prvky svého argumentu (musí to být seznam) [for x in [1.. 5] do yield [1..x]] vrací [[1]; [1; 2]; [1; 2; 3]; [1; 2; 3; 4]; [1; 2; 3; 4; 5]] [for x in [1.. 5] do yield! [1..x]] vrací [1; 1; 2; 1; 2; 3; 1; 2; 3; 4; 1; 2; 3; 4; 5]

32 Permutace různé typy seznamových komprehenzí lze ilustrovat například ve funkci vracející seznam všech permutací daného seznamu let ( ~) s a = [for item in s do if a <> item then yield item] let rec permutation = function [] -> [[]] s -> [for item in s do yield! [for sp in permutation (s ~ item) do yield item::sp]] typ funkce permutation: 'a list -> 'a list list when 'a : equality

33 Datový typ option klíčovou roli v F# hraje typ složený option, který umožňuje rozšířit běžné typy o nepřítomnou nebo nedefinovanou hodnotu (označována jako None) běžné hodnoty rozšířeného typu lze získat voláním konstruktoru Some na hodnotu Some(5) //typ int option Some( Frodo ) //typ string option hodnotu None lze získat prostřednictvím stejnojmeneného bezparametrického konstruktoru None // typ 'a option (polymorfní) základní přístup k objektům optional typů je možný pomocí unifikace vzorů

34 Unifikace vzorů s option obdoba operátoru?? jazyka C# (null-coalesing operator) let (?) x y = match x with Some(v) -> v None -> y x je potenciálně nedefinovaná hodnota a y náhradní hodnota (použitá v případě nedefinovanosti x) Some(5)? 0 //vrací 5 Some(0)? 0 //vrací 0 seznam > map (fun x -> x? 0) > sum

35 Algebraické typy typ option je konkrétním příkladem tzv. algebraického typu algebraické typy umožňují snadno vytvářet nové typy pomocí skládání, při zachování přístupu k dílčím položkám pomocí unifikace vzorů libovolný algebraický typ lze popsat jako množinu k 1 T 1 k 2 T 2 k n T n k i = konstruktor tj. jedinečný symbol (label) T i = je kartézský součin libovolných typů (včetně definovaného typu tj. typy mohou být rekurzivníi) nebo prázdná množina

36 Výčtový typ speciálním případem algebraických typů jsou tzv. výčtové typy u výčtových typů je i T i = tj. je to seznam symbolů (= bezparametrických konstruktorů) type color = Gule Azure Vert Sable Argent Or výčtové typy v F# nejsou vázány na číselnou representaci jako v C# (a nejsou přímo převoditelné)

37 Pojmenované struktury další specializovaným algebraickým typem jsou pojmenované struktury (v obecném zápise je n = 1) pojmenovaná struktura je n-tice hodnot libovolného typu opatřená symbolem-konstruktorem, jenž jednoznačně identifikuje hodnoty daného typu příklady: type complex = Complex of float * float type person = Person of string * int * int jednotlivé prvky struktury jsou určeny jen pozičně a jejich sémantika je zřejmá jen z použití! místo pojmenovaných struktur lze využít záznamy (record) = n-tice s pojmenovanými členy

38 Konstruktory a jejich funkce konstruktory mají dvojí funkci: 1. vytvářejí hodnoty (tj. skládají hodnoty) 2. slouží jako vzor pro unifikaci (tj. hodnoty rozkládají) funkce je dána syntaktickou pozicí konstruktoru: let conjugate = function Complex(re,im) -> Complex (re, - im) let makesmarter = function Person(name,age,iq) -> Person(name, age, iq+10) let name = function Person(name, _, _) -> name

39 Obecné algebraické typy obecné algebraické typy lze chápat jako sjednocení symbolických konstant a jedné či více množin struktur, přičemž hodnoty těchto jsou odlišeny návěštími type schoolholidays = Break of yeardate * yeardate StateHoliday of yeardate Easter let duration = function Break(from,to) -> interval to from StateHoliday _ Easter -> 1 //yeardate must be implemented (as algebraic type?)

40 Rekurentní typy algebraické typy mohou být rekurentní (tj. hodnota je soustavou navzájem vnořených hodnot stejného typu) následující typ representuje výrazy predikátové logiky (výrazy nikoliv hodnoty!) type logterm = True False Not of logterm And of logterm * logterm Or of logterm * logterm Impl of logterm * logterm //implikace Equiv of logterm * logterm //ekvivalence příklad hodnoty typu: Equiv(And(Not a, Not b), Not (Or(a,b)))

41 Zpracování rekurzivních typů není překvapivé, že rekurentní typy se nejlépe zpracovávají pomoci rekurze let rec eval = function True -> true False -> false Not(term) -> not (eval(term)) And(term1, term2) -> eval(term1) && eval(term2) Or(term1, term2) -> eval(term1) eval(term2) Impl(term1, term2) -> eval(term1) <= eval(term2) Equiv(term1, term2) -> eval(term1) = eval(term2) nad jednotlivými rekurentními typy lze definovat obdoby běžných seznamových funkcionálů (map, fold)

42 Polymorfní algebraické typy algebraické typy mohou být polymorfní tj. moho obsahovat položky předem neurčeného typu konkrétní typ položek se odvodí podle konkrétního použití (již při překladu) příkladem je např. algebraický typ pro binární stromy (který je navíc rekurentní) type 'a btree = Node of 'a * 'a btree * 'a btree Stub tj. strom je tvořen vnitřními uzly (mají vždy dva poduzly typu a' btree a uloženou hodnotou typu 'a) nebo pahýly resp.listy (koncovými uzly bez potomků)

43 Binární strom dva příklady funkcí nad binárnímy stromy let rec add item = function Stub -> Node(item, Stub, Stub) Node(num, left, right) when item <= num -> Node(num, add item left, right) Node(num, left, right) -> Node(num, left, add item right) let fromlist = List.fold (flip add) Stub let tolistdf tree = let rec tolistdf' tree acc = match tree with Node(n, l, r) -> acc > tolistdf' r > cons n > tolistdf' _ -> acc tolistdf' tree []

44 Aktivní vzory přímé použití vzorů je možné jen u vestavěných a algebraických typů nikoliv u běžných.net tříd F# proto podporuje možnost vytvoření (sekundárních) vzorů pro libovolný datový typ nejjednodušším případem je mapování podmnožin hodnot daného typu na symbolické konstanty let ( Workday Weekend ) (date : DateTime) = if date.dayofweek >= DayOfWeek.Monday && date.dayofweek <= DayOfWeek.Friday then Workday else Weekend aktivní vzory nelze samozřejměpoužít jako konstruktory

45 Aktivní vzory II o něco složitější jsou vzory mapující původní typ na obecné algebraické typy (tj. na vzory s parametrem) let ( YearDuration ) year = //zjednodušeno!! YearDuration( if year % 4 = 0 then 366 else 365) využití let testyear = function YearDuration(365) -> "normal year" YearDuration (366) -> "leap year" YearDuration(n) -> "abnormal year " + n.tostring() dále jsou podporovány i aktivní vzory s dodatečnými parametry a otevřené vzory (mohou existovat i nemapované hodnoty) za využití typu option

46 Kontrola měrných jednotek inovativním rysem F# je využití vyspělého typového systému pro kontrolu konzistence měrných jednotek při překladu (=staticky) měrné jednotky určují sémantiku hodnot a musí být využívány konzistentně (příkladem jsou fyzikální jednotky) (1) 1m 1kg //číselná shoda, sémantický rozdíl (2) 6N = 2kg * 3m^2/s^2 //komplexní vztahy mezi jednotkami měrné jednotky lze representovat pomocí klasického typového systému, komplexní vztahy (viz 2) by však vyžadovaly vytvoření nového typu pro každou složenou jednotku a explicitní předefinování operátorů (+,*,/)

47 Měrné jednotky a typový systém F# definuje měrné jednotky jako nadstavbu klasického typového systému tj. přkladač během překladu vytváří dodatečná metadata pro číselné typy (v rámci stat.odvození typu) [+] kompatibilita s s typovým systémem.net v generovaném kódu jsou použity jen klasické číselné typy float a int, lze jej tedy volat např. z C# [+-] není nutno rozšiřovat sémantiku typů speciální podpora zajišťují automatické odvození složených typů je k dispozici pouze pro měrné jednotky nikoliv obecné typy [-] za běhu nejsou údaje o měrných jednotkách k dispozici (ani např.pro účely tisku jednotky ve výstupu)

48 Měrné jednotky v praxi definice nového typu (de facto podtypu typu float nebo int) [<Measure>] type m [<Measure>] type s [<Measure>] type kg [<Measure>] type J = (kg * m^2)/(s^2) [<Measure>] type cal //není definován vztah k J označení číselných konstant 1.0<kg> (nikoliv 1<kg>), 2.3<s>, 5<m/s> povinné typování parametrů funkcí (typ návratové hodnoty může odvodit překladač) let cineticenergy mass : float<kg> velocity : float<m/s> = 0.5 * mass * velocity * velocity

49 Měrné jednotky II pro převod mezi jednotkami vyjadřujícími stejnou veličinu je nutno definovat pomocné funkce: všimněte si typování převodních koeficientů let tocal energy : float<j> = <cal>/1.0<J> * energy let tokelvin t : float<c> = t * 1.0<K> / 1.0<C> <K> někdy je nutné z důvodů kompatibility získat bezrozměrné číslo (pozor: většinou je to příznak rozměrové chyby!) let kgtofloat mass : float<kg> = mass / 1.0<kg>

50 Měrné jednotky III definice SI fyzikálních jednotek obsahuje sestava (assembly) F# PowerPack (FSharp.PowerPack.dll) jmenný prostor Microsoft.FSharp.Math.SI

51 Další typy kolekcí F# podporuje i další kolekce resp. kolekcím podobné objekty pole (array) modifikovatelná kolekce převzatá z.net (efektivní, ale mekomapatibilní s fukcionálním stylem) množina (set) efektivní implementace nemodifikovatelné množiny (unikátnost položek, není uspořádání) sekvence (seq) potenciálně neohraničená posloupnost položek, lenivé vyhodnocení = implementované pomocí.net rozhraní IEnumerable<T> klíčová je podpora sekvencí, které tvoří de facto lenivý protějšek běžných seznamů (lenivý subsystém ve striktním jazyce)

52 Sekvence zpracování sekvencí je v zásadě shodné se zpracováním seznamů lze používat stejné funkcionály (jen v jm. prostoru Seq) lze používat operaci head, tail (v podobě skip 1) (nikoliv však vzor ::) existují však i oblasti, kde se sekvence od seznamů zásadně liší vytváření (generování) sekvencí sekvence nelze definovat přidáváním prvků zprava nelze aplikovat operace vyžadující přítomnost všech prvků (např. reverse, length), konečné sekvence však lze převést na seznamy

53 Vytváření sekvencí konečné sekvence interval seq {0I I} sekvenční komprehenze seq {for x in [1..10] yield 6*x-1} nekonečné sekvence rekurze let allevens = let rec loop x = seq { yield x; yield! loop (x + 2) } loop 0 generující funkcionály

54 Funkcionály generující sekvenci initinfinite : (int -> 'T) -> seq<'t> funkce mapuje indexy na položky sekvence Seq.initInfinite (fun n -> 2*n) unfold : ('S -> ('T * 'S) option) -> 'S -> seq<'t> funkce vytváří další položky typu T na základě přeneseného stavu (typu S). Vrací option, aby mohla representovat konec sekvence (None). let fibs = (0I, 1I) > Seq.unfold (fun (a, b) -> Some(a, (b, a + b) ) )

55 Funkcionály nad sekvencemi generování sekvence prvočísel pomocí Eratosthenova síta (instruktivní, ale pomalé) pomocné funkce: let n = Seq.initInfinite (fun x -> x + 2) // N-{0,1} let head = Seq.head let tail = Seq.skip 1 let nondivisor d x = x % d <> 0 a můžeme definovat funkci let rec esito s = seq {yield head s; yield! esito (filter (nondivisor (head s)) (tail s))}

56 Převod na seznamy a vice versa n prvních prvků ze sekvence lze získat pomocí funkce Seq.take (vrací konečnou sekvenci) konečné sekvence lze převést na seznamy pomocí seq.tolist p = esito n //sekvence prvočísel Seq.toList(Seq.take 10 p) => [2; 3; 5; 7; 11; 13; 17; 19; 23; 29] opačný směr: Seq.ofList(list) podobné funkce existují i pro převod mezi ostatními sekvencemi (např. List.ofSeq), ne vždy však v párech např. existuje jen Set.toList, Set.ofSeq, apod.)

57 Proměnná data F# není čistě funkcionální jazyk a umožňuje používat modifikovatelné hodnoty (např. OOP objekty) či dokonce vytvářet celé programy v imperativním stylu F# se však snaží oba světa oddělit a v maximální míře zamezit negativním důsledkům použití imperativního kódu ve funkcionálním prostředí definice a inicializace proměnné let mutable i = 5 změna hodnoty (přiřazení): i <- 10 modifikovatelné hodnoty lze měnit jen v aktuálním kontextu (nikoliv např. v uzávěrech)

58 Měnitelné záznamy nejdůležitější měnitelnou kolekcí je záznam (= pojmenovatelná n-tice) v rámci záznamu lze specifikovat jaké položky jsou měnitelné (implicitně jsou samozřejmě konstantní) type product = { ID : int; mutable price : decimal; } let processproducts (items) = items > List.iteri (fun i item -> item.price <- (float i))

59 Reference měnitelné záznamy lze využít pro přenos měnitelné hodnoty vně funkce a její sdílení F# záznamy využívá v předdefinovaném typu ref (funguje jako měnitelná reference) type 'a ref = { mutable contents : 'a } let ref v = { contents = v } let (!) r = r.contents let (:=) r v = r.contents <- v využití let x = ref 100 x := 200!x

60 Měnitelné kolekce dalším typem měnitelných dat jsou pole a kolekce.net speciální podpora existuje jen pro pole let names = [ "Jitka"; "Jana"; "Jiřina" ] names.[2] <- "Judita" names.[1..2] //řezy (slices) tj. podpole podporovány jsou i vícerozměrná pole (kompaktní i jagged) pro přístup k ostatním kolekcím je možné využít standardní objektové rozhraní (např. ve stylu C#) open System.Collections.Generic let mylist = new List<string>() mylist.add("hello") mylist.[0]

61 Srovnání.NET a F# kolekcí.net Insert Remove Lookup F# counterpart List O(1) / O(n)* O(n) O(n) (linear) No built-in equivalent Insert Remove Lookup LinkedList O(1) O(1) O(n) No built-in equivalent Stack O(1) O(1) O(n) List O(1) n/a O(n) Queue O(1) O(1) O(n) No built-in equivalent HashSet O(1) / O(n)* O(1) O(1) Set O(log n) O(log n) O(log n) Dictionary O(1) / O(n)* O(1) O(1) Map O(log n) O(log n) O(log n) převzato z Wikibooks (F#)

62 Třídy z hlediska F# jsou třídy typy definované pomocí konstruktoru kontext objektu je de facto uzávěrem kontextu konstruktoru (viz syntaxe), v tomto kontextu jsou vázány datové členy (u běžných nelze již vazbu změnit) definice třídy (implicitní zápis, existuje ještě explicitní) type Account(number : int, holder : string) = class let mutable amount = 0m member x.number = number member x.holder = holder member x.amount = amount end member x.deposit(value) = amount <- amount + value member x.withdraw(value) = amount <- amount - value

63 Použití tříd použití tříd se v zásadě neliší v C#, objekty však lze využívat i v nativních F# konstrukcích let transfer amount (src : Account) (trgt : Account) = src.withdraw amount trgt.deposit amount //převzato z Wikibooks let ( Debet Kredit ) (a : Account) = if a.amount < 0m then Debet(a.Amount) else Kredit(a.Amount) let loan = function Debet _ -> 1000m Kredit m -> m/2m let a1 = new Account(666, "Sauron") a1.deposit( ) loan a1

64 Monády monády jsou funkcionálním prostředkem pro implementaci specializovaných toků řízení poznámka: běžným tokem se rozumí typický funkcionální neorientovaný strom vyhodnocení! v F# se monády označují jako computation expressions nebo workflows monády využívají běžné funkcionální mechanismy přímé použití však vede k velmi komplikovaným a nepřehledným kódům, proto moderní jazyky nabízejí syntaktické pozlátko: linearizované sekce programu mapované na monády pro pasivní využití monád postačuje jen pochopení relativně jednoduchého modelu tzv. obalených hodnot

65 Monády --- vnější pohled hlavní východisko hodnoty se mohou vyskytovat ve dvou základních stavech: přímé hodnoty mohou být zpracovány běžnými funkcemi (všechny dříve přímé hodnoty) obalené hodnoty lze bezpečně používat v prostředí monády tj. vždy plně podporují její sémantiku obalení je realizováno běžnými prostředky (je to např. seznam, hodnota variant nebo funkce), převod mezi stavy (tj. zabalení a rozbalení) však podléhá striktní sémantice, která monádu izoluje od zbytku jazyka

66 Monáda multihodnot jako příklad uveďme monádu, která umožňuje zpracování multihodnot multihodnota je množinou všech potenciálních hodnot (obdoba kvantových superpozic) na multihodnoty lze aplikovat běžné operace, které však mají mírně pozměněnnou sémantiku operace jsou volány postupně na všechny prvky multihodnoty (= množiny) jednotlivé výsledky tvoří množinu, kterou lze interpretovat jako výsledek (tj. novou multihodnotu) {1,0} + {2,3,4} = {2,3,4,5} implementace: Perl 6 a jeho junctions

67 Použití monády let result = variant { let! x = [2;3] let! y = [5;6;7;10] let! s = [-1;1] let z = 2*x + y return s*(z + 10) } uvnitř bloku variant lze vidět jak obalené hodnoty (seznamy převoditelné na množiny) tak výrazy s hodnotami přímými (viz např. výrazy 2*x + y, s*(z + 10) ) vazba pomocí let! hodnoty rozbaluje (tj. symbol následně odkazuje na přímé hodnoty) konstrukce return naopak hodnotu obaluje (jen tak může být předána vně monády (return nevrací hodnotu!)

68 Jak je to implementováno? překladač blok variant převede na výraz využívající funkcí bind (zajišťuje volání běžných funkcí na obalené hodnoty) a return (zabalení) funkce bind (převod na množinu, mapování funkce přes a následné sjednocení výsledků): bind boxedx f = boxedx Set.ofList > Set.map f > Set.fold Set.union Set.empty Set<'a> -> ('a -> Set<'b>) -> Set<'b> funkce return (z prvku vytváří jednoprvkovou množinu) return x = Set.add x Set.empty 'a -> Set<'a>

69 Rozpis multihodnotové monády sekvenční blok: variant { let! x [false, true] let! y [false, true] return x not y } je nahrazen výrazem (zjednodušeno): bind [true, false], (fun x -> bind [true, false], fun y -> (return x not y) ) výsledkem je množina s jedinou hodnotou (tj. logický výraz je tautologie)

70 Skutečná implementace skutečná implementace je složitější, neboť překladač potřebuje implementovat monádu jako objekt přesněji: monáda je singleton vytvořený továrnou (zde je to přímo třída) type VariantBuilder() = class member this.bind(x, f) = setflatmap f (Set.ofList x) member this.return(x) = toset x member this.delay(f) = f() //u jedn. monád vždy stejné end let variant = VariantBuilder() //vytvoření singletonu

71 Příklady monád serializační monády, které vynucují postupné provádění funkcí (tj. tvoří procedurální ostrov ve čistě fukcionálním jazyce) Haskell: tzv. IO monády F#: nepoužívají se (jazyk není čistě funkcionální) maybe monáda --- pracuje nativně s hodnotami typu option. Pokud v toku zpracování vznikne hodnota none, pak se automaticky vrací None (další operace se již neprovádí) async workflow --- jednotlivé operace jsou vykonávány asynchronně (a potenciálně i paralelně) jako úlohy nad množinou vláken. Monáda automaticky zajišťuje i synchronizaci.

Funkcionální programování. Kristýna Kaslová

Funkcionální programování. Kristýna Kaslová Funkcionální programování Kristýna Kaslová Historie Alonzo Church (30. léta) Netypovaný lambda kalkul Základ prvních funkcionálních jazyků Jeho konstrukce i v mnoha současných programovacích jazycích (Python)

Více

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program Denotační sémantika programovacího jazyka doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 Obsah přednášky Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup

Více

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada IB015 Neimperativní programování Seznamy, Typy a Rekurze Jiří Barnat Libor Škarvada Sekce IB015 Neimperativní programování 02 str. 2/36 Uspořádané n-tice a seznamy Programování a data IB015 Neimperativní

Více

Programovací jazyk Pascal

Programovací jazyk Pascal Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

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

Programovací jazyk Haskell

Programovací jazyk Haskell Programovací jazyk Haskell Ing. Lumír Návrat katedra informatiky, D 403 59 732 3252 Historie září 1991 Gofer experimentální jazyk Mark P. Jones únor 1995 Hugs Hugs98 téměř úplná implementace jazyka Haskell

Více

Programovací í jazyk Haskell

Programovací í jazyk Haskell Historie Programovací í jazyk Haskell doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 září 1991 Gofer experimentální jazyk Mark P. Jones únor 1995 Hugs Hugs98 téměř úplná implementace

Více

PŘETĚŽOVÁNÍ OPERÁTORŮ

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy Uživatelem definované typy Ing. Lumír Návrat katedra informatiky, A 1018 59 732 3252 Definice uživatelského typu data Color = Red Green Blue Color typový konstruktor Red / Green / Blue datové konstruktory

Více

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat IB015 Neimperativní programování Organizace a motivace kurzu, programovací jazyk Haskell Jiří Barnat Sekce IB015 Neimperativní programování 01 str. 2/36 Organizace kurzu Cíle kurzu IB015 Neimperativní

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Explicitní aplikace a vyhodnocování Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 6 V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška

Více

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada IB015 Neimperativní programování Časová složitost, Typové třídy, Moduly Jiří Barnat Libor Škarvada Sekce IB015 Neimperativní programování 07 str. 2/37 Časová složitost Časová složitost algoritmu IB015

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

JAVA. Další jazyky kompilovatelné do Java byte-code

JAVA. Další jazyky kompilovatelné do Java byte-code JAVA Další jazyky kompilovatelné do Java byte-code Přehled Scala objektový a funkcionální jazyk Closure funkcionální jazyk dialekt Lispu Groovy skritpovací jazyk Kotlin nová Java Jython Java implementace

Více

8 Třídy, objekty, metody, předávání argumentů metod

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod 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 třídám a objektům, instančním

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena

Více

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky

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

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář Vazba (binding) Tabulka symbolů Miroslav Beneš Dušan Kolář vazba = spojení mezi entitou a vlastností okamžik vazby (binding time) při návrhu jazyka při implementaci jazyka během překladu/spojování/zavádění

Více

Jazyk C# (seminář 6)

Jazyk C# (seminář 6) Jazyk C# (seminář 6) Pavel Procházka KMI 29. října 2014 Delegát motivace Delegáty a události Jak docílit v C# funkcionální práce s metodami v C je to pomocí pointerů na funkce. Proč to v C# nejde pomocí

Více

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model Databázové systémy Tomáš Skopal - relační model * relační kalkuly Osnova přednášky relační kalkuly doménový n-ticový Relační kalkuly využití aparátu predikátové logiky 1. řádu pro dotazování rozšíření

Více

Zápis programu v jazyce C#

Zápis programu v jazyce C# Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač

Více

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů SPJA, cvičení 1 ipython, python, skripty základy syntaxe: základní datové typy, řetězce podmínky: if-elif-else, vyhodnocení logických výrazů cykly: for, while kolekce: seznam, n-tice, slovník funkce, list

Více

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

4.2 Syntaxe predikátové logiky

4.2 Syntaxe predikátové logiky 36 [070507-1501 ] 4.2 Syntaxe predikátové logiky V tomto oddíle zavedeme syntaxi predikátové logiky, tj. uvedeme pravidla, podle nichž se tvoří syntakticky správné formule predikátové logiky. Význam a

Více

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David Úvod do Prologu Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David Warren (Warren Abstract Machine) implementace

Více

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement -

Více

Booleovská algebra. Booleovské binární a unární funkce. Základní zákony.

Booleovská algebra. Booleovské binární a unární funkce. Základní zákony. Booleovská algebra. Booleovské binární a unární funkce. Základní zákony. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Vytváření abstrakcí pomocí procedur Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 2 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška

Více

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných Tematický celek 03 3.1 Proměnné Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace. 3.1.1 Deklarace proměnných Dim jméno_proměnné [As typ] - deklarace uvnitř procedury platí pouze pro

Více

Software602 Form Designer

Software602 Form Designer Software602 Form Designer Javascriptový vyhodnocovací mechanismus výrazů Aktualizováno: 17. 3. 2017 Software602 a.s. Hornokrčská 15 140 00 Praha 4 tel: 222 011 602 web: www.602.cz e-mail: info@602.cz ID

Více

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou

Více

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza. Sémantická analýza Šárka Vavrečková Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz Poslední aktualizace: 19. listopadu 2009 Definice (Sémantická analýza) Vstup: konstrukce symbolů vytvořená

Více

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky

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

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ KATEDRA INFORMATIKY, PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ Slajdy vytvořili Vilém Vychodil a Jan Konečný (KI, UP Olomouc) PP 2, Lekce

Více

PRG036 Technologie XML

PRG036 Technologie XML PRG036 Technologie XML Přednáší: Irena Mlýnková (mlynkova@ksi.mff.cuni.cz) Martin Nečaský (necasky@ksi.mff.cuni.cz) LS 2010 Stránka přednášky: http://www.ksi.mff.cuni.cz/~mlynkova/prg036/ 1 Osnova předmětu

Více

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7 Pascal Katedra aplikované kybernetiky Ing. Miroslav Vavroušek Verze 7 Proměnné Proměnná uchovává nějakou informaci potřebnou pro práci programu. Má ve svém oboru platnosti unikátní jméno. (Připadne, musí

Více

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI EVROPSKÝ SOCIÁLNÍ FOND Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI Úvod do PHP PHP Personal Home Page Hypertext Preprocessor jazyk na tvorbu dokumentů přípona: *.php skript je součást HTML stránky!

Více

Principy XQuery. funkcionální jazyk vše je výraz, jehož vyhodnocením vznikne určitá hodnota základní typy stejné jako v XML Schema:

Principy XQuery. funkcionální jazyk vše je výraz, jehož vyhodnocením vznikne určitá hodnota základní typy stejné jako v XML Schema: 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 XQuery XQuery dotazovací

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd 7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd Algoritmizace (Y36ALG), Šumperk - 7. přednáška 1 Třída jako zdroj funkcionality Třída v jazyku Java je programová jednotka tvořená

Více

6. Příkazy a řídící struktury v Javě

6. Příkazy a řídící struktury v Javě 6. Příkazy a řídící struktury v Javě Příkazy v Javě Příkazy v Javě Řídicí příkazy (větvení, cykly) Přiřazovací příkaz = Řízení toku programu (větvení, cykly) Volání metody Návrat z metody - příkaz return

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

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

1. Od Scheme k Lispu

1. Od Scheme k Lispu KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI www.inf.upol.cz Michal Krupka krupka.inf.upol.cz michal.krupka@upol.cz 7. listopadu, 77 46 Olomouc Paradigmata programování poznámky k přednášce. Od

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

Teoretické minimum z PJV

Teoretické minimum z PJV Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov

Více

Booleovská algebra. Pravdivostní tabulka. Karnaughova mapa. Booleovské n-krychle. Základní zákony. Unární a binární funkce. Podmínky.

Booleovská algebra. Pravdivostní tabulka. Karnaughova mapa. Booleovské n-krychle. Základní zákony. Unární a binární funkce. Podmínky. Booleovská algebra. Pravdivostní tabulka. Karnaughova mapa. Booleovské n-krychle. Základní zákony. Unární a binární funkce. Podmínky. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky

Více

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu. Přednáška 7 Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu. 1 Příkaz expr výraz Celočíselná aritmetika I Zašle na standardní výstup vyhodnocení výrazu

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

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Kvazikvotování a manipulace se symbolickými výrazy Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 11 V. Vychodil (KI, UP Olomouc) Kvazikvotování, manipulace se

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Tečkové páry, symbolická data a kvotování Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 4 V. Vychodil (KI, UP Olomouc) Tečkové páry, symbolická data a kvotování

Více

Konstruktory překladačů

Konstruktory překladačů Konstruktory překladačů Miroslav Beneš Dušan Kolář Konstruktor Lex generátor lexikálních analyzátorů M. E. Lesk, 1975 - pro OS Unix flex - Vern Paxson, 1990 - GNU verze určeno pro generování výstupu v

Více

Jazyk C++ I. Polymorfismus

Jazyk C++ I. Polymorfismus Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Operátory Co to vůbec jsou operátory? Na co je používáme? AR 2013/2014 Jazyk C++ I 2 Operátory Můžeme si upravit operátory pro vlastní objektové typy?

Více

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

Objektově orientované programování

Objektově orientované programování 10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh

Více

Jazyk C# a platforma.net

Jazyk C# a platforma.net Jazyk C# a platforma.net Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, 2011 Syntaxe jazyka C# - 1. část BI-DNP Evropský sociální fond

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

C# &.NET. Cvičení Mgr. Filip Krijt.

C# &.NET. Cvičení Mgr. Filip Krijt. C# &.NET http://d3s.mff.cuni.cz Cvičení Mgr. Filip Krijt krijt@d3s.mff.cuni.cz http://d3s.mff.cuni.cz/~krijt/ CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics Plán Nežárka.NET Rekapitulace

Více

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

PB161 Programování v jazyce C++ Přednáška 3

PB161 Programování v jazyce C++ Přednáška 3 PB161 Programování v jazyce C++ Přednáška 3 Kontejnery Iterátory Algoritmy Nikola Beneš 4. října 2016 PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 1 / 25 Standardní knihovna C++ Už

Více

9 - Map/filter/reduce OMO. Ing. David Kadleček, PhD

9 - Map/filter/reduce OMO. Ing. David Kadleček, PhD 9 - Map/filter/reduce OMO Ing. David Kadleček, PhD kadlecd@fel.cvut.cz, david.kadlecek@cz.ibm.com 1 Map/filter/reduce v Java Map/filter/reduce v Java = Java 1.8 streams API Funkcionální přístup (řetězíme

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

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344 Osnova přednášky

Více

IRAE 07/08 Přednáška č. 1

IRAE 07/08 Přednáška č. 1 Úvod do předmětu OOP Objekt Proč OOP? Literatura, osnova předmětu viz. cvičení Základní prvek OOP sw inženýrství = model reálných objektů (věcí) člověk, auto, okno (ve windows), slovník, = model abstraktní

Více

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu } 5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu

Více

11. Přehled prog. jazyků

11. Přehled prog. jazyků Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 11 1 Základy algoritmizace 11. Přehled prog. jazyků doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

Přetěžování operátorů

Přetěžování operátorů Přetěžování operátorů Cíle lekce Cílem lekce je seznámit se s mechanizmem přetížení operátorů a s použitím tohoto mechanizmu při návrhu a implementaci programů. Po absolvování lekce budete: umět využívat

Více

Odvozené a strukturované typy dat

Odvozené a strukturované typy dat Odvozené a strukturované typy dat Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 14. listopadu 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Odvozené a strukturované typy dat 14. listopadu

Více

Programovací jazyk C++ Hodina 1

Programovací jazyk C++ Hodina 1 Programovací jazyk C++ Hodina 1 Používané překladače Bloodshed Dev C++ http://www.bloodshed.net/devcpp.html CodeBlocks http://www.codeblocks.org pokud nemáte již nainstalovaný překladač, stáhněte si instalátor

Více

Stromy, haldy, prioritní fronty

Stromy, haldy, prioritní fronty Stromy, haldy, prioritní fronty prof. Ing. Pavel Tvrdík CSc. Katedra počítačů FEL České vysoké učení technické DSA, ZS 2008/9, Přednáška 6 http://service.felk.cvut.cz/courses/x36dsa/ prof. Pavel Tvrdík

Více

ALGORITMIZACE A PROGRAMOVÁNÍ

ALGORITMIZACE A PROGRAMOVÁNÍ Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení

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

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní Základy jazyka C# 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 přednášky Architektura.NET Historie Vlastnosti

Více

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31 Programování v C# Další jazykové konstrukce Petr Vaněček 1 / 31 Obsah přednášky Přetěžování metody operátory Generika Kolekce třídy rozhraní 2 / 31 Překrytí vs. přetížení Rozdíl ve způsobu deklarace metody/operátoru

Více

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Preprocesor Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 4/2016, Lekce 9b https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start

Více

Skripty základy VB, vestavěné objekty, příklady

Skripty základy VB, vestavěné objekty, příklady Skripty základy VB, vestavěné objekty, příklady Tento dokument popisuje základy VB, vestavěné objekty, jejich metody a vlastnosti. Na závěr jsou uvedeny typické příklady použití. Stav ke dni: 9.12.2006

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku 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 pro řízení toku programu. Pro všechny tyto základní

Více

Úvod do programování. Lekce 1

Úvod do programování. Lekce 1 Úvod do programování Lekce 1 Základní pojmy vytvoření spustitelného kódu editor - psaní zdrojových souborů preprocesor - zpracování zdrojových souborů (vypuštění komentářů atd.) kompilátor (compiler) -

Více

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1 Rekurze V programování ve dvou hladinách: - rekurzivní algoritmus (řešení úlohy je definováno pomocí řešení podúloh stejného charakteru) - rekurzivní volání procedury nebo funkce (volá sama sebe přímo

Více

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal Databázové systémy - SQL * definice dat * aktualizace * pohledy Tomáš Skopal Osnova přednášky definice dat definice (schémat) tabulek a integritních omezení CREATE TABLE změna definice schématu ALTER TABLE

Více

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu. Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus

Více

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT Šablonové (generické) metaprogramování Šablona v C++, genericita v jiných jazycích Výpočetní úplnost Problémy Příklad Porovnání s klasickým

Více