16.Tipos Estruturados
Os tipos estruturados diferem do tipo simples pelo fato de poderem agregar mais de um componente (informação). Cada componente de um tipo estruturado pode ser uma variável de um tipo simples ou estruturado.
A linguagem Pascal agrupa os tipos estruturados de acordo com os tipos de componentes que podem agregar: os Tipos Estruturados Homogêneos, que só podem agregar componentes do mesmo tipo e os Heterogêneos, que podem agregar tipos diferentes.
Como Tipos Homogênetos, o Pascal nos oferece os Vetores (array), os Arquivos (FILE) e o Conjunto (SET).
Como Tipo Heterogêneo o Pascal nos oferece o Registro (RECORD).
16.1Vetores Unidimensionais e Multidimensionais (Matrizes)
A palavra ARRAY define a construção de matrizes e a definição de matrizes talvez seja uma das estruturas de dados mais conhecidas. Estas podem ter um número fixo de elementos definidos por uma faixa de índices e esta faixa pode ter mais de um nível.
Quando a faixa possui um único nível (linha), costumamos chamar de vetor e quando possui mais de um nível ou linha, chamamos de matriz. Um vetor é uma matriz de uma única linha.
Uma matriz possui quatro propriedades básicas:
a) Os itens de dados individuais na matriz são chamados de elementos.
b) Todos os elementos devem ser do mesmo tipo de dados.
c) Todos os elementos são armazenados contiguamente na memória do computador, e em linguagem C o índice do primento elemento sempre será zero.
d) O nome da matriz é um valor constante que representa o endereço do primeiro elemento na matriz.
Como todos os elementos são do mesmo tamanho, não podemos definir matrizes usando uma mistura de tipos de dados, pois a localização de um elemento é feita com base no endereço do primeiro elemento mais o deslocamento proporcional ao índice.
As matrizes podem ser unidimensionais quando o acesso a um de seus elementos é feito através de um único índice, também conhecida como vetores em Pascal, ou multidimensionais quando possuem mais que uma dimensão, sendo necessário mais de um índice para acessar um de seus elementos.
Uma matriz unidimensional ou vetor em Pascal é definido com o uso da palavra reservada array, seguida de seus limites inferior e superior entre colchetes, da palavra reservada of e do tipo de componente do vetor.
: ARRAY [ .. ] of
Ex:
Alunos: Array[1..40] of integer;
Uma matriz multidimensional pode ser comparada a uma tabela de duas ou mais dimensões, sendo necessários tantos índices quantas forem as dimensões.
Uma matriz multidimensional em Pascal é definida também com o uso da palavra reservada array, seguida de seus limites inferior e superior para cada dimensão, separada por vírgulas, entre colchetes, da palavra reservada of e do tipo de componente do vetor.
: ARRAY [ .. , .. , .. ] of
Ex:
Notas: Array[1..40,1..3] of integer;
Uma matriz pode ser declarada e inicializada declarando-se no bloco de constantes:
const
num1: array [1..5] of integer = (2,4,6,8,10);
num2: array [1..2,1..5] of integer = ((10,20,30,40,50),(15,25,35,45,55));
Observe que não se pode usar uma variável na definição da matriz para dimensionar o seu tamanho, pois o compilador precisa alocar a memória necessária no momento da compilação.
Exemplo:
Program Arrays;
Uses CRT;
Var
Vetor: array[1..10] of integer;
Matriz: array[1..5,1..10] of integer;
i, j:integer;
begin
clrscr;
Writeln('Lendo Valores do Vetor: ');
for i:= 1 to 10 do
begin
write('Elemento ',i,': ');
readln(Vetor[i]);
end;
Writeln('Lendo Valores da Matriz: ');
for i:= 1 to 5 do
begin
for j:= 1 to 10 do
begin
write('Elemento [', i, ',' , j, ']: ');
readln(Matriz[i,j]);
end;
end;
Writeln('Escrevendo Valores do Vetor: ');
for i:= 1 to 10 do
begin
writeln('Elemento ',i,': ',Vetor[i]);
end;
Writeln('Escrevendo Valores da Matriz: ');
for i:= 1 to 5 do
begin
for j:= 1 to 10 do
begin
writeln('Elemento [', i, ',' , j, ']: ',Matriz[i,j]);
end;
end;
readln;
end.
16.2 Estruturas
A declaração RECORD permite-nos definir um registro:
= RECORD
: tipo;
: tipo;
. . .
: tipo;
END;
REGISTRO é um grupo de informações relativas a uma mesma entidade. Estas informações podem ter características diferentes, como em um R.G., onde temos diversos campos com nome, nome do pai, nome da mãe, número do registro, etc.
O registro tem uma particularidade em relação a uma matriz, enquanto em uma matriz podemos ter vários elementos de um único tipo, no registro podemos ter elementos com tipos diferentes. A definição de um registro no Turbo Pascal só pode ser feita na área de tipos (TYPE) e assim sendo, quando definimos um registro, na verdade, estamos criando um tipo novo. Para podermos utilizar este tipo, temos que declará-lo na área de variáveis (VAR), já a manipulação dos campos de um arquivo deve ser feita através da referência do nome do registro e o nome do campo unidos por um ponto (.).
Exemplos :
TYPE
registro = RECORD
nome : STRING[30];
ende : STRING[25];
fone : STRING[8];
idade : BYTE;
END;
tela = RECORD
atributo : BYTE;
caracter : CHAR;
END;
Podemos ainda ter uma estrutura de registro seletivo :
Exemplo:
Program ExemploRegistroSeletivo;
uses crt;
type
Classe = (Num, Str);
uniao = record
Nome: string[30];
case campo: Classe of
Num: (N: real);
Str: (S: string);
end;
var
un: uniao;
op: char;
begin
clrscr;
write('Nome: ');
readln(un.nome);
writeln('O que voce quer armazenar: [N] Numero - [S] - String?');
op:=readkey;
if upcase(op)='N' then
begin
write('Digite um numero: ');
readln(un.N);
writeln(un.nome);
writeln(un.N:0:6);
end
else
begin
write('Digite uma string: ');
readln(un.S);
writeln(un.nome);
writeln(un.S);
end;
readkey;
end.
Neste tipo de registro, temos a possibilidade de variar a estrutura. dependendo da condição encontrada no decorrer do programa para um campo-sinal previamente declarado como tipo escalar, esta estrutura de seleção é chamada de união discriminada, cabendo desta forma ao programador manter válida.
Exemplo de referência de um campo do registro :
PROGRAM teste_reg;
TYPE
registro = RECORD
nome :STRING[30];
ende :STRING[25];
fone :STRING[8];
idade :BYTE;
END;
VAR
reg : registro;
BEGIN
reg.nome := ‘Roberto’;
reg.ende := ‘Rua Anônima, 0’;
reg.fone := ‘999-9999’;
reg.idade:= 30;
writeln(‘Nome: ’, reg.nome);
writeln(‘Endereço: ’, reg.ende);
writeln(‘Fone: ’, reg.fone);
writeln(‘Idade: ’, reg.idade);
write(‘Nome: ’);
readln(reg.nome);
write(‘Endereço: ’
readln(reg.ende);
write(‘Fone: ’
readln(reg.fone);
write(‘Idade: ’
readln(reg.idade);
writeln(‘Nome: ’, reg.nome);
writeln(‘Endereço: ’, reg.ende);
writeln(‘Fone: ’, reg.fone);
writeln(‘Idade: ’, reg.idade);
END.
Pode-se também armazenar os registros em memória, através do uso de vetores ou matrizes de estrutras.
Exemplo:
Program ExemploRegistroSeletivo;
uses crt;
type
cadastro = record
codigo: integer;
nome: string[30];
rg: string[15];
end;
var
cad: Array [1..10] of cadastro;
i: integer;
begin
clrscr;
for i:= 1 to 10 do
begin
write('Codigo: ');
readln(cad[i].codigo);
write('Nome: ');
readln(cad[i].nome);
write('RG: ');
readln(cad[i].rg);
end;
clrscr;
for i:= 1 to 10 do
begin
writeln(cad[i].codigo, ' - ', cad[i].nome, ' - ', cad[i].rg);
end;
readkey;
end.
|