Resolución práctica 1, segunda parte
A continuación presentamos soluciones a ejercicios seleccionados de la Práctica 1 - primera parte.
Como siempre, en el proceso de resolución de un problema, primero debemos dedicar un tiempo al análisis del mismo para asegurarnos de entender correctamente qué se pide. Luego, pasamos a la resolución propiamente dicha.
Recomendamos usar este documento como un elemento de ayuda y referencia. Es importante que no lean la solución sin antes haber leído y entendido el problema y sin haber dedicado un tiempo a pensar cómo resolverlo.
Por otro lado, no hay una única forma correcta de escribir una solución.
1 Condicionales múltiples
Veremos resoluciones a algunos de los ejercicios de la sección 1.
1.1 Ejercicio 2
En este ejercicio debemos rehacer varios ejercicios de la práctica anterior. En este ejercicio en particular (el ejercicio 2) nuestro objetivo es clasificar una imagen. Para ello, debemos definir una función, que podemos llamar clasificar-imagenes, con un argumento que es la imagen a clasificar, y que devuelva un string: "Flaca", "Cuadrada" o "Gorda", según la relación que hay entre su ancho y su largo.
Según nos explica el ejercicio, una imagen es "Flaca" si su largo es menor a su ancho, "Cuadrada" si son iguales o "Gorda" si el ancho resulta mayor.
Si bien es un ejercicio que posiblemente ya resolvieron, tratemos de pensarlo con un cond.
Este tipo de ejercicios presenta una situación con 3 casos que son disjuntos, es decir que ninguna imagen puede ser a la vez "Flaca", "Cuadrada" o "Gorda" en ninguna combinación. Para este tipo de ejercicios, utilizar el cond en vez del if hace todo mucho más cómodo.
Recordemos que tenemos las funciones image-width y image-heigth que justamente nos calculan el ancho y la altura de una imagen.
(define (clasificar-imagenes imagen) (cond [(> (image-height imagen) (image-width imagen)) "Flaca"] [(= (image-height imagen) (image-width imagen)) "Cuadrada"] [(< (image-height imagen) (image-width imagen)) "Gorda"]))
Como siempre, debemos testear nuestra función con algunos valores. Una forma sencilla de crear una imagen sabiendo su ancho y largo, es usando la función empty-scene
> (clasificar-imagenes (empty-scene 10 20)) "Flaca" > (clasificar-imagenes (empty-scene 50 50)) "Cuadrada" > (clasificar-imagenes (empty-scene 80 17)) "Gorda"
1.2 Ejercicio 4
En este ejercicio se pide actualizar la clasificación de imágenes vista anteriormente con dos nuevas categorías: "Muy gorda" si su ancho es más que el doble de su alto, y "Muy flaca" si su alto es más que el doble de su ancho.
Para esto se debe definir una nueva función utilizando una expresión cond.
De un ejercicio anterior ya se tiene la función clasificar-imagenes que clasifica una imágen en "Gorda", "Flaca" o "Cuadrada". Por lo tanto, utilizando esta definición, podemos crear nuestra nueva función:
(define (clasificar-imagenes-2 imagen) (cond [(> (image-width imagen) (* 2 (image-height imagen))) "Muy gorda"] [(> (image-height imagen) (* 2 (image-width imagen))) "Muy flaca"] [else (clasificar-imagenes imagen)]))
Notemos que toda imagen que cumpla con la condición de ser "Muy gorda", también entra en la categoría "Gorda". Lo mismo ocurre con las clasificaciones "Muy flaca" y "Flaca". Es decir, en este caso, las categorías no son disjuntas. Por esta razón, es necesario evaluar primero las categorías más restrictivas.
Veamos algunos ejemplos.
> (clasificar-imagenes-2 (empty-scene 15 30)) "Flaca" > (clasificar-imagenes-2 (empty-scene 15 32)) "Muy Flaca" > (clasificar-imagenes-2 (empty-scene 30 30)) "Cuadrada" > (clasificar-imagenes-2 (empty-scene 80 17)) "Muy Gorda"