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

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

Sada 1 - Základy programování

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

Programovací jazyk Pascal

Anotace. Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), Martin Pergel,

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

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

NPRG030 Programování I, 2010/11

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

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

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

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

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

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

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

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

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

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

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

ALGORITMIZACE A PROGRAMOVÁNÍ

Úvod do programování

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

VY_32_INOVACE_08_2_04_PR

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

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

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

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

Sada 1 - Základy programování

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.

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

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Implementace LL(1) překladů

Assembler - 5.část. poslední změna této stránky: Zpět

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

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

Algoritmy a datové struktury

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

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Jednoduché příkazy jazyka Pascal

CZ.1.07/1.5.00/

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

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

Sada 1 - Základy programování

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Anotace. Pointery, dynamické proměnné

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

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

Programovací jazyk PASCAL Turbo

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Sada 1 - Základy programování

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

Příklad 1/23. Pro rostoucí spojité fukce f(x), g(x) platí f(x) Ω(g(x)). Z toho plyne, že: a) f(x) Ο(g(x)) b) f(x) Θ(g(x)) d) g(x) Ω(f(x))

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Sada 1 - Základy programování

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

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

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

Úvod do programování 7. hodina

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

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Digitální učební materiál

Jazyk PL/SQL Úvod, blok

Dynamické programování

Ing. Igor Kopetschke TUL, NTI

6 Příkazy řízení toku

Poslední nenulová číslice faktoriálu

1 Mnohočleny a algebraické rovnice

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

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

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

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

Programování. Debugging a testování. Martin Urza

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Už známe datové typy pro representaci celých čísel i typy pro representaci

NPRG030 Programování I RNDr.Tomáš Holan, Ph.D. 4.patro, č

2.8.8 Výpočty s odmocninami II

Řídicí struktury. alg3 1

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

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

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

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Soubory. Hung Hoang Dieu. Department of Mathematics Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague 1 / 7

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

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

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

IB112 Základy matematiky

1 Mnohočleny a algebraické rovnice

II. Úlohy na vložené cykly a podprogramy

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Řešení úloh z TSP MU SADY S 1

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

Uplatnění metod na zvolený jazyk

Pointery II. Jan Hnilica Počítačové modelování 17

- jak udělat konstantu long int: L long velka = 78L;

Anotace. pointery (pars prima). Martin Pergel,

4.3 Operace nad ordin ln mi datov mi typy Operace nad logick m datov m typem Operace nad celo seln mi datov mi typy

VÝRAZY výrazy = operandy prokládané operátory, vyhodnocované podle priority operátorů

Polynomy. Mgr. Veronika Švandová a Mgr. Zdeněk Kříž, Ph. D. 1.1 Teorie Zavedení polynomů Operace s polynomy...

Transkript:

Anotace Ordinalni typy - typ char, funkce ord, chr, succ, prev, inc, dec, Motivace: Máme dlouhé číslo (nebo číslo ve stringu). Zapis cisla v pozicni soustave, jeho vyhodnoceni Hornerovym schematem, Evaluace polynomu Hornerovym schematem, umocnovani cisla, Predvypocet. Tvorba vlastních datových typů, výčtové datové typy, pole jako parametr case... of... direktivy překladače, soubory a práce s nimi, Rekurze podruhé

Ordinální datové typy Typy, jejichž hodnoty tvoří lineárně uspořádanou množinu (tedy pro každou dvojici je jasné, který prvek je větší). Z pascalských typů jsou to: integer, longint, byte, char, word, boolean a shortint (a další definované uživatelem, zejména výčtový typ a interval). Pro ordinální typy jsou definovány funkce Ord, Pred a Succ.

Funkce pro ordinální typy Funkce Ord vrátí ordinální hodnotu (tedy hodnotu pro část typů, konkrétně pro integer, longint, byte, word a shortint). Pro typ char vrátí ASCII hodnotu příslušného znaku. Umíme tedy zjistit ASCII-hodnotu jednotlivých znaků. Co naopak? Použijeme funkci Chr, která vrátí znak s příslušným číslem.

Hornerovo schéma Co když chceme konvertovat řetězec na integer? Použijeme tzv. Hornerovo schéma, tedy začneme od začátku řetězce (nejvyšší číslice). Zjistíme její hodnotu a postupujeme indukcí: Dosavadní výsledek vynásobíme deseti a přičteme číslici na dalším řádu. číslo a n a n 1 a n 2...a 0 zapsané v desítkovém zápisu je vlastně a n 10 n +a n 1 10 n 1 +...+a 0. A platí: a n 10 n +a n 1 10 n 1 +...+a 0 = (...((a n 10)+a n 1 10)+...+a 1 ) 10+a 0 Tímto způsobem můžeme vyhodnocovat čísla zapsaná v různých (pozičních) soustavách (dvojkové, čtyřkové, pětkové, šestkové...).

Příklad program x; var a:string; i,hod:longint; begin readln(a); i:=1; hod:=0; while i<=length(a) do begin hod:=10*hod+ord(a[i])-ord( 0 ); i:=i+1; end; writeln(hod); end.

Evaluace polynomu Máme zadán polynom a n x n +a n 1 x n 1 +...+a 0. Chceme tento polynom vyhodnotit (evaluovat), tedy určit jeho hodnotu v zadaném bodě x. Možnosti? Hrubá síla (počítat a n x n, a n 1 x n 1,... a sečíst) nebo Hornerovo schéma n a i x i = ((...(a n x +a n 1 )x +...+a 1 )x +a 0 ). i=0

Evaluace polynomu Hornerovým schématem 1: Načti koeficient u nejvyššího (dosud neprošlého) stupně, dosud načtené hodnoty vynásob hodnotou x, přičti hodnotu nově načteného koeficientu, GOTO 1;

Evaluace polynomu Hornerovým schématem program nic; var i,a,souc,stupen,x:integer; {Vyhodnot polynom stupne stupen v bode x, do a nacitej koeficienty} begin readln(stupen); readln(x); souc:=0; for i:=0 to stupen do begin souc:=souc*x; readln(a); souc:=souc+a; end; writeln( Hodnota polynomu je:,souc); end.

Umocňování čísla Předvedeno s využitím tabule.

Odbočka labely a GOTO V Pascalu je možno provádět poměrně nekontrolované skoky po programu. Za sekcí globálních proměnných (var) vytvoříme sekci label, kde vyjmenujeme použité labely, následně můžeme těmito labely označit vybraná místa programu a pomocí goto label; udělat nepodmíněný skok. GOTO nepoužívejte, používám ho jen já v pseudokódu k pedagogickým účelům.

Maximální jedničková podmatice Problém: V matici tvaru m n vyplněné nulami a jedničkami máme najít největší podmatici (souvislou) obsahující pouze jedničky.

Naivní algoritmus Pro každý možný levý horní a pravý dolní roh prohlédni vnitřek matice. Algoritmus funguje, ale s jakou složitostí? Θ(mn) levých horních rohů, Θ(mn) pravých dolních rohů, Θ(mn) prvků uvnitř (proč?), celkem tedy Θ(m 3 n 3 ). Nápady na zlepšení?

Předvýpočet Pro každou jedničku si spočítáme, kolik jedniček leží bezprostředně pod ní (tedy v řadě nepřerušené nulou). Zkoušíme každou matici identifikovat pomocí levého a pravého horního rohu: Ke kandidátu na levý horní roh zkoušej všechny možnosti pravého horního rohu (v jeho řadě). Tyto nesmějí být odděleny nulou (tedy žijí v souvislém bloku jedniček), Jelikož máme posčítané počty jedniček směrem dolů, stačí jako druhý rozměr vzít minimum z těchto posčítaných jedniček. Zbytek je násobení a porovnávání. Složitost: Předvýpočet O(mn), výpočet O(m 2 n).

Lze to ještě urychlit? Ku podivu ano a ještě k tomu znovu předvýpočtem: Spočítej blok jedniček směrem dolů, ( B) spočítej blok jedniček směrem nahoru, ( C) zkusíme hledat levý kritický konec, tedy místo, kde matice najede na nulu, tedy a i,j = 1 a a i,j 1 = 0 nebo j = 1 (a i,j 1 leží mimo matici). Zkus všechny možné kandidáty na pravý okraj (v příslušném řádku).

Analýza složitosti Předvýpočty (stavba matic B a C): O(mn), ačkoliv se zdá, že složitost výpočtu bude stejná jako dříve, není tomu tak, protože každý prvek matice zkoušíme jako kandidát na pravý okraj jen jednou! Celkem tedy O(mn); jelikož složitost problému je Ω(mn), máme algoritmus (až na konstantu) optimální.

Jak předat pole jako parametr funkci? V klasickém Pascalu je třeba definovat vlastní typ (demonstrovat, proč nejde naivní přístup). Turbo Pascal (a Free Pascal) umí tzv. open arrays.

Definice vlastního typu: Kĺıčové slovo type umožňuje definovat vlastní typ. triviální použití: type int=integer; použití: type x=array[1..10] of integer;

Příklad program nic; type pole=array[1..10] of integer; var p:pole; procedure vypis(a:pole); var i:integer; begin for i:=1 to 10 do writeln(a[i]); end; begin...vypis(p); end.

Open arrays V Turbo Pascalu i Free Pascalu, uvedeme, že parametr je pole nějakého typu, ale neřekneme meze. Příklad: procedure vypis(a:array of integer); Je předáno jako pole od 0 do N. Velikost můžeme zjistit pomocí funkce high.

Příklad na open arrays procedure vypis(a:array of integer); var i:integer; begin for i:=0 to high(a) do writeln(a[i]); end;

Další využití tvorby vlastních typů Chceme počítat dny v týdnu. Jak to uděláme? Očíslujeme si dny takto: Ponděĺı=1, Úterý=2,... Jenže já to přečísluju: Ponděĺı=0, Úterý=1,... Přijde američan a očísluje: Neděle=1, Ponděĺı=2,...... anebo Neděle=0, Ponděĺı=1,... Proto raději uděláme zvláštní typ indexovaný dny v týdnu a čísla necháme na překladači.

Výčtový datový typ Definujeme v sekci type, jednotlivé hodnoty klademe do závorek a oddělujeme čárkou. Příklad: type dnyvtydnu=(pondeli,utery,streda, ctvrtek,patek, sobota,nedele); Anebo definujeme přímo proměnnou tohoto typu: var kal:(pondeli,utery,streda,ctvrtek,patek, sobota,nedele);

Příklad Chceme vyrobit jednoduchý kalendář na rok 2010, tedy vypsat datum a údaj o dni v týdnu. Pro jednoduchost předpokládejme, že každý měsíc má 30 dnů... Zdrojový kód je na webu (kam.mff.cuni.cz/ perm/programovani/enum.pas). V příkladu vidíme, že funkce write neumí vypsat příslušné názvy, bylo by proto pěkné v závislosti na čísle dne v týdnu vypsat příslušný text. Nápady? Bud to mnoho klauzuĺı if, nebo: case proměnná of...

Konstrukce case... of... Umožňuje vytvořit mnoho větví programu v závislosti na obsahu jedné proměnné. Syntax: case jméno proměnné of hodnota1: příkaz nebo blok hodnota2: příkaz nebo blok else příkaz nebo blok end; Provede se jen větev označená aktuální hodnotou proměnné, else-větev je pro ostatní (explicitně neuvedené) případy. Klauzule else nemusí být přítomna! Je-li poslední klauzule blok, jde end dvakrát po sobě (první uzavře blok posledních příkazů, druhý uzavře blok case).

Příklad kalendář s jmény dnů je na adrese kam.mff.cuni.cz/ perm/programovani/case of.pas.

Direktivy překladače Překladač kontroluje plno věcí, například: zda nekoukáme za konec pole, zda nám nepřetekl zásobník, anebo zda nenastala chyba na vstupu/výstupu... Většinou je užitečné mít kontroly zapnuté, někdy však víme, co děláme. V tom případě můžeme na nezbytnou dobu chování překladače změnit pomocí tzv. direktiv překladače. Direktivy vypadají jako komentář, tedy jsou ve složených závorkách, ovšem začínají znakem string ($), jméno je zpravidla 1znakové a následuje přepínač +/.

Direktivy překladače: Příklad: {$R } vypni range-checking. Nejdůležitější: $Q overflow-checking, $R range-checking, $I test vstupu a výstupu, Úplný seznam najdete v helpu (některé direktivy se liší podle překladačů).