Structura alternativă

Bază~14 min10 pași

De ce contează?

La intrarea într-un parc: „dacă ai bilet, intri; altfel, mergi la casă". Decizia se ia pe baza unei condiții, iar în funcție de răspuns urmezi un drum sau altul. Structura alternativă e exact această bifurcație din program.

Ce este structura alternativă

O structură alternativă alege între două (sau mai multe) drumuri, în funcție de o condiție care e adevărată sau falsă:

if (conditie) {
    // se executa daca este adevarata
} else {
    // se executa daca este falsa
}

Condiția folosește operatori de comparație: == (egal), != (diferit), <, >, <=, >=. Le poți combina cu && (și), || (sau), ! (negație).

Observația-cheie

Atenție la == vs =: == compară, = atribuie. if (x == 5) întreabă „este x egal cu 5?". if (x = 5) pune 5 în x și e mereu adevărat — bug clasic.

Algoritm pas cu pas: par sau impar

Un număr e par dacă restul împărțirii la 2 este 0:

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    if (n % 2 == 0) {
        cout << "par\n";
    } else {
        cout << "impar\n";
    }
    return 0;
}

Pentru n = 6: 6 % 2 == 0 e adevărat → afișează par. Pentru n = 7: fals → impar.

Mai multe cazuri: else if

Când ai cazuri care se exclud reciproc, înlănțuie-le. Clasificăm un număr:

#include <iostream>
using namespace std;

int main() {
    int x;
    cin >> x;
    if (x < 0) {
        cout << "negativ\n";
    } else if (x == 0) {
        cout << "zero\n";
    } else {
        cout << "pozitiv\n";
    }
    return 0;
}
Observația-cheie

Cu else if, de îndată ce o condiție e adevărată, restul se sar. Trei if-uri independente ar verifica toate condițiile inutil — și ar putea afișa două rezultate dacă logica nu e perfect exclusivă.

Maximul a două numere

int a, b;
cin >> a >> b;
int maxim;
if (a > b) {
    maxim = a;
} else {
    maxim = b;
}
cout << maxim << "\n";

Pentru a = 3, b = 8: condiția 3 > 8 e falsă → maxim = 8.

Complexitate

Un if/else se evaluează în O(1) — testează condiția și alege o ramură, cost constant. Costul real vine din ce pui pe ramuri, nu din decizia însăși.

Greșeli frecvente

Greșeli reale cu structura alternativă:

  • = în loc de ==: if (x = 5) atribuie și e mereu adevărat. Compilatorul nu dă eroare — doar un avertisment, ușor de ratat.
  • Acolade lipsă cu două instrucțiuni: if (cond) a = 1; b = 2;b = 2 rulează mereu. Pune { } când ai mai mult de o linie.
  • Cazuri neexclusive: folosești if-uri separate unde trebuia else if și nimerești în două ramuri.
  • Comparații cu double: if (x == 0.3) poate fi fals din cauza rotunjirilor; compară cu o toleranță mică.

De reținut

  • if (conditie) { ... } else { ... } alege un drum după o condiție adevărată/falsă.
  • == compară, = atribuie — confuzia lor e un bug mereu adevărat.
  • Pentru cazuri care se exclud, folosește else if; pune acolade când ai >1 instrucțiune.

Întrebarea 1 / 3

Ce face greșit codul `if (x = 5) cout << "da";`?