Esercitazioni JAVA


pagine di Roberto Ricci L.S. "A. Righi", Bologna. Ultima revisione


 
 
 

Per iniziare


 
  1. Inserire il floppy personale per salvare le esercitazioni nel dirive A:
  2. Aprire il file fond1eo\Es3.htm per leggere e seguire l'esercitazione
  3. 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.
    1. Aprire l'ambiente JCreator facendo doppio Click sull'icona presente sul Desktop
    2. Ridimensionare la finestra in modo che sia visibile anche quella con il testo dell'esercitazione
    3. Aprire con File/New una finestra di editor scegliendo l'opzione Files, indicare il Filename: MinMaxVarDemo e la Location: A:\
    4. 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);
      
          }
      }
      
    5. Salvarlo in A: con File/Save. Viene automaticamente aggiunta l'estensione .java
    6. Riaprire la finestra sul drive A:, controllare la presenza dei file MinMaxVarDemo.java, poi rimettere da parte la finestra
    7. Tornare nella finestra editor di JCreator e compilare con Build/Compile File
    8. Seguire le indicazioni del compilatore per correggere eventuali errori.
    9. A correzione avvenuta salvare di nuovo con File/Save
    10. Controllare la presenza in A: del file MinMaxVarDemo.class
    11. Tornare nella finestra editor di JCreator ed eseguire con Build/Execute File
    1. 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 ...
        }
      }
      
    2. 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.
  1. 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;
      }
    
    }
    
  2. Aggiungere alla classe Mat un metodo per trasformare un numero reale in un arrotondamento che abbia un numero prefissato di decimali

 
 

Espressioni e variabili boolean; classe Random; tavole di verità; metodo Mat.circaUguali(float, float);


 
 
  1. 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)) );
      }
    }
    
    1. 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);
        }  
      }
      
    2. 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 '!'.
  2. 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


 
  1. 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);
    	}
    }
    
  2. Fare una previsione sul risultato dell'applicazione? Eseguirlo per vedere cosa produce veramente?
  3. 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();
          }
    }
    
  4. 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