Você está na página 1de 15

Escola Nacional de Ciências Estatísticas

Curso de Graduação em Estatística


(Bacharelado)

Computação

Unidade X: Registros

Professor: Eduardo Corrêa


Data: 05/11/2007

1
Escola Nacional de Ciências Estatísticas

Introdução

Esta unidade é dedicada ao estudo da estrutura de dados denominada registro. Um


registro - assim como uma matriz e um vetor - representa um recurso da linguagem Pascal
que permite com que você possa armazenar um conjunto de dados em uma única variável.
Através do uso de registros, combinado com a utilização de vetores, torna-se possível
construir tabelas em memória (ex: uma tabela contendo o sexo, idade e renda de pessoas
entrevistadas por uma pesquisa) para a realização de análise estatística.

X.1 O que é um Registro?

Um registro (também chamado de variável composta heterogênea ou record)


consiste numa coleção de campos (ou atributos ou propriedades), onde cada campo pode
ser de um tipo de dado diferente. Observe o exemplo a seguir:
Exemplo X.1: - Registro “TP_CLIENTE”: armazena o nome, o endereço, a idade e o sexo dos
clientes de uma loja que vende produtos através da Internet (obs: o prefixo “TP” refere-se à palavra
“tipo”, conforme será ilustrado na próxima seção. Consiste apenas numa maneira padronizada para
nomear “tipos registro”).

TP_CLIENTE
NOME
ENDEREÇO
IDADE
SEXO

O conceito de registro visa facilitar o agrupamento de variáveis que não são do


mesmo tipo, mas que possuem alguma relação. Exemplos: todas as propriedades de um
cliente, todas os atributos de um produto, todas os atributos de uma pessoa entrevistada em
uma pesquisa, etc. Enfim, utilizamos um registro sempre que precisamos armazenar
diferentes atributos que estejam associados a um mesmo objeto de estudo.

X.2 Especificação de Registros

Para que seja possível utilizar um registro dentro de um programa Pascal, é preciso,
primeiro executar uma ação denominada especificação do registro. Esse processo consiste
simplesmente em dizer ao Pascal quais os campos que farão parte do registro. A
especificação de um registro é realizada com o uso de duas palavras-chave: TYPE e
RECORD. Somente depois da especificação do registro, torna-se possível declarar
variáveis como sendo do tipo especificado. Observe os exemplos a seguir

2
Escola Nacional de Ciências Estatísticas

Exemplo X.2: - especificação do “tipo registro” TP_CLIENTE e de uma variável chamada


CLIENTE, com este tipo.

{especificação do registro TP_CLIENTE}


type TP_CLIENTE = record
NOME: string;
ENDERECO: string;
IDADE: integer;
SEXO: char;
END;

{declaração da variável CLIENTE do tipo TP_CLIENTE}


var CLIENTE: TP_CLIENTE;

A sintaxe básica para a especificação de um registro e para a declaração de uma


variável com o tipo especificado é apresentada no quadro abaixo.

{especificação do registro}
type NOME_DO_REGISTRO = Record
campo1: tipo_do_campo1;
campo2: tipo_do_campo2;
...
campon: tipo_do_campon;
end;

{declaração de uma variável do tipo record}


var NOME_DA_VARIAVEL: NOME_DO_REGISTRO;

Para melhor compreender o conceito apresentado, observe os exemplos a seguir.

Exemplo X.3 - Especificação do tipo TP_LIVRO (contém os atributos de um livro).

type TP_LIVRO = Record


ISBN: string[10];
TITULO: string;
ASSUNTO: string;
QTD_PAGINAS: integer;
PRECO: real;
EDITORA: string[30];
end;

var livro: TP_LIVRO; {a variável “livro” é do tipo TP_LIVRO}

3
Escola Nacional de Ciências Estatísticas

Exemplo X.4 - Especificação do tipo TP_MUNICIPIO (contém os atributos de um município).

type TP_MUNICIPIO = Record


NOME: string[80];
UF: string[2];
QTD_HABITANTES: integer;
end;

var MUN, CID: TP_MUNICIPIO; {as variáveis “MUN” e “CID” são


do tipo TP_MUNICIPIO}

Exemplo X.5 - Declaração do tipo TP_PESSOA_CENSO (contém os atributos de uma pessoa


entrevistada pelo censo).

type TP_PESSOA_CENSO = Record


SEXO: char;
COD_ESCOLARIDADE: string[2]; //código da escolaridade
RENDA_ANUAL: real;
MES_NASC: integer; //mês de nascimento
ANO_NASC: integer; //ano de nascimento
UF_NASC: string[2]; //UF onde nasceu
QTD_FILHOS: integer; //quantidade de filhos
ESTADO_CIVIL: char; //’C’ – Casado, ‘S’ – Solteiro, ...
... (na prática existiriam centenas de atributos)
end;

var P: TP_PESSOA;

X.3 Operações com Registros

X.3.1 Acesso aos Dados de uma Matriz

Para acessar um campo de uma variável do tipo registro, é preciso especificar o


nome da variável, seguido de um ponto e depois o nome do campo. Veja os exemplos a
seguir.

Exemplo X.6 - acesso aos campos da variável CLIENTE (que é do tipo TP_CLIENTE).

CLIENTE.NOME := 'JOÃO DA SILVA';

CLIENTE.ENDERECO := 'RUA XYZ, 1000, RIO DE JANEIRO, RJ, CEP: 12345-678';

CLIENTE.IDADE := 38;

CLIENTE.SEXO := 'M';

4
Escola Nacional de Ciências Estatísticas

Exemplo X.6 - testando o valor de um campo.

if (CLIENTE.SEXO = 'M' ) AND (CLIENTE.IDADE > 18) then


writeln('ADULTO DO SEXO MASCULINO');

X.3.2 Operações com registros (o que pode e o que não pode...)

O programa a seguir, apresenta exemplos de algumas operações possíveis e algumas


operações que não podem ser realizadas com registros. As explicações são apresentadas nos
comentários dentro do próprio programa.
program Testa_Registro;

{especificação do registro TP_PRODUTO}


type TP_PRODUTO = record
CODIGO: integer;
NOME: string;
end;

var PROD1, PROD2, PROD3: TP_PRODUTO;

begin
{inicializa PROD1 e PROD2}
PROD1.CODIGO := 1;
PROD1.NOME := 'ERVILHAS EM CONSERVA';

PROD2.CODIGO := 2;
PROD2.NOME := 'MILHO VERDE EM CONSERVA';

PROD3 := PROD1; {CERTO: é possível atribuir todo o conteúdo de um


registro a outro registro, contanto que ambos
possuam a mesma definição}

if (PROD1 = PROD3) then


writeln('IGUAIS'); {ERRADO: para comparar dois registros é
preciso testar campo por campo }

if (PROD1.CODIGO = PROD3.CODIGO) AND


(PROD1.NOME = PROD3.NOME) then
writeln('IGUAIS'); {CERTO: comparação campo a campo }

writeln(PROD2); {ERRADO: não é possível imprimir todos os


campos de um registro de uma só vez}

writeln(PROD2.CODIGO, ' - ', PROD2.NOME); {CERTO: campos são


impressos um por vez}

readln;
end.

5
Escola Nacional de Ciências Estatísticas

X.4 Vetor de Registros

Na maioria das situações práticas, os programas utilizam registros com o propósito


de organizar os dados em memória na forma de tabelas. A criação de uma tabela em
memória é um processo bastante simples: basta, primeiro, especificar um registro e depois
declarar um vetor com o tipo do registro especificado. Observe os exemplos a seguir:

Exemplo X.7 - criação de uma tabela capaz de armazenar o NOME, CPF, SEXO e SALÁRIO de
10 funcionários de uma empresa.

type TP_FUNC = record


NOME: string;
CPF: string[11];
SALARIO: real;
SEXO: char;
END;

var VET: array[1..10] of TP_FUNC;

NOME CPF SALARIO SEXO


1
2
3
4
5
6
7
8
9
10

Um vetor de registros é algo muito similar a uma matriz. A diferença está apenas no
fato de que em uma matriz todas as colunas precisam ser do mesmo tipo de dado (a matriz é
toda de inteiros ou toda de real, por exemplo). De maneira oposta, em um vetor de registros
cada coluna pode ter um tipo diferente. No exemplo acima, NOME é do tipo string, CPF é
do tipo string[11], SALARIO do tipo real e SEXO do tipo char.
Para armazenar um dado numa determinada célula da tabela criada com a
especificação de um vetor de registros, basta fazer como o indicado no exemplo a seguir:

VET[5].NOME = ‘Fulano de Tal‘; {armazena um valor no campo NOME da linha 5


da tabela}

VET[9].SALARIO = 2510.95; {armazena um valor no campo SALARIO da linha 9


da tabela}

6
Escola Nacional de Ciências Estatísticas

X.5 Lista de Exercícios sobre Registros


Exemplo X.8 - Escrever um programa que especifique o registro TP_FUNCIONARIO cuja
representação gráfica é dada abaixo. Em seguida, declare duas variáveis FUNC1 e FUNC2
do tipo TP_FUNCIONARIO.

NOME LITERAL
SALARIO_HORA NUMÉRICO
HORAS_NORMAIS NUMÉRICO
HORAS_EXTRAS NUMÉRICO
program Ex1;
{especificação do registro TP_FUNCIONARIO}
type TP_FUNCIONARIO = record
NOME: string;
SAL_HORA: real;
HOR_NORM: integer;
HOR_EXTRA: integer;
end;

var FUNC1, FUNC2: TP_FUNCIONARIO;

begin
{esse programa não faz nada…}
readln;
end.

Exemplo X.9 - Altere o Exercício 1. Faça a variável FUNC1 ser preenchida via teclado.

program Ex2;
{especificação do registro TP_FUNCIONARIO}
type TP_FUNCIONARIO = record
NOME: string;
SAL_HORA: real;
HOR_NORM: integer;
HOR_EXTRA: integer;
end;

var FUNC1, FUNC2: TP_FUNCIONARIO;

begin
{esse programa agora faz algo}
write('NOME DO FUNCIONARIO: '); readln(FUNC1.NOME);
write('SALARIO POR HORA: '); readln(FUNC1.SAL_HORA);
write('TOTAL DE HORAS NORMAIS TRABALHADAS: '); readln(FUNC1.HOR_NORM);
write('TOTAL DE HORAS EXTRAS TRABALHADAS: '); readln(FUNC1.HOR_EXTRA);

readln;
end.

7
Escola Nacional de Ciências Estatísticas

Exemplo X.10 - Escrever um programa que receba, via teclado, a matrícula, o nome e a
média dos 5 alunos de uma turma de Programação Java. Os dados dos alunos devem ser
armazenados numa tabela em memória. Após a tabela ser carregada, imprimir os dados dos
alunos na tela.

program Ex3;
{especificação do registro TP_ALUNO}
type TP_ALUNO = record
MATRICULA: string[12];
NOME: string;
MEDIA: real;
end;

var VET_ALUNOS: array[1..5] of TP_ALUNO; {vetor de elementos do tipo


TP_ALUNO}
var I: integer;

begin
{carrega os dados dos alunos}
for I:=1 to 5 do
begin
write('MATRICULA ',I,': '); readln(VET_ALUNOS[I].MATRICULA);
write('NOME ',I,': '); readln(VET_ALUNOS[I].NOME);
write('MEDIA ',I,': '); readln(VET_ALUNOS[I].MEDIA);
writeln;
end;

{imprime os dados dos alunos}


writeln('* * RELACAO DE ALUNOS * * ');
for I:=1 to 5 do
begin
write(VET_ALUNOS[I].MATRICULA);
write(' - ', VET_ALUNOS[I].NOME);
write(' - MEDIA = ', VET_ALUNOS[I].MEDIA:3:2);
writeln;
end;

readln;
end.

8
Escola Nacional de Ciências Estatísticas

No programa da página anterior, inicialmente foi especificado o tipo TP_ALUNO,


que representa um registro capaz de armazenar a matrícula, o nome e a média de um aluno.
Em seguida declaramos um vetor de 5 posições do tipo TP_ALUNO, que recebeu o
seguinte nome: VET_ALUNOS.

Dentro do programa é importante observar a sintaxe utilizada para permitir o acesso


aos campos do registro dentro do vetor. Veja que para acessar o nome do aluno que está no
índice I do vetor VET_ALUNOS, utiliza-se a sintaxe: VET_ALUNOS[I].NOME. Da
mesma forma, utilizamos VET_ALUNOS[I].MATRICULA e VET_ALUNOS[I].MEDIA,
para acessar a matrícula e a média.

Exemplo X.11 - Escrever um programa que:

(a) Receba os seguintes dados de um funcionário via teclado: nome, valor do salário-
hora, total de horas normais trabalhadas (horas trabalhadas de segunda a sexta),
total de horas-extras trabalhadas (horas trabalhadas no sábado e domingo). Os
dados do funcionário devem ser armazenados num registro do tipo
TP_FUNCIONARIO, o mesmo especificado no Exercício 1.

(b) Em seguida calcule e imprima o salário que o funcionário receberá no mês. Para
calcular o salário use a seguinte fórmula:

SALÁRIO MENSAL = (HORAS NORMAIS x SALARIO HORA) +


(HORAS EXTRAS x 1.5 x SALARIO HORA)

OBS: o programa deve ser mantido em execução enquanto o usuário desejar.

9
Escola Nacional de Ciências Estatísticas

program Ex4;

type TP_FUNCIONARIO = record


NOME: string;
SAL_HORA: real;
HOR_NORM: integer;
HOR_EXTRA: integer;
end;

var F: TP_FUNCIONARIO;
SAL_MEN: real; {salário}
OPCAO: char;

begin
repeat
{lê os dados do funcionario}
write('NOME DO FUNCIONARIO: '); readln(F.NOME);
write('SALARIO POR HORA: '); readln(F.SAL_HORA);
write('TOTAL DE HORAS NORMAIS TRABALHADAS: '); readln(F.HOR_NORM);
write('TOTAL DE HORAS EXTRAS TRABALHADAS: '); readln(F.HOR_EXTRA);

{calcula e imprime o seu salario}


SAL_MEN:=(F.SAL_HORA * F.HOR_NORM) + (F.SAL_HORA * F.HOR_EXTRA * 1.5);

writeln('O salario a ser pago para ', F.NOME, ' eh: ', SAL_MEN:6:2);

{verifica se usuário deseja novo processamento}


writeln;
writeln('Deseja realizar novo calculo (S/N)?');
readln(OPCAO);

until (OPCAO = 'n') or (OPCAO = 'N');


end.

10
Escola Nacional de Ciências Estatísticas

Exemplo X.12 - Foi realizada uma pesquisa sobre características físicas de 50 habitantes de
uma certa cidade localizada na Serra Gaúcha. De cada habitante foram coletados os
seguintes dados: sexo, altura, idade e cor dos olhos (A = Azuis, V = Verdes, C = Castanhos,
N = Negros).

Faça um programa que leia esses dados e armazene-os em um vetor de registros. Em


seguida, determine:

(a) A quantidade de pessoas do sexo feminino cuja idade esteja entre 20 e 30 anos;

(b) A quantidade de pessoas com olhos azuis ou verdes e altura igual ou superior a 170cm.

program Ex5;
{especificação do registro TP_PESSOA}
type TP_PESSOA = record
SEXO: char; {F = Feminino, M = Masculino}
ALTURA: integer; {em centimetros}
IDADE: integer;
OLHOS: char; {A = Azuis, V = Verdes, C = Castanhos, N = Negros}
end;

var VET: array[1..50] of TP_PESSOA; {vetor de pessoas}


I: integer;

QTD_F_20_30: integer; {variável usada para responder a questão 5.1:


quantidade de pessoas do sexo feminino com
idade entre 20 e 30 anos}

QTD_AV_170: integer; {variável usada para responder a questão 5.2:


quantidade de pessoas com mais de 1.70m e olhos
azuis ou verdes}

begin

{PASSO 1: CARREGA OS DADOS DAS PESSOAS VIA TECLADO


Basta usar um FOR de 1 a 50 e ir armazenando em cada posição
do vetor VET}

writeln('ENTRE COM OS DADOS DOS HABITANTES: ');


for I:=1 to 50 do
begin
writeln; writeln('Habitante ', I);
write('SEXO (digite o codigo em maiusculo): ');
readln(VET[I].SEXO);
write('ALTURA (em cm): ');
readln(VET[I].ALTURA);
write('IDADE: ');
readln(VET[I].IDADE);
write('COR DOS OLHOS (digite o codigo em maiusculo): ');
readln(VET[I].OLHOS);
end;

11
Escola Nacional de Ciências Estatísticas
{PASSO 2: LAÇO QUE DETERMINA OS ITENS (a) e (b) COM O AUXÍLIO
DE DIVERSOS COMANDOS "IF" E DAS VARIÁVEIS AUXILIARES}

QTD_F_20_30:=0;
QTD_AV_170:=0;

for I:=1 to 50 do {esse for percorre todo o vetor}


begin

{com o IF a seguir eu resolvo a questão (a): quantidade de


mulheres com idade entre 20 e 30 anos}

if (VET[I].SEXO = 'F') and


((VET[I].IDADE >= 20) and (VET[I].IDADE <= 30)) then
QTD_F_20_30 := QTD_F_20_30 + 1;

{com o IF a seguir eu resolvo a questão (b): quantidade de


pessoas com olhos verdes ou azuis e a altura igual ou superior a
170cm}
if (VET[I].ALTURA >= 170) and
((VET[I].OLHOS = 'V') or (VET[I].OLHOS = 'A')) then
QTD_AV_170:= QTD_AV_170 + 1;
end;

{PASSO 3: agora que contabilizei tudo que precisava,


posso imprimir os resultados finais}

writeln; writeln('RESULTADOS: ');

{IMPRIME O ITEM (a)


- A quantidade de mulheres com idade entre 20 e 30 anos}

writeln('QUANT. DE MULHERES ENTRE 20 E 30 ANOS: ', QTD_F_20_30);

{ IMPRIME O ITEM (b)


- quantidade de pessoas com olhos azuis ou verdes e altura
igual ou superior a 170cm}

writeln('QUANT. DE PESSOAS ALTAS DE OLHOS CLAROS: ', QTD_AV_170);

readln;
end.

Neste programa, no primeiro passo realizamos a leitura dos dados via teclado e no
segundo passo é feito um loop para obter os resultados das questões (a) e (b). Embora esse
cálculo pudesse ser feito logo na entrada de dados, preferimos separar em duas fases
distintas para o exemplo ficar mais didático.

12
Escola Nacional de Ciências Estatísticas

Exercícios Propostos

(1) Especifique o registro capaz de armazenar as seguintes propriedades de uma pessoa:


NOME, ANO DE NASCIMENTO, RENDA ANUAL e QUANTIDADE DE FILHOS.

(2) Especifique o registro capaz de armazenar o código de inscrição e o total de pontos


obtidos pelos candidatos ao vestibular para o Bacharelado em Estatística de uma
determinada Universidade.

(3) Escreva o trecho de programa Pascal capaz de armazenar uma tabela com o NOME,
IDADE, ALTURA e PESO de 14 jogadoras que integram uma equipe de vôlei feminino.

(4) Escreva o trecho de programa Pascal capaz de armazenar uma tabela com os dados de
200 filmes que farão parte da programação de um canal de TV a Cabo no mês de
Novembro. Na hora de especificar o registro, pense no que seriam os principais atributos de
um filme exibido pela TV a Cabo (exemplos: título do filme, data e hora da exibição, e
outros atributos a sua escolha).

(5) A Pesquisa Industrial Anual (PIA) é uma pesquisa do IBGE tem por objetivo identifi-
car as características estruturais básicas do segmento empresarial da atividade industrial no
Brasil1. A pesquisa é realizada da seguinte forma: um pesquisador do IBGE visita cada em-
presa selecionada para fazer parte da amostra da pesquisa e realiza uma entrevista com os
responsáveis de cada empresa, com o auxílio de um questionário. Dentre as principais va-
riáveis pesquisadas pela PIA, encontram-se: (i) CNPJ, (ii) endereço completo, (iii) valor
gasto com o pagamento salários no ano da pesquisa, (iv) receita líquida de vendas no ano
da pesquisa, (v) total de pessoas ocupadas na empresa (funcionários) em 31/12 do ano da
pesquisa e (vi) descrição da atividade da empresa (ex: “fabricação de sapatos”, “fabricação
de comida congelada”).

De posse destas informações, crie o trecho de programa Pascal capaz de armazenar em me-
mória uma tabela com os dados de 45.000 empresas entrevistadas pela PIA.

(6) Altere o Exercício 2. Implemente um programa com as seguintes funcionalidades:

(a) ler os dados dos filmes via teclado.


(b) Após carregar os dados dos filmes, implementar um relatório que apresente todos os
filmes que serão exibidos em um determinado dia, a ser escolhido pelo usuário.

1
http://www.ibge.gov.br/home/estatistica/economia/industria/pia/empresas/notatecnica2005.pdf

13
Escola Nacional de Ciências Estatísticas

(7) Faça um programa que carregue a matrícula e as notas na VAE 1 e VAE 2 de 30 alunos
de um curso de computação. Use um vetor de registros para armazenar os dados. Em
seguida, imprima:

• As matrículas dos alunos aprovados (média >= 7).


• As matrículas dos que farão a VAE3 (média entre 3 e 7).
• As matrículas dos alunos reprovados (média < 3).
• A matrícula do aluno com a maior nota e a sua nota.
• A matrícula do aluno com menor nota e a sua nota.

(8) Foi feita uma pesquisa de audiência de canais de TV através de dados coletados em
1000 residências. Para cada residência visitada, foi anotado o número do canal onde a TV
estava sintonizada (existem apenas sete canais possíveis: 2, 4, 6, 7, 9, 11 e 13) e a
quantidade de pessoas que estavam assistindo ao canal em questão (para simplificar,
considere que existia apenas um televisor em cada residência). Elabore um programa que:

• Leia os dados desta pesquisa a partir do teclado (ou seja, leia pares de valores
CANAL e QUANTIDADE DE PESSOAS) e armazene num vetor de registros.

• Ao final da leitura o programa deve imprimir dados sobre a audiência dos canais,
ou seja, o total de pessoas que assistiu a cada um dos 7 canais.

(9) Foi realizada uma pesquisa entre 20 habitantes de uma cidade. De cada habitante foram
coletados os dados: idade, sexo, renda familiar e número de filhos. Faça um programa que
leia esses dados, armazenando em um vetor de registros. Em seguida calcule e mostre:

• A média de salário entre os habitantes.


• O número de mulheres com mais de dois filhos.
• O percentual de homens com menos de 30 anos e que possuem pelo menos 1
filho.

(10) Agora que o campeonato de futebol da Croácia chegou ao fim, será preciso escrever
um programa em Pascal para divulgar as estatísticas desta fantástica competição. O
campeonato é disputado por 12 clubes em 22 rodadas (cada rodada é composta por 6
jogos). Levando em conta esta informação, escreva um programa que:

 Receba, via teclado, os dados de todos os jogos do campeonato e armazene num


vetor de registros com o tamanho adequado. O registro (Record) a ser
especificado precisa conter as seguintes propriedades de um jogo: Nome do Time
1; Gols Marcados pelo Time 1; Nome do Time 2; Gols Marcados pelo Time 2;
Rodada em que o Jogo foi Disputado.

14
Escola Nacional de Ciências Estatísticas

 A seguir, calcule e imprima as seguintes estatísticas:

 O Total e a Média de gols marcados no campeonato;

 A média de gols da última (22a) rodada;

 O percentual de vitórias no campo do adversário (ou seja, dentre todas as


partidas, a proporção onde ocorreu vitória do Time 2).

 O total de vitórias conquistadas pelo time chamado “DINAMO ZAGREB” em


todo o campeonato.

A figura abaixo ilustra um exemplo do formato do vetor de registros. Tem-se, por


exemplo, que os dados mostrados na primeira linha indicam que o Dínamo Zagreb ganhou
do Zapresic por 3 gols a zero e que o jogo ocorreu na primeira rodada. De maneira análoga,
os dados da última linha indicam que o Rijeka foi derrotado pelo Dínamo Zagreb pelo
placar de 5 a 1 na 22a rodada.

TIME 1 GOLS TIME 2 GOLS RODADA


DO DO
TIME 1 TIME 2
DÍNAMO ZAGREB 3 ZAPRESIC 0 1
KAMEN INGRAD 2 MEMIDURJE 2 1
... ... ... ... ...
CIBALIA 1 SLAVEN 0 15
... ... ... ... ...
RIJEKA 1 DÍNAMO ZAGREB 5 22

15

Você também pode gostar