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. |