Examen de Métodos de Programación Ingeniería Informática Primera Parte Cuestión 1. (2 puntos) Se pretende guardar y recuperar matrices de números reales de cualquier dimensión en ficheros binarios de tipos primitivos. Describe el formato en el que se almacenarían las matrices y escribe un método que permita leer la matriz contenida en un fichero que tenga el formato descrito. El método a realizar deberá tener la siguiente cabecera: public static double[][] leematriz(string nomfich) throws IOException Cuestión 2. (1 punto) La clase PuertaConClave, que representa una puerta con cerradura digital que se abre utilizando una clave numérica, se encuentra parcialmente implementada: public class PuertaConClave { /** * Abre la puerta si la clave proporcionada es correcta * @param clave clave proporcionada * @return verdadero si se ha abierto la puerta (la clave era * correcta) */ public boolean abre(int clave) {... // código no relevante para el problema Se pide escribir el código de un método de esa misma clase que llame al método abre y, utilizando el patrón de excepciones recuperables, verifique el comportamiento descrito por el siguiente comentario de documentación: /** * Trata de abrir la puerta pidiendo la clave al usuario como * máximo el número de intentos pasado como parámetro. * Utiliza una ventana de Lectura del paquete fundamentos para * pedir la clave al usuario. * Cuenta como intento cada clave introducida por el usuario. Tanto * si la clave es un valor entero que no abre la puerta, como si el * usuario introduce en la ventana de Lectura un String que no * representa un número entero. * @param numintentos número máximo de intentos que puede realizar * el usuario * @return verdadero si se ha logrado abrir la puerta y falso si se * han completado los intentos sin que se haya proporcionado la * clave correcta */ Página 1/5
Examen de Métodos de Programación Junio 2011 Cuestión 3. (1 punto) Se dispone de la siguiente jerarquía de clases: public class Abuelo { private int numero = 1; public void cambianumero(int n) { numero = n; public int numero() { return numero; public class Padre extends Abuelo { public class Hijo extends Padre { public void cambianumero(int n) { super.cambianumero(n*2); public class Cuest_Herencia { public static void main(string[] args) { Hijo h = new Hijo(); Padre p = new Padre(); Abuelo a = new Abuelo(); Padre ph = new Hijo(); h.cambianumero(2); System.out.println("h1:" + h.numero()); p.cambianumero(7); System.out.println("p:" + p.numero()); a.cambianumero(10); System.out.println("a:" + a.numero()); ph.cambianumero(21); System.out.println("ph:" + ph.numero()); ((Hijo)p).cambiaNumero(100); System.out.println("p:" + p.numero()); ((Hijo)ph).cambiaNumero(300); System.out.println("ph:" + ph.numero()); Página 2/5
En el método main hay una línea incorrecta, indicar cual es esa línea y la razón del error. Indicar la salida por consola que se produciría al ejecutar el programa (con la línea incorrecta y su correspondiente println comentados). Cuestión 4. (1 punto) Responde a las siguientes cuestiones relativas al código mostrado a continuación: Indica la salida por consola que produciría la ejecución del programa. Indica los objetos que se crean y en qué línea se produce la creación, así como aquellas líneas en las que un objeto se convierte en basura. public class UnaClase { public static int num = 0; public String nombre; public UnaClase(String nombre, int n) { this.nombre = nombre; num = n; @Override public String tostring() { return "(" + nombre + ", " + num + ")"; public class Cuestion_Ref_Objs { public static void metodo(unaclase a, UnaClase b) { a = b; public static void main(string[] args) { UnaClase a = new UnaClase("A", 1); UnaClase b = new UnaClase("B", 2); UnaClase c = new UnaClase("C", 3); b=c; b.nombre = "B1"; System.out.println("A:" + a + " B:" + b + " C:" + c); metodo(b, c); System.out.println("A:" + a + " B:" + b + " C:" + c); Página 3/5
Examen de Métodos de Programación Junio 2011 Examen de Métodos de Programación Ingeniería Informática Segunda Parte Cuestión 5. (5 puntos) Completa el diseño e implementación de la aplicación (únicamente de las partes solicitadas) que verifica los siguientes requisitos: Se desea realizar una aplicación que gestione la venta de billetes de tren a los viajeros abonados a una compañía ferroviaria. Cada abonado se identifica por un número entero que es su identificador. La compañía tiene dos tipos de abonados: normales y jubilados. Además del identificador, en el caso de los jubilados se almacena también su nombre. Los abonados jubilados tienen un descuento del 10% en el precio de los billetes. La compañía puede vender billetes para distintos trenes. Un abonado puede comprar billetes para varios trenes y/o más de un billete para el mismo tren. Cada tren se identifica mediante un código alfanumérico (p.e. AB120T). Además, para cada tren se almacenan los nombres de las ciudades de destino y origen de la ruta que cubre. Un tren tiene un número limitado de plazas en primera clase y otro número de plazas en clase turista. Cada tren tiene un precio base del billete que coincide con el precio de una plaza en clase turista. El precio del billete en primera clase es el doble del precio base. La interacción entre el empleado de la compañía ferroviaria y la aplicación es la descrita en los siguientes casos de uso: Compra billete Informe ocupación tren Empleado Comprueba billetes Una aplicación real tendría otros casos de uso (por ejemplo añade abonado o añade tren ). No se piden para limitar la complejidad del problema propuesto. A continuación se procede a describir los casos de uso. No se entra en detalles de la interacción entre el empleado y la aplicación (punto 1 de cada caso de uso), puesto que no va a ser tarea del alumno desarrollar esa parte. Caso de uso Compra billete : 1. El empleado elige la opción Compra billete e introduce el identificador del abonado, el identificador del tren y el tipo de billete (primera o turista). 2. La aplicación comprueba que existe un abonado con el identificador indicado 3. La aplicación comprueba que existe un tren con el identificador indicado Página 4/5
4. La aplicación comprueba que existen plazas libres del tipo deseado en el tren - Si no hay plazas libres, se notifica y finaliza el caso de uso. 5. La aplicación genera un billete para el abonado y muestra el precio para el abonado teniendo en cuenta los posibles descuentos. Caso de uso Informe ocupación tren : 1. El empleado elige la opción Informe ocupación tren e introduce el identificador del tren y el nombre del fichero en el que guardar el informe. 2. La aplicación comprueba que existe un tren con el identificador indicado 3. La aplicación escribe en el fichero la información sobre los billetes vendidos para el tren respetando el formato y la alineación por columnas mostrado a continuación: Santander -> Madrid Primera Clase 675567 Lucía González García 21.00 444555 21.00 Clase Turista 345678 10.50 123456 Antonio Pérez Pérez 9.45 444555 10.50 Para los jubilados se muestra su identificador, su nombre y el precio de su billete, para los abonados normales se muestra su identificador y el precio de su billete. Caso de uso Comprueba billetes : 1. El empleado elige la opción Comprueba billetes e introduce el identificador del abonado y el identificador del tren. 2. La aplicación comprueba que existe un abonado con el identificador indicado 3. La aplicación comprueba que existe un tren con el identificador indicado 4. La aplicación muestra el número de billetes comprados por el abonado para ese tren. La aplicación contaría con un programa principal basado en menú (Dicho programa principal se supone encargado a otro programador, por lo que no deberá ser realizado por el alumno). Se pide: Diagrama de clases (detallado) de la parte de la aplicación encargada al alumno. Código de las clases que sean el origen de una relación de agregación. Código de las clases que componen la jerarquía de clases Abonado. En el código no es necesario incluir los métodos observadores y cambiadores sencillos. Para la corrección se entenderá que existen todos los métodos de este tipo que aparezcan en el diagrama de clases. Página 5/5