Buscar

Aula_009 - Tipos Estruturados II

Prévia do material em texto

1
Aula 9
Professores:
Dante Corbucci Filho
Alexandre Plastino
Conteúdo:
- Tipos Estruturados (2a Parte)
 - Records (Registros)
 
2
Record (ou Registro)
 Uma forma comum de organização (estruturação) 
de dados consiste na junção ou composição de tipos em 
um tipo composto. Por exemplo:
 
 - números complexos são compostos por dois números reais,
 - coordenadas cartesianas de um ponto são definidas por um 
 par (X,Y) de números reais,
 - cadastros de pessoas contém informações do tipo nome, 
 idade, sexo, data de nascimento, etc. 
3
Record (ou Registro)
 Em Pascal, a combinação de várias informações 
(podendo ser de tipos diferentes) em uma mesma 
estrutura ocorre através de Records (Registros).
 Um record é uma estrutura com as seguintes 
características:
 
 - contém um número fixo de elementos chamados campos,
 - os campos podem ser de tipos diferentes,
 - cada campo tem um nome próprio, denominado
 "identificador do campo"
4
Exemplos
Representação de um número complexo
As variáveis X e Y são do tipo record Complexo.
X e Y são formadas, cada uma, por dois campos 
do tipo real: Re e Imag.
type
 Complexo = record
 Re : real;
 Imag : real
 end;
var
 X, Y: Complexo;
5
Exemplos
Representação de uma data
type
 Data = record
 Dia : 1 . . 31;
 Mes : (Jan,Fev,Mar,Abr,Mai,Jun,
 Jul,Ago,Set,Out,Nov,Dez);
 Ano : integer
 end;
6
Exemplos
Representação de informações sobre um brinquedo
type
 Brinquedo = record
 Tipo : (Bola, Jogo, Boneca);
 Custo : real;
 Estado : (Bom, Quebrado);
 end;
7
Exemplos
Informações cadastrais de um funcionário
type
 Ficha = record
 Nome : string [20];
 Codigo : 1 . . 999;
 Salario : real;
 end;
var
 Funcionario : Ficha;
8
Record
Declaração - Diagrama Sintático
- "Identificador" se refere ao nome de um campo; 
- "Tipo" pode ser qualquer tipo simples ou estruturado.
:
,
;
Tipo endIdentificadorrecord
9
Record
Denotação
 Um campo de uma variável do tipo record é 
referenciada pelo nome da variável seguida de um ponto 
(".") e do nome do campo.
 Exemplos:
 - Funcionario.Nome se refere ao campo Nome 
 da variável Funcionario;
 
 - X.Re se refere ao campo Re da variável que
 representa um número complexo X.
10
Exemplos
Ler os valores dos campos do registro Funcionario
write (output, ’Informe o nome do Funcionário: ’);
readln (input, Funcionario.Nome);
write (output, ’Informe o código do Funcionário: ’);
readln (input, Funcionario.Codigo);
write (output, ’Informe o salário do Funcionário: ’);
readln (input, Funcionario.Salario);
11
Exemplos
Atribuição do valor 5.5-2.3i à variável complexa X
X.Re := 5.5;
X.Imag := -2.3;
12
Exemplos
Inserir um brinquedo no estoque (vetor de registros)
var Estoque: array [1 . . 1000] of Brinquedo;
begin
. . .
 Estoque[1].Tipo := Bola;
 Estoque[1].Custo := 500.0;
 Estoque[1].Estado := Bom;
. . . 
end. 
13
Record
 Abreviação
 Os campos de um registro podem ser referenciados sem 
que seja necessária a prefixação com o nome da variável. Para 
tanto, utiliza-se o comando with. Exemplo:
with Funcionario do
 begin
 write (output, ’Informe o nome do Funcionário: ’);
 readln (input, Nome);
 write (output, ’Informe o código do Funcionário:’);
 readln (input, Codigo);
 write (output, ’Informe o salário do Funcionário: ’);
 readln (input, Salario);
 end;
14
Record
Abreviação - Diagrama Sintático
- "Comando" pode ser apenas um comando ou um conjunto 
 de comandos delimitados por begin e end.
,
with Variável Comandodo
15
Record
Abreviação
Outro exemplo:
var Estoque: array [1 . . 1000] of Brinquedo;
begin
. . .
 with Estoque[1] do
 begin
 Tipo := Bola;
 Custo := 500.0;
 Estado := Bom
 end;
. . .
end.
16
Record
Abreviação
with Estoque[i] do
 begin
 . . .
 i := i + 1;
 . . . 
 end;
 Dentro do escopo da abreviação, não é permitido fazer 
qualquer atribuição que altere a variável abreviada. O seguinte 
código não é permitido.
17
 Programa para listar o conteúdo de uma tabela 
contendo o cadastro de funcionários de uma empresa.
Program ListaCadastro (input{teclado}, output{vídeo}, BD{e});
Uses crt;
Const MaxFunc = 1000;
Type
 Dominio = 1 . . MaxFunc;
 Registro = record
 Nome : string [20];
 Codigo : Dominio;
 Salario : real
 end;
 Tabela = array [Dominio] of Registro;
Var
 BD : text;
 Cadastro : Tabela;
 NumFunc : integer;
Begin 
End. 
18
Program ListaCadastro (input{teclado}, output{vídeo}, BD{e});
Uses crt; 
Const MaxFunc = 1000;
Type
 Dominio = 1 . . MaxFunc;
 Registro = record
 Nome : string [20];
 Codigo : Dominio;
 Salario : real
 end;
 Tabela = array [Dominio] of Registro;
. . .
Var
 BD : text;
 Cadastro : Tabela;
 NumFunc : integer;
Begin
 LerCadastro(BD,Cadastro,NumFunc);
 ImprimirCadastro(Cadastro,NumFunc); 
End.
19
Program ListaCadastro (input{teclado}, output{vídeo}, BD{e});
. . .
Procedure LerCadastro(Var Arquivo{e}: text;
 Var Cadastro{s}: ListaFuncionarios;
 Var NumFunc{s}: integer); 
 begin {Esta rotina deverá ler de um arquivo os dados 
 dos funcionários.}
 end;
Procedure ImprimirCadastro(Cadastro{e}: ListaFuncionarios;
 NumFunc{e}: integer); 
 begin 
 end;
. . .
Begin 
 LerCadastro(BD,Cadastro,NumFunc);
 ImprimirCadastro(Cadastro,NumFunc); 
End. 
20
Program ListaCadastro (input{teclado}, output{vídeo}, BD{e});
. . .
Procedure ImprimirCadastro(Cadastro{e}: ListaFuncionarios;
 NumFunc{e}: integer); 
 var i : integer;
 begin 
 Clrscr; {Este comando limpa a tela - contida na crt.}
 writeln (output, ’Nome’, ’Código’ : 23, ’Salário’ : 21);
 for i := 1 to NumFunc do
 with Cadastro[i] do 
 writeln (output, Nome, ’ ’ : 22 - lenght(Nome),
 Codigo : 3, Salario : 23 : 2)
 end;
. . .
Begin 
 LerCadastro(BD,Cadastro,NumFunc);
 ImprimirCadastro(Cadastro,NumFunc); 
End. 
21
Program ListaCadastro (input{teclado}, output{vídeo}, BD{e});
. . .
Procedure LocalizarRegistro(Cadastro{e}: ListaFuncionarios;
 Cod{e} : Dominio); 
 var i : integer;
 begin 
 i := 1; 
 while (i <= MaxFunc) and (Cod <> Cadastro[i].Codigo) do
 i := i + 1;
 if i <= MaxFunc then 
 writeln (output, ’Nome: ’, Cadastro[i].Nome,’ Salário: ’, Cadastro[i].Salario)
 end;
. . .
Begin
. . . 
 LocalizarRegistro(Cadastro,Codigo); 
. . . 
End. 
22
Definição Hierárquica de Records (Registros)
 Em Pascal, o campo de um registro pode ter 
como tipo um outro registro (esta composição pode 
ocorrer em vários níveis).
 Por exemplo, um funcionário pode ser 
caracterizado por um tipo record que contém: código, 
nome, data de nascimento, salário e endereço. A data de 
nascimento pode ser do tipo record contendo dia, mês e 
ano. O endereço pode também ser do tipo record 
contendo os campos : rua, número, apto, bairro e CEP. 
23
Type
 TData = record
 Dia : 1 . . 31;
 Mes : (Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez);
 Ano : integer;
 end;
 TEnder = record
 Rua : string [30];
 Numero : integer;
 Apto : integer;
 Bairro : string [20];
 CEP : string [8];
 end;
 Registro = record
 Codigo : 1 . . 1000;
 Nome : string [40];
 DtNasc : TData;
 Salario : real;
 Endereco : TEnder;
 end;
tipo record
tipo record
24
Hierarquia de Registros: Acesso aos Campos
Type 
 . . .
 Registro = record
 Codigo : 1 . . 1000;
 Nome : string [40];
 DtNasc : TData;
 Salario : real;
 Endereco : TEnder;
 end;
Var
 R, S: Registro;
Begin
 R.Codigo:= 5;
 R.DtNasc.dia:= 13;
 R.Salario:= 3333.33;
 R.Endereco.Rua:= ’Passo da Pátria’;
 R.Endereco.Bairro:= ’São Domingos’;
 S:= R;
End.
25
Registros com Variantes (Variant Records)
 Uma variável do tipo record conforme definido até o 
momento tem sempre um número fixo de campos e possui 
sempre os mesmos campos.
 Em Pascal, é possível se definir registros variando-se o 
número de campos e as próprias definições dos campos.
 Considere a situação em que se deseja armazenar, 
além dos campos comuns de um funcionário, o seu estado civil 
e, caso este seja casado, o nome do cônjuge e o número de 
filhos devem ser armazenados, caso seja divorciado, a data do 
divórcio deve ser registrada, e caso seja solteiro, a informação 
se vive sozinho torna-se importante. 
26
Registro com Variantes (União Discriminada)
Type
 TEstadoCivil = (Solteiro, Casado, Divorciado);
 Registro = record
 Codigo : 1 . . 1000;
 Nome : string [40];
 DtNasc : TData;
 Salario : real;
 Endereco : TEnder;
 case EstCiv : TEstadoCivil of
 Solteiro : (ViveSozinho : boolean);
 Casado : (NomeConjuge : string [40];
 NumeroFilhos : integer);
 Divorciado : (DataDivorcio : TData) 
 end;
parte fixa
parte variante
27
Registro com Variantes (União Discriminada)
985
’João da Silva’
20 Dez 1964
2213.00
’Rua Corcovado’
65
801
’Botafogo’
22460050
Casado
’Maria Carvalho’
2
21
’José Cruz’
7 Out 1958
5260.00
’Rua da Tribuna’
550
102
’Centro’
21000100
Solteiro
true
104
’Ana Moura’
1 Ago 1960
4200.00
’Rua Torta’
10
101
’Gávea’
22465550
Divorciado
31 Mar 2000
28
Type 
 . . .
 Registro = record
 Codigo : 1 . . 1000;
 Nome : string [40];
 DtNasc : TData;
 Salario : real;
 Endereco : TEnder;
 case EstCiv : TEstadoCivil of
 Solteiro : (ViveSozinho : boolean);
 Casado : (NomeConjuge : string [40];
 NumeroFilhos : integer);
 Divorciado : (DataDivorcio : TData) 
 end;
Var
 R, S: Registro;
Begin
 R.Codigo:= 5;
 R.DtNasc.dia:= 13;
 R.EstCiv:= Casado;
 R.NumFilhos:= 4;
 R.NomeConjuge:= ’Mariângela Silva’;
 S:= R;
End.
29
Registro com Variantes (União Indiscriminada)
Type
 TEstadoCivil = (Solteiro, Casado, Divorciado);
 Registro = record
 Codigo : 1 . . 1000;
 Nome : string [40];
 DtNasc : TData;
 Salario : real;
 Endereco : TEnder;
 case TEstadoCivil of
 Solteiro : (ViveSozinho : boolean);
 Casado : (NomeConjuge : string [40];
 NumeroFilhos : integer);
 Divorciado : (DataDivorcio : TData) 
 end;
parte fixa
parte variante
30
Registro com Variantes (União Indiscriminada)
985
’João da Silva’
20 Dez 1964
2213.00
’Rua Corcovado’
65
801
’Botafogo’
22460050
’Maria Carvalho’
2
21
’José Cruz’
7 Out 1958
5260.00
’Rua da Tribuna’
550
102
’Centro’
21000100
true
104
’Ana Moura’
1 Ago 1960
4200.00
’Rua Torta’
10
101
’Gávea’
22465550
31 Mar 2000
31
Professores:
Dante Corbucci Filho
Alexandre Plastino
Conteúdo:
- Tipos Estruturados (2a Parte)
 - Records (Registros)
 
Aula 9

Continue navegando