Java/Strutture di controllo

Wikibooks, manuali e libri di testo liberi.

Le strutture di controllo in Java derivano dal C/C++.

Indice

[modifica] if

È la più semplice: se la condizione ritorna true verrà eseguita l'istruzione, altrimenti si passa all'istruzione dopo.

if (condizione booleana){
//comandi vari
}

[modifica] if/else

Non sempre abbiamo la necessità di eseguire solo un'istruzione o nulla. Questo costrutto permette di eseguire l'istruzione se si ritorna true o un'altra istruzione se si ritorna false.

if (condizione boleana){
//comandi che vengono eseguiti se viene ritornato true
} else {
//comandi che vengono eseguiti se viene ritornato false
}

[modifica] if/else nidificato

Qui vediamo come si può gestire un'eventuale false

if (condizione boleana){
//comandi che vengono eseguiti se viene ritornato true
} else if (condizione booleana){
//comandi che vengono eseguiti se viene ritornato false
//alla prima e true alla seconda
} else{
//comandi che vengono eseguiti se viene ritornato false da tutte due le parti
}

Naturalmente si può fare fino all'infinito ma si preferisce per blocchi lunghi

[modifica] switch

L’istruzione switch è utile in tutti quei casi in cui sia necessario decidere tra opzioni multiple prese in base al controllo di una sola variabile.

switch (espressione){
      case espr_costante1:
                istruzione1
                break;//(opzionale)
      case espr_costante2:
                istruzione2
                break;//(opzionale)
      case espr_costante4:
                istruzione3
                break;//(opzionale)
      ...
      default:
                istruzioneDefault
}

Dopo che viene valutata l’espressione di switch, il controllo della applicazione salta al primo case tale che

espressione == espr_costante

ed esegue il relativo blocco di codice. Nel caso in cui il blocco sia terminato con una istruzione break, l’applicazione abbandona l’esecuzione del blocco switch saltando alla prima istruzione successiva al blocco, altrimenti il controllo viene eseguito sui blocchi case a seguire. Se nessun blocco case soddisfa la condizione viene controllata l’esistenza della label default ed eseguito, se presente, solo il blocco di codice relativo ed esce da switch.

L’istruzione switch permette di strutturare una serie anche lunga di opzioni in maniera più leggibile di un if/else nidificato, ma ha una limitazione: il tipo di espressione deve essere un valore intero od una costante di tipo enum. Non è quindi possibile utilizzarlo con valori String o boolean. Fa eccezione il tipo char, in quanto viene valutato il valore intero del carattere:

switch (espressione) {
    case 'a':
    	System.out.println("carattere a");
        break;
    case 'b':
    	System.out.println("carattere b");
        break;
 
    default:
    	System.out.println("un carattere diverso da a e da b");
        break;
}

[modifica] while/do-while

Un ciclo while esegue continuamente un blocco di istruzioni finché la condizione di terminazione è vera. La sintassi può essere espressa:

    while (condizione) {
         // istruzioni da eseguire
    }

Il ciclo while valuta la condizione che deve restituire un valore booleano. Se il valore è true, viene eseguito il blocco di istruzioni contenuto nel ciclo e poi nuovamente testato il valore della condizione. Solo quando questa diventa false il ciclo termina. Il seguente esempio stampa i valori da 1 a 10:

     int i = 1;
     while (i < 11) {
	System.out.println("i vale  "+i);
	i++;
     }

E' possibile implementare un ciclo infinito ponendo la condizione di terminazione a true

     while (true) {
	// istruzioni da eseguire
     }

Una variante è il ciclo do-while

     do {
	// istruzioni da eseguire
     } while (condizione);

La differenza tra while e do-while è che il do-while valuta la condizione alla fine del ciclo invece che all'inizio, quindi le istruzioni contenute nel blocco do verranno eseguite almeno una volta:

     boolean condizione = false;
     do {
	System.out.println("condizione vale  "+condizione);
     } while (condizione);


[modifica] for

Il ciclo for offre un modo compatto per operare su di un intervallo di valori. La sua sintassi è:

     for (inizializzazione; terminazione; passo) {
          istruzioni
     }
  • inizializzazione: inizializza le variabili di controllo; viene eseguita una sola volta all'inizio del ciclo
  • terminazione: è la condizione di terminazione; viene valutata ad ogni iterazione
  • passo: è l'incremento (o decremento) delle variabili di controllo; viene eseguito ad ogni iterazione

Un classico ciclo while:

     int i = 1;
     while (i < 11) {
	System.out.println("i vale  "+i);
	i++;
     }

implementato con un ciclo for diventa:

      for (int i = 1; i < 11; i++) {
	System.out.println("i vale  "+i);
      }

Tutte e tre le espressioni del ciclo sono opzionali, omettendole tutte abbiamo un ciclo infinito

      for ( ; ; ) {
	// istruzioni da eseguire
      }

Abbiamo parlato di variabili di controllo perché esse possono essere più di una:

      for (int i = 0, y = 20; i < 10 && y > 16; i = i + 2, y--) {
	System.out.println("il valore di i è: " + i + "  il valore di y è: " + y);
      }

Eseguendo l'esempio sopra avremmo il seguente output:

il valore di i è: 0  il valore di y è: 20
il valore di i è: 2  il valore di y è: 19
il valore di i è: 4  il valore di y è: 18
il valore di i è: 6  il valore di y è: 17

in quanto la condizione di terminazione restituisce true con i < 10 e y > 16, ma alla quinta iterazione y = 16 e restituisce false terminando il ciclo.
A partire dalla versione 1.5 il ciclo for è disponibile anche in una forma più compatta, chiamata enhanced for utilizzabile per iterare con Collections ed arrays

      for (tipo_contenuto_in_collezione elemento : collezione) {
	System.out.println(elemento);
      }

Vediamo un esempio con un array di interi

      Integer[] numeri = {1,2,3,4,5,6,7,8,9,10};
      for (Integer numero : numeri) {
	System.out.println("Numero : " + numero);
      }

Strumenti personali