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 ...
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).