Laboratorio 5

Esercizio 0

Questionario di autovalutazione: risposte e statistiche

Esercizio 1

Argomento: algoritmi su array

Studiare la classe ArrayAlgs vista a lezione. Testarne i metodi scrivendo una classe di collaudo ArrayAlgsTester che I comandi disponibili sono:
Q Quit: termina il programma
P Print: stampa il contenuto dell'array
m min: calcola il minimo valore contenuto nell'array
M Max: calcola il massimo valore contenuto nell'array
r i remove index: rimuove dall'array l'elemento di indice i
R i Remove-sorted index: rimuove dall'array l'elemento di indice i, mantenendo l'ordine degli altri elementi
I i v Insert index value: inserisce il valore value nella posizione specificata dall'indice index


Soluzione5_1


Esercizio 2

Argomento: uso di array

Il Crivello di Eratostene e` un noto algoritmo per la ricerca dei numeri primi minori di un certo valore massimo MAX, ed e` cosi` specificato: Scrivere un programma che realizza il Crivello di Eratostene per identificare i numeri primi minori di un valore (intero positivo) MAX fornito dall'utente attraverso l'ingresso standard. Verificare il corretto funzionamento del programma con:

Soluzione5_2


Esercizio 3

Argomento: manipolazione di stringhe, passaggio di parametri dalla riga di comando

Scrivere un programma che identifichi la piu` lunga sottostringa appartenente a due stringhe ricevute come argomenti sulla riga di comando.

Esempio: la piu` lunga sottostringa comune alle due stringhe
	PippoPluto2Paperino
	MinnieAiuzzto2Zo
e` la stringa
	to2
Osservazione: questo e` un caso particolare di un problema piu` generale, ovvero la ricerca della piu` lunga sottosequenza comune tra due stringhe (si veda la definizione di sottosequenza che abbiamo dato nell'esercizio 4 del laboratorio 4). Si tratta di un problema molto interessante in applicazioni biologiche, in particolare nello studio del DNA. Un filamento di DNA e` composto da molecole chiamate basi, e le basi possibili sono quattro: adenina (abbreviata con la lettera A), citosina (C), guanina (G) e timina (T). Dunque un filamento di DNA e` rappresentabile come una stringa composta con l'alfabeto dei quattro caratteri {A,C,G,T}. Una buona misura della somiglianza tra due filamenti di DNA (ovvero della somiglianza tra due organismi) e` data proprio dalla lunghezza della massima sottosequenza comune tra i due filamenti ...

Soluzione5_3


Esercizio 4 (impegnativo)

Argomento: uso di array riempiti solo in parte, array paralleli, ricerca lineare in array, gestione delle eccezioni

Scrivere una classe eseguibile StudentManager che gestisce un elenco di studenti.
In una prima fase il programma riceve dall'input standard e memorizza un elenco di dati che rappresentano I dati di ciascuno studente sono inseriti in una riga separati da uno spazio (prima il nome, poi il voto scritto, poi il voto orale). I dati sono terminati da una riga vuota.
Al termine dell'inserimento, il programma chiede all'utente di inserire un comando per identificare l'elaborazione da svolgere. Suggerimenti:
  1. Evitare l'uso di array paralleli. Scrivere una classe Student, che rappresenta il tipo di dato "studente" (specificato da nome, voto scritto, e voto orale), e usare un array di oggetti Student per memorizzare l'insieme di studenti nel programma.
  2. La parte piu` impegnativa di questo esercizio e` la scrittura della classe StudentManager. Si consiglia di individuare le principali operazioni che la classe deve realizzare (ad esempio, creazione di un oggetto Student, ricerca di un oggetto Student nell'array, stampa della media dei voti) e per ciascuna di esse scrivere un metodo statico ausiliario invocato dal metodo main.
  3. Scrivere la classe in due fasi: in una prima fase realizzare le operazioni richieste senza curarsi di precondizioni e situazioni inaspettate; solo in una seconda fase affrontare il problema della gestione delle eccezioni (in particolare i metodi scritti potranno sia lanciare che catturare eccezioni).


Soluzione5_4


Esercizio 5 (impegnativo)

Argomento: progettazione di classi, uso di array riempiti solo in parte, ricerca lineare in array, manipolazione di stringhe

Scrivere la classe TextContainer la cui interfaccia pubblica e` definita qui. La classe memorizza un testo e rende disponibili metodi per semplice analisi dei testi.
Suggerimento: memorizzare un testo in un array di stringhe e 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.
Scrivere poi la classe eseguibile TextAnalyzer che: Provare la classi con re-indirizzamento dello standard input sul file brickinthewall.txt, o su un qualsiasi altro file di testo.

Soluzione5_5


Esercizio 6 (impegnativo)

Argomento: progettazione di classi, uso di array bidimensionali

Scrivere un programma per giocare a "tris" (tic-tac-toe in inglese), il classico gioco in cui due giocatori dispongono alternativamente un proprio contrassegno in una casella di una scacchiera 3 x 3 finche' uno dei due non pone tre contrassegni in una fila orizzontale, verticale o diagonale.

X O  
  X O
    X

Il programma inizia visualizzando la scacchiera vuota, come segue (ogni puntino rappresenta una casella vuota)
|...|
|...|
|...|
e chiedendo al primo giocatore di inserire le coordinate della casella in cui vuole porre il suo contrassegno (che sara` un carattere X).
Le coordinate si indicano con due numeri interi (valori ammessi: 0, 1 o 2), il primo numero essendo l'indice di riga (a partire dall'alto) ed il secondo l'indice di colonna (a partire da sinistra).
Il programma deve verificare se la casella richiesta e` libera oppure no. Nel primo caso visualizza la scacchiera aggiornata e chiede all'altro giocatore di inserire la propria mossa (verra` usato il contrassegno O). Nel secondo caso, invece, il programma fornisce una segnalazione d'errore, visualizza nuovamente la stessa scacchiera visualizzata in precedenza e chiede al giocatore di inserire una nuova mossa; analogo comportamento si verifica se il giocatore introduce delle coordinate non valide, ma il messaggio d'errore deve essere diverso.
Il programma deve essere in grado di segnalare la vittoria di uno dei due giocatori qualora questa avvenga, oppure di porre fine alla partita quando la scacchiera e` piena senza che uno dei due giocatori abbia raggiunto la vittoria.
Al termine di una partita, il programma chiede al giocatore se intende giocare un'altra partita oppure no: nel secondo caso il programma termina.

Risolvere il problema in due passi
  1. Scrivere una classe Tris che rappresenti la scacchiera e la cui interfaccia pubblica e` definita qui.
  2. Scrivere poi una classe eseguibile che usi Tris, e che gestisca una partita a tris tra due giocatori, seguendo il comportamento descritto sopra.


Soluzione5_6