Laboratorio III: 17-Ott-2005

Parte I
Linguaggio Java: Metodologia di programmazione delle classi
Metodologia In questo laboratorio inizieremo a programmare classi in java.
Per programmare una classe e' bene seguire le seguenti fasi:

1/ Progettare la classe

1.1 Definire le variabili di esemplare
E' necessario individuare le variabili di esemplare (quante? quali? dipende dalla classe!). Per ciascuna variable di esemplare si deve, poi,  definire tipo e nome.

1.2 Definire l'interfaccia pubblica
Definire i costruttori e i metodi da realizzare e per ciascuno scrivere la firma, in modo da definire  gli eventuali parametri e tipi di dati restituiti, seguita dal corpo vuoto.
Se un metodo restituisce un tipo di dati, scrivere nel corpo la sola istruzione return seguita da:
- false     se il metodo restituisce un valore di tipo boolean
- 'a'       se il metodo restituisce un valore di tipo char
- 0         se il metodo restituisce un valore numerico (byte, short, int, long, float, double)
- null      se il metodo restituisce un riferimento a un oggetto
E' importante programmare l'istruzione return perche' questo ci permette di compilare senza errori i metodi prima di scriverne il codice.
Quando si scrive il metodo si modifica l'istruzione return secondo quanto richiesto dal metodo.

2/ Scrivere il codice
Usando un editor di testi scrivere il codice, iniziando dalla definizione delle costanti e delle variabili di esemplare.
L'editor deve essere impostato nel seguente modo:
- tabulazione pari a 3 caratteri
- indentazione automatica pari a 3 caratteri
- conversione tabulazione in caratteri
(Si veda Horstmann 3^ Ed. cap. 6 Consigli per la produttivita' 6.1 pag.176)
VERIFICARE LE IMPOSTAZIONI DEL PROPRIO EDITOR!!!
 Non appena si e' realizzato un metodo, si deve compilare e correggere gli errori di compilazione. (Se il metodo e' complicato compilare anche prima di terminare il metodo).
NON ASPETTATE DI AVER CODIFICATO TUTTA LA CLASSE PER COMPILARE!!!

Se fate questo, vi troverere, probabilmente,  a dover affrontare un numero elevato di errori, col rischio di non riuscire a venirne a capo in un tempo ragionevole (come quello a disposizione per la prova d'esame)..

3/ Provare la classe
In questo laboratorio non impareremo a provare le classi. Lo faremo nei prossimi. Oggi le classi saranno provate in modo molto semplice usando classi di prova fornite dal docente.

Buon lavoro. :) AL

Parte II
Linguaggio Java: programmare semplici classi
Una soluzione possibile
Numeri complessi In Java non esiste un tipo di dati fondamentali per rappresentare i numeri complessi. Per elaborare numeri complessi è necessario scrivere una classe.
Si scriva la classe Complex con la seguente Interfaccia publica per la gestione di numeri complessi.
Attenzione: l'esercizio richiede solo le semplici nozioni sui numeri complessi riportate qui.


Osservazioni e suggerimenti:

1/ Variabili di esemplare:
definite due variabili di esemplare per memorizzare, rispettivamente, la parte reale e la parte immaginaria del numero complesso.

2/ Esempio per la realizzazione dei metodi: il metodo add()
public Complex add (double z)
{
   /*
   costruisco un numero complesso di parte reale re + z.re
   e parte immaginaria im + z.im.

   Nota1: re e im sono le variabili di esemplare del parametro implicito. Il metodo
   add() verra' invocato nel programma chiamante nel seguente modo:
   c1.add(c2); // dove c1 e c2 sono due riferimenti a oggetti di classe Complex
   definiti e inizializzati precedentemente.

   Nota2: z.re e z.im sono le variabili di esemplare dell'oggetto z. Si pou'
   usare questa notazione per accedere alle variabli di esemplare private
   solo
all'interno della classe.
   */

   Complex c = new Complex (re + z.re, im + z.im);
   return c;
}

3/ Tipo di dati restituiti dai metodi
I metodi possono ritornare riferimenti a oggetti.
I metodi della classe Complex restituiscono riferimenti a oggetti di classe Complex! Questo e' possibile e molto comune in java.

Provare la classe Complex con la classe di prova ComplexTester fornita. La classe richiede l'immissione da Standard Input di due numeri complessi, uno per riga, nel formato x, y <Enter>, dove x (parte reale) e,  y (parte immaginaria) sono separate dal carattere ','. Fornisce a Standard Output: somma, sottrazione, prodotto, divisione, elementi inversi e coniugati dei numeri. Provatela con numeri semplici, in modo da verificare i risultati ottenuti.
Complex.java
ComplexTester.java


Triangolo
qSi scriva la classe Triangolo, che descrive un triangolo,  con la seguente interfaccia pubblica Triangolo.html.

Qui ci sono dei suggerimenti. Non leggeteli subito, ma solo se non riuscite a scrivere la classe da soli.
Provare la classe Triangolo con le classi di prova fornite, una che legge i dati da standard input, l'altra da dialogBox. Provate triangoli semplici.
Triangolo.java
ProvaTriangoloStdIO.java
ProvaTriangoloJOptionPane.java


Parte III
Linguaggio Java: decisioni e cicli. Semplici classi eseguibili
Una soluzione possibile
Una semplice successione di numeri interi
Scrivere un programma che invia all'output standard la successione dei numeri interi da 1 a n (n compreso), dove n e' letto da Standard Input
Provare a stampare i primi 200 numeri.

Casi particolari:
n <= 0: stampare un messaggio del tipo: "Ingresso non ammesso".
Enumeratore.java
Migliorare la stampa
qModificare il programma precedente in modo che stampi i numeri incolonnati in 10 colonne.
Provare a stampare i primi 200 numeri.
EnumeratoreInColonna.java
Migliorare ancora
Modificare il programma precedente in modo che ciascun numero stampato abbia almeno 5 caratteri (spazi a sinistra se il numero ha meno di 5 cifre).
Provare a stampare i primi 200 numeri.
EnumeratoreEquispaziato
Riconoscere i numeri primi
Scrivere un programma che legga da standard input una serie di  numeri interi positivi (uno alla volta) e per ciascun numero segnali  su output standard se il numero e' primo o ha divisori. Il programma termini quando viene letto il carattere Q.

Definizione di numero  primo
Un numero intero positivo n > 0 e' primo se e solo i suoi soli divisori sono 1 e n stesso.
Per verificare se un numero intero positivo n e' primo si divida  n per i numeri interi dell'insieme J = {j | j >= 2 && j*j <= n}. Se viene trovato anche un solo divisore, il numero n non e' primo.
L'algoritmo non e' efficiente. Un algoritmo piu' efficente sarebbe 'Il Crivello di Eratostene', ma non sappiamo ancora programmarlo.

Casi particolari:
- n <= 0: stampare un messaggio del tipo: "Ingresso non ammesso".
- fare attenzione ai casi particolari n = 1, 2, 3 per i quali l'insieme  J  e'  vuoto.
RiconoscitoreNumeriPrimi
Ancora numeri primi
Scrivere un programma che  legga da standard input  un numero intero positivo n e stampi su standard output i numeri primi compresi fra 1 e n (n compreso).
EnumeratoreNumeriPrimi.java
Massimo Comun Denominatore (MCD) con l'algoritmo di Euclide
Scrivere  un programma che calcoli il massimo comun divisore (MCD) fra due numeri interi positivi m e n.
Si acquisiscano i numeri m e n da standard input e si visualizzi il risultato a standard output.

Algoritmo di Euclide per il calcolo del MCD
Siano m e n due numeri interi positivi con m > n .
1. finche' il resto dell divisione di m per  n e' diverso da zero si ponga
   2. il nuovo m diventa  n precedente, il nuovo n  diventa  ( m  precedente %  n  precedente)
3. Quando il resto e' zero, allora MCD  =  n
MCD.java
Fattori primi
Scrivere un programma che esegua la scomposizione in fattori primi di un numero intero positivo n. Si acquisisca il numero da standard input e si visualizzi la fattorizzazione a standard output.
Esempio di fattorizzazione: 12 = 2 * 2 * 3
Fattorizzatore.java
Fibonacci il Grande
Scrivere un programma che stampi su output standard i primi n termini della successione di Fibonacci. Il numero n sia acquisito da standard input .

Successione di Fibonacci
f(0) = 1, f(1) = 1,
f(k) = f(k-2) + f(k-1) per k > 2

Esempio: 1, 1,  2,  3,  5,  8,  13,  21,  34, ...
La successione fu introdotta da Leonardo da Pisa detto Fibonacci (Pisa, 1175-1235 d.c.) per descrivere l'evoluzione di una popolazione di conigli a partire da un'unica coppia, nell'ipotesi che a tempo fisso (ad esempio ogni mese) ciascuna coppia generi una nuova.
Nell'esempio che segue n sia il numero progressivo del mese, sia C = coppia adulta in grado di generare, n = coppia appena nata che raggiunge la maturita' dopo un mese:
n   popolazione  f(n)
0   n            1

1   C            1
2   C + n        2
3   2C + n       3
4   3C + 2n      5
5   5C + 3n      8
...


Attenzione
 I numeri della successione di Fibonacci crescono rapidamente tanto che il tipo di dati di java int non risulta adatto a memorizzare piu' di circa 40 termini della successione.
Il file fibonacci.txt elenca i primi 35 numeri della successione.
GeneratoreFibonacci.java
Numeri triangolari
Scrivere un programma che stampi a standard output i primi n numeri triangolari. Il numero n sia acquisito da standard input.

Numeri triangolari
Il numero traingolare n-esimo e' pari alla somma dei numeri   n + (n - 1) +  (n - 2) + ...+ 2 + 1.
I numeri trangolari sono generati dalla successione
t(n) = n * (n + 1) / 2 = n + (n - 1) + (n - 2) + ... + 2 + 1, per n >= 1
Si chiamano triangolari perche' sono pari ai numeri di punti evidenziati  nei  triangoli seguenti:
                                              *
                                  *          * *
                        *        * *        * * *
                *      * *      * * *      * * * *
          *    * *    * * *    * * * *    * * * * *
      *  * *  * * *  * * * *  * * * * *  * * * * * *

n    1  2    3     4       5         6
t(n) 1  3    6     10      15        21
in cui ogni triangolo si puo' ricavare dal precedente aggiungendo la fila di base.
Il file triangolari.txt elenca i primi 100 numeri triangolari.
GeneratoreNumeriTriangolari

ProvaCalcolatoreNumerico.java