Inserire il floppy personale per salvare le esercitazioni nel dirive A:
Aprire il file fond1eo\Es3.htm per leggere e seguire l'esercitazione
Ridurre le dimensioni della finestra che deve restare visibile ma consentire
la visibilità di un'altra nuova finestra
Variabili di tipo intero e reale
In Java esistono non solo tipi di dato semplici dichiarabili con la sintassi:
<nome del tipo> <identificatore di variabile>;
oppure
<nome del tipo> <identificatore di variabile> = <valore>;
ma anche sottoclassi della classe Number del package java.lang.
Ad esempio un oggetto della classe Integer ha solamente una variable di stato e questa è di tipo int, inoltre
ha parecchi metodi utili come quelli per convertire un int in una String e viceversa.
Aprire l'ambiente JCreator facendo doppio Click sull'icona presente sul Desktop
Ridimensionare la finestra in modo che sia visibile anche quella con il testo dell'esercitazione
Aprire con File/New una finestra di editor
scegliendo l'opzione Files, indicare il Filename: MinMaxVarDemo e la Location: A:\
Redigervi il testo di un'applicazione con le seguenti istruzioni per valutare il dominio dei diversi
tipi di interi e di reali:
public class MinMaxVarDemo {
public static void main(String args[]) {
// interi
byte maxByte = Byte.MAX_VALUE;
short maxShort = Short.MAX_VALUE;
int maxInteger = Integer.MAX_VALUE;
long maxLong = Long.MAX_VALUE;
byte minByte = Byte.MIN_VALUE;
short minShort = Short.MIN_VALUE;
int minInteger = Integer.MIN_VALUE;
long minLong = Long.MIN_VALUE;
// reali
float maxFloat = Float.MAX_VALUE;
double maxDouble = Double.MAX_VALUE;
float minFloat = Float.MIN_VALUE;
double minDouble = Double.MIN_VALUE;
// visualizza
System.out.println(minByte+" <= byte <= " + maxByte);
System.out.println(minShort+" <= short <= " + maxShort);
System.out.println(minInteger+" <= int <=" + maxInteger);
System.out.println(minLong+" <= long <=" + maxLong);
System.out.println(minFloat+" <= float <= " + maxFloat);
System.out.println(minDouble + " <= double <= " + maxDouble);
}
}
Salvarlo in A: con File/Save.
Viene automaticamente aggiunta l'estensione .java
Riaprire la finestra sul drive A:, controllare la presenza dei file MinMaxVarDemo.java, poi rimettere da parte la finestra
Tornare nella finestra editor di JCreator e compilare con Build/Compile File
Seguire le indicazioni del compilatore per correggere eventuali errori.
A correzione avvenuta salvare di nuovo con File/Save
Controllare la presenza in A: del file MinMaxVarDemo.class
Tornare nella finestra editor di JCreator ed eseguire con
Build/Execute File
Completare il seguente testo per realizzare una classe per la conversione Euro/Lire:
public class EuroConvertitore{
public int inLire(float euro){
return ...
}
public float inEuro(int lire){
return ...
}
}
Realizzare una classe ProvaEuroConvert per verificare
il buon funzionamento della classe EuroConvertitore
Classi come oggetti unici: classe Mat e metodi di classe
Una classe, come ad esempio la classe predefinita Math che fornisce certe costanti e
certe funzioni matematiche importanti, può avere anche metodi o proprietà di classe,
definite 'static', che non si applicano a specifici oggetti ma alla stessa classe vista come oggetto unico.
Scrivere un'applicazione per provare la seguente classe, che nel seguito
sarà arricchita di altri metodi utili dal punto di vista matematico:
public class Mat{
public static int triang(int n) {
return n*(n+1)/2;
}
}
Aggiungere alla classe Mat un metodo per trasformare un numero
reale in un arrotondamento che abbia un numero prefissato di decimali
Analizzare l'applicazione seguente che introduce il tipo di dato semplice boolean (del package
java.lang) come valore - true oppure false -
di espressioni aritmetiche che possiamo anche chiamare 'condizioni'
import java.util.*;
public class Bool {
public static void main(String[] args) {
//per creare un oggetto della classe java.util.Random
Random rand = new Random();
//per assegnare a due variabili valori casuali tra 0 e 10(escluso)
int i = rand.nextInt(10);
int j = rand.nextInt(10);
//per visualizzare il valore di verità di alcune proposizioni composte:
System.out.println("i = " + i+"e j = " + j);
System.out.println("i > j e' " + (i > j));
System.out.println("i < j e' " + (i < j));
System.out.println("i >= j e' " + (i >= j));
System.out.println("i <= j e' " + (i <= j));
System.out.println("i == j e' " + (i == j));
System.out.println("i != j e' " + (i != j));
System.out.println("(i < 5) e (j < 5) e' "
+ ((i < 5) && (j < 5)) );
System.out.println("(i < 5) oppure (j < 5) e' "
+ ((i < 5) || (j < 5)) );
System.out.println("ne' (i < 5) ne' (j < 5) e' "
+ (!(i < 5) && !(j < 5)) );
}
}
Analizzare la seguente applicazione per la tavola di verità del connettivo 'o' (con lo stesso significato del 'vel' latino). Un connettivo, più in generale, consente di mettere insieme due distinte espressioni a valore vero/falso in un'unica espressione dello stesso tipo
public class TavoleVeritaProva {
public static void main(String[] args) {
boolean p = false;
boolean q = false;
do{
do{
System.out.println("p = " + p +" q = " + q + " p||q = " + (p||q) );
q=!q;
}while (q);
p=!p;
}while (p);
}
}
Modificarla opportunamente per la tavola di verità di p e non p o q; il connettivo 'e' è rappresentato dai due simboli '&&', il connettivo 'o' dai due simboli '||' mentre il connettivo 'non' è rappresentato dal simbolo '!'.
Aggiungere alla classe Mat un metodo
public static boolean circaUguali(double x, double y)
in grado di valutare se due numeri reali sono circa uguali,
che cioè dia 'true' nel caso x e y siano entrambi circa uguali a zero con approssimazione 1E-14 oppure lo sia
Math.abs(x-y)/(Math.abs(x)*Math.abs(y))
e dia 'false' altrimenti
Errori di arrotondamento e rappresentazione interna
Considerare la seguente applicazione
public class ProvaAppross{
public static void main(String[] arg){
double f=4.35;
int n = (int) (100*f);
System.out.println(n);
}
}
Fare una previsione sul risultato dell'applicazione? Eseguirlo per vedere cosa produce veramente?
Lo strano comportamento è legato alla rappresentazione
binaria di 4.35, che risulta periodica. Determinarla ricorrendo al seguente algoritmo
public class ProvAppross1{
public static void main(String[] arg){
double f=4.35;
// La parte intera del numero è (int)f
// quindi la parte decimale 0.35 si ottiene da:
double d = f - (int) f;
// Ora la parte decimale viene convertita in binario:
System.out.print("0.");
do {
d=2*d;
System.out.print((int)d);
d= d - (int)d;
} while (d>0);
System.out.println();
}
}
Per chiarire meglio la questione eseguire la seguente applicazione
che mette in forma polinomiale la parte decimale 0.35 del numero decimale
public class ProvAppross2{
public static void main(String[] arg){
double f=4.35;
// La parte intera del numero è (int)f
// quindi la parte decimale 0.35 si ottiene da:
double d = f - (int) f;
double ris=0;
long pot2=2;
System.out.print("0");
do {
d=2*d;
System.out.print(" + "+(int) d+"/"+pot2);
ris +=(double) ((int) d ) / pot2;
pot2 *=2;
d= d - (int)d;
} while (d>0);
System.out.println("... = "+ris);
}
}
NOTA: Al termine di ogni sessione di lavoro fare una copia del floppy e poi
spegnere il computer con Start/Chiudi sessione/Arresta il sistema.
pagine di Roberto Ricci
L.S. "A. Righi", Bologna.
Ultima revisione