LISTAS E MATRIZES

  As variáveis comuns, como os integers, strings, etc funcionam muito bem para uma entrada. Se desejarmos armazenar o nome de 10 pessoas na memória, a manipulação através destas variáveis se torna algo bizarro do tipo:
var nome1, nome2, nome3, nome4, nome5, nome6, nome7, nome8, nome9, nome10 : string[40];
begin
  write('Entre o nome da 1a. pessoa: ');
  readln(nome1);
  write('Entre o nome da 2a. pessoa: ');
  readln(nome2);
  write('Entre o nome da 3a. pessoa: ');
  readln(nome3);
  write('Entre o nome da 4a. pessoa: ');
  readln(nome4);
  write('Entre o nome da 5a. pessoa: ');
  readln(nome5);
  write('Entre o nome da 6a. pessoa: ');
  readln(nome6);
  write('Entre o nome da 7a. pessoa: ');
  readln(nome7);
  write('Entre o nome da 8a. pessoa: ');
  readln(nome8);
  write('Entre o nome da 9a. pessoa: ');
  readln(nome9);
  write('Entre o nome da 10a. pessoa: ');
  readln(nome10);
end.
  De maneira mais elegante, podemos criar uma lista com um tamanho pré-definido, como, por exemplo tamanho igual a 10, para armazenar o nome de 10 pessoas.
  A lista é acessada, informando-se o número da posição que desejamos ler ou alterar os dados.
  Obs: O procedimento de criação e acesso a um vetor é semelhante ao DIM do Basic.

  Vamos reescrever o programa anterior, utilizando vetores. Observe como o programa ficou mais fácil de entender e mais elegante:
var nome : array[1..10] of string[40];
      i : integer;
begin
  for i:=1 to 10 do
  begin
    write('Entre com o nome da ',i,'a. pessoa: ');
    readln(nome[i]);
  end;
end. 
  O identificador array indica que queremos criar um vetor (lista), de tamanho igual a dez, numerado de 1 até (assinalado com '..') 10, e do tipo string[40].

  Um vetor nada mais é do que um agrupamento de dados do mesmo tipo, com um tamanho pré-definido. Dessa meneira, os dados estão dispostos na memória de forma contígua (em seqüência) e sem nenhum identificador entre os dados para separá-los. O que o sistema sabe é que temos um vetor de 10 posições, começando por 1 e do tipo string[40].

  De forma a simplificar a visualização dos dados na memória, vamos criar um vetor de inteiros de tamanho igual a 5.
var dia : array[1..5] of integer;
  O vetor não é inicializado. Assim, se não colocarmos os valores em cada posição, teremos os valores que estiverem na memória (lixo) no momento de execução. Esses valores são aleatórios.
var dia : array[1..5] of integer;

begin
  dia[1] := 7;
  dia[2] := 5;
  dia[3] := 9;
  dia[4] := 8;
  dia[5] := 3;
end.
  Os dados do vetor "dia" estarão dispostos na memória da seguinte maneira:
|     1 |     2 |     3 |     4 |     5 | - Posição do vetor
|-------+-------+-------+-------+-------+
| 07 00 | 05 00 | 09 00 | 08 00 | 03 00 | - Dado na memória (valores em hexadecimal)
  Quando acessamos a posição 3 do vetor (assinalado em azul a seguir), o valor 9 é retornado.
|     1 |     2 |     3 |     4 |     5 | - Posição do vetor
|-------+-------+-------+-------+-------+
| 07 00 | 05 00 | 09 00 | 08 00 | 03 00 | - Dado na memória (valores em hexadecimal)
  A referência a uma posição da lista é sempre feita através do nome da variável de vetor, seguida de colchetes contendo o índice do vetor. Ex: dia[1].
  Se quisermos fazer referência a todo o vetor, e trazer os dados completos, indicamos apenas o nome da variável do tipo vetor. Ex: dia.
var vet1, vet2 : array[1..5] of integer;

begin
  vet1[1] := 7;  { Acessa item do vetor, na posição 1, alterando o valor para 7 }
  vet2 := vet1;  { Copia todo o vetor 1 para o vetor 2 }
end.

  Podemos também criar matrizes (um array multidimensional), isto é, uma lista com n dimensões, para guardar dados organizados de outra forma. Por exemplo, uma matriz que guarda o dia, o mês e o ano de nascimento de 20 pessoas seria:
var data : array[1..10, 1..3] of integer;
      i : integer;
begin
  for i:=1 to 20 do
  begin
    writeln('Pessoa numero ',i);
    write('Dia: ');
    read(data[i,1]);
    write('Mes: ');
    read(data[i,2]);
    write('Ano: ');
    read(data[i,3]);
  end;
end. 
  Para criar a matriz acima, usamos também o identificador array. Para vetores multidimensionais, a sintaxe é:
var : vet_multi : array[variacao_dim_1, variacao_dim_2, ..., variacao_dim_n] of tipo_de_dado;
  No caso da tabela anterior, temos duas linhas e três colunas. Para matrizes de duas dimensões, a linha representa a dimensão 1, enquanto que a coluna representa a dimensão 2.
var : matriz : array[variacao_linha, variacao_coluna] of tipo_de_dado;
  A tabela equivalente é ilustrada a seguir.

  DIA MES ANO
PESSOA 1      
PESSOA 2      
PESSOA 3      
PESSOA 4      
PESSOA 5      
PESSOA 6      
PESSOA 7      
PESSOA 8      
PESSOA 9      
PESSOA 10      

  Obs: A área assinalada em amerelo é a informação armazenada na memória do computador. A área em verde é apenas o cabeçalho da tabela para a compreensão e localização dos dados.


PROBLEMAS:

1- Só podemos criar listas ou tabelas com o mesmo tipo de variável. Entretanto, é possível definir tipos de variáveis compostas (ver capítulo de tipos) e utilizá-las em vetores. Definindo um variável composta, seria possível termos um registro com o nome do tipo String, a idade do tipo inteiro e a altura do tipo real, e armazená-las em um vetor.
2- O tamanho da tabela é fixo. Deve ser definido antes de rodar o programa, em sua construção.


PERGUNTAS:

1- Quantas dimensões podemos criar a matriz?
N dimensões. Basta seguir a regra da vírgula. Exemplo para 3 dimensões:
var a : array[1..20, 1..3, 1..50] of integer;

2- Preciso usar a tabela toda?
Não. Você pode criar uma tabela com 1000 linhas e usar só 2.


/MARMSX/CURSOS/PASCAL