O seguinte programa calcula a média de uma série de valores introduzidos pelo utilizador:
ximport java.util.Scanner;
public class MediaDeValores {
public static void main (String [] args) {
Scanner leitor = new Scanner (System.in);
System.out.println("Quantos valores?");
int quantos = lerInteiro("Tem que ser um inteiro!", leitor);
double soma = 0.0;
for (int i = 1 ; i <= quantos ; i++){
int valor = lerInteiro("Tem que ser um inteiro!", leitor);
soma += valor;
}
System.out.println("A media dos " + quantos + " valores eh: " +
soma / quantos);
}
/**
* Primeiro inteiro no canal de leitura
* @param errMess - mensagem a escrever no System.out caso o valor
* acessivel no canal de leitura nao seja um inteiro
* @param sc - canal de leitura
* @return valor inteiro
* @requires errMess != null && sc != null
*/
private static int lerInteiro ( String errMess, Scanner sc ) {
int valor = 0;
boolean erro = true;
do {
if ( sc.hasNextInt () ) {
valor = sc.nextInt (); // consome o inteiro
erro = false;
}
else {
sc.next (); // consome o que lah esteja
System.out.println ( errMess );
}
} while ( erro );
return valor;
}
}
Este programa pergunta primeiro ao utilizador quantos valores vai introduzir e, um a um, lê esses valores e vai adicionando-os ao valor da variável soma
.
No fim, apresenta o valor da média, resultante de dividir o valor de soma
pelo número de valores introduzidos.
Imagine agora que, em vez da média, quer calcular o desvio-padrão que, como se deve lembrar, é definido pela seguinte fórmula, em que é a média dos n valores :
Repare que, para o cálculo do desvio-padrão, precisa de calcular a diferença entre cada um dos valores e a média desses mesmos valores, ou seja, primeiro tem que calcular a média e só a seguir é que pode calcular a diferença para cada um dos valores.
Da forma como o programa está feito, cada valor introduzido é “consumido” e “descartado”, pois é usada uma só variável valor
que, a cada instante, contém somente o último valor introduzido pelo utilizador.
Então, como fazer para calcular a média e, a seguir, o desvio-padrão? Não queremos pedir de novo todos os valores ao utilizador.
A solução seria guardar em memória todos os valores lidos para os podermos usar outra vez.
Como havemos de fazer isto? Declarar várias variáveis? Se sim, quantas? Não sabemos! Isso só é decidido em tempo de execução (o utilizador é que determina quantos valores vai introduzir).
Para estes casos em que queremos guardar em memória vários valores do mesmo tipo, usamos um novo tipo de dados – o array – que, pelas suas características, nos vai permitir resolver de forma elegante muitos e diversos problemas.
É esse importante tipo de dados que é apresentado no que resta deste capítulo.
NOTA: Poderíamos, em alternativa, usar uma outra fórmula para o cálculo do desvio-padrão, que não exige o cálculo prévio da média, e que pode ser feito com uma única “passagem” pelos valores dados. A fórmula alternativa é , onde N é o número de valores a considerar, A é a soma desses valores e B é a soma dos quadrados desses valores.
O método main
para esta versão poderia ser:
xxxxxxxxxx
public static void main (String [] args) {
Scanner leitor = new Scanner (System.in);
System.out.println("Quantos valores?");
int quantos = lerInteiro("Tem que ser um inteiro!", leitor);
double soma = 0.0;
double somaQuadrados = 0.0;
System.out.println("Introduza " + quantos + " valores inteiros");
for (int i = 1 ; i <= quantos ; i++){
int valor = lerInteiro("Tem que ser um inteiro!", leitor);
soma += valor;
somaQuadrados += valor * valor;
}
double desvio =
Math.sqrt((somaQuadrados – soma * soma / quantos) / quantos);
System.out.println("O desvio padrao dos " + quantos + " valores eh: " +
desvio);
}
}
Anterior: 8.10. Exceções
Seguinte: 9.1. O tipo de dados não primitivo array