Laboratorio IV: 24-Ott-2005

Parte I Linguaggio Java: decisioni e cicli. Semplice classe non eseguibile. Collaudo con classe di prova
Una soluzione possibile
Calcolatore Numerico Impariamo a codificare l'elaborazione in metodi e a ri-utilizzare il codice.

Scrivere i metodi statici della seguente classe:

public class CalcolatoreNumerico
{
   /**
     verifica se un numero e' primo
     @param n numero intero su cui effettuare la verifica
     @return true se n e' primo, false altrimenti
   */
   public static boolean primo(int n)
   {
      // qui va il codice
   }
  
   /**
     restituisce il MCD fra due numeri interi positivi
     @param p primo operando
     @param q secondo operando
     @returm massimo comun divisore fra p e q
   */
   public static int mcd(int p, int q)
   {
      // qui va il codice
   }
  
   /**
     restituisce una stringa contenente la scomposizione in fattori primi di un
     numero intero positivo

     Esempio: se n = 42, la stringa restituita e' "2 * 3 * 7"
     @param n numero da scomporre in fattori primi
     @return stringa contenente la scomposizione in fattori primi
   */
   public static String fattori(int n)
   {
      // qui va il codice
   }
  
   /**
      restituisce il termine n-esimo della successione di fibonacci
      @param n numero intero positivo
      @return termine di indice n nella successione di Fibonacci
   */
   public static long fibonacci(int n)
   {
      // qui va il codice
   }
  
   /**
      restituisce il termine n-esimo della successione dei numeri triangolari
      @param n numero intero positivo
      @return  termine di indice n nella successione dei numeri triangolari
   */
   public static int triangolare (int n)
   {
      // qui va il codice
   }
}


L'interfaccia pubblica e', inoltre, documentata in CalcolatoreNumerico.html. la classe contiene solo metodi statici e non e' eseguibile.

GESTIONE DELLE PRECONDIZIONI
Nei metodi si verifichino i valori dei parametri (le precondizioni) e, nel caso in cui assumano valori non ammessi, si lanci l'eccezione java.lang.IllegalArgumentException o, in alternativa, si gestisca con un'asserzione.

OSSERVAZIONI:
La classe CalcolatoreNumerico non e' eseguibile, perche' non contiene il metodo main(). Si provino i metodi con la classe di prova ProvaCalcolatoreNumerico di cui si fornisce solo il bytecode (Si scarichi il bytecode nella directory di lavoro e si esegua).

Si noti come conoscendo l'interfaccia pubblica della classe CalcolatoreNumerico sia possibile scrivere la classe di prova ProvaCalcolatoreNumerico, prima della realizzazione della classe CalcolatoreNumerico.

Si scriva il codice della classe di prova ProvaCalcolatoreNumerico che si comporti come quella di cui si e' fornito il bytecode.
CalcolatoreNumerico.java
ProvaCalcolatoreNumerico.class

Parte II
Integrated Development Environment (IDE) BlueJ
IDE BlueJ IDE sta per Integrated Developmnebt Environment, cioe' Ambiente di Sviluppo Integrato. BluJ e' un semplice  IDE per programmare in java. Il programma stesso BlueJ e' scritto in java!!!
Un IDE aiuta nella programmazione, nella compilazione e nella prova delle classi.
Si avvii BluJ da menu.
Dal menu Project si selezioni New Project e si definisca un nuovo progetto chiamato Calcolatore. Si salvi il progetto nella directory di lavoro $HOME/lab4. BluJ crea una nuova directory col nome del progetto.

Dal menu Edit si selezioni Add Class From File e si aggiunga il file $HOME/lab4/CalcolatoreNumerico.java.
Comparira' un rettangolo che rappresenta la classe.
 

Per avviare l'editor e leggere il file di testo CalcolatoreNumerico.java fare doppio click sulla classe o, in alternativa, posizionarsi sulla classe e fare click con il pulsante destro del mouse e selezionare OpenEditor. Si apre una nuova finestra contenente l'editor.

Compilare la classe calcolatoreNumerico. Per eseguire la compilazione si puo', in alternativa,
* compilare all'interno dell'editor facendo click sul riquadro Compile presente nella finestra dell'editor
* selezionare la classe (il rettangolo) e fare click sul rettangolo Compile a sinistra
* selezionare la classe e nel menu Tool selezionare Compile
*
posizionarsi sulla classe, fare click con il tasto a destra del mouse e selezionare Compile.
Se ci sono errori di compilazione vengono evidenziati nella barra posta al di sotto della finestra dell'editor. Gli errori vengono evidenziati nel testo.
L'ambiente e' utile a provare i metodi della classe. Si voglia provare il metodo
boolean primo(int n).
Selezionare la classe, fare click col tasto destro del mouse e selezionare il metodo dal menu. Compare una finestra in cui e' possibile passare i parametri effettivi del metodo.

Dal menu help si puo' selezionare BlueJ Tutorial che vi insegna ad usare l'IDE. Questo e' il tutorial (in inglese).

D'ora in poi potete programmare usando BlueJ. Dovete aprire un progetto e dal menu Edit selezionare New Class. Si apre un menu in cui introdurre il nome della classe. Compare nel vostro progetto un nuovo rettangolo che rappresenta la classe. Facendo click sulla nuova classe aprite l'editor e iniziate a programmare.

Parte III Array e cicli: il Crivello di Eratostene
Una soluzione possibile
Calcolatore Numerico Nella classe CalcolatoreNumerico precedente si modifichi il metodo
public static boolean primo(int n)
applicando l'algoritmo del Crivello di Eratostene.

Suggerimento:
Si ricordi che l'algoritmo di Eratostene opera eliminando da una successione di numeri quelli che non sono primi.
Se n è il numero intero su cui viene effettuata la verifica, si predisponga un array di dati di tipo fondamentale boolean con (n + 1) elementi.  Ciascun numero intero k, con 0 <= k <=  n , sia rappresentato dall'elemento dell'array di indice k. Inizialmente si considerino tutti i numeri primi. (Elemento dell'array a false sta a significare che il numero corrispondente all'indice dell'elemento non ha divisori)  Successivamente si vada a cancellare i numeri che hanno divisori,  marcando l'elemento corrispondente nell'array con true.

Algoritmo:
1.  definire l'array  di boolean di n+1 elementi
2.  definire e inizializzare il contatore j a 2
3.  finche' il numero e' senza divisori && j * j < = n si ripeta il passo 4
4.     assegnare true agli elementi dell'array di indice multiplo di j
5.  restituire il valore negato dell'elemento dell'array di indice n


Verificare il corretto funzionamento con i numeri: 1, 2, 3, 4, 8, 1009, 516163

Per rendere eseguibile la classe inserire il metodo public static void main(String[] args) con il quale provare il metodo realizzato.
Provate il metodo anche in BlueJ.
CalcolatoreNumericoEratostene.java


Parte IV
Linguaggio Java: classi, semplici algoritmi degli array
Una soluzione possibile
Analizzatore di testo
1. Scrivere la classe AnalizzatoreDiTesto la cui interfaccia pubblica e' definita in  AnalizzatoreDiTesto.html.
La classe memorizza un testo e rende disponibili metodi per semplice analisi dei testi.

Suggerimento:
Usare la tecnica degli array riempiti solo in parte. Ridimensionare dinamicamente gli array in modo che la classe possa memorizzare un numero indefinito di stringhe.

2. Scrivere poi la classe eseguibile AnalisiTesto che:
a.  legga un testo da standard input  una riga alla volta e memorizzi le righe in un oggetto di classe AnalizzatoreDiTesto.
b.  esegua la seguente elaborazione
- separi il testo in parole
- elimini dalle parole del testo i caratteri non alfabetici
- renda minuscoli tutti i caratteri del testo
c.  scriva a standard output:
  * il testo originale
  * il numero delle parole contenute nel testo
  * la  prima e l'ultima parola secondo l'ordine lessicografico
  * le 5 parole che compaiono piu' volte nel testo in ordine di occorrenza decrescente.

Suggerimento (da leggere prima di iniziare a lavorare).

Programmare usando BlueJ.

Provare la classi con re-indirizzamento dello standard input sul file omero.txt o su un qualsiasi file di testo.
AnalizzatoreDiTesto.java
AnalisiTesto.java


Parte V
Consultare la documentazione di java
Collegamenti
javadocs
Nella documentazione di java in linea presso l'aula Taliercio consultare la documentazione relativa ai seguenti componenti della libreria standard:
- classe java.util.Scanner: quanti costruttori ha?
- metodo java.lang.Math.round():  e' sovraccarico?
- classe java.lang.Math: ha variabili di esemplare pubbliche?
- classe java.lang.Integer: ha variabili di esemplare pubbliche?
- classe java.util.Scanner: ha un metodo useDelimiter()? che cosa fa il metodo?
- classe java.util.Random: che cosa restituiscono i metodi nextDouble() e nextInt()?

Saper consultare rapidamente la documentazione in linea nel sito dell'Aula Didattica Taliercio e' molto importante. Infatti in sede di prova pratica di esame, questa sarà la sola documentazione disponibile.
Trovatelo da soli.
Se non lo trovate e' qui.