REGISTROS 1 Um dos pontos mais importantes para a solução de problemas são as Estruturas De Dados ou Agregados Estrutura de Dados conjunto de dados relacionados entre si, agrupados na memória principal ou secundária Se fosse para guardar na memória as notas de cada um dos 100 alunos de uma turma, pelo que sabemos até agora, necessitaríamos de 100 variáveis diferentes NOTA 1, NOTA 2,, NOTA 100 Observou-se que somente foi possível trabalhar com um (único) tipo de dado por vetor No momento em que se precisar trabalhar com dois (ou mais ) tipos de dados diferentes, é necessário a utilização de mais vetores ou matrizes A utilização da principal estrutura de dados, o REGISTRO, consiste em trabalhar vários dados de tipos diferentes ( OS CAMPOS ) em uma mesma estrutura Por esta razão, este tipo de dado é considerado HETEROGENEO Para se informar o nome de um aluno e de suas quatro notas, isto nos obrigaria a utilizar dois vetores: um para armazenar os nomes dos alunos e o outro para conter as notas ( os valores armazenados em ambos são de tipos diferentes) A utilização de registros vem a facilitar esta representação: Layout do formato de um registro com seus campos Cadastro de Notas NOME:: 1 ª NOTA: 2 ª NOTA: 3 ª NOTA: 4 ª NOTA Desta maneira, o REGISTRO está formado pelos campos: NOME, 1 ª NOTA,,4 ª NOTA, e poderia ser chamado de ALUNO Selecionar e guardar os dados de um determinado funcionário (na memória) precisaríamos de tantas variáveis quantos campos houverem no formulário de cadastro preenchido O tempo para manipular tais dados será muito maior se não se dispuser de uma forma simplificada de acessar e manipular Daí vem os REGISTROS
2 Registros : (RECORD): Agregados heterogêneos ou variáveis compostas heterogêneas: São conjuntos de informações relacionadas entre si, que podem ser referenciadas como uma unidade ( o Registro) e que, normalmente, são conjuntos de informações (campos) de tipos diferentes Ao contrário das variáveis já estudadas, uma variável do tipo registro, quando definida pode ocupar muitas posições da memória principal, que ficam reservadas para o uso Logo, ao se definir uma variável do tipo registro, deve-se definir também quais serão as partes componentes desta variável (os campos) por exemplo: NOME, IDADE, SEXO, ALTURA junto com o seu tipo básico Um registro poderá ter tantos campos quanto o analista deseje Para facilitar recomenda-se um máximo de 10 campos por registro Quando for necessário estruturas de dados maiores pode-se utilizar registros previamente definidos dentro de outros registros Declaração de Registros: Tipo r = registro {Descrição dos campos e seus tipos} r = REG; Tomando como exemplo a proposta de se criar um (único) registro denominado ALUNO, caracterizado anteriormente: tipo r = registro texto: NOME real: NOTA1; real: NOTA2; real: NOTA3; real: NOTA4; r = ALUNO Observe que é especificado um ÚNICO registro denominado ALUNO, o qual é um conjunto de dados heterogeneos ( um campo tipo texto e quatro tipo real ) Desta forma é possível guardar em uma mesma estrutura vários tipos diferentes de dados Pode-se também dizer que este tipo de registro é um vetor, pois tem-se a variável ALUNO como um vetor cujos índices são: NOME, NOTA1,, NOTA4 tipo r = registro caracter: NOME real: SALARIO inteiro: IDADE lógico: SEXO r = REG; Isto significa: Um modelo(r) de um registro e a criação de uma área de memória denominada REG capaz de conter 4 campos de tipos diferentes; ou seja:
3 REG: real inteiro NOME SALÁRIO IDADE SEXO caracter lógico Ex: Como seria descrito em NPC o diagrama abaixo: FUNC NOME ENDEREÇO RUA NRO CEP CIDADE ESTADO SALARIO Tipo r = registro ender: ENDEREÇO; texto: CIDADE; caracter: ESTADO; real: SALARIO; r = FUNC; Observe que o tipo ender ainda não foi definido (não é tipo básico); Logo a definição está incompleta; Definindo o novo tipo: Tipo ender = registro caracter: RUA; inteiro: NRO; inteiro: CEP; ender é um registro embutido no registro r; Atribuição de valores: FUNC NOME Delúbio Soares ; FUNC ENDEREÇO RUA Palácio do Planalto ; FUNC ENDEREÇO NRO 171; FUNC ENDEREÇO CEP 171171171; FUNC CIDADE Brasília ; FUNC ESTADO DF ; FUNC SALARIO 1,00; OBS: O uso do ponto ( ) indica que esta variável FUNC possui campos, e que NOME é um deles; OBS: As operações realizadas sobre uma variável REGISTRO, são as mesmas de uma variável comum
4 A única diferença é que devemos indicar o NOME DA VARIÁVEL seguido de um ponto ( ) e logo após segue-se o NOME DO CAMPO A partir da definição de um registro como um novo tipo derivado, poderemos definir quantas variáveis desejarmos desse novo tipo, no grupo de variáveis de nossas declarações Ex: Var REGALUNO: RALUNO; REGCAD: RFUNC, MELHOR FUNC; REGALUNO: RALUNOA, RALUNOB Tipo r = registro{armazena os dados de um aluno} caracter: SEXO; texto: CIDADE; real:média; r = REGALUNO; LEITURA DE REGISTROS Criar um (único) registro denominado ALUNO, caracterizado anteriormente: tipo r = registro texto: NOME real: NOTA1; real: NOTA2; real: NOTA3; real: NOTA4; r = ALUNO Inicio Leia (ALUNONOME); Leia (ALUNONOTA1); Leia (ALUNONOTA2); Leia (ALUNONOTA3); Leia (ALUNONOTA4); imprima (ALUNONOME); imprima (ALUNONOTA1); imprima (ALUNONOTA2); imprima (ALUNONOTA3); imprima (ALUNONOTA4);
5 VETORES DE REGISTRO Layout do formato de um registro com seus campos Cadastro de Notas Escolares NOME: NOTAS 1 2 4 Observe que foi delineado um vetor chamado NOTAS com quatro índices, um para cada nota A declaração de tal registro com seu respectivo vetor seria então: tipo r = registro; Texto: NOME; ns: NOTAS; Fim registro; r = ALUNO; tipo ns = vetor[ 1 : 4 ] real; Cada elemento de um vetor poderá ser um registro ao invés de uma variável de um tipo básico qualquer Com isso o vetor não deixa de ser ainda uma estrutura homogênea, Por que cada elemento do vetor é do tipo igual ao outro Exemplo de um vetor de registros: VTURMA 1 2 100 Nome Sexo Cidade Media Obs: Alguns autores chamam os vetores de registros de tabela
Escrevendo a estrutura acima em portugol: 6 Tipo v = vetor [ 1 : 100] r; v = VTURMA; Tipo r = registro; Texto: NOME; Caractere: SEXO; Texto: CIDADE; Real: MEDIA; Fim registro; r = REGALUNO; Cada elemento do vetor contém os dados de um aluno de uma turma constituída de 100 alunos (dimensão do vetor) Seja o registro abaixo: (pág 115 G Lage - ) REGPAG Nome CPF Identidade Horas de Trabalho 1 2 3 4 5 6 Salário FGTS 1,1 1,2 Horas Trabalhadas em cada Semestre; (vetor); FGTS nos trimestres (matriz) 2,1 2,2 Em Portugol: tipo rp = registro; inteiro: CPF, IDENTIDADE; ht: HORAS TRABALHADAS; real: SALARIO; fgts: FGTSNOTRIMESTRE; rp = REGPAG; tipo ht = vetor [ 1 : 6 ] real; tipo fgts = matriz [ 1 : 2, 1 : 2 ] real;
7 Se fosse 30 funcionários: tipo vf = vetor [ 1 : 30 ] rp; vf: VFUNC; tipo rp = registro; inteiro: CPF, IDENTIDADE; ht: HORASTRABALHDAS; real: SALARIO; fgts: FGTSNOTRIMESTRE; rp = REGPAG; tipo ht = vetor [ 1 : 6 ] real; tipo fgts = matriz [ 1 : 2, 1 : 2 ] real; A atribuição de valores poderia ser: REGPAG HORASTRABALHADAS [1] 6,40; REGPAG HORASTRABALHADAS [6] 7,25; REGPAG FGTSNOTRIMESTRE [1,1] 267,80; Etc O que significa a definição abaixo: tipo v = vetor [1:100] r ; v: CADASTRO; tipo r = registro inteiro: CPF; ender: ENDEREÇO; real: SALARIO; caracter: SEXO; r = REGCAD SOLUÇÃO: vetor de registros onde cada elemento do vetor contem os dados de um funcionário de uma empresa com 100 funcionários
8 NOME CPF ENDEREÇO SALÁRIO SEXO Exemplos utilizando Registros, vetores e matrizes tipo r = registro ender: ENDEREÇO; inteiro: CPF; lógico: SEXO; ht: HORASTRAB; inteiro: DATANAS; lógico: TEMDEPENDENTES; tipo ht = vetor [ 1 : 3 ] inteiro; tipo ender = registro texto: RUA, AV; inteiro: NRO, CEP; r = FUNCIONÁRIO Criar os registros para o lay-out abaixo, considerando oito alunos, e escrever um algoritmo em npc para ler e imprimir, os nomes e as notas de cada aluno Layout do formato de um registro com seus campos Cadastro de Notas Escolares NOME: NOTAS 1 2 4
9 tipo v = vetor [ 1 : 8 ] r; tipo r = registro; nt: NOTA; v = ALUNO; tipo nt = vetor [ 1 : 4 ] real; inteiro: I, J; para J de 1 ate 8 faça leia ( ALUNO [ J ] NOME ); imprima ( ALUNO [ J ] NOME ); fim para; fim para I de 1 ate 4 faça leia ( ALUNO [ J ] NOTA [ I ] ); imprima ( ALUNO [ J ] NOTA[I] ); fim para; Observe que o looping da variável J controla o número de alunos da turma, no caso 8, e o looping da variável I controla o número de notas, até 4 por aluno Para movimentação de mais um na variável J existem quatro movimentações na variável I Dada a tabela abaixo: CÓDIGO NOME 001000 ALFAIATE 001050 MEDICO 198050 CONTADOR 199000 DENTISTA Escrever um algoritmo que dado o CÓDIGO DA PROFISSÃO (fornecido em cartão) o mesmo emita o NOME da profissão Criar um looping para executar as operações de consulta enquanto o operador desejar
Algoritmo: PROFISSÃO Inicio 10 tipo t = vetor [ 1 : 100 ] reg t: TABELA; tipo reg = registro; inteiro: CÓDIGO; texto: PROFISSÃO ( ou NOME); reg: PROFISSÃO; inteiro: CODIGODESEJADO, I; leia (TABELA); { carregando a tabela fornecida } leia (CODIGODESEJADO); { código para o qual se deseja saber qual a profissão } para I de 1 até 100 faça se TABELA [ I ] CODIGO = CODIGODESEJADO então imprima ( TABELA [ I ] NOME ); abandone; fim se; fim para; fim PROFISSÃO Dada a tabela abaixo: CÓDIGO NOME SALÁRIO 001000 ALFAIATE R$ 1500,00 001050 MEDICO R$ 7200,00 198050 CONTADOR R$ 2800,00 199000 DENTISTA R$ 7200,00 Escrever um algoritmo que dado o CÓDIGO DA PROFISSÃO (fornecido em cartão) o mesmo emita o NOME da profissão e o salário correspondente Algoritmo: PROFISSÃO
Inicio 11 tipo t = vetor [ 1 : 100 ] reg t: TABELA; tipo reg = registro; inteiro: CÓDIGO; texto: PROFISSÃO ( ou NOME); real: SALARIO reg: PROFISSÃO; inteiro: CODIGODESEJADO, I; caractere: RESP: lógico: ACHA; leia (TABELA); { carregando a tabela fornecida } RESP SIM ; Enquanto RESP = SIM faca leia (CODIGODESEJADO); { código para o qual se deseja saber qual a profissão } ACHA falso; para I de 1 até 100 faça fim para; se TABELA [ I ] CODIGO = CODIGODESEJADO então ACHA verdadeiro; imprima ( TABELA [ I ] NOME, TABELA [ I ] SALÁRIO ); abandone; senão ACHA falso fim se; imprima ( DESEJA CONTINUAR A CONSULTA?, SIM OU NÃO? ); leia ( RESP ); fim enquanto; fim PROFISSÃO
12 Seja o layout abaixo que significa a quantidade de baixas (volume de vendas) de um produto por dia da semana { Lógia de Programação Forbellone pág 89 } a) Escrever um algoritmo em npc, que faça a declaração do registro de um único produto; b) Utilizando o exercício anterior, escrever um algoritmo que possa conter as baixas de 4 semanas (isto é um mês), e calcule o total de baixas de cada dia durante as quatro semanas c) Considere agora, 500 produtos diferentes; NOME: CÓDIGO: PREÇO: BAIXA 1 2 3 4 5 6 Algoritmo: VENDAS Inicio Tipo r = registro Inteiro: CÓDIGO; Real: PREÇO; caractere: NOME; nt: DIAS; Fim registro; r = PRODUTO; {dados de BAIXA do produto por dia da semana } tipo nt = vetor [ 1: 6 ] inteiro; NOME: CÓDIGO: PREÇO: 1 2 3 4 5 6 BAIXA 1 2 3 4 67
13 Algoritmo: VENDAS Inicio Tipo r = registro Inteiro: CÓDIGO; Real: PREÇO; caractere: NOME; nt: DIAS; Fim registro; r = PRODUTO; {dados de BAIXA do produto por dia da semana durante 4 semanas } tipo nt = matriz [ 1 : 4, 1: 6 ] inteiro; Suponha um ônibus com 44 lugares, numerados seqüencialmente Construir um vetor chamado ONIBUS para venda de passagens: Vetor de Registros: 1 3566 2 3567 NUMERO DA PASSAGEM: DATA: 43 44 DE: PARA: HORÁRIO: POLTRONA: IDADE: NOME PASSAGEIRO: Tipo r = registro Inteiro: NPAS, NPOLTRONA, IDADE; caractere: NOME, DATA, ORIGEM, DESTINO, HORA; Fim registro; r = ONIBUS;
14 Prob 38 pág 171 Algoritmos e Programação { Marco Medina Cristina Fertig } Registro de uma criança Criar um algoritmo em npc para fazer a carteira de saúde de uma criança que nasceu no dia 25 de dezembro de 2008 Tipo r = registro texto: NOMEPAI, NOMEMÃE; ender: ENDEREÇO; texto: CIDADE; caracter: ESTADO; inteiro: DIA, MÊS, ANO; ( DATA DSE NASCIMENTO } real: PESO; r = CARTSAUDE; tipo ender = registro texto: RUA, AV, BAIRRO; inteiro: NRO, CEP, FONE; Prob 40 - pág 179 Algoritmos e Programação { Marco Medina Cristina Fertig } Considere o layout a seguir: MATRICULA: DISCIPLINA: SEMESTRE: ANO: PERÍODO: NOME DO ALUNO: NOTAS NOTA P1 NOTA P2 MEDIA Escrever um algoritmo que leia os dados do tipo de registro acima, para uma turma de 30 alunos, calcule a média aritmética de cada aluno, e informe se o mesmo foi aprovado direto, ou se vai para a Prova final, ou se foi reprovado direto
Algoritmo: MEDIA_ALUNOS 15 tipo t = vetor [ 1 : 30 ] reg t: ALUNO; tipo reg = registro; inteiro: MATRICULA, ANO; caractere: DISCIPLINA, SEMESTRE, PERÍODO; nt: NOTA; tipo nt = vetor [ 1 : 3 ] real; nt: NOTA; Inicio O diagrama abaixo representa o pátio de um deposito de uma empresa de construções, que armazena os seguintes materiais: cimento, areia, tubos, blocos, madeira, cal e saibro 20 cimento 00 vazio 80 saibro 40 Madeira 00 Vazio 23 blocos 00 vazio 30 Cimento 00 vazio 00 Vazio 30 Areia 25 Areia 53 Tubos 15 Blocos 45 Tubos 20 cal Em cada espaço do deposito acima estão colocados a quantidade do material e o nome correspondente Assim 30 cimento Significa que naquele local existem 30 sacos de cimento Escrever um algoritmo capaz de contar quantos elementos de cada material existe no pátio Observe que pode haver mais de um local com o mesmo material Sabe-se que os dados são fornecidos em cartão O algoritmo deve imprimir os resultados conforme o diagrama abaixo Produto Quantidade Cimento Xxxx Algoritmo: PATIOMATERIAL Inicio: Tipo p = matriz [14, 14] reg; p = PÁTIO; tipo produto = (cimento, areia, tubos, blocos, madeira, cal, saibro, vazio) tipo reg = registro; inteiro: QUANT; { significa a 1ª Coluna 20 00-00 -53 } produto: MAT; { significa a 2ª Coluna cimento vazio } tipo oc = vetor [cimento : saibro] inteiro; oc: OCMAT; inteiro: I, J; produto: INDPROD; OCMAT 0 {Inicializando o vetor OCMAT com zeros } leia (PÁTIO); Para I de 1 até 4 faça Para J de 1 até 4 faça Se PÁTIO[ I, J ] MAT < > VAZIO então
16 OCMAT [ PÁTIO[I, J] MAT] OCMAT [ PÁTIO[I, J] MAT ] + PÁTIO [I, J] QUANT; { MAT significa para só um material por vez } Fim se; Fim para; Fim para; Imprima ( PRODUTO, QUANTIDADE ); Imprima ( ======, ======= ); Para INDICAPRODUTO de cimento até saibro faça Imprima ( INDICAPRODUTO, OCORMAT [ INDICAPRODUTO ] ); Fim para; Fim PATIOMATERIAL; Vários proprietários de imóveis estão em atraso com IPTU Algoritmo: calcular e imprimir o valor da multa a ser paga, considerando que: - dados de cada imóvel : numero de registro, valor do imposto e meses em atraso, estão em cartão;- multas calculadas a partir do valor do imposto e segundo a tabela (lida a partir de cartões): Valor do imposto % por mês de atraso Cartão FLAG: NRO = 0000 Até 500 1 De 500,01 até 1800,00 2 Imprimir: NRO, VIMP, MULTA De 1801,00 até 5000,00 4 E MESESATRASO De 5001, 00 até 12000,00 7 > 12001,00 10 Efetuar a leitura das 4 notas bimestrais de 8 alunos, apresentando no final os dados dos alunos classificados por nome Obs Criamos duas variáveis: ATUAL e PROXIMO e uma terceira X para a auxiliar a troca de posições Algoritmo LEITURAORDENAÇÃO Inicio Tipo bimestre = conjunto [ 1 : 4 ] real Cad_aluno = registro; bimestre: NOTA; fim registro; var ALUNO: conjunto [ 1 : 8 ] de cad_aluno I, J, ATUAL, PROXIMO: inteiro X: cad_aluno Para J de 1 ate 8 faça Leia ( ALUNO [ J ] NOME ); Para I de 1 ate 4 faça Leia ( ALUNO [ J ] NOTA [ I ] ); Fim para
Fim para 17 { Rotina de ordenação de dados heterogêneos} para ATUAL de 1 ate 7 faça para PROXIMO de ATUAL + 1 ate 8 faça Fim se; Fim para; fim para; se ALUNO [ ATUAL ] NOME > ALUNO [ PROXIMO ] NOME então X ALUNO [ ATUAL ]; ALUNO [ ATUAL ] ALUNO [ PROXIMO ]; ALUNO [ PROXIMO ] X; Para J de 1 ate 8 faça Imprima ( ALUNO [ J ] NOME); para I de 1 ate 4 faça imprima ( ALUNO [ J ] NOTA [ I ] ); fim para; fim para; fim LEITURA ORDENAÇÃO