practica3.doc

13
Facultad de Ciencias Exactas, Ingeniería y Agrimensura Departamento de Sistemas e Informática Escuela de Electrónica Informática II Práctica Nº 3 - Interfaces Resumen: Esta práctica tiene como objetivo ayudar a comprender e incorporar la utilización de interfaces. Problema 1 : (*) a) Defina una interface llamada ExamIntf con los siguientes métodos: get() parámetros: un entero retorno:un double propósito: usa el entero como índice de un array de doubles put() parámetros:un double retorna: un boolean indicando éxito (true) o fracaso (false) propósito: almacena un double. El primer valor debe ser puesto en la posición con índice 0, el siguiente en la posición 1, y así hasta que el array está lleno. Si no hay espacio en el array, retorna false. sort() parámetros: ninguno retorno: ninguno propósito: ordena el array de doubles de menor a mayor. Sólo se ordena la porción del array llena con valores. avg() parámetros: ninguno retorno: un double propósito: hallar el promedio de los valores almacenados en el array y retornar este valor b) Escriba una clase ExamArray que implemente ExamIntf . La clase debe tener un atributo llamado notas que es una referencia a un array de 100 doubles.

Upload: keyner20

Post on 15-Jan-2016

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Practica3.doc

Facultad de Ciencias Exactas, Ingeniería y AgrimensuraDepartamento de Sistemas e InformáticaEscuela de Electrónica Informática II

Práctica Nº 3 - Interfaces

Resumen:Esta práctica tiene como objetivo ayudar a comprender e incorporar la utilización de interfaces.

Problema 1: (*)a) Defina una interface llamada ExamIntf con los siguientes métodos:

get()parámetros: un enteroretorno:un doublepropósito: usa el entero como índice de un array de doubles put()parámetros:un doubleretorna: un boolean indicando éxito (true) o fracaso (false)propósito: almacena un double. El primer valor debe ser puesto en la posición con índice 0, el siguiente en la posición 1, y así hasta que el array está lleno. Si no hay espacio en el array, retorna false. sort()parámetros: ningunoretorno: ningunopropósito: ordena el array de doubles de menor a mayor. Sólo se ordena la porción del array llena con valores. avg()parámetros: ningunoretorno: un doublepropósito: hallar el promedio de los valores almacenados en el array y retornar este valor

b) Escriba una clase ExamArray que implemente ExamIntf . La clase debe tener un atributo llamado notas que es una referencia a un array de 100 doubles.

c) Escriba una clase llamada RecordExamen que use la interface ExamIntf. Deberá: Deberá añadir los valores de la siguiente tabla al objeto de alguna clase que

implemente la interface ExamIntf.

12.4 34.2 98.4 87.5 99.34 100.0 75.3 89.6

Luego deberá ordenar el array resultante, Imprimir los valores y El promedio

Page 2: Practica3.doc

d) Escriba una clase TestExam con un método main() que cree una instancia de la clase que ha definido en el punto c).

Problema 2:

1- Dada la clase abstracta:

public abstract class Figura {abstract double area();

}

defina las clases Rectangulo, Circulo y Triangulo que extiendan de Figura. Implemente en las clases todos lo métodos y variables necesarios para ello (incluyendo método toString(). Está permitido modificar la clase Figura, siempre que siga siendo abstracta.

2 - Las clases de esta jerarquía deben implementar la interface:

public interface Ordenable {boolean menorArea( Figura O1 );boolean menorPerimetro ( Figura O1);

}

de manera que sea posible ordenar rectángulos, círculos y triángulos por su área o su perímetro.

3 - Arme una clase Test que tenga un método main que instancie objetos Rectangulo, Circulo y Triangulo, y muestre un mensaje por pantalla indicando cuál el de mayor tamaño mostrando también sus características (ancho, alto, etc.)

Nota: Implemente en las clases todos lo métodos y variables necesarios pero siempre al nivel más alto posible de la jerarquía de clases.

Problema 3:

Teniendo en cuenta el problema 2, de la práctica 3:

a) Escriba una clase TrainComparator que compare objetos TrainCar en base a su volúmen. O sea car1 > car2 si el volúmen de car1 es mayor que el de car2. Para referencia se provee la interface:

public interface Comparator {// returns:// negative if o1 < o2// zero if o1 = o2// positive if o1 > o2int compare(Object obj1, Object obj2);

}

Page 3: Practica3.doc

b) Escriba un método genérico que chequee si un array de objetos está ordenado. Un array está ordenado si a[i] a[i+1], para todo i.Dicho método deberá tomar como parámetro un array de objetos y un Comparator para indicar a dicho método cómo comparar pares de objetos. c) Supongamos que estamos escribiendo un programa y se tiene un array de TrainCar declarado: TrainCar train[];¿Cómo usaría las respuestas de los dos puntos anteriores para chequear si este array está ordenado (en cuanto a sus volúmenes)?

Problema 4:

Una compañía de seguros del automotor calcula la cuota mensual de sus clientes teniendo en cuenta ciertas variables tales como la calidad de manejo del titular o características de los vehículos.

Dadas las clases e interface a implementar suministradas:a) Completarlas con lo mínimo necesario. Analizar qué clases extienden a otras, qué visibilidad debe tener cada campo, qué interfaces y dónde se deben implementar, si hay clases abstractas, etc.

Debe tenerse en cuenta que: La variable 'escala' toma valor 1 si el titular del vehículo tiene varios siniestros en su

historial, -1 si nunca requirió servicios del seguro y 0 si se considera un cliente de comportamiento normal.

La cuota para un automóvil se calcula sumando el precio base más la variable 'escala' multiplicada por 30. Y solamente se suman $20 si el automóvil tiene instalado un equipo de GNC.

La cuota para las motos se calcula sumando el precio base más la variable 'escala' multiplicada por 15, más la cilindrada de la moto dividida por 12.

La cobertura para robo depende de que si el vehículo tiene alarma o no.El seguro reconocerá el valor base multiplicado por 300 para los vehículos con alarma y el valor base multiplicado por 250 para los demás, independientemente del tipo de vehículo.

b) Diseñar la clase Prueba. Instanciar una moto y un automóvil, guardarlos en un arreglo. Imprimir por pantalla la cuota de la moto.

public interface Seguro {double cuota();double cobertura_robo();

}

class Vehiculo {double base;String patente;int escala;String marca;boolean alarma;

}

Page 4: Practica3.doc

class Automovil {boolean GNC;

}

class Moto {int cilindrada;

}

Problema 5:

a) Declare una interface llamada Funcion que tenga un método llamado evaluar() que tome como argumento y retorne un entero.

b) Cree una clase Mitad que implemente Funcion y tal que el método evaluar() retorne el valor obtenido de dividir el argumento del método por 2.

c) Cree un método que tome como argumento un array de valores enteros y retorne un array de la misma longitud que el primero pero que cada elemento de este nuevo array tenga la mitad del valor del correspondiente elemento en el array pasado como parámetro. En la implementación del método podrá crear una instancia de Mitad y usar dicha instancia para calcular los valores del array a retornar.

d) Reescriba el método del punto anterior: el método deberá tener un argumento adicional que sea una referencia de tipo Funcion y deberá usar la misma en lugar de la instancia de tipo Mitad.

Problema 6:

El API de Java define la interface Comparable como:

interface Comparable{int compareTo(Object O1);

}

donde x.compareTo(y) retornará –1 si x es menor que y, 0 si son iguales y 1 si x es mayor que y.Defina una clase MyArray que implemente Comparable y cuyos objetos se comporten como arreglos (vectores) de enteros.Objetos de tipo MyArray deben compararse de acuerdo a las sumas de sus elementos.

Por ejemplo:

int[] a = new int[] {1,2,3,4}; /* crea un array e inicializa los elementos */int[] b = new int[] {-1,2,-3,4,-5};MyArray m1 = new MyArray(a); MyArray m2 = new MyArray(b); System.out.println(m1.compareTo(m2)); /* imprime 1, puesto que 1+2+3+4 > -1+2-3+4-5 */

Defina lo suficiente para que la clase MyArray para que el código de más arriba funcione.

Page 5: Practica3.doc

Problema 7:

Dadas las clases e interface a implementar suministradas, a) Completarlas con lo mínimo necesario para que el programa de prueba (clase Prueba) funcione adecuadamente, sin agregar propiedades (campos) ni alterar la esencia del problema. Debe tenerse en cuenta que: * el consumo de un equipo de pared se calcula como 0,41 vatios por frigoría mientras que el de un split es de 0,45 vatios por frigoría * el costo de instalación final se calcula como el básico más los materiales. Estos últimos en el caso de un equipo de pared siempre son $30.-

Luego completar la clase Prueba para:b) Crear un arreglo de 4 equipos (de diferentes tipos) utilizando directamente los constructores con datos adecuados (no hace falta ingreso por teclado).

interface LineaFrio { /* devuelve datos del equipo. Sirve para acondicionadores, heladeras, freezers, etc. */

double costoBasicoInstalacion = 50.0; boolean tieneRemoto(); double frigorias(); double consumo(); double precio(); double costoFinalInstalacion();

}

class Acondicionadores { private String marca; private String modelo;

private double frigorias; private String color; private boolean remoto; private double precio;

Acondicionadores(double frig, String col, boolean rem) { frigorias = frig;

color = col;remoto = rem;

}

public boolean tieneRemoto() { return remoto;} public double frigorias() { return frigorias;} public double precio() { return precio;}

}

class Split { private double diametroAgujero; private double costoMaterialesInstalacion;

Page 6: Practica3.doc

}

class DePared { private double alto_agujero; private double ancho_agujero;

}

Problema 8:

En la siguiente figura Person (persona) tiene un nombre (Name), Student (estudiante) es una persona y los estudiantes implementan Comparable. Comparable es una interface definida en Java. Suponga que las clases Name y Person ya están implementadas. Deberá implementar la clase Student de acuerdo a las especificaciones, donde compareTo es un método para comparar dos estudiantes en orden alfabético de sus: especialidades (major), apellido (lastName), primer nombre (firstName) e inicial del segundo nombre (mi). Puede utilizar el método de String:

public int compareTo(String anotherString), el cual retorna 0 si los String son iguales.

Problema 9:

El Banco de Londres posee distintos tipos de cuentas incluyendo CuentasLimitadas y CuentasIlimitadas, cada una de ellas es un tipo de Cuenta. Escriba un programa Java que use una interface DignadeCredito para tratar todos los tipos de cuentas de la misma forma como potenciales clientes a quienes se les puede entregar una tarjeta de crédito. Un cliente de tipo CuentasLimitadas califica para poseer una tarjeta de crédito si el número de transacciones que ha realizado en su cuenta es mayor a 80. Un cliente de tipo CuentasIlimitadas califica para poseer una tarjeta de crédito si el saldo más pequeño que ha tenido en su cuenta es superior a $5000.

Para todos los clientes se tienen en cuenta tres tipos de operaciones: i.-Mostrar por pantalla su situación financiera en una línea con el siguiente formato:

Page 7: Practica3.doc

Tipo de cuenta, saldo=saldo actual, saldo menor=menor saldo que tuvo la cuentaii.-Retornar (double) valor del límite de crédito inicial calculado como 5 veces el saldo mínimo de la cuentaiii.-Retornar true si califica para tener tarjeta de crédito, false en caso contrario

Deberá:a) Escribir la definición de la interface DignadeCrédito de forma tal de tener en cuenta

las operaciones mencionadasb) Completar la siguiente declaración de la clase CuentasIlimitadas de forma tal que

implemente DignadeCrédito. Puede añadir las variables de instancia y métodos que considere necesarios.

public class CuentasIlimitadas {

protected static double saldoMinimoRequerido= 500.00;protected static double ComisionesMensuales = 5.00;

public CuentasIlimitadas(double saldoInicial) {super(saldoInicial);

}

public void findeMes(){if(saldoMinimo<saldoMinimoRequerido) saldo-=ComisionesMensuales; /* descuenta las comisiones

del mes */imprimirEstadoMensual();

}

// completar

}

Problema 10:

Se trata de escribir programas para manejar canales de TV por cable. Cada clase que maneja una empresa de televisión por cable deberá poder manejar un número máximo de canales (por defecto, el máximo es 99 canales). Estas clases son lo suficientemente inteligentes como para registrar el canal que está viendo y el que ha visto previamente. Inicialmente estas variables tienen el valor 1. Los números de canales deberán estar siempre entre 1 y el número máximo, inclusive. Estas clases tienen una característica adicional, alternarCanal, que permite intercambiar los dos últimos canales vistos. Con esta descripción cree una clase Java que implemente la siguiente interface:

interface TVI {

/* nro. Máximo de canales, por defecto */final int DEFAULT_MAX = 99;

/* retorna canal actual */ int getCurrentChannel();

Page 8: Practica3.doc

/* cambia a canalactual+1, chequea que no supere el máximo */void incChannel();

/* cambia a canalactual-1, chequea que no pase el canal 1 */void decChannel ();

/* cambia canal actual por el último visto */void alternateChannel ();

}

Problema 11:

Complete la clase Frase de forma tal que el siguiente método main() se ejecute correctamente y muestre por pantalla la salida mostrada.

public interface Reversible {public void reverse();

}

public class Test {public static void main(String [] args) {

String [] palabras = {"Here", "are", "some", "words"};Reversible theItem = new Frase(palabras);System.out.println(theItem);theItem.reverse();System.out.println(theItem);

}}

Salida por pantalla:Frase: Here are some wordsFrase: words some are Here

Page 9: Practica3.doc

Solución del problema 1:

public interface ExamIntf {public double get(int idx);public boolean put(double val);public void sort();public double avg();

}

public class ExamArray implements ExamIntf {private double[] notas;private int contador;

public ExamArray() {notas = new double[100];

for (int i = 0; i < notas.length; i++)notas[0] = 0.0;

//OTRA FORMA: java.util.Arrays.fill(notas, 0.0);contador = 0;

}public double get(int idx) {

return notas[idx];}

public boolean put(double val) {if (contador < notas.length) {

notas[contador++] = val;return true;

} elsereturn false;

}

public void sort() {// java.util.Arrays.sort(notas,0,contador); //no valido para J.1.0double men;for (int i = 0; i < contador - 1; i++)

for (int j = i + 1; j < contador; j++)if (notas[i] > notas[j]) {

men = notas[j];notas[j] = notas[i];notas[i] = men;

}}

public double avg() {double sum = 0;for (int i = 0; i < contador; i++)

sum += notas[i];return sum / (contador);

Page 10: Practica3.doc

}}

public class RecordExam {

public RecordExam(ExamIntf lote) {lote.put(12.4);lote.put(34.2);lote.put(98.4);lote.put(87.5);lote.put(99.34);lote.put(100.0);lote.put(75.3);lote.put(89.6);lote.put(9.6);//lote.put(189.6);

lote.sort();int pos = 0;while (true) {

double x = lote.get(pos++);if (x == 0)

break;System.out.println(x);

}

/*otra forma de lo mismo pero desconocemos hasta donde debe llegar i (es mejor la anterior)

for (int i=0;i<1000;i++) {double x = lote.get(i) ;if (x==0)break;System.out.println(x);

} */ System.out.println("\n" + lote.avg());

}}

public class TestExam {

public static void main(String[] args) {

ExamArray EA1 = new ExamArray();RecordExam RR = new RecordExam (EA1);

}}