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.java o ProvaTriangoloJOptionPane.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 |