====== 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,