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.
Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.
Meniu shortcuturi | ? |
Căutare probleme sau utilizatori | / |
Navigare printre rezultatele căutării | ↑, ↓ |
Meniu de contact și feedback | CTRL + Shift + F |
Ieșire din meniuri | Esc |
Setări editor | CTRL + Shift + S |
Schimbare stil editor | CTRL + Shift + E |
Șabloane de cod | CTRL + Shift + 1/2/3 |
Golire editor | CTRL + Shift + 4 |
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:
5
, atunci trece clasa (altfel, dacă are media mai mică decât 5
, atunci nu trece clasa);10
lei, atunci din contul lui bancar vor fi scoși 10
lei.Pentru a rezolva această necesitate, s-au creat structurile de decizie, deseori numite și structuri alternative.
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++.
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ț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 =
)a
este egal cu b
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)
a
este diferit de b
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))
condiția
este falsă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)
condiție1
și condiție2
sunt adevărateif(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)
condiție1
sau condiție2
sunt adevărateif(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
), saum == 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
.
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
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.
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";}
if
pe trei ramuriMomentan 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";
Iată câteva erori tipice care pot apărea:
;
) după condiție: if(condiție);
nu va executa instrucțiunile;;
) după acolade: };
este greșit;if
.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.
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;
}
switch
Se verifică egalitatea dintre valoare
cu fiecare dintre valorile comparate: valoareComparata1
, valoareComparata2
, …. Există două cazuri:
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
, ….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.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;
}
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
.
Iată câteva aplicații, împreună cu rezolvări.
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;
}
}
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";
}
}
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";
}
# | 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. |