De ce contează?
La semafor alegi un singur drum: dacă e verde, mergi; dacă e roșu, aștepți. Nu poți face ambele. Exact asta face structura alternativă: evaluează o condiție și execută una din două ramuri — niciodată pe amândouă în același timp.
Forma simplă: if
Execută un bloc doar dacă condiția e true:
if (conditie) {
// executat doar cand conditia e adevarata
}Exemplu:
int nota;
cin >> nota;
if (nota >= 5) {
cout << "Promovat" << endl;
}
// daca nota < 5, nu se afiseaza nimicForma completă: if-else
Execută un bloc sau celălalt:
if (conditie) {
// executat cand conditia e adevarata
} else {
// executat cand conditia e falsa
}int n;
cin >> n;
if (n % 2 == 0) {
cout << n << " este par" << endl;
} else {
cout << n << " este impar" << endl;
}Forma înlănțuită: if-else if-else
Verifică mai multe condiții în ordine — se execută primul bloc cu condiție adevărată:
#include <iostream>
using namespace std;
int main() {
int nota;
cin >> nota;
if (nota == 10) {
cout << "Perfect!" << endl;
} else if (nota >= 9) {
cout << "Foarte bine" << endl;
} else if (nota >= 7) {
cout << "Bine" << endl;
} else if (nota >= 5) {
cout << "Suficient" << endl;
} else {
cout << "Insuficient" << endl;
}
return 0;
}La if-else if-else, condițiile se evaluează de sus în jos și execuția se oprește la primul true. Ordinea contează: pune condițiile mai restrictive primele. Dacă pui nota >= 5 înainte de nota >= 9, o notă de 9 intră în ramura „suficient" și nu ajunge niciodată la „foarte bine".
if-uri imbricate
Un if în interiorul altui if:
int a, b;
cin >> a >> b;
if (a > 0) {
if (b > 0) {
cout << "Ambele pozitive" << endl;
} else {
cout << "Doar a pozitiv" << endl;
}
} else {
cout << "a nu e pozitiv" << endl;
}Dacă ajungi la 4–5 niveluri de if imbricate, codul devine greu de citit și de depanat. De cele mai multe ori poți combina condițiile cu && sau || și reduce imbricarea la 1–2 niveluri.
Complexitate
if/else costă O(1) — evaluează condiția o singură dată.
Greșeala 1: Scrii = în loc de == în condiție. if (x = 5) atribuie 5 lui x (nu compară!) și condiția e mereu true. Compilatorul poate avertiza, dar nu refuză compilarea.
Greșeala 2: Omiți { } când ai mai multe instrucțiuni după if. Fără acolade, if (cond) instr1; instr2; — instr2 se execută indiferent de condiție. Pune mereu acolade când corpul are mai mult de o instrucțiune.
Greșeala 3: Pui condițiile în ordinea greșită la else if. Dacă ai if (x > 0) ... else if (x > 5), ramura cu x > 5 nu e atinsă niciodată — orice număr mai mare ca 5 intră deja în x > 0. Pune condițiile mai specifice (restrictive) primele.