====== Programování ====== ===== Algoritmy ===== ==== Algoritmizace ==== === Algoritmus === *obecný návod, který přesně, krok za krokem, popisuje akci, kterou musíme provést, abychom vyřešili daný problém *je to konečná, přesně definovaná posloupnost příkazů, jejíž provedení nám umožní po konečném počtu kroků získat pro přípustné vstupní údaje odpovídající výstupní údaje *konečná, přesně definovaná posloupnost příkazů, po jejichž provedení získáme k přípustným vstupním datům odpovídající data výstupní *logika a řízení *základní postup výpočtu *je to prvotní pojem (nemůžeme ho definovat jednoznačně) *posloupnost příkazů *při tvorbě algoritmů musíme vědět, jaké akce umí procesor provést a jak mu provedení těchto akcí předepsat *ne každý přepis je algorimem === Proces=== *postupné provádění příkazů návodu (skládá se z jednotlivých dílčích činností) *podle jednoho návodu může probíhat více různých procesů *procesor musí návodu rozumět a umět provádět popisované akce === Procesor === *realizuje proces *musí návodu rozumět a umět provádět popisované akce === Příkaz === *popis akce === Akce === *činnost, která má konečné trvání a přesně definovaný účinek ==== Vlastnosti algoritmu ==== ***Determinovanost** (jednoznačnost) -- jednotlivé kroky algoritmu a pořadí, v jakém jsou prováděny jsou jednoznačně určeny (=> při stejných počátečních hodnotách dostaneme vždy stejný výsledek) ***Hromadnost** -- algoritmus lze použít pro řešení obecné úlohy (zapsat v jakékoli symbolice) ***Rezultativnost** (Konečnost) -- postup řešení vede po konečném počtu kroků vždy k výsledku ==== Proměnná ==== === Operační paměť === *je rozdělena na byty === Bity === *slučují se po 8 do bytů === Byty === *nejmenší jednotka, na kterou můžeme ukládat === Proměnná === *objekt, který má pevně stanovené označení (identifikátor) a nese určitou hodnotu *hodnota se může v průběhu procesu měnit === Identifikátor === *skládá se z písmen a číslic a jiných povolených znaků (začíná vždy písmenem) *označení (jméno) proměnné === Výraz === *přepis pro získání hodnoty (konstanta, aritmetický výraz, …) ==== Příkazy ==== === Přiřazovací příkaz === přiřazovací znaménko: := přiřazovací příkaz: proměnná := výraz === Příkaz vstupu === read/readln (seznam proměnných) === Příkaz výstupu === write/writeln (seznam proměnných/'text na vystup') ==== Způsoby zápisu algoritmu ==== *Slovně -- v přirozeném jazyce popřípadě s matematickými vzorci *Graficky -- vývojový diagram *Programovacím jazykem (vyšším, nižším-strojovým kódem, pseudokódem) ==== Vývojové diagramy ==== //jazyk vývojových diagramů je normalizován a přehled značek lze nalézt na internetu// ==== Strukturované programování ==== Zásady pro snadnou modifikovatelnost a přehlednost metod: ***Metoda shora dolů** -- složitější problém rozdělíme na jednodušší, které pak samostatně řešíme: -Úlohu postupně rozkládáme na jednodušší, takto postupujeme tak dlouho, dokud je to třeba -Nejprve určíme podobu vstupních a výstupních dat, pak sestavíme hrubý vývojový diagram (hlavní program) -Podle něj budeme úlohu dále rozkládat -Při rozkladu se používají pouze doporučené struktury (Posloupnost, Větvení, Cyklus) -Prvky struktur mohou být opět tvořeny strukturami ***Posloupnost** – posloupnost příkazů uzavřená mezi Begin a End (do složených závorek atp.) ***Větvení** – If (if podmínka then příkaz else příkaz;) Case (case řídící proměnná of : příkaz_1; 2:příkaz_2; ...) ***Cyklus** *S podmínkou na začátku – While: While podmínka do Příkaz; (Dokud platí podmínka, prováděj příkaz) *S podmínkou na konci – Repeat: Repeat Příkaz until podmínka; (Prováděj příkaz, dokud neplatí podmínka) *S určeným počtem opakování – For: For řídící proměnná := počáteční hodnota to/downto koncová hodnota do Příkaz/Posloupnost příkazů (Prováděj dokud pokud je ř. prom. v intervalu ) FIXME *Jeden začátek, jeden konec *Rozlišování vstupních, výstupních a pomocných proměnných *Každá struktura má jeden vstup a výstup Při řešení úlohy ji musíme specifikovat: *Musíme znát vstupní údaje a vědět, co chceme získat (délka strany čtverce a, jeho objem a povrch) *Vstupní hodnoty (známé před začátkem řešení) musí být procesoru dodány v průběhu realizace procesu, nemohou být libovolné, musí splňovat vstupní podmínku (a >0, a je celé číslo) *Výstupní hodnoty zadáváme pomocí výstupní podmínky, kterou musí splňovat (Objem = a^3, Povrch = 6a^2) Verifikace a testování Verifikace Algoritmu = ověření správností algoritmu (např pomoc testovacích/trasovacích tabulek) Trasovací tabulka – do záhlaví tabulky zapíšeme hodnoty proměnné a pod ně zapisujeme hodnoty proměnných, které se po provedení příslušného kroku změnily (jako krokování na papíře). Neslouží k důkazu správnosti algoritmu! Programovací jazyk Při sestavování programů pro řešení konkrétní úlohy řešíme dva základní okruhy: 1)Sestavit algoritmus (nalézt postup vedoucí k řešení úlohy) 2)určit, jakými objekty v programu budou reprezentována data =>Programovací jazyk musí poskytnout: 1)Prostředky pro formulaci příkazů k provedení akcí 2)Prostředky pro popis dat Abeceda jazyka (Pascal) a) písmena latinské abecedy (a-z) b) číslice desítkové soustavy (0-9) c) speciální symboly (operátory, čárky, tečky, ...) Z nich tvoříme na lexikální (slovotvorné) úrovni lexikální jednotky=elementy (podobně jako v mateřštině slova). Lexikální jednotky mohou být: 1)Klíčová slova – domluvená slova používaná v programu, chápou se jako nedělitelný symbol (jediný znak) 2)Identifikátory – veškerá označení (jména objektů, proměnných, konstant, programů, datových typů, procedur, fcí, ...) *Jako identifikátor nelze použít klíčové slovo! *Jedním identifikátorem nelze označit dva různé objekty v jednom bloku! *Standardní identifikátor – význam je definován jazykem, je předepsaný 3)Čísla – zapisujeme v desítkové (i šestnáctkové) soustavě. známe celá čísla ve tvaru se znaménkem/bez znaménka nebo reálná čísla, která zapisujeme buď v desetinném nebo semilogaritmickém tvaru 4)Řetěz – posloupnost znaků uzavřená mezi apostrofy ('například když vypisujeme uživateli') 5)+Oddělovače lexikálních jednotek: mezera, přechod na nový řádek, komentář (libovolná posloupnost znaků uzavřená do složených závorek/mezi jednoduchou závorku a hvězdičku/za dvěma lomítky do konce řádku atp) Výraz =Předpis pro výpočet hodnoty -Může být na různých přesně definovaných místech -může obsahovat a) operandy (proměnné, konstanty, funkce, …) b) operátory (+, -, *, div, mod, …) c) závorky (jen kulaté) -může být a) aritmetický výraz => hodnotou je číslo b) logický výraz => hodnotou je logická hodnota (true/false) Syntaxe (Syntaktická pravidla; Syntax error) -pravidla pro vytvoření přípustných zápisů v daném jazyce Sémantika (Sémantická pravidla) -pravidla, určující jaký význam má syntakticky správně vytvořený zápis Priorita operátorů 1)NOT 2)*, /, div, mod, AND 3)+, -, OR 4)=, <, >, <>, <=, => (relační operátory) Struktura programu Program = Hlavička + Blok (Tělo) Hlavička = Program a identifikátor programu Blok (Tělo) = část deklarací a definicí + příkazová část programu = každý program, procedura, funkce - každý příkaz je ukončen středníkem, za posledním Endem programu je tečka Část definicí a deklarací – definují se zde proměnné, typy, konstanty, podprogramy, ... Příkazová část programu – posloupnost příkazů uzavřená mezi Begin a End Programovací jazyk Pascal Příkazy v Pascalu Příkaz – předpis pro prováděnou akci z hlediska funkce: a) Příkazy k provedení základů b) Příkazy určující pořadí provádění dalších příkazů Pořadí provádění příkazů určujeme 1)pomocí příkazu skoku (GoTo – většinou se jeho používání snažíme vyhnout pro přehlednost) 2)Strukturovanými příkazy (např cyklů) z hlediska strukturovanosti: a) jednoduché – takové příkazy, které neobsahují jiné příkazy b) strukturované – obsahují další příkaz(y) Jednoduché příkazy Přiřazovací příkaz proměnná := výraz -nejprve se vypočítá výraz na pravé straně a poté se hodnota přiřadí do proměnné vlevo -proměnná i výraz musí být stejného typu Příkaz vstupu (čtení) read (seznam proměnných) -hodnota na vstupu se přiřadí proměnné uvedené jako parametr (musí být stejného typu) readln (seznam parametrů) -přečte ze vstupu všechno, co na něm aktuálně je, co patří do proměnné do ní uloží a zbytek zahodí Příkaz výstupu (výpis) write (seznam proměnných) nebo ('text') -parametrem je buď proměnná nebo řetěz (posloupnost znaků uzavřená mezi apostrofy) -vypíše na výstup svůj parametr writeln (seznam proměnných) nebo ('text') -po výpise „odřádkuje“ a příští výpis se píše na nový řádek Prázdný příkaz ; -nevykoná žádnou akci, ale může znehodnotit příkaz za ním následující před end nemusíme psát středník (prázdný příkaz se provede a end to nijak neohrozí) před until nebo else středník nesmíme napsat, protože to jsou jen části příkazů (If a repeat) a středník příkaz ukončuje, tedy by se zbytek příkazu neprovedl a program by přeskočil na začátek následujícího příkazu Strukturované příkazy 1)Příkaz složený 2)Příkazy podmíněné 3)Příkazy cyklů Příkaz složený Begin Příkaz_1; Příkaz_2; … Příkaz_n end; =Posloupnost příkazů uzavřená mezi Begin a end -program jej chápe jako jeden příkaz a můžeme jej tedy použít ve všech příkazech Příkazy podmíněné 1)If a) neúplný: If Podmínka then Příkaz b) úplný: If Podmínka then Příkaz else Příkaz_2; -Podmínku tvoří logický výraz (může být vyjádřena zápisem relace s použitím relačních operátorů) 2)Case Case řídící proměnná of 1: Příkaz_1 2: Příkaz_2 … n: Příkaz_n end; -Při vícenásobném větvení -řídící proměnná je většinou typu integer (může však být jakéhokoli jiného, ten se však musí shodovat se znaky, které určují, který příkaz se bude provádět) Příkazy cyklů -umožňují opakované provádění (posloupnosti) příkazů 1)While: While Podmínka do Příkaz; (Dokud platí podmínka, prováděj příkaz) -S podmínkou na začátku 2)Repeat: Repeat Příkaz until Podmínka; (Prováděj příkaz, dokud neplatí podmínka) -S podmínkou na konci 3)For: For řídící proměnná := počáteční hodnota to/downto koncová hodnota do Příkaz/Posloupnost příkazů (Prováděj dokud pokud je řídící proměnná v intervalu ) -S určeným počtem opakování -to pro stoupající cyklus, downto pro klesající cyklus -Poč. a konc. hodnota musí být stejného typu jako řídící proměnná (ordinárního) -Vypočítají se výrazy (jedinkrát) a řídící proměnné se přiřadí počáteční hodnota (první vstup ze shora, následně už jen z boku-pro diagram) -Je zakázáno měnit hodnotu řídící proměnné uvnitř cyklu -po skončení cyklu je hodnota řídící proměnné nedefinovaná Datové typy Datový typ -určuje, jakých (z jakého oboru) hodnot bude proměnná nabývat. Každá proměnná může nabývat pouze určitých hodnot (V Pascalu musí být předem definována=určeno jakých typů může nabývat) je určen: 1)množinou přípustných hodnot (celá čísla, reálná čísla, true/false, znaky, ...) 2)množinou přípustných operací (závislé od datového typu-to pro co je obor uzavřený) 3)identifikátorem (jméno) je definován: 1)jazykem - předdefinován 2)programátorem v programu může být: 1)ordinální – můžeme určit, jaký prvek bude následovat či předcházet 2)neordinální – nelze určit, jaký prvek je předchůdcem či následníkem daného prvku Typ (v Pascalu) může být: 1)jednoduchý a) standardní (integer, real, boolean, char) b) programátorem definovaný (výčtový typ, typ interval) 2)strukturovaný (pole, záznam, množina, soubor) 3)ukazatel Ordinální typy -množina hodnot je uspořádaná: pro každé dvě hodnoty lze určit, která je větší (menší) -každé hodnotě je přiřazeno ordinální číslo -můžeme určit následující a předcházející hodnotu -jsou pro ně definovány standardní fce: 1)ord – přiřazuje každé hodnotě její ordinální číslo [ord (8) – ord (0) = 8; ord (0) = 48; ord (true) = 1] 2)succ – určuje následníka (následující hodnotu v dané množině) [succ (false) = true; succ (3) = 4 ] 3)pred – určuje předchůdce [pred (false) není definován; pred (true) = false] -ordinální číslo – pořadové číslo hodnoty v množině přípustných hodnot -ordinálními typy jsou všechny, krom real Jednoduché typy: 4 základní předdefinované (standardní) typy: 1)Integer (celá čísla; +, -, …) 2)Real (desetinná čísla; +, -, *, …; není ordinální!) 3)boolean (logické hodnoty; AND, OR, …) 4)char (znakové hodnoty) *Integer množina příp. hodnot: množina celých čísel zobrazitelná v počítači -Konstanta MAXINT: hodnota největšího zobrazitelného čísla -Oblast přetečení: oblast mimo rozsah zobrazitelných hodnot množina příp. operací: aritmetické (+, -, *, div, mod; výsledek nemusí být integer) relační (<, <=, ==, <>, =>, >) *Real množina příp. hodnot: množina reálných čísel zobrazitelná v počítači (oblast mimo tento rozsah je oblast přetečení) množina příp. operací: aritmetické (+, -, *, div, mod; výsledek je typu real) relační (<, <=, ==, <>, =>, >) -možnosti zápisu desetinného čísla 1)desetinný tvar (číslo s desetinnou tečkou) 2)semilogaritmický tvar -tvar: mantisa E exponent (5E+4 „pětkrát deset na čtvrtou“) -mantisa-celé číslo (nebo číslo reálné v desetinném tvaru) vyjadřující násobek desítky na x-tou -exponent-celé číslo, vyjadřující stupeň mocniny (nakolikátou) Převod hodnot 1)integer -> real - provádí se automaticky (za tečku se přidají nuly) 2)real -> integer – musíme zaokrouhlit nebo odseknout desetinnou část, neprovádí se automaticky *Boolean množina příp. hodnot: true/false {true (1) > false (0)} množina příp. operací: relační (<, <=, ==, <>, =>, >), logické (NOT, AND, OR) *Char množina příp. hodnot: množina všech přípustných znaků (uspořádaná množina hodnot určená implementací – ASCII) některé znaky jsou nezobrazitelné množina příp. operací: relační operace standardní fce: ord, chr, před, succ; Typy zavedené programátorem: Nový typ se v programu zavádí popisem: 1)bez pojmenování v deklaraci proměnné 2)v části definicí typů s pojmenováním {Program ... type ident = ... Var … } 1) typ výčtový – vypíšeme prvky {type ident = (červená a modrá)} 2) typ interval – uvedeme interval {type ident = 1..10} *Výčtový typ -definuje se výčtem hodnot definice: type (klíčové slovo) SEMAFOR (identifikátor) = (Zelená, žlutá, červená) (výčet, popis); -hodnoty výčtového typu nelze číst ani zobrazit *Typ interval -proměnná nabývá hodnot z intervalu hodnot jiného (hostitelského) typu -popis typu: type ident = konstanta1..konstanta2 -konstanta1 se nazývá horní mez, konstanta2 dolní mez (nemusí být jen kladné) -hostitelský typ - typ, ze kterého je interval vybírán, určen typem konstant -pro typ interval jsou definovány stejné operace a fce jako pro hostitelský typ Strukturované typy: *Pole (Array, matrix, ...) -datová struktura skládající se z pevného počtu složek stejného typu (homogenní) uspořádaných v jednom či více rozměrech -složky pole označujeme identifikátorem pole a indexy popis typu: type array [typ indexu] of typ složky -typ indexu musí být ordinální -typ složky je libovolný -typ indexů i složky může být zadán popisem typu ([1..7]) nebo identifikátorem typu (měsíc = 1..12; of měsíc) -v případě užití definice [1...N] musí být N konstantou, není to proměnná -složky = indexované proměnné -typ indexu musí být ordinální -nelze je přečíst nebo vypsat zároveň (For) *Řetěz (String) -posloupnost znaků (max 255) -v nultém bytu je uložen znak s ordinálním číslem odpovídajícímu aktuální délce řetězu (při zřetězení se automaticky mění) popis typu: type jméno = string [možné omezení počtu znaků] Ve standardním Packalu je popis typu řetěz: Packed array [1..n] of char -lze přečíst zároveň -k jednotlivým znakům lze přistupovat také pomocí indexů (jako u pole; Pozor na nultý byte!) -do čísla, jež vyjadřuje omezení počtu znaků se nepočítá nultý byte -přípustné operace 1)zřetězení 2)relační (porovnávají se ordinální čísla) *Záznam -heterogenní strukturovaný datový typ (může se skládat ze složek různého typu) o pevném počtu složek složky typu záznam se nazývají položky a označují se identifikátory popis typu: Student = record jméno: String[20]; věk:integer; propadl:boolean; end; Var S :Student; read (S.jméno) (tečková notace: S=identifikátor proměnné, jméno=identifikátor položky) -abychom nemuseli opisovat identifikátor proměnné, použijeme WITH popis: WITH S do Begin read (jméno); read (věk); end; -pozor na práci s boolean *Case -pro strukturované větvení -skládá se z výrazů ordinálního typu a seznamu příkazů, z nichž každému předchází jedna nebo více konstant popis typu: Case výraz ord. typu of konstanta1:P1 konstanta2:P2 ... konstantaN:PN else PX end; -nejprve se vyhodnotí výraz ordinálního typu a pak se provede příkaz, před kterým je uvedena konstanta odpovídající hodnoty Pokud se hodnota ordinálního výrazu neshoduje s žádnou z konstant tak se: 1)neprovede nic 2)provede příkaz za else Standardní funkce abs (A) výsledek (hodnota fce): absolutní hodnota argumentu typ argumentu A: integer (real) typ výsledku: integer (real) sqr výsledek (hodnota fce): druhá mocnina argumentu typ argumentu A: integer (real) typ výsledku: integer (real) sqrt výsledek (hodnota fce): odmocnina z argumentu (pouze pro Argument >=0, jinak chyba) typ argumentu A: real/integer typ výsledku: real sin výsledek (hodnota fce): sin Agumentu (pro Argument zadaný v radiánech) typ argumentu A: real/integer typ výsledku: real cos výsledek (hodnota fce): cos Argumentu (pro Argument zadaný v radiánech) typ argumentu A: real/integer typ výsledku: real trunc výsledek (hodnota fce): celá část Argumentu typ argumentu A: real typ výsledku: integer round výsledek (hodnota fce): zaokrouhlena hodnota argumentu {Pro A>=0 trunc (A+0.5) Pro A<0 trunc (A-0.5)} typ argumentu A: real typ výsledku: integer Typy objektů 1)Proměnná 2)konstanta a) nepojmenovaná konstanta (nemá identifikátor; přímý zápis) b) pojmenovaná konstanta -označená identifikátorem -v průběhu programu se nemůže měnit -definice: const identifikátor = konstanta (Pí = 3,14) 3)výraz -je dán pravidly pro vyhodnocování výrazu Rozsah platnosti proměnné globální proměnná platí všude, v běhu celého programu (mohou sloužit k předávání hodnot mezi bloky) deklaruje se v hlavním programu lokální proměnná vzniká v okamžiku zavolání podprogramu a zaniká v okamžiku jeho ukončení (uvolňuje místo) deklarují se uvnitř proceduryKaždá proměnná je platná i v blocích vnořených Každá proměnná je platná i v blocích vnořených Podprogramy =jednotlivé dílčí podúlohy, získané rozkladem řešení původní úlohy, definované v programu -Umožňují použít vícenásobně jedenkrát zapsaný kód -Jejich používáním se zápis stává přehledným a logicky strukturovaným -Používání pp usnadňuje kontrolu programu -Umožňuje snadné modifikace kódu (na jedno místě) -Dělíme je na: 1)Procedury 2)Funkce Procedury Deklarace -uvádí se pod Var procedure jméno (seznam formálních parametrů); lokální deklarace a definice; begin příkazová část end; Volání procedury -jednoduchý příkaz jméno(seznam skutečných parametrů); Procedury s parametry -parametry jsou proměnnými, které vznikají při zahájení a zanikají při skončení procedury formální parametry – uvádí se v deklaraci procedury (s definicí svého typu), při volání jsou nahrazeny skutečnými skutečné parametry – podle předem daných pravidel (záleží na pořadí) nahradí formální parametry parametry volané hodnotou -vstupní -jejich změna v těle podprogramu nemá vliv na skutečný parametr (při volání proc se vytvoří lokální proměnná, do které se uloží hodnota skutečného parametru) -skutečným parametrem mohou být proměnná, konstanta či výraz kompatibilní vzhledem k přiřazení s typem formálního parametru parametry volané odkazem (VAR) -výstupní -výpočet procedury probíhá se skutečným parametrem -skutečným parametrem musí být proměnná Funkce Definice function jméno (seznam formálních parametrů) identifikátor typu; lokální deklarace a definice; begin příkazová část (alespoň jednou obsahující jméno:=hodnota;); end; Volání fce -výraz jméno(seznam skutečných parametrů); -Slouží k popisu dílčích algoritmů pro výpočet jediné hodnoty (výsledku) -Funkcí nemůže být strukturovaný dat. typ Rekurze =podprogram, který je definován pomocí sám sebe (ve svém těle volá sám sebe) 1)přímá – podprogram A volá přímo podprogram A 2)nepřímá podprogram A volá podprogram B ( a podprogram B volá...podprogram N) podprogram N volá podprogram A -nahrazuje cyklus -před rekurzivním voláním musí být podmínka, která ukončuje cyklus -příklad Faktorial, Hanoiské věže,