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()); } }