Arrays: arranjos de dados
Aprenda a manipular grandes conjuntos de dados. Com os arrays você pode manipular várias variáveis como se fossem uma única.
09/11/2023
Antes de começar a aprender sobre arrays, é fundamental que você já saiba o que é uma variável e uma estrutura de repetição for.
Para aprender sobre variáveis, leia este artigo onde te explicamos com detalhes sobre o assunto.
Para aprender sobre estruturas de repetição for, leia este artigo onde te explicamos com detalhes sobre o assunto.
Mas vamos ao que interessa!
O que é um array?
Da maneira mais direta possível, um array (também conhecido como arranjo de dados) pode ser definido como um recurso de programação que te permite manipular muitas variáveis de maneira simples e intuitiva. Mas antes de entender como isso é possível, vamos observar alguns exemplos práticos dos problemas que podem ser resolvidos pelo uso de um array.
O problema de usar variáveis
Imagine que queremos criar um programa para solicitar do usuário um único valor numérico e exibi-lo na tela. É uma tarefa muito simples! O Algoritmo abaixo faz exatamente isso:
1.int valor;
2.println("Digite um valor");
3.valor = input();
4.println("Valor digitado = "+valor);
Veja na linha 1 (código acima) que foi criada uma única variável para armazenar esse valor, que foi solicitado do usuário (linha 3 do código acima) e impresso na tela (linha 4 do código acima).
Agora imagine que, ao invés de um único valor numérico, precisamos solicitar do usuário 5 valores numéricos. Nesse caso, precisamos criar mais 4 variáveis, solicitar o valor do usuário mais 4 vezes e escrever mais 4 comandos de impressão. Veja abaixo como ficaria esse novo código:
1.int valor1;
2.int valor2;
3.int valor3;
4.int valor4;
5.int valor5;
6.println("Digite o valor 1");
7.valor1 = input();
8.println("Digite o valor 2");
9.valor2 = input();
10.println("Digite o valor 3");
11.valor3 = input();
12.println("Digite o valor 4");
13.valor4 = input();
14.println("Digite o valor 5");
15.valor5 = input();
16.println("Valor 1 digitado = "+valor1);
17.println("Valor 2 digitado = "+valor2);
18.println("Valor 3 digitado = "+valor3);
19.println("Valor 4 digitado = "+valor4);
20.println("Valor 5 digitado = "+valor5);
Como você pode perceber o código cresceu bastante! Para cada nova informação que o programa precisar manipular, precisamos criar uma nova variável. Imagine agora se precisássemos solicitar 1000 valores ao invés de 5. Seria um desastre! O código ficaria enorme!
Para começar a resolver o problema de ter que escrever muitas linhas de código para lidar com muitas variáveis, recorremos ao uso dos arrays.
Como criar um array?
A maneira padrão de criar um array varia a depender da linguagem de programação. Veja abaixo uma forma muito utilizada para criar um array. O código mostra a criação de um único array denominado “valores” para armazenar 5 variáveis do tipo int:
1.int[ ] valores = new int[5];
Veja (no código acima) o detalhe marcante de um array: a presença dos colchetes “[” “]” (conhecidos como “operador subscrito”). São eles que diferenciam a criação de um array e de uma variável. Observe que “int valor” é uma variável e “int[ ] valores” é um array.
Vamos observar mais detalhes.
A criação de um array se divide em duas etapas: declaração e inicialização. Observe a ilustração abaixo.
O trecho “int[ ] valores” representa a declaração do array do tipo int. O trecho “new int[5]” representa a inicialização do array. Na declaração usamos os colchetes “[” “]” vazios. Na inicialização colocamos o valor da capacidade dentro dos colchetes.
Poderíamos ter criado arrays para armazenar outros Tipos Primitivos de variáveis no lugar do tipo int. Por exemplo:
1.char[ ] letras = new char[10];
2.double[ ] salarios = new double[35];
3.boolean[ ] validacoes = new boolean[12];
Também poderíamos ter criado arrays para armazenar Tipos Abstratos de Dados, ao invés de Tipos Primitivos:
1.String[ ] nomes = new String[8];
2.Funcionario[ ] listaFuncionarios = new Funcionario[30];
3.Pessoa[ ] moradores = new Pessoa[100];
É importante observar que existem diferenças impactantes na forma de criar um array a depender da linguagem de programação que seja utilizada. Nas linguagens C e C++, por exemplo, a criação é bem mais simples. Na linguagem Python, não existe o conceito de arrays; usa-se bibliotecas, tal como a NumPy, para emular o comportamento de um array.
Veja abaixo o código para a criação de um array em várias linguagens de programação diferentes:
1.int[ ] valores = new int[5];
2.// ou
3.int valores[ ] = new int[5];
1.// não há necessidade de usar a palavra new
2.int valores[5];
1.// não há necessidade de usar a palavra new
2.int valores[5];
1.int[ ] valores = new int[5];
1.# Python não possui suporte para arrays
2.# Recomenda-se usar a biblioteca NumPy
Índices de um array
As posições de um array (conhecidas como índices) são utilizadas como mecanismo de acesso aos seus elementos. Vamos retomar o exemplo do nosso array de capacidade 5, ou seja, com 5 índices.
1.int[ ] valores = new int[5];
Os índices de um array são numerados a partir do valor 0 (zero) até o valor de sua capacidade menos uma unidade (capacidade-1). Por exemplo: o array de capacidade 5 (criado no código acima) possui os índices de 0 a 4, conforme a ilustração abaixo:
Da mesma forma, um array de capacidade 10 possui os índices de 0 a 9:
Os índices representam as posições de cada uma das variáveis de um array.
Atribuição de valores a um array
Para compreender melhor o significado e o uso dos índices, vamos comparar a atribuição de valores a uma variável com a atribuição de valores a um array:
Atribuição de um valor a uma variável
1.int valor;
2.valor = 50;
Observe na linha 2 do código acima como o valor 50 é atribuído à variável “valor” sem nenhum problema! É como se o valor 50 fosse jogado dentro da variável.
Será que o mesmo poderia ser feito a um array?
Atribuição de um valor a um array
1.int[ ] valores = new int[5];
2.valores = 50; // isso é um erro!
Observe na linha 2 do código acima como o valor 50 é atribuído ao array “valores”! Isso é um grande erro! O fato de o array “valores” ser uma coleção de 5 variáveis impede que o valor 50 seja diretamente atribuído a ele sem antes especificar o índice da posição de inserção.
Para especificar o índice da posição de inserção em um array também utilizamos os colchetes “[” “]” (o “operador subscrito”). Veja no código abaixo um exemplo da criação de um array de capacidade 5, a atribuição de alguns valores e a impressão desses valores na tela:
1.int[ ] valores = new int[5];
2.valores[0] = 13;
3.valores[1] = 53;
4.valores[2] = 9;
5.valores[3] = 16;
6.valores[4] = 25;
7.println(valores[0]);
8.println(valores[1]);
9.println(valores[2]);
10.println(valores[3]);
11.println(valores[4]);
Observe nas linhas de 2 a 6 (código acima) como os colchetes são utilizados para especificar a posição de atribuição dos valores no array. O mesmo é feito nas linhas de 7 a 11 (código acima), onde os colchetes são utilizados para ler os valores do array.
Veja na animação abaixo a simulação da atribuição de valores a um array pelos seus índices:
Veja abaixo os exemplos completos do código acima em várias linguagens de programação diferentes:
1.import java.util.Scanner;
2.class Main {
3. public static void main(String[] args) {
4. int[ ] valores = new int[5];
5. valores[0] = 13;
6. valores[1] = 53;
7. valores[2] = 9;
8. valores[3] = 16;
9. valores[4] = 25;
10. System.out.println(valores[0]);
11. System.out.println(valores[1]);
12. System.out.println(valores[2]);
13. System.out.println(valores[3]);
14. System.out.println(valores[4]);
15. }
16.}
1.#include <stdio.h>
2.int main(void) {
3. int valores[5];
4. valores[0] = 13;
5. valores[1] = 53;
6. valores[2] = 9;
7. valores[3] = 16;
8. valores[4] = 25;
9. printf("%d\n",valores[0]);
10. printf("%d\n",valores[1]);
11. printf("%d\n",valores[2]);
12. printf("%d\n",valores[3]);
13. printf("%d\n",valores[4]);
14.}
1.#include <iostream>
2.int main() {
3. int valores[5];
4. valores[0] = 13;
5. valores[1] = 53;
6. valores[2] = 9;
7. valores[3] = 16;
8. valores[4] = 25;
9. std::cout << valores[0] << std::endl;
10. std::cout << valores[1] << std::endl;
11. std::cout << valores[2] << std::endl;
12. std::cout << valores[3] << std::endl;
13. std::cout << valores[4] << std::endl;
14.}
1.using System;
2.class MainClass {
3. public static void Main (string[] args) {
4. int[ ] valores = new int[5];
5. valores[0] = 13;
6. valores[1] = 53;
7. valores[2] = 9;
8. valores[3] = 16;
9. valores[4] = 25;
10. Console.WriteLine(valores[0]);
11. Console.WriteLine(valores[1]);
12. Console.WriteLine(valores[2]);
13. Console.WriteLine(valores[3]);
14. Console.WriteLine(valores[4]);
15. }
16.}
1.# Python não possui suporte para arrays
2.# Este exemplo usa a biblioteca NumPy
3.import numpy
4.valores = numpy.array([13, 53, 9, 16, 25])
5.print(valores[0])
6.print(valores[1])
7.print(valores[2])
8.print(valores[3])
9.print(valores[4])
Limites de um array
É de responsabilidade única do programador gerenciar os limites dos índices de um array. Imagine o que aconteceria se tentássemos acessar o índice 6 de um array que possui capacidade 5? O código abaixo ilustra essa situação:
1.int[ ] valores = new int[5];
2.valores[6] = 37;
O problema é que, na maioria das linguagens de programação, esse algoritmo seria compilado e executado normalmente. O erro aconteceria durante a execução, quando o algoritmo tentasse atribuir o valor 37 ao índice 6 do array (linha 2 do código acima). Esse tipo de erro é conhecido como “indexação fora dos limites”.
É muito comum programadores iniciantes cometerem esses erros de “indexação fora dos limites” durante o uso dos arrays. Por isso, fique atento!
Automatização dos arrays
Vamos retomar o problema inicial do artigo, que cria um programa para solicitar do usuário 5 valores numéricos e os exibe na tela. Mas agora vamos usar um array no lugar de 5 variáveis. O código abaixo mostra esse programa:
1.int[ ] valores = new int[5];
2.println("Digite o valor 1");
3.valores[0] = input();
4.println("Digite o valor 2");
5.valores[1] = input();
6.println("Digite o valor 3");
7.valores[2] = input();
8.println("Digite o valor 4");
9.valores[3] = input();
10.println("Digite o valor 5");
11.valores[4] = input();
12.println("Valor 1 digitado = "+valores[0]);
13.println("Valor 2 digitado = "+valores[1]);
14.println("Valor 3 digitado = "+valores[2]);
15.println("Valor 4 digitado = "+valores[3]);
16.println("Valor 5 digitado = "+valores[4]);
Observe que a única otimização conseguida nesse código foi a criação do array (linha 1 do código acima). Ao invés de criar 5 variáveis, criamos apenas um único arranjo de dados.
Perceba que as solicitações dos valores por parte do usuário (linhas 2 a 11 do código acima) e as impressões na tela (linhas 12 a 16 do código acima) ainda continuam com código repetido.
Isso não é bom! Se precisarmos aumentar o número de valores solicitados para 1000, recairemos no mesmo problema de código fonte gigantesco!
Para resolver esse problema utilizamos as estruturas de repetição. O uso dos arrays está intimamente ligado ao uso das estruturas de repetição. Sem elas não é possível obter as vantagens de automatização e economia de código que os arrays podem proporcionar.
Mas vamos entender isso com mais exemplos. Observe a estrutura de repetição for abaixo:
1.for(int i=0; i < 5; i++){
2. println(i);
3.}
Se você conhece o comando for, sabe que a variável de controle “i” vai assumir, durante as repetições, todos os valores no intervalo de 0 a 4.
Agora observe na ilustração abaixo como os índices de um array de capacidade 5 coincidem exatamente com os valores no intervalo de 0 a 4.
Mera coincidência? Não! Automatização!
É justamente a variável de controle “i” do comando for quem vai proporcionar a automatização do array. Veja o código abaixo:
1.for(int i=0; i < 5; i++){
2. println(valores[i]);
3.}
Perceba que a variável de controle “i” (linha 2 do código acima) assume dentro dos colchetes “[” “]” do array cada um dos índices de 0 a 4 durante as repetições, imprimindo, com uma única linha de código, todas as posições do array.
Veja na animação abaixo a simulação de como isso acontece:
Desta forma, podemos modificar o código do problema inicial do artigo e otimizá-lo com a estrutura de repetição for. Veja abaixo como fica esse código para solicitar do usuário 5 valores numéricos e exibi-los na tela:
1.int[ ] valores = new int[5];
2.for(int i=0; i < 5; i++){ // solicita os 5 valores
3. println("Digite o valor "+(i+1));
4. valores[i] = input();
5.}
6.for(int i=0; i < 5; i++){ // exibe os 5 valores
7. println(valores[i]);
8.}
Agora, independente da quantidade de valores solicitados, não existe a necessidade de adicionar mais nenhuma linha de código. Precisamos apenas trocar os valores 5 (no código) pela nova quantidade desejada.
Veja abaixo esse mesmo código completo em várias linguagens de programação diferentes:
1.import java.util.Scanner;
2.class Main {
3. public static void main(String[] args) {
4. Scanner sc = new Scanner(System.in);
5. int[] valores = new int[5];
6. for(int i=0; i < 5; i++){
7. System.out.println("Digite o valor "+(i+1));
8. valores[i] = sc.nextInt();
9. }
10. for(int i=0; i < 5; i++){
11. System.out.println(valores[i]);
12. }
13. }
14.}
1.#include <stdio.h>
2.int main(void) {
3. int valores[5];
4. for(int i=0; i < 5; i++){
5. printf("Digite o valor %d\n",(i+1));
6. scanf("%d",&valores[i]);
7. }
8. for(int i=0; i < 5; i++){
9. printf("%d\n",valores[i]);
10. }
11.}
1.#include <iostream>
2.int main() {
3. int valores[5];
4. for(int i=0; i < 5; i++){
5. std::cout << "Digite o valor " << (i+1) <<"\n";
6. std::cin >> valores[i];
7. }
8. for(int i=0; i < 5; i++){
9. std::cout << valores[i] << "\n";
10. }
11.}
1.using System;
2.class MainClass {
3. public static void Main (string[] args) {
4. int[] valores = new int[5];
5. for(int i=0; i < 5; i++){
6. Console.WriteLine("Digite o valor "+(i+1));
7. valores[i] = Convert.ToInt32(Console.ReadLine());
8. }
9. for(int i=0; i < 5; i++){
10. Console.WriteLine(valores[i]);
11. }
12. }
13.}
1.# Python não possui suporte para arrays
2.# Este exemplo usa a biblioteca NumPy
3.import numpy
4.valores = numpy.array([])
5.for i in range(5):
6. valor=int(input("Digite o valor "+str(i+1)+"\n"))
7. valores = numpy.append(valores, valor)
8.for i in range(5):
9. print(valores[i])
Termine a sua saga de aprendizado na programação básica. Leia o nosso artigo sobre funções. O último assunto para você aprender nessa série de programação básica.
David Santiago
Mestre em Sistemas e Computação. Graduado em Sistemas de Informação. Professor de Linguagem de Programação, Algoritmos, Estruturas de Dados e Desenvolvimento de Jogos Digitais.