Anglická verze
logolink

< Zpět na seznam lekcí

Podmínky - větvení programu

AlgortimyObsah lekce:

  • Co je to podmínka
  • Syntaxe příkazu IF THEN (ELSE) v jazyce Pascal
  • Jednoduché podmínky
  • Složitější podmínky a operátory AND a OR
  • Příklad pokročilejšího výpočtu matematického vzorce

Co je to podmínka

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:

  • Když prší, tak si vezmu deštník.
  • Když svítí na semaforu zelená, tak mohu jít, jinak ne.
  • Když svítí na semaforu zelená a opravdu nic nejede, tak mohu jít, jinak ne.

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.

Syntaxe příkazu IF THEN (ELSE) v jazyce Pascal

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í:

Základní syntaxe příkazu IF THEN v programovacím jazyce Pascal
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í.

Syntaxe příkazu IF THEN (ELSE) v programovacím jazyce Pascal
IF (podmínka) THEN posloupnost-příkazů-1 ELSE posloupnost-příkazů-2

Jednoduché podmínky

Ukažme si jednoduchý příklad:

IF-THEN v programovacím jazyce Pascal
 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:

IF-THEN-ELSE v programovacím jazyce Pascal
 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):

Vnořený IF-THEN v programovacím jazyce Pascal
 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.

Složitější podmínky a operátory AND a OR

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

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).

Příklad použití operátoru AND v podmínce
 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

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).

Příklad použití operátoru OR v podmínce
 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.

aba AND ba OR b
1111
1001
0100
0000

Příklad pokročilejšího výpočtu matematického vzorce

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.

Podíl dvou čísel v programovacím jazyce Pascal
 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í:

Podíl dvou čísel v programovacím jazyce Pascal
 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:

Podíl dvou čísel v programovacím jazyce Pascal
 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).

Domácí úkol

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.

Domácí úkol

Napište program pro výpočet odmocniny ze zadané hodnoty A.

Otázky

  1. Jakým způsobem lze rozvětvit program?
  2. Jaký je správný zápis podmínek IF a ELSE? Ukažte více příkladů.
  3. Je možné provést za příkazem ELSE posloupnost více dalších příkazů?
  4. Obsahuje příkaz IF nebo ELSE nějakou specialitu ohledně syntaxe?
webdesign, xhtml, css, php - Mgr. Michal Mikláš