Istruzioni condizionali

Le istruzioni condizionali permettono di effettuare operazioni diverse a seconda dei valori delle variabili. Vengono quindi usate quando il procedimento da seguire cambia a seconda del valore di una qualche variabile. Prendiamo il caso semplice di una divisione. Quando si divide a per b occorre in teoria controllare sempre che il valore di b sia diverso da zero. Un programma che effettua questo controllo, deve prima di tutto guardare il valore di b, e se vale zero non deve fare la divisione ma stampare un messaggio di errore "Divisore nullo".

Per prima cosa, si definisce condizione una espressione che può essere vera o falsa. Tipi semplici di espressioni sono le seguenti:

variabile>numero
variabile<numero
variabile==numero
variabile!=numero

In sostanza, una espressione è una properietà delle variabili che può essere vera o falsa a seconda del loro valore. Per esempio a>0 è una condizione, dal momento che può essere vera o falsa a seconda del valore di a. Se per esempio a vale -3, la condizione è falsa, mentre risulta vera per esempio nel caso in cui a vale 23. I due simboli == e != rappresentano l'uguaglianza e la differenza, per cui per esempio a==3 è vera solo se il valore di a è esattamente 3.

Usando la definizione di condizione possiamo passare alle istruzioni che si eseguono o no a seconda dei valori delle variabili. In effetti, le istruzioni condizionali permettono di eseguire o meno delle altre istruzioni a seconda del risultato di condizioni. Le istruzioni condizionali sono fatte cosí:

if( condizione ) {
  istruzione1
  istruzione2
  istruzione3
  ...
}

Quando si esegue questa sequenza, si valuta la condizione, cioè si verifica se il valore attuale delle variabili rende la condizione vera o falsa. Se la condizione è falsa si ignorano tutte le istruzioni fra parentesi graffe, e si prosegue con la istruzione che viene subito dopo }. Se la condizione è vera, vengono invece eseguite le istruzioni fra parentesi graffe, e poi si continua con la istruzione che segue la parentesi chiusa.

Si può anche dire che le istruzioni fra le due parentesi graffe vengono eseguite solo se la condizione è verificata dalla variabili. Una traduzione in italiano della istruzione condizionale di sopra potrebbe essere:

se la condizione è vera
allora esegui istruzione1, istruzione2, istruzione3

Dopo che le istruzioni sono state eventualmente eseguite, si passa comunque alla istruzione che segue la parentesi graffa chiusa.

Esempio

Dato un numero, vogliamo stampare un messaggio di avviso se il suo valore è minore di zero. Il programma Negativo.java contiene una sola istruzione condizionale.

/*
  Stampa un messaggio se una variabile e' negativa.
*/

class Negativo {
  public static void main(String[] args) {
    int a=-4;

    if( a<0 ) {
      System.out.println("Attenzione! Il valore di a e' negativo!");
    }
  }
}

La prima istruzione del programma dichiara una variabile a e gli assegna un valore. La seconda è una istruzione condizionale. La condizione è a<0, per cui è verificata solo se il valore della variabile è minore di zero. Fra le due successive parentesi graffe c'è una sola istruzione, che viene quindi eseguita (è la stampa del messaggio) solo se la variabile ha un valore negativo.

Esempio

Si vuole fare il calcolo dell'inverso di una variabile reale a. L'inverso 1/a è definito solo se a è diverso da zero. Per questa ragione, si vuole che il programma stampi un messaggio di errore se a è pari a zero, e calcoli l'inverso se la variabile è diversa da zero. Il programma Inverso.java fa esattamente questo.

/*
  Calcola l'inverso di un numero, controllando che
  il numero sia diverso da zero.
*/

class Inverso {
  public static void main(String[] args) {
    double a=2;

    if( a==0 ) {
      System.out.println("La variabile vale zero.");
    }

    if( a!=0 ) {
      System.out.println("L'inverso vale "+1/a);
    }
  }
}

Se la variabile vale 0, la condizione del primo if è vera, per cui si stampa il messaggio di errore; a questo punto si controlla la seconda condizione, e questa risulta falsa. Nel caso in cui la variabile ha un valore diverso da zero, la prima condizione è falsa (per cui il messaggio di errore non viene stampato), mentre è vera la seconda, per cui si calcola e si stampa l'inverso del numero.

Esempio

Date tre variabili a, b e c, stampare solo quelle che valgono più di una terza variabile d. Per fare questo, si mette una istruzione condizionale per ogni variabile. Il codice del programma Maggiore.java è riportato qui sotto.

/*
  Stampa i valori maggiori di una variabile
*/

class Maggiore {
  public static void main(String[] args) {
    int a=10, b=30, c=4;
    int d=12;

    if( a>d ) {
      System.out.println("La variabile a vale "+a);
    }

    if( b>d ) {
      System.out.println("La variabile b vale "+b);
    }

    if( c>d ) {
      System.out.println("La variabile c vale "+c);
    }

  }
}

In questo programma notiamo due cose. La prima è che le istruzioni che seguono il carattere } vengono eseguite indipendentemente dalla condizione. In altre parole, la seconda istruzione condizionale viene eseguita sia se a è maggiore di d, sia se è minore.

Una seconda osservazione è che le condizioni in questo caso sono del tipo variabile < variabile, invece che il confronto fra una variabile e un numero. In generale, una condizione può essere il confronto fra due espressioni generiche. Per esempio, a+b < a*c-4 è una espressione valida.