Pascal - Avançado


ESTRUTURA DE DADOS TIPO ARRAY

Definição

Um array é um tipo de dado estruturado consistindo de um número fixo de componentes, todos do mesmo tipo.  Cada componente de um array pode ser explicitamente acessado através de um índice , ou subscrito.
As variáveis desse tipo se subdividem em duas categorias, as uni-dimentsionais (também chamados de vetores ), e as multi-dimensionais, a depender do número de índices usados para individualizar cada elemento do conjunto.  Os arrays bi-dimensionais são comumente chamados de matrizes, onde no primeiro índice visualizamos como sendo as linhas de um tabela, e o segundo índice, as colunas.

Declaração do Tipo Array

A definição de um tipo array é feita de acordo com a seguinte sintaxe:
[packed] array [ tipo-do-índice [ , tipo-do-índice ] ... ] of tipo-do-dado
Onde :
Tipo-do-índice : Corresponde ao tipo dos índices, podendo ser um dos seguintes :
·       Um tipo enumerado
·       O identificador de um tipo escalar ordenado
·       Um subintervalo

Tipo-do-dado : Corresponde ao tipo dos componentes do array.

OBSERVAÇÕES
1.     Os símbolos (.  e .) são substitutos que podem ser utilizados no lugar de [ e ].
2.     O uso da palavra reservada packed faz com que o array seja melhor alocado na memória de forma a economizar espaço, em detrimento de um pequena perda de performance.  No Turbo Pascal, isso é feito automáticamente, de forma que a palavra packed sempre será desprezada.

EXEMPLOS
type
   TMatriz     = array[ 1..10, 1..10 ] of real;
   TSituacao    = array[ boolean ] of integer;
   TCores       = ( Vermelho, Amarelo, Azul );
   TIntensidade = array[ TCores ] of real;


Referência aos Elementos de um Array

Um elemento de um array é selecionado colocando-se uma expressão entre colchetes, logo depois do seu nome.  Neste caso, o elemento com o índice é denominado de variável subscrita.
No caso de um array multi-dimensional, as expressões usadas para indexação devem ser separadas umas das outras através de vírgulas.
EXEMPLOS
var
A           : TMatriz;
Intensidade : TIntensidade;

BEGIN
A[ 1, 5 ] := 0.5;
Intensidade[ Amarelo ] := 0.3;
END.
OBSERVAÇÕES
1.     Se nos referenciar-mos a um array utilizando um índice fora dos limites do array, isso provocará um erro em tempo de execução.
Ex. :  A[ 11, 5 ] := 10;            {  O limite de linhas da matriz A é 10 e não 11  }
Todos os elementos de um array podem ser copiados em outro com um único comando de atribuição desde que as duas variáveis sejam do mesmo tipo.  Se os arrays forem multi-dimensionais, pode-se também copiar parte deles, como mostrado abaixo:
type
   TMatriz = array[ 1..10, 1..10 ] of integer;
   TVetor  = array[ -50..50 ] of real;
var
   A, B  : TMatriz;
   X, Y  : TVetor;
BEGIN
   X := Y;              { Atribui a X todos os elementos de Y }
   A[ 1 ] := B[ 2 ];    { Atribui a linha 2 de B à linha 1 de A }
END.
OBSERVAÇÕES
Duas variáveis são do mesmo tipo se elas forem definidas na mesma lista do comando var. Assim, se tivermos :
var
Vetor1 : array[ 1..5 ] of integer;
Vetor2 : array[ 1..5 ] of integer;
Vetor3, Vetor4 : : array[ 1..5 ] of integer;

as variáveis Vetor1 e Vetor2 não são consideradas como sendo do mesmo tipo no Pascal.  Dessa maneira, a atribuição abaixo daria erro de compilação :
Vetor1 := Vetor2;
Ao passo que a atribuição abaixo estaria correta :
Vetor3 := Vetor4;

Arrays de Caracteres

Os arrays de caracteres podem ser manipulados como strings, vejamos um exemplo:

EXEMPLO

program TesteArrayChar;
var
   Digitos : array[ 1..10 ] of Char;
   I       : integer;
BEGIN
   Digitos := ‘0123456789’;
   for I := 1 to 10 do
      write( Digitos[ I ] );
   writeln;
   writeln( Digitos );
END.

Leitura e Impressão de Arrays

A leitura e impressão de arrays são feitas indicando individualmente quais elementos se deseja ler ou imprimir.

EXEMPLOS

var
   Vetor  : array[ 1..10 ] of integer;
   Matriz : array[ 1..10, 1..20 ] of real;
   I, J   : integer;

BEGIN
   { Leitura de um vetor }
   for I := 1 to 10 do
      readln( Vetor[ I ] );
   { Impressão de um vetor }
   for I := 1 to 10 do
      writeln( Vetor[ I ] );
   { Leitura de uma matriz - Linha por Linha }
   for I := 1 to 10 do
      for J := 1 to 20 do
         readln( Matriz[ I, J ] );
   { Impressão de uma matriz - Linha por Linha }
   for I := 1 to 10 do
      for J := 1 to 20 do
         writeln( Matriz[ I, J ] );
   { Leitura de uma matriz - Coluna por Coluna }
   for I := 1 to 20 do
      for J := 1 to 10 do
         readln( Matriz[ I, J ] );
END.

Arrays Multi-Dimensionais


Para ilustrar o uso de arrays multi-dimensionais, considere o seguinte problema:

Um professor atribui a cada aluno de uma turma de 50 alunos, três notas resultantes de três avaliações; o professor deseja saber a média de cada aluno e a média da turma em cada avaliação.

Uma maneira natural de tratar esse problema é com o uso de um array bi-dimensional ( MATRIZ ), tal como ilustrado abaixo na matriz NOTAS.  Onde cada linha representa um aluno e cada coluna representa uma avaliação (dessa forma teríamos uma matriz 50 X 3), assim para sabermos a nota do aluno No 10 na 2a Avaliação, teríamos NOTAS[ 10, 2 ] .


10.0
10.0
10.0
Þ
10.0

2.0
0.0
1.0
Þ
1.0

8.0
6.0
9.0
Þ
7.7

8.0
5.0
10.0
Þ
7.7


ß

ß

ß

Média do Aluno
Média  da Avaliação
7.0
5.3
7.5









               

Usaremos dois arrays uni-dimensionais ( VETORES ) para conter as médias.  O array Media_Alunos conterá a média de cada aluno e Media_Avaliacao conterá a média de cada avaliação.


Program Analise_de_Notas;
{
   Programa que irá ler as notas obtidas pelos alunos de uma turma colocando-as
   em um array bi-dimensional.  A seguir será calculada a média obtida por cada
   aluno e a média de cada avaliação, imprimindo os resultados.
}
const
   Num_Avaliacoes =  3;
   Num_Alunos     = 10;

type
   IndiceAluno     = 1..Num_Alunos;
   IndiceAvaliacao = 1..NumAvaliacoes;

var
   Notas          : array[ IndiceAluno, IndiceAvaliacao ] of real;
   MediaAlunos    : array[ IndiceAluno ] of real;
   MediaAvaliacao : array[ IndiceAvaliacao ] of real;
   I, J           : integer;
   Soma           : real;

BEGIN
   { Leitura da Matriz de Notas }
   for I := 1 to NumAlunos do
      { Leitura das Noras do I-esimo aluno }
      for J := 1 to NumAvaliacoes do
          read( Notas[ I, J ] );
   
   { Calculo da média de cada avaliação guardando-as no array MediaAvaliacao }
   for J := 1 to NumAvaliacoes do
   begin
      Soma := 0;
      for I := 1 to NumAlunos do
         Soma := Soma + Notas[ I, J ];
      MediaAvaliacao[ J ] := Soma / NumAlunos;
   end;

   { Calculo da média de cada aluno guardando-as no array MediaAlunos }
   for I := 1 to NumAlunos do
   begin
      Soma := 0;
      for J := 1 to NumAvaliacoes do
         Soma := Soma + Notas[ I, J ];
      MediaAlunos[ I ] := Soma / NumAvaliacoes;
   end;

   { Impressao das Médias dos Alunos e suas notas }
   writeln( ´Aluno´, ´Media´:7, ´ ´:10, ´Notas´, );
   for I := 1 to NumAlunos do
   begin
      write( I:4, MediaAlunos[ I ]:8:1, ´ ´:4 );
      for J := 1 to NumAvaliacoes do
         write( Notas[ I, J ]:5:1 );
writeln;
   end;

   { Impressao das medias das avaliaçoes }
   write( ´Media das Avaliações : ´);
   for J := 1 to NumAvaliacoes do
      write( MediaAvaliacoes[ J ]:5:1 );
END.

Arrays Constantes

As constantes já vistas se enquadram entre as constantes denominadas escalares.  No Pascal existem outros tipos de constantes, denominadas estruturadas, para as quais estão associadas não um valor, como nas escalares, mas um coleção de valores.
Um dos tipos de constantes estruturadas do Pascal são os Arrays Constantes, os quais são definidos da seguinte forma:
const
ident-constante : array[ tipo-do-índice [ , tipo-do-índice ] ... ] of tipo-do-dado = valores;
EXEMPLO
const
DIGITOS : array[ 1..10 ] of integer = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
A declaração de um array constante contém a especificação de cada um dos valores dos elementos do array.
O tipo dos elementos de uma constante de array pode ser qualquer um dos tipos de dados da linguagem Pascal, com exceção do tipo file.
EXEMPLOS
type
TStatus       = ( Ativo, Passivo, Esperando );
TStatusString = array[ Status ] of string[ 7 ];

const
StatusString : TStatusString = ( ‘Ativo’, ‘Passivo’, ‘Esperando’ );
Dessa forma, esses são os valores dos elementos do array constante StatusString :
StatusString[ Ativo ]     = ‘Ativo’
StatusString[ Passivo ]   = ‘Passivo’
StatusString[ Esperando ] = ‘Esperando’

Um exemplo com array multi-dimensionais :
type
TMatriz = array[ 1..2, 1..3 ] of integer;
const
MATRIZ : TMatriz = ( ( 1, 2, 3 ), ( 4, 5, 6) );

MATRIZ[ 1, 1 ] = 1      MATRIZ[ 1, 2 ] = 4      MATRIZ[ 1, 3 ] = 7
MATRIZ[ 2, 1 ] = 2      MATRIZ[ 2, 2 ] = 5      MATRIZ[ 2, 3 ] = 8
MATRIZ[ 3, 1 ] = 3      MATRIZ[ 3, 2 ] = 6      MATRIZ[ 3, 3 ] = 9


Uso de Índices com Conteúdo Semântico

Como vimos, os índices de um array servem para acessar individualmente seus elementos.  Freqüentemente, esses índices têm um significado intrínseco.  Por exemplo, se desejássemos contar as letras existentes em um texto, poderíamos declarar o contador da seguinte maneira:
type
   Faixa = 1..26;
var
   Contador : array[ Faixa ] of integer;
ficando subentendido que Contador[ 1 ] é o contador da letra ´a´, Contador[ 2 ] é o contador da letra ´b´ e assim sucessivamente.  No entanto, o entendimento ficaria mais claro se usássemos como índice não um número inteiro para indicar a letra, mas a própria letra, isto é, Contador[ ´a´ ] para indicar o contador da letra ´a´,  Contador[ ´b´ ] para para indicar o contador da letra ´b´, etc.  Isto é possível uma vez que o índice de um array pode ser qualquer escalar ordenado (  char, integer, boolean, enumerated, subrange )  Assim, a declaração anterior ficaria melhor da seguinte forma :

type
   Letras = ´a´..´z´;
var
   Contador : array[ Letras ] of integer;

EXEMPLO

Vejamos um exemplo completo usando o recurso de índices com conteúdo semântico.

program Vendedor;
{
   Programa para ler as vendas efetuadas durante uma semana por uma equipe de
   vendedores.  A seguir será impresso o valor das vendas indicando quais os
   dias que tiveram vendas abaixo e acima da média.
}
type
   TDias = ( Seg, Ter, Qua, Qui, Sex, Sab, Dom );
var
   Vendas : array[ TDias ] of real;
   Dia    : TDias;
   Total,
   Media  : real;
BEGIN
   { Leitura das vendas da semana }
   for Dia := Seg to Dom do
      read( Vendas[ Dia ] );
   { Cálculo da Média }
   Total := 0;
   for Dia := Seg to Dom do
      Total := Total + Vendas[ Dia ];
   Media := Total / 7;
   writeln( ´Vendas Diárias Comparadas com a Média´ );
   writeln( ´      SEG      TER      QUA      QUI      SEX      SAB      DOM´ );
   for Dia := Seg to Dom do
      write( Vendas[ Dia ] :9:2 );
   writeln;
   for Dia := Seg to Dom do
      if Vendas[ Dia ] > Media then
         write( ´+´ : 9 )
      else
         if Vendas[ Dia ] < Media then
write( ´-´ : 9 )
         else
write( ´0´ : 9 );
END.
Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Sweet Tomatoes Printable Coupons