Contact și feedback

Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.


Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.


Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.

Shortcuturi

Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.

Generale

Meniu shortcuturi?
Căutare probleme sau utilizatori/
Navigare printre rezultatele căutării↑, ↓
Meniu de contact și feedbackCTRL + Shift + F
Ieșire din meniuriEsc

Editor probleme

Setări editorCTRL + Shift + S
Schimbare stil editorCTRL + Shift + E
Șabloane de codCTRL + Shift + 1/2/3
Golire editorCTRL + Shift + 4

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â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";
}
//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";
    }
}
//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";
    }
}

Exerciții propuse

Completează următoarele secvențe de cod:

Să se afișeze pe ecran restul împărțirii întregi la 5 a unui număr natural n:

switch(n % 5) {
    case 0:
        cout << "Restul este 0\n";
        break;
    case 1:
        cout << "Restul este 1\n";
        ???;
    case 2:
        cout << "Restul este 2\n";
        break;
    case ???:
        cout << "Restul este 3\n";
        break;
    case 4:
        cout << "Restul este 4\n";
        break;
}

Să se introducă cel mai mic număr astfel încât programul afișeze pe ecran mesajul doar dacă n se împarte la 6 sau la 7:

if(n % 7 == 0 || (n % ??? == 0 && n % 3 == 0)) {
    cout << "Număr valid\n";
}

Probleme propuse

# Problemă Dificultate
170. Suc 2 Ușoară (2 )
610. Recunoastere culoare Ușoară (2 )
614. Negativ trei cifre Medie (4 )
491. Luna calendaristica Ușoară (2 )
612. Calculator 2 Medie (4 )
Vrei mai multe probleme? Pe această pagină găsești întreaga listă de probleme propuse.

Bibliografie sau alte resurse

Cuprinsul lecției

Se încarcă…

Citește și

Cel mai mare divizor comun (CMMDC) a două numere în C++Valoarea absolută (modulul) unui număr în C++Aflarea sumei primelor N sume GaussAflă secolul unui an citit de la tastatură în C++Vectori de frecvență (de apariții) în C++Tipul struct în C++. Ce sunt structurile de date neomogeneTransformarea unui număr din baza 10 în baza 2 în C++Verifică dacă o literă este vocală în C++Verifică dacă un bit de pe o anumită poziție este 1 sau 0 în C++Codul ASCII (tabel complet)Numărul de divizori primi ai unui număr în C++Numărul aranjamentelor în C++ (formula aranjamentelor)Ce este o variabilă unsigned în C++?Verifică dacă un număr dat este o putere de 2 în C++Materia pentru olimpiada de informatică - tot ce trebuie să știiMediana unui șir de valori în C++Complexitatea unui algoritm (timp și spațiu) în C++Numere triunghiulare. Verificarea unui număr triunghiularAl N-lea termen Fibonacci în C++Matrice în C++. Declararea și parcurgerea tablourilor bidimensionaleInstrucțiunea de decizie în C++: if, else, switch, caseCum să citești și să afișezi în fișiere în C++Transformarea unei litere mici în literă mare în C++Verificarea unui an bisect în C++Verificare dacă un număr este palindrom în C++Operații cu numere mari în C++ - Toate funcțiile explicateVerifică dacă o literă este mică sau mare în C++Comentarii în C++Citește un șir de caractere cu spații în C++Recursivitate în C++Instrucțiunea do while (structuri repetitive)Ce înseamnă variabilă globală și locală în C++?Aria unui triunghi folosind coordonatele acestora în C++De ce cer unele probleme răspunsul modulo 666013 sau modulo 1.000.000.007?Cea mai lungă secvență de elemente crescătoare în C++Vectorii în C++: declarare și parcurgereCel mai mic/mare divizor prim al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Matrice Fibonacci - al n-lea termen Fibonacci în timp logaritmicAfișarea elementelor unui vector recursiv în C++Verifică dacă un caracter este cifră în C++Numărul de apariții al unui număr într-un vector în C++Cifra de control a unui numărAplicații cu ciurul lui Eratostene în C++: suma divizorilor, numărul divizorilorAl N-lea termen dintr-o progresie aritmeticăFuncții în C++. Ce sunt subprogrameleBordarea unei matrice în C++Instrucțiunea continue (structuri repetitive)Cel mai frecvent element dintr-un șir în C++Tipuri de date în C++: numere întregi, reale, caractere și alteleInstrucțiunea while (structuri repetitive)CMMMC a două numere în C++ (cel mai mic multiplu comun)Transformarea unui număr din baza 2 în baza 10 în C++Aria și circumferința unui cerc în C++Verificare număr prim în C++ (Clasa a IX-a)Maximul și minimul unui vector în C++Verifică dacă un caracter este literă în C++Generarea șirului Fibonacci generalizat în C++Prima cifră a unui număr în C++Verifică dacă un număr aparține șirului Fibonacci în C++Șirul lui Fibonacci în C++Cel mai mic număr cu suma cifrelor N în C++Sortare crescătoare recursivă în C++ - Merge sort și Bubble sortCitirea și afișarea matricelor în C++Oglinditul recursiv al unui număr în C++Radicalul unui număr în C++ (rădăcina pătrată)Indicatorul lui Euler al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Maximul și minimul a n valori în C++Cifra maximă și minimă a unui număr în C++Suma 1 + 2 + 3 + ... + N în C++Interclasarea a doi vectori în C++Instrucțiunea break (structuri repetitive)Cel mai puțin semnificativ bit în C++Copiuțe: Cifrele unui numărMaximul și minimul a trei valori în C++Distanța dintre două puncte în C++Do while vs while în C++ - Care e diferența?Verifică dacă trei puncte sunt coliniare C++Divide et Impera (metodă de programare C++)Indicatorul lui Euler în C++Verificare dacă șir de caractere este palindrom în C++Interschimbarea a două variabile în C++ (3 metode)Structuri repetitive (while, do while, for, etc)Calculul combinărilor de n luate câte k (nCk) în C++Pointer în C++. Variabile de tipul char * (char steluță)Cifra maximă a unui număr recursiv în C++Numărul minim de peroane pentru o gară în C++Suma divizorilor unui număr în C++Ciurul lui Eratostene în C++Inversarea unui șir de caractere în C++Funcții predefinite în C++ (matematice, șiruri de caractere)Rădăcina cubică a unui număr în C++ (cube root)Matrice pătratice în C++. Diagonala principală și secundarăCMMDC recursiv a două numere naturale în C++Numărul de cifre ale factorialului unui numărSuma numerelor naturale dintr-un interval dat în C++Cel mai semnificativ bit în C++Al N-lea termen dintr-o progresie geometricăTutorial instalare CodeBlocks (ușor) - Introducere în informatică C++Câte numere naturale sunt într-un interval dat? (C++)Oglinditul unui număr în C++Numărul de divizori al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Maximul și minimul a două valori în C++Cum să afișezi partea întreagă a unui număr real în C++Instrucțiunea for (structuri repetitive)Șiruri de caractere în C++. Tot ce trebuie să știiCombinatorică în C++: permutări, aranjamente, combinări și alteleVectorii în C++: citire și afișareRidicarea la putere în timp logaritmic în C++. Exponențiere rapidăAfișarea divizorilor primi ai unui număr în C++Cifrele unui număr. Prelucrarea cifrelor unui număr în C++Factorialul unui număr în C++Numărul combinărilor în C++ (formula combinărilor)Transformarea unei litere mari în literă mică în C++Numărul de divizori al unui număr în C++Suma divizorilor numerelor de la 1 la N (Folosind ciurul lui Eratostene)Suma elementelor unui vector recursiv în C++Ce este o funcție void în C++?Verifică dacă un număr este par sau impar fără modulo în C++Ce înseamnă endl în C++?Cum să calculezi instant 2 la puterea N în C++Căutare binară în C++Inversarea unui vector în C++Numărul permutărilor în C++ (formula permutărilor)Algoritm recursiv pentru căutare binară (clasa a X-a)

© Drepturi de autor

Echipa InfoAs își rezervă drepturile de autor pentru conținutul acestei pagini. Copierea conținutului fără acordul scris expres al InfoAs reprezintă o încălcare a Legii 8/1996 și va fi tratată ca atare.

Trimite lecția

Toată lecția

Doar videoclipul pe YouTube

Informatica devine ușoară cu InfoAs

Intră în cont