Download Practica2

Document related concepts
no text concepts found
Transcript
Facultad de Ciencias Exactas, Ingeniería y Agrimensura
Departamento de Sistemas e Informática
Escuela de Electrónica
Informática II
Práctica Nº 2 - Herencia
Resumen:
Esta práctica está diseñada para que el estudiante comience a manipular la Programación
Orientada a Objetos editando, compilando, ejecutando y depurando programas en lenguaje
Java con el entorno Eclipse.
Problema 1:
Un sistema de gestión de comunicaciones manipula distintos tipos de mensajes:




SMS (mensajes de texto via celular)
MMS (mensajes multimedia via celular)
Correo electrónico
Fax
Utilizando el concepto genérico de “mensaje”, cuyos atributos son:




Emisor
Destinatario
Texto
Adjuntos (imágenes, sonidos, videos)
Desarrollar la jerarquía de clases que permita administrar los conceptos mencionados.
Problema 2:
a) Un tren de carga lleva dos clases de vagones: BoxCar que tienen forma de prisma
rectangular y TankerCar que tienen forma cilíndrica.
Deberá diseñar tres clases para representar vagones de tren, una superclase (TrainCar)
abstracta y dos subclases (BoxCar y TankerCar) para representar los dos tipos de
vagones. Para el vagón de tipo BoxCar deberá almacenar su alto, ancho y longitud. Para el
vagón de tipo TankerCar deberá almacenar su radio y longitud. Las tres clases deben
poseer un método volumen() que retorna un valor de tipo double que representa la
capacidad en metros cúbicos del vagón. Parte de su trabajo será decidir si el método
volumen() en cada una de las clases es declarado abstracto.
Recordar que el volumen de un prisma rectangular es: alto * ancho * longitud y el del cilindro es
 * r2 * longitud. Para  puede usar la constante Math.PI.
b) Cree una clase Train que represente a un tren de carga con sus vagones.
c) Cree una clase de prueba que permita crear trenes y calcular la capacidad total de carga de
cada tren.
Problema 3:
Mi programa de actividades hogareñas diarias incluye una variedad de tareas tales como:
tareas escolares, gimnasia y comidas. Se trata de modelar estas tareas usando clases Java.
Defina la superclase abstracta Tarea y defina las siguientes tres subclases concretas:
1) TareaEscolar que tiene un campo: el número de problemas a resolver.
2) Gimnasia que tiene un campo: si estoy haciendo o no bicicleta fija.
3) Comidas que no tiene campos.
Debe definir además en cada clase un método cuantotiempo() , que retorne la cantidad de
minutos que toma realizar una tarea:
1) Una tarea escolar toma 10 minutos por problema.
2) Gimnasia ocupa 60 minutos, más un extra de 20 minutos si estoy usando la bicicleta fija
3) En comer ocupo siempre 30 minutos.
Finalmente usando las definiciones de las 4 clases deberá crear un array de 5 Tareas en un
método main(), donde calculará el tiempo necesario para realizar todas estas tareas y lo
mostrará por pantalla.
Problema 4:
Cree las siguientes clases:
Vehiculo (una clase public y abstract)
 Vehículo tiene un constructor que se usa para determinar dos propiedades: nombre
(String) y precio (double).
 Cree dos métodos de acceso para retornar cada una de las propiedades mencionadas.
 Cree un método que permita modificar el nombre del vehículo.
 Cree un método abstracto: calcularTasa() que retorne un valor que indique el monto
de un impuesto anual sobre el vehículo.
Camion (una clase concreta)
 El constructor invoca al de la superclase para establecer el valor de las propiedades
nombre y precio. El constructor de Camion acepta nombre y precio como parámetro.
 Camion tiene una propiedad nroRuedas (entero). Cree métodos de acceso y
modificación de esta propiedad.
 calcularTasa() calculará el impuesto multiplicando el número de ruedas del camión
por 100.
 Camion tiene un método static: int numeroCamiones() que retorna un número
que indica cuántas instancias de tipo Camion se han creado en un programa. Declare
cualquier variable que necesite para ello y asegúrese que la clase actualice esta variable
cuando sea necesario.
Aeroplano (una clase concreta)
 El constructor llama al de la superclase para establecer el valor de las propiedades
nombre y precio. El constructor de Aeroplano acepta nombre y precio como
parámetros.
 Aeroplano tiene una propiedad nroAsientos (entero). Cree métodos de acceso y
modificación para esta propiedad.
 calcularTasa() calcula la tasa multiplicando el número de asientos por 200.
 Aeroplano tiene un método static: int numeroAeroplanos() que retorna un
número que indica cuántas instancias de tipo Aeroplano se han creado en un
programa. Declare cualquier variable que necesite para ello y asegúrese que la clase
actualice esta variable cuando sea necesario.
Cree una clase donde instancie objetos de tipo Camion y Aeroplano y escriba una línea de
código donde muestre cómo invoca el método static nroCamiones() y muestre por
pantalla el resultado de esta invocación.
Problema 5:
Para representar un modelo de controles como aparece de ejemplo en la imagen, programar en
java las clases Item, Box, CheckBox, y RadioButton.
Un ítem consta de un valor booleano que indica si está seleccionado o no y un texto. Las cajas
(Box), contienen varios ítems y un nombre. Éstas pueden ser Checkbox, que permiten la
selección múltiple de ítems o RadioButton, que sólo permiten seleccionar uno y sólo un ítem por
vez. Además de los métodos de acceso, se debe proveer los métodos para seleccionar y/o
deseleccionar un ítem específico (controlar que no se seleccione ni más ni menos de un ítem
en el RadioButton) y para restaurar los valores por defecto, que en el caso del CheckBox es
'ninguno seleccionado' y en el caso del RadioButton es 'el primero seleccionado'.
Se sugiere proveer un método toString para CheckBox que funcione de la siguiente manera:
Archivos:
[ ] .jpeg
[x] .gif
[x] .png
y un toString para RadioButton:
Tamaño:
(x) 4 Gb
( ) 8 Gb
( ) 16 Gb
Problema 6:
Dada la siguiente clase Gate que representa a una compuerta lógica:
abstract class Gate {
/** Constantes simbólicas de valores a usar en simulación */
public static final int FALSE = 0;
public static final int TRUE = 1;
public static final int UNKNOWN = 2;
private int [] inputs; //entrada de la compuerta
/** El constructor inicializa todas las entradas de las compuertas
el valor UNKNOWN */
public Gate(int numInputs) { /* a implementar */ }
con
public int numInputs() { /* a implementar */ }
public void setInput(int inum, int val) {/* a implementar */}
public int getInput(int inum) { /* a implementar */ }
abstract int eval();
};
Escriba el código del constructor de acuerdo a las indicaciones.
Escriba el código del método de acceso numInputs().
Escriba el código del método de acceso getInput(int entradanumero).
Escriba el código del método setInput(int nroentrada, int valorentrada).
Escriba el código de la clase concreta AndGate que represente al tipo de compuertas
que realizan la función lógica AND de todas sus entradas.
f)
Implemente la clase Prueba con una instancia de AndGate para evaluar el resultado.
g)
Coloque un punto de interrupción en la creación del objeto, depure con “Recorrer
principal” (Step Over) y “Recorrer todo” (Step Into) y compare los recorridos.
a)
b)
c)
d)
e)
Nota: si cualquier entrada de esta compuerta tiene un valor UNKNOWN, el producto lógico que
realiza la compuerta tendrá este valor.
Problema 7: (*)
Considere el siguiente diagrama UML incompleto:
a) Escribir el código Java de la clase Info. Suponer que además de lo indicado en el diagrama
de clases tiene un constructor:
public Info (String address, String phone, String email)
b) Escribir el código Java de la clase Customer. Suponer que además de lo indicado en el
diagrama de clases tiene un constructor:
public Customer (String name, Info info)
c) Escribir el código Java de la clase BusinessCustomer. Suponer que además de lo indicado
en el diagrama de clases tiene un constructor:
public BusinessCustomer (String name, Info info, int accountNo)
d) Escribir el código Java de la clase ContactManager. Suponer que además de lo indicado en
el diagrama de clases tiene un constructor:
public ContactManager()
La signatura completa de los métodos de la interface de esta clase es:
public void addCustomer(String name, String address, String phone,
String email)
public void addBusinessCustomer(String name, String address,
String
phone, String email, int accountNo)
public Customer[ ] findAll(String name)
El método findAll halla todos los objetos Customer y BusinessCustomer cuyo nombre
coincide con el pasado como argumento.
Nota: En el diagrama de clases, la signatura correcta de este método es:
public Customer[ ] findAll(String name) (en lugar de ArrayList,
Customer[ ])
e) Escriba código Java para probar todas estas clases.
Problema 8:
Considere el siguiente diagrama de clases UML incompleto:
En todos los ítems debe suponer campos private y métodos public.
a) Escriba el código completo de la clase Employee (Empleado), cuyo constructor tiene la
siguiente signatura:
public Employee(String name, String address, Facility facility)
Facility es una clase abstracta que representa las instalaciones de la empresa: fabril
(representada por la clase concreta Factory) y administrativa (representada por la clase
concreta AdminCentre), donde trabajan sus empleados.
b) Una oficina (Room) tiene un cierto número de cubículos (áreas de trabajo), cada uno de los
cuales, si está desocupado, puede ser asignado a un único empleado. Esta clase tiene
además la responsabilidad de almacenar una lista de los empleados que trabajan en dicha
oficina. Escriba la versión Java de la clase Room, suponiendo que su constructor tiene una
signatura:
public Room(int cubicleCount)
El constructor inicializa número de cubículos que tiene la oficina. Inicialmente se supone que la
cantidad de cubículos libres es igual la cantidad de cubículos, indicada por el argumento
cubicleCount.
Los métodos de esta clase son:
Método
getRoomID()
Responsabilidad
retorna un número consecutivo para cada oficina,
comenzando en 0
getCubicleCount() retorna la cantidad de cubículos que tiene la oficina
getFreeCubicleCou retorna la cantidad de cubículos libres de la oficina
nt()
addEmployee(Emplo retorna true si pudo añadir un empleado a algún
yee e)
cubículo libre, o false en caso contrario. Actualiza la
información referida a los cubículos.
GetEmployeesInRoo retorna un array de los empleados que trabajan en la
m()
oficina
c) La clase Facility es una clase abstracta con un solo método, mientras que
AdminCentre y Factory son clases concretas.
Escriba la versión Java de la clase Facility suponiendo que su constructor tiene la siguiente
signatura:
public Facility(String address)
//inicializa la localización de la
//instalación
y la versión Java de la clase concreta AdminCentre, cuyo constructor tiene la siguiente
signatura, e inicializa la localización del centro administrativo y la lista de oficinas que contiene:
public AdminCentre(String address, Room[] rooms)
Los métodos de dicha clase son:
Método
Responsabilidad
public boolean
Asigna un empleado a la primera oficina (Room)
addEmployee(Employee que tenga algún cubículo libre. Retorna false sino
e)
hay ningún cubículo libre en ninguna oficina; en
caso contrario retorna true. Anula el declarado en
Facility
public Room
Revisa la lista de empleados que trabajan en
findEmployee(String
name)
cada oficina y retorna la oficina (Room) que
ocupa el empleado cuyo nombre coincide con
“name” o null; si en ninguna oficina halla algún
empleado con ese nombre
d) Escribir código para probar todas estas clases
Problema 9:
a) Desarrollar un sistema para realizar operaciones en un entorno geométrico. Primero deberá
definir una clase Point para almacenar objetos que representen puntos del espacio 2D. Los
atributos de un punto del plano son sus coordenadas cartesianas x e y, que son valores
enteros. Para representar el comportamiento de los objetos escriba los constructores
necesarios (el constructor por defecto inicializaría el punto con coordenadas [0,0]) y métodos
de acceso a su estado interno. Deberá crear también un método move() (para cambiar su
estado) y el método necesario para mostrar por pantalla el estado de un objeto Point.
b) Usando la clase Point como superclase derive una nueva clase llamada Circle. Un
objeto de la clase Circle tendría un atributo extra llamado radio que almacenará un valor
de tipo double. Su centro estará almacenado en un Point que es heredado de su
superclase. Se deben proveer también métodos que provean acceso al estado interno de
objetos Circle y los necesarios para calcular el área y el perímetro de los mismos. Para el
constructor por defecto suponga un radio unitario y coordenadas del centro [0,0]. Debe
añadir además un método para mostrar por pantalla el estado de un objeto Circle. Si
necesita modificar su clase Point debe indicar claramente los cambios que haría.
c) Escriba un método main() en una clase Geometry para probar su diseño e
implementación. En este método debe crear un array de 4 elementos: dos instancias de la
clase Point (una con los valores por defecto de los atributos y otra con valores de su
elección) y dos instancias de la clase Circle (nuevamente una con los valores por defecto
y otra con los valores de su elección). Deberá mostrar por pantalla el estado de todos los
objetos del array. Si el objeto es de tipo Circle también se deberá mostrar el área y la
circunferencia. Si necesita añadir más métodos a su clase Point para poder usar
referencias polimórficas, debe indicarlo claramente.
Solución del problema 6:
public class Info {
private String address;
private String phone;
private String email;
public Info (String address, String phone, String email){
this.address=address;
this.phone=phone;
this.email=email;
}
public String getAddress(){
return address;
}
public String getPhone(){
return phone;
}
public String getEmail(){
return email;
}
}
public class Customer {
private String name;
private Info info;
public Customer (String name, Info info){
this.name=name;
this.info=info;
}
public String getName(){
return name;
}
public Info getInfo(){
return info;
}
}
public class BusinessCustomer extends Customer{
private int accountNo;
public BusinessCustomer (String name, Info info, int accountNo){
super(name,info);
this.accountNo=accountNo;
}
public int getAccountNo(){
return accountNo;
}
}
public class ContactManager {
private Customer[] contactos;
private int i=0;
public ContactManager(){
contactos=new Customer[100];
}
public void
addCustomer(String name, String address, String
phone, String email){
//
debería controlarse que no esté lleno contactos
Info info=new Info(address,phone,email);
contactos[i]=new Customer(name,info);
i++;//idem comentario anterior
}
//agrego un método sobrecargado
public void addCustomer(Customer c){
String n=c.getName();
String a=c.getInfo().getAddress();
String p=c.getInfo().getPhone();
String e=c.getInfo().getEmail();
addCustomer(n,a,p,e);
}
public void addBusinessCustomer(String name, String address,
String phone, String email, int accountNo){
//
debería controlarse que no esté lleno contactos
Info info=new Info(address,phone,email);
contactos[i]=new BusinessCustomer(name,info,accountNo);
i++;
//idem comentario anterior
}
//agrego método sobrecargado
public void addBusinessCustomer(BusinessCustomer c){
String n=c.getName();
String a=c.getInfo().getAddress();
String p=c.getInfo().getPhone();
String e=c.getInfo().getEmail();
int an=c.getAccountNo();
addBusinessCustomer(n,a,p,e,an);
}
public Customer[ ] findAll(String name){
//supongo que no encontrará más de 10 clientes con igual name
Customer[]encuentra=new Customer[10];
//al invocar este método leer sólo los distintos de null
int k=0;
for(int j=0;j<i;j++){
if(contactos[j].getName().equalsIgnoreCase(name)){
//si lo encuentra
encuentra[k]=contactos[j];
k++;
}
}
return encuentra;
}
}
public class Test {
public static void main(String [] args){
Info i1=new Info("San Juan 1528","4523467","[email protected]");
Info i2=new Info("Alem 234", "4853305","[email protected]");
Info
i3=new
Info("Pellegrini
250","4482367","[email protected]");
Info i4=new Info("Sarmiento 348", "4477987","[email protected]");
Customer c1=new Customer("Jose Perez",i1);
Customer c2=new Customer("Jose Sosa",i2);
BusinessCustomer b1=new BusinessCustomer("David Sastre",i3,1200);
BusinessCustomer b2=new BusinessCustomer("Jose Perez",i4,1280);
ContactManager c=new ContactManager();
c.addCustomer(c1);
c.addCustomer(c2);
c.addBusinessCustomer(b1);
c.addBusinessCustomer(b2);
Customer[] v=c.findAll("Jose Perez");
System.out.println("Encontrados con ese nombre:");
for (int i=0;i<v.length;i++)
if(v[i]!=null)
System.out.println(v[i].getName());
}
}