Depto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación Fundamentos de Programación 15 de diciembre de 2011 Ejercicio 1 (2 puntos) SOLUCIONES class TarjetaDeCredito public class TarjetaDeCredito { private enum ESTADO {CERRADA, ABIERTA, BLOQUEADA private int saldo; private final int clave; private ESTADO estado; private 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()) if (clave == this.clave) { estado = ESTADO.ABIERTA; fallos = 0; return true; fallos++; if (fallos >= 3) { estado = ESTADO.BLOQUEADA; 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()) 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; 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; 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 int x = 2 / 0; catch (Exception e) {
ejecución int x = Integer.parseInt("3.14"); catch (Exception e) { Object n = new Integer(1492); String s = (String) n; catch (Exception e) { Class c = Class.forName("NoExisto"); catch (Exception e) { int[] array = new int[]{1, 2, 3, 4; int i = array[4]; catch (Exception e) { 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)