Video: Instrucțiunea de decizie în C++: if, else, switch, case

Instrucțiunea de decizie în C++: if, else, switch, case

Scris de Dominic Satnoianu

Î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ât 5, atunci nu trece clasa);
  • Dacă o persoană cumpără un produs de 10 lei, atunci din contul lui bancar vor fi scoși 10 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 cu b
    • Exemple:
      • if(3 == 3) (adevărată mereu)
      • if(n == 4) (adevărată dacă n are valoarea 4)
      • if(5 == n - 2) (adevărată dacă n are valoarea 7)
  • if(a != b)
    • Este adevărată doar dacă a este diferit de b
    • Exemple:
      • if(3 != 3) (falsă mereu)
      • if(n != 4) (adevărată dacă n are orice valoare înafară de 4)
      • if(5 != n - 2) (adevărată dacă n are orice valoare înafară de 7)
  • if(a > b) este adevărată doar dacă a este strict mai mare decât b
  • if(a < b) este adevărată doar dacă a este strict mai mic decât b
  • if(a >= b) este adevărată doar dacă a este mai mare sau egal cu b
  • if(a <= b) este adevărată doar dacă a este mai mic sau egal cu b
  • if(!(condiție))
    • Este adevărată dacă condiția este falsă
    • Exemple:
      • if(!(3 == 3)) (echivalentă cu if(3 != 3), adică falsă mereu)
      • if(!(n != 4)) (echivalentă cu if(n == 4), adică adevărată doar dacă n este egal cu 4)
  • if(condiție1 && condiție2)
    • Este adevărată dacă condiție1 și condiție2 sunt adevărate
    • Exemple:
      • if(n == 4 && m > 5) (adevărată dacă n este egal cu 4, iar m este strict mai mare decât 5; dacă una dintre condiții este falsă, atunci toată condiția este falsă)
  • if(condiție1 || condiție2)
    • Este adevărată dacă condiție1 sau condiție2 sunt adevărate
    • Exemple:
      • if(n == 4 || m > 5) (adevărată dacă n este egal cu 4, sau m este strict mai mare decât 5, sau ambele; dacă ambele condiții sunt false, atunci toată condiția este falsă)

Condițiile se pot combina; condiția if(n == 5 || (m == 7 && n > 0)) este adevărată doar dacă:

  • n == 5 (n este egal cu 5), sau
  • m == 7 && n > 0 (m este egal cu 7 și n este mai mare decât 0)

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:

  1. 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ă la break, după care se iese din switch. De exemplu, mai sus, dacă valoare este egală cu valoareComparata2, se vor executa instrucțiunile 3, 4, ….
  2. Nu s-a găsit nicio valoare egală cu valoare. În acest caz, dacă există, se execută codul din ramura default, după care se iese din switch, 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:

  1. x <= 0;
  2. 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

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;
}

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.

Comentarii 0

Autentifică-te pentru a putea comenta.

Autentifică-te