Soluciones - Universidad Politécnica de Madrid

Anuncio
Dpto. de Ingeniería de Sistemas Telemáticos
E.T.S.I. Telecomunicación
Universidad Politécnica de Madrid
FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005
Normas de examen:
• Con libros y apuntes
• Duración: 2 horas y 30 minutos
• Responda a cada pregunta en hojas separadas
• No se contestará ninguna pregunta durante el examen
EJERCICIO 1
Pregunta 1.1 (2 Puntos):
En la teoría de los números, se considera “perfecto” a aquellos naturales que son iguales que la suma de
sus divisores positivos menores que él mismo. Por ejemplo, 6 = 1 + 2 + 3 y 28 = 1 + 2 + 4 + 7 + 14 son
números naturales perfectos. Escribir un método que determine si un número entero es un natural
perfecto. El método debe lanzar una excepción si el argumento no es un natural, es decir, es menor o igual
a cero. El método devolverá true cuando el número sea perfecto, y false en caso contrario. NO
DECLARE MÉTODOS AUXILIARES.
SOLUCIÓN:
public boolean esPerfecto (int n) throws Exception {
if (n <= 0) throw new Exception (“Que horror”);
int suma = 1;
int divisor = 2;
int iteraciones = n/2;
for (divisor <= iteraciones; divisor++) {
if (n % divisor == 0)
suma += divisor;
}
return suma == n;
}
EJERCICIO 2
Se desea realizar un programa para la gestión del personal de unos grandes almacenes. Para ello, se pide
modelar las clases que serán necesarias para dicho programa.
Cada persona posee un nombre, un apellido, y un número de registro. Las personas que trabajan en la
empresa son empleados, temporales o aprendices.
Los temporales son personal transferido de otra empresa, y tiene un atributo con el nombre de la misma.
Los aprendices son siempre empleados, y nunca son temporales. Además, los aprendices tienen asignado
un tutor que es un Jefe de la empresa.
Existen varias categorías profesionales dentro de la empresa: Director, Jefe y Dependiente. Un Director
“dirige”, un Jefe “manda”, y un Dependiente “despacha”.
Pregunta 2.1 (1 Punto):
Dibuje una jerarquía de clases que represente a las personas, empleados, temporales y aprendices. Escriba
las clases Persona, Empleado, Temporal y Aprendiz, incluyendo sólo los atributos y constructores. Asigne
los valores de todos los atributos desde los constructores.
SOLUCIÓN:
Persona
String nombre
String apellidos
int numRegistro
Empleado
Temporal
String empresa
Aprendiz
Jefe tutor
class Persona {
private String nombre;
private String apellidos;
private int
numRegistro;
public Persona (String nombre, String apellidos, int numRegistro) {
this.nombre= nombre;
this.apellidos= apellidos;
this.numRegistro= numRegistro;
}
}
class Empleado extends Persona {
public Empleado (String nombre, String apellidos, int numRegistro) {
super (nombre, apellidos, numRegistro);
}
}
class Aprendiz extends Empleado {
private Jefe tutor;
public Aprendiz (String nombre, String apellidos, int numRegistro,
Jefe tutor) {
super(nombre, apellidos, numRegistro);
this.tutor= tutor;
}
}
class Temporal extends Persona {
private String empresa;
public Temporal (String nombre, String apellidos, int numRegistro,
String empresa) {
super(nombre, apellidos, numRegistro);
this.empresa= empresa;
}
}
Pregunta 2.2 (1 Punto):
Escriba unas interfaces que representen las categorías profesionales de la empresa. Incluya los métodos
“dirige”, “manda” y “despacha” en los Directores, Jefes y Dependientes, respectivamente. Estos métodos
no devuelven parámetros, pueden lanzar excepciones y aceptan como parámetro un único “objeto” de
clase desconocida.
SOLUCIÓN:
interface Director {
void dirige (Object o) throws Exception;
}
interface Jefe {
void manda (Object o) throws Exception;
}
interface Dependiente {
void despacha (Object o) throws Exception;
}
Pregunta 2.3 (1 Punto):
Escriba:
• una clase que represente a un jefe con un contrato temporal y que sea dependiente.
• una clase que represente a un director de la empresa. Esta empresa no nombra directores ni a
empleados temporales, ni a aprendices.
SOLUCIÓN:
class JefeTemporalDependiente extends Temporal implements Jefe, Dependiente {
public void manda(Object o) { };
public void despacha(Object o) { };
JefeTemporalDependiente(String nombre, String apellidos, int numRegistro,
String empresa) {
super(nombre, apellidos, numRegistro, empresa);
};
}
class DirectorEmpresa extends Empleado implements Director {
public void dirige(Object o) { };
DirectorEmpresa(String nombre, String apellidos, int numRegistro) {
super(nombre, apellidos, numRegistro);
};
}
EJERCICIO 3
La implantación en seres humanos de dispositivos electrónicos, que conectados al sistema nervioso
puedan controlarse con el pensamiento, es una tecnología disponible en la actualidad. Pensando en esta
tecnología, se desea desarrollar un sistema que haga posible la comunicación mediante telepatía. Este
sistema se construirá como una especie de teléfono móvil integrado dentro de cuerpo, y que enviará
mensajes a quien se desee con sólo pensar en ello.
El envío de los mensajes se hará usando la red de cualquiera de los operadores disponibles en cualquier
momento. Cada operador cobra por cada mensaje enviado una cantidad diferente, dependiendo de si el
mensaje se envió en día festivo o en día laboral, y de la hora a la que se envió el mensaje.
Se pretende que el uso de este sistema será masivo, por lo que es fundamental conseguir que el coste de
envío de mensajes sea lo más bajo posible. En este ejercicio implementaremos la parte encargada de
elegir que operador es el más barato en cada momento, para enviar los mensajes a través de él. Se
desarrollarán clases e interfaces para representar las tarifas de los operadores, y una clase que contenga
las tarifas de todos los proveedores.
Pregunta 3.1 (1 Puntos): Escriba la interfaz Tarifa, que representa los precios que cobra un proveedor
por enviar mensajes a través de él. Esta interfaz debe tener dos métodos. El primer método, llamado
GetProveedor, devuelve un String con el nombre del proveedor al que se refiere la tarifa. El segundo
método, llamado GetPrecio, toma como parámetros un número entero con la hora a la que se quiere
enviar el mensaje, y un booleano que indica si el día es festivo o laborable, devolviendo un valor real que
indica cuanto cuesta enviar un mensaje en el momento indicado.
SOLUCIÓN:
public interface Tarifa {
String getProveedor();
double getPrecio(int hora, boolean festivo);
}
Pregunta 3.2 (2 Puntos): La clase Proveedores se usa para almacenar las tarifas de todos los
proveedores conocidos. Complete esta clase. El atributo tabla debe ser un array de objetos de tipo Tarifa.
class Proveedores {
static final int CAPACIDAD_TABLA=100; // Tamaño del array tabla.
????? tabla;
?????
// Tabla con las tarifas de todos los proveedores.
// Constructor
// Añade la tarifa de un proveedor a la tabla. Si la tarifa ya existe, borre
// la tarifa vieja. Si no cabe en la tabla, lanzar un excepción.
void meteTarifa(Tarifa t) throws Exception {????}
// Elimina la tarifa del proveedor dado de la tabla.
// Si el proveedor no existe, no hacer nada.
void borraTarifa(String proveedor) {????}
// Devuelve el proveedor mas económico existente para la hora y tipo de día
// dados. Si varios proveedores tienen la misma tarifa, elegir cualquiera de
// ellos. Si la tabla está vacía, lanzar una Excepción.
String masBarato(int hora, boolean festivo) throws Exception {????}
}
SOLUCIÓN:
private Tarifa[] tabla;
public Proveedores() {
tabla = new Tarifa[CAPACIDAD_TABLA];
}
void meteTarifa(Tarifa t) throws Exception {
// mira si ya existe, y sobreescribe.
// tambien guardo la posicion del primer hueco libre.
int libre = -1;
for (int i=0 ; i<CAPACIDAD_TABLA; i++)
if (tabla[i] == null) {
if (libre == -1) libre = i;
} else if (t.getProveedor().equals(tabla[i].getProveedor())) {
// sobreescribo y termino:
tabla[i] = t;
return;
}
// Guardo t en el primer hueco libre.
// si no habia hueco, lanzo excepcion.
if (libre != -1)
tabla[libre] = t;
else
throw new Exception("Tabla llena.");
}
void borraTarifa(String proveedor) {
for (int i=0 ; i<CAPACIDAD_TABLA; i++)
if ((tabla[i] != null) && tabla[i].getProveedor().equals(proveedor)) {
tabla[i] = null;
return;
}
}
String masBarato(int hora, boolean festivo) throws Exception {
double precio = 0.0;
// precio del mas barato.
String nombre = null;
// nombre del mas barato.
for (int i=0 ; i<CAPACIDAD_TABLA; i++)
if (tabla[i] != null) {
double prec = tabla[i].getPrecio(hora, festivo);
if (precio > prec) {
precio = prec;
nombre = tabla[i].getProveedor();
}
}
if (nombre != null) return nombre;
throw new Exception("No hay proveedores.");
}
Pregunta 3.3 (1 Punto): Escriba una clase que represente una tarifa única: se cobra lo mismo por todos
los mensajes enviados, independientemente de la hora del envío, y del tipo de día en que se envíe.
SOLUCIÓN:
public class TarifaUnica implements Tarifa {
private String proveedor;
private double tarifa;
public TarifaUnica(String proveedor, double tarifa) {
this.proveedor = proveedor;
this.tarifa
= tarifa;
}
public String getProveedor() {
return proveedor;
}
public double getPrecio(int hora, boolean festivo) {
return tarifa;
}
}
Pregunta 3.4 (1 Punto): Escriba una clase que represente una tarifa por tramos horarios. Consiste en
cobrar un único precio por el envío de mensajes en día festivo, y en los días laborables un precio superreducido para envíos entre las 0 y 8 horas de la mañana, un precio normal para envíos entre las 8 de la
mañana y las 6 de la tarde, y un precio reducido para envíos entre las 6 de la tarde y las 12 de la noche.
SOLUCIÓN:
public class TarifaTramos implements Tarifa {
private
private
private
private
private
String
double
double
double
double
proveedor;
pfestivo;
psuperreducido;
preducido;
pnormal;
public TarifaTramos(String proveedor, double pfestivo,
double psuperreducido, double preducido,
double pnormal) {
this.proveedor = proveedor;
this.pfestivo
= pfestivo;
this.psuperreducido = psuperreducido;
this.preducido = preducido;
this.pnormal
= pnormal;
}
public String getProveedor() {
return proveedor;
}
public double getPrecio(int hora, boolean festivo) {
if (festivo) {
return pfestivo;
} else if (hora <= 8) {
return psuperreducido;
} else if (hora <= 18) {
return pnormal;
} else {
return preducido;
}
}
}
Descargar