Više o Roster Softu
Sve usluge
Sva gotova rešenja
Svi članci

24. Logički operatori u C++ (&&, ||, !)

U prethodnoj lekciji naučili smo kako da koristimo operatore poređenja u C++ jeziku. Sada znamo da proverimo da li su dva broja jednaka, da li je jedan veći od drugog i da li neka vrednost zadovoljava određeni uslov. Međutim, u stvarnom programiranju jedan uslov često nije dovoljan. Zamislimo nekoliko svakodnevnih situacija: Student može da položi […]

Mala škola C++Lekcija 24 od 30
U prethodnoj lekciji naučili smo kako da koristimo operatore poređenja u C++ jeziku. Sada znamo da proverimo da li su dva broja jednaka, da li je jedan veći od drugog i da li neka vrednost zadovoljava određeni uslov. Međutim, u stvarnom programiranju jedan uslov često nije dovoljan. Zamislimo nekoliko svakodnevnih situacija:
  • Student može da položi ispit ako ima najmanje 51 poen i ispunio je obavezne predispitne aktivnosti.
  • Korisnik može da dobije popust ako je član kluba ili ima promotivni kupon.
  • Bankomat dozvoljava isplatu ako je kartica aktivna i na računu ima dovoljno novca.
  • Aplikacija prikazuje upozorenje ako korisnik nije prijavljen.
  • Internet prodavnica dozvoljava kupovinu ako je proizvod dostupan i kupac ima dovoljno sredstava.
U svim ovim primerima potrebno je kombinovati više uslova ili promeniti logičko značenje jednog uslova. Upravo za to služe logički operatori. Oni su jedan od temelja programiranja jer omogućavaju donošenje složenijih odluka, kontrolu toka programa, validaciju korisničkog unosa i izvršavanje različitih algoritama. U ovoj lekciji detaljno ćemo naučiti kako funkcionišu logički operatori &&, || i !, kako se kombinuju sa operatorima poređenja i kako se koriste u tipičnim fakultetskim zadacima.

Šta ćemo naučiti u ovoj lekciji?

Nakon završetka lekcije znaćete da:
  • Objasnite šta su logički operatori.
  • Razlikujete logičko I, ILI i NE.
  • Koristite operatore &&, || i !.
  • Razumete logičke tabele istinitosti.
  • Kombinujete više uslova u jednom izrazu.
  • Razumete redosled izvršavanja logičkih operatora.
  • Objasnite kratkospojno izvršavanje (short-circuit evaluation).
  • Pravilno proveravate intervale i složene uslove.
  • Prepoznate najčešće logičke greške.
  • Samostalno rešavate praktične i ispitne zadatke.

1. Šta su logički operatori?

Logički operatori omogućavaju povezivanje ili negiranje logičkih izraza. Podsetimo se da operatori poređenja vraćaju vrednosti tipa bool:
true
false
Na primer:
int godine = 20;

bool punoletan = (godine >= 18);
Promenljiva punoletan ima vrednost true. Ali šta ako želimo da proverimo da li osoba ima najmanje 18 godina i poseduje važeću dozvolu? Tada imamo dva uslova:
godine >= 18
i
imaDozvolu == true
Potrebno je da oba budu ispunjena. Zato koristimo logički operator &&.
bool dozvoljeno = (godine >= 18 && imaDozvolu);
Rezultat će biti true samo ako su oba uslova tačna. Logički operatori omogućavaju nam da jednostavne provere pretvorimo u složenija pravila odlučivanja.
Logički operatori AND, OR i NOT u C++

2. Osnovni logički operatori u C++

C++ koristi tri osnovna logička operatora.
Operator Naziv Značenje
&& Logičko I (AND) Oba uslova moraju biti tačna
|| Logičko ILI (OR) Najmanje jedan uslov mora biti tačan
! Logičko NE (NOT) Obrće logičku vrednost
Primeri:
(a > 5 && b < 10)
Proverava da li su oba uslova tačna.
(a > 5 || b < 10)
Proverava da li je najmanje jedan uslov tačan.
!(a > 5)
Proverava da li uslov a > 5 nije tačan. Svaki od ovih operatora ima svoju ulogu, pa ćemo ih proučiti pojedinačno.

3. Logički operator I (&&)

Operator && predstavlja logičko I. Njegovo osnovno pravilo glasi: Rezultat je true samo kada su oba uslova true. Pogledajmo tabelu istinitosti.
Uslov A Uslov B A && B
false false false
false true false
true false false
true true true
Iz tabele vidimo da postoji samo jedna kombinacija koja daje tačan rezultat.

Jednostavan primer

#include <iostream>
using namespace std;

int main() {
    int godine = 22;
    bool imaDozvolu = true;

    bool mozeDaVozi = (godine >= 18 && imaDozvolu);

    cout << boolalpha;
    cout << "Moze da vozi: " << mozeDaVozi;

    return 0;
}
Rezultat:
Moze da vozi: true
Zašto? Prvi uslov:
godine >= 18
je true. Drugi uslov:
imaDozvolu
takođe je true. Pošto su oba uslova tačna, konačan rezultat je true. Ako promenimo:
bool imaDozvolu = false;
rezultat postaje:
Moze da vozi: false
Iako osoba ispunjava prvi uslov, drugi nije ispunjen.

Praktičan primer — polaganje ispita

Pretpostavimo da student može da položi ispit ako ima najmanje 51 poen i završene obavezne vežbe.
#include <iostream>
using namespace std;

int main() {
    int poeni = 75;
    bool zavrseneVezbe = true;

    bool polozio = (poeni >= 51 && zavrseneVezbe);

    cout << boolalpha;
    cout << "Student je polozio: " << polozio;

    return 0;
}
Rezultat:
Student je polozio: true
Ako student ima 90 poena, ali nije završio obavezne vežbe, rezultat će biti false. Ovakva logika koristi se u studentskim informacionim sistemima, poslovnim aplikacijama i sistemima za proveru različitih uslova.
Logički operator AND i tabela istinitosti u C++

4. Logički operator ILI (||)

Operator || predstavlja logičko ILI. Njegovo osnovno pravilo glasi: Rezultat je true ako je najmanje jedan uslov tačan. Tabela istinitosti:
Uslov A Uslov B A || B
false false false
false true true
true false true
true true true
Za razliku od operatora &&, ovde nije neophodno da oba uslova budu tačna. Dovoljno je da jedan bude ispunjen.

Primer — popust u prodavnici

Pretpostavimo da kupac ostvaruje popust ako ima člansku karticu ili promotivni kupon.
#include <iostream>
using namespace std;

int main() {
    bool imaKarticu = false;
    bool imaKupon = true;

    bool pravoNaPopust = (imaKarticu || imaKupon);

    cout << boolalpha;
    cout << "Pravo na popust: " << pravoNaPopust;

    return 0;
}
Rezultat:
Pravo na popust: true
Kupac nema člansku karticu, ali ima promotivni kupon. To je dovoljno da uslov bude ispunjen.

Primer — besplatan ulaz

Zamislimo da je ulaz na događaj besplatan za decu mlađu od 7 godina ili za osobe koje imaju najmanje 65 godina.
#include <iostream>
using namespace std;

int main() {
    int godine;

    cout << "Unesite broj godina: ";
    cin >> godine;

    if (godine < 0) {
        cout << "Neispravan unos godina.";
        return 1;
    }

    bool besplatanUlaz = (godine < 7 || godine >= 65);

    cout << boolalpha;
    cout << "Besplatan ulaz: " << besplatanUlaz;

    return 0;
}
Primer:
Unesite broj godina: 68
Besplatan ulaz: true
Za osobu koja ima 30 godina rezultat je false. Važno je zapamtiti da operator || predstavlja uključivo ILI: rezultat je tačan i kada su oba uslova tačna.

5. Logički operator NE (!)

Operator ! predstavlja logičko NE. Za razliku od prethodna dva operatora, on se primenjuje na jedan operand. Njegova uloga je da obrne logičku vrednost. Tabela istinitosti:
Uslov A !A
true false
false true
Primer:
bool aktivan = true;

cout << boolalpha << !aktivan;
Rezultat:
false

Primer — korisnik nije prijavljen

#include <iostream>
using namespace std;

int main() {
    bool prijavljen = false;

    if (!prijavljen) {
        cout << "Morate se prijaviti na sistem.";
    }

    return 0;
}
Rezultat:
Morate se prijaviti na sistem.
Izraz:
!prijavljen
znači: „Korisnik nije prijavljen.“

Primer — proizvod nije dostupan

bool dostupan = false;

if (!dostupan) {
    cout << "Proizvod trenutno nije dostupan.";
}
Operator ! često čini kod jednostavnijim i razumljivijim. Umesto:
if (dostupan == false)
možemo napisati:
if (!dostupan)
Oba izraza proveravaju isti uslov.
Logički operator NOT u C++

6. Razlika između operatora && i ||

Početnici često mešaju logičko I i logičko ILI. Razlika je jednostavna, ali veoma važna. Zamislimo da korisnik želi da kupi proizvod. Za uspešnu kupovinu moraju biti ispunjena dva uslova:
  • Proizvod mora biti na stanju.
  • Kupac mora imati dovoljno novca.
Koristimo:
bool kupovina = (imaNaStanju && imaNovca);
Oba uslova su obavezna. Sada zamislimo da kupac ostvaruje popust ako ima člansku karticu ili kupon.
bool popust = (imaKarticu || imaKupon);
Dovoljan je jedan uslov. Pogledajmo direktno poređenje:
A B A && B A || B
false false false false
false true false true
true false false true
true true true true
Ovu tabelu treba dobro razumeti jer se logički operatori koriste u gotovo svakom složenijem programu.

7. Kombinovanje logičkih operatora

U stvarnim programima često imamo više od dva uslova. Zamislimo da korisnik može da pristupi sistemu ako:
  • Ima najmanje 18 godina.
  • Ima aktivan nalog.
  • Nalog nije blokiran.
Ove uslove možemo povezati:
bool dozvoljenPristup =
    (godine >= 18 && aktivanNalog && !blokiran);

Kompletan primer

#include <iostream>
using namespace std;

int main() {
    int godine = 25;
    bool aktivanNalog = true;
    bool blokiran = false;

    bool dozvoljenPristup =
        (godine >= 18 && aktivanNalog && !blokiran);

    cout << boolalpha;
    cout << "Pristup dozvoljen: " << dozvoljenPristup;

    return 0;
}
Rezultat:
Pristup dozvoljen: true
Program proverava tri uslova. Ako samo jedan od njih nije ispunjen, pristup nije dozvoljen.

Složeniji primer — popust u internet prodavnici

Pretpostavimo da kupac dobija popust ako: – Ima člansku karticu i potrošio je najmanje 5.000 dinara. Ili – Poseduje promotivni kupon.
#include <iostream>
using namespace std;

int main() {
    bool imaKarticu = true;
    bool imaKupon = false;
    double iznosKupovine = 6500.0;

    bool popust =
        ((imaKarticu && iznosKupovine >= 5000.0)
         || imaKupon);

    cout << boolalpha;
    cout << "Kupac ostvaruje popust: " << popust;

    return 0;
}
Rezultat:
Kupac ostvaruje popust: true
Ovaj primer pokazuje koliko je važno pravilno grupisati uslove.

8. Prioritet logičkih operatora

Kada kombinujemo više operatora, moramo razumeti redosled njihovog izvršavanja. Među osnovnim logičkim operatorima prioritet je:
  1. ! — logičko NE.
  2. && — logičko I.
  3. || — logičko ILI.
Operatori poređenja, kao što su <, >, == i !=, imaju veći prioritet od ovih logičkih operatora. Primer:
bool rezultat = true || false && false;
Prvo se izračunava:
false && false
Rezultat je false. Zatim:
true || false
Konačan rezultat je true. Ako želimo drugačiji redosled, koristimo zagrade.
bool rezultat = (true || false) && false;
Sada je rezultat false. Preporuka: Kada pišete složenije logičke izraze, koristite zagrade da biste jasno prikazali nameravanu logiku, čak i kada poznajete prioritet operatora.
Prioritet logičkih operatora u C++

9. Kratkospojno izvršavanje — short-circuit evaluation

Ovo je veoma važna osobina logičkih operatora && i ||. C++ ne mora uvek da izračuna oba uslova. Ponekad je rezultat poznat već nakon prvog uslova.

Kako radi operator &&?

Pogledajmo:
false && nekiUslov
Pošto prvi uslov nije tačan, celokupan izraz ne može biti true. Zato C++ neće izračunavati drugi operand. Primer:
#include <iostream>
using namespace std;

int main() {
    int broj = 0;

    if (broj != 0 && 10 / broj > 2) {
        cout << "Uslov je ispunjen.";
    }
    else {
        cout << "Uslov nije ispunjen.";
    }

    return 0;
}
Rezultat:
Uslov nije ispunjen.
Prvi uslov:
broj != 0
ima vrednost false. Zbog toga se drugi deo:
10 / broj > 2
uopšte ne izvršava. Ovo je posebno važno jer bi celobrojno deljenje nulom predstavljalo nedefinisano ponašanje.

Kako radi operator ||?

Kod operatora ||, ako je prvi uslov true, drugi nije potrebno proveravati. Primer:
#include <iostream>
using namespace std;

int main() {
    bool administrator = true;
    bool aktivnaPretplata = false;

    if (administrator || aktivnaPretplata) {
        cout << "Pristup je dozvoljen.";
    }

    return 0;
}
Rezultat:
Pristup je dozvoljen.
Pošto je prvi uslov true, drugi se ne izračunava. Kratkospojno izvršavanje pomaže u bezbednijem pisanju uslova i izbegavanju nepotrebnih operacija.

10. Provera da li je broj u određenom intervalu

Ovo je jedan od najčešćih zadataka na početnim ispitima iz programiranja. Pretpostavimo da želimo da proverimo da li se broj nalazi između 10 i 20, uključujući obe granice. Matematički pišemo:
[ 10 leq x leq 20 ]
Ali u C++ ne treba pisati:
10 <= x <= 20
Takav izraz ne proverava interval na očekivani način. Ispravno je:
x >= 10 && x <= 20

Kompletan program

#include <iostream>
using namespace std;

int main() {
    int broj;

    cout << "Unesite broj: ";
    cin >> broj;

    bool uIntervalu = (broj >= 10 && broj <= 20);

    cout << boolalpha;
    cout << "Broj je u intervalu: " << uIntervalu;

    return 0;
}
Primer:
Unesite broj: 15
Broj je u intervalu: true
Za broj 25 rezultat je false.

Provera da broj nije u intervalu

Ako želimo da proverimo da li je broj izvan intervala od 10 do 20, možemo napisati:
broj < 10 || broj > 20
Ili:
!(broj >= 10 && broj <= 20)
Oba izraza imaju isto logičko značenje.

11. De Morganova pravila

De Morganova pravila omogućavaju da pravilno negiramo složene logičke izraze. To je važna tema za razumevanje uslova i čest deo teorijskih zadataka. Prvo pravilo:
[ neg(A land B) = neg A lor neg B ]
U C++:
!(A && B)
ekvivalentno je:
!A || !B
Drugo pravilo:
[ neg(A lor B) = neg A land neg B ]
U C++:
!(A || B)
ekvivalentno je:
!A && !B

Praktičan primer

Pretpostavimo da korisnik mora biti punoletan i imati aktivan nalog.
bool dozvoljeno = (punoletan && aktivanNalog);
Ako želimo da proverimo kada pristup nije dozvoljen:
bool zabranjeno = !(punoletan && aktivanNalog);
Prema De Morganovom pravilu, to je isto što i:
bool zabranjeno = (!punoletan || !aktivanNalog);
Pristup je zabranjen ako korisnik nije punoletan ili nalog nije aktivan.
De Morganova pravila u C++

12. Logički operatori i numeričke vrednosti

U C++ jeziku numeričke vrednosti mogu se pretvoriti u logičke. Osnovno pravilo je:
  • Nula se pretvara u false.
  • Svaka nenulta numerička vrednost pretvara se u true.
Primer:
#include <iostream>
using namespace std;

int main() {
    bool a = 0;
    bool b = 1;
    bool c = 25;
    bool d = -7;

    cout << boolalpha;

    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
    cout << d << endl;

    return 0;
}
Rezultat:
false
true
true
true
Zato je moguće napisati:
if (broj) {
    cout << "Broj nije nula.";
}
Međutim, početnicima je često jasnije da napišu:
if (broj != 0) {
    cout << "Broj nije nula.";
}
Druga varijanta direktno pokazuje šta program proverava.

13. Tipični fakultetski zadaci

Sada ćemo rešiti nekoliko zadataka koji kombinuju logičke operatore i operatore poređenja.

Zadatak 1 — Da li je broj pozitivan i paran?

Napisati program koji učitava ceo broj i proverava da li je istovremeno pozitivan i paran.
#include <iostream>
using namespace std;

int main() {
    int broj;

    cout << "Unesite broj: ";
    cin >> broj;

    bool pozitivanIParan =
        (broj > 0 && broj % 2 == 0);

    cout << boolalpha;
    cout << "Pozitivan i paran: "
         << pozitivanIParan;

    return 0;
}
Primer:
Unesite broj: 24
Pozitivan i paran: true
Za broj -8 rezultat je false, iako je broj paran, jer nije pozitivan.

Zadatak 2 — Deljivost sa 3 ili 5

Napisati program koji proverava da li je broj deljiv sa 3 ili sa 5.
#include <iostream>
using namespace std;

int main() {
    int broj;

    cout << "Unesite broj: ";
    cin >> broj;

    bool deljiv = (broj % 3 == 0 || broj % 5 == 0);

    cout << boolalpha;
    cout << "Deljiv sa 3 ili 5: " << deljiv;

    return 0;
}
Za broj 9 rezultat je true. Za broj 10 rezultat je true. Za broj 15 rezultat je takođe true, jer je deljiv sa oba broja. Za broj 7 rezultat je false.

Zadatak 3 — Provera ocene

Napisati program koji proverava da li je uneta ocena u dozvoljenom opsegu od 5 do 10.
#include <iostream>
using namespace std;

int main() {
    int ocena;

    cout << "Unesite ocenu: ";
    cin >> ocena;

    bool ispravnaOcena =
        (ocena >= 5 && ocena <= 10);

    cout << boolalpha;
    cout << "Ispravna ocena: " << ispravnaOcena;

    return 0;
}

Zadatak 4 — Provera pristupa sistemu

Korisnik može da pristupi sistemu ako je administrator ili ima aktivnu pretplatu, ali njegov nalog ne sme biti blokiran.
#include <iostream>
using namespace std;

int main() {
    bool administrator = false;
    bool aktivnaPretplata = true;
    bool blokiran = false;

    bool pristup =
        (administrator || aktivnaPretplata) && !blokiran;

    cout << boolalpha;
    cout << "Pristup dozvoljen: " << pristup;

    return 0;
}
Rezultat:
Pristup dozvoljen: true
Obratite pažnju na zagrade. Korisnik mora imati jedno od dva prava pristupa, a zabrana blokiranog naloga važi za oba slučaja.

Zadatak 5 — Prestupna godina

Godina je prestupna ako je deljiva sa 400 ili ako je deljiva sa 4, ali nije deljiva sa 100.
#include <iostream>
using namespace std;

int main() {
    int godina;

    cout << "Unesite godinu: ";
    cin >> godina;

    if (!cin || godina <= 0) {
        cout << "Unesite ispravnu pozitivnu godinu.";
        return 1;
    }

    bool prestupna =
        (godina % 400 == 0) ||
        (godina % 4 == 0 && godina % 100 != 0);

    cout << boolalpha;
    cout << "Prestupna godina: " << prestupna;

    return 0;
}
Primeri:
Godina Prestupna?
2024 true
2025 false
1900 false
2000 true
Ovo je klasičan zadatak koji proverava razumevanje kombinovanja &&, ||, != i modulo operatora.
C++ program za proveru prestupne godine

14. Najčešće greške početnika

Greška 1 — Korišćenje jednog & umesto &&

Pogrešno za logičko povezivanje:
if (a > 0 & b > 0)
Operator & predstavlja bitovski AND, dok je && logički AND. Iako prvi izraz u ovom primeru može dati isti logički rezultat, operatori nemaju istu semantiku, prioritet niti pravila kratkospojnog izvršavanja. Ispravno:
if (a > 0 && b > 0)

Greška 2 — Korišćenje jednog | umesto ||

Za logičko ILI koristimo:
if (a > 0 || b > 0)
Operator | je bitovski OR, a ne logički OR.

Greška 3 — Pogrešna provera intervala

Pogrešno:
if (10 < broj < 20)
Ispravno:
if (broj > 10 && broj < 20)

Greška 4 — Mešanje AND i OR

Ako kupac mora imati novca i proizvod mora biti na stanju, pogrešno je:
if (imaNovca || imaNaStanju)
Ispravno:
if (imaNovca && imaNaStanju)

Greška 5 — Zaboravljanje zagrada

Pogledajmo:
bool pristup =
    administrator || korisnik && aktivanNalog;
Pošto && ima veći prioritet od ||, ovaj izraz znači:
administrator || (korisnik && aktivanNalog)
Ako želimo da aktivan nalog bude obavezan za obe uloge, treba napisati:
bool pristup =
    (administrator || korisnik) && aktivanNalog;

Greška 6 — Pogrešna negacija

Pogrešno:
!a == b
ako nam je namera da proverimo da li a nije jednako b. Ispravno:
a != b
Operator ! ima drugačiju ulogu od operatora !=.

Greška 7 — Nepotrebno poređenje bool promenljivih

Ovo je ispravno:
if (aktivan == true)
Ali jednostavnije je:
if (aktivan)
Isto tako:
if (!aktivan)
je čitljivije od:
if (aktivan == false)

15. Praktični projekat — sistem za odobravanje kupovine

Za kraj praktičnog dela napravićemo program koji simulira proveru kupovine u internet prodavnici. Program treba da proveri:
  1. Da li je tražena količina pozitivna.
  2. Da li je cena proizvoda veća od nule.
  3. Da li na stanju postoji dovoljno proizvoda.
  4. Da li kupac ima dovoljno novca.
  5. Da li je kupac verifikovan.
  6. Da li kupac ima pravo na popust.
Popust se odobrava ako kupac ima člansku karticu ili promotivni kupon.
#include <iostream>
#include <string>
using namespace std;

int main() {
    string proizvod;
    int kolicina;
    int stanje;

    double cena;
    double novac;

    bool verifikovan;
    bool imaKarticu;
    bool imaKupon;

    cout << "Naziv proizvoda: ";
    getline(cin, proizvod);

    cout << "Cena proizvoda: ";
    cin >> cena;

    cout << "Zeljena kolicina: ";
    cin >> kolicina;

    cout << "Stanje na lageru: ";
    cin >> stanje;

    cout << "Raspoloziv novac: ";
    cin >> novac;

    cout << "Verifikovan kupac (1/0): ";
    cin >> verifikovan;

    cout << "Clanska kartica (1/0): ";
    cin >> imaKarticu;

    cout << "Promotivni kupon (1/0): ";
    cin >> imaKupon;

    if (!cin) {
        cout << "Greska pri unosu podataka.";
        return 1;
    }

    bool ispravniPodaci =
        (cena > 0 && kolicina > 0 &&
         stanje >= 0 && novac >= 0);

    if (!ispravniPodaci) {
        cout << "Neispravni podaci o kupovini.";
        return 1;
    }

    double ukupno = cena * kolicina;

    bool imaNaStanju = (stanje >= kolicina);
    bool dovoljnoNovca = (novac >= ukupno);

    bool pravoNaPopust =
        (imaKarticu || imaKupon);

    bool kupovinaDozvoljena =
        (imaNaStanju &&
         dovoljnoNovca &&
         verifikovan);

    cout << boolalpha;

    cout << "n--- PROVERA KUPOVINE ---n";
    cout << "Proizvod: " << proizvod << endl;
    cout << "Ukupna cena: " << ukupno << endl;

    cout << "Dovoljno na stanju: "
         << imaNaStanju << endl;

    cout << "Dovoljno novca: "
         << dovoljnoNovca << endl;

    cout << "Kupac verifikovan: "
         << verifikovan << endl;

    cout << "Pravo na popust: "
         << pravoNaPopust << endl;

    cout << "Kupovina dozvoljena: "
         << kupovinaDozvoljena << endl;

    return 0;
}
Primer izvršavanja:
Naziv proizvoda: Tastatura
Cena proizvoda: 2500
Zeljena kolicina: 2
Stanje na lageru: 10
Raspoloziv novac: 7000
Verifikovan kupac (1/0): 1
Clanska kartica (1/0): 1
Promotivni kupon (1/0): 0

--- PROVERA KUPOVINE ---
Proizvod: Tastatura
Ukupna cena: 5000
Dovoljno na stanju: true
Dovoljno novca: true
Kupac verifikovan: true
Pravo na popust: true
Kupovina dozvoljena: true
U ovom primeru popust se samo proverava, ali se ne obračunava. To može biti dodatni zadatak za vežbu. Za jednostavnost koristimo double za cene. U stvarnim finansijskim aplikacijama treba koristiti prikladan decimalni tip ili iznose izražene u najmanjim novčanim jedinicama, uz precizno definisana pravila zaokruživanja.

16. Gde se logički operatori koriste u stvarnim aplikacijama?

Logički operatori su neophodni u gotovo svim oblastima softverskog razvoja. Bankarski sistemi
bool isplata =
    (karticaAktivna && stanje >= iznos);
Isplata je moguća ako je kartica aktivna i postoji dovoljno sredstava. Internet prodavnice
bool popust =
    (vipKupac || imaKupon);
Kupac dobija popust ako ispunjava najmanje jedan uslov. Sistemi za prijavu korisnika
bool pristup =
    (ispravnaLozinka && !blokiranNalog);
Školski informacioni sistemi
bool polozio =
    (poeni >= 51 && zavrseneVezbe);
Sistemi za kontrolu temperature
bool alarm =
    (temperatura < minimum ||
     temperatura > maksimum);
Alarm se aktivira ako temperatura izađe iz dozvoljenog opsega. Video-igre
bool igraGotova =
    (zivoti == 0 || vremeIsteklo);
Igra se završava ako igrač ostane bez života ili vreme istekne.

17. Zaključak

U ovoj lekciji naučili smo kako se više uslova kombinuje u jedan logički izraz. Upoznali smo tri osnovna operatora:
Operator Naziv Kada je rezultat true?
&& Logičko I Kada su oba uslova tačna
|| Logičko ILI Kada je najmanje jedan uslov tačan
! Logičko NE Kada je operand netačan
Naučili smo i da:
  • Logički operatori vraćaju rezultat tipa bool.
  • && i || koriste kratkospojno izvršavanje.
  • Zagrade pomažu da složeni uslovi budu jasniji.
  • De Morganova pravila omogućavaju pravilnu negaciju složenih izraza.
  • Logički operatori se često kombinuju sa operatorima poređenja i aritmetičkim operatorima.
Najvažnije pravilo: pre nego što napišete složen logički izraz, jasno odredite koji uslovi moraju biti ispunjeni zajedno, a koji predstavljaju alternativne mogućnosti. Dobro razumevanje logičkih operatora predstavlja neophodnu osnovu za uslovne naredbe, petlje, funkcije, algoritme i razvoj ozbiljnih aplikacija.

18. Mini-test — proverite svoje znanje

Pokušajte da odgovorite na sledeća pitanja bez pokretanja programa. Pitanje 1. Šta predstavlja operator &&? a) Logičko ILI b) Logičko I c) Logičko NE Pitanje 2. Šta će ispisati sledeći kod?
cout << boolalpha << (true && false);
a) true b) false c) Grešku Pitanje 3. Koji operator daje true ako je najmanje jedan uslov tačan? a) && b) || c) ! Pitanje 4. Šta će ispisati program?
bool aktivan = false;

cout << boolalpha << !aktivan;
a) true b) false c) 0 Pitanje 5. Koji izraz pravilno proverava da li je broj između 10 i 20, uključujući granice? a) 10 <= broj <= 20 b) broj >= 10 && broj <= 20 c) broj >= 10 || broj <= 20 Pitanje 6. Šta je rezultat?
true || false && false
a) true b) false Pitanje 7. Koji izraz je ekvivalentan izrazu !(A && B)? a) !A && !B b) !A || !B c) A || B Pitanje 8. Šta znači kratkospojno izvršavanje? a) Program uvek proverava sve uslove. b) Program može preskočiti proveru drugog operanda kada je rezultat već poznat. c) Program automatski prekida rad. Pitanje 9. Šta će biti rezultat?
int broj = 15;

bool rezultat = (broj > 10 && broj < 20);
a) true b) false Pitanje 10. Koji operator ima najveći prioritet među osnovnim logičkim operatorima? a) || b) && c) !

Rešenja mini-testa

Proverite odgovore nakon što završite test. Prikaži rešenja

19. Zadaci za samostalnu vežbu

Zadatak 1 — Pozitivan i paran broj Napisati program koji proverava da li je uneti broj istovremeno pozitivan i paran. Zadatak 2 — Deljivost sa 3 ili 7 Napisati program koji proverava da li je broj deljiv sa 3 ili sa 7. Zadatak 3 — Provera intervala Napisati program koji proverava da li se broj nalazi u intervalu od 50 do 100, uključujući granice. Zadatak 4 — Broj van intervala Napisati program koji proverava da li je broj manji od 10 ili veći od 90. Zadatak 5 — Pristup sistemu Napisati program koji dozvoljava pristup korisniku ako je punoletan, ima aktivan nalog i nije blokiran. Zadatak 6 — Popust za kupca Kupac dobija popust ako ima člansku karticu ili kupon. Napisati program koji proverava pravo na popust. Zadatak 7 — Prestupna godina Napisati program koji proverava da li je uneta godina prestupna. Zadatak 8 — Student i ispit Student polaže ispit ako ima najmanje 51 poen i završene obavezne vežbe. Napisati program koji proverava oba uslova. Zadatak 9 — Tri broja Napisati program koji proverava da li je prvi broj veći od drugog i trećeg. Zadatak 10 — Složena validacija Napisati program koji proverava da li je broj pozitivan, deljiv sa 5 i manji od 100.

20. Domaći zadatak — sistem za prijavu na fakultetski ispit

Napraviti C++ program koji simulira proveru uslova za prijavu ispita. Program treba da omogući unos:
  • Imena studenta.
  • Broja ostvarenih predispitnih poena.
  • Informacije da li su završene obavezne vežbe.
  • Informacije da li je student izmirio finansijske obaveze.
  • Informacije da li je studentski nalog aktivan.
  • Informacije da li postoji posebna dozvola za prijavu ispita.
Pravila:
  1. Broj predispitnih poena mora biti između 0 i 70.
  2. Student redovno može da prijavi ispit ako ima najmanje 30 predispitnih poena, završene vežbe, izmirene obaveze i aktivan nalog.
  3. Student sa posebnom dozvolom može da prijavi ispit i ako nema dovoljno predispitnih poena ili završene vežbe, ali i dalje mora imati aktivan nalog i izmirene obaveze.
  4. Ako nalog nije aktivan, prijava nije dozvoljena.
  5. Ako finansijske obaveze nisu izmirene, prijava nije dozvoljena.
Program treba da koristi logičke operatore &&, || i !, operatore poređenja, promenljive tipa bool, kao i uslovne naredbe. Na kraju treba prikazati:
  • Ime studenta.
  • Broj predispitnih poena.
  • Da li su ispunjeni redovni uslovi.
  • Da li student ima posebnu dozvolu.
  • Da li je prijava ispita dozvoljena.
Dodatni izazov: napišite program tako da prikaže konkretan razlog zbog kojeg prijava nije dozvoljena.

Najava naredne lekcije

U sledećoj lekciji prelazimo na jednu od najvažnijih praktičnih oblasti C++ programiranja. Tema 25 — Operator dodele i kombinovani operatori (=, +=, -=, *=, /=, %=) Naučićemo kako da menjamo vrednosti promenljivih, koristimo skraćene zapise aritmetičkih operacija i izbegnemo česte greške prilikom dodele vrednosti.
Vaša privatnost nam je važna

Koristimo neophodne kolačiće da bi sajt i forme za upit ispravno radili, a uz vašu dozvolu i opcionalne kolačiće za analitiku, personalizaciju i marketing. Saznajte više.