Laboratorio VI: 7-Nov-2005

Parte I Linguaggio Java: semplici metodi ricorsivi
Una soluzione possibile
Ricerca ricorsiva del minimo in un array di interi
Si scriva la classe eseguibile RecursiveMinFinder capace di trovare il minimo in un array di numeri interi riempito solo in parte.
Nella classe si programmi il metodo ricorsivo privato
   private static int findMin(int[] a, int aSize)
dove int[] a e' l'array nel quale si effettua la ricerca e int aSize il numero di elementi effettivamente inseriti nell'array.

Algorimo ricorsivo:
il minimo assoluto e' il minimo fra l' ultimo elemento dell'array e il minimo del sottoarray formato da tutti gli elementi fuorche' l'ultimo.

Si renda la classe eseguibile generando un array di numeri interi casuali, compresi fra 1 e n, di dimensione dim . I valori di n e dim siano passati come argomenti nella riga di comando. Si calcoli il minimo dell'array e si visualizzi il risultato in una finestra di dialogo (con la classe javax.swing.JOptionPane) in un messaggio con un formato simile al seguente, ottenuto per dim = 7 e n = 999:



Esempio di uso:
$java RecursiveMinFinder 7 999

Gestione delle precondizioni nel metodo minFinder()
Nei metodi privati, in genere, non si gestiscono precondizioni, dal momento che sono usati solo all'interno della classe.
Si presuppone, quindi, che il programmatore faccia attenzione a invocare il metodo con valori corretti dei parametri .
I metodi pubblici possono essere invocati, invece, da altre classi. Si rendono, per questo, robusti tramite la verifica delle precondizioni, attraverso il lancio di eccezioni o, in alternativa, l'enunciato assert.
RecursiveMinFinder.java
Ricerca ricorsiva di una sottostringa in una stringa data
Si scriva la classe eseguibile RecursiveSubstringFinder capace di trovare una sottostringa in una stringa data.
Esempio:
la sottostringa oTo e' contenuta nella stringa PlutoTopolino nei caratteri di indice da 7 a 9.

Nella classe si programmi il metodo ricorsivo privato
   private static boolean findSubstring(String s, String sub)
dove String s e' la stringa in cui effettuare la ricerca e String sub la sottostringa da trovare.

Algorimo ricorsivo:
se la sottostringa e' posizionata dall'indice zero della stringa e' presente, altrimenti si vada a cercare nella sottostringa che inizia dal carattere di indice 1 fino alla fine della stringa.
Esempio: si cerchi la sottostringa "oTo" nella stringa "PlutoTopolino": oTo non e' presente dall'indice zero (la sottostringa Plu e' presente dall'indice zero!), allora si cerchi la sottostringa oTo nella stringa "lutoTopolino".

Si renda la classe eseguibile, realizzando le seguenti due opzioni:
- opzione "/d": la stringa e la sottostringa sono passate come argomenti nella riga di comando
   Esempio di uso: $java RecursiveSubstringFinder /d PlutoTopolino oTo
 
- opzione "/r": stringhe di caratteri alfabetici casuali generate internamente al programma
   le dimensioni delle due stringhe  sono passate come argomenti sulla riga di comando
   Esempio di uso: $java RecursiveSubstringFinder /r 100 2

Se la sottostringa e' presente nella stringa, si invii un testo in una finestra di messaggi con il formato simile a quello indicato di seguito:


 
Suggerimento:
per calcolare l'indice definire una variabile statica di classe, da incrementare a ogni chiamata ricorsiva. L'indice nella stringa corrisponde infatti al livello di annidamento delle chiamate ricorsive: la prima chiamata ricorsiva verifica la sottostringa dal carattere di indice 0, la seconda dal carattere di indice 1 e cosi' di seguito.
 RecursiveSubstringFinder.java
Calcolo ricorsivo  della media degli elementi di un array
Si scriva la classe RecursiveMeanCalculator che calcola la media degli elementi di un array di interi.

Nella classe si programmino i metodi ricorsivi privati
   private static double computeRecursiveMean(int[] a, int aSize)
   private static double computeIterativeMean(int[] a, int aSize)
che calcolano la media degli elementi dell'array int[] a riempito solo in parte, il primo in modo ricorsivo, il secondo in modo iterativo. Sia int aSize il numero di elementi inseriti nell'array.

Algorimo ricorsivo:
                         N-1
     media(a, N) = _1_ * 
Σ a[i] = _1_ * (a[N-1] + (N-1) * media(a, N-1))
                    N    i=0        N
dove N e' il numero di elementi dell'array.
RecursiveMeanComputer.java

Parte II
Linguaggio Java: classi, ordinamento, ricerca, generazione di numeri casuali
Una soluzione possibile
Ordinare e ricercare numeri
Scrivere la classe ArrayOrdinato la cui interfaccia pubblica è documentata in ArrayOrdinato.html, in grado di memorizzare numeri interi, mantenendo l'insieme ordinato.
Scrivere successivamente la classe OrdinatoreNumerico che:
   1. genera n numeri casuali fra 1 e N compresi, dove N e' passato come argomento nella riga di comando, memorizzandoli in un ArrayOrdinato.
   2. calcola la media dei valori dell'ArrayOrdinato e la invia a standard output
   3. esegue un ciclo: (uscire dal ciclo quando la stringa acquisita è null o la stringa nulla "")
      - acquisizione da standard input di un numero i fra 1 e N
      - ricerca del numero i nell'ArrayOrdinato
      - invio di un messaggio a standard output del tipo
        "k = i: non presente" oppure
        "k = i: indice j"
   4. memorizzi in ordine decrescente i valori dell'ArrayOrdinato
       nel file nomeFile, 10 numeri per riga in colonne equispaziate. Il nome del file e' passato come argomento nella riga di comando.

Esempio di uso:
$java OrdinatoreNumerico dimensione nomefile

ArrayOrdinato.java
OrdinatoreNumerico.java





Parte III
Consultare la documentazione di java
Collegamenti
javaDocs
Nella documentazione di java in linea presso l'aula Taliercio consultare la documentazione relativa ai seguenti componenti della libreria standard:
- classe java.io.Writer: che funzioni svolgono i metodi
   void flush(), void close()?
- classe  java.util.Arrays: che algoritmo usa il metodo
 void sort(int[] a),
 che funzione esegue il metodo
 void fill(int[] a, int val)?


Saper consultare rapidamente la documentazione java 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.
Il link trovatelo da soli