Skip to content

Instructiunea if

Pana acum, programele noastre executau toate instructiunile, una dupa alta. Cu if, programul poate lua decizii: executa un bloc de cod doar daca o conditie este adevarata.

if simplu

cpp
if (conditie)
{
    // se executa DOAR daca conditia este adevarata (diferita de 0)
}

Exemplu: verificare numar pozitiv

cpp
#include <iostream>
using namespace std;
int n;

int main()
{
    cin >> n;
    if (n > 0)
    {
        cout << "Numarul este pozitiv." << endl;
    }

    return 0;
}

Rulare cu n = 5:

5
Numarul este pozitiv.

Rulare cu n = -3:

-3

Observatie

Daca conditia e falsa, blocul din if se sare — nu se afiseaza nimic.


if-else

Adaugam un bloc care se executa cand conditia este falsa:

cpp
if (conditie)
{
    // se executa daca conditia e adevarata
}
else
{
    // se executa daca conditia e falsa
}

Exemplu: par sau impar

cpp
#include <iostream>
using namespace std;
int n;

int main()
{
    cin >> n;
    if (n % 2 == 0)
    {
        cout << "Par" << endl;
    }
    else
    {
        cout << "Impar" << endl;
    }

    return 0;
}

Rulare cu n = 8:

8
Par

Rulare cu n = 7:

7
Impar

if - else if - else (decizii multiple)

Cand avem mai mult de doua cazuri:

cpp
if (conditie1)
{
    // cazul 1
}
else if (conditie2)
{
    // cazul 2
}
else if (conditie3)
{
    // cazul 3
}
else
{
    // niciunul din cazurile de mai sus
}

Exemplu: clasificare nota

cpp
#include <iostream>
using namespace std;
int nota;

int main()
{    
    cin >> nota;
    if (nota == 10)
    {
        cout << "Felicitari!" << endl;
    }
    else if (nota >= 5)
    {
        cout << "Promovat." << endl;
    }
    else
    {
        cout << "Nepromovat." << endl;
    }

    return 0;
}

Rulare cu nota = 10:

10
Felicitari!

Rulare cu nota = 7:

7
Promovat.

Rulare cu nota = 3:

3
Nepromovat.

Sfat

Conditiile se verifica de sus in jos. La primul if/else if care e adevarat, se executa blocul si se sare peste restul. De aceea nota >= 5 nu trebuie sa verifice si nota != 10 — daca am ajuns acolo, inseamna ca nota nu e 10.


Conditii compuse

Putem combina mai multe conditii cu && (SI) si || (SAU), asa cum am invatat in lectia de expresii.

Exemplu: verificare interval

Se citeste un numar. Verificam daca este intre 1 si 100 (inclusiv).

cpp
#include <iostream>
using namespace std;
int n;

int main()
{
    cin >> n;
    if (n >= 1 && n <= 100)
    {
        cout << "Numarul este in intervalul [1, 100]." << endl;
    }
    else
    {
        cout << "Numarul NU este in intervalul [1, 100]." << endl;
    }

    return 0;
}

Exemplu: an bisect

Un an este bisect daca e divisibil cu 4 si nu e divisibil cu 100, sau daca e divisibil cu 400.

cpp
#include <iostream>
using namespace std;
int an;

int main()
{
    cin >> an;

    if ((an % 4 == 0 && an % 100 != 0) || an % 400 == 0)
    {
        cout << "An bisect" << endl;
    }
    else
    {
        cout << "An nebisect" << endl;
    }

    return 0;
}

Maximul din 2 numere

cpp
#include <iostream>
using namespace std;
int a, b, maxim;

int main()
{
    cin >> a >> b;
    if (a > b)
    {
        maxim = a;
    }
    else
    {
        maxim = b;
    }
    cout << maxim << endl;

    return 0;
}

Maximul din 3 numere

cpp
#include <iostream>
using namespace std;
int a, b, c, maxim;
int main()
{
    cin >> a >> b >> c;
    maxim = a;
    if (b > maxim)
    {
        maxim = b;
    }
    if (c > maxim)
    {
        maxim = c;
    }

    cout << maxim << endl;

    return 0;
}

Sfat

Pornim cu maxim = a si apoi verificam pe rand daca b sau c sunt mai mari. Aceasta tehnica functioneaza pentru oricati candidati.


Sortarea a 4 variabile

  • Vreau cele 4 variabile a, b, c, d in ordine crescatoare.
  • Deci in a vreau valoarea cea mai mica:
    • voi compara a cu b, c, respectiv d
    • daca in a am valoarea mai mare voi face interschimbare (swap).
  • Astfel, in a voi avea valoarea cea mai mica.
  • Ramane acum sa setez in b valoarea cea mai mica dintre b, c si d.
  • Ca apoi sa setez in c valoarea cea mai mica dintre c si d
cpp
#include <iostream>
#include <algorithm> // pentru functia swap
using namespace std;

int a, b, c, d, aux;

int main()
{
    cin >> a >> b >> c >> d;
    if (a > b)
    {
        aux = a;
        a = b;
        b = aux;
    }
    if (a > c)
    {
        aux = c;
        c = a;
        a = aux;
    }
    if (a > d)
    {
        aux = a;
        a = d;
        d = aux;
    }
    // interschimbarile le pot face si cu swap() in loc de cele 3 atribuire
    if (b > c)
    {
        swap(b, c);
    }
    if (b > d)
    {
        swap(b, d);
    }
    if (c > d)
    {
        swap(c, d);
    }

    return 0;
}

Intrare:

7 9 3 5

Afisare:

3 5 7 9

Conceptul de contor

Un contor este o variabila care numara cate valori indeplinesc o conditie. Porneste de la 0 si creste cu 1 la fiecare valoare care respecta conditia.

Exemplu: dintr-un numar de 5 cifre, cate sunt impare?

cpp
#include <iostream>
using namespace std;
int c1, c2, c3, c4, c5, contor;

int main()
{
    cin >> c1 >> c2 >> c3 >> c4 >> c5;
    if (c1 % 2 != 0)
    {
        contor++;
    }
    if (c2 % 2 != 0)
    {
        contor++;
    }
    if (c3 % 2 != 0)
    {
        contor++;
    }
    if (c4 % 2 != 0)
    {
        contor++;
    }
    if (c5 % 2 != 0)
    {
        contor++;
    }

    cout << contor << endl;

    return 0;
}

Exemplu de rulare:

1 4 7 2 9
3

Explicatie: din cifrele 1, 4, 7, 2, 9, cele impare sunt 1, 7, 9 — deci 3.

Observatie

Observi ca se repeta acelasi tipar de 5 ori. Cand vom invata instructiunile repetitive (for/while), vom putea scrie acest cod mult mai scurt. Pana atunci, contorul functioneaza si asa.


Capcane frecvente

1. = vs ==

cpp
// GRESIT — atribuie 5 lui n (intotdeauna "adevarat")
if (n = 5)

// CORECT — compara n cu 5
if (n == 5)

Atentie

= este atribuire (pune valoarea). == este comparatie (verifica egalitatea). Confuzia intre ele este cea mai comuna greseala.

2. Acolade lipsa

Fara acolade, if controleaza doar prima instructiune:

cpp
if (n > 0)
    cout << "Pozitiv" << endl;
    cout << "Sigur pozitiv" << endl;    // ACEASTA SE EXECUTA MEREU!

Cu acolade, ambele instructiuni sunt controlate:

cpp
if (n > 0)
{
    cout << "Pozitiv" << endl;
    cout << "Sigur pozitiv" << endl;    // doar daca n > 0
}

Atentie

Pune intotdeauna acolade, chiar daca ai o singura instructiune in bloc. Eviti erori greu de depistat.