
Instrucțiunea de decizie în C++: if, else, switch, case
În această lecție vom învăța despre instrucțiunea de decizie, de ce este utilă și cum se poate implementa.
De multe ori în codurile noastre o să avem nevoie de o modalitate de a executa anumite linii de cod doar dacă se îndeplinește o anumită condiție. Iată câteva exemple reale:
- Dacă un elev are media cel puțin
5
, atunci trece clasa (altfel, dacă are media mai mică decât5
, atunci nu trece clasa); - Dacă o persoană cumpără un produs de
10
lei, atunci din contul lui bancar vor fi scoși10
lei. - Dacă rezolvi o problemă de 100 de puncte, primești steluțe drept recompensă.
Pentru a rezolva această necesitate, s-au creat structurile de decizie, deseori numite și structuri alternative.
Instrucțiunea if
Una dintre cele mai des utilizate structuri, instrucțiunea if
este aproape
universal valabilă în toate limbajele de programare. Exemplele de mai jos sunt
în C++.
Sintaxa instrucțiunii if
Instrucțiunea se găsește sub următoarea formă:
if(condiție) {
instrucțiune 1;
instrucțiune 2;
…
}
Practic, dacă condiția este validă, atunci executăm instrucțiunile 1
, 2
,
…. Orice altă instrucțiune, din afara acoladelor, se execută indiferent de
condiție.
Condiții
Condiția este o expresie de tip bool
și se consideră a fi adevărată doar
dacă este adevărată (true
). Pentru că poate părea greu la început să
înțelegem tipul bool
, mai jos puteți vedea câteva condiții des utilizate:
-
if(a == b)
(doi de=
)- Este adevărată doar dacă
a
este egal cub
- Exemple:
-
if(3 == 3)
(adevărată mereu) -
if(n == 4)
(adevărată dacăn
are valoarea4
) -
if(5 == n - 2)
(adevărată dacăn
are valoarea7
)
-
- Este adevărată doar dacă
-
if(a != b)
- Este adevărată doar dacă
a
este diferit deb
- Exemple:
-
if(3 != 3)
(falsă mereu) -
if(n != 4)
(adevărată dacăn
are orice valoare înafară de4
) -
if(5 != n - 2)
(adevărată dacăn
are orice valoare înafară de7
)
-
- Este adevărată doar dacă
-
if(a > b)
este adevărată doar dacăa
este strict mai mare decâtb
-
if(a < b)
este adevărată doar dacăa
este strict mai mic decâtb
-
if(a >= b)
este adevărată doar dacăa
este mai mare sau egal cub
-
if(a <= b)
este adevărată doar dacăa
este mai mic sau egal cub
-
if(!(condiție))
- Este adevărată dacă
condiția
este falsă - Exemple:
-
if(!(3 == 3))
(echivalentă cuif(3 != 3)
, adică falsă mereu) -
if(!(n != 4))
(echivalentă cuif(n == 4)
, adică adevărată doar dacăn
este egal cu4
)
-
- Este adevărată dacă
-
if(condiție1 && condiție2)
- Este adevărată dacă
condiție1
șicondiție2
sunt adevărate - Exemple:
-
if(n == 4 && m > 5)
(adevărată dacăn
este egal cu4
, iarm
este strict mai mare decât5
; dacă una dintre condiții este falsă, atunci toată condiția este falsă)
-
- Este adevărată dacă
-
if(condiție1 || condiție2)
- Este adevărată dacă
condiție1
saucondiție2
sunt adevărate - Exemple:
-
if(n == 4 || m > 5)
(adevărată dacăn
este egal cu4
, saum
este strict mai mare decât5
, sau ambele; dacă ambele condiții sunt false, atunci toată condiția este falsă)
-
- Este adevărată dacă
Condițiile se pot combina; condiția if(n == 5 || (m == 7 && n > 0))
este
adevărată doar dacă:
-
n == 5
(n
este egal cu5
), sau -
m == 7 && n > 0
(m
este egal cu7
șin
este mai mare decât0
)
O condiție de tipul if(n)
este echivalentă cu if(n != 0)
.
Condițiile de tipul a <= b <= c
sunt invalide. Însă, putem să le rescriem
astfel: a <= b && b <= c
.
Exemple
Iată câteva exemple de utilizare a instrucțiunii if
:
int varsta;
cin >> varsta;
if(varsta >= 18) {
cout << "Major";
}
if(varsta < 18) {
cout << "Minor";
}
Programul de mai sus afișează mesajul Major
dacă varsta
este mai mare sau
egală cu 18
, sau Minor
în caz contrar.
cout << "Mesaj 1\n";
if(17) {
cout << "Mesaj 2, afișat deoarece 17 != 0\n";
}
cout << "Mesaj 3";
Programul de mai sus va afișa:
Mesaj 1
Mesaj 2, afișat deoarece 17 != 0
Mesaj 3
Observații
Se recomandă să indentăm codul — mai exact, pentru instrucțiunile imbricate
într-o structură if
, este recomandat să așezăm un caracter TAB
(sau
spații) înaintea instrucțiunilor, ca în exemplele de mai sus. Deși nu este
neapărat necesar, ne ajută foarte mult să ne înțelegem codul (în special dacă
este un cod mai complex). Iată un exemplu valid, însă nerecomandat:
//E foarte greu să ne dăm seama care condiții fac parte din if și care nu
instrucțiune;
if(condiție)
{instrucțiune 1;
instrucțiune 2;
instrucțiune 3;
} instrucțiune;
instrucțiune;
Acolada de început nu trebuie neapărat să fie așezată pe aceeași linie cu condiția. Poate fi așezată pe linia următoare, sau oricum altcumva, cât timp instrucțiunile rămân între acolade și între condiție și acolade nu se află nimic. Exemple de coduri valide:
if(condiție)
{
instrucțiune 1;
instrucțiune 2;
…
}
Sau:
//Totuși, nu prea elegant 😉
if(condiție)
{instrucțiune 1;
instrucțiune 2;
…}
Dacă instrucțiunea if
are o singură instrucțiune, atunci nu este necesar să
adăugăm acolade. De exemplu:
if(condiție)
instrucțiune 1;
instrucțiune 2;
În exemplul anterior, instrucțiunea 1;
este executată doar dacă condiția
este adevărată. Pe de altă parte, instrucțiunea 2;
se execută oricum.
Instrucțiunea else
De multe ori avem un program care execută cod dacă o condiție anume este îndeplinită, sau, în caz contrar, execută alt cod. Iată exemplul de mai devreme:
if(varsta >= 18) {
cout << "Major";
}
if(!(varsta >= 18)) { //Sau varsta < 18
cout << "Minor";
}
Acest cod face exact ce vrem, însă dacă vrem vreodată să modificăm condiția
varsta >= 18
, va trebui să o modificăm de mai multe ori, fapt care ne poate
încurca mult. Din fericire, avem următoarea opțiune:
//Exact ca și codul anterior
if(varsta >= 18) {
cout << "Major";
} else {
cout << "Minor";
}
Am folosit instrucțiunea else
, așezată după acoladele instrucțiunii if
.
Practic, instrucțiunile dintre acoladele instrucțiunii else
se execută doar
dacă condiția varsta >= 18
este falsă. Codul este mult mai consistent
acum.
Ca și înainte, acoladele pot fi așezate oricum, sau pot să nu apară deloc:
//Exact ca și codul anterior
if(varsta >= 18)
{
cout << "Major";
} else
cout << "Minor";
//Exact ca și codul anterior
if(varsta >= 18) cout << "Major";
else {cout << "Minor";}
Instrucțiunea if
pe trei ramuri
Momentan am reușit să compunem un program care funcționează pe două ramuri:
condiție
și !condiție
. Dar se poate să avem și mai multe ramuri — de
pildă, un elev poate fi în clasele primare, gimnaziale sau la liceu. Pentru a
rezolva această problemă, putem să reducem problema la noțiunile învățate de
noi:
if(1 <= clasa && clasa <= 4) cout << "Primar";
else {
if(5 <= clasa && clasa <= 8) cout << "Gimnaziu";
else cout << "Liceu";
}
Sau, mai ușor de urmărit:
//La fel ca cealaltă variantă, doar că mai ușor de înțeles
//Practic, este un if mare, else-ul neavând acolade, iar în interiorul else-ului fiind un alt if/else.
if(1 <= clasa && clasa <= 4) cout << "Primar";
else if(5 <= clasa && clasa <= 8) cout << "Gimnaziu";
else cout << "Liceu";
Erori frecvente
Iată câteva erori tipice care pot apărea:
- Punem punct și virgulă (
;
) după condiție:if(condiție);
nu va executa instrucțiunile; - Punem punct și virgulă (
;
) după acolade:};
este greșit; - Nu punem toate instrucțiunile între acolade, acestea nefiind luate în considerare de
if
.
Instrucțiunea switch
Instrucțiunea switch
nu este la fel de des utilizată, însă este foarte utilă
în cazul în care vrem să comparăm o valoare cu mai multe alte valori.
Sintaxa instrucțiunii switch
Sintaxa instrucțiunii switch
este următoarea:
switch(valoare) {
case valoareComparata1:
instrucțiune 1;
instrucțiune 2;
…
break;
case valoareComparata2:
instrucțiune 3;
instrucțiune 4;
…
break;
…
default:
instrucțiune 5;
instrucțiune 6;
…
break;
}
Modul de funcționare a instrucțiunii switch
Se verifică egalitatea dintre valoare
cu fiecare dintre valorile comparate:
valoareComparata1
, valoareComparata2
, …. Există două cazuri:
- S-a găsit o egalitate dintre
valoare
și una dintre valorile comparate. Se vor executa toate instrucțiunile ce îi aparțin valorii comparate, până labreak
, după care se iese dinswitch
. De exemplu, mai sus, dacăvaloare
este egală cuvaloareComparata2
, se vor executa instrucțiunile3
,4
, …. - Nu s-a găsit nicio valoare egală cu
valoare
. În acest caz, dacă există, se execută codul din ramuradefault
, după care se iese dinswitch
, iar dacă nu, se iese pur și simplu.
Exemple
Afișarea numelui lunii în funcție de numărul acesteia:
int luna;
cin >> luna;
switch(luna) {
case 1:
cout << "Ianuarie\n";
break;
case 2:
cout << "Februarie\n";
break;
case 3:
cout << "Martie\n";
break;
…
case 12:
cout << "Decembrie\n";
break;
default:
cout << "Număr invalid!\n";
break;
}
Observații
Când codul intră pe un case
, acesta va executa totul până când întâlnește
instrucțiunea break;
sau până la finalul instrucțiunii switch
. Astfel,
dacă nu includem break;
la una dintre case
-uri, vom întâlni un
comportament similar cu acesta:
//Codul va afișa numerele de la n la 1 (pentru n = 3, se afișează 3, 2, 1)
int n = 3;
switch(n) {
case 3:
cout << 3 << "\n";
case 2:
cout << 2 << "\n";
case 1:
cout << 1 << "\n";
}
Alt exemplu:
//Afișarea anotimpului în funcție de numărul lunii
int luna;
cin >> luna;
switch(luna) {
case 12:
case 1:
case 2:
cout << "Iarnă\n";
break;
case 3:
case 4:
case 5:
cout << "Primăvară\n";
break;
case 6:
case 7:
case 8:
cout << "Vară\n";
break;
case 9:
case 10:
case 11:
cout << "Toamnă\n";
break;
}
Cum se observă și mai sus, nu este neapărat necesar să includem instrucțiuni
la vreun case
.
Probleme rezolvate
Iată câteva aplicații, împreună cu rezolvări.
Paritatea unui număr
Dându-se un număr natural n
, să se determine dacă este par sau impar.
Testează-ți rezolvarea pe această pagină.
Exemple: Pentru n = 3
, se va afișa IMPAR
, iar pentru n = 10000
, se
va afișa PAR
.
Rezolvare: Dacă restul împărțirii întregi la 2
a lui n
este 0
(adică
n
se împarte la 2
), atunci numărul este par. În caz contrar, numărul este
impar.
//Rezolvare cu if
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
if(n % 2 == 0) {
cout << "PAR";
} else {
cout << "IMPAR";
}
}
Sau:
//Rezolvare cu switch (fără break la un caz)
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
switch(n % 2) {
case 1:
cout << "IM";
case 0:
cout << "PAR";
break;
}
}
Interval
Dându-se două numere întregi, x
și y
, să se determine dacă în intervalul
[x; y]
aparține și 0
sau nu. Testează-ți rezolvarea pe această
pagină.
Exemple: Pentru x = -3
și y = -1
, răspunsul este NU
. Dacă y
ar fi
fost 1
(și x
ar rămâne tot -3
), răspunsul ar fi fost DA
.
Rezolvare: Pentru ca 0
să aparțină intervalului [x; y]
, trebuie ca
următoarele două condiții să fie valide:
-
x <= 0
; -
0 <= y
.
Dacă ambele sunt valide, atunci răspunsul afișat este DA
. În caz contrar,
răspunsul este NU
.
#include <iostream>
using namespace std;
int main()
{
int x, y;
cin >> x >> y;
if(x <= 0 && 0 <= y) {
cout << "DA";
} else {
cout << "NU";
}
}
Bibliografie sau alte resurse
Exerciții propuse
Exercițiul 1 / 3
Avem pregătite 3 exerciții pentru tine, pentru a-ți testa cunoștințele și a-ți îmbunătăți abilitățile.
Exercițiul 1
Răspuns corect!
Pentru a afișa pe ecran restul împărțirii întregi la 5
a unui număr n
, ce instrucțiune lipsește?
switch(n % 5) {
case 0:
cout << "0";
break;
case 1:
cout << "1";
break;
case 2:
cout << "2";
???
case 3:
cout << "3";
break;
case 4:
cout << "4";
break;
}
Exercițiul 2
Răspuns corect!
Să se introducă cel mai mic număr astfel încât programul să afișeze pe ecran mesajul doar dacă n
se împarte la 6
sau la 7
:
int n;
cin >> n;
if(n % 7 == 0 || (n % ??? == 0 && n % 3 == 0)) {
cout << "Numarul se imparte la 6 sau la 7";
}
Exercițiul 3
Răspuns corect!
Grupează în perechi expresiile care sunt legate între ele.
DS
Autorul acestei lecții
Dominic Satnoianu
Această lecție a fost redactată de către Dominic Satnoianu.
© 2021 – 2025 Aspire Education Labs SRL. Toate drepturile rezervate.
Așa cum este specificat și în termeni și condiții, conținutul acestei pagini este protejat de legea drepturilor de autor și este interzisă copierea sau modificarea acestuia fără acordul scris al autorilor.
Încălcarea drepturilor de autor este o infracțiune și se pedepsește conform legii.
Cuprinsul lecției
Instrucțiunea ifSintaxa instrucțiunii ifCondițiiExempleObservațiiInstrucțiunea elseInstrucțiunea if pe trei ramuriErori frecventeInstrucțiunea switchSintaxa instrucțiunii switchModul de funcționare a instrucțiunii switchExempleObservațiiProbleme rezolvateParitatea unui numărIntervalBibliografie sau alte resurseCreează-ți un cont InfoAs și primești…
- Acces la sute de lecții de calitate, cu animații și exerciții
- Acces la peste 800 de probleme de informatică
- Indicații și rezolvări pentru fiecare problemă
- Totul 100% gratuit!
Comentarii 0