Sie sind auf Seite 1von 7

PUCRS - FACULDADE DE INFORMTICA

ENGENHARIA DE COMPUTAO
Algoritmos e Estrutura de Dados II - Turma 590
Prof. Paulo Rech Wagner
PROVA P2 Data: 25/05/07

Questo 1)
A estrutura de dados utilizada para controlar as compras dos clientes em um
supermercado foi implementada atravs de estruturas cruzadas (lista com lista, ABP com
lista,...). Esta estrutura de dados deve ser totalmente dinmica contendo os clientes e os
produtos que cada um est comprando. Os clientes possuem os atributos nome (campo
chave), cpf e uma referncia para a lista dos produtos que est comprando. Cada produto
possui os atributos nome e preo. Considerando que os dados j esto armazenados na
estrutura de dados, faa: (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 mtodo, que recebe como parmetro o nome de um cliente e retorne o produto
mais barato que est comprando;

Objeto ListaLSE

prim ult
lista dos clientes

nome, cpf Objeto ListaLSE


lista_prod
prim ult
Objeto Cliente lista dos produtos
do cliente

nome preo

Objeto Produto

Classes utilizadas:
- Classe NodoLSE
- Classe ListaLSE
- Classe Cliente
inicio
literal nome , cpf

Paulo Rech Wagner 1 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 )
ento retorna nulo
seno inicio
mais_barato nulo
lprod nocli.get_info( ).get_lista_prod( )
noprod lprod.get_primeiro( )
enquanto ( noprod nulo ) faa
inicio
prod noprod.get_info( )
se ( mais_barato = nulo )
ento mais_barato noprod
seno se ( prod.get_preco( ) < mais_barato.get_info( ).get_preco( ) )
ento 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 )
ento escreva (no existe este cliente)
seno inicio
prod listacli.produto_mais_barato(nome)
se ( prod = nulo )
ento escreva (este cliente no est comprando nada)
seno escreva (produto mais barato : , prod.get_nome( ))
fim

Paulo Rech Wagner 2 Gabarito Prova P1


Questo 2)
Os valores da seqncia abaixo devem ser includos em uma rvore binria de pesquisa
(ABP). Sabe-se que o primeiro valor desta seqncia estar localizado na raiz da rvore.
Mostre a representao grfica da rvore aps estas incluses e liste seus elementos
atravs das 3 formas de caminhamento, nomeando-as. (2.0 pontos)

60 35 55 95 45 15 80 50 85 75 90 40

60

35 95

15 55 80

45 75 85

40 50 90

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
Ps-fixado: 15 40 50 45 55 35 75 90 85 80 95 60

Questo 3)
Dado um banco de dados j construdo e composto pelos seguintes campos: nome, cargo
e salrio. Sabendo que ele est organizado segundo uma rvore binria j construda,
escreva um algoritmo que leia o nome de uma pessoa e verifique se ela est presente ou
no na rvore binria. Caso ela esteja presente, escreva um mtodo que calcule e
informe a mdia 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

/* verso 1 utilizando dois mtodos 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 )
ento escreva (esta pessoa no est na rvore)

Paulo Rech Wagner 3 Gabarito Prova P1


seno 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 )
ento retorna 0
seno se ( no.get_info( ).get_cargo( ) = cargo )
ento retorna 1 + conta_cargo(no.get_esq( ),cargo) +
conta_cargo(no.get_dir( ),cargo)
seno 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 )
ento retorna 0
seno se ( no.get_info( ).get_cargo( ) = cargo )
ento retorna no.get_info( ).get_salario( ) +
soma_salario(no.get_esq( ),cargo) + soma_salario(no.get_dir( ),cargo)
seno retorna soma_salario(no.get_esq( ),cargo) +
soma_salario(no.get_dir( ),cargo)

fim

/* verso 2 utilizando um nico mtodo para retornar a contagem e o somatrio */


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 )
ento escreva (esta pessoa no est na rvore)
seno 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 4 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 ( ) : mtodo que retorna o valor do contador
{ retorna cont }
inc_cont ( ) : mtodo que incrementa 1 no contador
{ cont cont + 1 }
real get_soma ( ) : mtodo que retorna o valor do acumulador
{ retorna soma }

acum_soma (real val) : mtodo que acumula o valor val no acumulador


{ soma soma + val }

fim

/* retorna a mdia 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 mdia salarial das pessoas do mesmo cargo */
Algoritmo media_salarial_cargo (NodoAB no, literal cargo, objeto_temporario temp)
inicio
se ( no nulo )
ento inicio
se ( no.get_info( ).get_cargo( ) = cargo )
ento 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

Questo 4)
Escreva um algoritmo que leia (no algoritmo principal) um valor inteiro e verifique se ele
est presente ou no em uma rvore binria de pesquisa (ABP) contendo valores inteiros.
Caso ele esteja presente, escreva um mtodo que retorna e escreva (no algoritmo
principal) a quantidade de valores presentes na ABP que so maiores do que ele. Para
exemplificar, indicar dois valores quaisquer da rvore da questo 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 5 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 )
ento escreva (no est na ABP)
seno inicio
nelem abp.maiores(valor)
escreva (existem , nelem, valores maiores do que , valor)
fim
fim

/* verso 1 algoritmo recursivo */


Algoritmo maiores (inteiro valor)
inicio
retorna maiores(raiz,valor)
fim

Algoritmo maiores (NodoAB no, inteiro valor)


inicio
se (no = nulo)
ento retorna 0
seno se (no.get_info( ).comparar(valor) = -1)
ento retorna 1 + maiores(no.get_esq( ),valor) + maiores(no.get_dir( ),valor)
seno retorna maiores(no.get_esq( ),valor) + maiores(no.get_dir( ),valor)
fim

/* verso 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) faa
inicio
se ( pai.get_info( ).comparar(valor) = -1)
ento cont cont + 1 + tamanho(pai.get_dir( ))
pai acha_pai(pai)
fim
retorna cont
fim

/* verso 3 algoritmo interativo descer at achar. Se no maior, contar direita */


Algoritmo maiores (inteiro valor)
inicio
NodoAB paux
inteiro cont
lgico achei

achei falso

Paulo Rech Wagner 6 Gabarito Prova P1


cont 0
paux raiz
enquanto (no achei) faa
inicio
se (paux.get_info( ).comparar(valor) = 0)
ento inicio
achei verdadeiro
cont cont + tamanho(paux.get_dir( ))
fim
seno se (paux.get_info( ).comparar(valor) = -1)
ento inicio
cont cont + 1 + tamanho(paux.get_dir( ))
paux paux.get_esq( )
fim
seno paux paux.get_dir( )
retorna cont
fim

Paulo Rech Wagner 7 Gabarito Prova P1

Das könnte Ihnen auch gefallen