vineri, 7 iunie 2013

Tutorial C++: Booleeni şi Structuri de Control

Tipul boolean

Tipul boolean sau tipul de dată logic este tipul ce are două valori: true şi false.
Acest tip este folosit în contextele booleene, acolo unde expresia este evaluată* la true sau false. De exemplu, în condiţia de la if sau while.
O variabilă de tip bool se declară normal, ca orice variabilă:

bool x = true;
În contextele booleene din C/C++, valorile pozitive sunt evaluate la true, iar ZERO este evaluat la false.
De exemplu:
if (1) cout << "TRUE";
Se va afişa mesajul TRUE deoarece 1 este interpretat ca fiind true.

Operatorii care returnează un rezultat booleean sunt operatorii relaţionali şi operatorii logici.
Operatorii relaţionali sunt:

< // Mai mic
<= // Mai mic sau egal
== // Egal
!= // Diferit
> // Mai mare
>= // Mai mare sau eagl
În general sunt folosiţi cu numere (întregi, reali), dar veţi vedea că pot fi definiţi şi pentru alte tipuri.
Opeatorii logici sunt:
&& // AND - SI LOGIC
|| // OR - SAU LOGIC
! // NOT - NEGATIE LOGICA
Operatorul AND returnează true dacă ambii operanzi sunt true.
Operatorul OR returnează true dacă cel puţin unul dintre operanzi este true.
Operatorul NOT inversează valoarea booleană a expresiei, variabilei, etc.
C++ foloseşte evaluarea scurtă.
Pentru AND: Dacă primul operand este false atunci întreaga expresie este false; nu se mai evaluează operandul al doilea.
Pentru OR: Dacă primul operand este true atunci întreaga expresie este true; nu se mai evaluează operandul al doilea.
Dintre aceşti operatori, NOT are prioritatea cea mai mare, urmat de operatorii relaţionali, apoi (în această ordine) AND şi OR.
Tabelul cu precedenţa operatorilor.

Structuri decizionale

Instrucţiunea if permite execuţia unei porţiuni de cod* doar dacă o anumită condiţie este îndeplinită. Condiţia este dată de programator.

#include <iostream>
using namespace std;

int main()
{
    int a = 4;
    if (a >= 4) {
        cout << "Hi!";
    } else {
        cout << "Bye!";
    }
    return 0;
}
Se va afişa if deoarece variabila a memorează 4, iar 4 este mai mare sau egal cu 4.
Ramura else este executată atunci când condiţia de la if nu este îndeplinită. Dacă if se execută atunci programul ignoră ramura else.
În cazul unei singure instrucţiuni (valabil pentru toate structurile de control) acoladele pot lipsi.
După else poate urma un alt if, şi un altul, până când cascada de if else se termină în else sau nu se termină în nimic, deoarece else este opţional.
#include <iostream>
using namespace std;

int main()
{
    double nr;
    cin >> nr;
    if (nr >= 2) {
        cout << "Ai introdus un numar mai mare sau egal cu 2.";
    } else if (nr < 0) {
        cout << "Ai introdus un numar negativ";
    } else {
        cout << "Ai introdus un numar din intervalul [0, 2)";
    }
    return 0;
}
Aici, ultimul else este executat numai dacă ramurile superioare nu sunt executate.
Condiţia de la if (ca şi la celelalte structuri) poate fi orice: constantă, variabile, expresie, orice se poate evalua la true sau false.
Mod de funcţionare if:
  1. Se evaluează condiţia. Dacă este true se trece la pasul următor; dacă este false se trece la pasul 3.
  2. Se execută codul din blocul if (dintre acolade) şi se trece la pasul 4.
  3. Se execută ramura else şi se trece la pasul 4.
  4. Se iese din if şi se continuă execuţia programului.

Instrucţiunea switch este, într-un fel, similară cu if. Permite execuţia anumitor instrucţiuni în funcţie de rezultatul unei expresii, variabile, etc.

#include <iostream>
using namespace std;

int main()
{
    int nr;
    cin >> nr;
    switch(nr)
    {
        case 1: cout << "Ai introdus 1"; break;
        case 2: cout << "Ai introdus 2"; break;
        default: cout << "Ai introdus un numar diferit de 1 si 2"; break;
    }
    return 0;
}
Instrucţiunea switch compară rezultatul expresiei dintre paranteze (aici este variabila nr) cu fiecare caz şi-l execută atunci când găseşte o potrivire.
Expresiile de la case trebuie să fie constante.
Fără break, switch ar evalua în continuare celelalte cazuri chiar dacă l-ar găsi pe cel potrivit.
Omiterea instrucţiunii break nu generează o eroare, deoarece este opţional.
Ultimul caz, default (implicit), se execută atunci când nu există potriviri cu celelalte cazuri.
Un exemplu care arată cum puteţi valorifica lipsa break-ului:
#include <iostream>
using namespace std;

int main()
{
    int nr;
    cin >> nr;
    switch(nr)
    {
        case 1: case 2: case 3: case 4: case 5: case 6: case 7:
            cout << "Ai introdus ziua a " << nr << "-a"; break;
        default:
            cout << "Te rog sa introduci numarul valid al unei zile";
    }
    return 0;
}
Să zicem că nr este 2. Se execută cazul 2, apoi, deoarece nu există break, se trece la 3, apoi la 4, ... până la 7 unde există break şi se iese din switch.

Structuri iterative - Bucle - Loop-uri

Instrucţiunea while repetă o porţiune de cod până când condiţia devine falsă. Dacă condiţia nu devine falsă la un moment dat, while va continua să ruleze (până când programul este oprit forţat de programator / user).

#include <iostream>
using namespace std;

int main()
{
    int nr;
    cout << "Ca sa inchizi programul scrie 0.\n";
    cin >> nr;
    while (nr != 0) { // Cat timp nr nu este 0
        cout << nr * 2 << '\n';
        cin >> nr;
    }
    return 0;
}
Condiţia de la while, în acest exemplu, este nr != 0.
Atunci când folosim loopuri trebuie să ne asigurăm că aceste condiţii vor deveni false în cele din urmă, ca să evităm repetiţiile infinite.
În exemplul meu, decizia de a opri programul (care în fond înseamnă oprirea iteraţiei) îi aparţine utilizatorului, prin acel cin >> nr; din while.
Mod de funcţionare while:
  1. Se evaluează condiţia. Dacă este true se trece la pasul următor. Dacă este false se trece la pasul 4.
  2. Se execută codul din blocul while (dintre acolade).
  3. Se trece la pasul 1.
  4. Se iese din while şi se continuă execuţia programului.

O variaţie a structurii while este do { } while(conditie); Spre deosebire de while, codul în do while este executat cel puţin o dată indiferent de condiţie.

#include <iostream>
using namespace std;

int main()
{
    bool conditie = false;
    do {
        cout << "In while :)";
    } while (conditie);
    return 0;
}
Se va afişa In while :) deoarece evaluarea se face la final.
Observaţi ; după while. Este obligatoriu.

Instrucţiunea for repetă de un anumit număr de ori o porţiune de cod.

#include <iostream>
using namespace std;

int main()
{
    for (int i = 1; i <= 10; i++) {
        cout << i << ' ';
    }
    return 0;
}
Se va afişa: 1 2 3 4 5 6 7 8 9 10.
for (initializare; conditie; incrementare)
Instrucţiunea for are trei părţi:
  • La iniţializare se declară (şi se iniţializează) variabila (sau variabilele) contor (folosită la numărat).
  • La conditie avem o expresie de terminare a iteraţiei.
  • La incrementare (sau decrementare) variabila contor este modificată astfel încât condiţia să poată deveni la un moment dat falsă.
Toate cele trei părţi sunt opţionale. Nu este obligatoriu să declaraţi variabila contor în for, deşi dacă o declaraţi acolo, ea va fi vizibilă numai în blocul for.
#include <iostream>
using namespace std;

int main()
{
    for (int i = 10; i > 0; i-=2) {
        cout << i << ' ';
    }
    return 0;
}
Se va afişa: 10 8 6 4 2. Mod de funcţionare:
  1. Se iniţializează variabilele (Această parte se execută o singură dată).
  2. Se evaluează condiţia. Dacă este true se trece pasul următor. Dacă este false se trece la pasul 5.
  3. Se execută codul din blocul for.
  4. Se execută instrucţiunea de la incrementare.
  5. Se iese din for şi se continuă execuţia programului.

Prin cod se înţelege o instrucţiune sau grup de instrucţiuni.
A evalua este echivalent cu a executa.

Niciun comentariu:

Trimiteți un comentariu

Rețineți: Numai membrii acestui blog pot posta comentarii.