Esercitazione 8: Rivisitazione di esercizi precedenti

  1. Scrivere la classe StatisticaFrequenze che letto un testo in input stili un rapporto sulle frequenze con cui si presentano le varie parole all'interno del testo. Assumere che il testo contenga al più 2000 parole distinte. I segni di interpunzione ammessi nel testo e che ovviamente non contribuiscono al computo delle parole sono esclusivamente il punto e la virgola. Parole uguali ma con case diverso sono da considerarsi uguali, es. Casa e casa sono la stessa parola. Suggerimenti:

    Esempio di esecuzione:
    Introdurre Testo da elaborare: Sopra la panca la capra canta, sotto la Panca la CAPRA crepa.

    Frequenze
    sopra: 1
    la: 4
    panca: 2
    capra: 2
    canta: 1
    sotto: 1
    crepa: 1

  2. Risolvere il problema precedente utilizzando la classe StringTokenizer per semplificare la ricerca delle parole immesse nel testo.
  3. Scrivere un programma che inizializza un array di interi (scegliendo arbitrariamente la dimensione e i contenuti) e che successivamente chiede all'utente di specificare un valore intero e verifica se tale valore è contenuto o meno nell'array. In caso affermativo il programma deve stampare la posizione dell'array in cui occorre per la prima volta l'elemento specificato (suggerimento: applicare il cosiddetto algoritmo di ricerca sequenziale che confronta tutti gli elementi dell'array con quello cercato fino a che non si determina un'occorrenza dell'elemento o non si termina di scorrere l'array).
  4. Il problema precedente si può risolvere in modo molto più efficiente se l'array di partenza è ordinato: in questo caso infatti basterà applicare il cosiddetto algoritmo di ricerca binaria che verifica se l'elemento cercato è o meno minore o uguale di quello che occorre esattamente a metà nell'array, procedendo rispettivamente la ricerca in modo analogo nella prima o nella seconda metà dell'array (suggerimento: basta memorizzare in due variabili inizio e fine le posizioni che delimitano la parte di array che si sta considerando).
  5. Scrivere un programma che legga n interi e li stampi in ordine non decrescente. Per risolvere questo problema potete memorizzare gli interi in un array e successivamente ordinarlo tramite l'algoritmo bubble sort che scandisce più volte l'array, facendo ogni volta "galleggiare" l'elemento più piccolo verso "l'alto". Più precisamente, per ordinare l'array saranno necessarie n-1 scansioni, e in ogni scansione verranno considerate tutte le n-1 coppie di elementi adiacenti, scambiandoli tra loro se l'elemento di indice minore è più grande di quello con indice maggiore.

    Esempio

    Se consideriamo l'array {21, 20, 27, 24, 19}, la prima scansione avverrà nel seguente modo, dove il corsivo evidenzia la coppia di elementi considerata a ogni passo della scansione:

    {21, 20, 27, 24, 19}
    {21, 20, 27, 19, 24}
    {21, 20, 19, 27, 24}
    {21, 19, 20, 27, 24}
    {19, 21, 20, 27, 24}

    Nell'ultima riga del precedente elenco l'uso del grassetto serve a indicare che il primo elemento si trova nella posizione corretta affinché l'array risulti ordinato. Procedendo con le scansioni successive si ottiene:

    {19, 20, 21, 24, 27}
    {19, 20, 21, 24, 27}
    {19, 20, 21, 24, 27}

    Va notato come l'array risulti ordinato già alla fine della seconda scansione. Come si può fare in modo di evitare di effettuare ulteriori scansioni in casi come questo?
  6. Leggere la documentazione della classe java.util.Arrays e in particolare quella del metodo Arrays.sort. Utilizzare tale metodo per scrivere un programma che legge un insieme di numeri interi e li stampa dal più piccolo al più grande.
  7. Risolvere il problema precedente utilizzando la classe prog.utili.SequenzaOrdinata al posto della classe java.util.Arrays.
  8. Scrivere un programma che legga un numero intero n specificato attraverso gli argomenti di main (suggerimento: usare Integer.parseInt per convertire una stringa in un valore int) e successivamente memorizza in un array n per n di caratteri la rappresentazione di un quadrato di lato n e della sua diagonale ottenuta usando spazi e asterischi, come nel seguente esempio per n=10:
    **********
    **       *
    * *      *
    *  *     *
    *   *    *
    *    *   *
    *     *  *
    *      * *
    *       **
    **********
    Stampare successivamente il quadrato.
  9. Data una sequenza di valori x1, ... xn ordinati in modo crescente, la mediana M è l'elemento che occupa il posto centrale nella sequenza ordinata se il numero di elementi è dispari, altrimenti è la media dei due valori centrali. La moda è invece il valore che compare il maggior numero di volte nella sequenza. Scrivere un programma che legge una sequenza di numeri interi e ne visualizza media, mediana e moda. È più opportuno considerare Arrays o SequenzaOrdinata per implementare la soluzione?