Condizioni composte

In una istruzione if, al posto della condizione si può inserire una combinazione di condizioni. In questo modo, è possibile per esempio verificare che una variabile sia contenuta in un certo intervallo: basterà controllare se il suo valore è al tempo stesso maggiore di quello iniziale e minore di quello finale. Allo stesso modo, si può controllare se almeno una fra due condizioni è verificata, oppure se una condizione non è vera. Le combinazioni che consideriamo sono le seguenti:

condizione && condizione
condizione || condizione
! condizione

La prima combinazione (&&) si usa per controllare se entrambe le condizioni sono vere, la seconda (||) se almeno una delle due è vera, la terza (!) se la condizione è falsa.

Queste combinazioni possono poi venire inserite all'interno di un if, in modo tale che certe operazioni vengano effettuate solo se due condizioni sono entrambe vere, se almeno una delle due è vera, o se una è falsa.

Esempio

Dato un numero (memorizzato in una variabile a), vogliamo verificare se si trova all'interno dell'intervallo [0,10], ossia se è compreso fra zero e dieci. Il programma Compreso.java combina due condizioni in una per fare questo controllo.

class Compreso {
  public static void main(String args[]) {
    int a=3;

    if((a>=3)&&(a<=10)) {
      System.out.println("il numero e' nell'intervallo");
    }
    else {
      System.out.println("il numero non e' nell'intervallo");
    }
  }
}

Come si vede, all'interno dell'istruzione if è possibile inserire una combinazione di due condizioni al posto di una sola. In questo caso, si trattava della verifica se il numero fosse sia maggiore o uguale del primo estermo dell'intervallo (a>=0) che minore o uguale del secondo (a<=10).

Questo tipo di combinazione && in cui si verifica se entrambe le condizioni sono vere si chiama congiunzione oppure and.

Esempio

Nel caso in cui sia possibile scegliere due fra tre numeri a, b e c in modo che la somma dei due sia minore di dieci, va stampato "2", altrimenti nulla.

La soluzione Due.java risolve il problema usando la considerazione che la stampa va effettuata se a+b è minore di dieci, ma anche se a+c oppure b+c lo sono.

class Due {
  public static void main(String args[]) {
    int a=8, b=3, c=6;

    if((a+b<10)||(a+c<10)||(b+c<10)) {
      System.out.println("2");
    }
  }
}

Il programma stampa "2" se è vera almeno una fra le tre condizioni dell'istruzione condizionale, ossia a+b<10, a+c<10 e b+c<10. Basta quindi che una sola delle tre condizioni sia vera perchè venga eseguita l'istruzione di stampa. Notare che, per tutte le istruzioni condizionali, il ramo else può anche mancare.

Questo tipo di combinazione || in cui si a va a vedere se almeno una condizione è verificata si chiama disgiunzione oppure or.

Si vede da questo esempio come le condizioni possono essere più di due. Lo stesso vale anche per &&. Se si mescolano && con || è opportuno usare le parentesi per chiarire l'ordine di valutazione delle condizioni. Si veda l'esempio più avanti.

Esempio

Stampare il risultato della divisione a/b, controllando però prima che la divisione non dia errore. Si stampi un messaggio di errore in caso contrario.

Il problema si potrebbe risolvere anche usando dei normali controlli a==0 e a!=0, ma per motivi didattici (illustrare il terzo tipo di combinazione di condizioni) la soluzione Negazione.java usa un altro sistema.

class Negazione {
  public static void main(String args[]) {
    int a=8, b=0;

    if(!(b==0)) {
      System.out.println(a/b);
    }
    else {
      System.out.println("errore: non si puo' dividere per zero");
    }
  }
}

Viene quindi stampato il risultato della divisione se b==0 è falso, ossia se b è diverso da zero. In caso contrario si stampa il messaggio d'errore. In generale, in questi casi semplici è preferibile usare la più semplice condizione di disuguaglianza !=, ma esistono casi complessi in cui la negazione ! può risultare utile.

La combinazione che usa ! si chiama negazione oppure not.