T.A.P.
Técnicas Actuales de Programación
Curso: 2017/18
|
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
N no lectivo, N fiesta, N estudio, N exámenes, N N clase, N clase anulada |
Clases: {aula: 0.20S} {horario: jueves 10:40-11:30, viernes 9:40-11:30
( *8:40-10:00 y 10:20-11:30; ** 8:40-9:30 y 10:40-11:30) }
Laboratorios: {aula: 0.22} {horario: 15:00-17:30}
Tutorias: {con las excepciones que se indiquen en GAUR, generalmente, J 8:00-10:00, V 8:00-9:00, JV 12:00-13:30}
Fecha de examen con ordenador (fecha oficial de facultad):
Fecha límite de entrega de proyectos: 5/2/2018 08:00 (9 días después del último examen de 1er cuatrimestre).
El programa de la asignatura se corresponde casi en su totalidad con un curso de Java, puesto que es posiblemente el lenguaje que mejor soporta las técnicas actuales de programación. A lo largo del desarrollo del curso se irán destacando las técnicas que Java incluye o facilita.
Según las previsiones de desarrollo de Oracle, a la fecha de comienzo del curso, debería ser ya oficial la versión 9 estable de Java, pero recientemente comunicaron un retraso y por tanto se utilizará la versión 8.
La versión 9 introducirá una característica importante en cuanto a la estructuración de los desarrollos de software, como es la posibilidad (obligación) de organizar todo en módulos. Podemos aprender de ello en un vídeo, si bien hay que conocer previamente cuando menos los elementos básicos del desarrollo en Java. El vídeo (en inglés, duración: 1 hora): [en Youtube] [copia local]. Trataremos el tema cuando lleguemos al punto 4.4 del temario.
La versión 8 introdujo, entre otras características, la "programación funcional". No se estudirá esto en el curso (sí se comentará en qué consiste y se pondrá en contexto) porque en la práctica supone introducir una visión muy distinta de la programación más extendida (la "imperativa") y no se dipone de tiempo (que además no sería poco... puede ser un curso aparte).
Documentación de utilidad:
* La referencia definitiva del lenguaje Java {suficiente: versión 7}
{actual: versión 9}
* La documentación de la plataforma SE{suficiente: versión 7}
{actual: versión 9}
* Los "tutoriales" de Java
Acceso al estado de evaluación personalizado
Nota: antes de entregar cualquier ejercicio hay que, por lo menos, "adecentar" el código. Lo correcto sería incluso escribir la documentación, pero por lo menos hay que dejarlo "listo para revista": eliminar ficheros abandonados, lineas de código de prueba, etc...
SEPTIEMBRE
TEMA 1 - INTRODUCCIÓN
TEMA 2 - USO DEL ENTORNO DE DESARROLLO
Adelanto de los puntos 1 y 2 del
TEMA 6 - INTERFACES GRÁFICOS
OCTUBRE
Volvemos al
TEMA 2 - USO DEL ENTORNO DE DESARROLLO
TEMA 3 - ELEMENTOS BÁSICOS DEL LENGUAJE
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.
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
Listado de Números Perfectos [pdf]
TEMA 4 - ELEMENTOS RELACIONADOS CON LA ORIENTACIÓN A OBJETOS
Adelanto del punto 3 del
TEMA 6 - INTERFACES GRÁFICOS
Volvemos al
TEMA 4 - ELEMENTOS RELACIONADOS CON LA ORIENTACIÓN A OBJETOS
NOVIEMBRE
Calculadora [pdf]
TEMA 5 - MECANISMO DE TRATAMIENTO DE EXCEPCIONES Y ERRORES
Desarrollo de una clase: Matrix [pdf]
Nada qe añadir :-)
Finalizamos con el punto 3 el
TEMA 6 - INTERFACES GRÁFICOS
Usamos esta práctica para ver lo referente a gráficos en GUIs
Dibujando en componentes Swing (JPanel) [pdf]
Fabricar otra subclase de JPanel con un método que pueda recibir un array dobles y representarlos como histograma.
Cuidar un poco la presentación para que no resulte "desagradable".
Como idea "extra": el mismo panel podría incluir un slider (llevarlo ya integrado) de modo que al desplazarlo permitiría variar el ancho y la separación de las baras del histograma.
Más ideas "extras": pueden hacerse paneles similares para "diagramas de tarta", otros tipos de gráficas; también para otros "gadgets"... velocímetros, relojes,...
TEMA 7 - EL CONTENIDO DE LA BIBLIOTECA DE CLASES
La práctica siguiente nos obliga a adelantar el
TEMA 8 - Entrada y salida de datos
Aunque sea en el laboratorio, necesitamos ver todo lo siguiente...lo haremos muy rápidamente
Aunque sea en el laboratorio, necesitamos ver todo lo siguiente...lo haremos muy rápidamente
TEMA 7 - EL CONTENIDO DE LA BIBLIOTECA DE CLASES
Y ahora la práctica:
I/O: Babel [pdf]
...es decir el programa deberá acceder a la URL "http://gtts.ehu.es/German/Docencia/1718/TAP/labo/udhr.zip" directamente y, teniendo en cuenta que no recibimos texto sino un "zip", trabajar con su contenido (estudiar el paquete java.util.zip)
ADVERTENCIA: la solución no es dificil, pero puede ser muy "retorcida" si no se plantea bien (este ejercicio va a tener más peso que otros :-).
TEMA 9 - Hilos
DICIEMBRE
TEMA 10 - Cliente/servidor
Hemos resuelto la práctica de ayer, y la hemos utilizado para ver un poco el "profiler". Este es el proyecto (con algún retoque mínimo como poner correctamente el hilo del panel como un daemon, o compactar el paint con uso del operador ?: (comentario sobre "Elvis"→groovy -eliminando ceremonia-... ver más abajo argumentos variables en Java con Formatter"))
Pasamos demasiado rápidos sobre el
TEMA 7 - EL CONTENIDO DE LA BIBLIOTECA DE CLASES
java.util
pasamos muy rápido... hay cosas interesantes por ver como
Arrays
(Ojo a System.ArrayCopy(.)),
Date, Calendar, Locale (usado en el scraper), interfaz Comparator (aparece en la prácica Babel), Timer y TimerTask (usados en la última práctica),
Formatter
...
create database actaspv; use actaspv; CREATE TABLE estadisticas ( `id` VARCHAR(8) NOT NULL, `numPalabras` INT NOT NULL, `validas` INT NOT NULL, `media` DOUBLE NOT NULL, `desviacionTipica` DOUBLE NOT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `id_UNIQUE` (`id` ASC));
En ocasiones alguna pregunta nada habitual puede ser de interés general....
He diseñado mi propio tipo de letra. ¿Cómo puedo incluirlo en mi aplicación?
El mundo del diseño de "Fonts" (cosa de las Bellas Artes) y su uso en computadoras no es trivial. Todo lo necesario para el uso con Java se encuentra en el correspondiente tutorial de Oracle. Como respuesta concreta a cómo contar con un tipo de letra propio, se puede entresacar del mismo este sencillo código:
try { GraphicsEnvironment. getLocalGraphicsEnvironment(). registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")); } catch (IOException|FontFormatException e) { /*Handle exception*/ }
donde se añade al entorno gráfico una nueva "font" que, en concreto, es de tipo "trueType" y se lee de un fichero (puede ser de otro tipo y en general leerse de cualquier "Stream" -véase documentación de Font.createFont-)
Quiero hacer un GUI de calculadora que pueda cambiar entre estándar y científica. ¿Cómo lo hago?
La manera más razonable puede ser agrupar en un par de paneles los botones que deben aparecer y desaparecer en cada caso para proceder a quitar y poner dichos paneles cuando se seleccione un modo u otro.
La siguiente imagen muestra una estructura sencilla de ejemplo: el "frame" lleva un "menuBar" donde se encuentran las dos opciones de paso de un modo a otro. Además hay un panel ("contenedorComun") para los botones que no varian entre ambos modos (componentes no visibles en la imagen) y un contenedor para intercambiar botoneras ("contenedorParaIntercambios"). Inicialmente este contenedor lleva dentro el panel de la calculadora estandar, pero se podrá intercambiar con el contenedor de la botonera cientifica que está "aparcado" en la sección "Other Components".
El modo de hacer el intercambio es extremadamente sencillo: basta con asociar a cada opción de menú su acción correspondiente como se ve en la siguiente imagen. No es otra cosa que sacar todo lo que haya en el panel (la botonera actual) y meter la botonera seleccionada. Una vez hecho esto terminamos con un "pack()" que le dice al "layoutManager" que haga su labor (que "empaquete" convenientemente el contenido)
(nota.- en sentido estricto el panel "contenedorParaIntercambios" es innecesario, pero se ha puesto por clarificar el ejemplo.)
Estoy dibujando histogramas en un JPanel... ¿Cómo puedo centrar el texto de una etiqueta?
Para esto hay que manejar la "métrica" de la fuente de texto que se usa en cada momento. La métrica de una fuente tiene que ver con una serie de conceptos medibles.
En el método paint(Graphics g)
se puede acceder a la fuente a través g.getFont()
/ g.setFont()
, y la métrica se obtiene mediante g.getFontMetrix()
.
Es sencillo conocer la anchura de una String con la metrica activa en un momento dado: simplemente basta con usar g.getFontMetrics.stringWidth("Texto a dibujar")
, que nos da el número de pixels que ocupará.
El siguiente ejemplo muestra una String
centrada en un punto (200,100) -con la coordenada Y en su línea base- y unas líneas cruzadas en dicho punto para comprobar que "funciona" correctamente.