Laboratorio II: 10-Ott-2005

Parte I
Argomento
Collegamenti
Convenzioni locali
JDK5.0 prevede che una serie di funzioni di ingresso/uscita siano dipendenti da convenzioni in uso localmente, dette impostazioni locali.
Esempi di impostazioni locali sono il formato dell'ora e il carattere di separazione nei numeri espressi in virgola mobile.
Come e' noto, nel mondo anglosassone il carattere di separazione fra la parte intera e la parte frazionaria e' il carattere '.', mentre in Italia e' il carattere ','.
Quando si usano oggetti di classe java.util.Scanner per acquisire in ingresso dati il programmatore puo' scegliere esplicitamente l'impostazione locale.
Se non sceglie, viene usata quella dell'elaboratore su cui viene eseguito il programma, detta impostazione di default.
La scelta dell'impostazione locale si fa invocando sull'oggetto di classe Scanner  il metodo useLocale(Locale locale) della classe Scanner che accetta come parametro un oggetto di classe Locale del pacchetto java.util della libreria standard.

La classe java.util.Locale contiene la definizione di comodi oggetti costanti da usare come parametro; ad esempio:
Locale.US      oggetto costante per le impostazioni locali americane (USA)
Locale.ITALY   oggetto costante per le impostazioni locali italiane

Di seguito un esempio di uso esplicito di impostazioni locali:

import java.util.Scanner;
import java.util.Locale;
...
      Scanner in = new Scanner(System.in);
      in.useLocale(Locale.US);
....

Anche gli oggetti di classe java.io.PrintStream come System.out possono adoperare impostazioni locali. In questo caso si usa il metodo
format(Locale locale, String format, Object ...args)
che invia al flusso di uscita la stringa format. Si usano le formattazioni introdotte per il metodo printf() della stessa classe.
Ad esempio, per stampare a standard output un numero in virgola mobile con una impostazione locale italiana si scrive:

import java.util.Locale;
...
double d = 12.3;
System.out.format(Locale.ITALY, "%f", d);
...

Salvate la classe LocalTester.java riportata a fianco senza leggere il codice. compilatela ed eseguitela. Inserite i dati come richiesto.
Sapreste riscriverla?
LocalTester.java





Parte II
Argomento: linguaggio Java
Una soluzione possibile
Invertire l'ordine delle parole in una riga
Leggere da standard input una riga composta da cinque parole e inviare a standard output una riga in cui le parole sono disposte in ordine inverso.
Esempio:
input: uno due tre quattro cinque
output: cinque quattro tre due uno
FiveWordsLineReverser.java
Spaziare un numero I
qLeggere da standard input un numero intero positivo avente al massimo 5 cifre e visualizzare sull’output standard le singole cifre del numero separandole con uno spazio. Ad esempo il numero 12345 verra' visualizzato come 1 2 3 4 5, il numero 123 come 0 0 1 2 3.

Algoritmo: applicare la definizione di notazione posizionale in base 10 e le proprieta' delle operazioni
fra numeri interi divisione e modulo.

Il link Algorimo.html, a fianco, vi porta all'algorimo da applicare: usatelo solo se non riuscite a descrivere da soli il vostro algoritmo.

Il link Spaziatore.java vi porta alla classe che risolve l'esercizio. Consultatelo solo se non riuscite a scrivere il programma dopo aver provato a costruire la soluzione da soli per almeno 15 - 20 min.

Verificare il comportamento della classe con dati di ingresso non ammessi quali:
- numeri con piu' di cinque cifre
- numeri negativi
- numeri frazionari
- ingressi non numerici, ad esempio "ciao"
Algoritmo.html
Spaziatore.java
Spaziare un numero II
Riscrivere la classe precedente usando il metodo substring(int, int) della classe java.lang.String  per estrarre i singoli caratteri dalla stringa di ingresso.

Che cosa succede se il numero introdotto
- ha meno di cinque cifre?
- e' frazionario?
- e' negativo?
- non e' un numero ma una stringa di cinque caratteri come "ciao!"
SpaziatoreStringa.java
Spaziare un numero III Riscrivere la classe precedente usando il metodo charAt(int) della classe java.lang.String  per estrarre i singoli caratteri dalla stringa di ingresso.

Che cosa succede se il numero introdotto
- ha meno di cinque cifre?
- e' frazionario?
- e' negativo?
- non e' un numero ma una stringa di cinque caratteri come "ciao!"
SpaziatoreCarattere.java
Convertire da decimale a binario
Scrivere un programma che acquisisca dall'input standard (o da un 'dialog box' ) un numero frazionario positivo n nell'intervallo [0, 32),  ne stampi a standard output la codifica binaria in formato a virgola fissa usando cinque cifre binaria per entrambe le parti intera e frazionaria.
Esempio: 8.5 in base dieci  = 01000.10000 in base due.
Compilare ed eseguire.
Algoritmo: si usino gli algoritmi di conversione da decimale a binario della parte intera e della parte frazionaria presentati a lezione.
MioConvertitoreBinario.java
Convertire numeri da base decimale a base generica
Scrivere un programma che converta un numero intero decimale positivo  in una generica base b con 2 <= b <= 9. Il risultato della conversione sia sempre espresso con otto cifre.
La base e il <numero da convertire siano acquisiti da input standard (o da un 'dialog box' ).
Algoritmo: si usino la definizione di base numerica.
ToGenericBaseConverter.java

Parte III
Argomento: approfondimento sulla rappresentazione dell'informazione
Esempi
I limiti del codice ASCII
Il linguaggio Java supporta pienamente la codifica Unicode. Non cosi' accade per tutti i sistemi operativi.
Scrivere un programma che stampi una riga di testo contenente caratteri Unicode non appartenenti al codice ASCII (codici Unicode superiori a 127 decimale o 007F esadecimale), quali i caratteri  'à',  'ò',  ' è', ' ì', ' ù'.
Compilare ed eseguire il programma nei sistemi operativi Linux (in laboratorio) e Windows (a casa se ne avete la possibilità).
I risultati sono differenti? Perche'?
ASCIItester.java
La divisione per zero nei numeri interi
Scrivere il codice della classe IntegerDivider che acquisisce due numeri interi m e n da standard input e invia a standard output il risultato e il resto della divisione m / n
Compilare e eseguire. Che cosa succede se il divisore e' zero?
IntegerDivider.java
La divisione per zero nei numeri a virgola mobile IEEE 754 a doppia precisione
Scrivere il codice della classe DoubleDivider che acquisisce due numeri reali x e y da standard input e invia  a standard output il risultato della divisione x / y.
Compilare ed eseguire. Esegue correttamente?
Provare con le coppie di numeri:
   x =  7.0   y = 0.0
   x = -7.0   y = 0.0
   x =  0.0   y = 0.0
Spiegare i risultati ottenuti
DoubleDivider.java
Errori nella rappresentazione in virgola mobile IEEE 754
Scaricare, compilare ed eseguire la classe ScontoImperfetto.java che effettua uno sconto di 50 unita' su un importo di 100 milioni di miliardi di unita' (pari a 1017).
La classe stampa i risultati ottenuti usando:
- l'aritmetica IEEE 754 doppia precisione (in java di tipo double)
- l'aritmetica  intera a 64 bit (in java di tipo long).
Compilare ed eseguire. Perche' i risultati sono diversi?
ScontoImperfetto.java
Limiti delle rappresentazioni numeriche
Scrivere una classe che invii a standard output per ciascun tipo di dati fondamentali del linguaggio Java  il massimo e il minimo rappresentabile.
SegnalatoreLimitiNumerici.java

Parte IV Scoprire javadoc
Esercitazione

Copiare nella directory ./lab2/ il file sorgente Spaziatore.java
Nella directory home/progJava provare a dare da terminale i comandi:
[user@adtxx lab2]ls
[user@adtxx lab2]javadoc *.java
[user@adtxx lab2]ls
Osservare che il comando javadoc ha creato dei file con estensione .html.  Aprire il file Spaziatore.html.con un browser.
Quello che vedete e' la documentazione della classe Spaziatore.

javadoc
javadoc e' un comando disponibile nell'ambiente Java  che produce documentazione automatica delle classi (Horstmann, par. 3.3 Commentare l'interfaccia pubblica ).
Un commento per javadoc inizia e finisce rispettivamente con i caratteri /** e */
Si vedano ad esempio i commenti delle classi introdotte oggi al laboratorio.
I token :
@author nome_autore
@version versione
se inseriti nel commento per javadoc identificano l'autore e la versione del codice.
javadoc
wildcards Spiegazione della notazione *.java usata al punto precedente
Nei comandi da shell, il carattere '*' si dice rappresentare una 'wildcard'.Lo spieghiamo con degli esempi:
- *.java significa tutti i file con estensione .java
- mioFile.* significa tutti i file di nome mioFile, qualsiasi sia l'estensione
- mio*.*    significa  tutti i file il cui nome inizia con mio, qualsiasi sia l'estensione
- *.*       significa tutti i file, qualsiasi siano il nome e l'estensione.