EJERCICIOS CURSO JAVA 1. Crear las clases Triangulo y TrianguloGrafico para el ejemplo comentado sacado del Tutorial “Aprenda Java como si estuviera en primero”. Una vez codificadas, cambiar el programa principal (Ejemplo1.java) para imprimir 2 Objetos TrianguloGrafico. Nota: Usar el método drawLine(int px1,int py1, int px2,int py2) de java.awt.Graphics para pintar cada uno de los tres lados del triangulo.
Sin comentarios de ayuda. Al terminar incidir el las ventajas del polimorfismo, como hemos ampliado un sistema añadiendo clases que cumplen el contrato de la interfaz. 2. Codificar un programa que recibiendo un número por teclado devuelva si es primo o no. Nota: Un número entero es primo si sólo tiene como divisores a él mismo y a la unidad.
Antes de resolverlo hay que contar como funciona la clase java.util.Scanner que permite coger y tratar cadenas y numeros sin hacer tener que usar/contar un BufferedReader sobre InputReader del System.in. Además te ahorras el uso de los Wrappers (Integer, Float, etc) para transformar cadenas en datos primitivos y viceversa. Te he puesto un ejemplo que se llama EjemploTeclado. Respecto al programa de los primos, hazlo al principio dentro del main y cuando funcione lo sacas a una función. Incide que las funciones no deberían realizar operaciones de E/S para aumentar su reutilizabilidad. El algoritmo refinamientos: -
-
yo
lo
cuento
en
los
siguientes
buscar si hay divisores del numero (resto de la división igual a 0) desde el 2 al numero menos uno. Si no hay el numero es un primo, evidentemente hay que llevar una variable auxiliar para al terminar el bucle consultarla. También se puede romper el bucle pero a mi me gusta menos, los breaks hacen ilegibles los programas, charla filosofal de nuevo, hay que intentar salir estructuradamente, con lo cual se puede cambiar la condición del for para recoger la condición de encontrado. Luego podemos decir que sólo hay un numero par primo, el dos, con lo cual, podemos chequear el caso especial 1
EJERCICIOS CURSO JAVA
-
-
antes del bucle (if) y luego realizar el bucle desde el tres hasta el numero avanzado por los impares (3+2=5,5+2=7,…) Luego podemos pensar en que el numero su menor divisor es el numero dos, a partir de la mitad del numero las divisiones siempre dan a uno con algo, con lo cual hay podemos parar el bucle (n/2 +1). Por el mismo criterio podemos decir la descomposición en factores primos de un numero nos garantiza que el mayor factor de descomposición es su raíz cuadrada con lo cual si no hemos encontrado un divisor entre los primos hay podemos parar. Para ellos vamos solo comprobando que se puede ir hasta raíz(n) +1. los más unos son por el redondeo de la raíz y la división entre dos.
Yo cojo algún número primo grande y veo la diferencia de tiempo entre algoritmos para decidir si es primo. Lo cronometro usando System.currentmilis() que te dice el numero de milisegundos desde 1 de Enero de 1970. Esto es útil para mediciones poco precisas pues en Windows esto tarda unos 15 milisegundos pues hay que calcular mucho porque el sistema operativo no lleva las fechas así. O bien google o se sacan primos grandes de aquí: http://primes.utm.edu/lists/small/millions/ la idea bucles y función. objetos, normal.
de este ejercicio no es vacilar sino ver lo de condiciones. También incidir en la llamada a Y ver que es estático todo porque no hay estamos haciendo programación estructurada
3. Codificar un programa que presente e implemente el siguiente menú de opciones: i. Averiguar si un número si es primo o no. ii. Mostrar todos los primos menores a uno dado. iii. Salir. Nota: Crear una Clase reutilizable partiendo de la solución del ejercicio 2.
Creamos la clase, e inicialmente lo ponemos en el mismo paquete (el paquete por defecto) vemos que sin importar nada se ven y se comenta que las clases que están en el 2
EJERCICIOS CURSO JAVA
mismo paquete se ven sin “import”. Hacer el cuerpo de programa principal para ello recordar la diferencia entre while y do/while (con esto hemos repasado las estructuras de control iterativas) y ver como el todos los menús del mundo al menos eligen una opción del usuario, la de salir o sea que siempre do/while para iterar al menos una vez. Con el case para procesar las opciones se logra hacer los menús más flexibles y más legibles. Crear funciones de pantalla y de cada opción. Para copiar otros ejemplos. Como somos elegantes cuando estamos en una opción pedimos si quiere continuar el usuario antes de irnos al menú principal. Ahora sacamos la clase a un paquete para ver como otros clases de fuera pueden usarla (con “import”) y finalmente pasamos de paquete y creamos un jar y la usamos sin tener el código, solo la class y contamos los problemas de classpath. 4. Usando el armazón de clases del ejercicio 1 para construir una ventana gráfica, dibujar una función trigonométrica en el panel, muestreando 100 valores para ella y almacenándolos en un array. Nota: Usar el método drawPolyline(int[] pxs,int[] pys, int size) de java.awt.Graphics para pintar una polilínea que una dibuje todos los puntos muestreados.
Con este ejercicio a parte de incidir de nuevo en los paneles y frames y el grafics “robado” bueno pues se trata de recorrer dos arrays uno de puntos x y otros de puntos f(x) o sea y… la idea es que no lo “modules” al principio es saldrá una línea el píxel uno del panel pues el seno/coseno varían desde -1 a 1 para pintarla en la mitad hay que sumar algo al valor y luego modular la línea plana en amplitud multiplicamos el valor de la función por 100 para obtener valores entre -100 y 100 para la función. Para la fase damos valores en el intervalo 0 a 2pi que es la periodicidad de estas funciones. 5. Codificar una clase para la abstracción Persona que tenga los siguientes atributos: nombre (Cadena), edad (entero), altura (real), sexo (carácter), casado (booleano). Crear 3 funciones constructoras para la clase: el constructor por defecto, el constructor genérico y un constructor especializado para crear solteros. Dotar además a la clase de funciones de acceso a los atributos 3
EJERCICIOS CURSO JAVA (getters/setters). Por último, escribir un método imprimir que devuelva todos los datos de una persona concatenados en una cadena.
Con este ejercicio construimos nuestra primera clase no estática desde 0. A parte de contar que los setter y setter permiten reducir el acoplamiento del codigo generado a veces aprovecho a contar lo de los inicializadotes estaticos, no estaticos y los finalizadotes. También comento como funciona el garbage collector y hablo de los 7 colectores que trae la jvm y los otros tipos de referencias las weakreferences, las softreferences y las phantomreferences. El metodo este de mostrar datos esta a huevo para que fuera el toString pero eso lo dejo para más adelante aunque si tu quieres puedes contarlo. 6. Codificar un programa que presente e implemente el siguiente menú de opciones, usando la clase Persona del ejercicio anterior: i. Introducir los datos de una persona. ii. Mostrar los datos de una persona. iii. Salir. Nota: Se puede pasar directamente al ejercicio 7.
No lo hago pero tu a lo mejor deberías para ganar tiempo. 7. Codificar un programa que presente e implemente el siguiente menú de opciones, usando un arrray de 10 Objetos de la clase Persona del ejercicio 5: i. ii. iii. iv. v.
Introducir los datos para una de las personas de la lista. Mostrar los datos de las personas almacenadas. Borrar una persona de la lista. Cambiar el tamaño de la lista. Salir.
Nota: Usar System.arraycopy(Object src, int src_pos, Object dst, int dst_pos, int length)
Cosas que tiene este ejercicio: a) tratamiento estructurado de las excepciones, el scanner como clase nueva de java 5 usa la configuración regional (locale) y pide numero con coma para la altura, si metes uno con punto peta, también tienes que meter el bolean como true o false. Fijate en el do while. 4
EJERCICIOS CURSO JAVA
b)
c) d) e)
Paso de referencias, hasta ahora funciona bien cuando cambias los objetos de la lista pero si tratas de cambiar el propio array al redimensionar, va a fallar puesto que la referencia se copia al redimensionarla no recoge los cambios. Hay que devolver explícitamente la nueva lista y asignarla a la anterior fuera de la función. Esto pasa siempre, enséñales a identificar y resolver este problema, incluso yo a veces depuro para verlo. El uso del bucle for each nuevo de java for(elemento: iterable), permite ocultar la variable de recorrido del bucle. Haz la lista de tamaño 2 o te vas a hinchar a meter datos para redimensionar. Cuidado con los retornos de carro de los scanner que a veces quedan, yo por eso después de leer un numero vacío el buffer.
8. Codificar clases para las abstracciones Vehículo (con los siguientes atributos: String nombre y float velocidad), Coche (int ruedas), Barco (int velas), Avion (int alas), estas tres últimas son especializaciones de la clase Vehículo. Dotar de constructores y métodos de acceso a las clases. Por último escribir un método que devuelva todos los datos de una clase concatenados en una cadena. Crear una interfaz Controlable que permita a través de un método void controlar() hacer funciones especificas de cada una de las subclases (p.e: conducir, navegar, volar). Nota: Sobrescribir (Override) los métodos toString() y equals(Object o) de la clase java.lang.Object .
Haz la armadura inicial de las clases y refínalas después con los métodos de pedir datos y mostrar datos cuando haga el ejercicio siguiente así es más impactante el polimorfismo. 9. Codificar un programa que presente e implemente el siguiente menú de opciones, usando un único ArrrayList de objetos de la clases del ejercicio 8: i. ii. iii. iv. v.
Introducir los datos para un vehículo (c/b/a) de la lista. Mostrar los datos de los vehículos almacenados. Borrar un vehículo de la lista. Operar los vehículos (c/b/a) de la lista. Salir.
Nota: usar la clase java.util.ArrayList de Collections.
5
EJERCICIOS CURSO JAVA
Empieza pidiendo datos y haciendo el case con referencias de las subclases y luego las cambias a referencias a la superclase y sacar todo el código de los brazos del case para ver que lo único dependiente del código es el new para la ejemplarización de cada objeto concreto. Habla si quieres del patrón factoría. Subraya que mientras que en la herencia los métodos tienen que ser simétricos (llamarse como en el padre), en la interfaz podemos instrumentarla de manera mucho más flexible, de hecho se deberían programar interfaces y no clases para hacer los sistemas extensibles. Yo si les veo liados les pondría que hagan uno de animales pues es importante entender este ejercicio perfectamente. 10. Codificar un programa que implemente este GUI usando la clase Persona y un ArrayList.
Notas: Usar las clases del paquete java.awt y las classes Wrappers de java.lang.
Lo primero es recordar o hacer el ejemplo de los wrapper porque ahora para meter las cosas en los textfield va a ser necesario. Antes había que hacer new Integer para las conversiones hay las clases tienen métodos estáticos bidireccionales para ir de String al tipo básico y al revés. Fíjate que también aprovecho a poner en lanzador el main para separarlo de la ventana. Se puede poner en la propia clase y puedes jugar con ello. 6
EJERCICIOS CURSO JAVA
También aprovecho a ver lo de los windowlistener en la clase ventana, en una clase aparte y finalmente me hago la clase adaptador mío que implemente los métodos de la interfaz con cuerpo sin instrucciones y solo hago que el manejador redefina lo que quiere. Al final digo que ya hay adaptadores definidos para java. Aprovecha a hacer el borrado múltiple para contar la selección de la lista múltiple y acuérdate de que cuando borrar en un array varios elementos de golpe tienes que ir de atrás adelante para que no pete. Dales la brasa con el botón de guardar inteligente que inserta y actualiza. E incide en que nunca las clases de la vista sirven para guardar datos, ¡¡ no sacar las personas del list ¡! Mantén un array o un arraylist aparte y sincronizado con la list. MantenimientoPersonas es la clase principal del ejercicio. 11.Realizar el modelado de las clases de dominio para los siguientes requisitos. Definición de Requisitos Nuestra empresa JAVAPOWERSOLUTIONS requiere que se desarrolle un sistema de información para el control y gestión de la venta de sus Productos y Soluciones de Informática a sus clientes. Estos productos serán inicialmente Desarrollo de Software, Gestión de Proyectos Informáticos, Servicios Profesionales y Formación. Desde dicho aplicación se gestionará todo el proceso comercial de dichos servicios desde la creación de una nueva oferta, pasando por la gestión de las ventas y sus cobros. La aplicación ofrecerá esta funcionalidad a los comerciales de la empresa. Toda venta que realice a un comercial estará asociada a unos objetivos personales asignados de naturaleza mensual y anual en virtud de los cual se logran unas bonificaciones según un porcentaje de las ventas. La aplicación permitirá al gerente de cuentas controlar toda la información tanto para un comercial particular como para el total de ellos. Los comerciales interactúan con los clientes pero las capacidades administrativas y de gestión sobre la base de datos de estos será responsabilidad del gerente de cuentas. Desde la aplicación los comerciales tendrán las siguientes capacidades: • • • •
Gestión de ofertas propias. Gestión de ventas propias. Gestión de comisiones propias. Solicitud de Altas y bajas de clientes. 7
EJERCICIOS CURSO JAVA Desde la aplicación el Account Manager tendrá las siguientes capacidades, para su grupo comercial asignado: • • • • • • •
Control de ofertas para un comercial. Control de ventas un comercial. Control de comisiones un comercial. Control de ofertas totales de su grupo. Control de ventas totales de su grupo. Control de comisiones totales de su grupo. Gestión de clientes de su grupo.
Existe el director comercial que tiene control total sobre todos los procesos comerciales y además es el encargado de mantener el catálogo de productos de la empresa. Existirá un administrador del sistema que tendrá la capacidad de administrar usuarios y además que tiene también un control total de la aplicación, los comerciales y los gerentes y los clientes. Notas: Usar alguna herramienta de modelado UML para realizar el diagrama de clases. Puede ser el plugging de Omondo para Eclipse.
Bueno ahí va el modelo uml que yo diseño, te recuerdo el metodo: 1) buscar clases candidatas en los requerimientos. Suelen ser sustantivos o nombre, se descartar clases vagas (p.e. Sistema) o redundantes (gerente = account manager) y ojo con las instancias o ejemplares de clases. (en este caso formación, desarrollo, y consultoria son ejemplares de productos. Comente lo de la metodología CRC (clase, responsabilidad, colaboradores) es lo mismo preguntar a cada clase su misión y con quien la lleva a cabo, si la clase no responde a alguna de estas preguntas se la saca del modelo. 2) Establecer relaciones entre clases, hay dos tipos: i. Relaciones
ISA (is a, es un, se parece, se comporta, funciona como) son de herencia. A la herencia se llega por generalización (viendo clases que tenemos y sacamos una clase factor común “abstracta” o se llega por especialización refinando un comportamiento de una superclase o ocultándolo completamente. A la herencia se le llama generalización en uml.
8
EJERCICIOS CURSO JAVA ii. Relaciones APO (a part of, forma parte de, esta
compuesto, tiene, se compone). Es la composición de clases. La composición indica que una objeto tiene referencias a otro/s objetos o/y viceversa. El cliente tiene unos pedidos asignados (array o lista) y un pedido tiene o puede tener una referencia al cliente al que pertenece. La línea simple muestra esta relación con un diamante en la parte que representa el todo para enfatizar si se quiere la relación. Diamante negro vidas solidarias de los objetos, diamante blanco vidas independientes. Cuando ya tenemos las relaciones solemos pintar la cardinalidad y si acaso la navegabilidad de las relaciones. iii. Cuando no tienes mucha experiencia se llega a las interfaces por la imposibilidad de tener herencia múltiple en java. Forzar la creación de dos tipos de clientes (particulares y empresas) un cliente no puede heredar de persona y de empresa con lo cual hay que declarar una interfaz clientela con los métodos comunes que puede operar el comercial sobre los “clientes”: ofertar, vender, etc. 3) Luego se suelen poner los atributos relevantes de las clases para ello buscamos adjetivos o propiedades de los requerimientos para completar el modelo. 4) Finalmente se completa con los mensajes (resto de verbos) que van a componer el protocolo de cada clase. Aquí se suelen usar los diagramas de secuencia y colaboración pero yo en este curso no los hago. Cuando doy uml si. Yo uso las enumeraciones nueva de java 5 para mantener el estado de la venta. Pero tú lo puedes hacer como quieras.
9
EJERCICIOS CURSO JAVA
Al final el diagrama queda así.
12.Codificar un programa que implemente este GUI usando las clases de dominio del ejercicio anterior.
•
Los comerciales se podrán añadir, editar y borrar utilizando un menú contextual que aparecerá al pulsar con el botón derecho del ratón sobre el comercial pertinente. 10
EJERCICIOS CURSO JAVA •
Al realizar doble clic sobre un comercial se cargarán los particulares y empresas a él asignados. Estas listas se podrán mantener dinámicamente (ABM) usando las botoneras de cada “pestaña” en concreto.
•
Al realizar doble clic sobre un cliente asignado a un comercial se cargarán sus ofertas, y ventas asociadas. Estas listas podrán mantenerse desde una botonera común a las tres “pestañas”.
•
Al hacer doble clic sobre una venta aparecerá un dialogo de edición de los ítems que componen la venta.
•
Implementar la aplicación o alguno de sus paneles con persistencia en Ficheros.
•
Implementar la aplicación o alguno de sus paneles con persistencia en BBDD (antes realizar el ejercicio 13).
Notas: Usar especializaciones de javax.swing.table.AbstractTableModel para las diversas JTables y javax.swing.tree.DefaultMutableTreeNode para controlar el JTree de comerciales. Usar javax.swing.JFileChooser para los diálogos de abrir y guardar sobre ficheros. Y diálogos modales para cualquier ventana distinta de la principal. Usar Resultsets bidireccionales y actualizables para la parte de BBDD.
El programa tiene tela, Usa el lanzador2 y la ventana2 que no tiene cosas de JDBC. No lo vamos a hacer completamente funcional, más bien vamos a ir trabajando por regiones: Lo primero es montar con el visual editor el armazón de menús, pestañas, splitpannels, botoneras, árbol y tablas vacías, después de haber dado un repaso a todos los componentes de swing de la paleta del editor. Este primer ejercicio gusta mucho y sirve para practicar con los layouts. Después vamos con la pestaña de particulares, yo la suelo hacer en la pantalla y luego los chicos hacen la pestaña de empresas. Así cuento los tablemodels aunque antes inicializo la tabla con los otros constructores el de JTable(Object [][] datos, Object [] titulos) y el de JTable (Vector datos, Vector titulos) ojo que el vector primero es un vector de vectores. Yo los TM siempre los hago heredando de abstractablemodel) empiezo definiendo los tres métodos abstractos y luego voy ampliando hasta completar los siete que hay que hacer.
11
EJERCICIOS CURSO JAVA
Fíjate en los eventos del gui sólo invocan mensajes al tablemodel. (si no tienes table model como atributo del frame tendrás que sacarlo de la tabla todo el rato, fíjate que es instructivo y yo se lo hago) El table model dependiendo de que este en edición o no muestra no sólo el arraylist de personas que le llega, (inicialmente lo lleno en el main y se lo mando con 2 o 3 datos de personas para no empezar preocupándome de los null ni de insertar, sólo de actualizar que es más fácil y luego ya lo mando vacío o nulo incluso) Una vez que tengo esta parte funcionando me dedico al jtree, lo creo con un array de objects pero eso es inflexible o sea que uso los defaultmutabletreenodes que pueden ser hojas o nodos padres según se les añadan más nodos dinámicamente. Fíjate que cada mutabletreenode puede “arropar” un objeto comercial al que hay que coger con getUserObject(). Fíjate que el nodo principal raíz es una cadena, esto me obliga a tener cuidado cuando luego pinche con el ratón para sacar el menú de edición. Pero bueno el código creo que es fácil, sino te lo cuento desayunando. El siguiente paso es después de contar ficheros, serializar el nodo raíz y voila!! Se guarda todo de golpe. (hacer ejemplo cuando cuentes serializacion de campos transient que no se guardan). Momento en el ponemos el JFileChooser en el menú abrir y guardar. Ese es el objetivo de la semana. 13.Codificar un programa que implemente este GUI usando el API de JDBC y una tabla diseñada en la base de datos con los campos que se muestran.
12
EJERCICIOS CURSO JAVA
Notas: Habilitar y deshabilitar botones para apoyar la lógica de la aplicación. Precargar el driver JDBC del fabricante en el método main.
EJERCIO EXTRA. Codificar un programa que implemente este GUI a partir de una clase Círculo que herede de java.awt.Component.
Notas: Sobrescribir en la clase circulo al menos los métodos paint(Graphics g) y getPreferredSize(). Para que el panel (Container) repinte sus contenidos (Components) hay que invocar el método validate() del panel.
13