{"id":1625,"date":"2011-10-19T16:28:15","date_gmt":"2011-10-19T16:28:15","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=1625"},"modified":"2011-10-24T04:27:50","modified_gmt":"2011-10-24T04:27:50","slug":"i1m2011-ejercicios-de-definiciones-elementales-en-haskell-2","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2011-ejercicios-de-definiciones-elementales-en-haskell-2\/","title":{"rendered":"I1M2011: Ejercicios de definiciones elementales en Haskell (2)"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-11\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentado las soluciones a los ejercicios de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2011G1\/images\/0\/0a\/Rel_2.hs\">2\u00aa relaci\u00f3n<\/a>.<\/p>\n<p>Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- I1M 2011-12: Rel_2.hs (15 de Octubre de 2011)\r\n-- Definiciones elementales de funciones.\r\n-- Departamento de Ciencias de la Computaci\u00f3n e I.A.\r\n-- Universidad de Sevilla\r\n-- =====================================================================\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Introducci\u00f3n                                                       --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- En esta relaci\u00f3n se presentan ejercicios con definiciones elementales\r\n-- (no recursivas) de funciones correspondientes al tema 4 cuyas\r\n-- transparencias se encuentran en \r\n--    http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-11\/temas\/tema-4t.pdf\r\n-- En concreto, se estudian funciones para calcular \r\n-- * el m\u00f3dulo de un vector,\r\n-- * el cuadrante de un punto, \r\n-- * el intercambio de coordenadas,\r\n-- * el punto sim\u00e9trico,\r\n-- * las ra\u00edces de las ecuaciones cuadr\u00e1ticas y \r\n-- * la disyunci\u00f3n excluyente,\r\n-- * los finales de una lista,\r\n-- * los segmentos de una lista,\r\n-- * el mediano de 3 n\u00fameros,\r\n-- * la distancia entre dos puntos,\r\n-- * los extremos de una lista,\r\n-- * el punto medio entre otros dos,\r\n-- * la permutaci\u00f3n c\u00edclica de una lista,\r\n-- * el mayor n\u00famero de 2 cifra con dos d\u00edgitos dados,\r\n-- * la propiedad triangular,\r\n-- * la forma reducida de un n\u00famero racional,\r\n-- * la suma de dos n\u00fameros racionales,\r\n-- * el producto de dos n\u00fameros racionales,\r\n-- * la propiedad de igualdad de n\u00fameros racionales,\r\n-- * la suma de dos n\u00fameros complejos,\r\n-- * el producto de dos n\u00fameros complejos y\r\n-- * el conjugado de un n\u00famero complejo.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir la funci\u00f3n modulo tal que (modulo v) es el\r\n-- m\u00f3dulo del vector v. Por ejemplo,\r\n--    modulo (3,4)  ==  5.0\r\n-- ---------------------------------------------------------------------\r\n\r\nmodulo (x,y) = sqrt(x^2+y^2)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n cuadrante tal que (cuadrante p) es\r\n-- es cuadrante del punto p (se supone que p no est\u00e1 sobre los\r\n-- ejes). Por ejemplo,\r\n--    cuadrante (3,5)    ==  1\r\n--    cuadrante (-3,5)   ==  2\r\n--    cuadrante (-3,-5)  ==  3\r\n--    cuadrante (3,-5)   ==  4\r\n-- ---------------------------------------------------------------------\r\n\r\ncuadrante (x,y)\r\n    | x > 0 && y > 0 = 1\r\n    | x < 0 &#038;&#038; y > 0 = 2\r\n    | x < 0 &#038;&#038; y < 0 = 3\r\n    | x > 0 && y < 0 = 4\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir la funci\u00f3n intercambia tal que (intercambia p)\r\n-- es el punto obtenido intercambiando las coordenadas del punto p. Por\r\n-- ejemplo, \r\n--    intercambia (2,5)  ==  (5,2)\r\n--    intercambia (5,2)  ==  (2,5)\r\n-- ---------------------------------------------------------------------\r\n\r\nintercambia (x,y) = (y,x)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la funci\u00f3n simetricoH tal que (simetricoH p) es\r\n-- el punto sim\u00e9trico de p respecto del eje horizontal. Por ejemplo,\r\n--    simetricoH (2,5)   ==  (2,-5)\r\n--    simetricoH (2,-5)  ==  (2,5)\r\n-- ---------------------------------------------------------------------\r\n\r\nsimetricoH (x,y) = (x,-y) \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. (Ra\u00edces de una ecuaci\u00f3n de segundo grado) Definir la\r\n-- funci\u00f3n raices de forma que (raices a b c) devuelve la lista de las\r\n-- raices reales de la ecuaci\u00f3n  ax^2 + bx + c = 0. Por ejemplo, \r\n--    raices 1 (-2) 1 == [1.0,1.0]\r\n--    raices 1 3 2    == [-1.0,-2.0]\r\n-- ---------------------------------------------------------------------\r\n\r\n-- 1\u00aa soluci\u00f3n\r\nraices_1 a b c = [(-b+d)\/t,(-b-d)\/t]\r\n    where d = sqrt (b^2 - 4*a*c)\r\n          t = 2*a\r\n\r\n-- 2\u00aa soluci\u00f3n\r\nraices_2 a b c\r\n    | d >= 0    = [(-b+e)\/(2*a), (-b-e)\/(2*a)]\r\n    | otherwise = error \"No tine raices reales\"\r\n    where d = b^2-4*a*c\r\n          e = sqrt d \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. La disyunci\u00f3n excluyente xor de dos f\u00f3rmulas se verifica\r\n-- si una es verdadera y la otra es falsa.\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.1. Definir la funci\u00f3n xor_1 que calcule la disyunci\u00f3n\r\n-- excluyente a partir de la tabla de verdad. Usar 4 ecuaciones, una por\r\n-- cada l\u00ednea de la tabla.\r\n-- ---------------------------------------------------------------------\r\n\r\nxor_1 :: Bool -> Bool -> Bool\r\nxor_1 True  True  = False \r\nxor_1 True  False = True\r\nxor_1 False True  = True\r\nxor_1 False False = False\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.2. Definir la funci\u00f3n xor_2 que calcule la disyunci\u00f3n\r\n-- excluyente a partir de la tabla de verdad y patrones. Usar 2\r\n-- ecuaciones, una por cada valor del primer argumento.\r\n-- ---------------------------------------------------------------------\r\n\r\nxor_2 :: Bool -> Bool -> Bool\r\nxor_2 True  y = not y\r\nxor_2 False y = y\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.3. Definir la funci\u00f3n xor_3 que calcule la disyunci\u00f3n\r\n-- excluyente a partir de la disyunci\u00f3n (||), conjunci\u00f3n (&&) y negaci\u00f3n\r\n-- (not). Usar 1 ecuaci\u00f3n.\r\n-- ---------------------------------------------------------------------\r\n\r\nxor_3 :: Bool -> Bool -> Bool\r\nxor_3 x y = (x || y) && not (x && y)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.4. Definir la funci\u00f3n xor_4 que calcule la disyunci\u00f3n\r\n-- excluyente a partir de desigualdad (\/=). Usar 1 ecuaci\u00f3n.\r\n-- ---------------------------------------------------------------------\r\n\r\nxor_4 :: Bool -> Bool -> Bool\r\nxor_4 x y = x \/= y\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Definir la funci\u00f3n finales tal que (finales n xs) es la\r\n-- lista formada por los n finales elementos de xs. Por ejemplo,\r\n--    finales 3 [2,5,4,7,9,6]  ==  [7,9,6]\r\n-- ---------------------------------------------------------------------\r\n \r\nfinales n xs = drop (length xs - n) xs \r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8. Definir la funci\u00f3n segmento tal que (segmento m n xs) es\r\n-- la lista de los elementos de xs comprendidos entre las posiciones m y\r\n-- n. Por ejemplo,\r\n--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]\r\n--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]\r\n--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []\r\n-- ---------------------------------------------------------------------\r\n \r\nsegmento m n xs = drop (m-1) (take n xs)\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9. Definir la funci\u00f3n mediano tal que (mediano x y z) es el\r\n-- n\u00famero mediano de los tres n\u00fameros x, y y z. Por ejemplo,\r\n--    mediano 3 2 5  ==  3\r\n--    mediano 2 4 5  ==  4\r\n--    mediano 2 6 5  ==  5\r\n--    mediano 2 6 6  ==  6\r\n-- ---------------------------------------------------------------------\r\n \r\nmediano x y z = x + y + z- minimum [x,y,z] - maximum [x,y,z]\r\n \r\n-- Otra soluci\u00f3n es\r\nmediano' x y z \r\n    | a <= x &#038;&#038; x <= b = x\r\n    | a <= y &#038;&#038; y <= b = y\r\n    | otherwise        = z\r\n    where a = minimum [x,y,z] \r\n          b = maximum [x,y,z]\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10. Definir la funci\u00f3n distancia tal que (distancia p1 p2)\r\n-- es la distancia entre los puntos p1 y p2. Por ejemplo,\r\n--    distancia (1,2) (4,6)  ==  5.0\r\n-- ---------------------------------------------------------------------\r\n \r\ndistancia (x1,y1) (x2,y2) = sqrt((x1-x2)^2+(y1-y2)^2)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 11. Definir la funci\u00f3n extremos tal que (extremos n xs) es\r\n-- la lista formada por los n primeros elementos de xs y los n finales\r\n-- elementos de xs. Por ejemplo, \r\n--    extremos 3 [2,6,7,1,2,4,5,8,9,2,3]  ==  [2,6,7,9,2,3]\r\n-- ---------------------------------------------------------------------\r\n\r\nextremos n xs = take n xs ++ drop (length xs - n) xs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12. Definir la funci\u00f3n puntoMedio tal que (puntoMedio p1 p2) \r\n-- es el punto medio entre los puntos p1 y p2. Por ejemplo,\r\n--    puntoMedio (0,2) (0,6)  ==  (0.0,4.0)\r\n--    puntoMedio (-1,2) (7,6) ==  (3.0,4.0)\r\n-- ---------------------------------------------------------------------\r\n\r\npuntoMedio (x1,y1) (x2,y2) = ((x1+x2)\/2, (y1+y2)\/2)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 13. Definir una funci\u00f3n ciclo que permute c\u00edclicamente los\r\n-- elementos de una lista, pasando el \u00faltimo elemento al principio de la\r\n-- lista. Por ejemplo, \r\n--    ciclo [2, 5, 7, 9]  == [9,2,5,7]\r\n--    ciclo []            == [9,2,5,7]\r\n--    ciclo [2]           == [2]\r\n-- ---------------------------------------------------------------------\r\n\r\nciclo [] = []\r\nciclo xs = last xs : init xs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14. Definir la funcion numeroMayor tal que \r\n-- (numeroMayor x y) es el mayor n\u00famero de dos cifras que puede\r\n-- construirse con los d\u00edgitos x e y. Por ejemplo,  \r\n--    numeroMayor 2 5 ==  52\r\n--    numeroMayor 5 2 ==  52\r\n-- ---------------------------------------------------------------------\r\n\r\nnumeroMayor x y = a*10 + b\r\n    where a = max x y \r\n          b = min x y\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 15. Las longitudes de los lados de un tri\u00e1ngulo no pueden\r\n-- ser cualesquiera. Para que pueda construirse el tri\u00e1ngulo, tiene que\r\n-- cumplirse la propiedad triangular; es decir, longitud de cada lado\r\n-- tiene que ser menor que la suma de los otros dos lados.\r\n-- \r\n-- Definir la funci\u00f3n triangular tal que (triangular a b c) se verifica\r\n-- si a, b y c complen la propiedad triangular. Por ejemplo,\r\n--    triangular 3 4 5   ==  True\r\n--    triangular 30 4 5  ==  False\r\n--    triangular 3 40 5  ==  False\r\n--    triangular 3 4 50  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\ntriangular a b c = a < b+c &#038;&#038; b < a+c &#038;&#038; c < a+b\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16. Los n\u00fameros racionales pueden representarse mediante\r\n-- pares de n\u00fameros enteros. Por ejemplo, el n\u00famero 2\/5 puede\r\n-- representarse mediante el par (2,5). \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.1. Definir la funci\u00f3n formaReducida tal que\r\n-- (formaReducida x) es la forma reducida del n\u00famero racional x. Por\r\n-- ejemplo, \r\n--    formaReducida (4,10)  ==  (2,5)\r\n-- ---------------------------------------------------------------------\r\n\r\nformaReducida (a,b) = (a `div` c, b  `div` c)\r\n    where c = gcd a b\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.2. Definir la funci\u00f3n sumaRacional tal que \r\n-- (sumaRacional x y) es la suma de los n\u00fameros racionales x e y. Por ejemplo,\r\n--    sumaRacional (2,3) (5,6)  ==  (3,2)\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaRacional (a,b) (c,d) = formaReducida (a*d+b*c, b*d)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.3. Definir la funci\u00f3n productoRacional tal que \r\n-- (productoRacional x y) es el producto de los n\u00fameros racionales x e\r\n-- y. Por ejemplo, \r\n--    productoRacional (2,3) (5,6)  ==  (5,9)\r\n-- ---------------------------------------------------------------------\r\n\r\nproductoRacional (a,b) (c,d) = formaReducida (a*c, b*d)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.4. Definir la funci\u00f3n igualdadRacional tal que \r\n-- (igualdadRacional x y) se verifica si los n\u00fameros racionales x e\r\n-- y son iguales. Por ejemplo, \r\n--    igualdadRacional (6,9) (10,15)  ==  True\r\n--    igualdadRacional (6,9) (11,15)  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nigualdadRacional (a,b) (c,d) = \r\n    formaReducida (a,b) == formaReducida (c,d)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 17. Los n\u00fameros complejos pueden representarse mediante\r\n-- pares de n\u00fameros complejos. Por ejemplo, el n\u00famero 2+5i puede\r\n-- representarse mediante el par (2,5). \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 17.1. Definir la funci\u00f3n sumaComplejos tal que \r\n-- (sumaComplejos x y) es la suma de los n\u00fameros complejos x e y. Por\r\n-- ejemplo, \r\n--    sumaComplejos (2,3) (5,6)  ==  (7,9)\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaComplejos (a,b) (c,d) = (a+c, b+d)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 17.2. Definir la funci\u00f3n productoComplejos tal que \r\n-- (productoComplejos x y) es el producto de los n\u00fameros complejos x e\r\n-- y. Por ejemplo, \r\n--    productoComplejos (2,3) (5,6)  ==  (-8,27)\r\n-- ---------------------------------------------------------------------\r\n\r\nproductoComplejos (a,b) (c,d) = (a*c-b*d, a*d+b*c)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 17.3. Definir la funci\u00f3n conjugado tal que (conjugado x) es\r\n-- el conjugado del n\u00famero complejo z. Por ejemplo, \r\n--    conjugado (2,3) ==  (2,-3)\r\n-- ---------------------------------------------------------------------\r\n\r\nconjugado (a,b) = (a,-b)\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas hemos comentado las soluciones a los ejercicios de la 2\u00aa relaci\u00f3n. Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[186],"tags":[295],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1625"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=1625"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1625\/revisions"}],"predecessor-version":[{"id":1630,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1625\/revisions\/1630"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}