Tutorial Java 6 – #5 Structuri de control

In acest post vom vedea cum se implementeaza in Java, structurile de control fundamentale:

  • structuri decizionale: if – then, if – then – else,switch
  • structuri de ciclare  for, do-while,while – do, for imbunatatit (enhanced – for)
  • instructiuni de control: break, continue;

Prin intermediul structurilor de control putem scrie programe a caror executie nu inseamna doar o secventa liniara de instructiuni.

Alte topicuri care fac parte din acest tutorial Java 6 sunt accesibile prin Tutorial Java 6 – Continut.

Cum se implementeaza in Java if – then

Structura conditionala if – then are forma:

   1:  if (conditie) 
   2:      < expresie 1 >

sau

   1:  if (conditie) {
   2:      < expresie 1 >
   3:      < expresie 2 >
   4:  }

in care (ATENTIE !)conditie reprezinta o expresie sau variabila booleana ce are  ca valoare true sau false. De exemplu 30 > 10 sau 30 == 10.

In Java nu se accepta conditii bazate pe expresii sau variabile care au valori numerice. De exemplu, expresia urmatoare este valida in C/C++ insa NU si in Java:

        int valoare = 10;
        if(valoare)
            System.out.println("Valoare nenula !");

genereaza eroare de compilare de tipul incompatible types.

Pentru a exemplifica sa determinam daca un numar este negativ, si daca este atunci sa il modificam:

        int negativeNumber = -22;
        boolean isNumber = true;

        if(isNumber)
            System.out.println("Este numar !");

        if(negativeNumber < 0)
        {
            System.out.println("Este numar negativ ! Il vom face pozitiv;");
            negativeNumber = (-1) *negativeNumber;
            System.out.println(negativeNumber);
        }

 

Cum se implementeaza in Java if – then – else

Structura conditionala if – then – else are forma:

   1:  if (conditie){
   2:      < expresie 1 >
   3:      < expresie 2 >
   4:  }
   5:  else{
   6:      < expresie 3 >
   7:      < expresie 4 >
   8:  }

Daca vrem sa determinam minimul dintre 2 numere:

        int vb1 = 10;
        int vb2 = 20;
        int min;
        if(vb1 < vb2)
            min = vb1;
        else
            min = vb2;

Aceeasi solutie poate fi implementata si prin intermediul operatorului conditional ?::

conditie ? < expresie then > : < expresie else >

, iar exemplul de mai devreme devine:

        min = vb1 < vb2 ? vb1 : vb2;

 

Cum se implementeaza in Java do – while

Structura repetitiva do – while implementeaza un ciclu post-conditionat, deoarece conditia care asigura iesirea/ramanerea in bucla se verifica la sfarsit. Structura va executa cel putin o data iteratia:

   1:  do
   2:  {
   3:      < expresie 1 >
   4:      < expresie 2 >
   5:  } while (conditie);

 

De exemplu, daca dorim sa calculam N! (cu conditia ca N > 1) printr-un do – while:

        //n factorial prin do - while cu conditia ca n > 0
        int nFactorial = 1;
        int i = 0;
	int n = 5;
        do
        {
             i++;
            nFactorial = nFactorial *i;
        }while(i < n);
        //afisam valoarea
        System.out.println(n+"! = "+nFactorial);

 

Cum se implementeaza in Java while - do

Structura repetitiva while - do implementeaza un ciclu pre-conditionat, deoarece conditia care asigura iesirea/ramanerea in bucla se verifica la inceput inaine de a se executa iteratia:

   1:  while (conditie)
   2:  {
   3:      < expresie 1 >
   4:      < expresie 2 >
   5:  } 

Acelasi exemplu, N!, dar prin while – do:

         //n factorial prin while - do
        int nFactorial = 1;
        int i = 0;
	int n = 5;
        while (i < 5)
        {
             i++;
            nFactorial = nFactorial *i;
        }
        //afisam valoarea
        System.out.println(n+"! = "+nFactorial);

 

Cum se implementeaza in Java for

Structura repetitiva for implementeaza o structura repetitiva pre-conditionata, asemenea lui while-do. Structura for este mult mai eficienta doarece iteratia si initializarea sunt incluse in structura:

   1:  for(initializare; conditie; iteratie)
   2:  {
   3:      < expresie 1 >
   4:      < expresie 2 >
   5:  }

De exemplu pentru a determina suma elementelor unui vector:

        int[] vector = {1,2,3,4,5};
        int suma = 0;
        for(int j = 0; j < vector.length; j++)
            suma += vector[j];
        System.out.println("Suma este "+suma);

In interiorul structurii for, pot fi trecute mai multe instructiuni de initializare sau de iteratie separate prin , (virgula):

   1:  for(initializare1, initializare2; conditie; iteratie1, iteratie2)
   2:  {
   3:      < expresie 1 >
   4:      < expresie 2 >
   5:  }

Elementele instructiunii for sunt optionale. Urmatoarele exemple sunt corecte, insa in unele dintre ele trebuie sa decizi cand se termina bucla infinita prin break.

for( initializare; ; )
for( ; conditie; iteratie)
for( ; ; iteratie)
for( ; ; ) // bucla infinita

Pentru examenul SCJP, trebuie avut in vedere faptul ca variabilele declarate in zona de initializare reprezinta variabile locale blocului for si nu sunt vizibile in afara lui.:

for ( int i=0; i<10 ; i++ ) {
// prelucrari
}
// eroare compilare: cannot resolve symbol: i
System.out.println("valoarea lui i este " + i );

Cum se implementeaza in Java enhanced - for

Structura repetitiva enhanced - for implementeaza o structura repetitiva pre-conditionata. Aceasta structura a fost introdusa incepand cu Java 5.0 pentru a permite o sintaxa mai usoara (este echivalent cu foreach din .NET). Aceasta structura poate fi utilizata doar pentru a itera prin colectii care implementeaza interfata java.lang.Iterable

   1:  for ( variabila : colectie_iterabila )
   2:  {
   3:          < expresie 1 >
   4:          < expresie 2 >
   5:  }
   6:   

Suma elementelor unui vector cu enhanced – for arata asa:

        suma = 0;
        for(int valoare : vector)
        {
            suma += valoare;
        }
        System.out.println("Suma este "+suma);

 

Cum se implementeaza in Java switch

Structura conditionala switch implementeaza o structura conditionala cu mai multe ramuri de executie. Inlocuieste intr-un mod mai eficient o structura if-then-else cu multe ramuri else sau then.

   1:  switch (variabila) {
   2:  case valoare_constanta1:
   3:      < expresie 1 >
   4:      break;
   5:  case valoare_constanta2:
   6:      < expresie 2 >
   7:      break;
   8:  
   9:  default:
  10:       < expresie >
  11:  }

Este important ca fiecare expresie de tip case sa fie terminata cu instructiunea break deoarece aceasta asigura iesirea din structura.

De exemplu testarea valorii unei variabile se poate face mai usor prin switch decat prin mai multe structuri if imbricate.

        int valoareTest = 2;
        switch(valoareTest)
        {
            case 1:
                System.out.println("Valoarea este egala cu 1");
                break;
             case 2:
                System.out.println("Valoarea este egala cu 2");
                break;
             case 3:
                System.out.println("Valoarea este egala cu 3");
                break;
              case 4:
                System.out.println("Valoarea este egala cu 4");
                break;
            default:
                System.out.println("Valoarea este in afara intervalului");
        }

Prin executia exemplului anterior se obtine mesajul: Valoarea este egala cu 2.

Daca nu se foloseau instructiuni de tip break atunci exemplul anterior ar fi afisat:

Valoarea este egala cu 2
Valoarea este egala cu 3
Valoarea este egala cu 4
Valoarea este in afara intervalului

 

Cum se implementeaza in Java instructiunile break si continue

Instructiunea break permite intreruperea unei bucle for, do-while, while-do sau iesirea dintr-o serie de case-uri.

Instructiunea continue permite trecerea la urmatoare iteratie a unui ciclu for, do-while, while-do ignorand restul instructiunilor din iteratia curenta.

De exemplu, fiind dat un vector sa se determine suma elementelor pozitive:

         int[] valoriInt = {10,12,5,-4,3,-1,23};
         int sumaPozitive = 0;
         for(int j = 0; j < valoriInt.length; j++)
         {
             if(valoriInt[j] < 0)   //daca este negativ
                 continue;          //trecem la urmatoarea iteratie
            
             //in mod normal, adunam valoarea
             sumaPozitive+=valoriInt[j];
         }
         System.out.println("Suma elementelor pozitive este "+sumaPozitive);

sau sa se determine prima valoare negativa:

         int[] valoriInt = {10,12,5,-4,3,-1,23};
         int valoareNegativa = 0;
         for(int j = 0; j < valoriInt.length; j++)
         {
             if(valoriInt[j] < 0)
             {
                 //daca este negativ
                 //salvez valoarea
                 valoareNegativa = valoriInt[j];
                 //iesim din bucla
                 break;
             }
         }
         System.out.println("Prima valoare negativa este  "+valoareNegativa);

Alte topicuri care fac parte din acest tutorial Java 6 sunt accesibile prin Tutorial Java 6 – Continut.