Examen de Prácticas de Programación Ingeniería Informática



Documentos relacionados
Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Uso de excepciones en Java

Prácticas de Programación

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Programación Orientada a Objetos. Java: Excepciones

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Programación Orientada a Objetos. Java: Excepciones

APELLIDOS:... NOMBRE:... GRUPO:... NÚMERO DE EXPEDIENTE:...

Examen de Prácticas de Programación Ingeniería Informática

Ejercicio 1 (3 puntos).-

Tema: Clases y Objetos en C++.

Manual del Protocolo XML-RPC de Mensajería Negocios

Introducción - por qué usarlas?(1)

Primer Parcial Septiembre 5 de 2009

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

Examen de Prácticas de Programación Ingeniería Informática

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Patrones para persistencia (I) Ingeniería del Software II

Práctica sobre compartición de instancias remotas.

Tema 2. El lenguaje de programación Java (Parte 1)

Excepciones. Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial. Excepciones

Programación Avanzada para Sistemas de Telecomunicación. Objetos y clases. J.C. Cruellas. Objetos y clases

Ejercicios de Programación Orientada a Objetos

Práctica 4: Java Remote Method Invocation (RMI)

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Programación Orientada a Objetos con Java

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

Ejercicios del tema 7: Clases y objetos

Ejercicios - Persistencia en Android: ficheros y SQLite

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

1. Qué tipos de relación hay entre las siguientes clases?

Repaso de las características más importantes de la programación Java y su adaptación a Android

EXCEPCIONES EN JAVA. Las sentencias que tratan las excepciones son try y catch. La sintaxis es:

PROGRAMACIÓN EN JAVA

También añado a la clase Libro los siguientes métodos: (que programaré más adelante)

1. Introducción. 1.1 Ejercicio 1: Estación Meteorológica (4.0 pts.) Ejercicio 2: Gestión Académica: Alumnos (5.0 pts.)...

Excepciones y E/S Java y Servicios Web I Master en Ingeniería Matemática

Administración Local Soluciones

Prof. Dr. Paul Bustamante

PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

Prof. Dr. Paul Bustamante

Introducción a la programación orientada a objetos

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Universidad Carlos III de Madrid Ingeniería de Telecomunicación. Examen de Programación Febrero Parte de Ejercicios

EJEMPLO DE PRUEBAS UNITARIAS Y DE INTEGRACIÓN.

Facultad de Ingeniería Escuela de Ingeniería de Sistemas y Computación Algoritmia y Programación

Un breve resumen del lenguaje Java

Técnicas Avanzadas de Testing Automatizado

Examen escrito de Programación 1

15. Parámetros o argumentos

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Java: Clases Abstractas e Interfaces

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Tema 3. Test Driven Development

Trabajo Práctico N 4: Diseño por Contratos

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

Pruebas de unidad con JUnit

APLICACIÓN WEB PARA LA GESTIÓN DEL DOCUMENTO DE ACTIVIDADES Y PLAN DE INVESTIGACIÓN DE DOCTORADO

Curso de Java POO: Programación orientada a objetos

CURSO 2º GRUPO Junio 2011

Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO

Segunda práctica de Programación 2

1. Creación del repositorio

11. Algunas clases estándar de Java (II)

Examen Septiembre Curso Programación en C++ Pág. 1

Estructura de datos tipo vector.

Práctica 2: Java Remote Method Invocation (RMI)

Multitarea en Java. Rafa Caballero - UCM

SINAUTO. (Captura Requirimientos) GRUPO 03

3.9 Patrón Distributed callback

Tema 3: Genericidad en Java. Tema 3: Genericidad en Java. Objetivos y Bibliografía. Modelos de Datos Genéricos

8. Sentencia return y métodos

Introducción al lenguaje Java

Elementos léxicos del lenguaje de programación Java

Tema 14: Excepciones

Metodología y Tecnología de la Programación

Benemérita Universidad Autónoma del Estado de Puebla

Instalación. Interfaz gráfico. Programación de Backups. Anexo I: Gestión de la seguridad. Manual de Usuario de Backup Online 1/21.

2. Estructura de un programa en Java

POLIMORFISMO "una interfaz, múltiples métodos".

Fundamentos de Computadores y Lenguajes

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Caso práctico Alquiler de películas en un vídeo-club

(Certificado de Empresa): guía para las empresas

Práctica III: Streams, Readers y Writers

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Ejemplo de lectura por teclado de un número entero: int n; System.out.print("Introduzca un número entero: "); n = sc.nextint();

DEPARTAMENTO: Informática. MATERIA: Programación. NIVEL: 1º Desarrollo de Aplicaciones Multiplataforma

Programación Orientada a Objetos en JAVA

Práctica 2 Gráficos Vectoriales con SVG (versión )

El lenguaje de programación Java

Tema 2. El lenguaje de programación Java. Arrays y cadenas

Documentación: Gestor de una Biblioteca (Eclipse, MySQL, JDK 1.6+) Jose Alberto Benítez Andrades

CREACIÓN Y GENERACIÓN DE REMESAS DE ADEUDOS SEPA

TEMA 5. EXCEPCIONES EN JAVA DEFINICIÓN DE EXCEPCIONES EN PROGRAMACIÓN TIPOS DE EXCEPCIONES / ERRORES Y CÓMO TRATARLOS

Transcripción:

Examen de Prácticas de Programación Ingeniería Informática Septiembre 2007 1) (3.5 puntos) Se pretende desarrollar un programa para gestionar las reparaciones de coches realizadas en un garaje. Del análisis de requerimientos del problema se han obtenido los siguientes datos: El garaje debe mantener una lista con todos los coches que ha reparado. Cada coche se identifica por su matrícula. Además un coche debe tener la dirección de su dueño y un historial con todas las reparaciones a las que se ha visto sometido. Las reparaciones deben contener la información relativa a la avería reparada y al kilometraje del coche en el momento de la reparación. Se han identificado los siguientes casos de uso: Asociar una reparación a un coche. Debe identificarse como un error el hecho de que la reparación tenga un kilometraje inferior al de la última reparación realizada. Obtener la última reparación realizada a un coche. Buscar todas las reparaciones realizadas sobre un coche que contengan una palabra clave. Incluir un coche en la lista de coches reparados por el garaje. Se considera un error tratar de incluir un coche con matrícula igual a la de alguno de los coches ya existentes en la lista. Diseño arquitectónico (incompleto): Garaje GestiónGaraje main Reparación Coche Completar el diseño arquitectónico. Realizar el diseño detallado (únicamente de los métodos más complejos y en especial del método main). Realizar la codificación de las clases Garaje, Coche y Reparación. (Nota: enunciado ligeramente modificado para adaptarle a la nomeclatura utilizada en el curso 07/08) Solución: Página 1/14

Diseño arquitectónico GestiónGaraje main Reparación descrición: Texto kms: Entero Reparación(descripción:Texto, kms:entero) descripción() retorna Texto kms() retorna Entero reparaciones 0..* matrícula: Texto direccióndueño: Texto Coche 0..* coches Coche(matrícula:Texto, direccióndueño: Texto) matrícula() retorna Texto buscareparaciones(palabraclave:texto) retorna lista de Reparaciones últimareparación() retorna Reparación añadereparación(r:reparación) Garaje añadecoche(coche:coche) buscacoche(matrícula:texto) retorna Coche Diseño detallado: método main crea menú hacer intenta { lee opción menú si (opción) { ASOCIA_REPARACIÓN=> pide datos reparación (descripción y kms) pide matrícula coche coche = garaje.buscacoche(matrícula) reparación = nueva Reparacion(descripción, kms) coche.añadereparación(reparación) ÚLTIMA_REPARACIÓN=> pide la matrícula del coche coche = garaje.buscacoche(matrícula); intenta { reparación = coche.últimareparación(); muestra datos reparación Página 2/14

coge NoHayReparaciones mensaje "no hay reparaciones registradas" fintenta BUSCAR=> pide matrícula del coche pide palabra clave coche = garaje.buscacoche(matrícula); listarep = coche.buscareparaciones(palabraclave); muestra todas las reparaciones en listarep AÑADIR=> pide datos coche (matrícula y dirección del dueño) coche = nuevo Coche(matrícula, dirección); garaje.añadecoche(coche); SALIR=> finaliza programa fsi coge MatriculaRepetida mensaje error "ya existe un coche con esa matrícula" coge CocheNoExiste mensaje error "no existe ningún coche con esa matrícula" coge KmsIncorrectos mensaje error "error en kilometraje" fintenta fhacer fmétodo Codificación: public class Garaje { private LinkedList<Coche> coches = new LinkedList<Coche>(); public void añadecoche(coche coche) throws MatriculaRepetida { // comprueba si ya existe algún coche con esa matrícula if (buscacoche(coche.matrícula())!= null) { // ya existe un coche con esa matrícula throw new MatriculaRepetida(); // si llega hasta aquí es porque no hay ningún coche con // esa matrícula coches.add(coche); public Coche buscacoche(string matrícula) { for(coche c: coches) if (c.matrícula().equals(c.matrícula())) return c; return null; Página 3/14

public class Coche { public static class KmsIncorrectos extends Exception { private String matrícula; private String direccióndueño; private LinkedList<Reparacion> reparaciones = new LinkedList<Reparacion>(); // reparaciones también podría ser un array, aunque mejor una // LinkedList public Coche(String matrícula, String direccióndueño) { this.matrícula=matrícula; this.direccióndueño=direccióndueño; public String matrícula() { return matrícula; public String direccióndueño() { return direccióndueño; public LinkedList<Reparacion> buscareparaciones( String palabraclave) { LinkedList<Reparacion> lista = new LinkedList<Reparacion>(); for(reparacion r: reparaciones) if (r.descripción().indexof(palabraclave)!=-1) // incluye la palabra clave lista.add(r); return lista; public Reparacion últimareparación() { if (reparaciones.size()==0) return null; return reparaciones.getfirst(); public void añadereparación(reparacion r) throws KmsIncorrectos { if (r.kms()<reparaciones.getfirst().kms()) throw new KmsIncorrectos(); reparaciones.addfirst(r); Página 4/14

public class Reparacion { private String descripción; private int kms; public Reparacion(String descripción, int kms) { this.descripción=descripción; this.kms=kms; public String descripción() { return descripción; public int kms() { return kms; Página 5/14

2) (2.5 puntos) Escribir el código (atributos y métodos) correspondiente a la jerarquía de clases mostrada a continuación: Figura Figura2D Línea Rectángulo Círculo Descripción de las clases: Una característica común a todas las figuras es el color con el que se dibujan sus bordes (representado mediante un número entero). El color de borde de una figura se especifica en el momento de su creación. También existen operaciones que permiten cambiar y obtener el color de borde de una figura ya creada. Todas las figuras tienen la operación de dibujar. Esta operación no está definida para las clases Figura y Figura2D y dibuja la figura correspondiente en el resto de las clases (no hay que escribir el código de esta operación, pero sí indicar el o los métodos en que debería incluirse dicho código) Las figuras de dos dimensiones tienen un color de relleno (representado mediante un número entero) que es el color con el que se rellena el interior de la figura. El color de relleno se especifica en el momento de su creación. También existen operaciones que permiten cambiar y obtener el color de relleno de una figura de dos dimensiones ya creada. Cada figura (Rectángulo, Círculo y Línea) debe tener los atributos propios de su geometría que serán especificados en el momento de su creación. Además se desea disponer de un mecanismo que permita conocer el número total de objetos de las clase Figura y sus clases derivadas que han sido creados desde el comienzo de la ejecución de la aplicación. (Nota: en el curso 06/07 no se vieron las clases abstractas. La pregunta ha sido modificada en 2008 para que las utilice) Solución: public abstract class Figura { private int colorborde; private static int cuenta=0; public Figura(int colorborde) { this.colorborde=colorborde; cuenta++; Página 6/14

public int colorborde() { return colorborde; public void asignacolorborde(int colorborde) { this.colorborde=colorborde; public abstract void dibuja(); // abstracto, se define en las subclases public static int cuentafiguras() { return cuenta; public abstract class Figura2D extends Figura { private int colorrelleno; public Figura2D(int colorborde, int colorrelleno){ super (colorborde); this.colorrelleno=colorrelleno; public int colorrelleno() { return colorrelleno; public void asignacolorrelleno(int colorrelleno) { this.colorrelleno=colorrelleno; public class Linea extends Figura { private int xini, yini; // coordenadas del punto inicial private int xfin, yfin; // coordenadas del punto final public Linea(int xini, int yini, int xfin, int yfin, int colorborde) { super(colorborde); this.xini=xini; this.yini=yini; this.xfin=xfin; this.yfin=yfin; public void dibuja() { // código correspondiente a dibujar una línea en base a sus // coordenadas xini, yini, xfin, yfin Página 7/14

public class Circulo extends Figura2D{ private int xcentro, ycentro; // coordenadas centro private int radio; // radio del círculo public Circulo(int xcentro, int ycentro, int radio, int colorborde, int colorrelleno) { super(colorborde, colorrelleno); this.xcentro=xcentro; this.ycentro=ycentro; this.radio=radio; public void dibuja() { // código correspondiente a dibujar un círculo en base a su // centro (xcentro,ycentro) y a su radio public class Rectangulo extends Figura2D { private int x0, y0; // vértice superior izquierdo private int x1, y1; // vértice inferior derecho public Rectangulo(int x0, int y0, int x1, int y1, int colorborde, int colorrelleno) { super(colorborde, colorrelleno); this.x0=x0; this.y0=y0; this.x1=x1; this.y1=y1; public void dibuja() { // código correspondiente a dibujar un rectángulo en base a // sus vértices (x0,y0) y (x1,y1) Página 8/14

3) (2.5 puntos) Se está desarrollando un programa de gestión de los alumnos de una carrera universitaria. Se dispone de las clases Alumno y FichaAsignatura, cuya interfaz es la mostrada a continuación: public class FichaAsignatura { * constructor public FichaAsignatura(String nombre, double nota, boolean matriculado, boolean superada) { xxx * nombre de la asignatura public String nombre() { xxx * nota obtenida en la asignatura (sólo tiene sentido en * asignaturas ya superadas por el alumno) public double nota() { xxx * indica si un alumno se encuentra matriculado de * la asignatura public boolean alumnomatriculado() { xxx * indica si la asignatura ha sido superada public boolean superada() { xxx public class Alumno { * crea un alumno que no ha superado ni se encuentra * matriculado en ninguna asignatura public Alumno(String nombre) { xxx * retorna un array que indica la situación del alumno en TODAS * las asignaturas de la carrera (NO sólo aquellas en las que * el alumno se haya matriculado o ya haya superado) public FichaAsignatura[] asignaturas() { xxx * retorna el nombre del alumno public String nombre() { xxx Página 9/14

* permite indicar que el alumno está matriculado en * una asignatura public void matriculaenasignatura(string nombreasig) { xxx * permite indicar que el alumno ha superado una asignatura. * En el caso de que la nota no esté comprendida en el *intervalo [5.0,10.0] lanza la excepción NotaIncorrecta. public void superaasignatura(string nombreasig, double nota) throws NotaIncorrecta { xxx Se está desarrollando la clase ListaAlumnos: public class ListaAlumnos { * lista con todos los alumnos de la carrera private LinkedList<Alumno> lista = new LinkedList<Alumno>(); otros métodos no relevantes para el problema Se pide añadir a la clase ListaAlumnos los dos métodos descritos a continuación: guardaenfichero: guarda en un fichero de texto los alumnos existentes en lista (el nombre del fichero se pasa como parámetro). Junto con el nombre de cada alumno se indican las asignaturas en las que se encuentra matriculado o que ya ha superado (en el caso de estas últimas, junto al nombre de la asignatura aparece la nota obtenida). El formato del fichero será el mostrado a continuación: Pedro García González CIENCIA Y TECNOLOGIA DE MATERIALES:matriculado QUIMICA:6.5 FUNDAMENTOS FISICOS:matriculado Antonio López López CIENCIA Y TECNOLOGIA DE MATERIALES:9.5 EXPRESION GRAFICA:matriculado FUNDAMENTOS FISICOS:matriculado FUNDAMENTOS MATEMATICOS:7.2... constructor que recibe como parámetro el nombre de un fichero con el formato anteriormente mencionado. Lanzará la excepción ErrorDeFormato si detecta que falta el carácter : en la línea correspondiente a una asignatura o si el valor numérico de la nota no es correcto. También propagará el resto de excepciones que pueden producirse (NotaIncorrecta y las debidas a la utilización del fichero). Página 10/14

Solución: public ListaAlumnos(String nomfich) throws ErrorFormatoFichero, FileNotFoundException, IOException, NotaIncorrecta { BufferedReader ent =null; try { // Abre el fichero ent = new BufferedReader(new FileReader(nomFich)); // lee la primera línea String línea = ent.readline(); while(línea!=null &&!línea.equals("")) { // nuevo alumno // crea un alumno con el nombre leído Alumno a = new Alumno(línea); lista.add(a); // lee la primera asignatura del alumno línea = ent.readline(); while(línea!=null &&!línea.equals("")) { try { // separa el nombre de la asignatura de la nota int p = línea.indexof(':'); if (p==-1) throw new ErrorFormatoFichero(); String nombreasig = línea.substring(0,p); String nota=línea.substring(p+1); // mira si el alumno está evaluado en esa asignatura if (nota.equals("matriculado")) { // matricula al alumno en la asignatura a.matriculaenasignatura(nombreasig); else { // asignatura superada a.superaasignatura(nombreasig, Double.parseDouble(nota)); catch (NumberFormatException e) { throw new ErrorFormatoFichero(); // lee la siguiente asignatura del alumno o una línea // vacía o null línea = ent.readline(); // lee la línea siguiente (nombre de alumno o null) línea = ent.readline(); finally { if (ent!= null) ent.close(); Página 11/14

public void guardaenfichero(string nomfich) throws IOException{ PrintWriter sal = null; try { sal = new PrintWriter(new FileWriter(nomFich)); for(int i=0; i<lista.size(); i++) { Alumno a=lista.get(i); sal.println(a.nombre()); FichaAsignatura[] asignaturas = a.asignaturas(); for(fichaasignatura asig: asignaturas) { if (asig.alumnomatriculado() asig.superada()) { sal.print(asig.nombre()+":"); if (asig.superada()) sal.println(asig.nota()); else sal.println("matriculado"); sal.println(); finally { if (sal!=null) sal.close(); Página 12/14

4) (1.5 puntos) Escribir el código correspondiente a una cola genérica de longitud limitada: Solución: public class Cola <T> {... La clase tendrá los siguientes métodos: Constructor: recibe como parámetro el número máximo de elementos que pueden almacenarse en la cola. extraeprimero: extrae y retorna el elemento que se encuentra en la cabeza de la cola. Lanza ColaVacía en el caso de que la cola esté vacía. añadeúltimo: añade un elemento al final de la cola. Lanza ColaLlena en el caso de que se haya alcanzado el número máximo de elementos. Utilizar una LinkedList para almacenar los elementos encolados. Para eliminar el primer elemento de la cola se debe utilizar el método removefirst de la clase LinkedList. Este método lanza la excepción NoSuchElementException si la lista está vacía. Suponer que las excepciones ColaVacía y ColaLlena se encuentran definidas en clases a parte. Escribir método "main" que, utilizando la clase Cola, cree una cola de objetos de la clase Integer y realice la inserción y posterior extracción de dos objetos de dicha cola. public class Cola <T> { private LinkedList<T> cola = new LinkedList<T>(); private int longmx; public Cola(int longmax) { this.longmx=longmax; public T extraeprimero() throws ColaVacia { try { return cola.removefirst(); catch (NoSuchElementException e) { throw new ColaVacia(); public void añadeúltimo(t elemento) throws ColaLlena { if (cola.size()==longmx) throw new ColaLlena(); cola.addlast(elemento); Página 13/14

public static void main(string[] args) { Cola<Integer> cola = new Cola<Integer>(3); try { cola.añadeúltimo(1); cola.añadeúltimo(5); Integer i = cola.extraeprimero(); i=cola.extraeprimero(); catch (ColaVacia e){ System.out.println("Cola vacía"); catch (ColaLlena e){ System.out.println("Cola llena"); Página 14/14