25.07.2013 Views

Introducción a la Programación Orientada a Objetos PRACTICO N ...

Introducción a la Programación Orientada a Objetos PRACTICO N ...

Introducción a la Programación Orientada a Objetos PRACTICO N ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Introducción</strong> a <strong>la</strong> <strong>Programación</strong> <strong>Orientada</strong> a <strong>Objetos</strong><br />

DCIC ‐ UNS<br />

2012<br />

<strong>PRACTICO</strong> N 4<br />

EJERCICIO 1.<br />

Gran parte de <strong>la</strong>s aplicaciones de software requieren representar y manipu<strong>la</strong>r imágenes. Una imagen<br />

digital puede representarse a través de una matriz de píxels. Un píxel es un punto, de modo que una<br />

imagen es una matriz de puntos.<br />

Cuando observamos una imagen en <strong>la</strong> computadora no percibimos cada punto particu<strong>la</strong>r, pero si<br />

aumentamos <strong>la</strong> imagen, por ejemplo un 600%, cada píxel va a ser distinguible. La percepción humana<br />

de <strong>la</strong> luz también es muy limitada y depende de nuestros sensores del color.<br />

Nuestro cerebro determina que color “ve” en base a sensar tres colores: azul, verde y rojo. De modo<br />

que cada píxel puede codificar cada color a través de una terna de números, el primero representa <strong>la</strong><br />

cantidad de color rojo, el segundo <strong>la</strong> cantidad de color verde y el tercero <strong>la</strong> cantidad de color azul. El<br />

rango para cada valor es 0..255. Combinando el máximo de los tres se obtiene el b<strong>la</strong>nco (255, 255,<br />

255). La ausencia de los tres produce el negro (0, 0, 0). El rojo es c<strong>la</strong>ramente (255, 0, 0). Cuando se<br />

mantiene el mismo valor para <strong>la</strong>s tres componentes se obtiene gris. La terna (50, 50, 50) representa un<br />

gris oscuro, (150, 150, 150) es un gris más c<strong>la</strong>ro. Esta representación se l<strong>la</strong>ma modelo RGB.<br />

Pixel<br />

<br />

rojo:entero<br />

azul: entero<br />

verde : entero<br />

<br />

Pixel()<br />

<br />

variar(val:entero)<br />

variarRojo(val:entero)<br />

variarAzul(val:entero)<br />

variarVerde(val:entero)<br />

establecerRojo(val:entero)<br />

establecerAzul(val:entero)<br />

establecerVerde(val:entero)<br />

<br />

obtenerRojo():entero<br />

obtenerAzul():entero<br />

obtenerVerde():entero<br />

esRojo():boolean<br />

esGris():boolean<br />

esNegro():boolean<br />

equals(p:Pixel):boolean<br />

complemento():Pixel<br />

Observación: el constructor de <strong>la</strong> c<strong>la</strong>se inicializa el pixel en b<strong>la</strong>nco.<br />

La manipu<strong>la</strong>ción de un píxel requiere de diferente tipo de operaciones.<br />

i. variar el color en un valor fijo, modifica cada componente de color sumándole si es posible, un<br />

valor dado. Si sumándole el valor dado a una o varias componentes se supera el valor 255, dicha<br />

componente queda en 255. Si el argumento es negativo <strong>la</strong> operación es <strong>la</strong> misma pero en ese<br />

caso el mínimo valor que puede tomar una componente, es 0.<br />

ii. variar rojo, modifica <strong>la</strong> componente de rojo sumándole un valor dado. Ídem para azul y verde.<br />

iii. retornar el valor verdadero si el píxel que recibe el mensaje representa el color gris. Ídem para<br />

rojo y para negro<br />

iv. retornar el valor verdadero si el píxel que recibe el mensaje representa el mismo color que el<br />

parámetro


<strong>Introducción</strong> a <strong>la</strong> <strong>Programación</strong> <strong>Orientada</strong> a <strong>Objetos</strong><br />

DCIC ‐ UNS<br />

2012<br />

v. retornar un nuevo píxel con el color complemento del color del píxel que recibe el mensaje para<br />

alcanzar el color b<strong>la</strong>nco<br />

A partir del diagrama presentado y <strong>la</strong> especificación, implemente y verifique <strong>la</strong> c<strong>la</strong>se Pixel en Java<br />

encapsu<strong>la</strong>ndo atributos y comportamiento para mode<strong>la</strong>r <strong>la</strong> situación p<strong>la</strong>nteada. Incluya todos los<br />

métodos auxiliares que considere oportunos, como así también los métodos triviales que no estén<br />

incluidos en el diagrama. Para visualizar <strong>la</strong> conformación de colores en el modelo RGB podemos usar el<br />

programa Paint.<br />

EJERCICIO 2.<br />

Una organización dedicada a <strong>la</strong> preservación del medio ambiente mantiene información referida a cada<br />

especie animal de <strong>la</strong> que se realiza seguimiento. Cada especie está caracterizada por su nombre<br />

científico, <strong>la</strong> cantidad de hembras y <strong>la</strong> cantidad de machos que se registran en <strong>la</strong> actualidad, el ritmo de<br />

crecimiento anual de <strong>la</strong> pob<strong>la</strong>ción de acuerdo a lo ocurrido en los últimos 10 años (puede ser negativo).<br />

Los tres valores numéricos pueden establecerse con un valor dado y luego actualizarse aumentando o<br />

disminuyendo en un valor dado.<br />

La organización está interesada en calcu<strong>la</strong>r para una especie particu<strong>la</strong>r: <strong>la</strong> pob<strong>la</strong>ción total, el nivel de<br />

riesgo de extinción (verde si el ritmo de crecimiento es positivo, amarillo si es nulo y rojo si es negativo),<br />

<strong>la</strong> pob<strong>la</strong>ción estimada para dentro de una cantidad dada de años, cuántos años serán necesarios<br />

estimativamente para que <strong>la</strong> pob<strong>la</strong>ción alcance un valor dado. Se desea determinar también si en una<br />

especie dada es mayor el número de hembras o de machos y entre dos especies diferentes cuál tiene<br />

mayor ritmo de crecimiento.<br />

Especie<br />

<br />

nombre: String<br />

machos: entero<br />

hembras: entero<br />

ritmo: real<br />

<br />

Especie(nom:String)<br />

<br />

establecerHembras(h:entero)<br />

establecerMachos(m:entero)<br />

establecerRitmo(r:real)<br />

actualizarHembras(h:entero)<br />

actualizarMachos(m:entero)<br />

actualizarRitmo(r:real)<br />

<br />

pob<strong>la</strong>cionActual(): entero<br />

pob<strong>la</strong>cionEstimada(anios:entero): entero<br />

anios(pob:entero): entero<br />

riesgo(): String<br />

masHembras(): boolean<br />

mayorRitmo(est: Especie): Especie<br />

toString(): String<br />

A partir del diagrama presentado y <strong>la</strong> especificación implemente y verifique <strong>la</strong> c<strong>la</strong>se Especie en Java<br />

encapsu<strong>la</strong>ndo atributos y comportamiento para mode<strong>la</strong>r <strong>la</strong> situación p<strong>la</strong>nteada. Incluya todos los<br />

métodos auxiliares que considere oportunos, como así también los métodos triviales que no estén<br />

incluidos en el diagrama.<br />

OBSERVACIÓN: EL MÉTODO TOSTRING() RETORNA UN STRING QUE CORRESPONDE A LA REPRESENTACIÓN TEXTUAL DEL OBJETO. EJEMPLO: "NOMBRE DE<br />

LA ESPECIE: XX - CANTIDAD DE MACHOS: N - CANTIDAD DE HEMBRAS: M - RITMO: R"


<strong>Introducción</strong> a <strong>la</strong> <strong>Programación</strong> <strong>Orientada</strong> a <strong>Objetos</strong><br />

DCIC ‐ UNS<br />

2012<br />

EJERCICIO 3.<br />

En un campeonato de fútbol por cada partido ganado se obtienen 3 puntos y por cada empate se logra<br />

1. Cada equipo tiene un nombre, un capitán, una cantidad de partidos ganados, otra de empatados y<br />

otra de perdidos, una cantidad de goles a favor y otra de goles en contra. El capitán es un jugador que<br />

tiene un nombre, un año de nacimiento, un número de camiseta, un número que representa <strong>la</strong> posición<br />

en <strong>la</strong> que juega, <strong>la</strong> cantidad de partidos jugados y <strong>la</strong> cantidad de goles convertidos en el campeonato.<br />

Para un jugador se desea calcu<strong>la</strong>r el promedio de goles por partido y dado otro jugador, cuál es el que<br />

hizo más goles. Para un equipo se desea calcu<strong>la</strong>r los partidos jugados y los puntos obtenidos. Además<br />

para otro equipo dado es necesario decidir cuál es el equipo con mayor puntaje y cuál es el capitán con<br />

más goles. Si dos equipos tienen los mismos puntos, se devuelve el que tiene mayor cantidad de goles<br />

a favor y si también hay coincidencia se consideran los goles en contra. Si hay coincidencia se devuelve<br />

uno cualquiera.<br />

a) A partir del diagrama de c<strong>la</strong>ses en UML y <strong>la</strong> especificación de requerimientos implemente dos<br />

c<strong>la</strong>ses en Java encapsu<strong>la</strong>ndo atributos y comportamiento para mode<strong>la</strong>r <strong>la</strong> situación p<strong>la</strong>nteada.<br />

Incluya dentro del comportamiento los comandos para modificar cada atributo y <strong>la</strong>s consultas<br />

para devolver cada atributo.<br />

Jugador<br />

<br />

nombre: String<br />

nroCamiseta: entero<br />

posicion: entero<br />

golesConvertidos: entero<br />

partidosJugados: entero<br />

<br />

Jugador(nom:String)<br />

<br />

aumentarGoles(n:entero)<br />

aumentarUnPartido()<br />

<br />

promedioGolesXPart(): entero<br />

jugConMasGoles(j: Jugador): Jugador<br />

masGoles(j:Jugador): boolean<br />

toString(): String<br />

masGoles() devuelve true si el jugador tiene más goles que el jugador que corresponde al<br />

parámetro.<br />

Equipo<br />

<br />

nombre: String<br />

capitan: Jugador<br />

pG,pE,pP: entero<br />

gFavor, gContra: entero<br />

<br />

Equipo(nom:String, cap: Jugador)<br />

<br />

incrementarPG(jugoElCap: boolean)<br />

incrementarPE(jugoElCap: boolean)<br />

incrementarPP(jugoElCap:boolean)<br />

aumentarGfavor(total, delCap: entero)<br />

aumentarGContra(total: entero)<br />

<br />

partidos(): entero<br />

puntos(): entero<br />

mejorPuntaje(e: Equipos): Equipo<br />

capitanConMasGoles(e: Equipo): Jugador<br />

Es responsabilidad de <strong>la</strong><br />

c<strong>la</strong>se Equipo incrementar<br />

el número de partidos del<br />

capitán del equipo.<br />

Es responsabilidad de <strong>la</strong><br />

c<strong>la</strong>se Equipo incrementar<br />

el número de goles<br />

convertidos por el capitán<br />

del equipo.


<strong>Introducción</strong> a <strong>la</strong> <strong>Programación</strong> <strong>Orientada</strong> a <strong>Objetos</strong><br />

DCIC ‐ UNS<br />

2012<br />

incrementarPG(jugoElCap: boolean) , incrementarPE(jugoElCap: boolean),<br />

incrementarPP(jugoElCap: boolean) Aumentan en 1 los partidos del equipo y si corresponde<br />

envía un mensaje al capitán para que incremente en 1 sus partidos.<br />

incrementarGFavor(total, delCap: entero): Aumenta los goles del equipo y si corresponde<br />

envía un mensaje al capitán para actualizar sus goles.<br />

b) Considerando el mismo modelo para jugador implemente una nueva c<strong>la</strong>se Equipo para <strong>la</strong><br />

siguiente especificación:<br />

Equipo<br />

<br />

nombre: String<br />

capitan: Jugador<br />

pG,pE,pP: entero<br />

gFavor, gContra: entero<br />

<br />

Equipo(nom:String, cap: Jugador)<br />

<br />

incrementarPG()<br />

incrementarPE()<br />

incrementarPP()<br />

aumentarGfavor(total: entero)<br />

aumentarGContra(total: entero)<br />

<br />

partidos(): entero<br />

puntos(): entero<br />

mejorPuntaje(e: Equipos): Equipo<br />

capitanConMasGoles(e: Equipo): Jugador<br />

incrementarPG() incrementarPE() incrementarPP(): Aumenta en 1 el puntaje correspondiente.<br />

incrementarGFavor(total: entero): Aumenta los goles del equipo.<br />

c) Defina una c<strong>la</strong>se adecuada para testear cada alternativa.<br />

Es responsabilidad de <strong>la</strong><br />

c<strong>la</strong>se Cliente incrementar<br />

el número de partidos del<br />

capitán del equipo.<br />

Es responsabilidad de <strong>la</strong><br />

c<strong>la</strong>se Cliente incrementar<br />

el número de goles<br />

convertidos por el capitán<br />

del equipo.<br />

EJERCICIO 4.<br />

Se conoce como Langostas Mutantes a una variedad de <strong>la</strong>s <strong>la</strong>ngostas que viven cerca de <strong>la</strong>s centrales<br />

nucleares. Este tipo de <strong>la</strong>ngosta tiene dos características que <strong>la</strong> diferencia del resto de <strong>la</strong> especie: Por<br />

un <strong>la</strong>do, como todo animal que vive cerca de centrales nucleares, tiene tres ojos; y además su ciclo de<br />

reproducción es realmente extraño. La reproducción de <strong>la</strong> Langosta Mutante se puede describir de <strong>la</strong><br />

siguiente manera:<br />

Reproducción: La hembra <strong>la</strong>ngosta tiene una cría. Sí <strong>la</strong> cría es hembra entonces <strong>la</strong> <strong>la</strong>ngosta madre<br />

finaliza su ciclo de reproducción actual. Sí <strong>la</strong> cría es macho entonces <strong>la</strong> <strong>la</strong>ngosta automáticamente se<br />

reproducirá una vez más siguiendo el comportamiento explicado.<br />

a) Implemente <strong>la</strong> c<strong>la</strong>se ColoniaLangostasMutantes mode<strong>la</strong>da en el siguiente diagrama. Al crear <strong>la</strong><br />

colonia hay un solo macho y una so<strong>la</strong> hembra.<br />

El comando reproduccionEnLaColonia() simu<strong>la</strong> <strong>la</strong> reproducción de cada hembra en <strong>la</strong> colonia<br />

(recuerde que al reproducirse se cambia <strong>la</strong> cantidad de machos y hembras en <strong>la</strong> colonia)<br />

invocando al método recursivo reproduccion(). Tenga en cuenta que <strong>la</strong>s hembras recién nacidas<br />

necesitan cierto proceso de maduración antes de reproducirse, es por eso que no pueden reproducirse<br />

hasta <strong>la</strong> próxima invocación del método reproduccionEnLaColonia().


<strong>Introducción</strong> a <strong>la</strong> <strong>Programación</strong> <strong>Orientada</strong> a <strong>Objetos</strong><br />

DCIC ‐ UNS<br />

2012<br />

ColoniaLangostasMutantes<br />

<br />

machos,hembras:entero<br />

<br />

ColoniaLangostasMutantes()<br />

<br />

reproduccionEnLaColonia()<br />

reproduccion()<br />

<br />

tenerCria():String<br />

tamanioColonia():entero<br />

tenerCria() retorna, en forma aleatoria, una cadena de caracteres indicando el género de <strong>la</strong> cría.<br />

b) Implemente una c<strong>la</strong>se Tester que simule N reproducciones en <strong>la</strong> colonia, mostrando por pantal<strong>la</strong> el<br />

estado de <strong>la</strong> misma al finalizar.<br />

EJERCICIO 5.<br />

El tamagotchi es un juego donde el objetivo es mantener con vida a una “mascota virtual” <strong>la</strong> mayor<br />

cantidad de tiempo posible. Cada mascota virtual se identifica por medio de<br />

su nombre. Pueden realizar diferentes acciones, <strong>la</strong>s que aumentan o<br />

disminuyen su nivel de energía, el cual nunca puede disminuir por debajo<br />

de 0 ni superar el máximo de 100. Cuando el nivel de energía es cero, <strong>la</strong><br />

mascota <strong>la</strong>mentablemente abandona <strong>la</strong> existencia terrena. Las<br />

operaciones que incrementan el nivel de energía son comer, beber y<br />

dormir. Cuando duerme recupera el 25% de su energía. Mientras duerme<br />

no puede hacer ninguna otra acción, a menos que antes se lo despierte.<br />

Las acciones que decrementan el nivel de energía de <strong>la</strong> mascota son<br />

caminar, correr y saltar, si bien lo hacen en distinto grado. Ninguna<br />

mascota puede realizar más de tres acciones de desgaste en forma<br />

consecutiva. Al cuarto intento, ignora <strong>la</strong> orden dada y directamente se pone<br />

a dormir. Cuando se vuelva a despertar, podrá volver a realizar a lo sumo tres acciones de desgaste.<br />

Asimismo, si come o bebe cinco veces seguidas morirá al instante de indigestión. La mascota<br />

manifiesta diferentes grados de humor, los que expresa mediante un valor numérico que va de 1 a 5,<br />

siendo 1 el más infeliz y 5 el más contento. El humor del Tamagotchi depende de su nivel de energía<br />

como sigue:<br />

Tomando en cuenta el diagrama de c<strong>la</strong>ses dado:<br />

Energía Humor<br />

0…20 1<br />

21...40 2<br />

41…60 3<br />

61…80 4<br />

81…100 5<br />

a) Definir <strong>la</strong> c<strong>la</strong>se MascotaVirtual con todos los atributos y operaciones necesarias.<br />

b) Indicar una secuencia de órdenes que cubran un ciclo completo de <strong>la</strong> vida de estas mascotas:<br />

nacimiento, actividades varias, muerte. Implementar dicha secuencia en forma de Tester. Implementar<br />

un segundo Tester que utilice valores aleatorios para decidir qué acciones ejecutar.<br />

c) ¿Qué atributos y operaciones deben agregarse a <strong>la</strong> c<strong>la</strong>se MascotaVirtual para permitir que dos<br />

mascotas puedan pelear entre sí, mediante ataques que le quiten energía al adversario?<br />

d) Suponiendo que <strong>la</strong>s mascotas virtuales puedan casarse y divorciarse, y que cuando están casados,<br />

puedan procrear y producir otra mascota virtual, siempre que el nivel de energía de los dos sea superior<br />

al 80% del máximo admitido (es decir, que los dos estén con el mejor humor posible), ¿qué atributos y<br />

operaciones deberían agregarse a <strong>la</strong> c<strong>la</strong>se MascotaVirtual en este caso?


Incrementa energía en 30<br />

puntos.<br />

Incrementa energía en 15<br />

puntos.<br />

Incrementa energía en 25%.<br />

Decrementa energía en 15<br />

puntos.<br />

Decrementa energía en<br />

50% .<br />

Decrementa energía en 5<br />

puntos.<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>Programación</strong> <strong>Orientada</strong> a <strong>Objetos</strong><br />

DCIC ‐ UNS<br />

2012<br />

Tamagotchi<br />

<br />

MAX_ENERGIA = 100<br />

MIN_ENERGIA = 0<br />

<br />

energia: entero<br />

dormido: booleano<br />

cantDesgaste, cantComer: entero<br />

<br />

Tamagotchi(e: entero)<br />

<br />

comer():booleano<br />

beber():booleano<br />

dormir():booleano<br />

despertar():booleano<br />

caminar():booleano<br />

correr():booleano<br />

saltar():booleano<br />

<br />

obtenerEnergia():entero<br />

estaDormido():booleano<br />

obtenerCantDesgaste():entero<br />

obtenerCantComer():entero<br />

obtenerHumor():entero<br />

estaVivo():booleano<br />

Mantiene <strong>la</strong> cantidad de veces<br />

consecutivas que comió el<br />

tamagotchi. Idem para <strong>la</strong> cantidad<br />

de actividades de desgaste que<br />

realizó.<br />

Todas <strong>la</strong>s operaciones devuelven<br />

true si se ejecutaron correctamente o<br />

false en caso contrario (si el<br />

tamagotchi está muerto o supero <strong>la</strong><br />

cantidad de veces que puede realizar<br />

<strong>la</strong> acción de forma consecutiva).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!