Corso di Java per la 3 E Sia - 3a Lezione 16 gennaio 2016 ore 11,00

Corso di Java per la 3 E Sia - 3a Lezione 16 gennaio 2016 ore 11,00

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 ab 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 programmaMaggiore.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.

Dati tre numeri interi e positivi stabilire il maggiore

public class Maggiore{
 public static void main(String[] args) {
    int a, b, c;
    int mas;
   
   a=100;
   b=20;
   c=500;
   mas=0;

    if( a>mas) {
     mas=a;}
      if( b>mas) {
     mas=b;}
     if(c>mas){
        mas=c;
     }
     System.out.println("il valore massimo e'" + mas);
    

  }
}

Soluzione equazioni di secondo grado

Torniamo ora al problema della soluzione di una equazione di secondo grado che era stato posto in precedenza. Il calcolo del discriminante non presenta nessuna difficoltà. Quello che non si poteva fare senza le istruzioni condizionali era seguire un procedimento diverso a seconda del suo valore. Con le istruzioni condizionali questo è invece molto facile, come mostrato dal programmaSecondoGrado.java, il cui codice è riportato qui sotto.
/*
  Soluzione equazione di secondo grado.
*/

class SecondoGrado {
  public static void main (String args[]) {
    double a=2, b=5, c=3;
    double d;
    double s1, s2;

    d=b*b-4*a*c;

    if( d==0 ) {
      s1=(-b - Math.sqrt( b*b -4*a*c ))/(2*a);
      s2=s1;
      System.out.println("Soluzioni coincidenti: " + s1);
    }

    if( d>0 ) {
      s1=(-b - Math.sqrt( b*b -4*a*c ))/(2*a);
      s2=(-b + Math.sqrt( b*b -4*a*c ))/(2*a);
      System.out.println("Soluzioni reali: " + s1 + " " + s2);
    }

    if( d<0 ) {
      System.out.println("Soluzioni complesse");
    }
  }
}

Questo programma è molto semplice, anche se è il più lungo visto fino ad ora: per prima cosa si calcola il discriminante, che viene memorizzato nella variabile d. Se il valore di d è zero, allora si stampa la unica soluzione della equazione. Se d è positivo, si stampano le due soluzioni distinte. L'ultima istruzione condizionale ha come condizione d < 0, per cui la ultima istruzione System.out... viene eseguita solo se d è negativo.

Istruzioni in alternativa

In questa pagina si introducono le istruzioni in alternativa (else), che sono una estensione delle istruzioni condizionali. Consideriamo un facile esempio: dato il valore di una variabile, stampare il messaggio La variabile e' positiva se la variabile è maggiore oppure uguale a zero, altrimenti stampare Valore negativo. Usando le istruzioni condizionali, questo risulta abbastanza facile. Il programma NoElse.java risolve questo problema.
/*
  Esecuzioni diverse a seconda di una condizione
*/

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

    if( a>=0 ) {
      System.out.println("La variabile e' positiva");
    }

    if( a<0 ) {
      System.out.println("Valore negativo");
    }
  }
}

Il simbolo >= indica "maggiore o uguale", per cui la condizione a>= è verificata solo se la variabile ha valore maggiore o uguale a zero (per confronto: la condizione a>0 è vera solo se a è maggiore di zero, ed è false se a vale zero).
In questo programma, si può notare come le due condizioni delle due istruzioni condizionali sono esattamente l'una l'opposto dell'altra, per cui una condizione è vera se e solo se l'altra è falsa. In questo caso, si esegue una sequenza di istruzioni se la condizione è vera, un'altra se è falsa. Situazioni di questo genere, in cui occorre eseguire una sequenza o un'altra a seconda se una condizione è vera o falsa, si presentano molto spesso nella programmazione. Per questa ragione, le istruzioni condizionali sono state estese, in questo modo:
if( condizione ) {
  istruzione1
  istruzione2
  ...
}
else {
  istruzioneA
  istruzioneB
  ...
}
La prima parte coincide con le istruzioni condizionali già viste in precedenza. Per prima cosa si valuta la condizione, e si vede se è vera o falsa. Nel primo caso si procede come al solito, ossia si eseguono le istruzioni istruzione1, istruzione2, ... . Se la condizione è falsa, si eseguono invece le istruzioni istruzioneA, istruzioneB, ... . In entrambi i casi, si prosegue poi con la istruzione che segue tutto il blocco, ossia la istruzione che viene dopo l'ultima parentesi graffa chiusa nello schema di sopra.
Tradotta in italiano, questa istruzione equivale a:
se la condizione e' vera
allora esegui istruzione1, istruzione2, ecc.
altrimenti esegui istruzioneA, istruzioneB, ecc
Il programma Else.java fa la stessa cosa del programma visto sopra, ma usa una istruzione condizionale con else invece di due istruzioni condizionali separate.
/*
  Esecuzioni diverse a seconda di una condizione
*/

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

    if( a>=0 ) {
      System.out.println("La variabile e' positiva");
    }
    else {
      System.out.println("Valore negativo");
    }
  }
}

Questo programma stampa "La variabile e' positiva" se il valore di a è maggiore o uguale a zero, altrimenti stampa "Valore negativo". Se ci fossero state altre istruzioni sotto il blocco condizionale, sarebbero state eseguite in ogni caso.

Alternative multiple

Il programma SecondoGradoElse.java risolve il problema delle soluzioni di una equazione di secondo grado usando istruzioni condizionali con alternativa (invece delle tre istruzioni condizionali semplici).
/*
  Soluzione equazione di secondo grado.
*/

class SecondoGradoElse {
  public static void main (String args[]) {
    double a=2, b=5, c=3;
    double d;
    double s1, s2;

    d=b*b-4*a*c;

    if( d==0 ) {
      s1=(-b - Math.sqrt( b*b -4*a*c ))/(2*a);
      s2=s1;
      System.out.println("Soluzioni coincidenti: " + s1);
    }
    else if( d>0 ) {
      s1=(-b - Math.sqrt( b*b -4*a*c ))/(2*a);
      s2=(-b + Math.sqrt( b*b -4*a*c ))/(2*a);
      System.out.println("Soluzioni reali: " + s1 + " " + s2);
    }
    else {
      System.out.println("Soluzioni complesse");
    }
  }
}

In questo programma si nota l'uso della sequenza else if. In generale è possibile costruire una sequenza di questo tipo.
if( condizione1 ) {
  A
}
else if( condizione 2 ) {
  B
}
else {
  C
}
In esecuzione, si verifica prima se condizione1 è vera. Se lo è, si esegue A e si passa poi al seguito del programma. Se questa condizione è falsa, si va a vedere se condizione2 è vera o falsa. Nel primo caso, si esegue B, nel secondo caso si esegue C. La traduzione letterale dei termini inglesi aiuta a interpretare queste istruzioni:
se condizione1 è vera
allora esegui A,
altrimenti:
   se condizione2 è vera
   allora esegui B,
   altrimenti esegui C
Da notare che C viene eseguito solo se sia A che B sono falsi.

fonte: http://www.dis.uniroma1.it/~liberato/java/Condizionali.html

Commenti

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi sulla rappresentazione della virgola mobile IEEE 754 (Floating Point)