Tutoriale C

10
Lecții C++ - Structuri de Control Prelucrarea datelor se realizează cu ajutorul instrucţiunilor. Instrucţiunea descrie un proces de prelucrare pe care un calculator îl poate executa. Ordinea în care se execută instrucţiunile unui program defineşte aşa-numita structură de control a programului. Structuri Secvenţiale Structura secvenţială este o înşiruire de instrucţiuni, plasate una după alta, în ordinea în care se doreşte execuţia acestora. Instrucţiunea vidă nu are nici un efect. Se utilizează în construcţii în care se cere prezenţa unei instrucţiuni, dar nu se execută nimic (de obicei, în instrucţiunile repetitive). ; // instructiune vida Instrucţiunea expresie este de forma: expresie; // exemplu b = a + 5; // unde a, b sunt doua variabile Instrucţiunea compusă (instrucţiunea bloc). { declaratii; instr1; instr2; } După acolada care închide blocul nu se pune niciodată semnul ;. Instrucţiunea bloc este utilizată în locurile în care este necesară prezenţa unei singure instrucţiuni, însă procesul de calcul este mai complex, deci trebuie descris în mai multe secvenţe. Acolo unde dorim ca execuţia să nu mai fie secvenţială, introducem structuri de control. Datele booleene Înainte de a trece la structurile de control, să discutăm puţin despre datele booleene. Pentru a pune o întrebare în C++, facem o presupunere care poate fi adevărată sau falsă. Calculatorul evaluează presupunearea pentru a constata dacă este adevărată sau falsă. În funcţie de rezultatul obţinut, acesta execută anumite instrucţiuni dorite. În C++ presupunerile iau forma expresiilor logice sau booleene. O astfel de expresie este alcătuită din valori logice şi operaţii. Versiunile actuale ale limbajului de programare C++ includ un tip de dată numit bool al cărui domeniu de valori este format din constantele literale true şi false. 1

description

c**

Transcript of Tutoriale C

Page 1: Tutoriale C

Lecții C++ - Structuri de Control

Prelucrarea datelor se realizează cu ajutorul instrucţiunilor. Instrucţiunea descrie un proces de prelucrare pe care un calculator îl poate executa.Ordinea în care se execută instrucţiunile unui program defineşte aşa-numita structură de control a programului.

Structuri Secvenţiale

Structura secvenţială este o înşiruire de instrucţiuni, plasate una după alta, în ordinea în care se doreşte execuţia acestora.Instrucţiunea vidă nu are nici un efect. Se utilizează în construcţii în care se cere prezenţa unei instrucţiuni, dar nu se execută nimic (de obicei, în instrucţiunile repetitive). ; // instructiune vidaInstrucţiunea expresie este de forma: expresie;// exemplub = a + 5; // unde a, b sunt doua variabileInstrucţiunea compusă (instrucţiunea bloc). { declaratii; instr1; instr2;}După acolada care închide blocul nu se pune niciodată semnul ;. Instrucţiunea bloc este utilizată în locurile în care este necesară prezenţa unei singure instrucţiuni, însă procesul de calcul este mai complex, deci trebuie descris în mai multe secvenţe.Acolo unde dorim ca execuţia să nu mai fie secvenţială, introducem structuri de control.

Datele booleene

Înainte de a trece la structurile de control, să discutăm puţin despre datele booleene. Pentru a pune o întrebare în C++, facem o presupunere care poate fi adevărată sau falsă. Calculatorul evaluează presupunearea pentru a constata dacă este adevărată sau falsă. În funcţie de rezultatul obţinut, acesta execută anumite instrucţiuni dorite. În C++ presupunerile iau forma expresiilor logice sau booleene. O astfel de expresie este alcătuită din valori logice şi operaţii. Versiunile actuale ale limbajului de programare C++ includ un tip de dată numit bool al cărui 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 trueconst bool checkOK = true;// etc.Valorile booleene false sunt tipărite în mod implicit ca valoare 0, iar valorile true sunt tipărite ca valoare 1.

1

Page 2: Tutoriale C

Putem folosi manipulatorul boolalpha pentru a seta stream-ul de ieşire ca să afişeze 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 operaţiile de intrare / ieşire.

Unei variabile booleene îi poate fi asignat rezultatul comparării a două valori. bool maiMic;int i, j;cin >> i >> j;maiMic = ( i < j ); // parantezele sunt optionale aiciVariabilei maiMic i se asignează true când i < j. În C++, rezultatul unei comparaţii poate fi true sau false.

Structura decizională: IF şi ELSE

if este folosit atunci când aveţi un cod care trebuie executat numai dacă o anumită condiţie este îndeplinită. E ca şi cum ţi-ai învăţa programul să ia decizii. if (conditie) instructiune;Dacă sunt mai multe instrucţiuni (un bloc de instrucţiuni) atunci trebuie obligatoriu să fie între acolade, altfel if va lua în considerare doar prima instrucţiune. Acelaşi principiu se aplică şi la celelalte structuri (while, for, switch etc.).Deci dacă rezultatul condiţiei evaluate este TRUE atunci blocul if se execută. if (x == 100) cout << "x este 100";Dacă rezultatul condiţiei este FALSE, şi vrem să facem ceva atunci când 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 afişează "x este 100", altfel afişează "x nu este 100".De asemenea poţi 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

Page 3: Tutoriale C

Avantajul este că atunci când 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 acelaşi lucru despre else.Nu există restricţii asupra tipului de instrucţiuni pe care le poate conţine o ramură a unui if. Prin urmare, o ramură a unui if poate conţine un alt if. Când folosim o astfel de construcţie, 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 cărui if îi aparţine un else? O regulă din C++ spune că, în absenţa acoladelor, un else este asociat întotdeauna instrucţiunii if cea mai apropiată care nu are încă un else drept pereche. Pentru o soluţie corectă, plasăm cel de-al doilea if într-un bloc de instrucţiuni. // ...else{ if(conditie3) { if(conditie4) ; // vida } else // ramura else a primului if ; // vida}Perechea de acolade indică faptul că cea de-a doua instrucţiune if este completă, iar else trebuie să aparţină primului if.

Structuri iterative / Bucle (loops)

O buclă este o structură de control care provoacă executarea unei instrucţiuni sau a unei secvenţe de instrucţiuni în mod repetat. Instrucţiunile se execută atâta timp cât sunt îndeplinite una sau mai multe condiţii.

Structura Whilewhile (conditie) instructiune;

Repetă instrucţiunile din blocul său cât timp condiţia este TRUE.

3

Page 4: Tutoriale C

Instrucţiunea (instrucţiunile) care se execută în mod repetat se numeşte 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 / OutputIntroduceti un numar: 5 // sa zicem ca introduci 55, 4, 3, 2, 1, BOOOM!

Cum funcţionează? Să vedem...1. Userul introduce un număr.2. Condiţia while este verificată (evaluată):* condiţia este TRUE: se execută blocul while.* condiţia este FALSE: blocul while este ignorat, se trece la pasul 4.3. Se ajunge la sfârşitul blocului: sari la pasul 2.4. Continuă execuţia după blocul while.Observaţi că există riscul ca while să ruleze la infinit dacă expresia condiţie este TRUE mereu. Aveţi grijă să nu se întâmple 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 TRUEO buclă din care programul nu poate ieşi deloc se numeşte buclă infinită.

Structura Do – While

do instructiune while (conditie); // aici se pune (;)

Este la fel ca while numai că instrucţiunea/ile va/vor fi executată/e cel puţin o dată!La while nu există posibilitatea asta deoarece condiţia este evaluată de prima dată şi dacă este FALSE atunci while nu este executat. Aici la do while condiţia este evaluată la sfârşit, deci instrucţiunea va fi executată cel puţint o dată.

Structura For

for (initializare; conditie; increment) instructiune;

Repetă un bloc de instrucţiuni de un anumit număr de ori. Mod de execuţie: 1. initializarea este executată. Este o variabilă iniţializată cu o anumită valoare. Acest pas se execută doar o dată.

4

Page 5: Tutoriale C

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;}

// Output10, 9, 8, 7, 6, 5, 4, 3, 2, 1, BOOM!Toate cele trei câmpuri: initializare, conditie, increment pot lipsi, dar (;) dintre ele NU ! for( ; ; ) ; // for infinit cu instructiune vida

Instrucţiuni de salt - Instrucţiunea break

break întrerupe orice iteraţie (loop) chiar dacă nu a ajuns la sfârşit sau condiţia 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;}

// Output10, 9, 8, 7, 6, 5, 4, 3, bomba dezamorsata!

Intrucţiunea continue

continue sare direct la condiţia iteraţiei, ignorând restul codului din bloc. #include <iostream>using namespace std;

int main (){ for (int n=10; n>0; n--) {

5

Page 6: Tutoriale C

if (n==5) continue; // orice este dupa "continue" nu va fi executat; programul sare la conditia loopului cout << n << ", "; } cout << "BOOM!\n"; return 0;}

// Output10, 9, 8, 7, 6, 4, 3, 2, 1, BOOM! // 5 lipseste !!!

Instrucţiunea goto

goto realizează un salt absolut în program. Destinaţia este identificată printr-un label (un identificator/nume urmat de : ).Un exemplu vă va face să înţelegeţi 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;}

// Output10, 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; }Funcţionează în felul următor: Se evaluează expresia, iar rezultatul este comparat cu fiecare caz.

6

Page 7: Tutoriale C

Dacă se găseşte un caz ce corespunde cu rezultatul expresiei, atunci instrucţiunile acelui caz vor fi executate, apoi switch va fi întrerupt (de aia se află break).Fără break programul va continua să evalueze cazuri până când gaseşte un break sau switch ajunge la sfârşit.Dacă nu se găseşte niciun caz satisfăcător atunci, dacă există (poate lipsi; opţional), 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 exerciţiu pentru voi: Scrieţi echivalentul în if...else al acestui switch.

La case NU puteţi 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.

7