$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \newcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$
Priručnik za početnike (C++) / Logički tip i logičke operacije

Logički tip i logičke operacije

  • Dozvoljeno polaganje
  • Lekcije
  • Nema
  • Koshi
  • 7/24/2015

U ovom delu upoznaćemo se sa još jednim tipom podataka koji često može da bude koristan. Pogledajmo sledeći primer.

Primer:

Imamo parče papira dimenzija visinaPapira x sirinaPapira i kovertu dimenzija visinaKoverte x sirinaKoverte. Želimo da proverimo da li bez savijanja papir može da stane u kovertu. Takođe, želimo da ivice papira budu paralelne sa ivicama koverte - nećemo da koso stavimo papir u kovertu. Učitavaju se 4 broja, dimenzije papira visinaPapira i sirinaPapira, zatim dimenzije koverte visinaKoverte i sirinaKoverte. Ispisati da li papir može da stane u kovertu.

Razmislimo malo o problemu. Da bi papir ušao u kovertu, mora visina papira da bude manja od visine koverte i širina papira da bude manja od širine koverte. Takođe, moramo da obratimo pažnju na to da papir možemo okrenuti i drugačije, tako da možemo da ga ubacimo i ako je visina papira manja od širine koverte i širina papira manja od visine koverte.

Dakle, ono što moramo da proverimo je da li je bar jedna od sledeće dve varijante tačna:

1. visinaPapira < visinaKoverte, sirinaPapira < sirinaKoverte

2. visinaPapira < sirinaKoverte, sirinaPapira < visinaKoverte

Operacije kao što su manje i veće se u jeziku C++ obeležavaju kao i obično, sa "<" i ">" (bez navodnika naravno). Ono što nam još nedostaje da bismo mogli da napravimo program koji vrši ovu proveru je da znamo kako se obeležavaju "i" i "ili".

  • "i" koristimo da proverimo da li su dve stvari obe tačne. Na primer, "x > 2 i x < 5" je tačno samo ako je x veće od 2 i manje od 5. Primer brojeva za koje je tačno su 3 i 4, a za koje je netačno su 1, 2, 5 i 6.
  • "ili" koristimo da proverimo da li je bar jedna od dve stvari tačna. Na primer, "x < 4 ili x > 7" je tačno samo ako je x manje od 4 ili veće od 7. Takođe bi bilo tačno i u slučaju da su obe stvari tačne, što se ovde nikad ne dešava. Primer brojeva za koje je tačno su 2, 3, 8 i 9, a za koje je netačno su 4, 5, 6 i 7.

"i" se obeležava sa "&&" (Shift + 7 na većini tastatura), a "ili" sa "||" (Shift + taster odmah pored ili iznad Enter-a).

Naša dva uslova možemo sada zapisati kao:

1. (visinaPapira < visinaKoverte) && (sirinaPapira < sirinaKoverte)

2. (visinaPapira < sirinaKoverte) && (sirinaPapira < visinaKoverte)

Obratite pažnju na zagrade. Njih stavljamo da bismo označili redosled kojim se stvari računaju isto kao u računskim operacijama sa brojevima. Ovde zagrade označavaju da prvo irzačunavamo da li je nešto manje od nečeg drugog, a onda proveravamo da li su oba uslova tačna izvršavanjem operacije && ("i"). Kada nema zagrada, prvo se izvršava operacija višeg prioriteta (kaže se i: starija operacija), na primer množenje se izvršava pre sabiranja. Ako stavimo zagrade, sami zadajemo redosled računanja i ne oslanjamo se na unapred zadati prioritet operacija (ne moramo čak ni da ga znamo). Takođe, zagrade čine program jasnijim, jer i onaj ko čita odmah može da vidi kojim redosledom se izvršavaju operacije.

Ceo izraz koji proverava da li je bar jedna od ove dve varijante tačna koristiće još i || ("ili"). Da vidimo kako on izgleda:

((visinaPapira < visinaKoverte) && (sirinaPapira < sirinaKoverte)) ||
((visinaPapira < sirinaKoverte) && (sirinaPapira < visinaKoverte))

Uočite da smo dodali zagrade oko obe varijante. Ovime osiguravamo da se prvo izračunaju vrednosti unutar tih zagrada (da li je svaka od varijanti moguća), a tek onda proverava da li je bar jedan od ta dva izraza tačan (da li na bilo koji način možemo staviti papir u kovertu).

Hajde da vidimo kako radi na jednom primeru. Uzmimo sledeće vrednosti:

visinaPapira = 5
sirinaPapira = 7
visinaKoverte = 9
sirinaKoverte = 6

U C++-u tačnu vrednost označavamo sa true, a netačnu sa false. Kada znamo to, koraci u računanju našeg izraza, da li papir staje u kovertu, će biti sledeći:

((5 < 9) && (7 < 6)) || ((5 < 6) && (7 < 9))
(true && false) || (true && true)
false || true
true

Evo kako to izgleda vizuelno u ovom slučaju:

 

Kod za celo rešenje zadatka će izgledati ovako:

#include <iostream>

 

using namespace std;

 

int main()

{

int visinaPapira, sirinaPapira;

cout << "Unesite visinu i sirinu papira: ";

cin >> visinaPapira >> sirinaPapira;

 

int visinaKoverte, sirinaKoverte;

cout << "Unesite visinu i sirinu koverte: ";

cin >> visinaKoverte >> sirinaKoverte;

 

cout << ((visinaPapira < visinaKoverte) && (sirinaPapira < sirinaKoverte)) || ((visinaPapira < sirinaKoverte) && (sirinaPapira < visinaKoverte));

}

Pored  && i ||, još logička operacija koja postoji u C++-u je negacija. Nju obeležavamo sa "!". Negacija nečega je tačna ako je to nešto netačno i obrnuto. Tako je, na primer, !(4 > 5) tačno jer je 4 > 5 netačno, a !(2 < 7) netačno, jer je 2 < 7 tačno.

Osim pomoću znakova < i > , brojeve možemo da poredimo i ovako:

  • a <= b znači: a je manje ili jednako b;
  • a >= b znači: a je veće ili jednako b;
  • a == b znači: a i b su jednaki;

NAPOMENA: Obrati pažnju na razliku između "=" i "==" o kojoj smo pričali u lekciji Promenljive.

  • a != b  znači: a je različito od b;

Već smo naučili da osim što možemo da računamo, u programima možemo i da pamtimo vrednosti. Vrednosti u programu se pamte tako što se upišu u promenljivoj. Da bismo pamtili logičke vrednosti, koristimo tip bool. Rekli smo da tačnu vrednost obeležavamo sa true, a netačnu sa false. Ovo su ujedno i jedine dve vrednosti koje promenljiva tipa bool može da ima.

Promenjivoj tipa bool možemo da dodelimo direktno vrednost true ili false, ili bilo koji izraz čiji je rezultat logička vrednost (tačno ili netačno). Evo nekoliko primera:

bool b = true;

b je true

bool b = 5 < 4;

b je false

bool a = 1 < 2;

bool c = 5 >= 6;

bool b = a || c;

b je true

int n = 4;

bool b = (n >= 2) && (n < 4)

b je false