Logika v C-čku alebo "je rozdiel medzi = a =="

Všetky programy, ktoré sme zatiaľ v C-čku napísali, fungovali (ak vôbec fungovali) tým spôsobom, že vykonávali jeden príkaz za druhým a tak sa postupne prepracovali od začiatku až na koniec. To je síce fajn, ale keby sa týmto spôsobom mal napríklad urobiť program, ktorý sčíta všetky čísla od 1 do 1000, tak napísať postupnosť príkazov a = 0; a = a + 1; a = a + 2; a = a + 3; ... až do 1000 by mohlo trvať dlhšie, než keby si to mal človek sčítať ručne. A keby ste mali napísať program, ktorý by sa mal najprv spýtať, kde má s tým sčítavaním prestať a až potom sčítavať, tak ten by sa týmto spôsobom nedal urobiť vôbec.0.5 Preto je dôležité beh programu nejakým spôsobom riadiť.

Každý programovací jazyk poskytuje prostriedky, ako počítaču povedať, že nejaké príkazy má vykonať len za istých okolností, že niečo má opakovať dovtedy, kým nie je splnená nejaká podmienka alebo že si má vybrať z viacerých možností, ako pokračovať v tom, čo robí. Všetky tieto veci vyžadujú, aby sa dalo zistiť, či sú splnené nejaké podmienky.

Na zápis podmienok sa v jazyku C používajú logické výrazy. (Niekedy sa nazývajú aj booleovské na pamiatku pána Boolea, ktorý ich študoval z matematického hľadiska.) Logické výrazy môžu nadobúdať dve hodnoty -- hodnotu pravda (anglicky true) a hodnotu nepravda (anglicky false). Niektoré jazyky (napr. Pascal) majú pre logické výrazy samostatný typ premenných. V C-čku sa však pre logické hodnoty používa typ int. Pričom hodnota 0 znamená "nepravda" a akákoľvek iná hodnota znamená "pravda".

Logické výrazy môžu testovať, či má alebo nemá premenná nejakú hodnotu, môžu sa v nich porovnávať hodnoty a jednoduché výrazy sa môžu spájať do zložitejších. Na porovnávanie dvoch čísel slúži operátor ==. (Tie rovnítka tam musia byť dve, pretože jedno rovnítko slúži ako príkaz priradenia.) Takže výraz cis == 7 nadobúda hodnotu "pravda", ak je v premennej cis hodnota 7 a inak nadobúda hodnotu "nepravda". Podobne sa dajú použiť znamienka >, >=, <, <=, ktoré znamenajú "väčší", "väčší alebo rovný", "menší", "menší alebo rovný". Na test, či sú dve hodnoty rôzne, sa používa operátor !=. Takže výraz 7 > a nadobúda hodnotu "pravda" len vtedy, ak je v premennej a uložená hodnota menšia ako 7 a výraz i != j nadobúda hodnotu "pravda" iba vtedy, keď sú hodnoty uložené v premenných i a j rôzne. Ako sú logické výrazy vyhodnocované uvidíte v úlohe:

Úloha č.1: Pozrite si nasledovný program a na papier si napíšte váš tip, čo bude vypisovať. Potom program skompilujte a spustite. Porovnajte si vaše tipy s realitou. Vysvetlite, prečo to píše to, čo to píše.

#include <stdio.h>

main()
{
    int i = 3, j = 4;
    
    printf("%d\n", i == 3);
    printf("%d\n", j >= 6);
    printf("%d\n", j = 5);
    printf("%d\n", i < 6);
    printf("%d\n", j == 4);
}

Niekedy je nutné v jednej podmienke otestovať viacero vecí naraz. Napríklad potrebujete zistiť, či je aj premenná i aj premenná j kladná. Každú vec zvlášť viete zistiť jednoducho (i > 0, j > 0). Oba testy je však treba nejakým sposobom spojiť. Ak chcete zistiť či sú splnené obidva naraz, použije sa operátor &&. Takže podmienka, ktorá zistí, či sú hodnoty v oboch premenných kladné sa napíše i > 0 && j > 0.0.6

Ak potrebujeme zistiť, či je splnená aspoň jedna z týchto podmienok, použijeme operáciu ||.0.7 Takže výraz i > 0 || j > 0 nadobúda hodnotu "nepravda" jedine vtedy, ak sú hodnoty oboch premenných i a j menšie alebo rovné ako nula. Stačí, keď je hodnota v jednej z premenných kladná (kľudne môžu byť aj obidve), podmienka nadobudne hodnotu "pravda".

Ak chceme hodnotu logického výrazu zmeniť na opačnú, používa sa na to operátor !.0.8 Ak napríklad chceme napísať podmienku "v premennej znak nie je veľké písmeno", (teda podmienku, ktorá nadobudne hodnotu "pravda" ak v tej premennej veľké písmeno nie je a hodnotu "nepravda" inak), budeme postupovať nasledovne: Najprv si napíšeme podmienku, ktorá nám zistí, či v premennej znak veľké písmeno je. Taká podmienka môže vyzerať napríklad takto:
znak >= 'A' && znak <= 'Z'. Táto podmienka však funguje presne naopak, než potrebujeme. Ale vďaka operátoru ! z nej vyrobíme podmienku, ktorú potrebujeme nasledovným spôsobom: !(znak >= 'A' && znak <= 'Z')

Úloha č.2: Napíšte program, ktorý načíta hodnotu do znakovej premennej zn a vypíše 1 ak je to číslica '0''9'. Inak vypíše 0.

Úloha č.3: Vymyslite podmienku, ktorá nadobudne hodnotu "pravda" buď vtedy, keď je v premennej i hodnota 0 alebo vtedy, keď je tam hodnota 1. Inokedy nadobudne hodnotu "nepravda". Vyskúšajte v programe.

Úloha č.4: Vymyslite a oskúšajte podmienku, ktorá otestuje, či je hodnota v premennej i párna. (Pomôcka: zvyšok po delení sa v C-čku ráta s pomocou operátora %. Takže napr. 8 % 3 je 2 a 9 % 3 je 0.)

Anino Belan 2003-10-26