Obsah lekce:
V reálném životě se často setkáváme s podmínkami - rozhodováním se na základě nějakých skutečností - například:
Obecně řečeno: Když platí nějaká podmínka, tak ..., jinak ... Podmínky mohou být různě složité a v různém množství - tím se pak celá soustava podmínek komplikuje, ale může poskytovat řešení i pro poměrně složité situace.
V Pascalu (stejně jako v mnoha dalších programovacích jazycích) existuje příkaz IF THEN (ELSE). Syntaxe tohoto příkazu je následující:
IF (podmínka) THEN posloupnost-příkazů
Chceme-li také specifikovat co je má stát, když podmínka naplatí, pak příkaz IF-THEN obsahuje ještě část ELSE, která se vykoná, pokud podmínka neplatí.
IF (podmínka) THEN posloupnost-příkazů-1 ELSE posloupnost-příkazů-2
Ukažme si jednoduchý příklad:
Program JeCisloVetsiNezPet;
var a:integer;
begin
readln(a);
IF (a>5) THEN writeln('a je vetsi nez 5');
readln;
end.
Pokud budeme chtít být přesnější informaci, pak použijeme kompletní tvar IF-THEN-ELSE:
Program JeCisloVetsiNeboMensiNezPet;
var a:integer;
begin
readln(a);
IF (a>5) THEN
writeln('a je vetsi nez 5')
ELSE
writeln('a neni vetsi nez 5');
readln;
end.
Pokud budeme chtít být ještě přesnější a vyhodnotit jak obě nerovnosti, tak i rovnost, pak použijeme v jedné z větví IF-THEN-ELSE další příkaz IF-THEN (tzv. vnořený IF):
Program JeCisloVetsiMensiNezPetNeboRovno;
var a:integer;
begin
readln(a);
IF (a>5) THEN
writeln('a je vetsi nez 5')
ELSE
IF (a<5) THEN
writeln('a je mensi nez 5')
ELSE
writeln('a je rovno 5');
readln;
end.
Na tomto příkladu si můžeme všimnout jedné syntaktické speciality Pascalu a to, že před ELSE se nepíše na konci řádku středník.
Potřebujeme-li podmínku složitější, pak je ji možno složit z více podmínek pomocí operátorů AND a OR.
Operátor AND je analogií spojky "a". Pokud spojíme několik podmínek spojkou AND, pak je výsledná podmínka platná POUZE v případě, když je platná KAŽDÁ z podmínek. V běžném životě tento operátor používáme například při následující úvaze: "Když prší A jsem venku, pak si roztáhnu deštník." nebo "Když na mě prší A mám deštník, pak si jej roztáhnu." (IF (prsi na me) AND (mam destnik) THEN roztahnu ho).
Program Operator_AND;
var a,b:integer;
begin
readln(a);
readln(b);
IF ((a<0) AND (b<0)) THEN
writeln('Cisla a a b jsou zaporna')
ELSE
writeln('Cisla a a b nejsou obe zaporna');
end.
Všimněte si, že je celá podmínka ((a<0) AND (b<0)) uzavřena v závorce - většinou to není nutné, ale v některých programovacích jazycích je povinné uzavřít jakkoli komplikovanou podmínku do závorek, tak je vhodné si na to zvyknout.
Operátor OR je analogií spojky "nebo". Pokud spojíme několik podmínek spojkou OR, pak je výsledná podmínka platná VŽDY, když je platná ALESPOŇ JEDNA z podmínek (neboli není platná pouze v případě, že neplatí žádná z podmínek). V běžném životě tento operátor používáme například při následující úvaze: "Když mám hlad nebo mě honí mlsná, pak si dám něco dobrého." nebo "Když chci být dobrý student NEBO se nudím, pak se něco učím." (IF (chci byt dobry student) OR (se nudim) THEN se ucim).
Program Operator_OR;
var a,b:integer;
begin
readln(a);
readln(b);
IF ((a>0) OR (b>0)) THEN
writeln('Alespon jedno z cisel a a b je vetsi nez nula.')
ELSE
writeln('Cisla a a b jsou obe mensi nebo rovna nule.');
end.
Výsledky AND a OR operátorů můžete vidět v následující tabulce, 1 znamená pravdu, 0 znamená nepravdu.
a | b | a AND b | a OR b |
1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 0 |
0 | 0 | 0 | 0 |
V předchozích lekcích jsme řešili výpočet jednoduchých vzorců. Některé z nich vypadaly již docela komplikovaně. Zkuste se zamyslet a napsat program pro výpočet obyčejného podílu čísel a a b.
Příklad: Výpočet podílu dvou libovolně zadaných čísel a a b.
Program Podil_A_a_B;
var a,b:integer;
begin
writeln('Zadejte číslo a:');
readln(a);
writeln('Zadejte číslo b:');
readln(b);
if (b=0) then
writeln('Dělení nulou je nedefinovaná operace, proto nelze podíl zadaných čísel spočítat.')
else
writeln('Podíl zadaných čísel je ',a/b)
readln;
end.
Jak víme z matematiky, tak dělení nulou není povolená operace. A skutečně, pokud na tento fakt zapomeneme, tak program při pokusu o dělení nulou havaruje (což je neakceptovatelný stav). Vidíme, že bez podmínky IF-THEN není ani možné korektně určit obyčejný podíl dvou libovolných čísel.
Pojďme si nyní úkol ještě nepatrně zkomplikovat tím, že budeme v předchozím programu požadovat, aby byl podíl a/b uložen v proměnné c. První, co nás asi napadne, je toto řešení:
Program Podil_A_a_B;
var a,b:integer;
c:real;
begin
writeln('Zadejte číslo a:');
readln(a);
writeln('Zadejte číslo b:');
readln(b);
if (b=0) then
writeln('Dělení nulou je nedefinovaná operace, proto nelze podíl zadaných čísel spočítat.')
else
c:=a/b;
writeln('Podíl zadaných čísel je ',c)
readln;
end.
Funguje náš program skutečně spolehlivě a dobře? Abychom to ověřili, tak se pokuste jako hodnotu b zadat nulu. Co zjistíme? Překvapivě fakt, že program poskytne výsledek! Proč? Důvod je ten, že v případě, že se b rovná nule, tak program vypíše, že dělení nulou není definovaná operace, ale stejnětak zobrazí text "Podíl..." a vypíše nějakou hodnotu.
Proč program vypíše "Podíl..."? Je to proto, že standardně se v rámci IF i ELSE podmíněně vyhodnocuje pouze JEDEN následující příkaz (v sekci IF je jen jeden a v ELSE jsou programátorem požadovány dva). V případě, že IF platí, tak se neprovede c:=a/b, protože je to ELSE instrukce. Nicméně příkaz (writeln...) se provede VŽDY, protože je to už druhý příkaz za ELSE a tím pádem už se konstrukce IF-THEN-ELSE vůbec netýká. Pokud chceme v IF nebo ELSE provést více než jeden příkaz, pak je nutno tyto příkazy uzavřít mezi begin a end, aby program věděl, kde začínají a kde končí příkazy pro platnost či neplatnost podmínky. Správné řešení tedy vypadá takto:
Program Podil_A_a_B;
var a,b:integer;
c:real;
begin
writeln('Zadejte číslo a:');
readln(a);
writeln('Zadejte číslo b:');
readln(b);
if (b=0) then
writeln('Dělení nulou je nedefinovaná operace, proto nelze podíl zadaných čísel spočítat.')
else
begin
c:=a/b;
writeln('Podíl zadaných čísel je ',c);
end;
readln;
end.
A zbývá zodpovědět otázku "Proč program vypsal jako hodnotu c nějaké číslo, když jsme do c nic nepřiřadili?". Důvod je ten, že jakmile v programu vznikne proměnná nějakého typu, pak jí program přiřadí nějakou výchozí hodnotu (tady záleží na překladači, ale například pro proměnnou typu integer to může být NAPROSTO NÁHODNÉ celé číslo - nespoléhejme na proměnné, do kterých jsme hodnotu nepřiřadili přímo my sami).
Napište program pro výpočet vzorce X=(A+B)/(C/D). Uživatel zadá na vstupu proměnné A, B, C i D.
Napište program pro výpočet odmocniny ze zadané hodnoty A.