Professional Documents
Culture Documents
Captulo 4: Clases
Resumen te
orico
Todos los objetos del mundo real comparten dos caractersticas: tienen un estado y un comportamiento.
Las bicicletas, por ejemplo, tienen un estado (el cambio actual, velocidad de pedaleo y velocidad) y un
comportamiento (pasar un cambio, cambiar velocidad de pedaleo y aplicar frenos). Identificar el estado
y comportamiento de objetos del mundo real es el primer paso para empezar a pensar en terminos de
programaci
on orientada a objetos.
Los objetos de software son conceptualmente similares a los objetos del mundo real: ellos tambi
en tienen
un estado y un comportamiento. Un objeto guarda su estado en variables y expone su comportamiento en
metodos. Los metodos operan en el estado interno de un objeto (sus variables) y sirven como mecanismo
primario para comunicaci
on entre objetos.
Al atribuirles estado (velocidad, cambio actual, tama
no, etc.) y proveer metodos para cambiar este estado,
el objeto se mantiene en control de c
omo el mundo puede usarlo. Por ejemplo, si la bicicleta tiene s
olo 6
cambios, un metodo que cambio los cambios, podra solo aceptar cambios entre 1 y 6 y rechazar los que
estan fuera de ese rango.
Los objetos pueden estar relacionados e interactuar entre ellos, permitiendo as una programaci
on m
as real.
Tambien, podemos crear m
as de un objeto del mismo tipo y utilizarlos (cada uno por separado, modificando
uno sin afectar al otro) sin necesitar saber exactamente como esta definido internamente del c
odigo.
Y la forma concreta de realizarlo? este objeto que hemos creado, debe implementarse en una nueva clase
que NO CONTIENE MAIN.
La clase se define de la siguiente manera:
import IIC1103Packag e .*; // Los paquetes necesarios , puede no haber ninguno
public class Objeto {
// Atributos de la clase
public Objeto (){ // Constructor de la clase
// Inicializac io n de atributos
}
// Metodos de la clase Objeto
}
Aplic
andolo al ejemplo anterior obtendremos algo as como:
public class Auto {
private int color ;
private String patente ;
private boolean andando ;
public Auto () // C o n s t r u c t o r de la clase {
color =1; // Sea 1 un color predeterminado , por ejemplo blanco
patente = Usuario . texto ( " Ingrese la patente de la forma NN -1234 " );
andando = false ; // Su estado inicial es reposo por defecto
}
public void pintar ( int n u e v o _ c o l o r){ // C a m b i a m o s el atributo color
color = n u e v o _ c o l o r;
}
public void mover (){ // C a m b i a m o s el atributo del estado m o v i m i e n t o
andando = true ;
}
public String m o s t r a r D a t o s(){
String texto = " El color es : " + color + " Patente : " + patente ;
return texto ;
}
}
Luego en la clase main necesitamos crear el objeto auto para usarlo. Para crearlo lo hacemos de la siguiente
manera:
<tipo obj> <nombre obj> = new <tipo obj> (<par
ametros del constructor>);
Para usar los metodos de la clase auto necesitamos llamarlos por medio de un objeto de esa clase, por ejemplo:
<nombre objeto>.<m
etodos>(<par
ametros del m
etodo>);
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l{
public static void main ( String [] args ){
Auto autito = new Auto ();
int color = Usuario . entero ( " 1 Blanco \ n2 Azul \ n3 Rojo \ n 4 Verde " );
autito . pintar ( color );
autito . mover ();
Usuario . Mensaje ( autito . m o s t r a r D a t o s ());
}
}
El juntar el c
odigo dentro de objetos provee un n
umero de beneficios:
Modularidad: el c
odigo de un objeto puede ser mantenido independientemente de el c
odigo de otros
objetos. En otras palabras si cambia la forma en que se pasan los cambios en nuestra bicicleta eso no
va a afectar a programas que ocupan nuestro objeto.
Reutilizar c
odigo: si un objeto ya existe, se puede ocupar en otro programa sin necesidad de saber
exactamente como funciona internamente.
F
acil reparaci
on: si un objeto en particular funciona mal, se le cambia por otro sin muchos problemas.
Esto es an
alogo al mundo real donde si falla un perno en una maquina se cambia solo el perno y no la
maquina entera.
Ejemplos
Problema 1: Reescribiendo C
odigo
Enunciado
Este codigo est
a escrito de manera sucia, para limpiarlo debe reescribir el c
odigo orientado a lenguaje de
objetos (con clases). Debe mantener la misma funcionalidad.
import i i c 1 1 0 3 P a c k a g e .*;
public class Original {
/* *
* Este codigo esta escrito de manera " sucia " , para l i m p i r a l o debe
* r e e s c r i b i r el codigo o r i e n t a d o a lenguaje de objetos ( con clases ). Debe
* mantener la misma f u n c i o n a l i d a d.
*/
public static void main ( String [] args ) {
String auto = " auto " ;
String b i c i c l e t a = " b i c i c l e t a" ;
int v e l o c i d a d A u t o = 5;
int p a s a j e r o s A u t o = 4;
boolean r u e d a P i n c h a d a A u t o = true ;
int v e l o c i d a d B i c i c l e t a = 2;
int p a s a j e r o s B i c i c l e t a = 1;
boolean r u e d a P i n c h a d a B i c i c l e t a = false ;
Usuario . mensaje ( " La v e l o c i d a d del vehiculo " + auto + " es "
+ v e l o c i d a d A u t o + " .\ nAdemas lleva " + p a s a j e r o s A u t o
+ " p a s a j e r o s" );
if ( r u e d a P i n c h a d a A u t o) {
Usuario . mensaje ( " El vehiculo " + auto + " tiene una rueda pinchada " );
}
Usuario . mensaje ( " La v e l o c i d a d del vehiculo " + b i c i c l e t a + " es "
+ v e l o c i d a d B i c i c l e t a + " .\ nAdemas lleva " + p a s a j e r o s B i c i c l e t a
+ " p a s a j e r o s" );
if ( r u e d a P i n c h a d a B i c i c l e t a) {
Usuario . mensaje ( " El vehiculo " + b i c i c l e t a
+ " tiene una rueda pinchada " );
}
}
}
Criterios de soluci
on
Se puede ver que todas las variables corresponden a una caracterstica de un auto o de una bicicleta y se
le hacen cambios a estas mismas. Se podran hacer dos objetos, uno bicicleta y uno auto, pero tambien se
puede notar que las variables relacionadas con la bicicleta y con el auto son las mismas por lo que es mas
pr
actico hacer dos objetos (por ejemplo el objeto vehculo) y crear dos instancias del mismo, una bicicleta y
un auto.
Posible Soluci
on
// CLASE VEHICULO
import i i c 1 1 0 3 P a c k a g e .*;
public class Vehiculo {
private String nombre ;
private int v e l o c i d a d;
private int p a s a j e r o s;
private boolean r u e d a P i n c h a d a;
public Vehiculo ( String nombreAux , int velAux , int pasajAux , boolean ruedaAux ) {
nombre = n o m b r e A u x;
v e l o c i d a d = velAux ;
p a s a j e r o s = pasajAux ;
r u e d a P i n c h a d a = ruedaAux ;
Usuario . mensaje ( " Un objeto del tipo vehiculo fue creado " );
}
public int g e t V e l o c i d a d() {
return v e l o c i d a d;
}
public int g e t P a s a j e r o s() {
return p a s a j e r o s;
}
public boolean i s R u e d a P i n c h a d a() {
return r u e d a P i n c h a d a;
}
public String g e t N o m b r e() {
return nombre ;
}
}
// CLASE P R I N C I P A L
import i i c 1 1 0 3 P a c k a g e .*;
public class E n O b j e t o s {
public static void main ( String [] args ) {
// creo un objeto de tipo ( clase ) Vehiculo con el c o n s t r u c t o r definido
// en vehiculo . java
Vehiculo auto = new Vehiculo ( " auto " , 5 , 4 , true );
// creo un objeto de tipo b i c i c l e t a
Vehiculo b i c i c l e t a = new Vehiculo ( " b i c i c l e t a" , 2 , 1 , false );
// Llamo a las d i s t i n t a s v a r i a b l e s
Usuario . mensaje ( " La v e l o c i d a d del vehiculo " + auto . g e t N o m b r e()
+ " es " + auto . g e t V e l o c i d a d() + " .\ nAdemas lleva "
+ auto . g e t P a s a j e r o s() + " p a s a j e r o s" );
if ( auto . i s R u e d a P i n c h a d a ()) {
Usuario . mensaje ( " El vehiculo " + auto . g e t N o m b r e()+ " tiene una rueda pinchada " );
}
Usuario . mensaje ( " La v e l o c i d a d del vehiculo " + b i c i c l e t a. g e t N o m b r e()
+ " es " + b i c i c l e t a. g e t V e l o c i d a d() + " .\ nAdemas lleva "
+ b i c i c l e t a. g e t P a s a j e r o s() + " p a s a j e r o s" );
if ( b i c i c l e t a. i s R u e d a P i n c h a d a()) {
Usuario . mensaje ( " El vehiculo " + b i c i c l e t a. g e t N o m b r e()+ " tiene una rueda pinchada " );
}
}
// Hay que notar lo e s t r u c t u r a d o y facil de leer que quedo el programa
// despues de pasarlo a lenguaje de objetos .
}
Criterios de soluci
on
En base al enunciado podemos hacer el siguiente esquema:
Como se puede ver en el dibujo y deducir del enunciado, tenemos cuatro clases. Uno clase Departamento,
una clase Sector, una clase Sensor y una clase Controlador. En el dibujo se ve que un Departamento contiene
cinco objetos Sector (cocina, terraza, dormitorio, ba
no y sala) y que a su vez cada Sector contiene un Sensor
y un Controlador.
Adem
as de esto hay que notar que los sensores deben ser capaces de censar el ambiente y comunicarse con
los controladores (por eso la flecha entre ambos objetos) y los controladores deben ser capaces de regular el
ambiente.
Por lo anterior entonces debemos:
Hacer cuatro clases, cada una con su constructor
Departamento debe tener 5 objetos Sector y cada objeto Sector debe tener un Sensor y un Controlador.
La clase Sensor debe tener un metodo que cense y una manera de guardar esos valores. Adem
as debe
tener una manera de comunicarse con el Controlador.
El controlador debe tener un metodo que regule el ambiente.
Posible Soluci
on
public class D e p a r t a m e n t o {
private Sector cocina , terraza , dormitorio , bano , sala ;
// C o n s t u c t o r de la clase d e p a r t a m e n t o. Crea el d e p a r t a m e n t o con sus
// 5 sectores c o r r e s p o n d i e n t e s.
// A l t e r n a t i v a 1: Recibe los sectores como p a r a m e t r o s ( objetos ).
// A l t e r n a t i v a 2: Crea los sectores dentro del c o n s t r u c t o r sin p a r a m e t r o s.
public D e p a r t a m e n t o( Sector cocina , Sector terraza , Sector dormitorio ,
Sector bano , Sector sala ) {
}
}
public class Sector {
private Sensor sensor ;
private C o n t r o l a d o r c o n t r o l a d o r;
// C o n s t r u c t o r de la clase Sector . Crea un sensor y un c o n t r o l a d o r para el sector .
// Recibe sensor y c o n t r o l a d o r como p a r a m e t r o s ( objetos )
// Ademas el sensor le envia la i n f o r m a c i o n al c o n t r o l a d o r
// d i r e c t a m e n t e. En tal caso , el sensor conoce ( set ) al c o n t r o l a d o r.
public Sector ( Sensor sensor , C o n t r o l a d o r c o n t r o l a d o r) {
}
}
Problema 3: Insumos
Enunciado
Una empresa recibe insumos de varios proveedores distintos. Para manejar los insumos la empresa tiene un
departamento de bodega que es administrado por un gerente. Los proveedores tienen nombre y rut de la
empresa.
Cada mes, el gerente de bodega debe pedir a sus proveedores una lista de insumos que se requieren, indicando
el tipo de insumo y la cantidad requerida. Los proveedores responden especificando el tipo y la cantidad de
insumos que pueden enviar y el costo unitario de estos. El gerente debe aprobar la cotizacion si le parece
razonable y en caso de hacerlo se realiza un pago al proveedor correspondiente y se reciben dichos insumos, agregandose al inventario centralizado en bodega. La empresa realiza todas estas operaciones en base
a memos y telefono, lo que ha demostrado ser muy ineficaz. Por ende, la empresa ha decidido automatizar
sus sistemas y le pide a usted que dise
ne el esquema de clases necesario para organizar esta informaci
on y
permitir las operaciones antes mencionadas.
Asuma que dispone de una clase reutilizable Lista (que hizo en otro proyecto anterior) que le permite
encapsular una lista de instancias de cualquier clase que usted quiera como una instancia. Por ejemplo, la
notaci
on para una lista de instancias de la clase persona sera <Lista Persona> .
El esquema que debe desarrollar corresponde a la definici
on de las clases que estime pertinentes para resolver
el problema. Dicha definici
on debe incluir los atributos necesarios para almacenar toda la informaci
on relevante y la definici
on de las funciones que permiten manipular dicha informaci
on (solo la firma, no el c
odigo
interno de las funciones).
Criterios de soluci
on
Del enunciado desprendemos que se deben crear tres clases: una clase insumo, una clase proveedor y por
u
ltimo una clase gerente. Los atributos de un objeto insumo est
an detallados en el mismo enunciado: tipo,
valor y cantidad.
Para el objeto proveedor tambien es claro que debe tener un nombre, una cuenta y un rut. Sin embargo,
es importante reconocer que debe tener dos metodos, uno que cotice y otro que efectivamente venda. Notar
que ambos metodos retornan void ya que al recibir un objeto como par
ametro permite que estos puedan ser
cambiados dentro del metodo.
Posible Soluci
on
public class Insumo {
/* * Tipo de insumo , por ejemplo : " lapiz mina ". */
public String tipo ;
/* * Valor del insumo , en pesos , por ejemplo : 123 ,45.
* Si no se conoce el valor del insumo la variable es < 0. */
public float valor ;
/* * Cantidad de insumos de este tipo , por defecto en 0. */
public int cantidad ;
/* * C o n s t r u c t o r por valores */
public Insumo ( String tipo , float valor , int cantidad );
/* * C o n s t r u c t o r que usa los valores por defecto d e f i n i d o s */
public Insumo ( String tipo );
}
public class P r o v e e d o r {
/* * Stock de insumos que posee el p r o v e e d o r */
private Lista < Insumo > stock ;
/* * Dinero en posecion del p r o v e e d o r */
private float cuenta ;
/* * Nombre del p r o v e e d o r. */
public String nombre ;
/* * Rut del p r o v e e d o r */
public String rut ;
/* *
* Recibe una lista de insumos que c o r r e s p o n d e a una peticion . Modifica el
* valor de cada insumo de acuerdo al p r o v e e d o r Cambia la cantidad a la
* cantidad maxima de la que se dispone . Al ser un puntero los cambios
* pueden ser leidos por quien pidio la c o t i z a c i o n.
*/
public void Cotizar ( Lista < Insumo > insumos );
/* *
* Recibe una t r a n s a c c i o n de insumos . Elimina los insumos del stock del
* p r o v e e d o r e i n c r e m e n t a la cuenta acorde con la cantidad y valor de estos .
*/
public void Entregar ( Lista < Insumo > insumos );
}
public class Gerente {
/* * Dinero en posecion del gerente */
private float cuenta ;
/* * Insumos en la bodega */
private Lista < Insumo > bodega ;
/* * P r o v e e d o r e s c o n o c i d o s */
private Lista < Proveedor > bodega ;
/* *
* Realiza las o p e r a c i o n e s del gerente . D e t e r m i n a los insumos requeridos ,
* pide c o t i z a c i o n e s a los d i s t i n t o s proveedores , analiza las respuestas ,
* aprueba los p r e s u p u e s t o s y realiza la t r a n s a c c i o n final .
*/
public void Trabajar ();
}
10
Problema 4: Transantiago
Enunciado
Para salvar el Transantiago, la empresa de software QONDA ha dise
nado un sistema de informaci
on (programa) que controle las frecuencias de los buses con ayuda de los datos de posici
on y ocupaci
on entregados
en tiempo real por cada vehculo. El siguiente es un extracto del esquema de las clases que los ingenieros de
QONDA dise
naron para el sistema. Sugiera cambios para mejorar el encapsulamiento de la soluci
on sin que
el sistema pierda funcionalidad.
Los objetos de la clase bus usan informaci
on sobre el recorrido al que pertenecen, a fin de saber a que paradero deben ir. Con la informaci
on sobre el paradero, averiguan la hora de arribo al pr
oximo paradero a fin
de saber si deben acelerar o disminuir el paso.
Cada objeto de la clase recorrido, por su parte, conoce los paraderos por los que, en forma secuencial, deben
pasar los buses que le pertenecen, y los horarios esperados de detencion en cada paradero. Adem
as, conoce
a todos sus buses, a fin de decidir si deben distanciarse o acercarse para cumplir con las frecuencias establecidas, y datos sobre el operador (la empresa que controla el recorrido) para poder generar informes o dar
avisos por e-mail en caso de ser necesario.
Cada paradero sabe que recorridos se detienen en el y en que horarios deben pasar buses. Adem
as puede
estimar la cantidad de pasajeros que esperan en cada paradero en funci
on de la hora.
Un objeto hora guarda informaci
on sobre tiempos y permite realizar f
acilmente calculos de demoras y velocidades.
Criterios de soluci
on
La encapsulacion corresponde a esconder informaci
on relevante al exterior de un objeto, al mismo tiempo
que se minimiza el conocimiento de las clases, manteniendo s
olo las relaciones estrictamente necesarias para
que el programa cumpla su funci
on. Con esto se facilitan posibles modificaciones posteriores que se haga
al programa, puesto que en lugar de modificar todas las clases (todas se conocen, por lo que un cambio
repercute en todas), s
olo se modifica la clase implicada y, a lo m
as, sus relaciones directas, puesto que el
resto es indiferente de la implementaci
on particular, con tal de que el resultado sea coherente.
Del enunciado podemos derivar el siguiente modelo actual:
Esto se puede concluir del enunciado, por ejemplo, se dice que Los objetos de la clase bus usan informaci
on
sobre el recorrido al que pertenecen y por esto hay una conexion entre bus y recorrido.
11
Adem
as el sistema tiene las siguientes funcionalidades:
El bus sabe a d
onde dirigirse.
El bus sabe si debe acelerar o disminuir el paso.
Se puede saber a que recorrido pertenece cada bus.
El sistema puede comunicarse con el operador de cada recorrido.
Dado un paradero, se puede saber el horario de recorridos.
Se puede hacer c
alculos con horas de manera f
acil.
Es claro que no son necesarias tantas conexiones entre clases para poder tener esas funcionalidades, por lo
tanto es posible eliminar algunas y mantener un programa que hace lo mismo y es m
as eficiente.
Posible Soluci
on
A manera de ejemplo se puede hacer esto:
Se asigna la responsabilidad de dirigir los buses (destino y velocidad) a la clase recorrido, cubriendo
las dos primeras funcionalidades mencionadas. De esta manera se hacen innecesarias las conexiones
bus-paradero y bus-hora
Se puede saber a que recorrido pertenece cada bus (enlace bus-recorrido)
Se crea la clase operador para manejar el detalle de la informaci
on y las comunicaciones con los consignatarios de los recorridos. Un objeto de recorrido es responsable de generar sus reportes y comunicaciones,
que encarga al respectivo objeto operador.
Dado un paradero, se puede saber el horario de recorridos (enlace paradero-recorrido)
Que se pueda hacer c
alculos con horas de manera f
acil (clase hora, enlaces recorrido-hora y paraderohora, que trabajan con tiempos)
Es importante notar que esta no es la u
nica manera, este problema tiene m
ultiples soluciones y esta es tan
solo una de ellas.
12
13
14
15
16
.
que muestra el mensaje elM ensaje, y verifica que el entero ingresado por el usuario esta entre minimo
y maximo.
Criterios de soluci
on
Del enunciado concluimos que se deben crear dos clases:
1. clase Bebida:
a) Que tenga como atributos
1
2
3
17
el due
no (un String)
el tipo de envase y/o contenido (esta soluci
on lleva ambas)
b) Que tenga como metodos
el constructor (se sugiere que reciba los atributos correspondientes)
los getters y setters que se estimen correspondientes (en la solucion no se usan setters)
uno que calcule el premio del ganador
uno que determine si alguien ya termin
o su bebida
2. clase P rincipal: donde se pida que el usuario ingrese los datos, se creen los objetos (por lo menos
los 3, uno para cada participante), y se utilicen los metodos correspondientes, adem
as del metodo
verif icarEntero(String, int, int) como pide el enunciado
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class Bebida {
// [ A T R I B U T O S]
private String duenio ; // nombre del duenio de la lata
private int t i p o E n v a s e; // 0 lata , 1 botella de 1 lt , 2 de 2 lt , y 3 de 3 lt
private int c o n t e n i d o; // c o n t e n i d o actual ( en cc )
// [ METODOS ]
// C o n s t r u c t o r
public Bebida ( String duenio , int t i p o E n v a s e) {
this . duenio = duenio ;
this . t i p o E n v a s e = t i p o E n v a s e;
switch ( t i p o E n v a s e) {
case 0:
this . c o n t e n i d o = 350;
break ;
case 1:
this . c o n t e n i d o = 1000;
break ;
case 2:
this . c o n t e n i d o = 2000;
break ;
case 3:
this . c o n t e n i d o = 3000;
break ;
}
}
// getters ( retorna el valor de la variable c o r r e s p o n d i e n t e)
public String g e t D u e n i o() {
return duenio ;
}
public int g e t C o n t e n i d o() {
return c o n t e n i d o;
}
// otros
public int c a l c u l a r G a n a n c i a () {
int precio = 0;
switch ( t i p o E n v a s e) {
case 0:
precio = 350;
break ;
case 1:
precio = 500;
break ;
case 2:
precio = 800;
break ;
case 3:
precio = 1000;
break ;
}
precio *= 1000000;
return precio ;
}
18
10 y 100 cc ,
Si es negativo no es problema
y cuanto queda
un sorbo de " + sorbo
}
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l B e b i d a {
/* *
* Programa que simula un concurso de bebidas
*/
// Se le pide a cada uno de los 3 usuarios que ingrese su nombre y bebida
// para competir .
// La lata cuesta 350 , la botella de 1 lt 500 , de 2 lt 800 , y de 3 lt 1000.
// El primero que se termina su bebida gana 1000000 veces el precio que
// pago .
public static void main ( String [] args ) {
String m e n s a j e N o m b r e = " B i e n v e n i d o al concurso . Ingrese su nombre : " ;
String m e n s a j e B e b i d a = " Ingrese la bebida que quiere para competir : "
+ " \ n [0] lata
( 350 cc ) " + " \ n [1] botella (1000 cc ) "
+ " \ n [2] botella (2000 cc ) " + " \ n [3] botella (3000 cc ) " ;
Bebida b1 , b2 , b3 ;
String n o m b r e C o n c u r s a n t e 1 = Usuario . texto ( m e n s a j e N o m b r e);
int t i p o B e b i d a 1 = v e r i f i c a r E n t e r o( mensajeBebida , 0 , 3);
b1 = new Bebida ( n o m b r e C o n c ur sa nte 1 , t i p o B e b i d a 1);
String n o m b r e C o n c u r s a n t e 2 = Usuario . texto ( m e n s a j e N o m b r e);
int t i p o B e b i d a 2 = v e r i f i c a r E n t e r o( mensajeBebida , 0 , 3);
b2 = new Bebida ( n o m b r e C o n c ur sa nte 2 , t i p o B e b i d a 2);
String n o m b r e C o n c u r s a n t e 3 = Usuario . texto ( m e n s a j e N o m b r e);
int t i p o B e b i d a 3 = v e r i f i c a r E n t e r o( mensajeBebida , 0 , 3);
b3 = new Bebida ( n o m b r e C o n c ur sa nte 3 , t i p o B e b i d a 3);
int c a n t i d a d T r a g o s = 1;
while (( b1 . s e g u i r B e b i e n d o() && b2 . s e g u i r B e b i e n d o() && b3 . s e g u i r B e b i e n d o ())) {
Usuario . mensaje ( " Llevamos " + c a n t i d a d T r a g o s + " sorbos , y aun no hay ganador ! " );
c a n t i d a d T r a g o s ++;
}
// m o s t r a m o s el mensaje de f e l i c i t a c i o n p e r s o n a l i z a d o que nos piden
String f e l i c i d a d e s = " F e l i c i d a d e s " ;
int premio = 0;
if ( b1 . g e t C o n t e n i d o() <= 0) {
f e l i c i d a d e s += b1 . g e t D u e n i o();
premio = b1 . c a l c u l a r G a n a n c i a();
} else if ( b2 . g e t C o n t e n i d o() <= 0) {
f e l i c i d a d e s += b2 . g e t D u e n i o();
premio = b2 . c a l c u l a r G a n a n c i a();
} else {
f e l i c i d a d e s += b3 . g e t D u e n i o();
premio = b3 . c a l c u l a r G a n a n c i a();
}
f e l i c i d a d e s += " ha ganado luego de " + c a n t i d a d T r a g o s + " tragos . " ;
f e l i c i d a d e s += " \ nSu premio es de : " + premio ;
Usuario . mensaje ( f e l i c i d a d e s);
}
// metodo que muestra el mensaje < elMensaje > , y verifica que el entero
// i n g r e s a d o
// por el usuario este entre < minimo > y < maximo >.
public static int v e r i f i c a r E n t e r o( String elMensaje , int minimo , int maximo ) {
int valor = -1;
while ( valor < minimo || valor > maximo ) {
valor = Usuario . entero ( e l M e n s a j e);
}
return valor ;
}
}
19
.
Se ha definido la clase Seccion (del barco) de la siguiente manera:
public class Seccion {
// c a p a c i d a d maxima de la seccion
private int c a p a c i d a d T o t a l;
// c a p a c i d a d d i s p o n i b l e en la seccion
private int c a p a c i d a d;
// tamano de c o n t a i n e r que puede a l m a c e n a r: 20 o 40 pies
private int tamano ;
// true si se utiliza solo para a l m a c e n a r c o n t a i n e r s r e f r i g e r a d o s
private boolean r e f r i g e r a d o;
// Crea un objeto de la clase Seccion ; genera en forma a l e a t o r i a
// el tipo de C o n t a i n e r s que puede a l m a c e n a r y su c a p a c i d a d
public Seccion (){ ... }
// Intenta agregar un c o n t a i n e r a la seccion ;
// retorna true si es factible hacerlo
public boolean Agregar ( C o n t a i n e r c ) { ... }
// Retorna true si la seccion esta llena
public boolean Lleno () { ... }
// Muestra en la consola los datos de la seccion
public void Mostrar () { ... }
}
20
Criterios de soluci
on
El enunciado es bastante estructurado, por lo que seguimos los pasos pedidos
1. clase Seccion:
a) Implementamos el metodo Agregar, el cu
al recibe un Container como par
ametro y retorna true si
fue posible agregarlo.
Para agregar un container hay que revisar que la secci
on tenga capacidad, que el tama
no del
container sea posible de almacenar en la seccion y si requiere refigeracion que la secci
on lo
pueda almacenar. Si no se cumple alguna de estas condiciones se debe retornar false. Si se
puede almacenar, debemos disminuir la capacidad de la seccion.
2. clase Barco:
a) Declaramos los atributos: Como dice el enunciado debe tener 3 secciones, o sea, 3 objetos de la
clase Seccion.
b) Implementar un constructor: En el creamos los tres objetos de la clase Seccion declarados como
atributos.
c) Implementar el metodo Agregar: Seg
un la seccion recibida como par
ametro llamamos al metodo
agregar de la seccion que corresponda y retornamos true o false seg
un si se pudo o no agregar el
container a la seccion requerida.
d ) Implementar el metodo Lleno: Llamamos al metodo Lleno de las 3 secciones del barco y retornamos
true s
olo si las tres secciones estan llenas. De lo contrario, retornamos false.
21
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class Seccion {
// c a p a c i d a d maxima de la seccion
private int c a p a c i d a d T o t a l;
// c a p a c i d a d d i s p o n i b l e en la seccion
private int c a p a c i d a d;
// tamano de c o n t a i n e r que puede a l m a c e n a r: 20 o 40 pies
private int tamano ;
// true si se utiliza solo para a l m a c e n a r c o n t a i n e r s r e f r i g e r a d o s
private boolean r e f r i g e r a d o;
// Crea un objeto de la clase Seccion ; genera en forma a l e a t o r i a
// el tipo de C o n t a i n e r s que puede a l m a c e n a r y su c a p a c i d a d
public Seccion () {
this . tamano = A l e a t o r i o. entero (20 , 40);
this . c a p a c i d a d T o t a l = 100;
this . r e f r i g e r a d o = false ;
}
// Intenta agregar un c o n t a i n e r a la seccion ;
// retorna true si es factible hacerlo
public boolean Agregar ( C o n t a i n e r c ) {
boolean exito ;
if ( c . g e t T a m a n o() == tamano && c . i s R e f r i g e r a d o() == r e f r i g e r a d o
&& c a p a c i d a d > 0) {
c a p a c i d a d = c a p a c i d a d - 1;
exito = true ;
} else {
exito = false ;
}
return exito ;
}
// Retorna true si la seccion esta llena
public boolean Lleno () {
if ( c a p a c i d a d >= c a p a c i d a d T o t a l) {
return true ;
} else {
return false ;
}
}
// Muestra en la consola los datos de la seccion
public void Mostrar () {
}
}
public class Barco {
private Seccion s1 , s2 , s3 ;
public Barco () {
s1 = new Seccion ();
s2 = new Seccion ();
s3 = new Seccion ();
}
// Intenta agregar un c o n t a i n e r a la seccin n u m S e c c i o n;
// retorna true si es factible hacerlo
public boolean Agregar ( C o n t a i n e r c , int n u m S e c c i o n) {
boolean exito = false ;
if ( n u m S e c c i o n == 1)
exito = s1 . Agregar ( c );
else if ( n u m S e c c i o n == 2)
exito = s2 . Agregar ( c );
else if ( n u m S e c c i o n == 3)
exito = s3 . Agregar ( c );
return exito ;
}
// Retorna true si el barco esta lleno
public boolean Lleno () {
boolean lleno = true ;
lleno = ( s1 . Lleno () && s2 . Lleno () && s3 . Lleno ());
return lleno ;
}
}
22
Problema 9: C
odigo a descifrar
Enunciado
Para el siguiente c
odigo, indique el output que aparecera en la Consola.
public class ClassA {
private String id ;
private ClassA hijo ;
private int total ;
public ClassA ( String n ) {
id = n ;
total = 0;
}
public
public
public
public
public
}
public static void main ( String [] args ) {
ClassA a = new ClassA ( " Juanito " );
ClassA b = new ClassA ( " Pacita " );
ClassA c = new ClassA ( " Pedrito " );
a . setHijo ( b );
b . aumentar (4);
int delta = 3;
c . aumentar ( delta ++);
b . setHijo ( c );
if ( a . getHijo (). getTotal () > 3) {
ClassA d = a . getHijo ();
Interfaz . M o s t r a r M e n s a j e C o n s o l a( " L1 : " + d . getId () + " " + d . getTotal ());
}
Interfaz . M o s t r a r M e n s a j e C o n s o l a( " L2 : " + c . getId () + " " + c . getTotal ());
c . aumentar ( delta );
c . setHijo ( a . getHijo ());
if ( a . getHijo (). getHijo (). getHijo (). getTotal () == b . getTotal ())
Interfaz . M o s t r a r M e n s a j e C o n s o l a( " L3 : " + b . getId () + " " + b . getHijo (). getTotal ());
b . aumentar ( c . getTotal () - b . getTotal ());
if ( a . getHijo (). getTotal () != b . getHijo (). getTotal ())
Interfaz . M o s t r a r M e n s a j e C o n s o l a( " L4 : " + a . getId () + " " + a . getHijo (). getTotal ());
int total = a . getTotal () + b . getTotal () + c . getTotal ();
Interfaz . M o s t r a r M e n s a j e C o n s o l a( " L5 : " + total );
}
Criterios de soluci
on
En este tipo de problemas es buena opci
on escribir a un lado una tabla con las variables y objetos, e ir
anotando los cambios lnea a lnea, realizando una especie de debug manual. Se debe ser bastante sistem
atico
para no equivocarse, y cuidar interpretar correctamente los cambios en las variables y en los objetos.
Posible Soluci
on
L1:
L2:
L3:
L5:
Pacita 4
Pedrito 3
Pacita 7
14
23
a
b
c
d
=
=
=
=
new
new
new
new
Linea (7);
Linea (5);
Linea (3);
Linea (1);
24
Respecto al c
odigo anterior responda las siguientes preguntas:
1. Cu
al es el u
ltimo despliegue que el programa realiza para los siguientes datos de entrada?
Fila
N
umero
3
3
1
7
2
4
4
1
2. Muestre el estado (valor de los atributos) de los objetos instanciados al final del while para los
siguiente datos de entrada.
Fila
N
umero
1
4
3
2
3
1
2
4
1
1
2
1
1
1
4
1
Criterios de soluci
on
En este tipo de problemas es buena opci
on escribir a un lado una tabla con las variables y objetos, e ir
anotando los cambios lnea a lnea, realizando una especie de debug manual. Se debe ser bastante sistem
atico
para no equivocarse, y cuidar interpretar correctamente los cambios en las variables y en los objetos.
Posible Soluci
on
1. Pierde 1
2.
Input
Fila N
umero
1
4
3
2
3
1
2
4
1
1
2
1
1
1
4
1
Instancias
a b c d
3 5 3 1
3 5 1 1
3 5 0 1
3 1 0 1
2 1 0 1
2 0 0 1
1 0 0 1
1 0 0 0
25
Mover: Este
es el metodo responsable de mover al bicho una unidad. Como tambien se nos pide una
forma de darse cuenta cuando el bicho aterriza, hacemos que el metodo retorne true cuando esto
ocurra o false en caso contrario. Para esto, primero revisamos en que sentido se esta moviendo (derecha
o izquierda), luego revisamos que no este en alguno de los dos bordes. Si est
a en un borde aumentamos
una unidad su posici
on en y y cambiamos el sentido. Si no est
a en un borde, aumentamos o disminuimos
su posici
on en x (seg
un el sentido). Finalmente, revisamos si la posici
on en y ha llegado al suelo. Si
lleg
o al suelo retornamos true y si no retornamos false.
Recibir Da
no: Este
es el metodo responsable de indicar al bicho que ha recibido da
no. Nuevamente,
como nos piden en el enunciado una forma de darse cuenta cuando el bicho ha sido destruido, hacemos
que el metodo retorne true cuando esto ocurra o false en caso contrario. Para esto, recibimos el da
no
como parametro y disminuimos la resistencia del bicho en esta cantidad. Finalmente, revisamos si la
resistencia ha llegado a cero, si es as retornamos true, de lo contrario, retornamos false.
26
Posible Soluci
on
class Invader {
int x ; // Posicion en el eje X
int y ; // Posicion en el eje Y
int h i t P o i n t s; // R e s i s t e n c i a del bicho
boolean g o i n g R i g h t; // true si voy hacia la derecha , false i z q u i e r d a
public Invader ( int X , int Y , int HP ) {
x = X;
y = Y;
h i t P o i n t s = HP ;
g o i n g R i g h t = true ;
}
public boolean Mover () {
if ( g o i n g R i g h t) {
if ( x == 50) {
y ++;
g o i n g R i g h t = false ;
} else
x ++;
} else {
if ( x == 0) {
y ++;
g o i n g R i g h t = true ;
} else
x - -;
}
if ( y == 35)
return true ;
else
return false ;
}
public boolean T a k e D a m a g e( int damage ) {
h i t P o i n t s -= damage ;
return ( h i t P o i n t s < 0);
}
}
27
.
Su metodo main debe realizar lo siguiente:
Crear un Curso.
Mostrar al usuario un men
u que le permita realizar las siguientes opciones:
Agregar un nuevo Alumno. En este caso se debe pedir el nombre y el promedio al usuario, crear
un Alumno y agregarlo al curso.
Eliminar un Alumno. Se le debe pedir al usuario que ingrese un nombre seg
un el cual se debe
intentar eliminar al alumno. Se debe mostrar al usuario si se elimin
o (el alumno exista) o no el
alumno.
Ver el promedio general del Curso. Se debe mostrar al usuario el promedio general del curso.
Ver el mejor Alumno. Se debe mostrar al usuario el nombre y el promedio del alumno con mejor
promedio.
Salir. Se debe terminar el programa.
El men
u debe aparecer una y otra vez hasta que el usuario seleccione salir.
Puede suponer que los datos ingresados por el usuario son validos.
Criterios de soluci
on
En problemas como este lo m
as importante es conocer cuales son los metodos y clases disponibles para hacer
correcto uso de ellos y no escribir mas codigo del que corresponde.
Siguiendo lo pedido en el enunciado debemos:
Crear un objeto de la clase Curso.
Implementar un ciclo que contin
ue pidiendo la opci
on que desea al usuario mientras este no elija salir
del programa.
Revisar la opci
on ingresada por el usuario.
Opci
on Agregar Alumno: Debemos pedir al usuario que ingrese el nombre y el promedio del nuevo
alumno. Crear un nuevo objeto de la clase Alumno con los datos ingresados por el usuario. Llamar al
metodo AgregarAlumno de la clase Curso, pasando el nuevo alumno como par
ametro.
IIC1103 Captulo 4: Clases
28
Opci
on Eliminar Alumno: Debemos pedir al usuario el nombre del alumno que se desea eliminar.
Llamar al metodo EliminarAlumno de la clase Curso pasando el nombre ingresado por el usuario
como parametro. Revisar lo retornado por el metodo y mostrar un mensaje al usuario indicando si se
pudo o no eliminar el alumno pedido.
Opci
on Ver Promedio General: Debemos llamar al metodo P romedio de la case Curso y mostrar en
un mensaje lo retornado por este metodo.
Opci
on Ver Mejor Alumno: Debemos llamar al metodo M ejorP romedio que nos retorna el alumno con
mejor promedio. Luego, del alumno obtenido, debemos mostrar en un mensaje el nombre del alumno
y su promedio, llamando a los metodos V erN ombre y V erP romedio de la clase Alumno
Opci
on Salir: Terminar el ciclo
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
Curso clase = new Curso ();
int opcion = -1;
while ( opcion != 0) {
opcion = Usuario . entero (" Elija una opcion : "
+ " \ n (1) Agregar Alumno " + " \ n (2) Eliminar Alumno "
+ " \ n (3) Ver promedio general " + " \ n (4) Ver mejor alumno "
+ " \ n (0) Salir " );
if ( opcion == 1) {
String nombre = Usuario . texto ( " Ingrese Nombre " );
double prom = Usuario . real ( " Ingrese promedio " );
Alumno nuevo = new Alumno ( nombre , prom );
clase . A g r e g a r A l u m n o( nuevo );
} else if ( opcion == 2) {
String nombre2 = Usuario . texto ( " Ingrese nombre " );
if ( clase . E l i m i n a r A l u m n o( nombre2 )) {
Usuario . mensaje ( " El alumno fue e l i m i n a d o. " );
} else {
Usuario . mensaje ( " El alumno no estaba en el curso . " );
}
} else if ( opcion == 3) {
Usuario . mensaje ( " Promedio general : " + clase . Promedio ());
} else if ( opcion == 4) {
Alumno mejor = clase . M e j o r P r o m e d i o ();
Usuario . mensaje ( " Mejor alumno es " + mejor . V e r N o m b r e()
+ " con un " + mejor . V e r P r o m e d i o ());
}
}
}
}
29
Criterios de soluci
on
Por lo explicado en el enunciado y lo mostrado en el metodo main entregado podemos ver c
omo debe ser
nuestra clase T ren:
Atributos: capacidad de pasajeros, estaciones por las que pasa, pasajeros transportados, pasajeros
actualmente arriba del tren, estaci
on actual en la que se encuentra el tren.
Constructor: Del metodo main podemos ver que debe recibir como par
ametros la capacidad y la
cantidad de estaciones por las que pasa. Estos valores los asignamos a los atributos correspondientes.
Metodo subirP asajeros: Del metodo main podemos ver que debe recibir como parametro el n
umero de
pasajeros a subir. Luego debemos revisar que al subir los nuevos pasajeros no se sobrepase la capacidad
del tren. Si se sobrepasa la capacidad retornamos false, en caso contrario, actualizamos la cantidad de
pasajeros actualmente en el tren y la cantidad de pasajeros transportados y retornamos true.
Metodo arribaEstacion : Como dice el enunciado lo primero que debemos hacer es disminuir la cantidad
de pasajeros que actualmente est
an en el tren a la mitad. Luego actualizamos la estaci
on en la que se
encuentra el tren y revisamos si corresponde a su u
ltima estaci
on. Si se encuentra en la u
ltima estaci
on
bajamos a todos los pasajeros y retornamos true. Si no se encuentra en la u
ltima estaci
on retornamos
false.
30
31
Problema 14: A
no bisiesto
Enunciado
Existen personas que han nacido en 29 de Febrero, y necesitan saber si en un a
no determinado deber
an
festejar su cumplea
nos el da 1 de Marzo o efectivamente podr
an celebrarlo el da correcto.
Para solucionar este problema, se le pide a usted que cree una clase que permita representar diferentes fechas
bas
andose en el da, mes y a
no.
Se debe validar que al crear una fecha la misma quede en un estado consistente, para ello usted puede asumir
que el a
no es correcto pero no sucede as con el mes y los das, ya que los mismos se encuentran en un rango
de 1 a 12 para el primer caso y 1 a 28-31 (dependiendo del mes y a
no) en el segundo caso.
En detalle, usted deber
a:
Crear una clase que represente la fecha junto a sus atributos.
Crear un metodo de esa clase que devuelva si el a
no es o no bisiesto.
Crear en esa clase todos los metodos necesarios para validar los das y meses. Recuerde que para validar
los das debe tener en cuenta el mes y si el a
no es bisiesto.
Luego de definir la clase Fecha usted debe escribir el metodo main en donde:
Se le pida al usuario el da, mes y a
no de dos fechas.
32
Llamar a los metodos necesarios para comprobar ambas fechas y mostrar un mensaje al usuario indicando si son validas o no.
Llamar al metodo que indica si el a
no es bisiesto y seg
un lo retornado por el metodo mostrar un
mensaje al usuario, para cada una de las fechas.
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class Fecha {
private int dia ;
private int mes ;
private int anio ;
public Fecha ( int elDia , int elMes , int elAnio ) {
dia = elDia ;
mes = elMes ;
anio = elAnio ;
}
public void c o m p r o b a r F e c h a () {
int testDia = 0;
int testMes = this . c o m p r o b a r M e s( mes );
if ( testMes != -1) {
if ( e s B i s i e s t o( anio )) {
testDia = this . c o m p r o b a r D i a( dia , 28);
} else {
testDia = this . c o m p r o b a r D i a( dia , 29);
}
if ( testDia != -1) {
Usuario . mensaje ( " Fecha valida " );
} else {
Usuario . mensaje ( " Fecha invalida " );
}
} else {
Usuario . mensaje ( " Fecha invalida " );
}
}
private int c o m p r o b a r D i a( int elDia , int unDia ) {
if ( mes == 2) {
if ( elDia <= unDia && elDia >= 1) {
return mes ;
} else {
return -1;
}
} else {
if ( mes == 2 || mes == 4 || mes == 6 || mes == 9 || mes == 11) {
if ( elDia <= 30 && elDia >= 1) {
return mes ;
} else {
return -1;
}
} else {
if ( elDia <= 31 && elDia >= 1) {
return mes ;
} else {
return -1;
}
}
}
}
public boolean e s B i s i e s t o( int elAnio ) {
if (( elAnio % 400 == 0) || (( elAnio % 4 == 0) && ( elAnio % 100 != 0))) {
return true ;
} else {
return false ;
}
}
33
34
35
Posible Soluci
on
public class Reloj {
private int horas ;
private int minutos ;
private int segundos ;
/* *
* C o n s t r u y e un reloj .
*
* @param hora
*
De 0 a 23
* @param minuto
*
De 0 a 59
* @param segundo
*
De 0 a 59
*/
public Reloj ( int hora , int minuto , int segundo ) {
setHoras ( hora );
s e t M i n u t o s( minuto );
s e t S e g u n d o s( segundo );
}
/* * Avanza el tiempo del reloj en un segundo . */
public void a v a n z a r S e g u n d o () {
segundos ++;
if ( segundos >= 60) {
segundos = 0;
minutos ++;
}
if ( minutos >= 60) {
minutos = 0;
horas ++;
}
if ( horas >= 24) {
horas = 0;
}
}
/* *
* @return Los grados en donde debe estar p o s i c i o n a d a la aguja horaria .
*/
public int g r a d o s H o r a r i o() {
return (450 - 30 * ( horas % 12)) % 360;
}
/* *
* @return Los grados en donde debe estar p o s i c i o n a d o el minutero .
*/
public int g r a d o s M i n u t e r o() {
return (450 - 6 * minutos ) % 360;
}
/* *
* @return Los grados en donde debe estar p o s i c i o n a d o el s e g u n d e r o.
*/
public int g r a d o s S e g u n d e r o () {
return (450 - 6 * segundos ) % 360;
}
/* *
* @param horas
*
the horas to set
*/
public void setHoras ( int horas ) {
this . horas = horas ;
if ( horas < 0 || horas >= 24) {
horas = 0;
}
}
/* *
* @param minutos
*
the minutos to set
*/
public void s e t M i n u t o s( int minutos ) {
this . minutos = minutos ;
36
37
el m
etodo Aleatorio.entero(int a, int b) que retorna un n
umero aleatorio en el rango [a, b].
38
Para iniciar el juego necesitamos implementar un constructor que reciba valores para los atributos
y los asigne.
Adem
as podemos implementar un metodo que revise las ganancias del jugador comparando con el
n
umero de la ruleta y el n
umero al que el jugador apost
o, retornando el monto ganado o perdido.
Finalmente debemos implementar un metodo que implemente la l
ogica del juego: Pida a los
jugadores su apuesta y el monto a apostar (utilizando los metodos de la clase Jugador). Genere el
n
umero de la ruleta aleatoriamente. Revise los resultados y actualice las ganancias de los jugadores.
Repita todo lo anterior mientras el dinero de cada jugador se mantenga en el rango establecido y
cuando termine muestre el nombre del jugador que gana.
3. Clase Principal:
Esta clase debe tener el metodo main el cual pida los datos necesarios al usuario para crear los
dos jugadores y el n
umero de casillas de la ruleta. Cree los dos jugadores y la ruleta y finalmente
llame al metodo de la clase Ruleta que implementa la l
ogica del juego. Mostrando al final del
juego el nombre del jugador ganador.
Posible Soluci
on
public class Jugador {
private String nombre ;
private int dinero ;
public Jugador ( String n , int d ) {
nombre = n ;
dinero = d ;
}
public int e l e g i r M o n t o A p u e s t a () {
int apuesta = Usuario . entero ( nombre + " , cuanto desea apostar ? " );
while ( apuesta <= 0 || apuesta > dinero ) {
apuesta = Usuario . entero ( nombre + " , cuanto desea apostar ? " );
}
return apuesta ;
}
public int e l e g i r N u m e r o A p u e s t a( int max ) {
int numero = Usuario . entero ( nombre + " , a que numero desea apostar ? " );
while ( numero <= 0 || numero > max ) {
numero = Usuario . entero ( nombre + " , a que numero desea apostar ? " );
}
return numero ;
}
public String g e t N o m b r e() {
return nombre ;
}
public int g e t D i n e r o() {
return dinero ;
}
public void a c t u a l i z a r D i n e r o( int delta ) {
dinero += delta ;
}
}
39
40
.
El metodo main que usted debe implementar debe realizar lo siguiente:
1. Crear una torre de estacionamientos para un m
aximo de 5 pisos.
2. Pedir al usuario una cantidad de pisos para agregar a la torre.
3. Para cada piso, pedir al usuario la informaci
on necesaria para crearlo y agregarlo al edificio de estacionamientos. En caso de no poder agregarlo mostrarle un mensaje en consola al usuario indicando esta
situacion.
4. Seleccionar un n
umero random en el rango [10, 100] que indicar
a la cantidad de vehculos que llegar
an.
41
5. Para cada vehculo pedir al usuario la patente y obtener aleatoriamente el tipo de vehculo (auto
normal, lisiado o cami
on).
6. Intentar agregar el vehculo a alguno de los pisos de la torre de estacionamientos. Si no es posible
agregarlo en ninguno de los pisos, se debe mostrar un mensaje consola indicando al usuario la patente
del vehculo que no se pudo agregar.
7. Por u
ltimo debe buscar en que piso se encuentra el vehculo de patente BCBC22, y mostrar en consola
el ndice del piso. Si no es posible encontrarlo debe mostrar un mensaje en consola indicando esto.
Criterios de soluci
on
El enunciado es bastante estructurado. Tenemos que ir realizando paso a paso lo que se nos pide:
Llamar al constructor de la clase Estacionamiento pasando como par
ametro un 5, que corresponde a
los 5 pisos que tendr
a el estacionamiento.
Pedir al usuario la cantidad de pisos y guardar el valor ingresado en una variable.
Implementar un ciclo que permita ir creando cada uno de los pisos y agregarlo al estacionamiento.
Dentro del ciclo pedir al usuario la capacidad del piso y si acepta camiones. Crear un nuevo piso con
los valores ingresados por el usuario. Llamar al metodo agregarP iso de la clase Estacionamiento
pasando como par
ametro el piso recien creado. Revisar lo retornado por el metodo y, si no pudo
agregarse, mostrar un mensaje al usuario indic
andolo.
Generar aleatoriamente el n
umero de vehculos que llegar
an.
Implementar un ciclo para crear los vehculos que llegan.
Dentro del ciclo pedir al usuario la patente del auto y generar aletoriamente el tipo. Crear un objeto
de la clase V ehiculo con los datos.
Luego de crear el vehculo implementar un ciclo que intente agregarlo a alg
un piso.
Dentro de este ciclo obtener cada uno de los pisos y llamar al metodo agregarV ehiculo de la clase
P iso. Revisar lo retornado por el metodo para identificar si se pudo agregar.
Si no se pudo agregar a ning
un piso mostrar un mensaje informando al usuario.
Implementar ciclo para buscar en cada uno de los pisos la patente BCBC22.
Dentro del ciclo obtener cada uno de los pisos del estacionamiento. Llamar al metodo buscar de la
clase P iso con la patente buscada. Revisar lo retornado por el metodo para determinar si se encontr
o.
Mostrar un mensaje al usuario indicando si se encontr
o o no.
42
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
// Creamos el e s t a c i o n a m i e n t o
E s t a c i o n a m i e n t o parking = new E s t a c i o n a m i e n t o (5);
// Creamos y a g r e g a m o s los pisos , pidiendo la i n f o r m a c i o n al usuario
int numPisos = Usuario . entero ( " Ingrese la cantidad de pisos , max . 5. " );
while ( numPisos < 1 || numPisos > 5) {
numPisos = Usuario . entero ( " Ingrese la cantidad de pisos , max . 5. " );
}
for ( int i = 0; i < numPisos ; i ++) {
// Pedimos i n f o r m a c i o n al usuario
int cap = Usuario . entero ( " C a p a c i d a d del piso " );
int camiones = Usuario . entero ( " Este piso acepta camiones ?\ n (0) No \ n (1) Si " );
boolean a c e p t a C a m i o n e s = true ;
if ( camiones == 0) {
a c e p t a C a m i o n e s = false ;
}
// I n t e n t a m o s agregar el piso al edificio de e s t a c i o n a m i e n t o s .
if (! parking . a g r e g a r P i s o( new Piso ( cap , a c e p t a C a m i o n e s ))) {
Usuario . m e n s a j e C o n s o l a( " No fue posible agregar el piso . " );
}
}
// Ahora creamos los autos que llegaran al e s t a c i o n a m i e n t o
int numAutos = A l e a t o r i o. entero (10 , 100);
for ( int i = 0; i < numAutos ; i ++) {
// Pedimos la patente al usuario , y el tipo es random
String patente = Usuario . texto ( " Ingrese patente " );
int tipo = A l e a t o r i o. entero (0 , 2);
Vehiculo vehiculo = new Vehiculo ( patente , tipo );
// Buscamos un piso para a g r e g a r l o
boolean agregado = false ;
for ( int j = 0; j < parking . g e t N u m P i s o s() && ! agregado ; j ++) {
// O b t e n e m o s el piso
Piso piso = parking . o b t e n e r P i s o( j );
// I n t e n t a m o s a g r e g a r l o
if ( piso . a g r e g a r V e h i c u l o( vehiculo )) {
agregado = true ;
}
}
if (! agregado ) {
Usuario . m e n s a j e C o n s o l a( " No fue posible agregar el vehiculo : "
+ vehiculo . g e t P a t e n t e ());
}
}
// Buscamos si esta el vehiculo BCBC22 , i n d i c a m o s el piso
boolean e n c o n t r a d o = false ;
for ( int i = 0; i < parking . g e t N u m P i s o s() && ! e n c o n t r a d o; i ++) {
Piso piso = parking . o b t e n e r P i s o( i );
if ( piso . buscar ( " BCBC22 " ) != null ) {
Usuario . m e n s a j e C o n s o l a( " BCBC22 se e n c u e n t r a en el piso " + i );
e n c o n t r a d o = true ;
}
}
if (! e n c o n t r a d o) {
Usuario . m e n s a j e C o n s o l a( " BCBC22 no se e n c u e n t r a . " );
}
}
}
43
fV
V
d
onde:
|(V Vi )|2
d
definici
on,
esta siempre debe ser menor o igual al valor recibido.
44
45
Metodo mostrarRendimiento: Lo declaramos tal como nos indican en el enunciado. Para mostrar
las distintas velocidad podemos utilizar un ciclo (un f or por ejemplo) que vaya avanzando la
velocidad seg
un el par
ametro p. Para cada velocidad calculamos el rendimiento llamando al metodo
calcularRendimiento y lo mostramos en un mensaje.
Metodo mostrarEstado: Lo declaramos tal como nos indican en el enunciado. Mostramos en un
mensaje el valor que tienen los atributos: od
ometro y combustible.
2. Clase P rincipal: Metodo main
Pedimos al usuario el tama
no del estanque, rendimiento y velocidad ideal para cada uno de los
autos.
Creamos dos objetos de la clase Auto con los datos ingresados por el usuario.
Implementamos un ciclo para mostrar el men
u con las opciones, que no termine hasta el que
usuario ingrese la opci
on Salir.
Revisamos la opcion ingresada y determinamos con cu
al de los dos autos se trabajar
a.
Implementamos otro ciclo para mostrar el men
u con las opciones para un auto especfico.
Revisamos la opcion ingresada por el usuario y llamamos al metodo de la clase Auto que corresponda seg
un la opci
on, pidiendo al usuario los valores necesarios para pasar como parametro al
metodo.
Opci
on Comparar Rendimiento: Llamamos al metodo mostrarRendimiento de cada uno de los
autos.
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class Auto {
private double t a m E s t a n q u e;
private double c o m b u s t i b l e;
private double r e n d i m i e n t o;
private double v e l R e n d i m i e n t o I d e a l;
private double odometro ;
public Auto ( double tamEstanque , double rendimiento ,
double v e l R e n d i m i e n t o I d e a l) {
// I n i c i a l i z a m o s todos los a t r i b u t o s de la clase
this . t a m E s t a n q u e = t a m E s t a n q u e;
this . c o m b u s t i b l e = 0;
this . r e n d i m i e n t o = r e n d i m i e n t o;
this . v e l R e n d i m i e n t o I d e a l = v e l R e n d i m i e n t o I d e a l;
this . odometro = 0;
}
public double e c h a r B e n c i n a( double litros ) {
// R e v i s a m o s si el espacio en el estanque es s u f i c i e n t e para los litros
// que se quieren echar .
if ( t a m E s t a n q u e - c o m b u s t i b l e > litros ) {
c o m b u s t i b l e += litros ;
return litros ;
} else {
// Si los litros son mas que el espacio disponible , llenamos el
// estanque y r e t o r n a m o s los litros reales u t i l i z a d o s.
double delta = t a m E s t a n q u e - c o m b u s t i b l e;
c o m b u s t i b l e = t a m E s t a n q u e;
return delta ;
}
}
public double c a l c u l a r R e n d i m i e n t o( double vel ) {
// C a l c u l a m o s el divisor segun si es mayor o menor a la v e l o c i d a d ideal
int div = 8;
if ( vel > v e l R e n d i m i e n t o I d e a l) {
div = 10;
}
46
47
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
// Pedimos la i n f o r m a c i o n al usuario
double e s t a n q u e 1 = Usuario . real ( " Ingrese la
double r e n d i m i e n t o 1 = Usuario . real ( " Ingrese
double v e l I d e a l 1 = Usuario . real ( " Ingrese la
double e s t a n q u e 2 = Usuario . real ( " Ingrese la
double r e n d i m i e n t o 2 = Usuario . real ( " Ingrese
double v e l I d e a l 2 = Usuario . real ( " Ingrese la
48
1
)2 )
distancia (1 + ( ef iciencia
1000
Si se emplear
an balas, entonces se necesitar
a la siguiente cantidad de disparos:
NB = NM 120
boolean atacar(boolean misil, int distancia) permite atacar un blanco ubicado a una determinada distancia (en metros). Si el par
ametro misil es true, entonces corresponder
a atacar
utilizando misiles, y si es false, sera con balas. Si el blanco est
a ubicado a menos de 100 mts. o a m
as
de 5,000 mts., el tanque no realizar
a el ataque (por seguridad e incapacidad de alcance respectivamente). Asimismo, si el tanque no tiene disponible el tipo de munici
on con que se decide atacar, tampoco
lo realizar
a. En ambos casos, el metodo deber
a retornar false. Si la cantidad de disparos necesarios
para derribar el blanco es mayor que la cantidad disponible para el determinado tipo de munici
on,
ataca de todas formas aunque signifique un ataque no exitoso. Si, por el contrario, el tanque dispone
de al menos las municiones necesarias para derribar el blanco, entonces el ataque se realizara con exito.
En caso que ataque, deber
a descontar la cantidad correspondiente de municiones e informar en caso
de exito la cantidad de municiones empleadas, para finalmente retornar true.
void mostrarEstado() muestra en consola el estado del tanque en un determinado momento: su
eficiencia, la cantidad de misiles y balas disponibles para atacar, y si ha realizado uno o m
as ataques,
la cantidad de ataques, cu
antos de estos fueron exitosos, y el porcentaje de veces en que ha logrado
derribar el blanco
IIC1103 Captulo 4: Clases
49
Adem
as deber
a realizar un metodo main que realice lo siguiente:
1. Pida al usuario la informaci
on necesaria para crear dos tanques.
2. Luego muestre un men
u al usuario con las siguientes opciones:
a) Manipular Tanque 1 permite realizar cualquiera de las siguientes acciones sobre el tanque 1:
b) Manipular Tanque 2 an
alogo a la opci
on anterior, pero para el tanque 2.
c) Comparar Desempe
nos informa cu
al tanque se desenvolvera mejor en un determinado ataque.
Pide al usuario la distancia al blanco (en metros), e informa cu
al de los dos tanque empleara
una menor cantidad de municiones en un ataque exitoso junto con la cantidad de misiles y balas que ahorrara respecto de su contendor, o bien, que ambos mostrar
an igual desempe
no si
correspondiese.
50
51
balas = maxBalas ;
c a r g a R e a l = maxBalas - balas ;
}
}
return c a r g a R e a l;
}
public int c a l c u l a r D i s p a r o s( boolean misil , int d i s t a n c i a) {
int disparos = 0;
// C a l c u l a m o s la cantidad n e c e s a r i a de disparos segun el tipo de
// municion y la d i s t a n c i a al blanco
if ( misil ) {
disparos = d i s t a n c i a * ( int ) (1 + 1 / Math . pow ( eficiencia , 2)) / 1000;
} else {
disparos = d i s t a n c i a * ( int ) (1 + 1 / Math . pow ( eficiencia , 2)) * 12 / 100;
}
return disparos ;
}
public boolean atacar ( boolean misil , int d i s t a n c i a) {
// No se puede atacar si la d i s t a n c i a es i n a d m i s i b l e
if ( d i s t a n c i a < 100 || d i s t a n c i a > 5000) {
return false ;
}
int m u n i c i o n e s N e c e s a r i a s;
if ( misil ) {
if ( misiles == 0) { // No se puede atacar sin m u n i c i o n e s
return false ;
}
m u n i c i o n e s N e c e s a r i a s = c a l c u l a r D i s p a r o s( true , d i s t a n c i a);
if ( m u n i c i o n e s N e c e s a r i a s > misiles ) {
// Las m u n i c i o n e s d i s p o n i b l e s no son s u f i c i e n t e s para derribar el blanco
misiles = 0;
} else {
misiles -= m u n i c i o n e s N e c e s a r i a s;
b l a n c o s D e r r i b a d o s ++;
Usuario . mensaje ( " Se ha d e r r i b a d o el blanco !\ nSe u t i l i z a r o n "
+ m u n i c i o n e s N e c e s a r i a s + " misiles . " );
}
} else {
if ( balas == 0) {
return false ;
}
m u n i c i o n e s N e c e s a r i a s = c a l c u l a r D i s p a r o s( false , d i s t a n c i a);
if ( m u n i c i o n e s N e c e s a r i a s > balas ) {
balas = 0;
} else {
balas -= m u n i c i o n e s N e c e s a r i a s;
b l a n c o s D e r r i b a d o s ++;
Usuario . mensaje ( " Se ha d e r r i b a d o el blanco !\ nSe u t i l i z a r o n "
+ m u n i c i o n e s N e c e s a r i a s + " balas . " );
}
}
ataques ++;
return true ;
}
public void m o s t r a r E s t a d o() { // M o s t r a m o s los a t r i b u t o s del tanque
Usuario . m e n s a j e C o n s o l a( " Estado del Tanque : ( e f i c i e n c i a = " + e f i c i e n c i a + " ) " );
if ( ataques > 0) {
Usuario . m e n s a j e C o n s o l a( " \ t C a n t i d a d de Ataques : " + ataques );
Usuario . m e n s a j e C o n s o l a( " \ t C a n t i d a d de Ataques exitosos : " + b l a n c o s D e r r i b a d o s);
Usuario . m e n s a j e C o n s o l a( " \ t P o r c e n t a j e de exito : " + 100 * b l a n c o s D e r r i b a d o s / ataques + " %" );
}
Usuario . m e n s a j e C o n s o l a( " \ t C a n t i d a d de Misiles d i s p o n i b l e s: " + misiles );
Usuario . m e n s a j e C o n s o l a( " \ t C a n t i d a d de Balas d i s p o n i b l e s: " + balas );
}
}
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
// Pedimos la i n f o r m a c i o n al usuario
int misiles1 = Usuario . entero ( " Ingrese la maxima c a p a c i d a d del Tanque 1 para misiles : " );
int balas1 = Usuario . entero ( " Ingrese la maxima c a p a c i d a d del Tanque 1 para balas : " );
double e f i c i e n c i a 1 = Usuario . real ( " Ingrese la e f i c i e n c i a del Tanque 1: " );
int misiles2 = Usuario . entero ( " Ingrese la maxima c a p a c i d a d del Tanque 2 para misiles : " );
52
int balas2 = Usuario . entero ( " Ingrese la maxima c a p a c i d a d del Tanque 2 para balas : " );
double e f i c i e n c i a 2 = Usuario . real ( " Ingrese la e f i c i e n c i a del Tanque 2: " );
// Creamos los tanques
Tanque t1 = new Tanque ( misiles1 , balas1 , e f i c i e n c i a 1);
Tanque t2 = new Tanque ( misiles2 , balas2 , e f i c i e n c i a 2);
// Hacemos un ciclo para el menu
int opcion = 1;
while ( opcion > 0 && opcion < 4) {
opcion = Usuario . entero (" Elija una opcion :\ n (1) M a n i p u l a r Tanque 1\ n "
+ " (2) M a n i p u l a r Tanque 2\ n (3) Comparar d e s e m p e n i o s en igual e s c e n a r i o\ n (4) Salir " );
if ( opcion == 1 || opcion == 2) {
// Creamos una variable para m a n i p u l a r el tanque que se desea utilizar
Tanque tanque = t1 ;
if ( opcion == 2) {
tanque = t2 ;
}
int o p c i o n T a n q u e = 1;
while ( o p c i o n T a n q u e > 0 && o p c i o n T a n q u e < 4) {
o p c i o n T a n q u e = Usuario . entero ( " Que desea hacer con el tanque ?\ n (1) Recargar m u n i c i o n e s\ n "
+ " (2) Atacar \ n (3) Ver estado \ n (4) Volver " );
if ( o p c i o n T a n q u e == 1) { // Recargar m u n i c i o n e s
int t i p o M u n i c i o n = 1;
while ( t i p o M u n i c i o n < 1 && t i p o M u n i c i o n > 2) {
t i p o M u n i c i o n = Usuario . entero ( " Que municion desea cargar ?\ n (1) Misiles \ n (2) Balas " );
}
int cantidad = Usuario . entero ( " Ingrese la cantidad que desea agregar : " );
if ( t i p o M u n i c i o n == 1) {
Usuario . mensaje (" Se pudieron agregar "
+ tanque . c a r g a r M u n i c i o n e s( true , cantidad )
+ " misiles al tanque . " );
} else {
Usuario . mensaje (" Se pudieron agregar "
+ tanque . c a r g a r M u n i c i o n e s( false , cantidad )
+ " balas al tanque . " );
}
} else if ( o p c i o n T a n q u e == 2) { // Atacar
int d i s t a n c i a = Usuario . entero ( " Ingrese la d i s t a n c i a a la que se e n c u e n t r a el blanco : " );
int t i p o M u n i c i o n = 1;
while ( t i p o M u n i c i o n < 1 && t i p o M u n i c i o n > 2) {
t i p o M u n i c i o n = Usuario . entero ( " Con que tipo de municion desea atacar ?\ n " +
+ " (1) Misiles \ n (2) Balas " );
}
boolean misil = true ;
if ( t i p o M u n i c i o n == 2) {
misil = false ;
}
if (! tanque . atacar ( misil , d i s t a n c i a)) {
Usuario . mensaje (" No fue posible realizar el ataque . " );
}
} else if ( o p c i o n T a n q u e == 3) { // Ver estado
tanque . m o s t r a r E s t a d o();
}
}
} else if ( opcion == 3) { // Comparar d e s e m p e n i o s
int d i s t a n c i a = Usuario . entero ( " Ingrese la d i s t a n c i a a la que se e n c u e n t r a el blanco de prueba : " );
int m i s i l e s t 1 = t1 . c a l c u l a r D i s p a r o s( true , d i s t a n c i a);
int m i s i l e s t 2 = t2 . c a l c u l a r D i s p a r o s( true , d i s t a n c i a);
int balast1 = t1 . c a l c u l a r D i s p a r o s( false , d i s t a n c i a);
int balast2 = t2 . c a l c u l a r D i s p a r o s( false , d i s t a n c i a);
if ( m i s i l e s t 1 < m i s i l e s t 2) {
// Basta comparar solo un tipo de municion para d e t e r m i n a r el mejor
// desempenio , o bien , las e f i c i e n c i a s
Usuario . mensaje ( " El Tanque 1 tendra un mejor d e s e m p e n i o: "
+ "\n\ tOcuparia "
+ ( m i s i l e s t 2 - m i s i l e s t 1)
+ " misiles menos que el Tanque 2 , o a l t e r n a t i v a m e n t e"
+ " \ n \ t O c u p a r i a " + ( balast2 - balast1 )
+ " balas menos que el Tanque 2. " );
} else if ( m i s i l e s t 1 > m i s i l e s t 2) {
Usuario . mensaje ( " El Tanque 2 tendra un mejor d e s e m p e n i o: "
+ "\n\ tOcuparia "
+ ( m i s i l e s t 1 - m i s i l e s t 2)
+ " misiles menos que el Tanque 1 , o a l t e r n a t i v a m e n t e"
+ " \ n \ t O c u p a r i a " + ( balast1 - balast2 )
+ " balas menos que el Tanque 1. " );
} else {
Usuario . mensaje ( " Ambos Tanques tendran igual d e s e m p e n i o en la prueba . " );
53
}
}
}
}
}
54
55
b) Ocupar Impresora 2 an
alogo a la opci
on anterior, pero para la impresora 2.
c) Comparar Desempe
nos informa cu
al impresora est
a mejor preparada para imprimir un trabajo
exigente, caracterizado por la presencia de imagenes en todas sus p
aginas. La comparaci
on se
hace en terminos de la m
axima cantidad de p
aginas que cada impresora podra imprimir del
trabajo se
nalado, en relaci
on a su estado. En caso de haber una ganadora, informa las p
aginas
que imprimira, y si no la hay, da cuenta de la situaci
on de empate.
56
Metodo CargarT oner: Lo declaramos tal como nos indican en el enunciado. Revisamos que la
cantidad que se desea agregar no sobrepase la cantidad m
axima permitida. Si no la sobrepasa,
actualizamos la cantidad de tinta y retornamos el mismo valor recibido como par
ametro. Si la
sobrepasa, actualizamos la cantidad de tinta s
olo hasta el m
aximo permitido y retornamos la
cantidad real agregada.
Metodo calcularGastoT inta: Lo declaramos tal como nos indican en el enunciado. Revisamos si
la impresi
on tiene im
agenes (seg
un el par
ametro figs recibido). Seg
un esto calculamos el gasto con
la ecuacion entregada en el enunciado. Retornamos el gasto calculado.
Metodo imprimir: Lo declaramos tal como nos indican en el enunciado. Revisamos si la impresi
on
ser
a a doble cara. Seg
un esto actualizamos el n
umero de hojas que debemos imprimir. Calculamos
el uso de tinta llamando al metodo calcularGastoT inta implementado anteriormente. Si la tinta
actual del toner no alcanza para imprimir lo deseado retornamos 0. En caso contrario, actualizamos
la tinta actual y revisamos el tama
no de papel en que se desea imprimir. Seg
un el tipo de papel
revisamos si la cantidad de hojas de ese tipo alcanza para imprimir lo que se desea. Actualizamos
la cantidad de hojas imprimiendo s
olo lo que se pueda. Retornamos el n
umero real de hojas que
se alcanzaron a imprimir.
Metodo mostrarEstado: Lo declaramos tal como nos indican en el enunciado. Mostramos en un
mensaje el valor que tienen los atributos: hojas tama
no carta, hojas tama
no oficio y tinta del
toner.
2. Clase P rincipal: Metodo main
Pedimos al usuario la cantidad de hojas tama
no carta, la cantidad de hojas tama
no oficio y la
cantidad de tinta para dos Impresoras.
Creamos dos objetos de la clase Impresora con los datos ingresados por el usuario.
Implementamos un ciclo para mostrar el men
u con las opciones, que no termine hasta el que
usuario ingrese la opci
on Salir.
Revisamos la opcion ingresada y determinamos con cu
al de las dos impresoras se trabajar
a.
Implementamos otro ciclo para mostrar el men
u con las opciones para una impresora especfica.
Revisamos la opcion ingresada por el usuario y llamamos al metodo de la clase Impresora que
corresponda seg
un la opci
on, pidiendo al usuario los valores necesarios para pasar como parametro
al metodo.
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class I m p r e s o r a {
private
private
private
private
private
private
private
int h o j a s C a r t a;
int h o j a s O f i c i o;
int m a x H o j a s C a r t a;
int m a x H o j a s O f i c i o;
double t i n t a T o n e r;
double m a x T i n t a T o n e r;
double e f i c i e n c i a T o n e r;
57
58
}
} else if ( tipoHoja == 2) { // Oficio
if ( h o j a s O f i c i o >= n u m H o j a s R e a l e s) {
h o j a s O f i c i o -= n u m H o j a s R e a l e s;
p a g i n a s I m p r e s a s = n u m P a g i n a s;
} else {
int o l d P a p e l O f i c i o = h o j a s O f i c i o;
h o j a s O f i c i o = 0;
if ( d o b l e C a r a) {
p a g i n a s I m p r e s a s = o l d P a p e l O f i c i o * 2;
} else {
p a g i n a s I m p r e s a s = o l d P a p e l O f i c i o;
}
}
}
return p a g i n a s I m p r e s a s;
}
public void m o s t r a r E s t a d o() {
Usuario . mensaje ( " El estado de la I m p r e s o r a es el s i g u i e n t e: "
+ " \ n \ tPapel carta : " + h o j a s C a r t a + " \ n \ tPapel oficio : "
+ h o j a s O f i c i o + " \ n \ tGramos de tinta en Toner : " + t i n t a T o n e r);
}
public int g e t H o j a s C a r t a() {
return h o j a s C a r t a;
}
public int g e t H o j a s O f i c i o() {
return h o j a s O f i c i o;
}
public double g e t T i n t a T o n e r() {
return t i n t a T o n e r;
}
}
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
// Pedimos la i n f o r m a c i o n al usuario
int carta1 = Usuario . entero ( " Ingrese la maxima c a p a c i d a d de hojas tamanio carta " +
" para la I m p r e s o r a 1: " );
int oficio1 = Usuario . entero ( " Ingrese la maxima c a p a c i d a d de hojas tamanio oficio " +
" para la I m p r e s o r a 1: " );
double tinta1 = Usuario . real ( " Ingrese la cantidad incial de tinta en el toner " +
" de la I m p r e s o r a 1: " );
int carta2 = Usuario . entero ( " Ingrese la maxima c a p a c i d a d de hojas tamanio carta " +
" para la I m p r e s o r a 2: " );
int oficio2 = Usuario . entero ( " Ingrese la maxima c a p a c i d a d de hojas tamanio oficio " +
" para la I m p r e s o r a 2: " );
double tinta2 = Usuario . real ( " Ingrese la cantidad incial de tinta en el toner " +
" de la I m p r e s o r a 2: " );
// Creamos las i m p r e s o r a s
I m p r e s o r a i1 = new I m p r e s o r a( carta1 , oficio1 , tinta1 );
I m p r e s o r a i2 = new I m p r e s o r a( carta2 , oficio2 , tinta2 );
// Hacemos un ciclo para el menu
int opcion = 1;
while ( opcion > 0 && opcion < 4) {
opcion = Usuario . entero (" Elija una opcion :\ n (1) Ocupar I m p r e s o r a 1\ n "
+ " (2) Ocupar I m p r e s o r a 2\ n (3) D e t e r m i n a r mejor i m p r e s o r a\ n (4) Salir " );
if ( opcion == 1 || opcion == 2) {
// Creamos una variable para m a n i p u l a r la i m p r e s o r a que se desea utilizar
I m p r e s o r a i m p r e s o r a = i1 ;
if ( opcion == 2) {
i m p r e s o r a = i2 ;
}
int o p c i o n I m p r e s o r a = 1;
while ( o p c i o n I m p r e s o r a > 0 && o p c i o n I m p r e s o r a < 4) {
o p c i o n I m p r e s o r a = Usuario . entero ( " Que desea hacer con esta i m p r e s o r a?\ n (1) Cargar papel \ n "
+ " (2) Imprimir \ n (3) Ver estado \ n (4) Volver " );
if ( o p c i o n I m p r e s o r a == 1) { // Cargar papel
int t i p o P a p e l = 1;
59
60
61
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
// P r e g u n t a m o s al u s u a r i o l a s edades de los e s p e c i a l i s t a s de cada clinica
int edad10 = Usuario . entero ( " Ingrese la edad del medico 0 de la clinica 1. " );
int edad11 = Usuario . entero ( " Ingrese la edad del medico 1 de la clinica 1. " );
int edad12 = Usuario . entero ( " Ingrese la edad del medico 2 de la clinica 1. " );
int edad13 = Usuario . entero ( " Ingrese la edad del medico 3 de la clinica 1. " );
int edad20 = Usuario . entero ( " Ingrese la edad del medico 0 de la clinica 2. " );
int edad21 = Usuario . entero ( " Ingrese la edad del medico 1 de la clinica 2. " );
int edad22 = Usuario . entero ( " Ingrese la edad del medico 2 de la clinica 2. " );
int edad23 = Usuario . entero ( " Ingrese la edad del medico 3 de la clinica 2. " );
// Creamos las dos clinicas
Clinica clinica1 = new Clinica ( edad10 , edad11 , edad12 , edad13 );
Clinica clinica2 = new Clinica ( edad20 , edad21 , edad22 , edad23 );
// P r e g u n t a m o s al usuario la cantidad de p a c i e n t e s a atender
int n u m P a c i e n t e s = Usuario . entero ( " Ingrese la cantidad de p a c i e n t e s" );
// Creamos un ciclo con una i t e r a c i o n para cada paciente
for ( int i = 0; i < n u m P a c i e n t e s; i ++) {
// Vemos la edad del paciente , la clinica y el medico elegido .
int edad = A l e a t o r i o. entero (1 , 80);
int i d C l i n i c a = A l e a t o r i o. entero (1 , 2);
int idMedico = A l e a t o r i o. entero (0 , 3);
// D e f i n i m o s un boolean que indique si se c o n s i g u i o o no d i a g n o s t i c o
boolean d i a g n o s t i c o C o n s e g u i d o = true ;
if ( i d C l i n i c a == 1) {
// R e v i s a m o s si hay d i a g n o s t i c o correcto , de no haberlo nos
// c a m b i a m o s de clinica
if (! clinica1 . Atender ( edad , idMedico )) {
i d C l i n i c a = 2;
if (! clinica2 . Atender ( edad , idMedico )){
d i a g n o s t i c o C o n s e g u i d o = false ;
}
}
} else {
// R e v i s a m o s si hay d i a g n o s t i c o correcto , de no haberlo nos
// c a m b i a m o s de clinica
if (! clinica2 . Atender ( edad , idMedico )) {
i d C l i n i c a = 1;
if (! clinica1 . Atender ( edad , idMedico )) {
d i a g n o s t i c o C o n s e g u i d o = false ;
}
}
}
if (! d i a g n o s t i c o C o n s e g u i d o) {
Usuario . m e n s a j e C o n s o l a( " El paciente de edad " + edad
+ " no c o n s i g u i o buen d i a g n o s t i c o. " );
} else {
Usuario . m e n s a j e C o n s o l a( " El paciente de edad " + edad
+ " c o n s i g u i o buen d i a g n o s t i c o en la clinica " + i d C l i n i c a);
}
}
// M o s t r a m o s la i n f o r m a c i o n final
Usuario . m e n s a j e C o n s o l a( " \ n E s t a d i s t i c a s Clinica 1: " );
clinica1 . M o s t r a r E s t a d i s t i c a s();
Usuario . m e n s a j e C o n s o l a( " \ n E s t a d i s t i c a s Clinica 2: " );
clinica2 . M o s t r a r E s t a d i s t i c a s();
// Vemos cual fue el mejor medico
Medico m a s E f e c t i v o 1 = clinica1 . M a s E f e c t i v o ();
Medico m a s E f e c t i v o 2 = clinica2 . M a s E f e c t i v o ();
if ( m a s E f e c t i v o 1. g e t E f e c t i v i d a d() > m a s E f e c t i v o 2. g e t E f e c t i v i d a d ()) {
Usuario . m e n s a j e C o n s o l a( " \ nEl medico mas efectivo fue de la clinica 1 con una e f e c t i v i d a d de "
+ m a s E f e c t i v o 1. g e t E f e c t i v i d a d ());
} else if ( m a s E f e c t i v o 2. g e t E f e c t i v i d a d() > m a s E f e c t i v o 1. g e t E f e c t i v i d a d()) {
Usuario . m e n s a j e C o n s o l a( " \ nEl medico mas efectivo fue de la clinica 2 con una e f e c t i v i d a d de "
+ m a s E f e c t i v o 2. g e t E f e c t i v i d a d ());
} else {
Usuario . m e n s a j e C o n s o l a( " \ nAmbas clinicas tuvieron i g u a l a d o s a sus medicos mas e f e c t i v o s "
+ " con una e f e c t i v i d a d de " + m a s E f e c t i v o 1. g e t E f e c t i v i d a d ());
}
}
}
62
Adem
as cuenta con la clase Medico. Esta
identifica un medico, cuya principal caracterstica es la edad para
la cual es especialista. A continuacion se describen los metodos de esta clase.
Medico(int edadEspecialista) constructor de la clase, recibe como par
ametro la edad para la
cual el medico es especialista.
boolean Atender(int edadPaciente) indica que debe atender a un paciente de la edad recibida
como parametro. Retorna true en caso de conseguir un diagn
ostico correcto, false en otro caso.
int getEdadEspecialista() retorna la edad en la cual es especialista el medico.
int getAtenciones() retorna la cantidad de atenciones realizadas por el medico.
int getDiagnosticosCorrectos() retorna la cantidad de diagn
osticos correctos realizadas por el
medico.
double getEdadPromedioCorrectos() retorna la edad promedio de los pacientes a los cuales el
medico ha dado un correcto diagn
ostico.
double getEfectividad() retorna la efectividad del medico.
Criterios de soluci
on
El enunciado es bastante estructurado, por lo que tenemos que ir realizando paso a paso lo que se nos pide.
Clase Clinica
Lo primero que tenemos que hacer es declarar la clase con sus atributos. Del enunciado vemos que
lo que caracteriza a una Clnica son los 4 medicos que trabajan en ella, por lo que como atributos
debemos tener 4 objetos de la clase M edico
Constructor: Lo declaramos tal como nos indican en el enunciado. En el metodo creamos cada
uno de los cuatro medicos, llamando al constructor de la clase, pasando para cada uno la edad
recibida como par
ametro.
Metodo ObtenerM edico: Lo declaramos tal como nos indican en el enunciado. Revisamos el ndice
recibido como par
ametro. Con un bloque de if y else determinamos cu
al objeto de la clase M edico
retornar. Retornamos correctamente el medico pedido.
Metodo Atender: Lo declaramos tal como nos indican en el enunciado. Obtenemos el medico elegido seg
un el ndice ingresado como par
ametro, llamando al metodo ObtenerM edico implementado
anteriormente. Implementamos un ciclo que nos permita revisar todos los medicos y que contin
ue
mientras no sea posible encontrar un diagn
ostico. Dentro del ciclo llamamos al metodo Atender
de la clase M edico y revisamos si se encontr
o diagn
ostico. Si no fue as, obtenemos al siguiente
medico y seguimos intentando.
Metodo M asEf ectivo: Lo declaramos tal como nos indican en el enunciado. Implementamos
un ciclo para revisar la efectividad de cada uno de los medicos. Dentro del ciclo obtenemos la
efectividad del medico con el metodo getEf ectividad y la comparamos con la mayor obtenida
hasta el momento. Finalmente retornamos el medico que posee la mayor efectividad.
Metodo Ef ectividadClinica: Lo declaramos tal como nos indican en el enunciado. Implementamos un ciclo para obtener las atenciones de todos los medicos y los buenos diagn
osticos. En
el ciclo llamamos a los metodos getAtenciones y getDiagnosticosCorrectos para cada medico.
Finalmente retornamos la suma de los buenos diagn
osticos dividido por la suma de las atenciones
de todos los medicos.
63
Metodo mostrarEstadisticas: Lo declaramos tal como nos indican en el enunciado. Primero mostramos en un mensaje la efectividad, la cual obtenemos llamando al metodo Ef ectividadClinica
implementado anteriormente. Luego implementamos un ciclo para mostrar los datos de cada uno
de los medicos. En el ciclo mostramos la edad de especialidad del medico, el n
umero de atenciones
y diagn
osticos correctos, y el promedio de edad de los pacientes a los que el medico ha dado un
buen diagn
ostico. Todo lo anterior llamando a los metodos correspondientes de la clase M edico.
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class Clinica {
// D e c l a r a m o s como atributo los 4 medicos
private Medico medico0 ;
private Medico medico1 ;
private Medico medico2 ;
private Medico medico3 ;
public Clinica ( int edad0 , int edad1 , int edad2 , int edad3 ) {
// En el c o n s t r u c t o r creamos los objetos de los 4 medicos segun los
// p a r a m e t r o s r e c i b i d o s
medico0 = new Medico ( edad0 );
medico1 = new Medico ( edad1 );
medico2 = new Medico ( edad2 );
medico3 = new Medico ( edad3 );
}
public Medico O b t e n e r M e d i c o( int indice ) {
// Segun el indice elegido r e t o r n a m o s al medico s e l e c c i o n a d o
if ( indice == 0) {
return medico0 ;
} else if ( indice == 1) {
return medico1 ;
} else if ( indice == 2) {
return medico2 ;
} else {
return medico3 ;
}
}
public boolean Atender ( int edadPaciente , int m e d i c o E l e g i d o) {
// O b t e n e m o s el medico elegido por el paciente
Medico elegido = O b t e n e r M e d i c o( m e d i c o E l e g i d o);
int i = 0;
// Creamos un ciclo que nos permita revisar todos los medicos . El ciclo
// continua mientras no sea posible e n c o n t r a r un d i a g n o s t i c o al paciente .
for ( i = 0; i < 4 && ! elegido . Atender ( e d a d P a c i e n t e); i ++) {
// C a m b i a m o s el medico elegido porque no se encontro d i a g n o s t i c o.
m e d i c o E l e g i d o = ( m e d i c o E l e g i d o + 1) % 4;
elegido = O b t e n e r M e d i c o( m e d i c o E l e g i d o);
}
// Si r e v i s a m o s todos los medicos y no e n c o n t r a m o s diagnostico , entonces
// r e t o r n a m o s false .
if ( i == 3) {
return false ;
}
return true ;
}
public Medico M a s E f e c t i v o() {
// C o m p a r a m o s todos los medicos , y en esta variable vamos g u a r d a n d o el
// que posea la mayor e f e c t i v i d a d.
Medico m a s E f e c t i v o = O b t e n e r M e d i c o (0);
for ( int i = 1; i < 4; i ++) {
Medico otro = O b t e n e r M e d i c o( i );
if ( m a s E f e c t i v o. g e t E f e c t i v i d a d() < otro . g e t E f e c t i v i d a d ()) {
m a s E f e c t i v o = otro ;
}
}
return m a s E f e c t i v o;
}
public double E f e c t i v i d a d C l i n i c a() {
64
65
Problema 22: Cr
edito Bancario
Enunciado
Ud. deber
a desarrollar un programa que permita a un usuario realizar la pre-aprobaci
on de la solicitud de
un credito bancario. Dispondr
a de la clase Principal, cuyo metodo main debe funcionar con su programa.
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
int opcion = 1;
while ( opcion < 2) {
int rut = Usuario . entero ( " Banco IIC1103 - S o l i c i t u d de Creditos \ nIngrese su Rut " );
int edad = Usuario . entero ( " Banco IIC1103 - S o l i c i t u d de Creditos \ nIngrese su Edad " );
int r e n t a M e n s u a l = Usuario . entero ( " Banco IIC1103 - S o l i c i t u d de Creditos "
+ " \ nIngrese su renta mensual ( total familiar ) " );
int g r u p o F a m i l i a r = Usuario . entero ( " Banco IIC1103 - S o l i c i t u d de Creditos "
+ " \ nIngrese el nro . de personas de su familia ( i n c l u y e n d o s e) " );
int t i p o T r a b a j o = Usuario . entero ( " Banco IIC1103 - S o l i c i t u d de Creditos "
+ " \ nIngrese su tipo de o c u p a c i o n \ n (1) D e p e n d i e n t e\ n (2) I n d e p e n d i e n t e (3) Jubilado " );
Cliente cliente = new Cliente ( rut , edad , rentaMensual , grupoFamiliar , t i p o T r a b a j o);
int monto = Usuario . entero ( " Banco IIC1103 - S o l i c i t u d de Creditos \ nIngrese monto a s o l i c i t a r" );
int nroMeses = Usuario . entero ( " Banco IIC1103 - S o l i c i t u d de Creditos \ nIngrese numero de meses " );
Banco banco = new Banco ();
banco . s o l i c i t a r C r e d i t o( cliente , monto , nroMeses );
opcion = Usuario . entero (" Desea pedir otro credito ?\ n (1) Si \ n (2) No " );
}
}
}
.
El programa lo dividiremos en 3 subconjuntos incrementales. Le recomendamos no comenzar con el siguiente
subconjunto hasta terminar y probar el funcionamiento correcto del subconjunto actual.
Incremento 1
En este incremento, Ud. debe hacer que su sistema tenga la funcionalidad de solicitar el credito, y hacer una
validaci
on del mismo por parte del banco. Primero debe crear la clase Cliente, que debe tener los siguientes
atributos y metodos:
int rut representa su identificador de identidad. Por simplicidad, corresponde a un n
umero entero
cualquiera.
int edad corresponde a la edad en a
nos del cliente que solicita el credito.
int rentaMensual representa el total de ingresos familiares mensuales del cliente.
int grupoFamiliar corresponde al total de miembros del grupo familiar (incluyendose el cliente).
int tipoTrabajo representa el tipo de trabajo u ocupaci
on actual del cliente, donde:
1: Dependiente
2: Independiente
3: Jubilado
public Cliente(int rut, int edad, int rentaMensual, int grupoFamiliar, int tipoTrabajo)
constructor, inicializa todos los atributos de la clase, con los valores enviados como par
ametro.
getters y setters para cada uno de los atributos revise la implementaci
on de la clase Principal para
saber con certeza el nombre de los metodos necesarios.
Luego debe crear la clase AnalistaRiesgos, que debe tener siguiente metodo:
66
public double determinarRiesgo(Cliente cliente, double montoCuota) Debe retornar el nivel de riesgo del cliente, el que corresponde a un valor de tipo double, que por defecto es cero. Para
su calculo debe considerarse lo siguiente:
Si la edad del cliente es menor que 23 a
nos o mayor a 65 a
nos , debe sumarse al ndice 1 punto.
Debe informarse en consola tal riesgo con un mensaje de la forma **Edad riesgosa (menor a
23 o mayor a 65 a~
nos).
Si el 50 % de la renta perc
apita del grupo familiar es menor que el monto mensual de la cuota, debe sumarse al ndice 1000 puntos. Debe informarse en consola tal riesgo con un mensaje de la forma **Monto mensual (X) no debe ser mayor al 50 % de la renta perc
apita
familiar (y), donde X es el monto mensual a pagar, e Y corresponde al valor del 50 % de la renta
perc
apita familiar.
Si el tipo de trabajo es Dependiente, no sumar nada al ndice de riesgo.
Finalmente, Ud. debe crear la clase Banco, con los siguientes atributos y metodos:
AnalistaRiesgos analista Corresponde al objeto de la clase AnalistaRiesgos que revisara la
situacion del cliente que solicita el credito.
public Banco() constructor, inicializa los atributos de la clase.
public void solicitarCredito(Cliente cliente, int monto, int nroMeses) este metodo es
el encargado de realizar la solicitud del credito, e imprime en pantalla el resultado de la gesti
on. En
este incremento deben implementarse las siguientes reglas:
Si el ndice de riesgo, calculado por analista es menor a 2.5, debe informarse al cliente que el
credito fue pre-aprobado.
Si el ndice de riesgo, calculado por analista es mayor o igual a 2.5 y menor que 5.0, debe
informarse al cliente que el credito fue aprobado, pero debe ir al banco con un aval para su
aprobacion final.
Si el ndice de riesgo, calculado por analista es mayor a 5.0, debe informarse al cliente que el
credito fue rechazado.
Note que analista necesitara el monto mensual de la cuota. Para ello, debe calcularlo con la siguiente
f
ormula: montoCuota = monto(1 + 0,02)n /n con n=n
umero de meses.
Incremento 2
R
Si bien los bancos analizan el riesgo de sus clientes, antes piden un informe a Dicom$sobre
el comportamiento
comercial de sus clientes. Para ello, primero Ud. debe implementar la clase InformeComercial con los
siguientes atributos:
public int montoProtestos representa el monto en pesos de los protestos que tiene el cliente.
public int montoMora representa el monto en pesos de cuotas en mora con el comercio que tiene
el cliente.
public InformeComercial() constructor de la clase.
getters y setters para cada uno de los atributos
A continuaci
on Ud. debe crear la clase Dicom, con el siguiente metodo (adem
as del constructor por defecto):
IIC1103 Captulo 4: Clases
67
public int tieneProtestos(Cliente cliente) calcula el monto de protestos del cliente, con las
mismas reglas del incremento 2 para este aspecto. Debe informar por consola si existe alg
un monto en
protesto y su valor.
public int tieneMora(Cliente cliente) calcula el monto en mora del cliente, con las mismas
reglas del incremento 2 para este aspecto. Debe informar por consola si existe alg
un monto en mora y
su valor.
Finalmente, debe modificar la clase Dicom para que use la nueva funcionalidad. Para ello es requisito que
Ud. agregue como atributo un objeto de la clase CamaraComercio y lo use en el metodo generarInforme
para realizar la tarea del c
alculo de los protestos y mora.
Criterios de soluci
on
Posible Soluci
on
import i i c 1 1 0 3 P a c k a g e. Usuario ;
public class A n a l i s t a R i e s g o s {
public double d e t e r m i n a r R i e s g o( Cliente cliente , double m o n t o C u o t a) {
double i n d i c e R i e s g o = 0;
if ( cliente . getEdad () > 65 || cliente . getEdad () < 23) {
i n d i c e R i e s g o += 1;
Usuario . mensaje ( " ** Edad riesgosa ( menor a 23 o mayor a 65 anios ) " );
}
double p e r C a p i t a = cliente . g e t R e n t a M e n s u a l ()/ cliente . g e t G r u p o F a m i l i a r();
if ( m o n t o C u o t a > p e r C a p i t a * 0.5) {
i n d i c e R i e s g o += 1000;
Usuario . mensaje ( " ** Monto mensual ( "
+ montoCuota
+ " ) no debe ser mayor al 50 % de la renta p e r c a p i t a familiar ( "
+ p e r C a p i t a * 0.5 + " ) " );
}
if ( cliente . g e t T i p o T r a b a j o() == 1) {
68
i n d i c e R i e s g o += 0;
} else if ( cliente . g e t T i p o T r a b a j o() == 2) {
i n d i c e R i e s g o += 2.5;
} else if ( cliente . g e t T i p o T r a b a j o() == 3) {
i n d i c e R i e s g o += 1.5;
}
return i n d i c e R i e s g o;
}
}
import i i c 1 1 0 3 P a c k a g e. Usuario ;
public class Banco {
A n a l i s t a R i e s g o s analista ;
Dicom dicom ;
public Banco () {
analista = new A n a l i s t a R i e s g o s();
dicom = new Dicom ();
}
public void s o l i c i t a r C r e d i t o( Cliente cliente , int monto , int nroMeses ) {
I n f o r m e C o m e r c i a l informe = dicom . g e n e r a r I n f o r m e( cliente );
if ( informe . g e t M o n t o M o r a () <= 0 && informe . g e t M o n t o P r o t e s t o s() <= 0) {
double m o n t o C u o t a = monto * Math . pow ((1 + 0.02) , nroMeses ) / nroMeses ;
double riesgo = analista . d e t e r m i n a r R i e s g o( cliente , m o n t o C u o t a);
if ( riesgo < 2.5) {
Usuario . mensaje ( " Enhorabuena , credito p r e a p r o b a d o. " +
" Vaya a las oficinas con su RUT para hacerlo efectivo " );
} else if ( riesgo >= 2.5 && riesgo < 5.0) {
Usuario . mensaje ( " El credito ha sido preaprobado , " +
" sin embargo debe d i r i g i r s e a las oficinas con un aval " );
} else {
Usuario . mensaje ( " El credito ha sido r e c h a z a d o debido a su alto riesgo de pago . " );
}
} else {
Usuario . mensaje ( " Credito ha sido r e c h a z a d o por tener p r o b l e m a s de p r o t e s t o s y / o mora " );
}
}
}
import i i c 1 1 0 3 P a c k a g e. Usuario ;
public class C a m a r a C o m e r c i o {
public int t i e n e P r o t e s t o s( Cliente cliente ) {
if ( cliente . getRut () % 5 == 0) {
Usuario . mensaje ( " ** El cliente tiene p r o t e s t o s por "
+ cliente . getRut ());
return cliente . getRut ();
} else {
return 0;
}
}
public int t i e n e M o r a( Cliente cliente ) {
if ( cliente . getRut () % 3 == 0) {
Usuario . mensaje ( " ** El cliente tiene mora por " + cliente . getRut ());
return cliente . getRut ();
} else {
return 0;
}
}
}
public class Cliente {
int rut ;
int edad ;
int r e n t a M e n s u a l;
int g r u p o F a m i l i a r;
int t i p o T r a b a j o;
public Cliente ( int rut , int edad , int rentaMensual , int grupoFamiliar ,
int t i p o T r a b a j o) {
this . rut = rut ;
this . edad = edad ;
this . r e n t a M e n s u a l = r e n t a M e n s u a l;
this . g r u p o F a m i l i a r = g r u p o F a m i l i a r;
this . t i p o T r a b a j o = t i p o T r a b a j o;
69
}
public int getRut () {
return rut ;
}
public void setRut ( int rut ) {
this . rut = rut ;
}
public int getEdad () {
return edad ;
}
public void setEdad ( int edad ) {
this . edad = edad ;
}
public int g e t R e n t a M e n s u a l () {
return r e n t a M e n s u a l;
}
public void s e t R e n t a M e n s u a l( int r e n t a M e n s u a l) {
this . r e n t a M e n s u a l = r e n t a M e n s u a l;
}
public int g e t G r u p o F a m i l i a r () {
return g r u p o F a m i l i a r;
}
public void s e t G r u p o F a m i l i a r( int g r u p o F a m i l i a r) {
this . g r u p o F a m i l i a r = g r u p o F a m i l i a r;
}
public int g e t T i p o T r a b a j o() {
return t i p o T r a b a j o;
}
public void s e t T i p o T r a b a j o( int t i p o T r a b a j o) {
this . t i p o T r a b a j o = t i p o T r a b a j o;
}
}
public class Dicom {
public C a m a r a C o m e r c i o camara ;
public Dicom () {
camara = new C a m a r a C o m e r c i o();
}
public I n f o r m e C o m e r c i a l g e n e r a r I n f o r m e( Cliente cliente ) {
I n f o r m e C o m e r c i a l informe = new I n f o r m e C o m e r c i a l();
informe . s e t M o n t o P r o t e s t o s( camara . t i e n e P r o t e s t o s( cliente ));
informe . s e t M o n t o M o r a( camara . t i e n e M o r a( cliente ));
return informe ;
}
}
public class I n f o r m e C o m e r c i a l {
public int m o n t o P r o t e s t o s;
public int m o n t o M o r a;
public int g e t M o n t o P r o t e s t o s () {
return m o n t o P r o t e s t o s;
}
public void s e t M o n t o P r o t e s t o s( int m o n t o P r o t e s t o s) {
this . m o n t o P r o t e s t o s = m o n t o P r o t e s t o s;
}
public int g e t M o n t o M o r a() {
return m o n t o M o r a;
}
70
71