Sie sind auf Seite 1von 13

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 yo lo cuento en los siguientes


refinamientos:

- 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 de este ejercicio no es vacilar sino ver lo de


bucles y condiciones. También incidir en la llamada a
función. Y ver que es estático todo porque no hay
objetos, estamos haciendo programación estructurada
normal.

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. Introducir los datos para una de las personas de la lista.


ii. Mostrar los datos de las personas almacenadas.
iii. Borrar una persona de la lista.
iv. Cambiar el tamaño de la lista.
v. 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) 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.
c) El uso del bucle for each nuevo de java for(elemento:
iterable), permite ocultar la variable de recorrido
del bucle.
d) Haz la lista de tamaño 2 o te vas a hinchar a meter
datos para redimensionar.
e) 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. Introducir los datos para un vehículo (c/b/a) de la lista.


ii. Mostrar los datos de los vehículos almacenados.
iii. Borrar un vehículo de la lista.
iv. Operar los vehículos (c/b/a) de la lista.
v. 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

Das könnte Ihnen auch gefallen