Parte I | Linguaggio
Java:
decisioni e
cicli. Semplici classi eseguibili. |
La
mia soluzione |
Invertire l'ordine delle parole in una riga | Leggere da standard
input un insieme di righe composte da un numero qualsiasi di parole (le
parole sono token separati da caratteri whitespaces). Per ciascuna riga, inviare a standard output una corrispondente riga in cui le parole sono disposte in ordine inverso. Terminare il programma mediante il comando cntr+D. Esempio: $java LineWordReverser inserire riga: uno due tre quattro cinque input: uno due tre quattro cinque output: cinque quattro tre due uno input : ctrl-D *** FINE *** E' simile a un esercizio del lab2, ma questa volta il numero di parole nella stringa non e' noto. |
LineWordReverser.java |
Invertire l'ordine dei caratteri in una riga | Leggere da standard
input un insieme di righe composte da un numero qualsiasi di caratteri.
Per ciascuna riga, inviare a standard output
una corrispondente riga in
cui i caratteri sono disposti in ordine inverso. Terminare il programma mediante uil comandi cntr+D. Esempio: $java LineCharacterReverser input: uno due tre output: ert eud onu |
LineCharacterReverser.java |
Convertire numeri da base decimale a base generica | Scrivere un
programma che
converta numeri interi positivi da base decimale a una generica base
b con 2 <= b <= 10. Si acquisiscano il numero da convertire e la base da standard input, una coppia per riga. Si termini il programma quando viene acquisita la stringa vuota. Esempio: $java ToGenericBaseConverter2 inserire numero e base: 10 8 10 decimale = 12 in base 8 Algoritmo per la conversione da decimale a base generica: sia n il numero da convertire, b la base e ai la cifra i-esima del numero convertito: 1. si ponga p <- n, i <- 0 2. finche' p > 0 ripetere i seguenti passi 3 e 4 3. ai <- p % base 4. p <- p / base, i <- i + 1 5. stampare le cifre akak-1...a2a1a0 Precondizioni: Se n < 0 inviare un messaggio all'operatore per segnalare che il valore non e' ammesso. Se b < 2 o b > 10 inviare un messaggio all'operatore per segnalare che la base non e' ammessa. Prova del programma: preparare dei casi di prova; ad esempio 64 decimale = 100 in base 8 (1 * 82) 91 decimale = 100 in base 9 (1 * 92) 10 decimale = 13 in base 7 (1 * 71 + 3 * 70). |
ToGenericBaseConverter2.java |
Convertire numeri da base decimale a base generica | Estendere il programma
precedente in modo che: - la base possa essere maggiore di 10; se b > 10 si usino i caratteri 'A' 'B', ..., per indicare le cifre necessarie. - i numeri da convertire siano numeri interi. In caso di numero negativo si anteponga il segno '-' alla conversione. Si acquisiscano i numeri da standard input. Si termini il programma quando viene acquisita la stringa vuota. Eseguite, prima di scrivere il codice, la classe ToGenericBaseConverter3.class (scaricare il bytecode) , usando il re-indirizzamento dello standard input sul file conversioni.txt. Sapreste scrivere una classe che si comporti allo stesso modo? Precondizioni: Se b < 2 o b > 36 inviare un messaggio all'operatore per segnalare che la base non e' ammessa. NB: accettiamo come base massima 36 che usa come cifre i seguenti caratteri: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ |
ToGenericBaseConverter3.java |
Parte II | Linguaggio
Java:
decisioni e
cicli. Semplice classe non eseguibile. Collaudo con classe di prova |
La mia soluzione |
Calcolatore Numerico | Impariamo a
codificare l'elaborazione in metodi e a ri-utilizzare il codice. Scrivere i metodi statici della seguente classe: public class CalcolatoreNumerico { /** verifica se un numero e' primo se il numero non e' primo interrompere l'esecuzione del programma @param n numero intero su cui effettuare la verifica @return true se n e' primo, false altrimenti */ public static boolean primo(int n) { // qui va il codice } /** restituisce il MCD fra due numeri interi positivi se il numero non e' primo interrompere l'esecuzione del programma @param p primo operando @param q secondo operando @returm massimo comun divisore fra p e q */ public static int mcd(int p, int q) { // qui va il codice } /** restituisce una stringa contenente la scomposizione in fattori primi di un numero intero positivo Esempio: se n = 42, la stringa restituita e' "2 * 3 * 7" se il numero non e' primo interrompere l'esecuzione del programma @param n numero da scomporre in fattori primi @return stringa contenente la scomposizione in fattori primi */ public static String fattori(int n) { // qui va il codice } /** restituisce il termine n-esimo della successione di fibonacci @param n numero intero positivo @return termine di indice n nella successione di Fibonacci */ public static long fibonacci(int n) { // qui va il codice } /** restituisce il termine n-esimo della successione dei numeri triangolari se il numero non e' primo interrompere l'esecuzione del programma @param n numero intero positivo @return termine di indice n nella successione dei numeri triangolari */ public static int triangolare (int n) { // qui va il codice } } L'interfaccia pubblica e', inoltre, documentata in CalcolatoreNumerico.html. la classe contiene solo metodi statici e non e' eseguibile. GESTIONE DELLE PRECONDIZIONI Nei metodi si verifichino i valori dei parametri (le precondizioni) e, nel caso in cui assumano valori non ammessi, si termini l'esecuzione del programma mediante l'invocazione del metodo java.lang.System.exit(), inviando a standard output un messaggio di notifica dell'avvenuto errore. OSSERVAZIONI: La classe CalcolatoreNumerico non e' eseguibile, perche' non contiene il metodo main(). Si provino i metodi con la classe di prova ProvaCalcolatoreNumerico.class di cui si fornisce solo il bytecode (Si scarichi il bytecode nella directory di lavoro e si esegua). Si noti come, conoscendo l'interfaccia pubblica della classe CalcolatoreNumerico, sia possibile scrivere la classe di prova ProvaCalcolatoreNumerico, prima della realizzazione della classe CalcolatoreNumerico. Si scriva il codice della classe di prova ProvaCalcolatoreNumerico che si comporti come quella di cui si e' fornito il bytecode. |
CalcolatoreNumerico.java ProvaCalcolatoreNumerico.java |
Parte III |
Integrated
Development Environment (IDE) BlueJ |
IDE BlueJ | IDE sta per Integrated
Development Environment, cioe' Ambiente di Sviluppo Integrato.
BluJ
e'
un semplice IDE per programmare in java. Lo stesso programma
BlueJ e' scritto in java!!! Un IDE aiuta nella programmazione, nella compilazione e nella prova delle classi. Si avvii BluJ da menu con il comando $bluej & Dal menu Project si selezioni New Project e si definisca un nuovo progetto chiamato Calcolatore. Si salvi il progetto nella directory di lavoro $HOME/lab5. BluJ crea una nuova directory col nome del progetto. Dal menu Edit si selezioni Add Class From File e si aggiunga il file $HOME/lab5/CalcolatoreNumerico.java. Comparira' un rettangolo che rappresenta la classe. Per avviare l'editor e leggere il file di testo CalcolatoreNumerico.java fare doppio click sulla classe o, in alternativa, posizionarsi sulla classe e fare click con il pulsante destro del mouse e selezionare OpenEditor. Si apre una nuova finestra contenente l'editor. Compilare la classe calcolatoreNumerico. Per eseguire la compilazione si puo', in alternativa, * compilare all'interno dell'editor facendo click sul riquadro Compile presente nella finestra dell'editor * selezionare la classe (il rettangolo) e fare click sul rettangolo Compile a sinistra * selezionare la classe e nel menu Tool selezionare Compile * posizionarsi sulla classe, fare click con il tasto a destra del mouse e selezionare Compile. Se ci sono errori di compilazione vengono evidenziati nella barra posta al di sotto della finestra dell'editor. Gli errori vengono evidenziati nel testo. L'ambiente e' utile a provare i metodi della classe. Si voglia provare il metodo boolean primo(int n). Selezionare la classe, fare click col tasto destro del mouse e selezionare il metodo dal menu. Compare una finestra in cui e' possibile passare i parametri effettivi del metodo. Dal menu help si puo' selezionare BlueJ Tutorial che vi insegna ad usare l'IDE. Questi sono i tutorial in inglese (vers. 2.01 2004) e in italiano (vers. 1.4 2002). Altre notizie interessanti nel sito web http://www.bluej.org/. D'ora in poi potete programmare usando BlueJ. Dovete aprire un progetto e dal menu Edit selezionare New Class. Si apre un menu in cui introdurre il nome della classe. Compare nel vostro progetto un nuovo rettangolo che rappresenta la classe. Facendo click sulla nuova classe aprite l'editor e iniziate a programmare. |
Parte IV | Array e
cicli:
il Crivello
di Eratostene |
La mia soluzione |
Calcolatore Numerico | Nella classe
CalcolatoreNumerico precedente si modifichi il
metodo public static boolean primo(int n) applicando l'algoritmo del Crivello di Eratostene. Suggerimento: Si ricordi che l'algoritmo di Eratostene opera eliminando da una successione di numeri quelli che non sono primi. Se n è il numero intero su cui viene effettuata la verifica, si predisponga un array di dati di tipo fondamentale boolean con (n + 1) elementi. Ciascun numero intero k, con 0 <= k <= n , sia rappresentato dall'elemento dell'array di indice k. Inizialmente si considerino tutti i numeri primi. (Elemento i-esimo dell'array a false sta a significare che il numero i, corrispondente all'indice dell'elemento, non ha divisori) Successivamente si vada a cancellare i numeri che hanno divisori, marcando l'elemento corrispondente nell'array con true. Algoritmo: 1. definire l'array di boolean di n+1 elementi 2. definire e inizializzare il contatore j a 2 3. finche' il numero e' senza divisori && j * j < = n si ripeta il passo 4 4. assegnare true agli elementi dell'array di indice multiplo di j 5. restituire il valore negato dell'elemento dell'array di indice n Verificare il corretto funzionamento con i numeri: 1, 2, 3, 4, 8, 1009, 516163 Per rendere eseguibile la classe inserire il metodo public static void main(String[] args) con il quale provare il metodo realizzato. Provate il metodo anche in BlueJ. |
CalcolatoreNumericoEratostene.java |
Parte
V |
Linguaggio
Java: classi,
array, semplici algoritmi degli
array |
La mia soluzione |
Memorizzare ed elaborare
testi |
Un vettore e' un contenitore che
permette l'introduzione di un numero arbitrario di
elementi senza generare mai l'eccezione ArrayIndexOfBoundsException. Programmare la classe MyStringVector, che realizza un vettore di stringhe, con la seguente interfaccia pubblica MyStringVector.html. Suggerimento: Usare la tecnica degli array riempiti solo in parte. Ridimensionare dinamicamente gli array in modo che la classe possa memorizzare un numero indefinito di stringhe. |
MyStringVector.java |
Analisi di testo |
Scrivere la classe
eseguibile AnalisiTesto che: a. legga un testo da standard input una riga alla volta e memorizzi le righe in un oggetto di classe MyStringVector (testo memorizzato per righe). b. scomponga ciascuna riga in parole e memorizzi le parole in un secondo oggetto di classe MyStringVector (testo memorizzato per parole). c. invii a standard output: * il testo originale * il numero delle parole contenute nel testo * la prima e l'ultima parola secondo l'ordine lessicografico * le parole, una per riga, in ordine lessicografico crescente. Per ordinare usate il seguente algoritmo: 1. finche' il vettore non e' vuoto, eseguire i seguenti passi 2, 3, 4, 5: 2. trovare la parola minima del vettore 3. trovare l'indice della parola minima 4. rimuovere la parola minima 5. inviare a standard output la parola minima rimossa Attenzione: l'algoritmo di ordinamento non e' efficiente. Studieremo in futuro algoritmi di ordinamento efficientie. Programmare usando BlueJ. Provare la classi con re-indirizzamento dello standard input sul file omero.txt o su un qualsiasi file di testo. |
AnalisiTesto.java |
Parte VI |
Consultare
la documentazione di java |
Collegamenti |
javadocs |
Nella documentazione
di java in linea presso l'Aula Didattica Taliercio consultare la
documentazione
relativa ai seguenti componenti della libreria standard: - classe java.util.Scanner: quanti costruttori ha? - metodo java.lang.Math.round(): e' sovraccarico? - classe java.lang.Math: ha variabili di esemplare pubbliche? - classe java.lang.Integer: ha variabili di esemplare pubbliche? - classe java.util.Scanner: ha un metodo useDelimiter()? che cosa fa il metodo? - classe java.util.Random: che cosa restituiscono i metodi nextDouble() e nextInt()? Saper consultare rapidamente la documentazione in linea nel sito dell'Aula Didattica Taliercio e' molto importante. Infatti in sede di prova pratica di esame, questa sarà la sola documentazione disponibile. |
Trovatelo da soli. Se non lo trovate e' qui. |