Newsgroup: it.comp.java
Titolo: Calcolo deviazione standard

Ciao a tutti,
ho fatto un esercizio che mi chiedeva di calcolare la deviazione 
standard di un insieme di valori letti in input. L'ho fatto e funziona 
bene, vi chiedo solo un giudizio. Il codice vi sembra troppo 
arzigogolato, poteva esser fatto meglio o va benino anche cos�? Tenete 
presente che alcune cose non le ho ancora fatte quindi se vi pare strano 
che non ho usato classi richiamate etc. � perch� non ci sono ancora 
arrivata l�. Sto studiando ora gli array e le matrici.
 
import java.util.Scanner;
public class Devianza {
	public static void main (String[] args) {
		Scanner scan=new Scanner(System.in);
		System.out.print("Indica di quanti elementi dev'essere l'array: ");
		int size=scan.nextInt(), i;
		double [] arr= new double[size];
		double media=0, sum=0, deviazione=0, sum2=0, dev=0;
		for (i=0; i<size; i++) {
			System.out.print("Inserisci l'elemento " + i + " : ");
			arr[i]=scan.nextDouble();
			sum += arr[i];
		}
		media=sum/size;
		for (i=0; i<size; i++) {
			arr[i] -= media;
			sum2 += Math.pow(arr[i],2);
		}
		dev=sum2/(size-1);
		deviazione=Math.sqrt(dev);
		System.out.println("La deviazione standard e' : " + deviazione);
	}
}
 
 
Grazie!
 
-- 
*Valar morghulis*

 bene, vi chiedo solo un giudizio.
 
Ciao, dando un'occhiata veloce al codice, e senza entrare nel merito di quello che fa, vedo sostanzialmente 2 problemi.
 
Il piu' grave riguarda il miscuglio che hai fatto tra la gestione dell'input da parte dell'utente e l'elaborazione dei dati. Di fatto stai mischiando il presentation layer con l'application layer. Le due operazioni sono di fatto distinte, e questa distinzione deve riflettersi anche nel codice. (in sostanza dovresti creare 2 metodi distinti).
 
L'altro piccolo problemino riguarda la visibilita' delle variabili: questa deve essere il piu' limitata possibile, soprattutto per semplificare la lettura del codice e la sua manutenzione. Mi riferisco ad esempio alla variabile "i" che non dovrebbe "vivere" dall'inizio alla fine del metodo, ma solo all'interno di ogni singolo ciclo for che hai dichiarato.
 
-- 
SoulSpirit

 Di fatto stai mischiando il presentation layer con l'application layer.
 
Stiamo parlando di networking?

dichiarato.
 
Tecnicamente giusto, ma dichiarando le variabili di ciclo all'inizio si
puo' velocizzare (anche di molto) il codice, specialmente in caso di
cicli annidati.
 
Ciao Jack
- 
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

       dev=sum2/(size-1);
 
qua fai un cast implicito.
 
il calcolo e' : (double) = (double)/(int);
 
il compilatore trasforma l'int automaticamente in double, e in questo
caso non c'e' perdita di informazioni.
Se invece fosse stato da int a float, da long a float oppure da long a
double in alcune occasioni potrebbero esserci delle perdite di
informazioni.
In generale io quando faccio calcoli con tipi diversi esplicito sempre
il cast, e' piu' facile vedere eventuali errori se capitano.
 
quindi: dev=sum2/(double)(size-1);
 
se non te l'hanno ancora insegnato dimentica quello che ho appena detto
:)
 
Ciao Jack


 il calcolo e' : (double) = (double)/(int);
 
Ecco, a questo non avevo proprio pensato :( e s� questa parte l'ho 
studiata, ci hanno fracassato abbastanza a riguardo. Ero molto 
concentrata sulla "procedura" piu' che sui dettagli, diciamo.
Grazie.
 
-- 
*Valar morghulis*

 cicli annidati.
 
Stai dando un cattivo consiglio: è bene dichiarare sempre le variabili 
nello scope più interno possibile.
 
Le ottimizzazioni che proponi tu hanno un impatto talmente minimale 
(sempre che lo abbiano) e un degrado della leggibilità del codice 
talmente elevato che non vanno neanche considerate.