
Captulo 17 - tipos estruturados

  Os tipos estruturados permitem-nos a criao de conjuntos, registros ou 
a definio de arquivos. 
ARRAY
  <identificador> : ARRAY[faixas] OF tipo;

  As definies das faixas so obrigatrias. 
  A palavra ARRAY define a construo de matrizes e a definio de matrizes
talvez seja uma das estruturas de dados mais conhecidas pois,  utilizada
em diversas linguagens de programao. Estas podem ter um nmero fixo de 
elementos definidos por uma faixa de ndices e esta faixa, por sua vez, 
pode ter mais de um nvel. Os elementos so de tipos predefinidos ou ainda
definidos pelo usurio. Uma matriz contm, na maioria das vezes, elementos
comuns entre si. O maior tamanho que uma matriz pode ter  64 kbytes, ou seja,
o tamanho da rea de dados de um programa.
  Para tentarmos simplificar a definio de matriz, podemos imaginar a seguin-
te situao: temos que armazenar dados de uma empresa por meses, e para isso
poderamos ter 12 variveis diferentes que poderiam, por sua vez, estar em
locais diferentes na memoria, 
VAR
  mes01, mes02, mes03, 
  mes04, mes05, mes06,
  mes07, mes08, mes09,
  mes10, mes11, mes12 : REAL;

  Ou ainda, estar em uma rea contnua, permitindo um acesso um pouco  
mais facilitado, alis a grande vantagem de se ter uma matriz est justa-
mente no fato de se poder criar algortmos, que facilitam a lgica de alguns
programas: 
VAR
  meses : ARRAY[1..12] OF REAL;

  A referncia a um dos elementos de uma matriz  feita, de acordo com o 
deslocamento de endereo, partindo do primeiro elemento, mais o tamanho 
em bytes de cada elemento, multiplicado pela posio -1. Se na matriz meses
acima descrita, quisermos nos referir ao mes de maio, basta que coloquemos
o valor 5 como ndice:
  meses[5] := expresso;
  Quando utilizamos o ndice, o prprio Turbo se encarrega de fazer o cl-
culo do endereo de memria de acordo com o ndice. 
  meses[ind] est na posio de memria
  meses + (ind-1) *tamanho do tipo

  A faixa de uma matriz pode ser de qualquer tipo ordinal (Shortint, Inte-
ger, Longint, Byte, Word, Boolean, Char), pode ter uma ou mais dimenses
    tabuleiro : ARRAY[1..8,1..8] OF CHAR;
cada elemento desta matriz bidimencional pode ser acessado como se fosse
composto por linha e coluna
tabuleiro
coluna        1   2   3   4   5   6   7   8
linha    1   1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8
         2   2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8
         3   3,1 3,2 3,3 3,4 3,5 3,6 3,7 3,8
         4   4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8
         5   5,1 5,2 5,3 5,4 5,5 5,6 5,7 5,8
         6   6,1 6,2 6,3 6,4 6,5 6,6 6,7 6,8
         7   7,1 7,2 7,3 7,4 7,5 7,6 7,7 7,8
         8   8,1 8,2 8,3 8,4 8,5 8,6 8,7 8,8

quanto aos tipos dos elementos, estes podem ter qualquer definio, pelo
Turbo, ou pelo  usurio (variveis tipadas ou estruturadas).
  Uma matriz pode sser declarada na rea de constantes (veja constantes
estruturadas), tipos ou varveis como nos exemplos:
TYPE
   tabela1 = ARRAY [1..10] OF BYTE;
   coluna  = 1..80;
   linha = 1..25;
   tela = ARRAY[linha,coluna] OF CHAR;
VAR
   tab : tabela1;
   telaaux : tela;
   tabalfa : ARRAY[..Z] OF REAL;
   tablog : ARRAY[false..true] OF STRING;
  S para conluri, podemos considerar tambm uma string como sendo uma ma-
triz de caracteres:
   nome : STRING[30];
   ou
   nome : ARRAY[0..30] OF CHAR;

tem a mesma definio, assim sendo, podemos nos referir a um  elemento de
uma string pelo seu ndice, 
VAR
   nomes : STRING[25];
BEGIN
     nome[1] := R;
     nome[2] := ;
     nome[0] := #2;
END.
o elemento zero (0)de uma string indica o contedo da mesma, independente
do tamanho fsico. 
  Um elemento de matriz do tipo string, tambm pode ser considerado uma
matriz de matriz, ou uma matriz multidimensional: 
VAR
   tabnomes : ARRAY[5..15] OF STRING[30];
BEGIN   
     tabnomes[5,0] := #0;   { o mesmo que dizer}
                             {que o primeiro elemento}
                            {de tabnomes  nulo ou}
                            {seja tabnomes[5] :  }
END.

  Para podermos fixar melhor estes conceitos, vejamos um programa exemplo:
PROGRAM teste_array_str;
VAR
   campo1 : STRING[15];
   ind : BYTE;
BEGIN   
     WRITE (digite uma palavra ->);
     READLN (campo1);
     WRITELN;
     FOR ind := ORD (campo1[0]) DOWNTO 1 DO.
     WRITE (campo1[ind]);
     READLN;
END.

No exemplo anterior, recebemos uma sentana por meio do teclado, aps a
digitao desta sentena, utilizamos uma estrutura de repetio onde
partimos do tamanho da sentena. (ORD converte em nmero o elemento 0 da
string, este indica o tamanho do contedo da sentena), exibimos assim,
todos os elementos da string a partir do ltimo at o primeiro.
Vejamos agora, um outro exemplo que nos permite determinar a quantidade
mxima de caracteres que podemos digitar para uma entrada alfanumrica:
PROGRAM teste_entrada_alfa;

USES        CRT;

VAR
    campostr        :STRING[60];
    contador, linha,
    coluna          :BYTE;
    ch              :CHAR;
BEGIN
    REPEAT
        CLRSCR;
        GOTOXY(1,5);
        linha             :=7;
        coluna            :=10;
        contador          :=0;
    campostr[0]           :=CHR(0);
     WRITELN (Digite uma senten);
    REPEAT
      GOTOXY (coluna,linha);
       ch := READKEY;            
       IF ch <> #13 THEN
         BEGIN
           contador := contador + 1;
           coluna := coluna + 1;
           campostr := campostr + ch;
           WRITE (ch);
         END;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    CLRSCR;
       GOTOXY (10,1);
       WRITELN (as notas d, bimestre:2, o bimestr);
       WRITELN;
       FOR aluno := 1 TO 20 DO
         WRITELN (nota do aluno nmer, aluno:2, , tab_alunos[bimestre,aluno]);
         WRITELN (deseja um novo bimestre S/N ??);
       REPEAT
         ch := UPCASE (READKEY);
       UNTIL ch IN [S,N];
       UNTIL ch = N;
       END.

  Neste exemplo,  importante se notar que no so feitas as devidas con-
sistncias para as entradas, cabendo a cada um faz-lo para uma melhor apresen-
tao do programa e evitar erros de execuo. 
