Laboratorio 3

Esercizio 0

Questionario di autovalutazione: risposte e statistiche

Esercizio 1

Argomento: gestione dell'input tramite "ciclo e mezzo"

Scrivere un programma che legga una sequenza di valori in virgola mobile inseriti dall'utente: il numero di valori non e` predeterminato, dopo l'introduzione di ciascun valore l'utente deve premere il tasto "Invio" e la sequenza di valori termina non appena l'utente introduce una sequenza predeterminata di caratteri che non rappresenta un numero in virgola mobile.
Dopo aver letto tutti i valori inseriti dall'utente, il programma ne deve visualizzare il valore medio e la deviazione standard.
Suggerimento: Il valore medio di una sequenza di valori e` (ovviamente) uguale alla somma di tutti i valori divisa per il numero di valori. La deviazione standard D si calcola con la formula seguente:

  D = Math.sqrt((A - B*B/n)/(n-1))

dove n e` il numero di valori, B e` la somma di tutti i valori e A e` la somma dei quadrati di tutti i valori. La formula e` valida soltanto per n > 1; per n = 1 la deviazione standard vale 0, per definizione.
Gestire correttamente anche il caso in cui il numero di valori e` zero: in tal caso il valore medio dei valori si assume essere convenzionalmente uguale a zero, cosi` come la deviazione standard.
Attenzione: Porre particolare attenzione all'impossibilita` (con gli strumenti di Java che si conoscono) di memorizzare tutti i singoli valori introdotti dall'utente.


Soluzione3_1


Esercizio 2

Argomento: decisioni; confronto tra stringhe; cicli annidati

Scrivere un programma che
Attenzione: Porre particolare attenzione all'impossibilita` (con gli strumenti di Java che si conoscono) di memorizzare (e quindi confrontare) un numero non prefissato di stringhe introdotte dall'utente.


Soluzione3_2


Esercizio 3

Argomento: decisioni, confronto tra numeri interi

Scrivere un programma che calcoli il massimo comun divisore (MCD) fra due numeri interi positivi m e n acquisiti da standard input, e visualizzi il risultato a standard output.
Si usi il ben noto Algoritmo di Euclide per il calcolo del MCD tra due due numeri interi positivi m ed n (con m>n):
  1. finche' il resto della divisione di m per n e` diverso da zero
  2. Quando il resto e' zero, allora il MCD e` l'attuale valore di n


Soluzione3_3


Esercizio 4

Argomento: gestione dell'input tramite "ciclo e mezzo", cicli annidati

Scrivere un programma che calcoli e visualizzi in ordine crescente, un numero per riga, tutti i numeri primi fino ad un valore massimo introdotto dall'utente; se l'utente inserisce un numero intero negativo, ripetere la richiesta di inserzione finche' non viene introdotto un numero intero positivo.


Soluzione3_4


Esercizio 5

Argomento: cicli, decisioni e variabili booleane; manipolazione di stringhe

Scrivere un programma che verifica se una stringa, introdotta dall'utente tramite lo standard input (un'intera riga), e` una palindrome. Il programma deve eseguire il minimo numero di confronti necessari per determinare se la stringa e` una palindrome.
Verificare il corretto funzionamento del programma con:

Soluzione3_5


Esercizio 6

Argomento: decisioni e operatori booleani

Scrivere un programma che segnala all'utente se il numero intero positivo che ha introdotto corrisponde ad un anno bisestile oppure no Il programma continua a chiedere valori numerici da valutare, e li valuta, finche' non viene introdotto il numero 0, che provoca la terminazione del programma.

Soluzione3_6


Attenzione: gli esercizi seguenti hanno come argomento la progettazione ed il collaudo di classi. E` bene seguire le seguenti fasi:
  1. Progettare la classe
    • Stabilire quali sono le caratteristiche essenziali degli oggetti della classe, e fare un elenco delle operazioni che sara` possibile compiere su di essi: processo di astrazione
    • Definire e scrivere l'interfaccia pubblica. Ovvero, scrivere l'intestazione della classe, definire i costruttori ed i metodi pubblici da realizzare, e scrivere la firma (specificatore di accesso, tipo di valore restituito, nome del metodo, eventuali parametri espliciti) di ciascuno di essi.
      Consiglio: se un metodo non restituisce valori (ovvero il tipo del valore restituito e` void), scrivete inizialmente un corpo vuoto, ovvero {}. Se un metodo restituisce valori non void, scrivete inizialmente un corpo fittizio contenente solo un enunciato di return: ad esempio {return 0;} per metodi che restituiscono valori numerici o char, {return false;} per metodi che restituiscono valori booleani, {return null;} per metodi che restituiscono riferimenti ad oggetti. Con questi accorgimenti il codice compilera` correttamente fin dall'inizio del vostro lavoro. Quando poi scriverete i metodi, modificherete le istruzioni di return secondo quanto richiesto da ciascun metodo.
    • Definire le variabili di esemplare ed eventuali variabili statiche. E` necessario individuare tutte le variabili necessarie (quante? quali? dipende dalla classe!). Per ciascuna di esse si deve, poi, definire tipo e nome.
  2. Realizzare la classe
    • Verificate le impostazioni del vostro editor di testi, al fine rendere piu` efficiente il vostro lavoro di programmazione. In particolare, verificate ed eventualmente modificate le impostazioni per i rientri di tabulazione (valori tipici sono di 3 o 4 caratteri), e visualizzate i numeri di riga. A questo proposito si vedano anche i Consigli per la produttivita' 5.1 sul libro di testo)
    • Scrivere il codice dei metodi.
      Consiglio: non appena si e` realizzato un metodo, si deve compilare e correggere gli errori di compilazione (se il corpo del metodo e` particolarmente lungo e complicato, compilare anche prima di terminare il metodo). Non aspettate di aver codificato tutta la classe per compilare! Altrimenti vi troverete, molto probabilmente, a dover affrontare un numero elevato di errori, con il rischio di non riuscire a venirne a capo in un tempo ragionevole (come quello a disposizione per la prova d'esame...).
  3. Collaudare la classe. Ovvero scrivere una classe di collaudo contenente un metodo main, all'interno del quale vengono definiti e manipolati oggetti appartenenti alla classe da collaudare.
    • E` possibile scrivere ciascuna classe in un file diverso. In tal caso, ciascun file avra` il nome della rispettiva classe ed avra` l'estensione .java. Tutti i file vanno tenuti nella stessa cartella, tutti i file vanno compilati separatamente, solo la classe di collaudo (contenente il metodo main) va eseguita.
    • E` possibile scrivere tutte le classi in un unico file. In tal caso, il file .java deve contenere una sola classe public. In particolare, la classe contenente il metodo main deve essere public mentre la classe (o le classi) da collaudare non deve essere public (non serve scrivere private, semplicemente non si indica l'attributo public). Il file .java deve avere il nome della classe public

Esercizio 7 (impegnativo)

Argomento: progettazione e collaudo di classi

Scrivere un programma per la risoluzione di equazioni di secondo grado ax2 +bx +c =0. La realizzazione del programma va articolata in due fasi:
  1. Progettare e scrivere una classe QuadraticEquation, la cui interfaccia pubblica e` specificata qui. Questa interfaccia lascia aperte alcune scelte di progetto, che ciascuno potra` effettuare in autonomia, eventualmente aggiungendo altri metodi e/o campi di esemplare alla classe. In particolare
  2. Scrivere un programma di collaudo QuadraticEquationTester che utilizzi la classe QuadraticEquation. Il programma deve
Effettuare il collaudo nei due seguenti modi, verificando che producono gli stessi risultati in compilazione e in esecuzione
  1. Scrivere le due classi in due file diversi, con i seguenti accorgimenti:
  2. scrivere entrambe le classi, QuadraticEquationTester e QuadraticEquation, in un unico file con i seguenti accorgimenti:
Verificare che in entrambi i casi il comando javac QuadraticEquationTester.java produce due file di bytecode, QuadraticEquationTester.class e QuadraticEquation.class.

Soluzione3_7


Esercizio 8 (impegnativo)

Argomento: progettazione e collaudo di classi

Si scriva la classe Triangolo, che descrive un triangolo, la cui interfaccia pubblica e` specificata qui. Alcuni suggerimenti (da non leggere subito ma da consultare solo in caso di difficolta`) sono disponibili qui.
Collaudare la classe Triangolo con la classe di prova TriangoloTester, che legge i dati da standard input, e che e` disponibile qui. Come per l'esercizio precedente, effettuare il collaudo in due modi: ciascuna delle due classi in un file .java ad essa omonimo (con entrambe le classi public), oppure entrambe le classi in un solo file TriangoloTester.java (con TriangoloTester public e Triangolo no)

Soluzione3_8