Další možnosti inicializace proměnných

Podobné dokumenty
Anotace. Dijkstrův algoritmus,

Pseudonáhodná čísla = algoritmicky generovaná náhrada za náhodná čísla

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

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

Programovací jazyk Pascal

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

Anotace. Dynamické programování, diskrétní simulace.

Úvod do programování

NPRG030 Programování I, 2017/18 1 / :22:16

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

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

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.

Dijkstrův algoritmus

VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ

NPRG030 Programování I, 2018/19 1 / :03:07

Anotace. Pointery. Martin Pergel,

NPRG030 Programování I, 2018/19 1 / :25:37

dovolují dělení velkých úloh na menší = dekompozice

NPRG030 Programování I, 2015/16 1 / :25:32

Digitální učební materiál

6 Příkazy řízení toku

= knihovna prostředků pro lepší práci s textovou obrazovkou, klávesnicí a generátorem zvuků

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

Anotace. Pointery, dynamické proměnné

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Programování I. Martin Pergel, 10. října Martin Pergel, Programování I

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Anotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj

TGH05 - aplikace DFS, průchod do šířky

Sada 1 - Základy programování

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Anotace. Jednotky (tvorba a využití), struktury (typ record),

Anotace. Ordinalni typy - typ char, funkce ord, chr, succ, prev, inc, dec,

Úvod do teorie grafů

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Definice funkcí a procedur. Mnoho operací provozujeme opakovaně, proto je hloupé programovat je při každém použití znovu.

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

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

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

Algoritmizace prostorových úloh

TGH05 - aplikace DFS, průchod do šířky

Monte Carlo. Simulační metoda založená na užití stochastických procesů a generace náhodných čísel.

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Anotace. pointery (pars prima). Martin Pergel,

Anotace. Objekt self, Zapouzdření, polymorfismus,

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Je n O(n 2 )? Je n 2 O(n)? Je 3n 5 +2n Θ(n 5 )? Je n 1000 O(2 n )? Je 2 n O(n 2000 )? Cvičení s kartami aneb jak rychle roste exponenciála.

Implementace LL(1) překladů

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

Hledáme efektivní řešení úloh na grafu

Dynamické datové typy a struktury

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Algoritmy na ohodnoceném grafu

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

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

NPRG030 Programování I, 2016/17 1 / :58:13

Prohledávání do šířky = algoritmus vlny

Časová a prostorová složitost algoritmů

Poslední aktualizace: 14. října 2011

Struktura programu v době běhu

Binární soubory (datové, typované)

Činnost: 1) Vyhodnotí se výraz E. 2) Jeho hodnota se uloží do proměnné V.

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Pravděpodobnostní algoritmy

NPRG030 Programování I, 2010/11

Paralelní grafové algoritmy

PES lib (C + PASCAL) KNIHOVNY KOMUNIKAÈNÍCH FUNKCÍ 03/ PESlib KOMUNIKAČNÍ KNIHOVNY C, PASCAL 03/ stran 1

Programování I. Martin Pergel,

VISUAL BASIC. Přehled témat

TGH06 - Hledání nejkratší cesty

Program a životní cyklus programu

Modely teorie grafů, min.kostra, max.tok, CPM, MPM, PERT

Úvod do informatiky. Miroslav Kolařík

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

Použití dalších heuristik

Pravděpodobnost, náhoda, kostky

Závěrečná zkouška z informatiky 2011

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Skripty - úvod. Linux - skripty 2

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

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

Vzdálenost uzlů v neorientovaném grafu

Uplatnění metod na zvolený jazyk

Úvod do mobilní robotiky AIL028

Přijímací zkouška na navazující magisterské studium 2015

Lexikální analýza Teorie programovacích jazyků

Klasický podprogram, který nazýváme procedura. Jedná se v podstatě o příkaz. 1

Algoritmy. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 15. dubna / 39

Základy programovacího jazyka Turbo Pascal

Programování v C++ 1, 1. cvičení

Větvení a cykly. Úvod do programování 1 Tomáš Kühr

Digitální učební materiál

2 Strukturované datové typy Pole Záznam Množina... 4

Digitální učební materiál

Transkript:

Anotace Typové proměnné, možnosti inicializace proměnných, množiny, poznámky k předání parametru hodnotou a referencí, náhodná a pseudonáhodná čísla, algoritmy Monte Carlo a Las Vegas, Dijkstrův algoritmus.

Poznámka Open array parameters nám umožňovaly předávat pole předem neznámé délky, syntax: function f(a:array of integer);... ve druhé paralelce byly pod aliasem konformní schémata polí.

Typové proměnné Syntakticky děláme, jako bychom chtěli definovat konstantu, aleurčímejítyp: const cislo:integer=7; nejedná se o konstantu, obsah můžeme měnit: cislo:=5; K čemu lze použít nekonstantní konstantu? Například jako proměnnou, kterou rovnou máme zinicializovánu.

Další možnosti inicializace proměnných Na uvedené použití typových proměnných GPC ohlásí: warning: assignment: typed const misused as initialized variable warning: (Better use ISO 10206 Extended Pascal initialized warning: types and variables: var foo: integer value 7.) warning: assignment: typed const misused as initialized variable čili podle ISO 10206 můžete proměnné inicializovat pomocí klíčového slova value: x:string value xxx ; Ovšem jen u překladačů, které ISO 10206 implementují.

Množiny Chceme-li organizovat více údajů, můžeme použít: pole(array), namnohodattéhožtypu přes prvky pole je možno cyklit, strukturu(record), na stanovené množství souvisejících dat přes prvky struktury není možno udělat cyklus anebo množiny(set). Příklad: var samohlasky:set of char; samohlasky:=[ a, e, i, o, u ]; Množiny lze sjednocovat(+), pronikat( ), odečítat( ). Prvek v množině buďto je, nebo není.(ale není vícekrát!)

Příklad var samohlasky, souhlasky, znaky, cisla:set of char; c:char; sam,sou,cis:integer; begin sam:=0;sou:=0;cis:=0; samohlasky:=[ a, e, i, o, u, y ]; souhlasky:=[ a.. z ]-samohlasky; cisla:=[ 0.. 9 ]; znaky:=[];{prazdna mnozina} while not eoln do begin read(c); znaky:=znaky+[c]; if c in samohlasky then inc(sam); end; writeln(sam, samohlasek. ); end.

Poznámky k předání parametru Předání parametru hodnotou: procedure f(i:char); předávaná hodnota je okopírována. Předávání parametru referencí: procedure f(var i:char); okopírujeme pointer. Změníme-li hodnotu parametru při předání hodnotou, nic se po konci funkce nestane. Změníme-li hodnotu při předání referencí, je obsah předávané proměnné změněn(přepsán). Hodnotou lze předat jakýkoliv výraz, referencí lze předat jen proměnnou! Jak bere parametr například funkce sin a proč? Ano,hodnotou,protožejinakbynešlonapsat:sin(2 x +15), ale2 x +15bychommuselipřiřaditdonějaképroměnné!

Náhodná a pseudonáhodná čísla Náhodná čísla se získávají fyzikálním způsobem(čas mezi stisky dvou kláves), ani to však není příliš náhodné, použivá se pseudonáhoda, tedy výsledky algoritmu, ze kterého lezou čísla na první pohled náhodně vyhlížející(na druhý pohledužjetoslabší). V Pascalu je(podle dostupných informací) lineární kongruenční generátor, ovšem podle testů kolegů poměrně dobře vyladěný. Pseudonáhodný generátor je deterministický algoritmus pracující s několika proměnnými, které určují, jaká náhodná čísla budou vygenerována. Všechny hodnoty řídící generování lze nastavit pomocí longintové proměnné RandSeed, tak je možno vynutit si předvidatelnost vygenerovaných pseudonáhodných hodnot.

Jednotlivé náhodné hodnoty získáme voláním funkce Random. Funkce Random bez parametru generuje hodnoty typu real z intervalu < 0, 1) a pokouší se tvářit náhodně nezávisle uniformně. Funkci Random můžeme předat jeden parametr typu word. V tom případě se generuje přirozené číslo(tedy včetně nuly) menší, než je zadaný parametr. Chceme-li zinicializovat generátor náhodně, zavoláme funkci Randomize(bez parametrů), která RandSeed zinicializuje hodnotou časovače, což je jednen z relativně náhodně se chovajících prvků.

Příklad Nagenerování pseudonáhodných čísel var a:array[1..1000] of real; b:array[1..1000] of integer; begin Randomize; for i:=1 to 1000 do begin a[i]:=random;{napln a nahodnymi cisly <0,1)} b[i]:=random(2);{pole b obsahuje na pohled nahodna cisla 0 a 1} end; end.

Pravděpodobnostní algoritmy Pokud je problém komplikovaný, můžeme si zkusit pomoci náhodou. Příklad: Quicksort jako pivot nevybereme první prvek, ale prvek náhodný. Existují dva typické způsoby použití náhody zvané Monte CarloaLasVegas.

Algoritmy Monte Carlo Algoritmy této rodiny pomocí náhody přibližným způsobem zkoušejí zjistit řešení problému zpravidla hodnotu nějaké veličiny a dost často geometrickým způsobem. Nějakývýsledekjetedykdispozicitéměřhned,abymělale nějaký smysl, je potřeba počkat, až pro nás začne hrát teorie pravděpodobnosti (zejména zákon velkých čísel, centrální limitní věta, všechny možnénerovnosti...). Monte Carlo algoritmy typicky nekončí, typicky se jejich delším během zvyšuje přesnost.

Monte Carlo Příklad výpočet plochy kruhu const MAX=1000; var x,y:real; uvnitr,i:integer; begin uvnitr:=0; randomize; for i:=0 to MAX do begin x:=random; y:=random; if(x*x+y*y)<1 then inc(uvnitr); end; writeln( Plocha je:,4*uvnitr/max; end.

Las Vegas Výpočet algoritmu by běžel i bez náhody, náhoda jen zkouší eliminovat špatná rozhodnutí. Algoritmus vždy odpoví správně. Příklad: Quicksort, kde za pivot bereme náhodně vybraný prvek.

Las Vegas příklad faktorizace Načti číslo n. prvoc:=true; for i:=n-2 downto 1 do begin x:=random(i); do j prirad x-te dosud netestovane cislo(z {1..n-1}); if n=(j*(ndiv j)) then begin writeln(n, =,j, *,n div j); prvoc:=false; break;{ukonci cyklus} if prvoc then writeln(n je prvocislo );

Klíčová slova break a continue break ukončí provádění nejbližšího cyklu(a pokračuje se až zaním), continue ukončí současnou iteraci cyklu(a pokračuje se znovu vyhodnocením cyklící podmínky). Tato dvě klíčová slova nepoužívejte bez vážného důvodu, narušují strukturované programování, je potřeba na ně dávat obzvláštní pozor, ve zdrojovém kódu snadno zaniknou a člověk se diví, proč konkrétní iterace cyklu nedojela až do konce, ale zadrhla se někde uprostřed.

Dijkstrův algoritmus Hledá nejkratší cestu z daného vrcholu(do všech ostatních) Vstup: Graf s nezáporně ohodnocenými hranami. Udržujeme frontu vrcholů setříděnou podle dosud nejkratší cesty do nich. Na začátku zinicializujeme vzdálenosti do všech vrcholů kromě startovního nekonečnem(tedy dost vysokou hodnotou) a vzdálenost do startu nulou. Startovní vrchol přidáme do fronty dosažitelných vrcholů. Vrchol, do kterého se dostaneme nejkratší cestou z fronty odstranímeapokusímesecestujdoucíznějrozšířitdojeho sousedů. Toto opakuj, dokud je fronta neprázdná.

Rozšíření cesty Rozšířenícestyvypadátak,žeprovrcholvvevzdálenostid(v) zkusímeprokaždouhranu {v,w},zda d(w) >d(v) +delka({v,w}). Pokudano,d(w) :=d(v) +delka({v,w})aopravpozicivrcholu wve frontě.

Analýza Algoritmus je popsán a dokázán v mnoha knihách(a skriptech), kupř. Kapitoly z diskrétní matematiky nebo Algebraické algoritmy(kučera, Nešetřil)... Konečnost: V každé iteraci odstraníme z fronty jeden vrchol,kterýsevníužneobjeví (protože mezi vrcholy ve frontě měl nejmenší vzdálenost od startu a vzdálenosti jsou nezáporné). Parciální správnosti pomůže invariant: V každém kroku evidujeme nejkratší cesty ze startu používající pouze vrcholy již odstraněné z fronty. Z invariantu plyne korektnost. Jde jen o modifikovaný algoritmus vlny, tedy hledání do šířky! Složitost významně závisí na reprezentaci grafu a na reprezentaci fronty!