Diseño y Programación Orientados a Objetos
1er. Sem 2009
Tarea 1: Clasificador de Frutas

Recomendación: Lea detenidamente la tarea, si algo no lo entiende consulte en clases, si es preciso se incorporarán aclaraciones al final.
Revisar las ayudas preparadas por el Ayudante

Esta tarea tiene por objeto:
  1. Familiarizar al estudiante con el ambiente de desarrollo que usará en otras tareas y su proyecto.
  2. Evaluar la herramienta que resulte más cómoda para usted. En clases he sugerido trabajar con Emacs o Jgrasp. Otras son NetBeans y Eclipse.
  3. Ejercitar la generación automática de documentación usando javadoc.
  4. Practicar la creación de (o aprenda a crear) Makefile
  5. Ejercite los conceptos de clases, herencia y entrada y salida de datos.
Descripción General
Esta tarea surge de una necesidad de la zona. La calidad de la palta mejora si podemos agruparlas según su grado de madurez. La idea es que cuando exportamos paltas éstas tengan un nivel de madurez parejo. Así el cliente final podrá disfrutar su calidad al momento de compra y no adquirirá paltas "verdes" con otras "pasadas" en un mismo empaque. Para efectos de esta tarea aplicaremos la misma idea a los tomates y así tener dos tipos de frutas.
Para paltas la literatura y nuestra experiencia señalan que la firmeza de las paltas está bien correlacionada con la madurez de las mismas. Otro dato, no obvio, es que la madurez de las paltas también está bien correlacionada con el porcentaje de aceite de las mismas. En la medida que las paltas maduran, su contenido de agua es gradualmente reemplazado por aceite.
Sobre los tomates, para efecto de esta tarea, usaremos la firmeza y el color como atributos correlacionados con el nivel de madurez.
La idea de la tarea es simular un sistema de clasificación de frutas según el tiempo restante para lograr su madurez desde la cosecha. Los datos entregados son sólo para el propósito de esta realidad.

El proceso de clasificación propuesto consta de dos etapas de medición no invasivas. En el caso de las paltas, un instrumento obtiene su nivel de aceite y otro su firmeza. Si ambos instrumentos arrojan mediciones próximas, la palta es clasificada en un canasto según el valor promedio de las mediciones. Si ambas mediciones son muy diferentes (diferencia mayor al 8% del valor medio), se procede a repetir las mediciones hasta conseguir la clasificación. Algo análogo se hace para los tomates.



Modelo para clasificador de paltas



Modelo para clasificador de tomates

Por simplicidad asumiremos que al momento de cosecha las paltas logran su madurez en un tiempo que varía entre 0 y 288 horas. Asumiremos que los tomates desde su cosecha maduran entre 0 y 144 horas. La madurez al momento de la cosecha la modelaremos en ambos casos como una número aleatorio igualmente distribuido en el rango de madurez de cada fruta.
Las canastas almacenan paltas o tomates. Divida el rango hasta madurez en partes iguales para asociarlas a cada canasto.
Igualmente por simplicidad asumiremos que el porcentaje de aceite en las paltas varía desde un crece linealmente desde 5% cuando le falta 288 horas para madurar hasta 11% cuando está con madurez ideal.
Consideraremos que la firmeza de las paltas varían de 140 [N] cuando faltan 288 horas para madurez y 20 [N] cuando están maduras.
El medidor de color de tomates arroja valor 40 cuando falta 144 horas para madurez y valor 240 cuando está maduro.
La firmeza del tomate varía de 80 faltando 144 horas para madurez hasta 10 [N] cuando están maduros.
Asuma comportamiento lineal en todos los casos.
Todos los medidores tienen un grado de imprecisión del 5% del valor medido. Esto es si una palta al momento de cosecha requiere 288 hrs para madurez, el medidor de aceite arrojará un valor al azar entre 4,75 y 5,25%.

El programa se invoca con un parámetro:
$ java clasificador <n>
Donde <n> es el número de paltas y número de tomates a clasificar.
Como resultado el programa arroja:
Clasificación de paltas:
Canasto 1 contiene <x> paltas con maduración entre 0 y 96 horas y promedio de <pro> horas.
Canasto 2 contiene  ...
Canasto 3 contiene <x> paltas con maduración en más de 192 horas y promedio <pro> horas.

Clasificación de tomates:
Canasto 1 contiene <x> tomates con maduración entre 0 y 48 horas y promedio de <pro> horas.
Canasto 2 contiene  ...
Canasto 3 contiene <x> tomates con maduración en más de 96 horas y promedio <pro> horas.


Implementación
Defina e implemente la clase Canasto. Por lo solicitado el canasto no necesita almacenar cada fruto, sino ir acumulando el número de frutas que contiene y el promedio de horas hasta maduración de sus frutos. La clase canasta debe servir para almacenar tomates o paltas.
Defina también una clase ControlDeCompuertas. Esta clase recibe dos valores y cuando se le pide los promedia y retorna el canasto que debe recibir la fruta. Cuando los valores medidos difieren mucho (más que el 8% del valor promedio), el fruto debe ser reprocesado por los medidores. Usted decida cómo implementa esta parte; por ejemplo, podría retornar un canasto inválido u ofrecer un método, medicionesDifierenMucho(), que retorne un booleano para señalar si los valores no difieren mayormente (espero usted observe que esta implementación es más general), Esta clase almacena como atributo constante el rango de horas hasta madurez del fruto y el número de canastos. Ambos definidos en su constructor.
Las clases Canasto y ControlDeCompuertas, deben ser lo suficientemente genéricas para su uso en ambos sistemas de clasificación.
Defina la clase Medidor de la cual existen tres clases derivadas: MedidorPorAceite, MedidorPorColor, MedidorPorFirmeza. La clase MedidorPorFirmeza permite generar una instancia para medir tomates y otra para medir paltas.
La clase Medidor posee el método int obtengaMedicion() el cual sólo puede ser implementado cuando se tiene un medidor específico (por Aceite, color o firmeza). El valor retornado por este método es el número de horas hasta madurez según el mecanismo de medición específico. Cada subclase implementa la función lineal que corresponda y la incertidumbre de cada medición.
La clase Palta y Tomate derivan de la clase base Fruta. La clase fruta posee su firmeza como atributo al momento de la cosecha; es decir, cuando se crea el objeto. Las clases derivas Palta y Tomate incluyen los atributos aceite (en porcentaje) y color respectivamente. Notar que los valores de firmeza y aceite o color debe ser consistes con un número de horas hasta madurez.
 
Nota:
En la documentación de esta tarea, no es necesario que usted haga una descripción en alto nivel de los algoritmos usados. Usted debe entregar su código documentado siguiendo el estándar del utilitario javadoc. Dé una mira al Generador de Documentación y en particular los rótulos. Revise el procedimiento para entregar su tareas, pauta de corrección general, y sugerencias para trabajar en aragorn desde Windows.
Ayudas para desarrollo de tareas preparada por Tomás Girardi.

Vea el ejemplo de Makefile. Más información sobre Makefiles.