Logički izrazi                                 

                                   Logički izrazi u C++

        Ono što smo naučili do sada, nam u procesu programiranja ne omogućuje puno. Naime sad smo u stanju pisati programe koji se izvršavaju uvijek na isti način, tj. u programu nema nekog odlučivanja. Upravo te odluke i neki drugi mehanizmi su ono što programiranje, tj. programe koji tako nastaju , čini korisnim. Npr. kada se trebate prijaviti na operativni sistem(OS) pod nekim korisničkim imenom, OS provjerava da li ste unijeli za to korisničko ime ispravnu lozinku, i tek nakon ispravne lozinke vam dozvoljava da radite sa računarem. Dakle OS mora donijeti neku odluku. Većina odluka, grananja i petlji u svakom programskom jeziku je kontrolisana logičkim izrazima. To su izrazi za koje se može uvijek utvrditi da li su tačni ili netačni. U matematici smo ovo zvali iskaz ili sud. Vjerovatno najjedenostavniji logički izrazi su oni koji upoređuju neke veličine sa nekim od operatora za upoređivanje. Ti operatori su nam poznati iz matematike(matematičke relacije)...

 

 

Relacijski

operator

 

 

Matematički

simbol

 

 

Ime operatora

 

Primjer

 

Vrijednost

biti veći

7>5

tačno

biti manji

4<3

netačno

>=

biti veći ili jednak

5>=5

tačno

<=

biti manji ili jednak

3<=2

netačno

==

=

biti jednak

2=4

netačno

!=

       ≠

biti različit

3!=5

tačno

            

            Važno: Operatori koji se sastoje od dva simbola, nemaju između njih blanko znak!

Dakle, ovaj koncept tačnog(eng. true) i netačnog(eng. false) je na ovakvim primjerima dosta lako razumjeti. Logički izrazi mogu biti i dosta složeniji, a osnovni način kako pravimo složene logičke izraze,jeste udruživanjem jednostavnih izraza(kao što su oni gore) putem binarnih logičkih operatora i i ili.Postoji i unarni logički operator ne koji djeluje na jedan iskaz, za razliku od prva dva koji udružuju dva iskaza(otuda se prva dva zovu binarni). Dakle sad nam se učenje matematike itekako isplati, jer je ovo sve viđeno! Ipak za one koji sve ovo vide prvi put, ili barem tako tvrde, daćemo tabele sa pravilima koja vrijede za ova tri logička operatora.

       Napomena:tačno ili istinito(T) je ovdje označeno sa 1, a netačno ili neistinito sa 0. Na to se treba priviknuti jer i C++ tako predstavlja logičke vrijednosti true i false.

   

 

Logički

operator

 

Mat.

simbol

 

Operator

 

 

 

Operacija

bos

eng

&&

 

^

I

AND

konjukcija

II

v

ILI

OR

disjunkcija

!

NE

NOT

negacija

 

 

 

 

 

 

 

 

 

 

 

p

q

p&&q

0

0

0

0

1

0

1

0

0

1

1

1

 

p

q

pIIq

0

0

0

0

1

1

1

0

1

1

1

1

 

p

p!

0

1

1

0

         

 

 

                 

 

    

Prilikom određivanja istinitosti nekog složenog iskaza, vodimo računa da je redosljed izvršavanja logičkih operacija:negacija, konjunkcija i disjunkcija. Jedino što može promijeniti ovaj redosljed su stare  dobre zagrade!

Odredi istinitost navedenih logičkih izraza:

izraz

vrijednost

objašnjenje

!( true || false )

0

!( true ) → !true → false!

!( 1 || 1 && 0 )

0

!( 1 || 0 ) → !( 1) → 0

!( ( 1 || 0 ) && 0 )

1

!( ( 1 ) && 0 ) → !( 1 && 0 ) → !( 0 ) → !0 → 1

 

Sad kad znamo sve o logičkim izrazima, idemo naučiti kako neku izjavu unutar programa izvršiti samo pod određenim uslovom. Za to nam služi kontrolna struktura if, koja u C++ izgleda ovako:

if (x>100)

cout<<"broj je veci od 100";

x++;

Izjava koja štampa rečenicu će se izvršiti samo ako je logički izraz unutar zagrade tačan. Dakle ako x ima vrijednost 5,rečenica se neće štampati, dok za vrijednost 101 hoće.

Ono što je važno zapamtiti jeste da if izjava kontroliše izvršavanje samo prve izjave koja se nalazi neposredno iza nje. To može biti nekad problem, jer postoje situacije gdje želimo da if izjava kontroliše dvije, tri ili više izjava. U tom slučaju sve izjave koje želimo da budu pod kontrolom if izjave treba staviti u vitičaste zagrade. Na taj način tvorimo nešto što se naziva blok izjava.

if (x >100 && x%2==0){

cout<<"broj je veci od 100 i paran\n";

x=x/2;

} cout<<x;

Ovdje if izjava kontroliše dvije izjave koje se nalaze u vitičastoj zagradi. Ako x ima vrijednost 43, na ekranu će biti štampano 43. Ako je x postavljeno na 101 na ekranu će biti štampano 101, dok će za vrijednost 102 štampati:

broj je veći od 100 i paran

51.

Važno:Vrlo često se dešava da neiskusni programeri umjesto operatora == zabunom koriste operator = unutar if izjave, kao npr.

if(x=10)

cout<<"x je 10";

Već je napomenuto kako C++ true predstavlja sa 1 a false sa 0. U stvari C++ će bilo koju vrijednost različitu od 0 pretvoriti u true, dok 0 pretvara u false. Mi znamo da izjava x = 10 pored toga što x dodjeljuje vrijednost 10, isto tako i vraća vrijednost. To je najočitije u izjavi y=x=5, koja obe varijable postavlja na 5. Vrijednost koju naša izjava vraća je 10, pa C++ to pretvara u true, što znači da će se rečenica x je 10 uvijek štampati, bez obzira kolika je vrijednost x bila prije if izjave.

Važno: Ne stavljajte iza if izjave tačku zarez. Ako ovo uradite onda se dešava potpuno neželjen efekat.Naime kako kompajler zna da iza if izjave ne ide tačkazarez,

on misli da taj tačka zarez u stvari pripada izjavi koja se izvršava u if dijelu. Kako između if izjave i tog tačka zareza nema ništa, kompajler u if dijelu izvršava praznu izjavu tj. ne čini ništa! To je ilustrirano u donjem primjeru.

 

if (x==5);

cout<<”broj je 5”;

 

kompajler vidi kao

if (x==5)

;

cout<<”broj je 5”;

 

Gornji dio koda će uvijek štampati broj je 5 jer izjava cout<<”broj je 5”; uopšte nije dio if izjave!!!

Kada C++ vrši procjenu da li je neka složeni logički izraz tačan ili netačan, on to radi dosta efikasno.Tako npr. ako je logički izraz koji procjenjuje disjunkcija dva jednostavnija izraza, a prvi izraz koji ulazi u disjunkciju je tačan, onda drugi izraz koji ulazi u disjunkciju neće biti ni provjeravan. Zašto bi ga i provjeravao kad će disjunkcija bez obzira na vrijednost drugog iskaza ionako biti tačna? Ipak tvorci

drugih programskih jezika nisu vodili računima o ovakvim sitnim detaljima, detaljima koji C++ čine jako efikasnim programskim jezikom.

 

1. Da li će sljedeći kod proizvesti dijeljenje sa nulom, što će srušiti program?

j=-1;

if ((j>0)&&(1/(j+1)>10))

cout<<i<<endl;

2. Da li je sljedeći logički izraz tačan ili netačan?

!( ( false || 100 ) && !0 )


3. Napišite program koji će računati obim i površinu kvadrata, samo ako je zadana stranica kvadrata pozitivna.