Anti-Santa banner
Pozor! Veškerý obsah se přesouvá na www.klusik.cz

Programování v jazyce C

Začátky s programováním

Porovnáváni


Nejdříve se stručně podíváme na to, co to vlastně porovnávání je a k čemu nám slouží. Takže...

Co je to porovnávání?

Porovnávání je činnost, ve které zkoumáme hodnoty levých a pravých stran porovnávací rovnice. Stručně řečeno, pomocí logických funkcí zkoumáme obecné chování operandů. V C se používá pro porovnávání znaku "==" - dvě rovná-se za sebou. Hodnota výrazu se "převede" do logických hodnot a podle toho se program dále řídí (viz. níže zmíněné tabulky). Takže například výraz (5==5) je pravdivý, takže se mu přiřadí označení PRAVDA (true), což je v logice označeno číslicí "1". Nepravda je uložena jako "0".

a b (a==b) (ekvivalence) (a!=b) (nonekvivalence) (a&&b) (AND) (a||b) (OR) (a>b) (je vetsi) (a<b)(je mensi)
0 0 1 0 0 0 0 0
0 1 0 1 0 1 0 1
1 0 0 1 0 1 1 0
1 1 1 0 1 1 0 0

Ekvivalence

Ekvivalencí rozumíme stav, kdy se levá a pravá strana rovnají. Např. tedy pokud porovnáváme dvě stejná čísla, dostaneme pravdivou odpověď.

Logický součin

Logickým součínem rozumíme stav, kdy musí platit obě strany současně. Při vyhodnocování se jakoby ptáme: "Platí A a současně platí B?" Pokud na tuto otázku můžeme odpovědět kladně - je to pravda. Jednoduchá pomůcka: Stačí alespoň jedna nula, aby na výstupu byla nula. Všimněte si rozdílu s ekvivalencí - tam musí být obě strany stejné, zatímco tady ne. Rozebereme-li větu "Platí A a současně platí B", zjistíme proč. Ořežeme si větu na "platí a současně platí" ... a máme to :-) Máme výsledek PRAVDA a současně PRAVDA je PRAVDA. Takže 1&&1=1.

Logický součet

Logický součet se dá vyjádřit slovně jako otázka: "Platí A a nebo platí B?". Ověření můžeme udělat stejně, jako v případě součinu. "PLATI a nebo PLATI" - "PRAVDA anebo PRAVDA". Otázka je míněna ve smyslu nevylučovacím. To znamená, že stačí jedna jednička na vstupu, aby výstup byl taktéž jednička.

Cvičení

1. Nakreslete pravdivostní tabulku funkce: f=(((a||!b)&&!(a||b))||(a&&b))

Řešení:

(a+!b)&&!(a+b) a*b a+!b !(a+b) b a f
1 0 1 1 0 0 1
0 0 1 0 0 1 0
0 0 0 0 1 0 0
0 1 1 0 1 1 1


Takže tato funkce by šla snadno přepsat na ekvivalenci - zjednodušil by se tak program a provádělo by se méně porovnávání v procesoru, takže by se hodně zvedla efektivita.

2. Zjednodušte uvedené funkce na co nejjednodušší tvar:

  1. f1 = ((a||b)&&!(a||b))
  2. f2 = ((a&&b)||!(a&&b))
  3. f3 = ((((a&&!(b||c&&(d||!(e&&(a||!(b||e)&&a)||!(a&&!b)||d)&&)&&f)||b)||(a&&!b))||1)&&a)
  4. f4 = a||((!a)&&b)
  5. f5 = a&&(!a||b)
Řešení:
  1. Logický součin něčeho a negace něčeho je vždy nula, takže zjednodušeně f1 = 0 (kontradikce)
  2. Logický součet něčeho a negace něčeho je vždy jedna, takže zjednodušeně f2 = 1 (tautologie)
  3. Pokud nejste zbrklí a než začnete pracovat si pročtete celý vzorec, na konci vidíme logický součet s jedničkou, který je vždy jednička a pokud platí jednička a současně "a", je to "a". Takže f3 = a
  4. Po nakreslení pravdivostní tabulky zajisté zjistíte, že f4 = 1

    !ab b !a a f
    1 0 1 0 1
    0 0 0 1 1
    1 1 1 0 1
    1 1 0 1 1


  5. Po nakreslení pravdivostní tabulky zajisté zjistíte, že to je f5 =(a&&b)