Instructiunea for

Am vorbit in lectia trecuta de siruri dar nu am vazut inca marele avantaj care il ofera acestea, respectiv posibilitatea de a trata la fel un numar mai mare de elemente. De exemplu, daca vrem sa calculam suma a doua numere putem sa facem acest lucru simplu:


  int sum = n1 + n2;

Daca vrem sa insumam 3, 4 sau 5 numere codul ar continua sa creasca. Totodata se observa ca e destul de vizibil repetitiv.


  int sum = n1 + n2 + n3;
  int sum = n1 + n2 + n3 + n4;
  int sum = n1 + n2 + n3 + n4 + n5;

Pentru a scapa de repetitie si a scrie un cod flexibil care sa functioneze la fel oricate numere am vrea sa insumam folosim instructiunea for pentru a parcurge toate elementele unui sir si a face suma elementelor:


  public static int suma(int[] sir) {      // metoda primeste ca parametru un sir care poate contine oricate numere
    int suma = 0;                          // initializam o variabila locala suma cu valoarea 0
    for (int i = 0; i < sir.length; i++) {  // pentru fiecare i pornind de la 0 si atata timp cat i < lungimea sirului
      suma += sir[i];                       // aduna la suma elementul sir[i]
    }
    return suma;                           // returneaza suma
  }  

Instructiunea for este compusa din 3 sectiuni separate prin punct si virgula (;):

Fiecare dintre cele 3 sectiuni poate sa si lipseasca. Secventa de mai jos de exemplu este o bucla infinita.

  for ( ; ; ) {
  }

Exista si o forma "prescurtata" de for numita enhanced for sau for-each. Folosind aceasta forma metoda de mai sus ar arata astfel:


  public static int suma(int[] sir) {      // metoda primeste ca parametru un sir care poate contine oricate numere
    int suma = 0;                          // initializam o variabila locala suma cu valoarea 0
    for (int element : sir) {               // pentru fiecare element din sir
      suma += element;                       // aduna la suma elementul curent
    }
    return suma;                           // returneaza suma
  }  

Aceasta forma itereaza intotdeauna pe toate elementele sirului si este compusa din numele variabilei cu care se itereaza urmata dupa doua puncte (:) de numele sirului pe care se itereaza. Variabila element in acest caz va primi la fiecare iteratie valoarea unui element din sir. Se observa ca aceasta forma este mai simpla si mai scurta fiind intotdeauna de preferat cand nu avem nevoie de valoare variabilei cu care contorizam for-ul in interiorul buclei.

Exista doua instructiuni care pot "scurtcircuita" executia instructiunii for permitand crearea unei logici mai complexe daca e cazul. Ele sunt intructiunea break si instructiunea continue.

Instructiunea break intrerupe bucla in momentul in care se ajunge la ea, executia programului va sari la sfarsitul blocului for. De exemplu daca in metoda de mai sus am vrea sa ne oprim cand am gasit un numar negativ am scrie astfel:


  public static int suma(int[] sir) {      // metoda primeste ca parametru un sir care poate contine oricate numere
    int suma = 0;                          // initializam o variabila locala suma cu valoarea 0
    for (int element : sir) {               // pentru fiecare element din sir
      if (element < 0) {                    // daca elementul e mai mic decat 0
        break;                              // intrerupe bucla
      }
      suma += element;                       // aduna la suma elementul curent
    }
    return suma;                           // returneaza suma
  }  

Instructiunea continue intrerupe iteratia curenta si trece la urmatoarea iteratie, deci la inceputul blocului for dupa executia secventei de incrementare. De exemplu daca vrem sa facem suma numerelor pare am putea sa le sarim, sa le evitam pe cele impare:


  public static int suma(int[] sir) {      // metoda primeste ca parametru un sir care poate contine oricate numere
    int suma = 0;                          // initializam o variabila locala suma cu valoarea 0
    for (int element : sir) {               // pentru fiecare element din sir
      if (element % 2 == 1) {                    // daca elementul e impar
        continue;                              // sari la urmatoare iteratie
      }
      suma += element;                       // aduna la suma elementul curent
    }
    return suma;                           // returneaza suma
  }  

In acest moment cunoasterea instructiunilor for si if va permit rezolvarea unor probleme mai complexe, fapt pentru care va urma un numar mai mare de teste, toate rezolvabile doar folosind cunostintele acumulate pana acum.

Este momentul sa arati ce ai invatat. Din acest moment ai suficiente cunostinte pentru a rezolva testele BA1-BA8 si EA1-EA7, Succes!!!