Laboratorio IV: 29-Ott-2007                                                                                versione del 27-Ott-2007

Parte I
Linguaggio Java: decisioni e cicli. Classi eseguibili - Esercizi molto semplici.
La mia soluzione
Elencatore di numeri
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".
NumberLister.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.
NewLineNumberLister.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.
InColumnNumberLister.java

Parte II
Linguaggio Java: decisioni e cicli. Classi eseguibili - Esercizi di difficolta' media.
La mia soluzione
Riconoscitore di 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 se 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.
PrimeNumberRecognizer.java
Elencatore di 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).

Algoritmo
1. per tutti i numeri j da 1 a n estremi compresi
   2. se il numero j e' primo inviare il numero a standard output
PrimeNumberLister.java

Parte III
Linguaggio Java: decisioni e cicli. Classi eseguibili - Esercizi un po' piu' difficili
La mia soluzione
Calcolatore del Massimo Comun Denominatore (MCD) con l'algoritmo di Euclide
Scrivere  un programma che calcoli il massimo comun divisore (MCD) fra due numeri interi positivi p e q.
Si acquisiscano i numeri da standard input e si visualizzi il risultato a standard output.

Algoritmo di Euclide per il calcolo del MCD
Siano p e q due numeri interi positivi con p  >  q.
1. finche' il resto dell divisione di p per q e' diverso da zero si ponga
   2. il nuovo p diventa  q precedente, il nuovo q  diventa  ( p  precedente %  q  precedente) (tmp <- p, p <- q, q <- tmp % q)
3. Quando il resto e' zero, allora MCD  =  q

Esempio
Trovare il MCD fra i numeri 49 e 35 applicando l'algoritmo di Euclide.
si ponga p = 49 q = 35
Passi Iterativi:
prima iterazione:   p = 35 q = 14
seconda iterazione: p = 14 q = 7
terza iterazione :  p = 7 q = 0
Fine Iterazione
Il risultato e' p = 7

Casi particolari:
- se p o q non sono numeri positivi, inviare un messaggio all'operatore e terminare il programma
- garantire che p >= q
MCDcomputer.java
Fattorizzatore in numeri 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
FactorResolver.java
Generatore della successione di 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 45 termini della successione.
Il file fibonacci.txt elenca i primi 35 numeri della successione.
FibonacciSequenceGenerator.java
Generatore della successione dei Numeri Triangolari
Scrivere un programma che invii 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.
TriangularNumberGenerator.java

Parte IV
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 l'intestazione, in modo da definire  gli eventuali parametri e tipi di dati restituiti, seguita dal corpo vuoto.

2/ Scrivere il codice

2.1 Configurare correttamente l'editor
L'editor deve essere impostato nel seguente modo:
- tabulazione pari a 3 caratteri
- indentazione automatica pari a 3 caratteri
- conversione tabulazione in caratteri

VERIFICARE LE IMPOSTAZIONI DEL PROPRIO EDITOR!!!

2.2 Definire le costanti le variabili di esemplare
Dopo aver definito le costanti e le variabili di esemplare, compilare e correggere eventuali errori.

2.3 Scrivere l'intestazione dei metodi pubblici
Scrivere l'intestazione dei metodi pubblici 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.
Se il metodo non restituisce un tipo di dati non serve scrivere nulla.
Dopo aver scritto l'intestazione dei metodi, si compili e si correggano eventualie errori

2.4 Realizzare i metodi
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 V
Linguaggio Java: programmare classi
La mia soluzione
Punti nel piano
Modificare la classe MyPoint2D.java aggiungendo i seguenti metodi pubblici
/**
   genera un punto traslando questo punto
   @param deltaX traslazione lungo l'asse x
   @param deltaY traslazione lungo l'asse y
   @return il punto ottenuto traslando questo punto
*/
public MyPoint2D translate(double deltaX, double deltaY) {...}

/**
   verifica se due punti sono coincidenti
   @param q il punto da confrontare
   @return true se i due punti coincidono, false altrimenti
*/
public boolean isCoincident(MyPoint2D q) {...}

L'uso di questi metodi e' il seguente:
...
MyPoint2D p = new MyPoint2D(1, 1); // punto (1,1)
...
MyPoint2D r = p.translate(2, 2);   // punto (3, 3)

if (p.isCoincident(r))              // la condizione logica e' valutata false
{
...
}

Si provi la classe modificata con la seguente classe di prova: MainMyPoint2D.java.
MyPoint2D.java
Triangolo Si scriva la classe Triangolo, che rappresenta un triangolo, con la seguente interfaccia pubblica Triangolo.html. Leggere completamente la spiegazione dei metodi!

Attenzione il costruttire accetta parametri di tipo intero, quindi la classe gestisce solo triangoli i cui lati assumono valori interi.

Qui ci sono dei suggerimenti per aiutarvi a scrivere la classe. Non leggeteli subito, ma solo se non riuscite a procedere da soli.

Dopo aver scritto la classe, provarla con una delle seguenti classi di prova ProvaTriangoloStdIO.javaProvaTriangoloJOptionPane.java, la prima che acquisisce i dati da standard input, l'altra da dialogBox.
Preparate dei sempli casi di prova: ad esempio il triangolo di lati 3 4 5 (triangolo scaleno rettangolo).
Triangolo.java

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(Complex z)
{
   /*
   costruisco un numero complesso di parte reale re + z.re
   e parte immaginaria im + z.im.

  
re e im sono le variabili di esemplare del parametro implicito.
   Per indicarle si potrebbe anche usare la notazione
this.re e this.im.

  
z.re e z.im sono le variabili di esemplare dell'oggetto z. Si puo'
   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.java  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 spazio ' '. 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