Logické výrazy

Chování mnoha programů se odvíjí od různých vnějších podnětů -- program například uživateli položí nějaký dotaz a podle toho, jak uživatel odpoví, program pokračuje. Tomuto se říká větvení. Na této stránce si popovídáme o základním stravebním kameni větvení -- logických výrazech.

Začneme opět příkladem.

at cele $cislo = cticele ("Zadej cislo.");
pokud $cislo > 100:
    napis "Zadane cislo je vetsi nez sto.";
konec;

Program dvakrát za sebou spusť. Poprvé zadej číslo menší než 100, podruhé číslo větší než sto. Zatímco v prvním případě se nic nestane, ve druhém program zobrazí hlášku. Za vším stojí další blokový příkaz -- příkaz pokud. Jeho základní syntaxe je následující: pokud logický_výraz: tělo_příkazu konec;. Tělo příkazu se provede pouze tehdy, když je logický_výraz pravdivý.

Nejjednodušší variantou logického výrazu je porovnání dvou čísel podle velikosti. Přesněji řečeno, porovnání dvou výrazu podle velikosti jejich hodnot. Takový logický výraz má tvar aritmetický_výraz1 operátor_porovnání aritmetický_výraz2. Operátor porovnání může být =, <, >, >= (větší nebo rovno), <= (menší nebo rovno).

Logickou hodnotu můžete nechat zadat samotného uživatele. K tomu slouží logická funkce otazka. Té se předá jeden parametr -- řetězec, který se má zobrazit uživateli. Funkce zobrazí okno se dvěma tlačítky Ano a Ne. Podle toho, které z tlačítek uživatel stiskne, takovou logickou hodnotu funkce vrátí. Vše demonstruje tento příklad.

pokud otazka ("Mam neco udelat?"):
    vpred o 100;
konec;

Logické spojky

Někdy je zapotřebí, aby program provedl jistý úkon, pokud bude splněno podmínek více. Tady nám poslouží logická spojka (logický operátor) a. Logický výraz ve tvaru logický_výraz1 a logický_výraz2 je pravdivý, právě když jsou pravdivé logický_výraz1 i logický_výraz2. Následující procedura zobrazí zprávu, pouze pokud je zadané číslo z intervalu deset až dvacet včetně.

at desetinne $cislo = ctides ("Zadej nejake cislo.");
pokud $cislo >= 10 a $cislo <= 20: {musí platit jak $cislo >= 10, tak $cislo <= 20}
    napis "Cislo je ve spravnem intervalu.";
konec;

Jindy je zapotřebí, aby procedura provedla nějaké příkazy, je-li splněna alespoň jedna z několika podmínek. K tomu slouží logická spojka nebo. Logický výraz ve tvaru logický_výraz1 nebo logický_výraz2 je pravdivý, právě když je pravdivý logický_výraz1 nebo logický_výraz2, případně oba. Další ukázka procedury vypíše zprávu, pouze pokud je zadané číslo mimo intrval deset až dvacet včetně.

at desetinne $cislo = ctides ("Zadej nejake cislo");
pokud $cislo < 10 nebo $cislo > 20:
{musí platit buď $cislo >= 10, nebo $cislo <= 20, případně obě podmínky}
    napis "Cislo je ve spravnem intervalu.";
konec;

Negace

Užitečná je ještě jedna logická funkce, a to funkce ne. Bere jeden parametr, kterým je logický výraz, vrací logickou hodnotu, která je opačná. Tedy například ne (5 = 2) je pravdivý logický výraz.

Logické konstanty

Želví grafika zná dvě: ANO, která je pravdivá, a NE, která je nepravdivá. Podívej se na následující ukázku kódu. Co si myslíš, že se stane, když proceduru s takovým kódem pustíš?

pokud ne (ANO):
    vpred o 100;
konec;
pokud ne (NE):
    otoc o 90;
konec;

Želvička se otočí o 90 stupňů, tedy druhá podmínka je správná. To proto, že funkce ne zneguje logický výraz v závorce, tím je u druhé podmínky NE a jeho negací je ANO.

Složitější logické výrazy

Logické operace lze různě kombinovat a vytvářet tak poměrně komplikované logické výrazy, jako je kupříkladu (((2 >= 3) a ne (-2 = -3)) nebo (4 < 8 - 1)) a (NE nebo (4 = 2*2)).

Logické proměnné

Kromě proměnných, do nichž lze uložit číslo, existují také proměnné, do kterých můžeš přiřadit logickou hodnotu. Pracuje se s nimi úplně stejně jako s proměnnými číselnými. Následující příklad ilustruje jejich použití. Opět zobrazí hlášku, pokud je číslo z intervalu deset až dvacet včetně.

at desetinne $cislo = ctides ("Zadej nejake cislo.");
at logicka $hornimez = $cislo <= 20; {do logických proměnných uložíme údaj ano/ne}
at logicka $dolnimez = $cislo >= 10;
pokud $hornimez a $dolnimez: {a pak ho použijeme}
    napis "Spravny interval.";
konec;