Buscar

Estruturas de Dados em Supermercado

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Paulo Rech Wagner 1 Gabarito Prova P1 
 
 
PUCRS - FACULDADE DE INFORMÁTICA 
ENGENHARIA DE COMPUTAÇÃO 
Algoritmos e Estrutura de Dados II - Turma 590 
Prof. Paulo Rech Wagner 
PROVA P2 Data: 25/05/07 
 
 
 
Questão 1) 
A estrutura de dados utilizada para controlar as compras dos clientes em um 
supermercado foi implementada através de estruturas cruzadas (lista com lista, ABP com 
lista,...). Esta estrutura de dados deve ser totalmente dinâmica contendo os clientes e os 
produtos que cada um está comprando. Os clientes possuem os atributos nome (campo 
chave), cpf e uma referência para a lista dos produtos que está comprando. Cada produto 
possui os atributos nome e preço. Considerando que os dados já estão armazenados na 
estrutura de dados, faça: (3.0 pontos) 
a) defina a estrutura de dados a ser utilizada fazendo o seu desenho e indicando 
todas as classes utilizadas com seus respectivos atributos; 
b) um método, que recebe como parâmetro o nome de um cliente e retorne o produto 
mais barato que está comprando; 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Classes utilizadas: 
- Classe NodoLSE 
- Classe ListaLSE 
- Classe Cliente 
 inicio 
 literal nome , cpf 
lista dos clientes 
nome, cpf 
lista_prod 
nome preço 
lista dos produtos 
do cliente 
………… 
prim ult 
prim ult 
Objeto Produto 
Objeto Cliente 
Objeto ListaLSE 
Objeto ListaLSE 
Paulo Rech Wagner 2 Gabarito Prova P1 
 
 ListaLSE lista_prod 
 fim 
 
- Classe Produto 
 inicio 
 literal nome 
 real preco 
 fim 
 
- Classe ListaClientes subclasse de ListaLSE 
 inicio 
 ... 
 Produto produto_mais_barato(literal nome_cliente) 
 fim 
 
Algoritmo produto_mais_barato(literal nome_cliente) 
 inicio 
 ListaLSE lprod 
 NodoLSE nocli, noprod, mais_barato 
 Produto prod 
 
 nocli ← pesquisar(nome_cliente) 
 se ( nocli = nulo ) 
 então retorna nulo 
 senão inicio 
 mais_barato ← nulo 
 lprod ← nocli.get_info( ).get_lista_prod( ) 
 noprod ← lprod.get_primeiro( ) 
 enquanto ( noprod ≠ nulo ) faça 
 inicio 
 prod ← noprod.get_info( ) 
 se ( mais_barato = nulo ) 
 então mais_barato ← noprod 
 senão se ( prod.get_preco( ) < mais_barato.get_info( ).get_preco( ) ) 
 então mais_barato ← noprod 
 noprod ← noprod.get_prox( ) 
 fim 
 retorna mais_barato.get_info( ) 
 fim 
 fim 
 
Algoritmo Principal 
 inicio 
 ListaClientes listacli 
 NodoLSE nocli 
 literal nome 
 
 /* produto mais barato de um cliente */ 
 escreva (“informe o nome do cliente”) 
 leia (nome) 
 nocli ← listacli.pesquisar(nome) 
 se ( nocli = nulo ) 
 então escreva (“não existe este cliente”) 
 senão inicio 
 prod ← listacli.produto_mais_barato(nome) 
 se ( prod = nulo ) 
 então escreva (“este cliente não está comprando nada”) 
 senão escreva (“produto mais barato : “, prod.get_nome( )) 
 fim 
Paulo Rech Wagner 3 Gabarito Prova P1 
 
 
 
Questão 2) 
Os valores da seqüência abaixo devem ser incluídos em uma árvore binária de pesquisa 
(ABP). Sabe-se que o primeiro valor desta seqüência estará localizado na raiz da árvore. 
Mostre a representação gráfica da árvore após estas inclusões e liste seus elementos 
através das 3 formas de caminhamento, nomeando-as. (2.0 pontos) 
 
60 35 55 95 45 15 80 50 85 75 90 40 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Pré-fixado: 60 35 15 55 45 40 50 95 80 75 85 90 
Central: 15 35 40 45 50 55 60 75 80 85 90 95 
Pós-fixado: 15 40 50 45 55 35 75 90 85 80 95 60 
 
 
 
Questão 3) 
Dado um banco de dados já construído e composto pelos seguintes campos: nome, cargo 
e salário. Sabendo que ele está organizado segundo uma árvore binária já construída, 
escreva um algoritmo que leia o nome de uma pessoa e verifique se ela está presente ou 
não na árvore binária. Caso ela esteja presente, escreva um método que calcule e 
informe a média salarial das pessoas que possuem o mesmo cargo do que ela (pessoa 
pesquisada) existentes neste banco de dados. (2.0 pontos) 
 
Classe Pessoa: literal nome, literal cargo, real salario 
 
/* versão 1 – utilizando dois métodos distintos: uma para contar e outro para somar */ 
Algoritmo Principal 
 inicio 
 Arv_Binaria ab 
 NodoAB no 
 literal nome, cargo 
 inteiro cont 
 real soma 
 
 escreva (“informe o nome de uma pessoa”) 
 leia (nome) 
 no ← ab.pesquisar(nome) 
 se ( no = nulo ) 
 então escreva (“esta pessoa não está na árvore”) 
35 
15 
95 
55 
85 
80 
60 
40 
45 75 
90 50 
Paulo Rech Wagner 4 Gabarito Prova P1 
 
 senão inicio 
 cargo ← no.get_info( ).get_cargo( ) 
 cont ← ab.conta_cargo(cargo) 
 soma ← ab.soma_salario(ab.get_raiz( ), cargo) 
 escreva (“media salarial das pessoas de mesmo cargo: ”, soma/cont) 
 fim 
 fim 
 
 
/* retorna a quantidade de pessoas do mesmo cargo. Chama o algoritmo recursivo */ 
Algoritmo conta_cargo (literal cargo) 
 inicio 
 retorna conta_cargo(raiz, cargo) 
 fim 
 
/* algoritmo recursivo que retorna a quantidade de pessoas do mesmo cargo */ 
Algoritmo conta_cargo (NodoAB no, literal cargo) 
 inicio 
 se ( no = nulo ) 
 então retorna 0 
 senão se ( no.get_info( ).get_cargo( ) = cargo ) 
 então retorna 1 + conta_cargo(no.get_esq( ),cargo) + 
 conta_cargo(no.get_dir( ),cargo) 
 senão retorna conta_cargo(no.get_esq( ),cargo) + 
 conta_cargo(no.get_dir( ),cargo) 
 fim 
 
/* retorna a soma salarial das pessoas do mesmo cargo */ 
Algoritmo soma_salario (NodoAB no, literal cargo) 
 inicio 
 se ( no = nulo ) 
 então retorna 0 
 senão se ( no.get_info( ).get_cargo( ) = cargo ) 
 então retorna no.get_info( ).get_salario( ) + 
 soma_salario(no.get_esq( ),cargo) + soma_salario(no.get_dir( ),cargo) 
 senão retorna soma_salario(no.get_esq( ),cargo) + 
 soma_salario(no.get_dir( ),cargo) 
 
 fim 
 
 
/* versão 2 – utilizando um único método para retornar a contagem e o somatório */ 
Algoritmo Principal 
 inicio 
 Arv_Binaria ab 
 NodoAB no 
 literal nome 
 real media 
 
 escreva (“informe o nome de uma pessoa”) 
 leia (nome) 
 no ← ab.pesquisar(nome) 
 se ( no = nulo ) 
 então escreva (“esta pessoa não está na árvore”) 
 senão inicio 
 media ← ab.media_salarial_cargo(no.get_info( ).get_cargo( )) 
 escreva (“media salarial das pessoas de mesmo cargo: ”, media)fim 
 fim 
 
Paulo Rech Wagner 5 Gabarito Prova P1 
 
/* objeto temporario utilizado para armazenar dois valores de retorno */ 
Classe objeto_temporario 
 inicio 
 inteiro cont 
 real soma 
 
 objeto_temporario ( ) : construtor 
 { cont ← 0; soma ← 0 } 
 inteiro get_cont ( ) : método que retorna o valor do contador 
 { retorna cont } 
 inc_cont ( ) : método que incrementa 1 no contador 
 { cont ← cont + 1 } 
 real get_soma ( ) : método que retorna o valor do acumulador 
 { retorna soma } 
 
 acum_soma (real val) : método que acumula o valor val no acumulador 
 { soma ← soma + val } 
 
 fim 
 
/* retorna a média salarial das pessoas do mesmo cargo. Chama o algoritmo recursivo */ 
Algoritmo media_salarial_cargo (literal cargo) 
 inicio 
 objeto_temporatio temp 
 
 temp ← novo objeto_temporario( ) 
 media_salarial_cargo(raiz, cargo, temp) 
 retorna temp.get_soma( )/temp.get_cont( ) 
 fim 
 
/* algoritmo recursivo que retorna a média salarial das pessoas do mesmo cargo */ 
Algoritmo media_salarial_cargo (NodoAB no, literal cargo, objeto_temporario temp) 
 inicio 
 se ( no ≠ nulo ) 
 então inicio 
 se ( no.get_info( ).get_cargo( ) = cargo ) 
 então inicio 
 temp.inc_cont( ) 
 temp.acum_soma(no.get_info( ).get_salario( )) 
 fim 
 media_mesmo_sexo(no.get_esq( ),cargo,temp) 
 media_mesmo_sexo(no.get_dir( ),cargo,temp) 
 fim 
 fim 
 
 
Questão 4) 
Escreva um algoritmo que leia (no algoritmo principal) um valor inteiro e verifique se ele 
está presente ou não em uma árvore binária de pesquisa (ABP) contendo valores inteiros. 
Caso ele esteja presente, escreva um método que retorna e escreva (no algoritmo 
principal) a quantidade de valores presentes na ABP que são maiores do que ele. Para 
exemplificar, indicar dois valores quaisquer da árvore da questão 2 com suas respectivas 
quantidades de valores maiores. (3.0 pontos) 
 
Exemplos: 
- valor 60 → quantidade de valores maiores: 5 
- valor 50 → quantidade de valores maiores: 7 
 
Paulo Rech Wagner 6 Gabarito Prova P1 
 
Algoritmo Principal 
 inicio 
 Arv_BinPesquisa abp 
 NodoAB no 
 inteiro valor, nelem 
 
 escreva (“informe um valor”) 
 leia (valor) 
 no ← abp.pesquisar(valor) 
 se (no = nulo ) 
 então escreva (“não está na ABP”) 
 senão inicio 
 nelem ← abp.maiores(valor) 
 escreva (“existem “, nelem, “valores maiores do que “, valor) 
 fim 
 fim 
 
/* versão 1 – algoritmo recursivo */ 
Algoritmo maiores (inteiro valor) 
 inicio 
 retorna maiores(raiz,valor) 
 fim 
 
Algoritmo maiores (NodoAB no, inteiro valor) 
 inicio 
 se (no = nulo) 
 então retorna 0 
 senão se (no.get_info( ).comparar(valor) = -1) 
 então retorna 1 + maiores(no.get_esq( ),valor) + maiores(no.get_dir( ),valor) 
 senão retorna maiores(no.get_esq( ),valor) + maiores(no.get_dir( ),valor) 
 fim 
 
 
/* versão 2 – algoritmo interativo – subir até a raiz a partir do no*/ 
Algoritmo maiores (inteiro valor) 
 inicio 
 NodoAB no, pai 
 inteiro cont 
 
 no ← pesquisar(valor) 
 cont ← tamanho(no.get_dir( )) 
 pai ← acha_pai(no) 
 enquanto (pai ≠ nulo) faça 
 inicio 
 se ( pai.get_info( ).comparar(valor) = -1) 
 então cont ← cont + 1 + tamanho(pai.get_dir( )) 
 pai ← acha_pai(pai) 
 fim 
 retorna cont 
 fim 
 
 
/* versão 3 – algoritmo interativo – descer até achar. Se no maior, contar direita */ 
Algoritmo maiores (inteiro valor) 
 inicio 
 NodoAB paux 
 inteiro cont 
 lógico achei 
 
 achei ← falso 
Paulo Rech Wagner 7 Gabarito Prova P1 
 
 cont ← 0 
 paux ← raiz 
 enquanto (não achei) faça 
 inicio 
 se (paux.get_info( ).comparar(valor) = 0) 
 então inicio 
 achei ← verdadeiro 
 cont ← cont + tamanho(paux.get_dir( )) 
 fim 
 senão se (paux.get_info( ).comparar(valor) = -1) 
 então inicio 
 cont ← cont + 1 + tamanho(paux.get_dir( )) 
 paux ← paux.get_esq( ) 
 fim 
 senão paux ← paux.get_dir( ) 
 retorna cont 
 fim

Continue navegando