Soluciones - Universidad Politécnica de Madrid

Anuncio
Depto. Ingeniería de Sistemas Telemáticos
Universidad Politécnica de Madrid
ETSI Telecomunicación
Fundamentos de Programación
15 de diciembre de 2011
SOLUCIONES
Ejercicio 1 (2 puntos)
class TarjetaDeCredito
public class TarjetaDeCredito {
private enum ESTADO {CERRADA, ABIERTA, BLOQUEADA}
private
private
private
private
int saldo;
final int clave;
ESTADO estado;
int fallos;
/**
* Inicializa los atributos privados de la clase.
*
* @param saldoInicial saldo inicial en la cuenta.
* @param clave
clave de acceso.
*/
public TarjetaDeCredito(int saldoInicial, int clave) {
this.saldo = saldoInicial;
this.clave = clave;
this.estado = ESTADO.CERRADA;
this.fallos = 0;
}
/**
* Getter.
*
* @return true si la tarjeta está cerrada.
*/
public boolean isCerrada() {
return estado == ESTADO.CERRADA;
}
/**
* Getter.
*
* @return true si la tarjeta está abierta.
*/
public boolean isAbierta() {
return estado == ESTADO.ABIERTA;
}
/**
* Getter.
*
* @return true si la tarjeta está bloqueada.
*/
public boolean isBloqueada() {
return estado == ESTADO.BLOQUEADA;
}
/**
* Método para autenticar la clave de la tarjeta.
* Si se llama tres veces seguidas a este método con clave no válida,
* la tarjeta queda bloqueada.
* La clase debe llevar la cuenta de cuántos intentos
* consecutivos han fallado.
*
* @param clave clave numérica que el usuario teclea
*
para poder usar su tarjeta.
* @return true si la clave es válida; false si no lo es.
* @throws TarjetaBloqueadaException Si la tarjeta estaba o queda bloqueada.
*/
public boolean abre(int clave)
throws TarjetaBloqueadaException {
if (isBloqueada())
throw new TarjetaBloqueadaException();
if (clave == this.clave) {
estado = ESTADO.ABIERTA;
fallos = 0;
return true;
}
fallos++;
if (fallos >= 3) {
estado = ESTADO.BLOQUEADA;
throw new TarjetaBloqueadaException();
}
return false;
}
/**
* Método para 'irse': el usuario cierra la tarjeta.
*/
public void cierra() {
estado = ESTADO.CERRADA;
}
/**
* Método para sacar dinero de la cuenta asociada a la tarjeta.
* Antes de sacar dinero, hay que autenticar la tarjeta.
*
* @param cantidad dinero que queremos sacar.
* @return el saldo total que queda en la cuenta asociada
*
tras extraer la cantidad solicitada.
* @throws NohaySaldoSuficienteException
*
Si hay menos saldo en la cuenta que la cantidad a extraer.
* @throws TarjetaBloqueadaException
*
Si la tarjeta se encuentra bloqueada.
*/
public int sacar(int cantidad)
throws NohaySaldoSuficienteException, TarjetaBloqueadaException {
if (isBloqueada())
throw new TarjetaBloqueadaException();
if (isCerrada())
return 0;
if (saldo < cantidad)
throw new NohaySaldoSuficienteException();
saldo -= cantidad;
return saldo;
}
public static void main(String[] args)
throws TarjetaBloqueadaException {
TarjetaDeCredito tarjeta = new TarjetaDeCredito(1000, 9999);
// a. autenticar la tarjeta con clave válida
//
y comprobar que no se bloquea
tarjeta.abre(9999);
System.out.println("¿bloqueada? " + tarjeta.isBloqueada());
// b. extraer con la tarjeta más dinero del que se tiene como saldo
//
y comprobar que no se puede
int saldo = 0;
try {
saldo = tarjeta.sacar(2000);
} catch (NohaySaldoSuficienteException no) {
System.out.println("devuelve " + saldo);
}
// c. comprobar que la tarjeta se bloquea
//
tras autenticarse con tres claves seguidas incorrectas.
int intento = 1;
try {
while (true) {
System.out.println("intento " + intento);
tarjeta.abre(0);
intento++;
}
} catch (TarjetaBloqueadaException e) {
System.out.println("bloqueada: intento: " + intento);
}
}
}
Ejercicio 2 (2 puntos)
public int[] ordenar(int[] in) {
int[] out = new int[in.length];
int dst = 0;
for (int n : in) {
if (n % 2 == 0)
out[dst++] = n;
}
for (int n : in) {
if (n % 2 != 0)
out[dst++] = n;
}
return out;
}
Ejercicio 3 (2 puntos)
método iterativo
public int suma1(int in) {
int suma = 0;
while (in > 0) {
int n1 = in % 10;
suma += n1;
in /= 10;
}
return suma;
}
método recursivo
public int suma2(int in) {
if (in == 0)
return 0;
int n1 = in % 10;
return n1 + suma2(in / 10);
}
Ejercicio 4 (2 puntos)
class Eliza
public class Eliza {
private static final String[][] tabla = {
{"Hola", "Hola, ¿qué tal?"},
{"Encantado", "Encantada de conocerte yo también"},
{"Adiós", "Adiós, espero volver a verte pronto"},
{"Hora", "Lo siento, no llevo reloj"},
{"Nombre", "Mi nombre es Eliza"},
};
private static final String nose = "Lo siento, no te comprendo";
public String respuesta(String pregunta) {
String mip = pregunta.toLowerCase();
for (int i = 0; i < tabla.length; i++) {
String clave = tabla[i][0].toLowerCase();
if (mip.contains(clave))
return tabla[i][1];
}
return nose;
}
public static void main(String[] args) {
Eliza eliza = new Eliza();
Scanner scanner = new Scanner(System.in);
String pregunta;
while ((pregunta = scanner.nextLine()) != null) {
System.out.println("Eliza: " + eliza.respuesta(pregunta));
}
}
}
Ejercicio 5 (2 puntos)
class NumeroNegativoException
public class NumeroNegativoException
extends Exception {
public NumeroNegativoException() {
}
public NumeroNegativoException(String s) {
super(s);
}
}
excepciones
try {
int x = 2 / 0;
} catch (Exception e) {
System.out.println(e);
}
try {
int x = Integer.parseInt("3.14");
} catch (Exception e) {
System.out.println(e);
}
try {
Object n = new Integer(1492);
String s = (String) n;
} catch (Exception e) {
System.out.println(e);
}
try {
Class c = Class.forName("NoExisto");
} catch (Exception e) {
System.out.println(e);
}
try {
int[] array = new int[]{1, 2, 3, 4};
int i = array[4];
} catch (Exception e) {
System.out.println(e);
}
ejecución
Exception in thread "main" java.lang.RuntimeException: fuera de rango
at e2011_12.E51.acceso_por_indice(E51.java:14)
at e2011_12.E51.main(E51.java:23)
Descargar