BBDD&POO

Bases de datos y programación orientada a objetos.

Curso: 2016/17. Parte POO
Máster en Modelización Matemática, Estadística y Computación

Calendario

OctubreNoviembreDiciembre
LMMJV
[4]34567
[5]1011
15-17(0.8)
121314
17-19(0.8)
[6]1718192021
[7]24
12-14(0.9)
25262728
[8]31    
LMMJV
[8]  1234
[9]7891011
[10]1415161718
[11]21
12-14(0.9)
22232425
[12]282930  
LMMJV
[12]    12
[13]56789
[14]121314
12-14(0.2)
15
17-19(0.8)
16
[15]19
17-19(0.8)
2021
12-14(0.2)
2223
2627282930
 N  no lectivo,  N  fiesta,  N  estudio,  N  exámenes,

Programa

Temario

Evaluación

Ejercicio propuesto
(zip con enunciado, datos y ayuda)
Para cualquier consulta respecto a esto o todo lo demás: e-mail
Ejercicio extra

La propuesta de ejercicio extra consiste simplemente en montar la base de datos para bibliografía con MySQL y procesar los datos y cargarlos directamente en ella desde Java (en vez de generar ficheros como se ha propuesto en el ejercicio original). No es obligatorio realizarlo, pero podrá ayudar a la nota final (que en todo caso se combinará con la parte de bases de datos).

Desarrollo

OCTUBRE

Martes 11 de octubre de 2016
Viernes 14 de octubre de 2016
  • Continuamos con Elementos básicos del lenguaje (sin orientación a objetos)
  • Obtención del número Pi mediante aproximación por serie.

    Se trata de calcular el número π con precisión de cuatro decimales mediante la serie:

    La especificación de cuatro decimales hace referencia al criterio de parada en la suma de términos de la serie, no a la presentación de la solución, que se hará normalmente mediante System.out.println(.) y que nos mostrará un número de decimales que no podemos controlar por ahora.

    Una solución:
    public class Pi {
    
        //Esto de la precisión es algo aproximado por no ser trivial.
        private static final double PRECISION=1E-5;
    
        public static void main(String args[]){
            double pi=pi();
            System.out.println(pi+ "\t"+Math.PI+"\tdiferencia: "+(Math.PI-pi));
        }
    
        static double pi(){
            double piCuartos=0.0, denominador=-1, incr=1.0;
            while (Math.abs(incr)>PRECISION/4)
                piCuartos += 1 / (denominador+=2) - (incr = 1/ (denominador+=2));
            return 4*piCuartos;
        }
    
    }
    
  • Obtención de números Perfectos

    Escriba una RUTINA que determine si un número dado es perfecto o no.

    static boolean isPerfect(long n) {
            boolean esPerfecto=false;
            //TODO hacer lo necesario para que "isPerfect" refleje si n es perfecto o no.
            return esPerfecto;
        }

    Un número perfecto es un entero positivo igual a la suma de sus divisores propios. Los divisores propios de un entero positivo son todos sus divisores a excepción de sí mismo. (Ejemplo de número perfecto: el 6, porque sus divisores propios son 1, 2 y 3 y 6=1+2+3.)

    Utilizando dicha rutina debera obtener una lista de números perfectos entre el 1 y el 100.000

    Resultado de la ejecución:
    1 = 1
    6 = 1+2+3
    28 = 1+2+4+7+14
    496 = 1+2+4+8+16+31+62+124+248
    8128 = 1+2+4+8+16+32+64+127+254+508+1016+2032+4064

    Listado de Números Perfectos [pdf]

Lunes 24 de octubre de 2016

NOVIEMBRE

Martes 21 de noviembre de 2016
  • seguimos con Orientación a objetos
    Con posterioridad a la clase he añadido un ejemplo concreto de clase anónima en el material proyectado
  • Ejercicios:
    A falta de ver lo referente a control de errores, es prácticamente imposible desarrollar una solución a un problema con objetos con Java. Incluso sería necesario contar con los paquetes básicos de la bibliboteca para que el problema planteado tuviese algo de sentido. Así que lo que vamos a plantear son dos ejercicios un tanto atípicos:

    Algo poco menos que meramente sintáctico para practicar con dos elementos importantes, arrays y Strings, ya que son clases/objetos de uso intensivo y que como tal tienen apoyo sintactico del compilador.

    Escribir una clase en la que se defina un array de Strings constantes (p.ej. una frase de un texto por cada elemento del array) y programar funciones como por ejemplo:

    • devolver el índice de la primera linea que contenga determinada palabra
      int indexOf(String palabra)
    • devolver el índice de la primera linea a partir de la n-esima que contenga determinada palabra
      int indexOf(String palabra, int n)
    • Devolver un array de enteros con los indices de todas las lineas que contienen determinada palabra
      int[] indexOf(String palabra)
    • Devolver una String concatenación de todas las del array.
    • ...

    Con un método main(.) probar las funciones.

    Una solución: TBD
    Un ejercicio para reflexionar sobre cómo estructurar en clases una posible solución a un planteamiento muy generales.

    Supongamos que tenemos que hacer una aplicación para gestionar la venta de entradas de unos multicines. Es decir, tendremos un cierto numero de salas de proyección, cada sala contará con un determinado número de filas de butacas y cada fila con un número de butacas (pensemos que es el mismo para todas las filas). Además cada sala se utilizará para varias sesiones cada día a lo largo de todos los días del año.

    Lo que tendremos que plantearnos es por tanto qué clases necesitamos y cual será su estructura, tanto en campos como métodos.

    Un enfoque típico parte del análisis de los "casos de uso" que, planteado en una línea, consiste en analizar las diferentes acciones (usos) que debe soportar la aplicación en relación con los diferentes usuarios de la misma. (más info: soporte dado por UML)

    En nuestro caso podemos pensar que la aplicación sera manejada únicamente por un empleado de la taquilla y un gestor de las salas. Debemos plantear los usos que le darán, y de ahí pasar a una estructuración de clases que los soporten del mejor modo posible.

    Por ejemplo...

    • gestor: Dar de alta una nueva sala -> asignarle un identificador no coincidente con otros, definir el número de filas y butacas por fila. ¿Inicializarla con un estado de sesiones programadas nulo, o la gestion de sesiones se hará independientemente de cada sala?... queda para plantearlo según se avance...
    • gestor: dar de alta una nueva sesión -> ...
    • empleado: vender una butaca -> ...
    • empleado: vender N butacas -> ...
    • empleado: anular una venta -> ¿Debe ser una venta un objeto? ...
    • ...

    En general una buena solución es la que generará una serie de clases, en uno o más paquetes, que puedan verse como una biblioteca más o menos específica para soportar el desarrollo de la aplicación, de modo que esta sea una combinación razonablemente sencilla de elementos de dichos paquetes.

    Una solución: TBD

DICIEMBRE

Miércoles 14 de diciembre de 2016
Jueves 15 de diciembre de 2016
Lunes 19 de diciembre de 2016
  • "Rematamos flecos" que quedaron del tema anterior a la vez que practicamos:
    Un ejercicio para hacer todos a la vez...

    En "http://gtts.ehu.es/German/Docencia/MUMMEC/ejercicios/20161215.txt" hay un fichero de datos "real" (es un alineamiento del texto del acta del Parlamento Vasco del 15 de diciembre de 2016 covertido a su representación fonética con la secuencia obtenida del audio mediante un decodificador automático)

    Haremos un programa que lo lee y procesa de algún modo (no importa mucho, es cuestión de practicar). Por ejemplo calcularemos la media y la desviación típica de las duraciones de los fonemas (si una linea tiene tres números reales, los dos primeros son los correspondientes a los tiempos de inicio y de fin del fonema)

    Una solución

    Otros planteamientos con los que podríamos practicar:

    • Uno rápido: contar palabras
    • Con objetos: listar objetos "Fonema" con
      {
      fonemaCorrecto::char,
      fonemaReconocido::char,
      fonemaInicial::boolean,
      tiempoInicial::double,
      tiempoFinal::double,
      confianza::double
      }
    • Con objetos: listar objetos "Palabra" que se corresponderían con una secuencia de objetos Fonema (sin el campo fonemaInicial)
Miercoles 21 de diciembre de 2016

Extras

Otros temas interesantes que no pueden abordarse en el curso por su extensión. (Enlaces a los tutoriales de Oracle)

Not So Frequently Asked Questions

En ocasiones no tengo respuesta inmediata a alguna pregunta por no ser frecuente o sencilla. En estos casos, si puede ser de interés general, queda reflejada aquí.