• Nenhum resultado encontrado

2ª Lista de Exercícios de Paradigmas de Linguagens Computacionais Professor: Fernando Castor Monitores: Agay Borges (abn), Cleivson Siqueira (csa3), Dennis Silveira (dwas), Eduardo Rocha (ejfrf), Lívia Vilaça (lcjbv), Lucas Inojosa (licf), Luís Gabriel Li

N/A
N/A
Protected

Academic year: 2019

Share "2ª Lista de Exercícios de Paradigmas de Linguagens Computacionais Professor: Fernando Castor Monitores: Agay Borges (abn), Cleivson Siqueira (csa3), Dennis Silveira (dwas), Eduardo Rocha (ejfrf), Lívia Vilaça (lcjbv), Lucas Inojosa (licf), Luís Gabriel Li"

Copied!
6
0
0

Texto

(1)

2ª Lista de Exercícios de Paradigmas de Linguagens Computacionais Professor: Fernando Castor

Monitores: Agay Borges (abn), Cleivson Siqueira (csa3),

Dennis Silveira (dwas), Eduardo Rocha (ejfrf),

Lívia Vilaça (lcjbv), Lucas Inojosa (licf), Luís Gabriel Lima (lgnfl),

Walter Ferreira (wflf), Wellington Oliveira (woj)

CIn-UFPE – 2011.1 Disponível desde: 14/04/2011

Entrega: 05/05/2011

A lista deverá ser respondida em dupla. A falha em entregar a lista até a data estipulada implicará na perda de 0,25 ponto na média da disciplina para os membros da dupla. Considera-se que uma lista na qual menos que 42%(5 questões) das respostas estão corretas não foi entregue. A entrega da lista com pelo menos 83%(10 questões) das questões corretamente respondidas implica em um acréscimo de 0,125 ponto na média da disciplina para os membros da dupla. Se qualquer situação de cópia de respostas for identificada, os membros de todas as duplas envolvidas perderão 0,5 ponto na média da disciplina. O mesmo vale para respostas obtidas a partir da Internet. As respostas deverão ser entregues exclusivamente em formato texto ASCII (nada de .pdf, .doc, .docx ou .odt) e deverão ser enviadas para o monitor responsável por sua dupla, sem cópia para o professor. Tanto podem ser organizadas em arquivos separados, um por questão (e, neste caso, deverão ser zipadas), quanto em um único arquivo texto onde a resposta de cada questão está devidamente identificada e é auto-contida (uma parte da resposta de uma questão que seja útil para responder uma outra deve estar duplicada neste última).

1) Construa um tipo algébrico Valor para representar valores dos tipos: ValorInt,

ValorFloat, ValorString, ValorChar onde cada construtor deve ter um valor que depende

do seu tipo (Ex: ValorFloat deve ter um Float).

Faça também uma função plus :: Valor -> Valor -> Valor que realiza uma soma genérica definida da seguinte forma:

1- A aplicação de ValorString com qualquer outro Valor deve retornar um ValorString concatenando-se os dois valores;

2- A aplicação de ValorChar com outro ValorChar deve retornar um ValorString correspondendo a concatenação dos dois caracteres;

3- A aplicação de um ValorChar com um ValorFloat ou ValorInt deve retornar o respectivo tipo numérico adicionado do valor do char na tabela ASC II;

4- A aplicação de um ValorFloat com um ValorInt deve retornar um ValorFloat da soma dos valores;

5- A aplicação de valores de mesmo tipo deve retornar um novo valor deste tipo.

-Exemplos:

Prelude> plus (ValorChar 'P') (ValorInt 24)

ValorInt 104

Prelude> plus (ValorInt 10) (ValorFloat 12.3)

(2)

Prelude> plus (ValorString "PLC") (ValorFloat 3.7)

ValorString "PLC3.7"

2) Defina uma função completeBinaryTree :: [Valor] -> Tree Valor. Essa função deve retornar uma árvore binária completa preenchida pelos valores contidos na lista de Valor(tipo algébrico definido na questão anterior). A inserção na árvore deve respeitar a ordem que em que os valores aparecem na lista. Uma árvore binária completa é definida da seguinte forma: Todos os níveis da árvore, exceto talvez o último, estão completamente preenchidos por nós e no último nível os nós ficam o mais à esquerda possível.

-Exemplo:

Prelude> let c = [(ValorInt 10),(ValorFloat 12.3), (ValorString "PLC"),

(ValorString "Teste"), (ValorChar 'a'), (ValorInt 34), (ValorChar 'b'), (ValorFloat 23.6), (ValorString "IF686")]

Prelude> completeBineryTree c

No (ValorInt 10) (No (ValorFloat 12.3) (No (ValorString "Teste") (No (ValorFloat 23.6) Empty Empty) (No (ValorString "IF686") Empty Empty)) (No (ValorChar 'a') Empty Empty)) (No (ValorString "PLC") (No (ValorInt 34) Empty Empty) (No

(ValorChar 'b') Empty Empty))

3) Crie um tipo algébrico Poliedro que represente sólidos geométricos regulares. Este deve possuir construtores que representem uma Pirâmide (regular de base triangular), um Cubo e uma Esfera, estes devem possuir informações suficientes para o cálculo de seus volumes (cm³). Crie uma instância para a classe Eq de tal forma que se possa afirmar que um Poliedro é equivalente a outro se estes possuírem o mesmo volume, independente de serem da mesma forma ou não. Obs.: Como cálculo de volume resulta frequentemente em números quebrados, considere que volumes que diferenciem em até 1cm³ são equivalentes.

-Exemplo:

Prelude>(==) (Piramide 8.15) (Cubo 4.0)

True

4) Defina uma estrutura de dados Grafo t (um grafo orientado) com tipo algébrico polimórfico. Defina uma função popularGrafo :: Eq t => [t] -> [(t,t)] -> Grafo t, que recebe uma lista de vértices, uma lista de arestas no formato (origem, destino) e retorna um novo Grafo. Agora defina uma função buscaEmLargura :: Eq t => Grafo t -> t -> t -> Int que recebe um grafo, o vértice inicial, o vértice final e retorna quantas arestas precisam ser percorridas para sair do primeiro vértice e chegar ao último através do grafo. Se não for possível chegar, a função deve devolver -1. Se a origem for a mesma do destino, 0 passos são necessários. A função é auto explicativa, deverá usar o algoritmo de busca em largura e o tipo t deverá ser comparável. No grafo não deverá haver nós repetidos/iguais, de forma que se você comparar um com outro diferente dentro do grafo (==), nunca resulte em True.

-Exemplos:

Prelude> let grafo = popularGrafo [1,2,3,4] [(1,2), (1,3), (3,4)] Prelude> buscaEmLargura grafo 1 4

(3)

Prelude> let grafo = popularGrafo [1,2,3,4] [(1,2), (1,3), (4,2), (4,1)] Prelude> buscaEmLargura grafo 2 4

Prelude> -1

5) Modificando a definição de Grafo da questão anterior para que a mesma passe a incluir pesos positivos nas arestas (a função popularGrafo torna-se "popularGrafo :: Eq t => [t] -> [(t,t,Int)] -> Grafo t"), resolva o mesmo problema (custo do menor caminho), agora com o algoritmo de dijkstra.

-Exemplo:

Prelude> let grafo = popularGrafo [1,2,3,4] [(1,2,5), (1,3,7), (3,4,3)] Prelude> buscaEmLargura grafo 1 4

Prelude> 10

Prelude> let grafo = popularGrafo [1,2,3,4] [(1,2,5), (1,3,7), (4,2,3), (4,1)] Prelude> buscaEmLargura grafo 2 4

Prelude> -1

6) Defina os tipos algébricos polimórficos Ponto t, Reta t e Circunferencia t. Ponto t deve possuir uma tupla de valores do tipo t, onde o primeiro elemento é a posição da coordenada x de um ponto e o segundo elemento é a posição da coordenada y. Circunferencia t deve possuir um valor do tipo t e um Ponto t. Reta t deve possuir dois valores Ponto t.

Defina também um tipo algébrico Resultado. Este tipo pode ser Secante (para uma reta que passa em dois pontos da circunferência), Tangente (para uma reta que passa por um ponto da circunferência) ou Externa (para uma reta que não passa pela circunferência).

Crie uma função chamada posicaoRelativaReta :: Circunferencia Float -> Reta Float -> Resultado, que deve retornar qual dos valores do tipo Resultado a reta informada pertence, quando comparada com a circunferência informada dentro de um plano cartesiano. Crie ainda as funções polimórficas criarCircunferencia :: t -> (t, t) -> Circunferencia t que recebe o raio e o centro da circunferência; e criarReta :: (t, t) -> (t, t) -> Reta t, que recebe dois dos pontos de uma reta. As duas funções acima serão os parâmetros de posicaoRelativaReta e devem definir os valores para os respectivos tipos algébricos retornados.

Ainda defina uma classe, cuja assinatura deve possuir uma função chamada exibir, que recebe o tipo pertencente a essa classe como argumento e retorna uma String. Crie uma instância dessa classe para Resultado, de modo que imprima o valor correspondente do tipo Resultado na tela, com o carácter de exclamação ao final.

-Exemplo:

Prelude> exibir (posicaoRelativaReta (criarCircunferencia 4 (-3,-2)) (criarReta

(0,2) (4,-1))) "Externa!"

Prelude> exibir (posicaoRelativaReta (criarCircunferencia 5 (1,2)) (criarReta

(4)

7) Determine o tipo de cada uma das funções abaixo, mostrando os passos até obter o resultado. Se for preciso, identifique as classes dos parâmetros polimórficos. Caso não seja possível determinar o tipo, explique o porquê.

a)map.foldr (+)

b) map.map.foldr.foldr c)filter.map

d) foldr ((.) map (+)) e) foldr.foldr.foldr

8) Alguns sites de downloads utilizam protetores de links daqueles que pedem para cadastrar um celular antes de poder fazer o download. Porém, esses protetores na maioria das vezes simplesmente recebem o site de destino como parâmetro da URL e redirecionam após o cadastro do celular. Seu trabalho é criar uma função extractURL que receba o nome de um arquivo que contém vários links protegidos e criar um arquivo com os links de destino.

Observação, o link de destino pode ou não vir invertido, e o site do protetor de links não é sempre o mesmo

-Exemplo:

Arquivo de Entrada:

http://www.protetordelinks.com/link/?url=http://www.megaupload.com/?d=E34ZP1CO http://www.loadbr.info/link/?url=OC1PZ43E=d?/moc.daolpuagem.www//:ptth

Arquivo de Saida:

http://www.megaupload.com/?d=E34ZP1CO http://www.megaupload.com/?d=E34ZP1CO

9) Implemente um tipo algébrico AVLTree t e uma função insert :: (Ord t) => AVLTree t -> t -> AVLTree t que insere elementos em uma árvore AVL de modo que o retorno seja sempre uma árvore auto balanceada. Faça também uma instanciação da classe Show para o tipo AVLTree t para possibilitar, a partir de uma árvore AVL, obter-se uma representação em forma de string de seus elementos alinhados em pré-ordem.

Seu programa deve também ler de um arquivo "input.txt" sequências de inteiros separadas por "#" e, para cada inteiro, imprimir na saída padrão o estado atual da árvore em pré-ordem.

-Exemplo:

- Entrada: 8

(5)

25 30 27 22 87 90

#

- Saída: Caso #1: .

8. 8,54. 8,4,54. 8,4,54,99. 8,4,54,24,99. 54,8,4,24,99,70. 54,8,4,24,44,99,70.

Caso #2: .

50. 50,35. 50,35,65. 50,35,65,80. 50,35,75,65,80. 65,50,35,75,72,80. 65,35,25,50,75,72,80. 65,35,25,30,50,75,72,80. 65,35,27,25,30,50,75,72,80. 65,27,25,22,35,30,50,75,72,80. 65,27,25,22,35,30,50,75,72,80,87. 65,27,25,22,35,30,50,75,72,87,80,90.

10) Defina uma função volumeCaixa :: String -> [(String, String, Integer, Float)] -> [(String, Float)] que recebe dois parâmetros, uma string que representa a Cor de uma caixa e uma lista que contém tuplas no formato (Número de registro, Cor, Altura, Área da base) e que representa todos as caixas armazenadas. Essa função deve retornar uma lista que contém todas as caixas na cor determinada e os seus respectivos volumes. A resposta deve ser dada no formato (Nome, Volume) e ordenada de forma decrescente em relação ao volume. Obs.: A Altura esta em decímetros, a Área da base em decímetros quadrados e o Volume deve ser dado em litros.

-Exemplo:

Prelude> volumeCaixa "azul" [(111,"azul", 6, 3),(112,"rosa", 13,

10),(113,"amarelo", 12, 6),(114,"lilas", 4, 10),(108,"azul", 5, 11),(5,"roxo", 10, 3),(13,"azul", 7, 3),(7,"amarelo", 10, 3)]

[(108,55.0),(13,21.0),(111,18.0)]

Prelude> volumeCaixa "marrom" [(111,"azul", 6, 3),(112,"rosa", 13,

10),(113,"amarelo", 12, 6),(114,"lilas", 4, 10),(108,"azul", 5, 11),(5,"roxo", 10, 3),(13,"azul", 7, 3),(7,"amarelo", 10, 3)]

[]

Prelude> volumeCaixa "amarelo" [(111,"azul", 6, 3),(112,"rosa", 13,

10),(113,"amarelo", 12, 6),(114,"lilas", 4, 10),(108,"azul", 5, 11),(5,"roxo", 10, 3),(13,"azul", 7, 3),(7,"amarelo", 10, 3)]

(6)

11) Defina a funcao getFunction que recebe como parametros uma lista de lista l, um Int x e uma funcao binaria f e retorna uma funcao g. A funcao g deve ter como parametro um y e como retorno uma lista de listas s, que devera ser formada pela aplicação da funcao f a cada elemento das listas que fazem parte de l que tiverem a media dos elementos pares menor que o parametro x. Faca a funcao getfunction de forma mais generica possivel.

-Exemplo:

Prelude> getFunction [[1,2,3,4,5],[0,2,4,6],[0,1,8,3,0,0]] 2 (*) ) 6

[[6,12,18,24,30],[0,12,24,36]]

Prelude> getFunction [[1,3,5],[8,8,8,8,8],[0,6],[]] 6 (\x y-> (x,y)) ) 13

[[(1,12),(3,13),(5,13)],[(0,13),(6,13)],[]]

12) Crie uma estrutura de dados polimórfica ArvoreBinaria t u (Uma árvore binária simples em que cada nó contenha uma função t -> u, ou seja, uma árvore de funções!). Crie também um tipo ArvoreBinaria u, uma árvore de elementos do tipo u. Agora crie uma função povoarArvore :: [(t -> u, Int)] -> (ArvoreBinaria t u) que gera uma árvore binária com os elementos que estão na primeira posição da tupla na lista passada.

Mas para que serve esse segundo elemento Int afinal? É uma espécie de "identificação" para cada elemento da lista, e serve para dizer a posição em que irá se inserir o elemento função na árvore. Os menores vão para a esquerda e os maiores para direita (vocês lembram de algoritmos, né? Inserção em árvore binária). Os elementos deverão ser inseridos na mesma ordem da lista, com sua posição determinada pelo seu identificador em relação aos nós já existentes na árvore. Não deverá ser passado identificadores repetidos na função de povoamento. Agora crie uma função gerarArvoreResultante :: ArvoreBinaria t u -> t -> ArvoreBinaria u, a qual passa o parâmetro recebido do tipo t em cada função t -> u que compõe a árvore, e gera uma nova árvore de elementos do tipo u, com o resultado da função. A estrutura dessa nova árvore será idêntica à da primeira, porém com os elementos calculados pela função.

Obs.: Obviamente a árvore não vai sair bonitinha assim; vai sair conforme a sua estrutura de dados.

-Exemplo:

Prelude> let arvore = povoarArvore [(\x > 2*x, 1), (\x > 3*x, 4), (\x > x*x,

-1), (\x -> x-5, 3), (\x -> 2/x+2, 2)]

Prelude> gerarArvoreResultante arvore 5

Referências

Documentos relacionados

Inicialmente se faz necessário para o andamento harmônico do estudo, entender que é dever do Estado garantir a mantença das satisfações das necessidades coletivas, através de um

qual bloco e endereço da memória corresponde cada dado contido no cache... endereço de memória número da linha bloco rót ulo C−1 2 1 0 tamanho do bloco (K palavras)

14) Seu Zé possui uma fábrica de chocolates muito boa, só que infelizmente, a demanda da fábrica é muito grande e ele não consegue supri-la. Sabendo disso, Seu Zé,

A netnografia, como proposta de investigação na Internet, enriquece as vertentes do enfoque de inovações e melhoramento social que promovem os métodos ativos e

A Arteris iniciou o ano com investimentos totais de R$ 427,5 milhões neste 1T15, o que inclui os valores direcionados para obras de infraestrutura em todas as rodovias

Parágrafo Quarto - Caso o FUNDO venha a investir em fundos geridos por terceiros não ligados ao ADMINISTRADOR ou à GESTORA, cujas políticas de investimento

a) Se o requerimento do pedido de baixa de registro for protocolizado até a data do vencimento da anuidade do ano em curso, a mesma não será devida;.. b) Após a data do vencimento

Na mensagem recebida você encontrará um link direto para a página de aceitação ou recusa da revisão, um link para seu ESPAÇO PESSOAL DE REVISOR, onde deve realizar a