Instrucțiuni C++ / Structuri alternative


Editat de Candale Silviu (silviu) la data 2015-09-20

În anumite situații, este necesară executarea unor instrucțiuni în cadrul unui program numai în anumite condiții. Numite și structuri de decizie, structurile alternative permit rezolvarea unor asemenea situații.

Instrucțiunea if

Instrucțiunea if este cea mai utilizată structură alternativă.

Sintaxa ei are două forme:

Varianta 1

if ( Expresie ) Instrucțiune1;
else Instrucțiune2;

Varianta 2

if ( Expresie ) Instrucțiune1;

Mod de execuție:

Instrucțiunea if se execută în felul următor:

  • se evaluează Expresia
  • dacă valoarea ei este nenulă
    • se execută Instrucțiune1;
    • se continuă cu instrucțiunea care urmează după if
  • dacă valoare expresiei este nulă
    • dacă există clauza else
      • se execută Instrucțiune2;
      • se continuă cu instrucțiunea care urmează după if
    • dacă nu există clauza else, se continuă cu instrucțiunea care urmează după if

Observații:

  • Varianta 2 (fără clauza else) a instrucțiunii if este echivalentă cu următoarea, în care Instructiune2; este o instrucțiune vidă:

    if ( Expresie ) Instrucțiune1;
    else ;

  • Instrucțiune1; se execută numai dacă Expresie este nenulă (condiție adevărată). Instrucțiune2; se execută numai dacă Expresie este nulă (condiție falsă). În nicio situație nu se execută ambele instrucțiuni!
  • Instrucțiune1; și Instrucțiune2; pot fi orice fel de instrucțiuni, inclusiv instrucțiunea vidă și inclusiv o altă instrucțiune if.
  • Dacă logica programului o cere, Instrucțiune1; și/sau Instrucțiune2; pot fi instrucțiuni compuse, care să conțină mai multe instrucțiuni.
  • if testează valoarea numerică pentru Expresie, nu valoarea de adevăr. De aceea, scrierile:
    if(Expresie) ...
    și
    if(Expresie != 0) ...
    sunt echivalente. La fel și scrierile:
    if(! Expresie) ...
    și
    if(Expresie == 0) ...

Exemple:

Următoarea secvență decide dacă un număr întreg citi este par sau nu:

int x;
cin >> x;
if(x % 2 == 0)
    cout << x << " este par";
else
    cout << x << " este impar";

Următoarea secvență citește două numere n m și stabilește dacă m este divizor al lui n, tratând cazul m=0. Este un exemplu de instrucțiuni if imbricate (una în alta).

int n , m;
cin >> n >> m;
if(m == 0)
    cout <<"nu putem imparti la zero!";
else
    if(n % m == 0)
        cout << m << " divide pe " << n << endl;
    else
        cout << m << " nu divide pe " << n << endl;

Următoarea secvență testează egalitatea cu 0 a unei expresii în forma scurtă, fără a folosi operatorii de egalitate:

if( n )
    cout << n << " nenul";
else
    cout << n << " este nul";

Instrucțiunea switch

Instrucțiunea switch permite executarea unor instrucțiuni, în funcție de egalitatea unei expresii cu anumite valori numerice constante:

Sintaxa:

switch ( Expresie )
{ case Constanta_1: Grup_Instructiuni_1; break; case Constanta_2: Grup_Instructiuni_2; break;case Constanta_N: Grup_Instructiuni_N; break; default: Grup_Instructiuni_default; break;
}

Mod de execuție:

  • se evaluează Expresie
  • dacă valoarea expresiei este egală cu una dintre valorile constante din clauzele case, se execută instrucțiunile din grupul de instrucțiuni corespunzător, apoi se trece la instrucțiunea de după switch
  • dacă valoarea expresiei nu este egală cu niciuna dintre valorile constante din clauzele case, se verifică existența clausei default;
    • dacă există clauza default, se execută instrucțiunile din grupul de instrucțiuni corespunzător clauzei default, apoi se trece la instrucțiunea de după switch
    • dacă nu există clauza default, se trece la instrucțiunea de după switch

Observații:

  • Valorile din clauzele case trebuie să fie constante întregi.
  • În fiecare grup de instrucțiuni pot să apară oricâte instrucțiuni, de orice tip, eventual niciuna. Nu este necesară utilizarea instrucțiunii compuse.
  • Prezență instrucțiunii break; nu este obligatorie, dar lipsa ei modifică modul de execuție al instrucțiunii. În exemplul de mai jos:
switch(n)
{
    case 1:
        cout << "n = 1\n";
    case 2:
        cout << "n = 2\n";
        break;
    case 3:
        cout << "n = 3\n";
        break;
}

dacă valoarea lui n este 1, se va afișa:

n = 1
n = 2

Mai exact, se execută toate instrucțiunile de la clauza case corespunzătoare valorii expresiei până la prima instrucțiune break; întâlnită.

Exemple:

În exemplul de mai jos se afișează (aproximativ) numele zilei din săptămână în funcție de numărul ei.

#include <iostream>
using namespace std;
int main(){
    int zi;
    cin >> zi;
    switch(zi)
    {
        case 1:
            cout << "Luni\n"; break;
        case 2:
            cout << "Marti\n"; break;
        case 3:
            cout << "Miercuri\n"; break;
        case 4:
            cout << "Joi\n"; break;
        case 5:
            cout << "Vineri\n"; break;
        case 6:
        case 7:
            cout << "WEEKEND!!!\n"; break;
        default:
            cout << "Numarul zilei este incorect\n"; break;
    }
    return 0;
}

Observați mai sus că în clauza case 6: nu avem instrucțiuni. Dacă variabila zi are valoarea 6 sau 7 se va afișa:

WEEKEND!!!

Fișiere atașate


Vezi și: