Corso di Java per la 3 E Sia - 2a Lezione 12 dicembre 2015 ore 12,00

Corso di Java per la 3 E Sia - 2a Lezione 12 dicembre 2015 ore 12,00

Uso di variabili in Java

Le variabili dei linguaggi di programmazione sono dei "contenitori" in cui è possibile memorizzare dei valori che serviranno in seguito. Si può pensare a una variabile come a una "memoria" di una calcolatrice tascabile, in cui si possono mettere dei risultati parziali che è possible riutilizzare in seguito. Una altro paragone è quello delle memorie di un telefonino o di una agendina elettronica, in cui si può mettere un numero di telefono che verrà utilizzato in seguito.
Il programma Variabili.java contiene una variabile. In questa variabile viene memorizzato un valore, che viene poi alterato.




/*
  Un programma Java che usa una variabile.
*/

class Variabili {
  public static void main (String args[]) {

    int a;

    a=10;
    System.out.println("La variabile vale " + a);
   
    a=-345;
    System.out.println("La variabile vale " + a);

  }
}

Quando viene compilato ed eseguito, questo programma stampa le due linee:
La variabile vale 10
La variabile vale -345
Il programma è costituito dalla seguenti parti. Prima un commento, poi le due solite linee di intestazione (class... e public...). La prima istruzione del programma è int a; Questa istruzione serve a dichiarare che vogliamo utilizzare una variabile, il cui nome è a, e che serve a contenere un valore di tipo intero. In generale, la dichiarazione di una variabile è costituita da due parti: prima il tipo della variabile (cioè il tipo di valori che la variabile deve contenere, per esempio se interi o reali), e poi il nome della variabile.
Una volta dichiarata una variabile di nome a, è possibile farci due cose: memorizzare un numero intero nella variabile, e stampare il valore memorizzato.
La istruzione a=10; memorizza il valore 10 nella variabile a, mentre a=-345; cambia questo valore a -345. L'operazione di memorizzare un valore in una variabile viene detto assegnamento di valore alla variabile, per cui a=10; è l'assegnamento del valore 10 alla variabile a.
Il programma contiene anche due istruzioni di stampa del valore della variabile a. La stampa viene fatta usando ancora il comando System.out.println. In questo caso, usiamo la istruzione System.out.println("La variabile vale " + a);, che significa: stampa la sequenza di caratteri La variabile vale seguita dal valore della variabile a. La prima volta viene stampato il valore che ha la variabile in quel momento, cioè 10; la seconda volta la variabile contiene il valore -345, per cui questo è il numero che viene stampato.
È possibile visualizzare graficamente l'esecuzione del programma istruzione per istruzione, utilizzando dei riquadri per indicare il contenuto delle variabili. Vedi la esecuzione del programma Variabili.java.

Somma di valori

Il seguente programma Somma.java assegna tre valori differenti a tre variabili, e poi le somma tra loro.
/*
  Somma di tre numeri.
*/

class Somma {
  public static void main (String args[]) {
    int a,b,c;
    int d;

    a=10;
    b=4;
    c=5-2;

    d=a+b+c;

    System.out.println("Il risultato della somma e': " + d );
  }
}

Alcune osservazioni su questo programma. La prima è che un programma può contenere anche più di una variabile. In questo caso, le dichiarazioni si possono anche mettere su una sola riga: int a,b,c; indica che ci servono tre variabili per contenere dei valori interi (int), e che i nomi di queste tre variabili sono ab e c. È anche possibile dichiarare altre variabili su altre linee, come è fatto per esempio per la variabile d.
Le successive tre istruzioni assegnano dei valori alle variabili ab e c. La assegnazione di c è interessante, perchè fa notare che a una variabile si può assegnare il valore che risulta da un calcolo. Infatti, la istruzione c=5-2; calcola il valore 5-2 (che vale 3), e poi assegna a c il valore risultato, che è 3. In generale, una istruzione di assegnamento ha la struttura
nomevariabile = espressione;
Quello che avviene è che la espressione viene valutata, cioè si calcola il suo valore, e questo valore viene memorizzato nella variabile con quel nome.
La istruzione d=a+b+c; fa vedere come sia possibile utilizzare i valori delle variabili. Infatti, in questo caso la espressione a+b+c; contiene la variabili ab e c. L'effetto di questa istruzione è quello di calcolare la somma dei valori memorizzati nelle variabili ab e c, e di memorizzare il risultato nella variabile d.
È da notare che questa istruzione d=a+b+c; non è differente dalle precedenti: ha sempre la struttura nomevariabile = espressione; l'unica differenza è che la espressione in questo caso contiene dei riferimenti ad altre variabili.

Riassunto

È possibile utilizzare più di una variabile in un programma. Ogni variabile deve venire dichiarata, ed è possibile dichiarare anche più variabili nella stessa linea. Per assegnare (memorizzare) un valore a una variabile, si usa l'istruzione nomevariabile = espressione;, in cui la espressione può contenere sia costanti (come per esempio 10, 4 o 5) che riferimenti ad altre variabili (come è il caso per a+b+c).
È possibile vedere la esecuzione di Somma.java, passo per passo.

Incremento del valore di una variabile

Il programma Incremento.java permette di fare due osservazioni. La prima è che è possibile assegnare una valore ad una variabile anche nella dichiarazione della variabile stessa. La linea int i=12; indica infatti che si vuole usare una variabile di tipo intero, e che il valore iniziale di questa variabile è 12. Questo è il valore che viene inizialmente assegnato alla variabile i: chiaramente, questo valore può venire cambiato dalle istruzioni successive.
/*
  Incremento del valore di una variabile.
*/

class Incremento {
  public static void main (String args[]) {
    int i=12;

    System.out.println("La variabile i vale " + i);

    i=i+1;

    System.out.println("Ora i vale " + i);
  }
}


La istruzione i=i+1; serve ad aggiungere 1 al valore attualmente memorizzato nella variabile i. Questo esempio serve a chiarire che il simbolo = nel contesto della programmazione ha un significato differente da quello che ha in algebra o analisi matematica. In algebra, = indica una uguaglianza di valori, per cui 3=5-2 è vero, mentre 12=100/10 è falso. In questo senso, la espressione i=i+1 è falsa per ogni possibile valore di i.
Nell'ambito della programmazione, il simbolo = indica una assegnazione, per cui i=espressione; significa: valuta il valore della espressione, e il risultato memorizzalo nella variabile i. Nel caso della istruzione i=i+1; questo significa:
  • valuta il valore di i+1; dal momento che i vale 12, il valore di questa espressione è 13;
  • il risultato della espressione viene memorizzato nella variabile i, quandi i da ora in poi contiene il valore 13.
Tutto questo fa notare come il simbolo = ha in programmazione un significato diverso da quello che ha in algebra. Alcuni linguaggi di programmazione (non Java) evitano questa confusione usando un simbolo diverso per l'assegnamento. Per esempio, la istruzione di assegnamento del programma di sopra in alcuni linguaggi si scrive i<-i+1. La freccia fa capire che il significato della istruzione è che nella variabile i viene messo il valore della espressione che segue la freccia. Nel caso di Java, si usa il simbolo =, anche se questo all'inizio può generare confusione.
Per ulteriori chiarimenti, vedere la esecuzione del programma Incremento.java.

Variabili reali

Le variabili intere possono -per definizione- contenere solo valori interi. Questo chiaramente crea dei problemi nel caso in cui i valori o i risultati delle espressioni possono essere non interi. Il seguente programma DivisioneIntera.java illustra questi problemi.
/*
  In questo programma si fa la divisione di due variabili intere
*/

class DivisioneIntera {
  public static void main(String[] args) {
    int a,b,c;

    a=22;
    b=8;

    c=a/b;

    System.out.println("Il risultato della divisione e': "+c);
  }
}


Se si compila ed esegue il programma, viene stampata la seguente linea:
Il risultato della divisione e': 2
Questo risultato è impreciso, visto che 22/8=2.75 Il problema è che il risultato della divisione 22/8 viene memorizzato nella variabile c, che è stata dichiarata per contenere solo variabili di tipo intero. Per risolvere questo problema, il valore che viene memorizzato in c è la parte intera del risultato della espressione, ossia quello che sta prima della virgola decimale. Nel nostro caso, il risultato era 2.75, per cui viene memorizzato solo il 2.
Se si devono eseguire dei calcoli di cui si vuole conoscere anche il valore dei decimali, è necessario usare variabili di tipo reale. Contrariamente a quello che ci si aspetta, una variabile reale viene dichiarata usando una linea double nomevariabile; Il programma DivisioneReale.java è una versione modificata del precedente, in cui si usano variabile reali invece che intere.
/*
  In questo programma si fa la divisione di due variabili reali
*/

class DivisioneReale {
  public static void main(String[] args) {
    double a,b,c;

    a=22;
    b=8;

    c=a/b;

    System.out.println("Il risultato della divisione e': "+c);
  }
}


Il risultato stampato questa volta contiene anche le cifre decimali. In generale, se si pensa che il risulato di una espressione potrebbe contenere cifre decimali, è bene usare variabili reali invece che intere.

Nota sulle conversioni

Si consideri il seguente programma di divisione: DivisioneIntera2.java, riportato qui sotto.
/*
  In questo programma si fa la divisione di due variabili intere
*/

class DivisioneIntera2 {
  public static void main(String[] args) {
    int a,b;
    double c;

    a=22;
    b=8;

    c=a/b;

    System.out.println("Il risultato della divisione e': "+c);
  }
}


In base a quanto detto finora, il risultato dovrebbe essere corretto: si calcola a/b, e il risultato si mette nella variabile reale c. Quello che succede compilando ed eseguendo il programma è che viene stampato ancora il valore 2, ossia solo la parte intera della divisione.
La spiegazione richiede di addentrarsi nei meccanismi di conversione dei tipi usato da Java. Quando è necessario fare una divisione fra due variabili, se entrambe sono intere allora la divisione produce un risultato intero. In altre parole, la divisione a/b produce sempre un risultato intero (approssimato), indipendentemente dall'uso che si fa di questo risultato, se a e b sono variabili di tipo intero.

Esempi di espressioni

Il programma Espressioni.java contiene alcuni esempi di espressioni.
/*
  Alcuni esempi di espressioni
*/

class Espressioni {
  public static void main(String[] args) {
    double a=12.23,b=0.1e+2,c;

    c=(a+b)/12.1;
    System.out.println("Risultato della prima espressione: "+c);

    c=a*2+b;
    System.out.println("Risultato della seconda espressione: "+c);

    c=1/(a-1)/(b-4);
    System.out.println("Risultato della terza espressione: "+c);

    c=Math.sqrt(a*a - b*b);
    System.out.println("Risultato della quarta espressione: "+c);
  }
}

In questo esempio si vede come sia possibile assegnare un valore a una variabile anche nella stessa dichiarazione. Questo si può fare anche nel caso in cui nella stessa linea vengono dichiarate anche altre variabili.

Discriminante di una equazione di secondo grado

In questo esempio vediamo come calcolare il discriminante di una equazione di secondo grado. Il file sorgente del programma si chiama Discriminante.java, e il codice è quello che segue.
/*
  Calcola il discriminante di una equazione di secondo grado
*/

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

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

    System.out.println("Il discriminante vale " + d);
  }
}

Questo esempio non ha nulla di particolare rispetto a quelli visti in precedenza. D'altra parte, lo scopo del calcolo del discriminante è di permettere la soluzione delle equazioni di secondo grado. Questo procedimento cambia a seconda del valore del discriminante (e in particolare, a seconda se è positivo o negativo), e questo richiede un programma che possa agire diversamente a seconda dei valori delle variabili. Questa è la funzione delle istruzioni condizionali, che si vedranno in seguito.
fonte: http://www.dis.uniroma1.it/~liberato/java/VarEspr.html

Commenti

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

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