Herramientas de usuario

Herramientas del sitio


introalg:problemas08

¡Esta es una revisión vieja del documento!


Problemario del taller de Haskell

Funciones Simples

  • Definir una función entre0y9.n, entre0y9 : Int → Bool que, dado un entero, devuelve True si el entero se encuentra entre 0 y 9.
probar con 0, 3, 5 y 9
  • Definir una función rangoEdad.x, rangoEdad : Int → String que dado un número x que representa la edad de una persona, retorne “joven” si la persona es menor de 35, “adulto” si la persona es menor de 65 pero mayor de 35, y “mayor” si la persona es mayor de 65.
probar con 20, 35, 40, 65, 70 y -30.
  • Definir una función segundo3.(x,y,z), segundo3 : (Int,Int,Int) → Int, que dada una tresupla de enteros devuelve su segundo elemento.
probar con (0,8,2) y con (3,3,3).
  • Definir una función mayor3.(x,y,z), mayor3 : (Int,Int,Int) → (Bool,Bool,Bool), que, dada una una tresupla de enteros, devuelve una tresupla de booleanos que indica si cada uno de los enteros es mayor que 3. Por ejemplo: mayor3.(1,4,3) → (False,True,False) ; mayor3.(5,1984,6) → (True,True,True).
probar con (1,2,3), (-5,8,73490), (3,3,3).
  • Definir una función ordena.(x,y), ordena : (Int,Int) → (Int,Int) que, dados dos enteros, los ordena de menor a mayor.
probar con (0,1), (2,2), (3,1).
  • Definir una función ambospositivos.x.y, ambospositivos : Int → Int → Bool, que dados dos enteros devuelve True si los dos son positivos.
probar con 5 y 9, con -8 y 9, con -10 y -1, con 0 y 0 y con 0 y 3
  • Definir una función averaver.(x,y,z), averaver : (Int,Int,Int) → (Int,Int,Int) que, dada una tresupla de enteros, si todos son positivos, invierte su orden, si todos son negativos, los cambia a positivos, y en cualquier otro caso, devuelve la misma tresupla. Ayuda: usar otherwise.
probar con (1,2,3), (-1,-2,-3), (1,1,1), (-1,2,-3).
  • Definir una función rangoPrecio.x, rangoPrecio : Int → String que dado un número x que representa el precio de una computadora, retorne “muy barato” si el precio es menor a 2000, “demasiado caro” si el precio es mayor que 5000, “hay que verlo bien” si el precio está entre 2000 y 5000, y “esto no puede ser!” si x es negativo.
probar con 1523, 2000, 5000, 5001, -3000, 2001 y 1999
  • Definir una función absoluto.x, absoluto : Int → Int que dado un entero x, retorne su valor absoluto.
probar con 3, -5 y 0.
  • Definir una función signo.x, signo : Int → Int que dado un entero x, retorne su signo, de la siguiente forma: retornará 1 si x es positivo, -1 si es negativo y 0 en cualquier otro caso.
probar con -8, 3 y 0.
  • Definir la función esMultiplo2.n, esMultiplo2 : Int → Bool que dado un entero n devuelve True si n es múltiplo de 2. Ayuda: usar 'mod', el operador que devuelve el resto de la división.
probar con 2, 0 y 5.
  • Definir una función rangoPrecioParametrizado.x.(menor,mayor), rangoPrecioParametrizado : Int → (Int,Int) → String que dado un número x que representa el precio de un producto, un par (menor,mayor) que represente el rango de precios que uno espera encontrar, retorne “muy barato” si x está por debajo del rango, “demasiado caro” si está por arriba del rango, “hay que verlo bien” si el precio está en el rango, y “esto no puede ser!” si x es negativo.
probar con 50 (30,200), 30 (30,200), -40 (200,1000), 50 (200,30), 200 (30,200), 201 (30,200).
  • Definir la función esMultiplo.n.m, esMultiplo : Int → Int → Bool que dado un entero n devuelve True si n es múltiplo de m.
probar con 2 y 2, 0 y 3, 3 y 0 y 5 y 3.
  • Definir la función cabeza.xs, cabeza : [a] –> a, que devuelve el primer elemento de una lista.
probar con [1,2,3], con [3,3,3] y con [].
  • Definir la función cola.xs, cola : [a] –> [a], que devuelve toda la lista menos el primer elemento.
probar con [1,2,3], con [3,3,3] y con [].
  • Definir una función esVaciaOPrimer0.xs, esVaciaOPrimer0 : [a] → Bool que dada una lista xs decida si xs es vacía o bien su primer elemento es 0.
probar con [1,2,3], con [3,3,3], con [0], con [0,1] y con [].

Un poco más complicadas...

  • Definir el predicado bisiesto : Int → Bool que determina si un año es bisiesto. Recordar que los años bisiestos son aquellos que son divisibles por 4 pero no por 100, a menos que también lo sean por 400. Por ejemplo 1900 no es bisiesto pero 2000 sí lo es.
probar con 1984, 1985, 1900 y 2000.
  • Definir la función edad con los siguientes tipos edad : (Int, Int, Int) → (Int, Int, Int) → Int que, dadas dos fechas, indica los años transcurridos entre ellas. Por ejemplo edad.(20, 10, 1968).(30, 4, 1987) = 18.

Suponer que las fechas son correctas (no puede ser que aparezca un (32,15,1999)) y el primer argumento es menor que el segundo.

probar con (16,4,1980) y (17,5,1992), (16,4,1980) y (14,5,1992), y con (16,4,1980) y (15,4,1992).

Para usar Definiciones Locales

  • Completar la función area.h.b.d area : Int → Int → Int → Int que calcula el área de un prisma rectangular:

area.h.b.d = 2*frente + 2*lado + 2*tapa

         where
            frente = ...
            lado   = ...
            tapa = ...

donde h es su altura, b es su ancho y d su profundidad, y donde frente, lado y tapa son las áreas de las caras frontal, lateral y superior, respectivamente.

  • Completar la función raices.a.b.c raices : Float → Float → Float → (Float,Float) que calcula las raíces de un binomio (problema 2.25 del

capítulo 2 del problemario de Pepe Gallardo)

raices a b c
 | disc >= 0 = ((-b+raizDisc)/denom,(-b-raizDisc)/denom)
 | otherwise = error "raices complejas"
   where
      disc     = ...
      raizDisc = ...
      denom    = ...

Divide y Conquista

Suponer el siguiente juego: m jugadores en ronda comienzan a decir los números naturales consecutivamente. Cuando toca un multiplo de 7 o un número con algún dígito igual a 7, el jugador debe decir pip en lugar del número.
Se pide: encontrar un predicado pip.n, pip : Int → Bool que dado un número 0<=n<10000 devuelva diga cuando el jugador debe decir pip.
Para hacerlo habrá que definir previamente las siguientes funciones: unidad,decena,centena,unidadDeMil : Int → Int.

introalg/problemas08.1206920586.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)