Esercizio di laboratorio
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 è 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 è (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 è il numero di valori, B è la somma di tutti i valori e A è la somma dei quadrati di tutti i valori. La formula è 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 è zero: in tal caso il valore medio dei valori si assume essere convenzionalmente uguale a zero, così come la deviazione standard.
Attenzione: Porre particolare attenzione all'impossibilità (con gli strumenti di Java che si conoscono) di memorizzare tutti i singoli valori introdotti dall'utente.
Soluzione
Ecco una possibile soluzione. Notare che non abbiamo avuto bisogno di memorizzare tutti i valori inseriti dall'utente. Notare anche come sono stati gestiti i casi in cui l'utente inserisce 0 elementi oppure 1 elemento.
import java.util.Scanner;
public class SequenceAnalyzer{ public static void main(String[] args){ Scanner in = new Scanner(System.in);
double sum = 0; //somma dei numeri inseriti
double sumSquares = 0; //somma dei quadrati dei numeri inseriti
int count = 0; //contatore dei numeri inseriti
boolean done = false;
while (!done) //ciclo e mezzo
{ System.out.println("Inserire numero (Q per terminare sequenza):");
String newInput = in.next();
if (newInput.equalsIgnoreCase("Q"))
done = true;
else // aggiorniamo la somma, la somma dei quadrati, il contatore
{ double value = Double.parseDouble(newInput);
sum += value;
sumSquares += value * value;
count++;
}}
double avrg = 0;
double stdev = 0;
if (count > 0){
avrg = sum / count;
if (count > 1)
stdev = Math.sqrt((sumSquares - sum*sum/count) / (count - 1));
}
System.out.println("Hai inserito " + count + " elementi.");
System.out.println("La media è: " + avrg);
System.out.println("La deviazi