V tomto díle si povíme něco o tom, jak lze ovládat průběh naší aplikace a také se podíváme na základy OOP.
V asi každém programu je zapotřebí nějak ovládat jeho průběh a v závislosti na určitých věcech provádět věci jiné. Zaměříme se na podmíněné příkazy a cykly.
Podmíněné příkazy spočívají, jak již název napovídá, v podmínkách. Pokud je splněna určitá vstupní logická podmínka (tedy návratová hodnota podmínky bude TRUE), tak se vykoná určitý kód. Pokud podmínka splněna není (FALSE), tak se ten kód nevykoná a program pokračuje dál.
If…then
Příkaz typu if…then je vám asi známý z ostatních programovacích jazyků. Jeho syntaxe je skoro všude stejná, ale radši všechno rozeberu. Hned pro začátek je zde snad dost názorná ukázka:
..
if Button1.Caption='Ahoj' then ShowMessage('Čau!');
..
Nyní, když tlačítko Button1 bude mít popisku Ahoj, zobrazí se dialog se zprávou Čau!.
Pokud potřebujeme, aby se provedl blok 2 a více příkazů, musíme tento blok ohraničit klíčovými slovy begin a end:
if Button1.Caption='Ahoj' then
begin
ShowMessage('Čau');
Button1.Caption:='Čau';
end;
Další možností je, že budeme potřebovat ošetřit i případ, kdyby podmínka splněna nebyla. K tomu slouží klíčové slovo else
Pozn.: Poslední příkaz před slovem else nesmí končit znakem „;“ (středník)
if Button1.Caption='Ahoj' then
begin
ShowMessage('Čau');
Button1.Caption:='Čau';
end
else
begin
ShowMessage('Nazdar');
end;
Nyní se v případě, že je splněna podmínka, zobrazí zpráva Čau a změní se popiska tlačítka. V případě, že podmínka splněna nebude, tak se pouze zobrazí zpráva Nazdar.
Podmínky lze spojovat i pomocí logických operátorů:
if (Button1.Caption='Ahoj') and (Button2.Caption='Nazdar') then
ShowMessage('Čau');
if (Button1.Caption='Ahoj') or (Button2.Caption='Nazdar') then
ShowMessage('Čau');
Rozdíl mezi těmito dvěmi podmínkami je zřejmý. V prvním případě je nutné, aby byly splněny obě podmínky. Pokud je splněna jen jedna z nich, pak je celá podmínka nepravdivá. Ve druhém případě musí být splněna alespoň jedna podmínka (první, druhá, nebo obě), aby celý výraz byl pravdivý.
Zde je tabulka logických operátorů:
A | B | A and B | A or B | A xor B | not A | not B |
true | true | true | true | false | false | false |
true | false | false | true | true | false | true |
false | true | false | true | true | true | false |
false | false | false | false | false | true | true |
Case
Druhým podmíněným příkazem je příkaz case. Má pouze jedinou nevýhodu, a tou je, že ho lze použít pouze ve spojení s ordiálními typy (datové typy integer, character, Boolean a ještě další, ale s těmi se asi nikdy nesetkáte). Zde je ukázka:
case vek of
1: ShowMessage('Je ti 1 rok');
2: ShowMessage('Jsou ti 2 roky');
3: ShowMessage('Jsou ti 3 roky');
...
18: begin
ShowMessage('Je ti 18 let');
dospely:=true;
end;
19: ShowMessage('Je ti 19 let');
...
90: ShowMessage('Je to 90 let')
else
ShowMessage('Je ti hodně let');
end;
Myslím, že vše je jasné. Když proměnná vek má hodnotu 1, zobrazí se zpráva Je ti 1 rok atd… Když je proměnná vek rovna 18ti, tak budu kromě zobrazení zprávy chtít ještě nastavit proměnnou dospely na true, takže je nutné uzavřít blok příkazů mezi klíčová slova begin a end. Nakonec je tu ještě klíčové slovo else. Příkazy uvedené za else se provedou, pokud žádná z výše uvedených podmínek splněna nebude.
For…to…do
Příkaz typu for…to…do je cyklický příkaz s pevným počtem opakování. Pro názornost nejprve uvedu ukázku:
for i:=10 to 150 do begin
ShowMessage('Proměnná i má hodnotu '+IntToStr(i));
end;
Při každém průchodu cyklem se hodnota proměnné i zvětší o 1. Cyklus se bude opakovat tak dlouho, dokud i nenabude konečné hodnoty.
Pokud potřebujeme odpočítávat shora dolů, musíte slovo to nahradit slovem downto. Pak si ale dejte pozor, aby počáteční hodnota nebyla větší než koncová.
While…do
Pokud však předem nevíte, kolikrát se má cyklus zopakovat, lze použít příkaz typu while…do:
while x<50 do begin
x:=x+1;
ShowMessage('Proměnná x má hodnotu '+IntToStr(x));
end;
Místo takovéto čítací podmínky lze použít například podmínku booleanovskou, tedy:
splneno:=false;
while splneno=false do begin
x:=x+1;
if x=50 then spleno:=true;
end;
V tomto případě se cyklus bude opakovat, dokud proměnná splneno nenabude hodnoty true.
Repeat…until
Podobný jako cyklus typu while…do. Liší se tím, že podmínka je zde až na konci cyklu, nikoliv na začátku. Pokud u while…do není na začátku splněna podmínka, tak se celý blok příkazů v cyklu vůbec neprovede, zatímco u repeat…until proběhne vždy, pouze se pak rozhodne, jestli se má zopakovat:
repeat
x:=x+1;
until x>50;
Také si musíte dávat pozor na to, že podmínka je zde obrácená! Zde se příkazy opakují, dokud podmínka není splněna (zatímco u while je provádí, dokud je podmínka platná).
Také jste si určitě všimli, že klíčová slova begin a end jsou zde nahrazena slovy repeat a until.
Řízení cyklů
Někdy je třeba běh cyklu trochu ovlivnit. K tomu slouží klíčová slova continue a break.
- continue – Příkaz continue způsobí, že dojde k okamžitému ukončení iterace. Program přeskočí všechny příkazy, které v cyklu po tomto slově následují a program se zase vrátí na 1. příkaz
- break – Break slouží k přerušení aktuálního cyklu s tím, že další iterace už nenásledují, program automaticky skočí na první příkaz za cyklem.
Základy OOP
Problematika objektově orientovaného programování je obrovská a je to opravdu velmi komplikované. Pro naše potřeby bude stačit, když si vysvětlíme základy:
Pokud se o OOP chcete dozvědět něco víc, odkazuji vás na některé internetové stránky – odkaz 1, odkaz 2 – nebo si trošku zagooglete :)
OOP spočívá v seskupení objektů s definovaným rozhraním, přes něž komponenty vzájemně komunikují.
Zde je uvedeno několik základních typů OOP:
- Objekty – jednotlivé prvky modelované reality (jak data, tak související funkčnost) jsou v programu seskupeny do entit nazývaných objekty. Objekty si pamatují svůj stav a navenek poskytují operace (přístupné jako metody pro volání).
- Abstrakce – programátor (potažmo program, který vytváří) může abstrahovat od některých detailů práce jednotlivých objektů. Každý objekt pracuje jako černá skříňka, která dokáže provádět určené činnosti a komunikovat s okolím, aniž by vyžadovala znalost způsobu, kterým vnitřně pracuje.
- Zapouzdření – zaručuje, že objekt nemůže přímo přistupovat k „vnitřnostem“ jiných objektů, což by mohlo vést k nekonzistenci. Každý objekt navenek zpřístupňuje rozhraní, pomocí kterého (a nijak jinak) se s objektem pracuje.
- Skládání – Objekt může využívat služeb jiných objektů tak, že je požádá o provedení operace.
- Dědičnost – objekty jsou organizovány stromovým způsobem, kdy objekty nějakého druhu mohou dědit z jiného druhu objektů, čímž přebírají jejich schopnosti, ke kterým pouze přidávají svoje vlastní rozšíření. Tato myšlenka se obvykle implementuje pomocí rozdělení objektů do tříd, přičemž každý objekt je instancí nějaké třídy. Každá třída pak může dědit od jiné třídy (v některých programovacích jazycích i z několika jiných tříd).
- Polymorfismus – odkazovaný objekt se chová podle toho, jaký je jeho skutečný typ. Pokud několik objektů poskytuje stejné rozhraní, pracuje se s nimi stejným způsobem, ale jejich konkrétní chování se liší. V praxi se tato vlastnost projevuje např. tak, že na místo, kde je očekávána instance nějaké třídy, můžeme dosadit i instanci libovolné její podtřídy (třídy, která přímo či nepřímo z této třídy dědí), která se může chovat jinak, než by se chovala instance rodičovské třídy, ovšem v rámci mantinelů daných popisem rozhraní.
(Tato část byla převzata ze serveru Wikipedia.cz v souladu s pravidly GNU FDL a pravidel uvedených na webu Wikipedia.cz)
Pozn.: Napsal bych to sám, ale tohle se mi zdálo srozumitelnější a přesnější.
Myslím, že pro dnešek to stačí.
Závěrem
A je tu konec (už zase :). Příště budeme pokračovat v OOP. Na nějakých praktičtějších příkladech si vysvětlíme zapouzdření, dědičnost a polymorfismus – tři nejdůležitější věci v OOP.
Úkol
Dnes budou opět klasické úkoly:
- Pochopit a naučit se podmíněné a nepodmíněné příkazy a cykly
- Aspoň trošku zkusit pochopit OOP
- Vytvořit program, kam uživatel pomocí komponenty Edit zadá libovolné číslo a program pak provede následující kroky: napočítá od nuly do čísla, které uživatel zadal (pomocí jednoho z cyklů) a pokud číslo bude větší než 50, tak zobrazí jednu hlášku, pokud bude menší, zobrazí jinou hlášku (příkaz ShowMessage(zprava), kde zprava je typu string). Hodnota zadaná v komponentě Edit je uložena v Edit1.Text a je typu string (i když je to číslo). Pro přetypování na číselnou proměnnou použijte funkci StrToInt.