URJC Ingeniería Técnica de Gestión Abril 2011 Asignatura: SOFTWARE AVANZADO Normas: La prueba consta de 2 ejercicios. La máxima nota del examen es un 8. Siendo la práctica la que añade los 2 puntos que completan la puntuación a 10 de la asignatura. Se valorará la claridad de la exposición. Tiempo de la prueba: 2 horas y 30 minutos Ejercicio 1 (3 puntos).- Se desea desarrollar una aplicación para jugar al bingo en Java. Para ello se decide construir dos clases: la clase CartonDeBingo y la clase BomboConBolas. La clase CartonDeBingo permite crear y gestionar un cartón de bingo durante una partida. Así, el constructor de esta clase creará un cartón con 12 números al azar entre 1 y 50. Además, la clase tendrá dos métodos: tachar(int) y haganado(). El método tachar() elimina del cartón el número que se le pasa si lo contiene, y si no lo contiene no hace nada. El método haganado() devuelve true cuando todos los números del cartón han sido tachados y false en caso contrario. Se recomienda usar un Set de enteros para los números que forman el cartón. La clase BomboConBolas permite crear y gestionar el bombo con las bolas que se van sacando durante el desarrollo de una partida. La clase tendrá 2 métodos: quedanbolas() y obtenerbola(). Tras la creación, el método quedanbolas() debe devolver 50. Por otro lado, el método obtenerbola() devuelve el número de una bola al azar extraída del bombo. Por cada bola que se extraiga, el método quedanbolas() devolverá un valor menor en una unidad. Se recomienda usar un Set de enteros para los números contenidos en el bombo. Se recuerda que los principales métodos de la clase Set son: add(object), remove(object), int size() y boolean contains(object). Se recuerda que Java dispone del método estático double rand() dentro de la clase Math que permite obtener un valor de tipo double al azar entre 0 y 1. Se pide: Escribir el código correspondiente a las clases CartonDeBingo y BomboConBolas, incluyendo la implementación de todos sus métodos, respectando fielmente la especificación realizada y el diagrama. class CartonDeBingo { private Set <Integer> cjtonumeros = new HashSet <Integer>(); public CartonDeBingo() { while (cjtonumeros.size() < 12) { int azar = (int)(math.rand()*50.0) + 1; cjtonumeros.add(azar); (3 puntos)
public boolean haganado() { return (cjtonumeros.size() == 0); public void tachar(int numero) { cjtonumeros.remove(numero); class BomboConBolas { private List <Integer> listabolas = new ArrayList <Integer>(); public BomboConBolas() { for (int cont = 1; cont <= 50; cont++) { listabolas.add(cont); public boolean quedanbolas() { return (listabolas.size() > 0); public int obtenerbola() { int azar = (int)(math.rand()*listabolas.size()) + 1; int cont = 1; for (Integer i: listabolas) { if (cont == azar) { return i; cont++; Ejercicio 2 (5 puntos).- Utilizando el paradigma de orientación a objetos se desea diseñar el software de control de un sistema de control de discos en una tienda de venta de productos culturales. El sistema incorpora una pistola lectora de códigos de barras que se utilizará para leer un código de barras que llevarán todos los discos y los carnet de socio de los clientes que lo tengan. El software deberá permitir realizar las operaciones necesarias para vender los discos. Además, a los clientes con tarjeta de socio se le acumularan las ventas realizadas para ofrecerles vales de descuento para sus próximas compras.
Se dispone de una biblioteca suministrada por el fabricante de hardware para controlar la pistola. La instanciación de un objeto de una de estas clases permite controlar la pistola. También existe una base de datos con los precios de los discos. A esta base de datos se accede utilizando una clase ya implementada por otros desarrolladores llamada Catalogo. La clase Pistola Es una clase abstracta de la que se puede derivar para, siguiendo un enfoque MVC, conseguir ejecutar el código que se desee cuando la pistola lea un código de barras. Para ello, se debe derivar de ella e implementar los siguientes métodos: int CódigoBarrasLeido() Este método será llamado automáticamente por el hardware cuando la pistola lea un código de barras de un disco. Las instrucciones que se pongan en este método se ejecutarán cada vez que la pistola lea un código de barras. int CódigoBarrasNoLeido() Este método es llamado automáticamente por el hardware cuando la pistola no puede leer el código de barras de un disco. Las instrucciones que se pongan en este método se ejecutarán cada vez que la pistola sea incapaz de leer un código de barras. La clase Catálogo Es una clase que tiene un único método público: double obtenerprecio(string codigo) Este método devuelve el precio de artículo cuyo código se le pasa por parámetros. Esquema de funcionamiento. Normalmente la máquina estará prepara para la introducción de productos. Cuando llega un cliente, el vendedor usa la pistola para leer los códigos de barras de los discos que desea comprar. Cada vez que la pistola lee un código de barras el hardware lanza automáticamente una llamada al método CódigoBarrasLeido. Este método, que debe implementarse en una clase derivada, acumulará los precios de los discos que se lleva el socio. Cuando la pistola no es capaz de leer el código de producto lanza el método CodigoBarrasNoLeido. En ese caso el vendedor puede utilizar el teclado para escribir los códigos de barras. Para consultar los precios de los productos que se venden se utiliza un objeto de la clase Catalogo. Las ventas realizadas deben almacenarse en algún sistema con persistencia que posteriormente permita calcular las sumas de los importes comprados por los clientes que son socios. La tarjeta de socio también lleva un código de barras, con el número de socio, que se puede obtener utilizando la pistola o el teclado. La gestión de la caja no está informatizada. Se pide: A) Proponer las clases necesarias que, añadidas a las propuestas permitan construir el software de la tienda de discos. Justificar a grandes rasgos para qué sirve cada una de las clases propuestas (con menos de 40 palabras por cada clase). Dibujar el diagrama estático de clases presentando las clases propuestas (precisando su cardinalidad cuando corresponda) e incluyendo los métodos y propiedades que a priori se consideren interesantes (indicando su visibilidad). (2 puntos)
AplicacionVentaDiscos.- Clase que inicia la aplicación. GestorVentas.- Clase que dirige la operativa de una venta. PistolaDisco.- Clase que gestiona la lectura de la etiqueta del disco. PistolaSocio.- Clase que gestiona la lectura del carnet de socio. GestorSocios.- Clase que carga y graba la información de un socio de disco. Socio.- Clase que almacena la información de un socio. Venta.- Clase que acumula el importe acumulado de una venta. B) Dibujar un diagrama de secuencia en donde se refleje el escenario en el que un cliente que es socio compra dos discos. (1.5 puntos)
C) Dibujar un diagrama de actividad que refleje el proceso de compra de un disco, teniendo en cuenta el caso en que la pistola falla al leer el código del disco o de socio por lo que debe introducirse por teclado. (1.5 puntos)
Se puede completar este diagrama con este otro, el cual da mas detalle de la acción de Lectura de pistola o teclado.