Buscar

solucao-lista-B-tenteFazerAntesDeVer-120326-22h46

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

*
*
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
Exercícios resolvidos da lista de Programação Funcional
Somente na solução do III-b, a professora traz mais uma contribuição, explorando recursos de consulta à lista, casamento de padrão e tupla 
*
*
I-A) Calcular a soma de todos os números inteiros consecutivos no intervalo entre dois números inteiros n1 e n2, inclusive.
I-B) Dados dois números inteiros n1 e n2, encontrar os múltiplos de 3 que se encontram nesse intervalo.
*
*
*
*
I-B) Dados dois números inteiros n1 e n2, encontrar os múltiplos de 3 que se encontram nesse intervalo.
*
*
I-B) Dados dois números inteiros n1 e n2, encontrar os múltiplos de 3 que se encontram nesse intervalo.
multN::(Int,Int)->Bool
multN (x,n)
 |(x == n) = True
 |((x>=0) && (x<=(n-1))) = False
 |otherwise = multN (x-n,n)
lista_m_3 :: (Int, Int) -> [Int]
lista_m_3 (a,b) 
|(a > b) = lista_m_3 (b,a)
|(a == b) = if multN (a,3) then [a] else []
| otherwise if multN (b,3) 
	then b: lista_m_3(a, b-1)
	else lista_m_3(a, b-1) 
A solução desta página foi apresentada pela professora 
*
*
modB::(Int,Int)->Int
modB (x,n)
 |(x == n) = 0 
 |((x>=0) && (x<=(n-1))) = x
 |otherwise = modB (x-n,n)
I-B) Dados dois números inteiros n1 e n2, encontrar os múltiplos de 3 que se encontram nesse intervalo.
lista_m_3 :: (Int, Int) -> [Int]
lista_m_3 (a,b) 
|(a > b) = lista_m_3 (b,a)
|(a == b) = if modB(a,3) == 0 then [a] else []
| otherwise if modB(b,3) == 0 
	then b: lista_m_3(a, b-1)
	else lista_m_3(a, b-1) 
A solução desta página foi apresentada pela professora 
*
*
I-B) Dados dois números inteiros n1 e n2, encontrar os múltiplos de m que se encontram nesse intervalo.
Inspire-se no exemplo anterior para múltiplos de 3.
A solução desta página foi apresentada pela professora 
*
*
I-B) Dados dois números inteiros n1 e n2, encontrar os múltiplos de m que se encontram nesse intervalo.
multN::(Int,Int)->Bool
multN (x,n)
 |(x == n) = True
 |((x>=0) && (x<=(n-1))) = False
 |otherwise = multN (x-n,n)
lista_m_m :: (Int,Int,Int) -> [Int]
lista_m_m (a,b,m) 
|(a > b) = lista_m_m (b,a,m)
|(a == b) = if multN (a,m) then [a] else []
| otherwise if multN (b,m) 
	then b: lista_m_m(a, b-1,m)
	else lista_m_m(a, b-1,m) 
A solução desta página foi apresentada pela professora 
*
*
modB::(Int,Int)->Int
modB (x,n)
 |(x == n) = 0 
 |((x>=0) && (x<=(n-1))) = x
 |otherwise = modB (x-n,n)
I-B) Dados dois números inteiros n1 e n2, encontrar os múltiplos de m que se encontram nesse intervalo.
lista_m_m :: (Int, Int, Int) -> [Int]
lista_m_m (a,b,m) 
|(a > b) = lista_m_m (b,a,m)
|(a == b) = if modB(a,m) == 0 then [a] else []
| otherwise if modB(b,m) == 0 
	then b: lista_m_m(a, b-1, m)
	else lista_m_m(a, b-1, m) 
A solução desta página foi apresentada pela professora 
*
*
I-C) Utilizando a função da soma, faça uma função que calcule a multiplicação entre dois números inteiros quaisquer.
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
I-C) Utilizando a função da soma, faça uma função que calcule a multiplicação entre dois números inteiros quaisquer.
multi :: Int->Int->Int
multi a b 
	|(a==0) = 0
	|((a < 0)&&(b > 0))= negate (multi(negate a) b)
	|((a < 0)&&(b < 0)) = multi(negate a)(negate b) 
	| otherwise = b + multi (a-1) b
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
I-D) Seja a expansão ex = 1 + x/1! + x2/2! + ... + xn/n!
Calcule a soma da série para n = 10 termos, testando p/vários valores de x.
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
fatorial :: Float -> Float
fatorial n
	| (n==0) = 1
	| otherwise = n * fatorial (n-1)
serie_e :: Float->Float-> Float
serie_e x n
	|(n == 0) = 1.0
	|otherwise = (x**n)/(fatorial n)+ serie_e x (n-1)
I-D) Seja a expansão ex = 1 + x/1! + x2/2! + ... + xn/n!
Calcule a soma da série para n = 10 termos, testando p/vários valores de x.
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
I-E) Implemente uma função mod (função que retorna o resto da divisão de inteiros). Não deve ser usada a função embutida mod do interpretador. Exemplo:
Main> mod 11 4
3
*
*
I-E) Implemente uma função mod (função que retorna o resto da divisão de inteiros). Não deve ser usada a função embutida mod do interpretador. Exemplo:
Main> mod 11 4
3
modB::(Int,Int)->Int
modB (x,n)
 |(x == n) = 0 
 |((x>=0) && (x<=(n-1))) = x
 |otherwise = modB (x-n,n)
A solução desta página foi apresentada pela professora 
*
*
I-E) Implemente uma função mod (função que retorna o resto da divisão de inteiros). Não deve ser usada a função embutida mod do interpretador. Exemplo:
Main> mod 11 4
3
resto :: Int->Int->Int
resto a b
	| (a < b) = a
	| otherwise = resto (a-b) b
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
I-F) procure implementar a partir do algoritmo de Euclides.
------tirado de http://pt.wikipedia.org/wiki/Algoritmo_de_Euclides ------------
Abaixo segue o algoritmo de Euclides em pseudocódigo.
AlgoritmoDeEuclides(a: inteiro; b: inteiro): inteiro
variáveis 
	divisor: inteiro 
	dividendo: inteiro 
	c: inteiro
início 
	dividendo ← a 
	divisor ← b 
	enquanto resto(dividendo/divisor) ≠ 0 
	início 
		c ← resto(dividendo/divisor) 
		dividendo ← divisor 
		divisor ← c 
	fim-enquanto 
	AlgoritmoDeEuclides ← divisor
fim-função 
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
Continuação de “I-F) procure implementar a partir do algoritmo de Euclides.”
Ele também pode ser expresso utilizando recursividade:
AlgoritmoDeEuclides(a: inteiro; b: inteiro): inteiro
início 
	se b = 0 então 
		AlgoritmoDeEuclides ← a 
	senão 
		AlgoritmoDeEuclides ← AlgoritmoDeEuclides(b,resto(a,b)) 	fim-se
fim-função
 
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
Continuação de “I-F) procure implementar a partir do algoritmo de Euclides.”
Ele também pode ser expresso utilizando recursividade:
AlgoritmoDeEuclides(a: inteiro; b: inteiro): inteiro
início 
	se b = 0 então 
		AlgoritmoDeEuclides ← a 
	senão 
		AlgoritmoDeEuclides ← AlgoritmoDeEuclides(b,resto(a,b)) 	fim-se
fim-função
SOLUÇÃO EM HASKELL:
euclides :: Int->Int->Int
euclides a b
	| (b == 0) = a
	| otherwise = euclides b (mod a b)  
*
*
II-Tuplas - II-A) Apresentada uma base de dados de 10 professores:
base:: Int -> (Int, String, String, Char)
base x
| x == 0 = (1793, “Ana Maria”,	“MESTRE”, ‘F’)
| x == 1 = (1798, “Antonio Sá”,	“MESTRE”, ‘M’)
| x == 2 = (1805, “Bia Smith”,	“DOUTOR”, ‘F’)
| x == 3 = (1837, “Caio Prado”,	“DOUTOR”, ‘M’)
| x == 4 = (1853, “Cristina Lins”,“DOUTOR”, ‘F’)
| x == 5 = (1922, “Davi Matos”,	“DOUTOR”, ‘M’)
| x == 6 = (1939, “Denise Vila”,	“MESTRE”, ‘F’)
| x == 7 = (2003, “Elton Couto”,	“DOUTOR”, ‘M’)
| x == 8 = (2046, “Fernanda Lima”,“MESTRE”, ‘F’)
| x == 9 = (2101, “Gil Mendes”,	“DOUTOR”,‘M’)
| x == 10= (0, “”,		“”, 	 ‘0’)
Construa as funções, que devolvam os seguintes resultados:
i) O número de professores com doutorado na base;
ii) O número de mulheres;
iii) O número de professores com mestrado e do sexo masculino;
iv) O nome do professor com a menor matrícula (admita que possa estar desordenado, devendo então verificar se é o menor entre todos).
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
II-Tuplas - II-A) Apresentada uma base de dados de 10 professores:
base:: Int -> (Int, String, String, Char)
base x
| x == 0 = (1793, “Ana Maria”,	“MESTRE”, ‘F’)
| x == 1 = (1798, “Antonio Sá”,	“MESTRE”, ‘M’)
| x == 2 = (1805, “Bia Smith”,	“DOUTOR”, ‘F’)
| x == 3 = (1837, “Caio Prado”,	“DOUTOR”, ‘M’)
| x == 4 = (1853, “Cristina Lins”,“DOUTOR”, ‘F’)
| x == 5 = (1922, “Davi Matos”,	“DOUTOR”, ‘M’)
| x == 6 = (1939, “Denise Vila”,	“MESTRE”, ‘F’)
| x == 7 = (2003, “Elton Couto”,	“DOUTOR”, ‘M’)
| x == 8 = (2046, “Fernanda Lima”,“MESTRE”, ‘F’)
| x == 9 = (2101, “Gil Mendes”,	“DOUTOR”,‘M’)
| x == 10= (0, “”,		“”, 	 ‘0’)
formacao :: (Int, String, String, Char) -> String
formacao (a,b,c,d) = c
sexo :: (Int, String, String, Char) -> Char
sexo (a,b,c,d) = d
matricula :: (Int, String, String, Char) -> Int
matricula (a,b,c,d) = a
nome :: (Int, String, String, Char) -> String
nome (a,b,c,d) = b
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
II-Tuplas - II-A-I) número de doutores na base:
base:: Int -> (Int, String, String, Char)
base x
| x == 0 = (1793, “Ana Maria”,	“MESTRE”, ‘F’)
| x == 1 = (1798, “Antonio Sá”,	“MESTRE”, ‘M’)
| x == 2 = (1805, “Bia Smith”,	“DOUTOR”, ‘F’)
| x == 3 = (1837, “Caio Prado”,	“DOUTOR”, ‘M’)
| x == 4 = (1853, “Cristina Lins”,“DOUTOR”, ‘F’)
| x == 5 = (1922, “Davi Matos”,	“DOUTOR”, ‘M’)
| x == 6 = (1939, “Denise Vila”,	“MESTRE”, ‘F’)
| x == 7 = (2003, “Elton Couto”,	“DOUTOR”, ‘M’)
| x == 8 = (2046, “Fernanda Lima”,“MESTRE”, ‘F’)
| x == 9 = (2101, “Gil Mendes”,	“DOUTOR”,‘M’)
| x == 10= (0, “”,		“”, 	 ‘0’)
formacao :: (Int, String, String, Char) -> String
formacao (a,b,c,d) = c
ndoutorado :: Int->Int
ndoutorado x
|(formacao (base x)== "") = 0
|(formacao (base x)== "DOUTOR") = 1 + ndoutorado (x+1)
| otherwise = ndoutorado (x+1)
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
II-Tuplas - II-A-ii) número de mulheres na base:
base:: Int -> (Int, String, String, Char)
base x
| x == 0 = (1793, “Ana Maria”,	“MESTRE”, ‘F’)
| x == 1 = (1798, “Antonio Sá”,	“MESTRE”, ‘M’)
| x == 2 = (1805, “Bia Smith”,	“DOUTOR”, ‘F’)
| x == 3 = (1837, “Caio Prado”,	“DOUTOR”, ‘M’)
| x == 4 = (1853, “Cristina Lins”,“DOUTOR”, ‘F’)
| x == 5 = (1922, “Davi Matos”,	“DOUTOR”, ‘M’)
| x == 6 = (1939, “Denise Vila”,	“MESTRE”, ‘F’)
| x == 7 = (2003, “Elton Couto”,	“DOUTOR”, ‘M’)
| x == 8 = (2046, “Fernanda Lima”,“MESTRE”, ‘F’)
| x == 9 = (2101, “Gil Mendes”,	“DOUTOR”,‘M’)
| x == 10= (0, “”,		“”, 	 ‘0’)
sexo :: (Int, String, String, Char) -> Char
sexo (a,b,c,d) = d
nfeminino :: Int->Int
nfeminino x
	| (sexo (base x) == '0') = 0
	| (sexo (base x) == 'F') = 1 + nfeminino (x+1)
	| otherwise = nfeminino (x+1)
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
II-Tuplas - II-A-IV-iii) número de mestres do sexo masculino:
base:: Int -> (Int, String, String, Char)
base x
| x == 0 = (1793, “Ana Maria”,	“MESTRE”, ‘F’)
| x == 1 = (1798, “Antonio Sá”,	“MESTRE”, ‘M’)
| x == 2 = (1805, “Bia Smith”,	“DOUTOR”, ‘F’)
| x == 3 = (1837, “Caio Prado”,	“DOUTOR”, ‘M’)
| x == 4 = (1853, “Cristina Lins”,“DOUTOR”, ‘F’)
| x == 5 = (1922, “Davi Matos”,	“DOUTOR”, ‘M’)
| x == 6 = (1939, “Denise Vila”,	“MESTRE”, ‘F’)
| x == 7 = (2003, “Elton Couto”,	“DOUTOR”, ‘M’)
| x == 8 = (2046, “Fernanda Lima”,“MESTRE”, ‘F’)
| x == 9 = (2101, “Gil Mendes”,	“DOUTOR”,‘M’)
| x == 10= (0, “”,		“”, 	 ‘0’)
formacao :: (Int, String, String, Char) -> String
formacao (a,b,c,d) = c
sexo :: (Int, String, String, Char) -> Char
sexo (a,b,c,d) = d
nmestradomasculino :: Int -> Int
nmestradomasculino x
	| (sexo (base x) == '0') = 0
	| ((sexo (base x) == 'M') && (formacao (base x) == "MESTRE")) = 1 + nmestradomasculino (x+1)
	| otherwise = nmestradomasculino (x+1)
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
II-Tuplas - II-A-IV-iv) nome do professor de menor matrícula, admitindo base desordenada:
base:: Int -> (Int, String, String, Char)
base x
| x == 0 = (1793, “Ana Maria”,	“MESTRE”, ‘F’)
| x == 1 = (1798, “Antonio Sá”,	“MESTRE”, ‘M’)
| x == 2 = (1805, “Bia Smith”,	“DOUTOR”, ‘F’)
| x == 3 = (1837, “Caio Prado”,	“DOUTOR”, ‘M’)
| x == 4 = (1853, “Cristina Lins”,“DOUTOR”, ‘F’)
| x == 5 = (1922, “Davi Matos”,	“DOUTOR”, ‘M’)
| x == 6 = (1939, “Denise Vila”,	“MESTRE”, ‘F’)
| x == 7 = (2003, “Elton Couto”,	“DOUTOR”, ‘M’)
| x == 8 = (2046, “Fernanda Lima”,“MESTRE”, ‘F’)
| x == 9 = (2101, “Gil Mendes”,	“DOUTOR”, ‘M’)
| x == 10= (0, “”,		“”, 	 ‘0’)
menor::Int -> String
menor x |(matricula (base x) == 0) = menor(x-1)
|(x==0) = x
|(matricula(base x) < menor(x-1)) = x
| otherwise = menor (x-1)
nome_menor_matr::Int->String
nome_menor_matr x | x > 10 = “”
| otherwise = nome (base menor (x))
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho e professora 
*
*
II-B) Construa uma função que dada uma letra qualquer minúscula, devolva uma tupla-3 (tripla) com os três campos: a letra lida, a letra maiúscula correspondente, o número ASCII da letra lida.
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
II-B) Construa uma função que dada uma letra qualquer minúscula, devolva uma tupla-3 (tripla) com os três campos: a letra lida, a letra maiúscula correspondente, o número ASCII da letra lida.
letra:: Char -> (Char,Char,Int)
letra x
|(x>='a')&&(x<='z') = (x,map_toUpper(x),fromEnum(x))
|otherwise = (' ',' ',-1)
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
*
*
III – LISTAS
III-A) Defina uma função, dada uma lista numérica, retorne uma tupla-2, tal que contenha o maior valor da lista, bem como sua posição relativa.
Exemplo: maior [11, 51, 2, 3, 4]
Saída: (51,2) - - > maior é o 51 e sua posição é 2.
*
*
valor_maior::(Int,Int) -> Int
valor_maior (valor,posicao) = valor
posicao_maior::(Int,Int) -> Int
posicao_maior (valor,posicao) = posicao
maior :: [Int] -> (Int,Int)
maior [a] = (a,1)
maior (a:x)
	| (a > valor_maior(maior(x))) = (a,1)
	| otherwise = (valor_maior(maior(x)),posicao_maior(maior(x))+1)
III – LISTAS
III-A) Defina uma função, dada uma lista numérica, retorne uma tupla-2, tal que contenha o maior valor da lista, bem como sua posição relativa.
Exemplo: maior [11, 51, 2, 3, 4]
Saída: (51,2) - - > maior é o 51 e sua posição é 2.
*
*
III – LISTAS
III-B) Defina uma função que converta uma lista de números (entre 0 e 9), em uma outra lista, cujo elemento é do tipo string, que é o nome pelo qual se chama o número. 
Para isso, conte com esse dicionário, que pode ser consultado:
dic_10 = [(0,”zero”), (1,”um”), (2,”dois”), (3,”tres”), (4,”quatro”), (5,”cinco”), (6,”seis”), (7,”sete”), (8,”oito”), (9,”nove”)]
Protótipo: conv_int_str :: [Int] -> [String]
Entrada: [2, 5, 0]
Saída: [“dois”, “cinco”, “zero”]
*
*
III-B) Defina uma função que converta uma lista de números (entre 0 e 9), em uma outra lista, cujo elemento é do tipo string, que é o nome pelo qual se chama o número. Para isso, conte com esse dicionário, que pode ser consultado:
dic_10 = [(0,”zero”), (1,”um”), (2,”dois”), (3,”tres”), (4,”quatro”), (5,”cinco”), (6,”seis”), (7,”sete”), (8,”oito”), (9,”nove”)]
Protótipo: conv_int_str :: [Int] -> [String]
conv_int_string::[Int] -> [String]
conv_int_string [a]
	| (a == 0) = ["zero"]
	| (a == 1) = ["um"]
	| (a == 2) = ["dois"]
	| (a == 3) = ["tres"]
	| (a == 4) = ["quatro"]
	| (a == 5) = ["cinco"]
	| (a == 6) = ["seis"]
	| (a == 7) = ["sete"]
	| (a == 8) = ["oito"]
	| (a == 9) = ["nove"]
	| otherwise = []
conv_int_string(a:x) = conv_int_string [a] ++conv_int_string x
Entrada: [2, 5, 0]
Saída: [“dois”, “cinco”, “zero”]
As soluções aqui contidas foram apresentadas pelo aluno Paulo Vítor de Souza Coutinho 
Há uma outra solução na pág. seguinte que explora os resursos de:
tupla, casamento de padrão, consulta a uma lista
*
*
III-B) Defina uma função que converta uma lista de números (entre 0 e 9), em uma outra lista, cujo elemento é do tipo string, que é o nome pelo qual se chama o número. Para isso, conte com esse dicionário, que pode ser consultado:
selecNumero ::(Int, String) -> Int
selecNumero (n,e) = n
selecPorExtenso ::(Int, String) -> String
selecPorExtenso (n,e) = e
dic_10 = [(0,”zero”), (1,”um”), (2,”dois”), (3,”tres”), (4,”quatro”), (5,”cinco”), (6,”seis”), (7,”sete”), (8,”oito”), (9,”nove”)]
par :: (Int, [(Int, String)]) -> (Int, String)
par (x, []) = (-1, “lista vazia”)
par (x, (a:b)) 
|(x < 0 || x > 9) = (-1,”numero errado”)
| (x == (selecNumero a)) = a
| otherwise = par (x, b)
conv_int_str :: [Int] -> [String]
conv_int_string [] = []
conv_int_string (w:v) = 
(selecPorExtenso(par(w,dic_10)))++ conv_int_string v
Entrada: [2, 5, 0]
Saída: [“dois”, “cinco”, “zero”]
Nesta solução, apresentada pela professora, são explorados os recursos de: tupla, casamento de padrão, consulta a uma lista

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais