Structura alternativă
Autor: Ștefan-Cosmin Dăscălescu
Cunoștințe necesare
Introducere și instrucțiunile if..else, respectiv switch-case#
De multe ori, se impune luarea unor decizii diferite în funcție de situație. Vrem să obținem același lucru și în programare, iar limbajul C++ are diverse opțiuni pentru realizarea acestui lucru.
Definiție
O structură alternativă este o structură pe care o folosim pentru a coordona programul să ia decizii diferite în funcție de rezultatul unei expresii logice.
În limbajul C++, structura alternativă este reprezentată de blocul if..else, astfel încât putem să direcționăm programul în funcție de rezultatele expresiilor logice menționate.
Pe lângă if..else, există și instrucțiunea switch-case, care funcționează într-o manieră similară, trecând prin fiecare caz pe rând fără a mai fi nevoie de if-uri și else-uri
Mai jos, găsiți un exemplu pentru aplicarea acestei instrucțiuni.
În mod particular, instrucțiunea if (n)
verifică dacă \(n\) are o valoare nenulă.
Operatori de comparație#
Pentru a compara două valori sau expresii, putem folosi operatorii obișnuiți de comparație de la matematică, cu mici ajustări.
Astfel, operatorii de comparație sunt următorii:
==
- verifică prima expresie are o valoare mai egală cu cea de-a doua expresie.<=
- verifică dacă prima expresie are o valoare mai mică sau egală decât cea de-a doua expresie.>=
- verifică dacă prima expresie are o valoare mai mare sau egală decât cea de-a doua expresie.>
- verifică dacă prima expresie are o valoare strict mai mare decât cea de-a doua expresie.<
- - verifică dacă prima expresie are o valoare strict mai mică decât cea de-a doua expresie.!=
- verifică dacă cele două expresii au o valoare diferită.
Observație
În mod particular, se observă că trebuie două semne de egalitate, o instrucțiune de tipul if (n = 5)
atribuie mai întâi valoarea \(5\) lui \(n\), iar mai apoi verifică dacă \(n\) este diferit de \(0\).
Operatori logici#
De cele mai multe ori, veți vedea că expresiile logice apar grupate folosind operatorii logici. Operatorii logici sunt de trei feluri, după cum urmează:
- Negația - notată cu
!
, inversează valoarea de adevăr a unei expresii.
int x = 10;
cout << !(x == 10); // 0: x == 10 este adevărat (1), 1 negat este 0
cout << !x == 10; // tot 0, dar se efectuează mai întâi !x, adică !10, cu rezultat 0, apoi 0 == 10, cu rezultat fals, adică 0
cout << !(x < 5); // 1: x < 5 este fals, adică 0, 0 negat este 1
- Conjuncția - notată cu
&&
, reprezintă compunerea a două sau mai multe expresii prin operatorul ȘI, cu alte cuvinte, pentru ca o expresie compusă să fie adevărată, toți membrii ei trebuie să fie adevărați, altfel, întreaga expresie este falsă.
cout << (1 < 2 && 2 == 1 + 1); // 1; ADEVĂRAT ȘI ADEVĂRAT este ADEVĂRAT
cout << (1 < 2 && 2 != 1 + 1); // 0; ADEVĂRAT ȘI FALS este FALS
cout << (1 == 2 && 2 == 1 + 1); // 0; FALS ȘI ADEVĂRAT este FALS
cout << (1 == 2 && 2 != 1 + 1); // 0; FALS ȘI FALS este FALS
- Disjuncția - notată cu
||
, reprezintă compunerea a două sau mai multe expresii prin operatorul SAU, cu alte cuvinte, pentru ca o expresie compusă să fie adevărată, cel puțin unul dintre membrii ei trebuie să fie adevărați, altfel, întreaga expresie este falsă.
cout << (1 < 2 || 2 == 1 + 1); // 1; ADEVĂRAT SAU ADEVĂRAT este ADEVĂRAT
cout << (1 < 2 || 2 != 1 + 1); // 1; ADEVĂRAT SAU FALS este ADEVĂRAT
cout << (1 == 2 || 2 == 1 + 1); // 1; FALS SAU ADEVĂRAT este ADEVĂRAT
cout << (1 == 2 || 2 != 1 + 1); // 0; FALS SAU FALS este FALS
Exemplu#
Mai jos puteți găsi un asemenea exemplu, în care rezolvăm problema cumparaturi1 de pe pbinfo folosind diverse if-uri și else-uri. O soluție alternativă folosește switch-case.
#include <iostream>
using namespace std;
int main() {
int s, c, n;
cin >> s >> c >> n;
if (s % n == 0 && s % c == 0) { // daca ambele conditii sunt indeplinite
cout << "CN" << '\n';
}
else {
if (s % n == 0) { // daca prima conditie este indeplinita
cout << "N" << '\n';
}
else {
if (s % c == 0) { // daca cea de-a doua conditie este indeplinita
cout << "C" << '\n';
}
else { // daca nicio conditie nu este indeplinita
cout << "nimic" << '\n';
}
}
}
return 0;
}
#include <iostream>
using namespace std;
int main() {
int s, c, n;
cin >> s >> c >> n;
// Combinam conditia intr-o singura valoare
int condition = (s % n == 0) * 1 + (s % c == 0) * 2;
switch (condition) {
case 3: // daca ambele conditii sunt indeplinite (s % n == 0 && s % c == 0)
cout << "CN" << '\n';
break;
case 1: // daca prima conditie este indeplinita (s % n == 0)
cout << "N" << '\n';
break;
case 2: // daca cea de-a doua conditie este indeplinita (s % c == 0)
cout << "C" << '\n';
break;
default: // daca nicio conditie nu este indeplinita
cout << "nimic" << '\n';
break;
}
return 0;
}
Concluzii#
Odată cu învățarea structurii alternative, putem acum să incorporăm structuri repetitive, așa cum puteți vedea în articolele ulterioare.