Você está na página 1de 22

21

Registros
Linguagens de Programação
Matriz vs Registro
▪ Matriz ●
Registro
– Conjunto de elementos de – Conjunto de elementos de tipos
mesmo tipo potencialmente diferentes
Matriz vs Registro
▪ Matriz ●
Registro
– Valores acessados por – Valores acessados por campos.
índices – Cada campo possuim um
identificador próprio.

Empregado
notas[5] = 8.5
id
nome
notas 8.5
34
idade
0 1 2 3 4 5 ... 28 29 salário
departamento

Empregado.idade = 34
Matriz vs Registro
▪ Matriz ●
Registro
– Valores acessados por – Valores acessados por campos.
índices – Cada campo possuim um
identificador próprio.

float notas[30]; struct empregado{


int id;
char nome[30];
int idade;
float salario;
char departamento;
};
Definição de Registros
▪ Registros também são chamadas de Estruturas
▪ Registros apareceram primeiro em COBOL e PL/I

01 REGISTRO-EMPREGADO. Estrutura dentro de Estrutura


02 NOME-EMPREGADO.
05 PRIMEIRO PICTURE IS X(20). String
05 MEIO PICTURE IS X(10).
05 ULTIMO PICTURE IS X(20).
02 TAXA-HORARIA PICTURE IS 99V99. Números com 4 dígitos e vírgula

Números de nível
Definição de Registros
▪ Registros também são chamadas de Estruturas
▪ Registros apareceram primeiro em COBOL e PL/I

REGISTRO_EMPREGADO :
record
NOME_EMPREGADO :
record
PRIMEIRO : STRING (1..20);
MEIO : STRING(1..10);
ULTIMO : STRING(1..20);
end record;
TAXA_HORARIA : FLOAT;
end record;
Definição de Registros
▪ Registros também são chamadas de Estruturas
▪ Registros apareceram primeiro em COBOL e PL/I
class Empregado{
struct Empregado{ private:
struct Nome{ Nome nomeEmpregado;
char primeiro[20]; protected:
char meio[10]; float taxaHoraria;
char ultimo[20]; public:
} nomeEmpregado; Empregado();
float taxaHoraria; void setNome(char* nome);
}; void setTaxaHoraria(float taxa);
};

● Classes
Classesnão
nãosão
sãoapenas
apenas“estruturas
“estruturascom
comfunções”
funções”

● Podem limitar acesso a componentes
Podem limitar acesso a componentes

● Implementam
Implementamherança
herançaeepoliomorfismo
poliomorfismo

● Etc...
Etc...
Referência a Campos do Registro
▪ Em geral
– Notação de ponto (.)
– Estruturas mais externas às mais internas (esquerda → direita)

struct Empregado{
int id;
struct Nome{ struct Empregado A;
char primeiro[20];
char meio[10]; printf("Identidade: ");
char ultimo[20]; scanf("%d",&A.id);
} nomeEmpregado; printf("Primeiro nome: ");
float taxaHoraria;
}; scanf("%s",A.nomeEmpregado.primeiro);
Referência a Campos do Registro
▪ Em geral
– Notação de ponto (.)
– Estruturas mais externas às mais internas (esquerda → direita)

AA linguagem
linguagem CC possui
possui um
um operador
operador seta
seta (->)
(->)
quando
quando oo campo
campo está
está sendo
sendo referenciado
referenciado através
através
de
deum
umponteiro
ponteiropra
prauma
umaestrutura.
estrutura.
struct Empregado{
int id;
struct Nome{ struct Empregado A;
char primeiro[20]; struct Empregado *B = &A;
char meio[10];
char ultimo[20]; printf("Identidade: ");
} nomeEmpregado; scanf("%d",&B->id);
float taxaHoraria;
}; printf("Primeiro nome: ");
scanf("%s",B->nomeEmpregado.primeiro);
Referência a Campos do Registro
▪ Em geral
– Notação de ponto (.)
– Estruturas mais externas às mais internas (esquerda → direita)

type aniversario
character nome*10
character mes*10
integer*1 dia
end type aniversario
type (aniversario) :: carlos
carlos = aniversario('Carlos','Fevereiro',29)
write(*,*) carlos%nome, carlos%mes Fortran
Fortranusa
usaoooperador
operador%
%
Referência a Campos do Registro
▪ Em geral
– Notação de ponto (.)
– Estruturas mais externas às mais internas (esquerda → direita)

01 REGISTRO-EMPREGADO. COBOL
COBOLusa usaum
umoperador
operadorchamado
chamadoOFOF
02 NOME-EMPREGADO. para
para acessar
acessar estruturas,
estruturas, das
das mais
mais
05 PRIMEIRO PICTURE IS X(20). internas
internasàs
àsmais
maisexternas.
externas.
05 MEIO PICTURE IS X(10).
05 ULTIMO PICTURE IS X(20).
02 TAXA-HORARIA PICTURE IS 99V99.

MOVE “Carlos” TO PRIMEIRO OF NOME-EMPREGADO OF REGISTRO EMPREGADO


Referência a Campos do Registro
▪ Em geral
– Notação de ponto (.)
– Estruturas mais externas às mais internas (esquerda → direita)
type begin
nomeEmpregado = record with A do
primeiro : string; begin
meio : string; id := 1;
ultimo : string; nome.primeiro := 'Rafael';
end; end;

type writeln(A.nome.primeiro);
empregado = record end.
id : integer;
nome : nomeEmpregado;
end; Pascal
Pascalpermite
permitecriar
criarum
umbloco
blocoqualificando
qualificando
referência
referência implícita
implícita aos
aos campos
campos de
de uma
uma
var estrutura.
estrutura.
A : empregado;
Referência a Campos do Registro
▪ Em geral
– Notação de ponto (.)
– Estruturas mais externas às mais internas (esquerda → direita)

a = {} Cria uma tabela


a["id"] = 42 Cria um campo
a["nome"] = {} Cria uma outra tabela como campo
a["nome"]["primeiro"] = "Carlos"
a["nome"]["meio"] = "Nascimento" Cria campos nessa tabela interna
a["nome"]["ultimo"] = "Batista"
print(a.id)
print(a.nome.primeiro)
Referência a Campos do Registro
▪ Em geral
– Notação de ponto (.)
– Estruturas mais externas às mais internas (esquerda → direita)

a = {} Cria uma tabela


a["id"] = 42 Cria um campo
a["nome"] = {} Cria uma outra tabela como campo
a["nome"]["primeiro"] = "Carlos"
a["nome"]["meio"] = "Nascimento" Cria campos nessa tabela interna
a["nome"]["ultimo"] = "Batista"
Duas
Duasformas
formasde
deacessar
acessaros
oscampos
campos
print(a.id)
print(a.nome.primeiro)
Estruturas
Estruturas==Matrizes
Matrizes==Tabelas
Tabelas
Operações sobre Registros
▪ Atribuição
– Geralmente as duas estruturas devem ser iguais
– C realiza a cópia de memória entre registros

struct Nome{ A B
char primeiro[20]; Primeiro: “Maria” Primeiro: “Maria”
char meio[10]; Meio: “Antonieta” Meio: “Antonieta”
char ultimo[20];
} nomeEmpregado; Ultimo: “Alcantara” Ultimo: “Alcantara”

struct Nome A, B;

B = A;
Operações sobre Registros
▪ Atribuição
– Geralmente as duas estruturas devem ser iguais
– C realiza a cópia de memória entre registros

struct Nome{ A B
char *primeiro; Primeiro: Primeiro:
char *meio; Meio: Meio:
char *ultimo;
} nomeEmpregado; Ultimo: Ultimo:

struct Nome A, B;

B = A; “Maria” “Antonieta” “Alcantara”
Operações sobre Registros
▪ Atribuição
– Geralmente as duas estruturas devem ser iguais
– C realiza a cópia de memória entre registros

struct Nome{ A B
char *primeiro; Primeiro: Primeiro:
char *meio; Meio: Meio:
char *ultimo;
} nomeEmpregado; Ultimo: Ultimo:

struct Nome A, B;

B = A; “Maria” “Antonieta” “Alcantara”
Operações sobre Registros
▪ Atribuição
– Geralmente as duas estruturas devem ser iguais
– COBOL pode copiar apenas os campos correspondentes, mesmo
entre estruturas diferentes

01 INPUT-RECORD. 01 OUTPUT-RECORD.
02 NAME. 02 NAME.
05 FIRST PICTURE IS X(20). 05 LAST PICTURE IS X(20).
05 LAST PICTURE IS X(20). 05 FIRST PICTURE IS X(20).
02 HOURLY-RATE PICTURE IS 99V99. 02 EMPLOYEE-NUMBER PICTURE IS 99.
02 EMPLOYEE-NUMBER PICTURE IS 99. 02 NET-PAY PICTURE IS 99V99.

MOVE CORREPONDING INPUT-RECORD TO OUTPUT-RECORD.


Implementação de Registros
▪ Campos são armazenados em localizações adjacentes
▪ Tamanhos dos campos pode variar
▪ São atribuídos deslocamentos relativos ao início para acesso a cada
campo

campo1 nome tipo deslocamento


campo2 nome tipo deslocamento
... ...
campoN nome tipo deslocamento
Implementação de Registros
▪ Campos são armazenados em localizações adjacentes
▪ Tamanhos dos campos pode variar
▪ São atribuídos deslocamentos relativos ao início para acesso a cada
campo
struct Empregado{ void main(){
int id; struct Empregado A;
struct Nome{ ...
char primeiro[20]; printEndereco("A",&A);
char meio[10]; printEndereco("A.id",&A.id);
char ultimo[20]; printEndereco("A.nomeEmpregado",&A.nomeEmpregado);
} nomeEmpregado; printEndereco("A.taxaHoraria",&A.taxaHoraria);
float taxaHoraria; }
};
loc(A) = 0x7fff022d4540
void printEndereco(char *var, void *pointer){
printf("loc(%s) = %p\n",var,pointer); loc(A.id) = 0x7fff022d4540
} loc(A.nomeEmpregado) = 0x7fff022d4544
loc(A.taxaHoraria) = 0x7fff022d4578
Implementação de Registros
▪ Campos são armazenados em localizações adjacentes
▪ Tamanhos dos campos pode variar
▪ São atribuídos deslocamentos relativos ao início para acesso a cada
campo
struct Empregado{ void main(){
int id; //deslocamento = 0 struct Empregado A;
struct Nome{ ...
char primeiro[20]; printEndereco("A",&A);
char meio[10]; printEndereco("A.id",&A.id);
char ultimo[20]; printEndereco("A.nomeEmpregado",&A.nomeEmpregado);
} nomeEmpregado; //deslocamento = 4 printEndereco("A.taxaHoraria",&A.taxaHoraria);
float taxaHoraria; //deslocamento = 56 }
};
loc(A) = 0x7fff022d4540
void printEndereco(char *var, void *pointer){
printf("loc(%s) = %p\n",var,pointer); loc(A.id) = 0x7fff022d4540
} loc(A.nomeEmpregado) = 0x7fff022d4544
loc(A.taxaHoraria) = 0x7fff022d4578