Baixe o app para aproveitar ainda mais
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
Compartilhar