Esercitazione del 22-Ott-2007
versione del 21-Ott-2007



Parte I
Argomento: linguaggio Java - Acquisire dati da Standard Input - Esercizi molto semplici La mia soluzione
Ricevere dati di tipo diverso Scrivere un programma che acquisisca da standard input tre dati di tipo diverso nella stessa riga: un numero intero, una parola e un numero in virgola mobile e li invii  a standard output nell'ordine inverso.
Esempio:
$java Echo7
introduci un  numero intero, una stringa e un numero in virgola mobile: 7 ciao 5,1
5,1 ciao 7

NB: inserite i numeri in virgola mobile usando come carattere di separazione fra parte intera e parte frazionaria la virgola, come nell'esempio riportato sopra. Il sistema stampera' numeri in virgola mobile usando come carattere di separazione il punto. nella parte II sistemeremo questo piccolo inconveniente.
Echo7.java
Convenzioni locali In JDK5.0 ulcune di funzioni di ingresso/uscita sono 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 scriverla?
LocalTester.java
Ricevere dati di tipo diverso usando la localizzazione
Scrivere la classe Echo8 che si comporti come la classe Echo7, ma che accetti in ingresso numeri in formato virgola mobile contenenti il punto come separatore anziche' la virgola.
Compilare ed eseguire.
Echo8.java
Gestire dati di tipo diverso usando la localizzazione Scrivere la classe Echo9 che si comporti come la classe Echo7, ma che usi in ingresso e uscita numeri in virgola mobile contenenti la virgola, anziche' il punto.
Compilare ed eseguire.
Echo9.java

Parte II
Argomento: linguaggio Java - Esercizi meno semplici La mia soluzione
Convertire da decimale a binario
Scrivere un programma che acquisisca da standard input  (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.
Si provi il programma con i seguenti dati di ingresso (casi di prova):
16.25   in base dieci = 10000.01000 in base due
10.75   in base dieci = 01010.11000 in base due
8.125   in base dieci = 01000.00100 in base due
4.0625  in base dieci = 00100.00010 in base due
2.03125
in base dieci = 00010.00001 in base due

Si provi il programma con almeno altri quattro casi di prova a scelta dello studente.

Algoritmo: si usino gli algoritmi di conversione da decimale a binario della parte intera e della parte frazionaria presentati a lezione.

NOTA1: sia double d una variabile contenente un numero positivo, allora
   int pIntera = (int) d;       // parte intera del numero d
   double pFraz = d - pIntera;  // parte frazionaria del numero d

NOTA2: nella conversione della parte frazionaria dopo aver moltiplicato per 2, si calcoli la parte intera e la parte frazionaria
Esempio: convertire la parte frazionaria 0.35
   0.35 * 2 = 0.7, pIntera = 0; pFraz = 0.7
   0.7  * 2 = 1.4, pIntera = 1; pFraz = 0.4
   0.4  * 2 = 0.8, pIntera = 0; pFraz = 0.8
   ...
MioConvertitoreBinario.java
Convertire numeri da base decimale a base generica
Scrivere un programma che converta un numero intero positivo da base decimale a una generica base b con 2 <= b <= 10 . Il risultato della conversione sia sempre espresso con otto cifre.
La base e il numero da convertire siano acquisiti da standard input (o da un 'dialog box' ).
Algoritmo: si usi la definizione di base numerica
   125 in base 8 = 1 * 8^2 + 2 * 8^1 + 5 * 8^0

Si esegua il programma usando in ingresso i seguenti casi di prova:
   64 in base 10 = 00000100 in base 8
   10 in base 10 = 00000101 in base 3
   36 in base 10 = 00000051
in base 7
   49
in base 10 = 00000144 in base 5

Si provi il programma con almeno altri quattro casi di prova a scelta dello studente.
ToGenericBaseConverter.java

Parte III Scoprire javadoc
Esercitazione

Copiare nella directory ./lab3/ il file sorgente Dado.java.
Nella directory home/lab3 provare a dare da terminale i comandi:
[user@adtxx lab3]ls
[user@adtxx lab3]javadoc Dado.java
[user@adtxx lab3]ls
Osservare che il comando javadoc ha creato il file Dado.html e altri file con estensione .html.  Aprire il file Dado.html.con un web browser.
Quello che vedete e' la documentazione dell'interfaccia pubblica della classe Dado.

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 */:
/**
   questo e' un commento nello stile javadoc
*/
Si vedano ad esempio i commenti delle classi introdotte oggi al laboratorio.
I token :
@author nome_autore
@version versione
se inseriti nel commento della classe in stile javadoc identificano l'autore e la versione del codice.

I token :
@param nome_parametro descrizione
@return descrizione
se inseriti nel commento di un metodo nello stile javadoc descrivono i parametri espliciti e il dato restituito da un metodo.

Guardare lo stile con cui sono stati scritti i commenti del metodo lancia() della classe Dado.
javadoc
wildcards Spiegazione della notazione *.java.
Nei comandi da shell, sia in linux sia in MS Windows, 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.