Aula 13: Arrays

Traduzido por Ana Paula Costa

Array

Imaginemos que queremos escrever um programa para calcular a média de 10 números. Com os conhecimentos que adquirimos até agora, podíamos fazê-lo definindo 10 variáveis diferentes, por exemplo
  float a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
  float average;
e no código do programa:
  average = (a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) / 10.0;
Espero que todos estejam de acordo que isto não é uma solução muito elegante e é até incómoda. E podia ser ainda pior: vamos imaginar que queremos que o utilizador seleccione quantos números se devem usar no cálculo da média:
  int n;

  scanf("%d", &n);
  switch (n)
   {
     case 1: average = a1;
             break;
     case 2: average = (a1 + a2) / 2.0;
             break;
     case 3: average = (a1 + a2 + a3) / 3.0;
             break;
          |
     case 10: average = (a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) / 10.0;
    }
É para estes casos que existem os arrays. Um array permite definir um conjunto de variáveis do mesmo tipo com uma forma fácil de acesso, nomeadamente com um índice. Tal como na matemática, ai é o i-éssimo elemento de um vector ou série a, a[i] fornece o i-éssimo elemento do array a.
 
 Um array é um conjunto de variáveis indexadasdo mesmo tipo


Declaração de um array

Para declarar um array utilizamos a seguinte sintaxe:
 
 tipo nome[numelementos] ; 

nome é o identificador do array, como um nome para as outras variáveis.
numelementos define o número de elementos do array. Os elementos vão de 0 a numelementos-1. Isto pode ser um pouco confuso para os programadores iniciantes, que estão acostumados a índices de 1 a n.
tipo é qualquer tipo de variável, por exemplo float ou int.

Exemplos:

   float account[100];
Este array poderá ser usado para armazenar informação de 100 contas bancárias.

   long int prime[10];
Poderá ser utilizado para armazenar os 10 primeiros números primos.

   int propinas[2000];
Poderá ser utilizado para armazenar informação sobre o pagamento de propinas dos alunos com números entre 0 e 1999.


Utilização de um array

Dentro de um programa podemos utilizar os elementos de um array. 
 nome[índice]

nome[índice] irá retornar o valor do elemento com número índice do array nome. Este será um valor do tipo descrito na declaração do array. Exemplos de arrays declarados na secção anterior: 

   account[20]
é o valor - do tipo float - do 20.º elemento do array com nome account

   prime[8]
é o valor - do tipo long int - do 8.º elemento do array prime. A figura da direita pode representar esse array, assim o elemento número 8 será igual a 19. Naturalmente, o nosso programa tem que preencher o array de alguma forma antes que venha a conter os números primos. 

   propinas[1055]
é 1 ou 0 (tipo int).O elemento 1055 do array propinas. O estudante 1055 pagou as suas propinas? Provavelmente a administração da universidade terá algures num computador um array com essa informação. 

Podemos também utilizar uma variável para o índice que indica um elemento único do array. Naturalmente, esta variável tem que ser do tipo inteiro, porque o índice é algo contável. O índice 3.4981 não faz qualquer sentido. O índice 3 já faz sentido, irá aceder o terceiro elemento do array. O código seguinte irá mostrar o array completo de 20 contas bancárias: 

  for (i=0; i<20; i++)
    printf("%f\n",account[i]);
 


Arrays múltiplos

Tal como na matemática, onde temos vectores (tensores de 1 dimensão) e matrizes (tensores de 2 dimensões), podemos ter arrays de uma dimensão ou 2 dimensões, ou até mais. Podemos especificar isto da seguinte forma, por exemplo um array duplo (um array de duas dimensões):
 
 tipo nome[numíndice1][numíndice2]; 

A utilização de um array duplo é similar à utilização de um array simples. Separamos os índices com uma vírgula, ou colocando-os em parêntesis rectos separados:
 

 nome[índice1][índice2

 
  Por exemplo: Para escrever a matriz da figura da esquerda podemos fazer o programa seguinte. De notar que o array consiste de 9 (3x3) elementos do tipo inteiro.

void main()
{
  int  matrix[3][3];

  matrix[0][0] = 1;
  matrix[0][1] = 0;
  matrix[0][2] = 1;
  matrix[1][0] = 2;
  matrix[1][1] = 2;
  matrix[1][2] = 0;
  matrix[2][0] = 1;
  matrix[2][1] = 0;
  matrix[2][2] = 1;
  for (i=0; i<3; i++)
    {
      for (j=0; j<3; j++)
        printf("%d ", matrix[i][j]);
      printf("\n");
    }
}
 


    Cuidado

  Quando estamos a utilizar um array temos que ter cuidado para não usar um índice fora do limite. Isto significa que temos sempre que usar um índice que seja menor do que o número total de elementos do array. Se utilizarmos um índice demasiado grande, os resultados do nosso programa podem ser muito estranhos. Um exemplo é a melhor forma de ilustrar esta situação. O programa que se segue define um array r de 4 inteiros que vão de r[0] a r[3], e um inteiro normal a. A figura da esquerda mostrar como as variáveis poderiam estar colocadas na memória. O que irá acontecer se o programa atribui um valor a r[4]? Se r[4] existisse, teria ocupado o lugar que está agora a ser utilizado por a, e uma atribuição a r[4] iria colocar um valor na caixa que é agora ocupada por a. A maioria das linguagens não se preocupam e colocam o valor de r[4] de qualquer forma, e assim o valor de a será eliminado (substituido por o de r[4]). 

  main()
  {
    int a;
    int r[4];

    a = 0;
    printf("a=%d\n", a);
    r[4] = 1;
    printf("a=%d\n", a);
  }

O output do programa será provavelmente 

  a=0
  a=1

Algumas linguagens de programação podem fazer a verificação do índice na altura em que o programa está a correr (em "run time"). Isto é chamado de "range-checking" e quando o programa tenta utilizar um índice errado, uma mensagem de erro do tipo "range-check error" ou "array index out of bounds" será mostrada. A desvantagem de fazer isto é que o programa fica mais lento e o programa compilado irá ocupar mais espaço em memória ou em disco.

Nota: isto depende da implementação exacta da linguagem/compilador. Em algumas linguagens, irá escrever por cima da variável declarada antes do array como no exemplo anterior, enquanto em outras linguagens irá escrever por cima da variável depois do array. Podemos ficar a saber declarando as variáveis
    int a;
    int r[4];
    int b;
e ver se r[4] escreve por cima de a ou b



"Hurray! (Viva!) Eu sei tudo sobre arrays."

Peter Stallinga. Universidade do Algarve, 12 November 2002