Esercitazione del 15-Ott-2007
versione del 14-Ott-2007


Parte I
Argomento: linguaggio Java - Acquisire dati da Standard Input - Esercizi molto semplici
La mia soluzione.
Eco
Programmare una classe eseguibile che acquisisce una stringa da standard input e invia la stringa stessa a standard output.
Echo2.java
Eco andando a capo.
qProgrammare una classe eseguibile che acquisisca una riga da standard input contenente tre parole (stringhe separate dai caratteri SP o '\t') e le stampi  una per riga nell'ordine in cui sono nella stringa.
Esempio: l'esecuzione produce le seguenti stampe, se si introduce la stringa "uno due tre"
$java Echo3
introduci tre parole nella stessa riga:  uno due tre

uno
due
tre
Echo3.java
Eco andando a capo in ordine inverso
Programmare una classe eseguibile che acquisisca una riga da standard input contenente tre parole (stringhe separate dai caratteri SP o '\t') e le stampi  una per riga in ordine inverso di acquisizione.
Esempio: l'esecuzione produce le seguenti stampe, se si introduce la stringa "uno due tre"
$java Echo4
introduci tre parole nella stessa riga:  uno due tre
tre
due
uno

Echo4.java
Ricevere e sommare numeri.
Programmare una classe eseguibile che acquisisca tre numeri in virgola mobile da standard input e stampi a standard output i tre numeri e la loro somma.
Esempio: l'esecuzione produce le seguenti stampe, se si introduce la stringa "uno due tre"
$java Echo5
introduci tre numeri in virgola mobile nella stessa riga:  1,0  2,0  3,0
1.0 + 2.0 + 3.0 = 6.0

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. Vedremo prossimamente come sistemare questo piccolo problema.
Echo5.java
Ricevere e sommare numeri. Programmare una classe eseguibile che acquisisca due numeri in virgola mobile ciascuna da una InputBox e stampi la somma dei numeri in una MessageBox.
NB: il sistema richiede di inserire i numeri in virgola mobile usando come carattere di separazione fra parte intera e parte frazionaria il punto.
Echo6.java

Parte II
Argomento: linguaggio Java - Esercizi meno semplici
La mia soluzione.
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
divisione e modulo dell'aritmetica intera.

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

Parte III
Argomento: approfondimento sulla rappresentazione dell'informazione
Esempi
I limiti del codice ASCII
Il linguaggio Java supporta pienamente la codifica Unicode. Non così 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. Perché i risultati sono diversi?

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
Argomento: usare le classi
La mia soluzione.
Dado
La classe Dado rappresenta un dado. Dado.class è il suo bytecode mentre Dado.html è la sua interfaccia pubblica. Copiare nella directory Lab2 il bytecode Dado.class. Scrivere e memorizzare nella directory Lab2 la classe eseguibile Risiko.java che effettua le seguenti operazioni:
- acquisisce da standard input il nome del primo giocatore e lo memorizza
- acquisisce da standard input il nome del secondo giocatore e lo memorizza
- lancia tre volte il dado per ciascun giocatore
- invia a standard output il risultato del lancio dei dadi

Esempio:
$java Risiko
introduci il nome del primo giocatore: rossi
introduci il nome del secondo giocatore: neri
lanci di rossi: 5 2 3
lanci di neri: 1 6 5
Risiko.java
Calendario.
La classe Calendario effettua elaborazioni relative alle date. Calendario.class è il suo bytecode. Calendario.html  la sua interfaccia pubblica.
Copiare nella directory Lab2 il bytecode Calendario.class. Scrivere e memorizzare nella directory Lab2 la classe eseguibile mainCalendario.java che effettua le seguenti operazioni:
- acquisice da standard input una data nel formato gg/mm/aaaa (es: 10/10/2007)
- calcola il giorno della settimana corrispondente alla data (es: per la data 10/10/2007 calcola Mercoledi')
- invia a standard output il messaggio "giorno della settimana data" (es: Mercoledi' 10/10/2007)
- calcola quanti giorni sono trascorsi dalla data inserita a quella odierna
- invia a standard output il messaggio "trascorsi dal data n giorni" (es: trascorsi dal 10/10/2007 5 gioni);
MainCalendario.java