Buscar

2 REGISTROS

Prévia do material em texto

PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
ALGORITMOS E ESTRUTURA DE DADOS
REGISTROS
UNIDADE
2
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
2 REGISTROS
2.1 Conceitos iniciais
2.2 Usando vetor em registros
2.3 Registros na linguagem C/C++
ROTEIRO
PROFESSOR: EDILSON LIMA
*/35
ROTEIRO
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
ROTEIRO
PROFESSOR: EDILSON LIMA
*/35
2 REGISTROS
Um conjunto homogêneo de dados é composto por variáveis do mesmo tipo primitivo (texto, inteiro, real, boolean); 
Um exemplo seria um conjunto de informações que caracterizam um aluno: 
		nome : texto;
		cpf : inteiro; 
		rg : inteiro;
		data_de_nascimento : caractere;
		coeficiente_de_rendimento : real;
		...
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Em uma análise superficial um estudante poderia pensar que uma solução para a questão seria criar variáveis:
	algoritmo “exemplo”	
			nome : texto;
			cpf : inteiro; 
			rg : inteiro;
			data_de_nascimento : texto;
			coeficiente_de_rendimento : real;
			...
Uma forma de guardarmos varias informações de um alunos seria em REGISTROS que poderíamos dizer que são uma variável especial que contém diversas outras variáveis normalmente de tipos diferentes.
2 REGISTROS
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Também chamada de Estrutura de Dados Heterogêneas ou Registros é uma estrutura composta por um conjunto de variáveis de tipos diferentes, primitivos e/ou construídos, logicamente relacionados que podem ser referenciados por um mesmo nome (identificador do tipo registro) ou individualmente. Este tipo de estrutura é utilizado para relacionar dados pertencentes a um mesmo objeto.
Diferentemente das estruturas de dados homogêneas (vetores e matrizes) que só podem guardar dados de um único tipo (inteiro, real, texto, etc.), os registros permitem guardar dados de tipos variados.
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Podemos definir que registros são conjuntos de dados logicamente relacionados, que comportam tipos diferentes: inteiro, real, texto, lógico. O conceito de registro visa facilitar o agrupamento de variáveis que não são do mesmo tipo, mas que guardam estreita relação lógica. Conforme demostramos no exemplo com os dados do aluno. 
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Sintaxe da declaração em pseudo-código:
tipo IDENTIFICADOR = registro
 campo1 : tipo1 :;
 campo2 : tipo2 :;
 ...
 campo n : tipo n;
fim registro;
 
var lista de variáveis : IDENTIFICADOR; 
 
Onde:
IDENTIFICADOR : representa o nome associado ao tipo registro construído;
tipo1, tipo2, tipo n : representam qualquer um dos tipos básicos ou tipo 
anteriormente definido;
campo1, campo2, campo n : representam nomes associados a cada campo do registro;
lista de variáveis : lista de variáveis (separadas por vírgula) que terão o mesmo tipo denotado por IDENTIFICADOR.
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Exemplo: 
 
tipo ALUNO = registro
 nome : texto;
 CPF : inteiro;
			 RG : texto;
 Data_de_nascimento : texto;
 coeficiente_de_rendimento: real;
fim registro;
 
var cadastro_aluno : ALUNO;
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
UTILIZANDO REGISTROS
 
Atribuição
Sintaxe:
<nome_reg>.<nome_campo> = EXPRESSÃO;
 
Leitura
Sintaxe:
leia(<nome_do_registro>.<nome_do_campo>);
 
Escrita
Sintaxe:
escreva (<nome_do_registro>.<nome_do_campo>);
 
Em determinados momentos podemos precisar de todas as informações contidas no registro ou de apenas algum campo do registro (como o nome do aluno). Quando acessamos o registro genericamente, estamos referenciando obrigatoriamente todos os campos por ele envolvidos.
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Exemplo: 
	leia (cadastro_aluno);
	escreva (cadastro_aluno);
 
Para utilizar um campo específico do registro, devemos diferenciar esse campo. Para tal utilizamos o caractere “.” (ponto) para estabelecer a separação entre o nome do registro e o nome do campo. 
Exemplo: 
	leia (cadastro_aluno.nome);
	escreva (cadastro_aluno.CPF);
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Exemplo: Utilizando o registro cadastro_aluno:
início
 {definições anteriores}
 .
 .
 .
 leia (cadastro_aluno.nome);
 leia (cadastro_aluno.CPF);
 leia (cadastro_aluno.RG);
 .
 .
 .
 escreva (cadastro_aluno.nome);
 escreva (cadastro_aluno.CPF);
 escreva (cadastro_aluno.RG);
 . 
 .
 .
fim.
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Exemplo 1:
 
  
algoritmo exemplo1
 
tipo FUNCIONARIO= registro
 var NOME[15]: texto; 
 var FONE[10]: texto;
 var SALARIO: real;
 var IDADE: inteiro;
fim registro;
 
var F1, F2, F3: FUNCIONARIO; 	//3 registros do tipo funcionário
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
procedimento CADASTRAR();
procedimento MOSTRAR();
início
 var OP: inteiro;
 OP = 1;
 enquanto (OP<>3) faça
 escreva (“1 - Cadastrar”);
 escreva (“2 - Consulta”);
 escreva (“3 - Sair”);
 leia(OP);
  escolha (OP)
			caso 1: 
				CADASTRAR(); 
 		caso 2:
				MOSTRAR(); 
			caso 3:
				escreva (“FIM!”); 
			caso contrário:
				escreva (“Op. inválida”); 
	 	fim caso;
 fim enquanto;
fim; //programa principal
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
procedimento CADASTRAR()
início
	escreva (“Informe nome do funcionário 1”);
	leia (F1.NOME); 
	escreva (“Informe telefone do funcionário 1”);
	leia (F1.FONE); 
	escreva (“Informe salário do funcionário 1”); 
	leia (F1.SALARIO);
	escreva (“Informe idade do funcionário 1”);
	leia (F1.IDADE); 
	escreva (“Informe nome do funcionário 2”);
 	leia (F2.NOME); 
	escreva (“Informe telefone do funcionário 2”);
	leia (F2.FONE); 
	escreva (“Informe salário do funcionário 2”);
	leia (F2.SALARIO); 
	escreva (“Informe idade do funcionário 2”);
	leia (F2.IDADE); 
	escreva (“Informe nome do funcionário 3”);
	leia (F3.NOME); 
	escreva (“Informe telefone do funcionário 3”);
	leia (F3.FONE); 
	escreva (“Informe salário do funcionário 3”);
	leia (F3.SALARIO); 
	escreva (“Informe idade do funcionário 3”);
	leia (F3.IDADE);
fim procedimento; 
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
procedimento MOSTRAR()
início
	escreva (“Nome do funcionário 1:”, F1.NOME); 
	escreva (“Telefone do funcionário 1:”,F1.FONE); 
	escreva (“Salário do funcionário 1: “, F1.SALARIO); 
	escreva (“Idade do funcionário 1:”, F1.IDADE); 
	escreva (“Nome do funcionário 2:”, F2.NOME); 
	escreva (“Telefone do funcionário 2:”,F2.FONE); 
	escreva (“Salário do funcionário 2: “, F2.SALARIO); 
	escreva (“Idade do funcionário 2:”, F2.IDADE); 
	escreva (“Nome do funcionário 3:”, F3.NOME); 
	escreva (“Telefone do funcionário 3:”,F3.FONE); 
	escreva (“Salário do funcionário 3: “, F3.SALARIO); 
	escreva (“Idade do funcionário 3:”, F3.IDADE); 
fim procedimento.
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Estruturas aninhadas
Estruturas aninhadas são aquelas cujos componentes (alguns) são uma estrutura.
 
Exemplo: uma estrutura para armazenar: nome, cpf, sexo, horas trabalhadas, dependentes, endereço, onde endereço possui as seguintesinformações: rua, número, cep.
 
declare ENDERECO registro (RUA, CEP; NUMERO);
declare FUNCIONARIO registro (NOME, CPF, SEXO; HORAS_TRAB, DEPENDENTES; ENDERECO registro);
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
tipo ENDERECO= registro
 var RUA[60]: texto; 
 var CEP[10]: texto;
 var NUMERO: inteiro;
fim registro;
 
 
tipo FUNCIONARIO= registro
 var NOME[60]: texto; 
 var CPF[11]: texto;
 var HORAS_TRAB: real;
 var DEPENDENTES: inteiro;
 var END_FUNCIONARIO: ENDERECO;
fim registro;
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
O acesso aos elementos é feito hierarquicamente. Primeiro, faz-se menção aos registros mais externos, depois aos mais internos e, finalmente, ao identificador do componente:
 
CADASTRO.NOME = “João da Silva”;
CADASTRO.CPF = “358.982.153-00”;
CADASTRO.SEXO = “M”;
CADASTRO.DEPENDENTES = 2;
CADASTRO.HORAS_TRAB = 40;
CADASTRO.END_FUNCIONARIO.RUA = “Rua das Acácias”;
CADASTRO.END_FUNCIONARIO.NUMERO = 10;
CADASTRO.END_FUNCIONARIO.CEP = “75123-010”;
2.1 Conceitos iniciais
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Para uma melhor visualização da utilidade dos registros basta imaginarmos que ao invés de manipular as informações de um aluno exista a necessidade de gerenciamento de uma turma com 50 alunos.
2.2 Usando vetor em registros
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Um estudante desatento imaginaria ser necessário a declaração de 50 variáveis para cada tipo de informação. Porém, um estudante com uma visão adequada sugeriria a utilização de vetores:
algoritmo “exemplo”
var Nome [1..50]: texto;
 CPF [1..50]: inteiro;
 RG [1..50]: inteiro;
 datas_de_nascimento: vetor [1..50] de caractere
 coeficientes_de_rendimento: vetor [1..50] de real
 …
2.2 Usando vetor em registros
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Para manipular de forma adequada os vetores, mantendo seus dados consistentes, se torna trabalhoso. Com a utilização de um registro podemos resolver este problema apenas com um vetor de 50 registros.
 
Porém, se tivéssemos um conjunto em que os elementos não são do mesmo tipo, teríamos então um conjunto heterogêneo de dados. 
Nas estruturas compostas homogêneas (vetores e matrizes) utilizamos tipos de dados primitivos como sendo os elementos dessas estruturas. Agora utilizaremos como componente dessa estrutura não apenas um tipo primitivo, mas sim os tipos construídos, neste caso os registros.
2.2 Usando vetor em registros
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Sintaxe da declaração:
 
Como possuímos um vetor composto por registros, não podemos declarar esse vetor sem antes ter declarado seus elementos; devemos então declarar primeiro o tipo construído registro e depois o vetor. 
Exemplo:
a) Como criar um registro
 
 
tipo ALUNO = registro
 var NOME: text;
 var CPF: inteiro;
 var RG: texto;
 var DATA_NASCIMENTO: data;
 var COEFICIENTE_RENDIMENTO: real;
fim registro;
 
var CADASTRO [1..50]: ALUNO; ou var CADASTRO [50]: ALUNO;
2.2 Usando vetor em registros
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
b) Declare um conjunto de registros que comporte as informações do aluno e as 4 notas por bimestre e faltas.
 
tipo NOTAS_BIMESTRE [1..2, 1..4]: real;
tipo ALUNOS = registro
 var NOME: texto;
 var CPF: inteiro;
 var RG: texto;
 var DATA_NASCIMENTO: data;
 var COEFICIENTE_RENDIMENTO: real;
 var RENDIMENTO: NOTAS_BIMESTRE;
fim registro;
 
var CADASTRO_ALUNO [1..50]: ALUNOS;
2.2 Usando vetor em registros
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Manipulação:
 Ao acessar as informações contidas em um conjunto de registros, procedemos utilizando o modo de acesso característico de cada estrutura.
Exemplo:
a) Se quisermos saber as informações do décimo aluno, escreveríamos:
 
escreva CADASTRO_ALUNO[10].NOME;
escreva CADASTRO_ALUNO[10].CPF;
escreva CADASTRO_ALUNO[10].RG;
escreva CADASTRO_ALUNO[10].DATA_NASCIMENTO;
escreva CADASTRO_ALUNO[10].COEFICIENTE_RENDIMENTO;
escreva CADASTRO_ALUNO[10].RENDIMENTO[1,1];
escreva CADASTRO_ALUNO[10].RENDIMENTO[1,2];
escreva CADASTRO_ALUNO[10].RENDIMENTO[1,3];
escreva CADASTRO_ALUNO[10].RENDIMENTO[1,4];
escreva CADASTRO_ALUNO[10].RENDIMENTO[2,1];
escreva CADASTRO_ALUNO[10].RENDIMENTO[2,2];
escreva CADASTRO_ALUNO[10].RENDIMENTO[2,3];
escreva CADASTRO_ALUNO[10].RENDIMENTO[2,4];
2.2 Usando vetor em registros
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
b) Elabore o trecho de um algoritmo que imprima simplifique o exemplo anterior: 
.
.
para N = 1 até 50 passo 1 faça 
 escreva CADASTRO_ALUNO[N].NOME;
 escreva CADASTRO_ALUNO[N].CPF;
 escreva CADASTRO_ALUNO[N].RG;
 escreva CADASTRO_ALUNO[N].DATA_NASCIMENTO;
 escreva CADASTRO_ALUNO[N].COEFICIENTE_RENDIMENTO;
 para I = 1 até 2 faça
 para J = 1 até 4 faça
 escreva CADASTRO_ALUNO[N].RENDIMENTO[I,J];
 fim para;
 fim para;
fim para;
.
.
2.2 Usando vetor em registros
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Para utilizarmos registro na linguagem C utilizaremos as variáveis nome, matricula, identidade e endereco relacionadas às informações sobre um aluno.
 
Vamos criar um registro chamado aluno e definimos nela as informações (campos) que ela irá armazenar. Para definirmos um registro aluno, fazemos assim:
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Aqui, usamos a palavra-chave struct para informar ao compilador que um registro está sendo definido. Em seguida, atribuímos o nome aluno para o nosso registro e então definimos as variáveis (campos) que formam esse registro (nome, matricula, identidade e endereco). 
Percebam que a definição de um registro deve terminar com um ";" (ponto e vírgula). 
Após a definição do registro, podemos declarar variáveis do tipo aluno – assim como fazemos para os outros tipos de dados (int, double, char etc) mas incluindo a palavra-chave struct ao início. Exemplo:
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Para acessarmos um campo de um registro, devemos utilizar o operador '.' (ponto). Veja o exemplo abaixo onde definimos e exibimos valores para os campos nome e matricula da nossa variável umAluno:
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Observe que usamos a função strcpy() para definir o valor do campo nome, pois ele é uma string e, por isso, não podemos escrever dessa forma:
 
 		umAluno.nome = "João da Silva";
 
Agora voltaremos ao problema do armazenamento das informações sobre os 30 alunos.
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Usando o registro aluno como você faria para guardar as informações dos alunos?
a) Criar 30 variáveis do tipo aluno (aluno1, aluno2.....aluno30)
b) Criar um vetor de 30 elementos do tipo aluno.
Claro que a solução utilizando um vetor é novamente a mais adequada.
Para definirmos um vetor de 30 elementos do tipo aluno, fazemos da seguinte forma:
 
struct aluno alunos[30];
 
É bem parecida com a definição de um vetor para int, double, char etc. Mas devemos incluir a palavra-chave struct no início da declaração.
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
A manipulação do vetor alunos é feita da mesma forma como trabalhamos com qualquer outro vetor, devendo acessá-lo elemento a elemento - seja para atribuição ou para leitura de um valor. 
No exemplo abaixo, exibimos os valores dos campos nome ematricula para o primeiro elemento do vetor alunos:
			%s = string >> texto
			%d = double >> real
			%i = inteiro
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Para atribuirmos valores para os campos identidade e endereco do 2º aluno do nosso vetor, escrevemos:
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
Finalmente, para exibirmos todas as informações sobre os alunos do nosso vetor, escrevemos:
		i++ >>> i + 1 ou i-- >>> i - 1
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
RESOLVA A LISTA DE EXERCÍCIO DA UNIDADE II
FIM DA UNIDADE II
BONS ESTUDOS
2.3 Registros na linguagem C/C++
PROFESSOR: EDILSON LIMA
*/35
PROFESSOR: EDILSON LIMA
*/35
ROTEIRO
PROFESSOR: EDILSON LIMA
Bibliografia
ARAÚJO, Everton C. Algoritmos: fundamento e prática. 2.ed. Florianópolis: VisualBooks, 2005.
MANZANO, José Augusto N. G.; OLIVEIRA, Jayr Figueiredo. Algoritmos: lógica para desenvolvimento de programação de computadores. 17.ed. São Paulo: Érica, 2005.
SALIBA, Walter Luís Caram. Técnicas de programação: uma abordagem estruturada. São Paulo: Pearson Education do Brasil, 1992.
GUIMARÃES, Ângelo de Moura; LAGES, Newton Alberto de Castilho. Algoritmos e Estrutura de Dados. 28ª Tiragem. Editora LTC São Paulo.
*/64
*

Continue navegando