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)