{"id":6782,"date":"2019-10-11T13:39:18","date_gmt":"2019-10-11T11:39:18","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=6782"},"modified":"2019-10-11T13:39:18","modified_gmt":"2019-10-11T11:39:18","slug":"i1m2019-ejercicios-de-definiciones-con-condicionales-guardas-o-patrones","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2019-ejercicios-de-definiciones-con-condicionales-guardas-o-patrones\/","title":{"rendered":"I1M2019: Ejercicios de definiciones con condicionales, guardas o patrones"},"content":{"rendered":"<p>En la segunda parte de la clase de hoy del curso de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-19\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se han comentado las soluciones de ejercicios de la 2\u00aa relaci\u00f3n sobre definiciones con condicionales, guardas o patrones.<\/p>\n<p>Los ejercicios y sus soluciones se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\n-- ---------------------------------------------------------------------\n-- Introducci\u00f3n                                                       --\n-- ---------------------------------------------------------------------\n\n-- En esta relaci\u00f3n se presentan ejercicios con definiciones elementales\n-- (no recursivas) de funciones que usan condicionales, guardas o\n-- patrones. \n-- \n-- Estos ejercicios se corresponden con el tema 4 que se encuentran en  \n--    http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-19\/temas\/tema-4.html\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 1. Definir la funci\u00f3n \n--    divisionSegura :: Double -> Double -> Double\n-- tal que (divisionSegura x y) es x\/y si y no es cero y 9999 en caso\n-- contrario. Por ejemplo,\n--    divisionSegura 7 2  ==  3.5\n--    divisionSegura 7 0  ==  9999.0\n-- ---------------------------------------------------------------------\n\ndivisionSegura :: Double -> Double -> Double\ndivisionSegura _ 0 = 9999\ndivisionSegura x y = x\/y\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2.1. La disyunci\u00f3n excluyente xor de dos f\u00f3rmulas se\n-- verifica si una es verdadera y la otra es falsa. Su tabla de verdad\n-- es\n--    x     | y     | xor x y\n--    ------+-------+---------\n--    True  | True  | False \n--    True  | False | True\n--    False | True  | True\n--    False | False | False\n--    \n-- Definir la funci\u00f3n \n--    xor1 :: Bool -> Bool -> Bool\n-- tal que (xor1 x y) es la disyunci\u00f3n excluyente de x e y, calculada a\n-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada l\u00ednea\n-- de la tabla. \n-- ---------------------------------------------------------------------\n\nxor1 :: Bool -> Bool -> Bool\nxor1 True  True  = False \nxor1 True  False = True\nxor1 False True  = True\nxor1 False False = False\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2.2. Definir la funci\u00f3n \n--    xor2 :: Bool -> Bool -> Bool\n-- tal que (xor2 x y) es la disyunci\u00f3n excluyente de x e y, calculada a\n-- partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por\n-- cada valor del primer argumento. \n-- ---------------------------------------------------------------------\n\nxor2 :: Bool -> Bool -> Bool\nxor2 True  y = not y\nxor2 False y = y\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2.3. Definir la funci\u00f3n \n--    xor3 :: Bool -> Bool -> Bool\n-- tal que (xor3 x y) es la disyunci\u00f3n excluyente de x e y, calculada \n-- a partir de la disyunci\u00f3n (||), conjunci\u00f3n (&&) y negaci\u00f3n (not). \n-- Usar 1 ecuaci\u00f3n. \n-- ---------------------------------------------------------------------\n\n-- 1\u00aa definici\u00f3n:\nxor3 :: Bool -> Bool -> Bool\nxor3 x y = (x || y) && not (x && y)\n\n-- 2\u00aa definici\u00f3n:\nxor3b :: Bool -> Bool -> Bool\nxor3b x y = (x && not y) || (y && not x)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2.4. Definir la funci\u00f3n \n--    xor4 :: Bool -> Bool -> Bool\n-- tal que (xor4 x y) es la disyunci\u00f3n excluyente de x e y, calculada\n-- a partir de desigualdad (\/=). Usar 1 ecuaci\u00f3n.\n-- ---------------------------------------------------------------------\n\nxor4 :: Bool -> Bool -> Bool\nxor4 x y = x \/= y\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3. Las dimensiones de los rect\u00e1ngulos puede representarse \n-- por pares; por ejemplo, (5,3) representa a un rect\u00e1ngulo de base 5 y \n-- altura 3. \n-- \n-- Definir la funci\u00f3n \n--    mayorRectangulo :: (Num a, Ord a) => (a,a) -> (a,a) -> (a,a)\n-- tal que (mayorRectangulo r1 r2) es el rect\u00e1ngulo de mayor \u00e1rea entre\n-- r1 y r2. Por ejemplo,  \n--    mayorRectangulo (4,6) (3,7)  ==  (4,6)\n--    mayorRectangulo (4,6) (3,8)  ==  (4,6)\n--    mayorRectangulo (4,6) (3,9)  ==  (3,9)\n-- ---------------------------------------------------------------------\n\nmayorRectangulo :: (Num a, Ord a) => (a,a) -> (a,a) -> (a,a)\nmayorRectangulo (a,b) (c,d)\n  | a*b >= c*d = (a,b)\n  | otherwise  = (c,d)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 4. Definir la funci\u00f3n \n--    intercambia :: (a,b) -> (b,a)\n-- tal que (intercambia p)  es el punto obtenido intercambiando las\n-- coordenadas del punto p. Por ejemplo, \n--    intercambia (2,5)  ==  (5,2)\n--    intercambia (5,2)  ==  (2,5)\n-- ---------------------------------------------------------------------\n\nintercambia :: (a,b) -> (b,a)\nintercambia (x,y) = (y,x)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 5. Definir la funci\u00f3n \n--    distancia :: (Double,Double) -> (Double,Double) -> Double\n-- tal que (distancia p1 p2) es la distancia entre los puntos p1 y\n-- p2. Por ejemplo, \n--    distancia (1,2) (4,6)  ==  5.0\n-- ---------------------------------------------------------------------\n \ndistancia :: (Double,Double) -> (Double,Double) -> Double\ndistancia (x1,y1) (x2,y2) = sqrt((x1-x2)**2+(y1-y2)**2)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 6. Definir una funci\u00f3n \n--    ciclo :: [a] -> [a]\n-- tal que (ciclo xs) es la lista obtenida permutando c\u00edclicamente los\n-- elementos de la lista xs, pasando el \u00faltimo elemento al principio de\n-- la lista. Por ejemplo, \n--    ciclo [2,5,7,9]  == [9,2,5,7]\n--    ciclo []         == []\n--    ciclo [2]        == [2]\n-- ---------------------------------------------------------------------\n\nciclo :: [a] -> [a]\nciclo [] = []\nciclo xs = last xs : init xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 7. Definir la funci\u00f3n \n--    numeroMayor :: (Num a, Ord a) => a -> a -> a\n-- tal que (numeroMayor x y) es el mayor n\u00famero de dos cifras que puede\n-- construirse con los d\u00edgitos x e y. Por ejemplo,  \n--    numeroMayor 2 5 ==  52\n--    numeroMayor 5 2 ==  52\n-- ---------------------------------------------------------------------\n\n-- 1\u00aa definici\u00f3n:\nnumeroMayor :: (Num a, Ord a) => a -> a -> a\nnumeroMayor x y = 10 * max x y + min x y\n\n-- 2\u00aa definici\u00f3n:\nnumeroMayor2 :: (Num a, Ord a) => a -> a -> a\nnumeroMayor2 x y\n  | x > y     = 10*x+y\n  | otherwise = 10*y+x\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 8. Definir la funci\u00f3n \n--    numeroDeRaices :: (Floating t, Ord t) => t -> t -> t -> Int\n-- tal que (numeroDeRaices a b c) es el n\u00famero de ra\u00edces reales de la\n-- ecuaci\u00f3n a*x^2 + b*x + c = 0. Por ejemplo,\n--    numeroDeRaices 2 0 3    ==  0\n--    numeroDeRaices 4 4 1    ==  1\n--    numeroDeRaices 5 23 12  ==  2\n-- Nota: Se supone que a es no nulo.\n-- ---------------------------------------------------------------------\n\nnumeroDeRaices :: Double -> Double -> Double -> Int\nnumeroDeRaices a b c | d < 0     = 0\n                     | d == 0    = 1\n                     | otherwise = 2\n    where d = b**2-4*a*c\n\n-- 2\u00aa soluci\u00f3n\nnumeroDeRaices2 :: Double -> Double -> Double -> Int\nnumeroDeRaices2 a b c = 1 + round (signum (b**2-4*a*c))\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9. Definir la funci\u00f3n \n--    raices :: Double -> Double -> Double -> [Double]\n-- tal que (raices a b c) es la lista de las ra\u00edces reales de la\n-- ecuaci\u00f3n ax^2 + bx + c = 0. Por ejemplo, \n--    raices 1 3 2    ==  [-1.0,-2.0]\n--    raices 1 (-2) 1 ==  [1.0,1.0]\n--    raices 1 0 1    ==  []\n-- Nota: Se supone que a es no nulo.\n-- ---------------------------------------------------------------------\n\nraices :: Double -> Double -> Double -> [Double]\nraices a b c \n  | d >= 0    = [(-b+e)\/t,(-b-e)\/t]\n  | otherwise = []\n  where d = b**2 - 4*a*c\n        e = sqrt d\n        t = 2*a\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 10. En geometr\u00eda, la f\u00f3rmula de Her\u00f3n, descubierta por\n-- Her\u00f3n de Alejandr\u00eda, dice que el \u00e1rea de un tri\u00e1ngulo cuyo lados\n-- miden a, b y c es la ra\u00edz cuadrada de s(s-a)(s-b)(s-c) donde s es el\n-- semiper\u00edmetro \n--    s = (a+b+c)\/2\n-- \n-- Definir la funci\u00f3n \n--    area :: Double -> Double -> Double -> Double \n-- tal que (area a b c) es el \u00e1rea del tri\u00e1ngulo de lados a, b y c. Por\n-- ejemplo, \n--    area 3 4 5  ==  6.0\n-- ---------------------------------------------------------------------\n\narea :: Double -> Double -> Double -> Double \narea a b c = sqrt (s*(s-a)*(s-b)*(s-c))\n  where s = (a+b+c)\/2\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 11.1. Los intervalos cerrados se pueden representar mediante\n-- una lista de dos n\u00fameros (el primero es el extremo inferior del\n-- intervalo y el segundo el superior). \n-- \n-- Definir la funci\u00f3n \n--    interseccion :: Ord a => [a] -> [a] -> [a]\n-- tal que (interseccion i1 i2) es la intersecci\u00f3n de los intervalos i1 e\n-- i2. Por ejemplo,\n--    interseccion [] [3,5]     ==  []\n--    interseccion [3,5] []     ==  []\n--    interseccion [2,4] [6,9]  ==  []\n--    interseccion [2,6] [6,9]  ==  [6,6]\n--    interseccion [2,6] [0,9]  ==  [2,6]\n--    interseccion [2,6] [0,4]  ==  [2,4]\n--    interseccion [4,6] [0,4]  ==  [4,4]\n--    interseccion [5,6] [0,4]  ==  []\n-- ---------------------------------------------------------------------\n\ninterseccion :: Ord a => [a] -> [a] -> [a]\ninterseccion [] _ = []\ninterseccion _ [] = []\ninterseccion [a1,b1] [a2,b2]\n  | a <= b    = [a,b]\n  | otherwise = []\n  where a = max a1 a2\n        b = min b1 b2\ninterseccion _ _ = error \"Imposible\"\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 12.1. Los n\u00fameros racionales pueden representarse mediante\n-- pares de n\u00fameros enteros. Por ejemplo, el n\u00famero 2\/5 puede\n-- representarse mediante el par (2,5). \n-- \n-- Definir la funci\u00f3n \n--    formaReducida :: (Int,Int) -> (Int,Int) \n-- tal que (formaReducida x) es la forma reducida del n\u00famero racional\n-- x. Por ejemplo, \n--    formaReducida (4,10)  ==  (2,5)\n--    formaReducida (0,5)   ==  (0,1)\n-- ---------------------------------------------------------------------\n\nformaReducida :: (Int,Int) -> (Int,Int) \nformaReducida (0,_) = (0,1)\nformaReducida (a,b) = (x * signum (a*b), y)\n  where c = gcd a b\n        x = abs (a `div` c)\n        y = abs (b `div` c)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 12.2. Definir la funci\u00f3n \n--    sumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)\n-- tal que (sumaRacional x y) es la suma de los n\u00fameros racionales x e\n-- y, expresada en forma reducida. Por ejemplo, \n--    sumaRacional (2,3) (5,6)  ==  (3,2)\n--    sumaRacional (3,5) (-3,5) ==  (0,1)\n-- ---------------------------------------------------------------------\n\nsumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)\nsumaRacional (a,b) (c,d) = formaReducida (a*d+b*c, b*d)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 12.3. Definir la funci\u00f3n \n--    productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)\n-- tal que (productoRacional x y) es el producto de los n\u00fameros\n-- racionales x e y, expresada en forma reducida. Por ejemplo, \n--    productoRacional (2,3) (5,6)  ==  (5,9)\n-- ---------------------------------------------------------------------\n\nproductoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)\nproductoRacional (a,b) (c,d) = formaReducida (a*c, b*d)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 12.4. Definir la funci\u00f3n \n--    igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool\n-- tal que (igualdadRacional x y) se verifica si los n\u00fameros racionales\n-- x e y son iguales. Por ejemplo, \n--    igualdadRacional (6,9) (10,15)  ==  True\n--    igualdadRacional (6,9) (11,15)  ==  False\n--    igualdadRacional (0,2) (0,-5)   ==  True\n-- ---------------------------------------------------------------------\n\nigualdadRacional :: (Int,Int) -> (Int,Int) -> Bool\nigualdadRacional (a,b) (c,d) = \n  a*d == b*c\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la segunda parte de la clase de hoy del curso de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se han comentado las soluciones de ejercicios de la 2\u00aa relaci\u00f3n sobre definiciones con condicionales, guardas o patrones. Los ejercicios y sus soluciones se muestran a continuaci\u00f3n<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","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":[331],"tags":[],"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\/6782"}],"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=6782"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6782\/revisions"}],"predecessor-version":[{"id":6783,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6782\/revisions\/6783"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=6782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=6782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=6782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}