Sunteți pe pagina 1din 7

Lecii C++ - Structuri de Control Prelucrarea datelor se realizeaz cu ajutorul instruciunilor.

Instruciunea descrie un proces de prelucrare pe care un calculator l poate executa. Ordinea n care se execut instruciunile unui program definete aa-numita structur de control a programului. Structuri Secveniale Structura secvenial este o niruire de instruciuni, plasate una dup alta, n ordinea n care se dorete execuia acestora. Instruciunea vid nu are nici un efect. Se utilizeaz n construcii n care se cere prezena unei instruciuni, dar nu se execut nimic (de obicei, n instruciunile repetitive). ; // instructiune vida Instruciunea expresie este de forma: expresie; // exemplu b = a + 5; // unde a, b sunt doua variabile Instruciunea compus (instruciunea bloc). { declaratii; instr1; instr2; } Dup acolada care nchide blocul nu se pune niciodat semnul ;. Instruciunea bloc este utilizat n locurile n care este necesar prezena unei singure instruciuni, ns procesul de calcul este mai complex, deci trebuie descris n mai multe secvene. Acolo unde dorim ca execuia s nu mai fie secvenial, introducem structuri de control. Datele booleene nainte de a trece la structurile de control, s discutm puin despre datele booleene. Pentru a pune o ntrebare n C++, facem o presupunere care poate fi adevrat sau fals. Calculatorul evalueaz presupunearea pentru a constata dac este adevrat sau fals. n funcie de rezultatul obinut, acesta execut anumite instruciuni dorite. n C++ presupunerile iau forma expresiilor logice sau booleene. O astfel de expresie este alctuit din valori logice i operaii. Versiunile actuale ale limbajului de programare C++ includ un tip de dat numit bool al crui domeniu de valori este format din constantele literale true i false. Deoarece n versiunile mai vechi ale C++ acest tip de dat nu exista, valoarea true poate fi, de asemenea reprezentat, de orice valoare nenul (de obicei 1), iar false poate fi reprezentat de valoarea 0. bool Ok; Ok = true; Ok = 0; Ok = 1; Ok = false; Ok = 4; // tot true const bool checkOK = true; // etc. Valorile booleene false sunt tiprite n mod implicit ca valoare 0, iar valorile true sunt tiprite ca valoare 1. 1

Putem folosi manipulatorul boolalpha pentru a seta stream-ul de ieire ca s afieze valorile de tip bool prin irurile true i false. bool ok = true; cout << boolalpha << ok; // true Exemplu // modify boolalpha flag #include <iostream> using namespace std; int main () { bool b; b=true; cout << boolalpha << b << endl; cout << noboolalpha << b << endl; return 0; } Manipulatorii permit definirea formatelor pentru operaiile de intrare / ieire. Unei variabile booleene i poate fi asignat rezultatul comparrii a dou valori. bool maiMic; int i, j; cin >> i >> j; maiMic = ( i < j ); // parantezele sunt optionale aici Variabilei maiMic i se asigneaz true cnd i < j. n C++, rezultatul unei comparaii poate fi true sau false. Structura decizional: IF i ELSE if este folosit atunci cnd avei un cod care trebuie executat numai dac o anumit condiie este ndeplinit. E ca i cum i-ai nva programul s ia decizii. if (conditie) instructiune; Dac sunt mai multe instruciuni (un bloc de instruciuni) atunci trebuie obligatoriu s fie ntre acolade, altfel if va lua n considerare doar prima instruciune. Acelai principiu se aplic i la celelalte structuri (while, for, switch etc.). Deci dac rezultatul condiiei evaluate este TRUE atunci blocul if se execut. if (x == 100) cout << "x este 100"; Dac rezultatul condiiei este FALSE, i vrem s facem ceva atunci cnd este FALSE, putem folosi ramura else. if (x == 100) cout << "x este 100"; else cout << "x nu este 100"; Codul de mai sus s-ar traduce: Dac x este egal cu 100 atunci afieaz "x este 100", altfel afieaz "x nu este 100". De asemenea poi avea mai multe ramuri else. if (x > 0) cout << "x este pozitiv"; else if (x < 0) cout << "x este negativ"; else cout << "x este 0"; 2

Avantajul este c atunci cnd una din ramuri este executat (fie c-i if sau un else), celelalte nu mai sunt evaluate. n exemplul de mai sus dac x este pozitiv celelate ramuri nu vor mai fi executate i se va trece mai departe n program. Putem spune c toate if-urile sunt evaluate, dar NU putem spune acelai lucru despre else. Nu exist restricii asupra tipului de instruciuni pe care le poate conine o ramur a unui if. Prin urmare, o ramur a unui if poate conine un alt if. Cnd folosim o astfel de construcie, spunem c am creat o structur de if imbricat. if(conditie2) { if(conditie2) { // ... } else { // ... } } else { if(conditie3) if(conditie4) ; // vida else // ramura else a celui de-al doilea if; vezi explicatia de mai jos ; // vida } Imbricarea este valabil i pentru celelalte structuri de control. Cum tim crui if i aparine un else? O regul din C++ spune c, n absena acoladelor, un else este asociat ntotdeauna instruciunii if cea mai apropiat care nu are nc un else drept pereche. Pentru o soluie corect, plasm cel de-al doilea if ntr-un bloc de instruciuni. // ... else { if(conditie3) { if(conditie4) ; // vida } else // ramura else a primului if ; // vida } Perechea de acolade indic faptul c cea de-a doua instruciune if este complet, iar else trebuie s aparin primului if. Structuri iterative / Bucle (loops) O bucl este o structur de control care provoac executarea unei instruciuni sau a unei secvene de instruciuni n mod repetat. Instruciunile se execut atta timp ct sunt ndeplinite una sau mai multe condiii. Structura While while (conditie) instructiune; Repet instruciunile din blocul su ct timp condiia este TRUE. 3

Instruciunea (instruciunile) care se execut n mod repetat se numete corpul buclei. Exemplu: #include <iostream> using namespace std; int main () { int n; cout << "Introduceti un numar: "; cin >> n; // cin - citeste de la tastatura (asteapta ca user-ul sa introduca ceva) while (n>0) { cout << n << ", "; --n; } cout << "BOOOM!\n"; return 0; } // Se afiseaza / Output Introduceti un numar: 5 5, 4, 3, 2, 1, BOOOM! // sa zicem ca introduci 5

Cum funcioneaz? S vedem... 1. Userul introduce un numr. 2. Condiia while este verificat (evaluat): * condiia este TRUE: se execut blocul while. * condiia este FALSE: blocul while este ignorat, se trece la pasul 4. 3. Se ajunge la sfritul blocului: sari la pasul 2. 4. Continu execuia dup blocul while. Observai c exist riscul ca while s ruleze la infinit dac expresia condiie este TRUE mereu. Avei grij s nu se ntmple asta! while (1) ; // while infinit si nicio instructiune (instructiune vida) // 1 va fi intotdeauna 1, deci TRUE ; cu 0 nu merge, 0 este considerat FALSE; restul constantelor sunt TRUE O bucl din care programul nu poate iei deloc se numete bucl infinit. Structura Do While do instructiune while (conditie); // aici se pune (;) Este la fel ca while numai c instruciunea/ile va/vor fi executat/e cel puin o dat! La while nu exist posibilitatea asta deoarece condiia este evaluat de prima dat i dac este FALSE atunci while nu este executat. Aici la do while condiia este evaluat la sfrit, deci instruciunea va fi executat cel puint o dat. Structura For for (initializare; conditie; increment) instructiune; Repet un bloc de instruciuni de un anumit numr de ori. Mod de execuie: 1. initializarea este executat. Este o variabil iniializat cu o anumit valoare. Acest pas se execut doar o dat. 4

2. conditia este verificat. Dac e TRUE atunci loop-ul continu, altfel for se termin i se trece mai departe n program. 3. instructiunile sunt executate. 4. increment este executat apoi se trece la pasul 2. #include <iostream> using namespace std; int main () { for (int n=10; n>0; n--) { cout << n << ", "; } cout << "BOOM!\n"; return 0; } // Output 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, BOOM! Toate cele trei cmpuri: initializare, conditie, increment pot lipsi, dar (;) dintre ele NU ! for( ; ; ) ; // for infinit cu instructiune vida Instruciuni de salt - Instruciunea break break ntrerupe orice iteraie (loop) chiar dac nu a ajuns la sfrit sau condiia nu este FALSE. #include <iostream> using namespace std; int main () { int n; for (n=10; n>0; n--) { cout << n << ", "; if (n==3) { cout << "bomba dezamorsata!"; break; // aici se intrerupe } } return 0; } // Output 10, 9, 8, 7, 6, 5, 4, 3, bomba dezamorsata! Intruciunea continue continue sare direct la condiia iteraiei, ignornd restul codului din bloc. #include <iostream> using namespace std; int main () { for (int n=10; n>0; n--) { 5

if (n==5) continue; // orice este dupa "continue" nu va fi executat; programul sare la conditia loopului cout << n << ", "; } cout << "BOOM!\n"; return 0; } // Output 10, 9, 8, 7, 6, 4, 3, 2, 1, BOOM! // 5 lipseste !!!

Instruciunea goto goto realizeaz un salt absolut n program. Destinaia este identificat printr-un label (un identificator/nume urmat de : ). Un exemplu v va face s nelegei mai bine: #include <iostream> using namespace std; int main () { int n=10; loop: // label pentru goto cout << n << ", "; n--; if (n>0) goto loop; // sari la loop: cout << "BOOM!\n"; return 0; } // Output 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, BOOM! Structura selectiv Switch Un fel de if...else, dar mult mai elegant. switch (expresie) { case constanta1: intructiuni1; break; case constanta2: instructiuni2; break; . . . default: instructiunile default/implicite; } Funcioneaz n felul urmtor: Se evalueaz expresia, iar rezultatul este comparat cu fiecare caz. 6

Dac se gsete un caz ce corespunde cu rezultatul expresiei, atunci instruciunile acelui caz vor fi executate, apoi switch va fi ntrerupt (de aia se afl break). Fr break programul va continua s evalueze cazuri pn cnd gasete un break sau switch ajunge la sfrit. Dac nu se gsete niciun caz satisfctor atunci, dac exist (poate lipsi; opional), se execut default. switch (x) { case 1: case 2: case 3: cout << "x este 1, 2 sau 3"; break; default: cout << "x nu este 1, 2 si nici 3"; } Un mic exerciiu pentru voi: Scriei echivalentul n if...else al acestui switch. La case NU putei avea variabile, doar constante! Fluxul de intrari / iesiri in limbajul C++ Fluxul de iesire cout in C++ Fluxul de iesire cout redirecteaza iesirile, scrierile, catre fisierul standard de iesire, stdout, asociat, de cele mai multe ori, monitorului de afisaj. Sintaxa generala de apel este de forma: cout << exp1[<<exp2][<<expn][<<endl]; unde: expi (i=1..n) pot fi literali, constante, variabile, functii sau expresii de tipuri valide in limbajul C++; utilizarea cuvantului cheie endl, optionala, realizeaza pozitionarea prompterului de ecran pe inceputul randului urmator.

Fluxul de intrare cin in C++ Fluxul de intrare cin redirecteaza intrarile, citirile, catre fisierul standard de intrare, stdin, asociat, de cele mai multe ori, tastaturii. Sintaxa generala de apel este de forma: cin >> v1[>>v2][>>vn]; unde: vi (i=1..n) sunt variabile de tipuri valide in limbajului C++; variabilele vi pot fi de tip int, float, double, char sau tipuri derivate ale acestora; fluxul cin se poate utiliza pentru citirea mai multor variabile, de pe aceeasi linie.

Evaluare