Pensamento Computacional - Arrays Unidimensionais no Java

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

Conceito de Array

Um array unidimensional ou vetor pode ser visto como uma variável (uma caixa) dividida em partes menores (CAIXAS menores) acessadas por um índice (posição). Podemos dizer que cada elemento do vetor pode ser acessado através da indexação do vetor. Os elementos do vetor possuem um tipo único.


PRG1-vetor armario.png


Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.


PRG1-tabela vetor.png

Observe que com o mecanismo de criação de vetor será possível armazenar dados de uma forma organizada e de forma que se possa operar em diversos momentos do processamento.

Exemplo 1

Suponha que em uma determinada turma de 5 alunos queremos armazenar os valores das notas finais (valores inteiros de 0 a 10).

Neste caso o tamanho do array será 5. As indexações possíveis do array serão de 0 a 14 portanto. O tipo de cada elemento é inteiro, devido as notas inteiras.

Uma possível solução para isso seria:

import java.util.Scanner;

public class TabelaNotas {
    public static void main(String[] args) {
        int[]  TabelaNotas = new int[5];
        Scanner teclado = new Scanner(System.in);

        for (int i = 0; i < 5; i++) {
            System.out.println("Entre com a nota do aluno " + i);
            TabelaNotas[i] = teclado.nextInt();
        }
        System.out.println("Dados armazenados!!!");
        /* imprimindo os dados lidos... */
        for (int i = 0; i < 5; i++) {
            System.out.println("Nota da posição " + i + " é " + TabelaNotas[i]);
        }
        teclado.close();
    }
}

DISCUSSÃO:

Inicialmente a instrução:

int[]  TabelaNotas = new int[5];

Declara a referência para o vetor TabelaNotas e cria um vetor de tamanho 5 associado a esta referÊncia. De agora em diante, podemos trabalhar este vetor (lendo e escrevendo sobre cada elemento dele).

Observe que as 5 notas serão "lidas" para o vetor de inteiros TabelaNotas. Preste atenção a forma como é indexado o vetor:

            TabelaNotas[i] = teclado.nextInt();

Verifique o uso de colchetes com o índice do elemento que está sendo acessado. Na realidade, o índice pode ser qualquer expressão inteira que resulte em 0 a 4. Um ponto importante a ser observado é que este limite da indexação deve ser respeitado. Vamos a um exemplo que teremos problemas por acesso indevido:

import java.util.Scanner;

public class TabelaNotas {
    public static void main(String[] args) {
        int[]  TabelaNotas = new int[5];
        Scanner teclado = new Scanner(System.in);

        for (int i = 0; i < 5; i++) {
            System.out.println("Entre com a nota do aluno " + i);
            TabelaNotas[i+5] = teclado.nextInt();
        }
        System.out.println("Dados armazenados!!!");
        /* imprimindo os dados lidos... */
        for (int i = 0; i < 5; i++) {
            System.out.println("Nota da posição " + i + " é " + TabelaNotas[i]);
        }
        teclado.close();
    }
}

DISCUSSÃO : Ao tentar executar este código teremos um erro logo de início:

Entre com a nota do aluno 0
9
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
       at TabelaNotas.main(TabelaNotas.java:11)

A instrução:

           TabelaNotas[i+5] = teclado.nextInt();

logo no primeiro laço do loop, quando i estiver em 0, tentará escrever na posição 5 do vetor o que não é permitido pois o vetor não possui eta posição.

Exemplo 2

Vamos a um problema um pouco mais complexo: Implementar um programa Java para ler 5 notas inteirass para um vetor e imprimir a quantidade (o número) de números acima da média.

DICA: Definir um contador, iniciado em zero. Ler os 5 números para um vetor e calcular a media. Fazer um segundo loop sobre o vetor testando cada item para verificar se é maior que a média. Incrementar o contador a cada item acima da média.

Este problema exige que os dados sejam armazenados previamente, de forma que a média calculada possa posteriormente ser usada para a computação da quantidade de números que estão acima da média.

DADOS DE ENTRADA: 5 números a serem fornecidos.
DADOS DE SAÍDA: Quantidade de números acima da média.
import java.util.Scanner;

public class NumerosAcimaMedia {
    public static void main(String[] args) {
        int[]  TabelaNotas = new int[5];
        Scanner teclado = new Scanner(System.in);
        double media;
        int somaAc, contAcima;

        for (int i = 0; i < 5; i++) {
            System.out.println("Entre com a nota do aluno " + i);
            TabelaNotas[i] = teclado.nextInt();
        }     
        /* os números já estão no vetor... Vamos calcular a média deles... */
        somaAc = 0;
        for (int i = 0; i < 5; i++) {
            somaAc += TabelaNotas[i];
        }          
        media = (double) somaAc / 5; 
        System.out.println("Media calculada é " + media); 
        /* agora vamos olhar para cada elemento do vetor e contar as ocorrências acima da média */  
        contAcima = 0;
        for (int i = 0; i < 5; i++) {
            if ( TabelaNotas[i] > media )
                contAcima++;
        }    
        System.out.println("Notas acima da média: " + contAcima);         
    }
}

Exercício 1

Modificar o exemplo anterior para que seja calculada a média das notas notas abaixo de 6.

Exercício 2

Modificar o exemplo anterior para que seja calculado o desvio padrão da turma. Ver o que é desvio padrão aqui. OBS: Será necessário usar a função de raiz quadrada e de potenciação da biblioteca matemática.

Inicialização de um Vetor

Um vetor pode ser inicializado com valores já na sua criação:

 String tabelaNomes[] = new String[] {"IFSC", "IFRS", "IFRN"};

A dimensão da tavelaNomes será 3 neste caso, pois não fornecido o tamanho do vetor.

EXEMPLO 3 - Controle de Acesso

Um sistema de controle de acesso permite armazenar até 5 senhas alfanuméricas. De fábrica o produto vem com uma tabela já predefinida da forma:

 String[] tabelaSenhas  = new String[]{"alfa","beta","delta","gama", "epson"};

Elaborar um programa Java para abrir a porta para um usuário cuja senha está na tabela.

import java.util.Scanner;

public class ControleAcesso {
    public static void main(String[] args) {
        String[] tabelaSenhas  = new String[]{"alfa","beta","delta","gama", "epson"};
        Scanner teclado = new Scanner(System.in);
        String senhaLida;
        boolean itemEncontrado;

        while (true) {
            System.out.println("Entre com uma senha");
            senhaLida = teclado.nextLine();
            itemEncontrado = false;
            for (  int i = 0; i < tabelaSenhas.length; i++) {
                if (tabelaSenhas[i].equals(senhaLida)) {
                    System.out.println("Abrir a porta");
                    itemEncontrado = true;
                    break;
                }
            }
            if ( itemEncontrado == false ) {
                System.out.println("Usuário não reconhecido!!!");
            }
        }
    }
}

Exercício 3

Modifique o exemplo anterior para que exista também um USERID por cada senha. Para tanto, faça uma estratégia que cada linha para da tabela armazene o USERID e a na sequência a senha.

Formas de "iterar" um array

O termo ITERAÇÃO é usado em computação para denotar a repetição de uma mesma ação sobre diferentes elementos de um dado conjunto.

No exemplo acima, os elementos do vetor foram "iterados" usando um comando for da forma:

            for (  int i = 0; i < tabelaSenhas.length; i++) {
                if (tabelaSenhas[i].equals(senhaLida)) {
                    System.out.println("Abrir a porta");
                    itemEncontrado = true;
                    break;
                }
            }

Esta abordagem pode ser usada também com comandos while() e do while().

É possível também usar a seguinte variação na iteração, conhecida como "for each" (para cada):

            for (  String senha : tabelaSenhas ) {
                if ( senha.equals(senhaLida) ) {
                    System.out.println("Abrir a porta");
                    itemEncontrado = true;
                    break;
                }
            }

Notar aqui que o comando for não contém as tradicionais três partes separadas por ponto-e-vírgula. É implícito que a cada laço do loop a variável senha assumirá o próximo valor armazenado no vetor.

Passando um vetor como parâmetro de um método

public class MediaVetor {
    public static double mediaVetor(int[] meuVetor) {
        int somaAc = 0;
        for ( int x : meuVetor) {
            somaAc += x;
        }
        return (double) somaAc / meuVetor.length;
    }
    public static void main(String[] args) {
        int[] vetorTeste1 = new int[]{10, 20, 5, 10};

        System.out.println("Média do vetor teste 1 é " + mediaVetor(vetorTeste1));
    }
}