Baixe o app para aproveitar ainda mais
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
Compartilhar