Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Informática para Internet / Programação Estruturada / Aula
Durante seus estudos, você já viu que uma variável ocupa um espaço na memória reservado para armazenar valores definidos de acordo com determinado tipo de dados (veja Aula 2). Por exemplo, variáveis do int podem armazenar valores numéricos inteiros, mas apenas um valor por vez, certo? Pense na situação em que você queira escrever um programa que solicite ao usuário a entrada das notas de 10 alunos de uma turma de sua escola. Como você faria isso?
Uma possibilidade de programa é mostrada a seguir:
import java.util.Scanner;
public class Programa10Notas {
public static void main(String[] args) {
Scanner leitor = new Scanner(System.in);
System.out.println("Digite a nota de número 1");
double nota1 = leitor.nextDouble();
System.out.println("Digite a nota de número 2");
double nota2 = leitor.nextDouble();
System.out.println("Digite a nota de número 3");
double nota3 = leitor.nextDouble();
System.out.println("Digite a nota de número 4");
double nota4 = leitor.nextDouble();
System.out.println("Digite a nota de número 5");
double nota5 = leitor.nextDouble();
System.out.println("Digite a nota de número 6");
double nota6 = leitor.nextDouble();
System.out.println("Digite a nota de número 7");
double nota7 = leitor.nextDouble();
System.out.println("Digite a nota de número 8");
double nota8 = leitor.nextDouble();
System.out.println("Digite a nota de número 9");
double nota9 = leitor.nextDouble();
System.out.println("Digite a nota de número 10");
double nota10 = leitor.nextDouble();
// ... aqui, faz o processamento das notas
}
}
Note que o código, apesar de simples, fica repetitivo (duplicação de código) e muito extenso. Imagine declarar variáveis para turmas de 50 alunos!!! E o pior de tudo é que, na prática, vamos ter turmas com quantidade de alunos diferentes. Dessa forma, não sabemos previamente a quantidade de variáveis que precisaríamos declarar.
Você viu na aula anterior que comandos de iteração podem eliminar duplicação de código, reduzindo assim o tamanho do código. Vamos ver uma versão desse mesmo programa agora usando laços. Observe o código e verifique se ele está correto.
import java.util.Scanner;
public class Programa10NotasFor {
public static void main(String[] args) {
Scanner leitor = new Scanner(System.in);
double nota;
for (int i = 1; i <= 10; i++) {
System.out.println("Digite a nota de número " + i);
nota = leitor.nextDouble();
}
// ... aqui, faz o processamento das notas
}
}
Você conseguiu detectar algum problema nesse código? Ele está bem enxuto, porém o problema é que temos apenas uma única variável. Toda vez que uma nota é lida, é armazenada nessa mesma variável. Como a variável só consegue armazenar um valor por vez, a nota anteriormente lida é perdida. Para resolver esse problema, fazemos uso dos chamados vetores (ou arrays), uma estrutura de dados homogênea e indexada que pode armazenar diversos valores de um mesmo tipo de dado.
Vetor é uma estrutura de dados homogênea, ou seja, que armazena valores de um mesmo tipo.
Logo a seguir, vemos a declaração e inicialização de um vetor do tipo double de 10 posições e sua representação na memória:
double notas[] = new double[10]
O índice (número do elemento, acima do desenho) representa a posição onde o dado está armazenado no vetor. Por exemplo, na figura anterior, o valor armazenado na segunda posição do vetor é 9,0. Por isso, diz-se que o vetor é uma estrutura indexada. A forma geral de declaração de vetores segue abaixo:
tipo nome_da_variavel[];
Ao declarar um vetor, indicamos o tipo do array e o nome da variável. O uso do [] é para indicar que a variável é um array. Existe, porém, uma diferença quando declaramos um array em relação às declarações de variáveis de tipos primitivos. Para que seja alocado o espaço na memória relativo ao array, é necessário usar a palavra chave new, seja na própria declaração do array, ou inicializando-o posteriormente. Veja o formato geral para a inicialização na própria declaração:
tipo nome_da_variavel[] = new tipo[tamanho];
O tipo, como o próprio nome já diz, irá declarar o tipo de cada elemento do vetor: inteiro (int), real (double e float), caractere (char), etc. Já o tamanho irá definir quantos elementos o vetor irá guardar. Quando usamos a palavra chave new, é reservado um espaço de memória suficiente para armazenar a quantidade de elementos especificada. Fazendo uma analogia a grosso modo, declarar um vetor do tipo double de 50 posições equivaleria a declarar 50 variáveis do tipo double, só que é muito mais prático trabalhar com vetores. Principalmente porque o tamanho do vetor pode ser determinado pelo usuário durante a execução do programa! Veja como isso acontece:
import java.util.Scanner;
public class ProgramaNotasArray {
public static void main(String[] args) {
Scanner leitor = new Scanner(System.in);
System.out.println("Digite a quantidade de notas a serem lidas");
int quantidade = leitor.nextInt();
double notas[] = new double[quantidade];
for (int i = 1; i <= quantidade; i++) {
System.out.println("Digite a nota de número " + i);
notas[i] = leitor.nextDouble();
}
// ... aqui, faz o processamento das notas
}
}
Observe no código que primeiro é lida a quantidade de notas a serem processadas. Essa quantidade é armazenada na variável quantidade, a qual é utilizada para determinar o tamanho do array e a condição de continuidade do laço (i <= quantidade). Isso quer dizer que, se o usuário digitar 45 para a quantidade de notas, o programa irá ler e alocar espaço para guardar essas 45 notas. Não é legal?
Bom, você deve ter percebido que dentro do laço estamos atribuindo o valor lido a uma determinada posição do array. Isso está sendo feito pelo seguinte comando:
notas[i] = leitor.nextDouble();
Observe o uso do [i]. Como um vetor geralmente tem várias posições, então é necessário informar em qual posição você quer ler ou escrever. Isso é feito passando-se o índice da posição. Mas, cuidado, pois na maioria das linguagens de programação, os índices começam pelo número 0 (zero)! Veja isso na Figura 1, que mostra o espaço na memória de um array de 10 posições. O índice do primeiro elemento do array é 0, e não 1. Já o índice da última posição é 9, e não 10. Observe que, se você quiser acessar o n-ésimo elemento de um array, é só usar o índice (n - 1). É fácil, mas exige atenção.
Para ler ou escrever em uma posição do array, é só usar o nome da variável e indicar o índice da posição a ser lida ou escrita, como nos seguintes exemplos:
// escreve a nota no índice 4, ou seja, na 5a posição do array
notas[4] = 7.8;
// escreve a nota no índice i
notas[i] = 8.3;
// imprime a nota de índice 8, ou seja, a 9a nota do array
System.out.println(notas[8]);
Versão 5.3 - Todos os Direitos reservados