137
Sesión 1 INTRODUCCIÓN AL ENTORNO DE DESARROLLO DE JAVA 1. INTRODUCCIÓN AL JDK El entorno de desarrollo básico para trabajar con JAVA consiste únicamente en un conjunto de compiladores, utilidades y documentos llamado JDK (Java Development Kit). Sun Microsystems proporciona los JDK para diversos sistemas operativos como Windows, Linux, Sun Solaris, etc y las directrices para que el resto de fabricantes puedan proporcionar sus propios JDK. El JDK es un conjunto de herramientas en modo carácter, no es un entorno visual. Sin embargo, tomando como base las herramientas del JDK, existen varios entornos de desarrollo específicos para ciertas plataformas, e incluso alguno desarrollado en Java y por tanto multiplataforma. Además, actualmente hay entornos de desarrollo integrados completos para Java, como Bea WebLogic, JBuilder, Eclipse, NetBeans, etc. El entorno básico del JDK de Java que proporciona Sun está formado por herramientas en modo texto, que son: java, intérprete que ejecuta programas en byte-code. javac, compilador de Java que convierte el código fuente en byte- code. javap, es un descompilador de byte-code a código fuente Java. javadoc, es un generador automático de documentos HTML a partir del código fuente Java. appletviewer, es un visualizador de applets. El entorno habitual pues, consiste en un navegador que pueda ejecutar applets, un compilador que convierta el código fuente Java a byte-code y el intérprete Java para ejecutar los programas. Estos son los componentes básicos para desarrollar programas en Java. No obstante se necesita un editor para escribir el código fuente, y no son 1

apuntesjava

Embed Size (px)

Citation preview

Page 1: apuntesjava

Sesión 1INTRODUCCIÓN AL ENTORNO DE

DESARROLLO DE JAVA

1. INTRODUCCIÓN AL JDKEl entorno de desarrollo básico para trabajar con JAVA consiste únicamente en un conjunto de compiladores, utilidades y documentos llamado JDK (Java Development Kit). Sun Microsystems proporciona los JDK para diversos sistemas operativos como Windows, Linux, Sun Solaris, etc y las directrices para que el resto de fabricantes puedan proporcionar sus propios JDK.

El JDK es un conjunto de herramientas en modo carácter, no es un entorno visual. Sin embargo, tomando como base las herramientas del JDK, existen varios entornos de desarrollo específicos para ciertas plataformas, e incluso alguno desarrollado en Java y por tanto multiplataforma.

Además, actualmente hay entornos de desarrollo integrados completos para Java, como Bea WebLogic, JBuilder, Eclipse, NetBeans, etc.

El entorno básico del JDK de Java que proporciona Sun está formado por herramientas en modo texto, que son: java, intérprete que ejecuta programas en byte-code. javac, compilador de Java que convierte el código fuente en byte-code. javap, es un descompilador de byte-code a código fuente Java. javadoc, es un generador automático de documentos HTML a partir del código fuente Java. appletviewer, es un visualizador de applets.

El entorno habitual pues, consiste en un navegador que pueda ejecutar applets, un compilador que convierta el código fuente Java a byte-code y el intérprete Java para ejecutar los programas. Estos son los componentes básicos para desarrollar programas en Java. No obstante se necesita un editor para escribir el código fuente, y no son estrictamente necesarias otras herramientas como el debugger, un entorno visual, la documentación o un visualizador de jerarquías de clases.

2. INSTALACIÓN DEL JDK y NETBEANS La versión oficial del jdk que está actualmente en uso es la 1.6 (llamada Java SE 6.0). Estas versiones del jdk se engloban en lo que se conoce como Java Standard Edition, que partieron de la versión 1.2. Actualmente se incluye un entorno de desarrollo llamado NetBeans que utilizaremos para codificar los programas.

Para instalar el jdk y el entorno NetBeans hay que realizar los siguientes pasos:

1. Descargar desde la Web oficial de Sun http://java.sun.com/ los archivos del jdk + NetBeans y la documentación.

1

Page 2: apuntesjava

2. Ejecutar el fichero jdk-6u2-nb-5_5_1-win-ml.exe. Este fichero creará el directorio “C:\Archivos de programa\Java\jdk1.6.0_02”, a no ser que le indiquemos que se instale en otro sitio. También instalará el entorno NetBeans en el directorio “C:\Archivos de programa\netbeans-5.5.1”.

3. Descomprimir el fichero jdk-6-doc.zip en la carpeta donde tengamos el jdk instalado. Creará una carpeta llamada docs.

4. Añadir al path del sistema lo siguiente: C:\Archivos de programa\Java\jdk1.6.0_02\bin

Nota: Si actualizamos el jdk a una versión superior, desinstalando la versión previa, hay que modificar el archivo “netbeans.conf” del NetBeans para indicarle la nueva ruta.

Para realizar el paso 4 en sistemas operativos Windows XP, ir al Panel de Control y a Sistema, accedemos a las variables de entorno:

2

Page 3: apuntesjava

SESIÓN 2PROGRAMACIÓN BÁSICA EN JAVA

3. HolaMundoApp

La primera aplicación que vamos a realizar en Java es un pequeño programa que imprime un mensaje por pantalla. Con este ejemplo aprenderemos a editar, compilar y ejecutar un programa en Java.

Presentaremos dos formas de realizarlo, una básica en la que se supone que solo tenemos instalado el jdk y otra con el NetBeans.

3.1 Solo JDK

1. Con un editor de texto cualquiera editamos el siguiente código: ////// HolaMundoApp// Aplicación HolaMundo de ejemplo//class HolaMundoApp {

public static void main( String args[] ) {

System.out.println( "Hola Mundo" ); }}

2. Guardamos el fichero con el nombre HolaMundoApp.java (en Java el nombre del fichero siempre debe ser el mismo que el de la clase).

3. Para compilar el programa nos situaremos en el directorio en el que se encuentre el fichero fuente y pondremos lo siguiente:

javac HolaMundoApp.java

Si no tenemos ningún tipo de error sintáctico se habrá creado el fichero HolaMundoApp.class (bytecode). Si tenemos algún error nos lo indicará y tendremos que volver a editar el fuente para corregirlo.

Nota: Se supone que el directorio bin del jdk (donde se encuentra javac) se encuentra en el path del sistema.

4. Por último para ejecutar el programa pondremos lo siguiente:

java HolaMundoApp

3

Page 4: apuntesjava

3.2 NetBeans

1. Con NetBeans la edición del código fuente se realiza de una forma más sencilla ya que tiene plantillas para la realización de todo tipo de aplicaciones Java.

2. Para realizar el código anterior tenemos que crear lo primero de todo un proyecto, para ello seleccionamos en File – New Project – General - Java Application.

4

Page 5: apuntesjava

3. Una vez creado el proyecto, creamos un nuevo programa, para ello pulsamos el icono de New File o lo seleccionamos desde el menú File.

5

Page 6: apuntesjava

4. Para compilar el programa tan solo tenemos que pulsar sobre el icono de compilación (F11).

5. Por último para ejecutar el programa pulsaremos sobre el icono de run (F6).

4. Argumentos

La segunda aplicación que realizaremos trata de demostrar el uso de los argumentos en la línea de llamada de un programa. La sintaxis utilizada por Java para poder realizarlo se hace a través del método main: public static void main( String args[] ) { . . . }

En él se puede apreciar que recibe un array de objetos de tipo String llamado args.

El código de la aplicación es el siguiente:

class Argumentos{

public static void main( String args[] ){

for( int i=0; i < args.length; i++ ) System.out.println( args[i] );}}

6

Page 7: apuntesjava

Para ejecutar el programa debemos editarlo y guardarlo, y a continuación compilarlo con:

javac Argumentos.java

Para ejecutarlo tendremos que poner:

java Argumentos estos son los argumentos que se pasan

Y la ejecución del programa imprime en pantalla lo siguiente:

estossonlosargumentosquesepasan

5. Ejemplos

5.1 Declaración de variablespublic class App1{

public static void main( String args[] ){

int i=1;long l=1l;double d=1.5;float f=1.5f;boolean b=true;char c='a';String cadena="Esto es una \ncadena";

System.out.println( "i:"+i );System.out.println( "l:"+l );System.out.println( "d:"+d );System.out.println( "i:"+f );System.out.println( "b:"+b );System.out.println( "c:"+c );System.out.println( "cadena:"+cadena );

}}

5.2 Operaciones y conversión cast

public class App2{

public static void main( String args[] ){

int x=5, y=2, resi;resi = x/y;double resd;resd = (double) x/y;System.out.println( "resi: "+resi );System.out.println( "resd: "+resd );

}}

7

Page 8: apuntesjava

5.3 Sentencias condicionales if

public class App3{

public static void main( String args[] ){

int x=5, y=2;

//igualif (x==5) System.out.println("x=5");//distintoif (x!=2) System.out.println("x!=2");//y lógicoif (x==5 && y==2) System.out.println("x=5, y=2");//o lógicoif (x==5 || y==1) System.out.println("x=5");//operaciónif (x+y>10){

System.out.println("x+y>10");}else{

System.out.println("x+y<10");}

}}

5.4 Arrays y bucles for

public class App4{

public static void main( String args[] ){

int arrayint[] = new int[3];char arraychar[] = {'a', 'b', 'c'};

//rellenamos el array de enterosfor (int i=0; i<3; i++){

arrayint[i]=i;}

//imprimimos su valorfor (int i=0; i<3; i++){

System.out.println( "arrayint["+i+"]: "+arrayint[i] );

}

//incrementamos en 1 cada valorfor (int i=0; i<3; i++){

arrayint[i]+=1;System.out.println( "arrayint["+i+"]:

"+arrayint[i] );}

//incrementamos en 1 cada letrafor (int i=0; i<3; i++)

8

Page 9: apuntesjava

{arraychar[i]+=1;

}

//imprimimos su valorfor (int i=0; i<3; i++){

System.out.println( "arraychar["+i+"]: "+arraychar[i] );

}}

}

public class Temperaturas{

public static void main( String args[] ){

int temperaturas[] = new int[5];temperaturas[0] = 15;temperaturas[1] = 29;temperaturas[2] = 6;temperaturas[3] = 23;temperaturas[4] = 3;int media, total=0;

//imprimimos las temperaturasfor (int i=0; i<5; i++){

System.out.println( "temperaturas["+i+"]: "+temperaturas[i] );

}//cambiamos algunas temperaturastemperaturas[0] += 4;temperaturas[2] -= 2;

//calculamos la mediafor (int i=0; i<5; i++){

total += temperaturas[i];}media = total / 5;System.out.println( "\nTemperatura media: " + media );

}}

5.5 Bucles while

public class App5{

public static void main( String args[] ){

int i=10;

while (i>0)System.out.println( "i:"+i-- );

}}

public class App6{

9

Page 10: apuntesjava

public static void main( String args[] ){

int i=10;

do{

System.out.println( "i:"+ i-- );} while (i>0);

}}

10

Page 11: apuntesjava

5.6 Entrada y salida básica

import java.io.*;

public class EntSal{

public static void main( String args[] ) throws IOException{

//Objeto para leer una cadena del tecladoBufferedReader entrada = new BufferedReader(new

InputStreamReader(System.in));

int edad;String nombre;

System.out.println( "\nIntroduce tu nombre: " );nombre = entrada.readLine();

System.out.println( "\nIntroduce tu edad: " );//conversión de cadena a número

edad = Integer.parseInt(entrada.readLine());

System.out.print( "\nTe llamas " + nombre + " y tienes " + edad + " años.");

}}

El siguiente programa realiza lo mismo que el ejemplo anterior pero utiliza una clase introducida en la versión 1.5 del jdk que se llama Scanner y que simplifica las operaciones de entrada y salida.

import java.util.Scanner;

public class EmtSalScanner { public static void main(String[] args)

{ //Objeto para leer una cadena del teclado

Scanner entrada = new Scanner(System.in); int edad; String nombre; System.out.println( "\nIntroduce tu nombre:" ); //lectura de un String nombre = entrada.nextLine(); System.out.println( "\nIntroduce tu edad:" ); //lectura de un int edad = entrada.nextInt(); System.out.print( "\nTe llamas " + nombre + " y tienes " + edad + " años."); } }

11

Page 12: apuntesjava

6. Media

El siguiente programa que realizaremos trata de dar un ejemplo de utilización de bucles simples, sentencias condicionales y entrada y salida en Java.

El programa calcula el promedio de 10 calificaciones de examen. Esta calificación puede ser A, B, C, D y F y corresponden con 4, 3, 2, 1 y 0 puntos respectivamente.

// Media.java// Calcula la nota media de los exámenes de un grupo de alumnos// Utilización del bucle while y sentencias condicionalesimport java.io.*;

public class Media { public static void main( String args[] ) throws IOException { int contador, total, media; String nota;

//Objeto para leer una cadena del teclado BufferedReader entrada= new BufferedReader(new InputStreamReader(System.in));

// inicialización de variables total = 0; contador = 1; while ( contador <= 10 ) { System.out.println( "\nTeclee calificación (A,B,C,D,F): " ); nota = entrada.readLine(); if ( nota.equals("A") ) total = total + 4; else if ( nota.equals("B") ) total = total + 3; else if ( nota.equals("C") ) total = total + 2; else if ( nota.equals("D") ) total = total + 1; else if ( nota.equals("F") ) total = total + 0;

contador = contador + 1; } media = total / 10; System.out.println("\n\nEl promedio del grupo es: " + media); }}

6.1 Ejercicios sobre la aplicación Media:

1. Inicializar las variables contador y total en su declaración. 2. Sustituir la sentencia contador = contador + 1 por contador += 1 y las

sentencias total = total + x por total += x. 3. Utilizar un bucle for en vez del bucle while. 4. Hacer que el resultado de la media de las calificaciones se muestre con

decimales (double o float) en vez de enteros.

12

Page 13: apuntesjava

5. Capturar la entrada de las calificaciones siempre en mayúsculas. 6. Hacer que el programa lea notas hasta que el usuario introduzca una “Z”.

Utilizar un bucle while y un do-while. 7. Hacer que el programa solo lea las letras correspondientes a las calificaciones A,

B, C, D y F o Z para finalizar. En caso de que el usuario introduzca otra letra se le avisará del error y no será tomada en cuenta.

7. Ejercicios propuestos

1. Construir un programa en Java que sume los números del 1 al 100. 2. Construir un programa en Java que sume los números pares del 1 al 100. 3. Construir un programa en Java que sume los números de 1 al 100, pero solo

aquellos que acaben en 2 o en 3. 4. Construir un programa en Java que sume los números de 1 al n, siendo n un

número introducido por teclado mayor que 0. 5. Construir un programa en Java que muestre la tabla de multiplicar de la forma

tradicional (Ej. 2x4=8).

SESIÓN 2PROGRAMACIÓN BÁSICA EN JAVA

Solución de los ejercicios

Solución ejercicios sobre la aplicación Media:

1. Inicializar las variables contador y total en su declaración. 2. Sustituir la sentencia contador = contador + 1 por contador += 1 y las

sentencias total = total + x por total += x. 3. Utilizar un bucle for en vez del bucle while. 4. Hacer que el resultado de la media de las calificaciones se muestre con

decimales (double o float) en vez de enteros. 5. Capturar la entrada de las calificaciones siempre en mayúsculas.

import java.io.*;public class Media2{

public static void main( String args[] ) throws IOException{

int contador=1, total=0; double media;String nota;//Objeto para leer una cadena del tecladoBufferedReader entrada=

new BufferedReader(new InputStreamReader(System.in));

for ( contador=1; contador <= 10; contador++ ){

System.out.println( "\nTeclee calificación (A,B,C,D,F): " );

nota = entrada.readLine().toUpperCase();

if ( nota.equals("A") )

13

Page 14: apuntesjava

total += 4;else if ( nota.equals("B") )

total += 3;else if ( nota.equals("C") )

total += 2;else if ( nota.equals("D") )

total += 1;else if ( nota.equals("F") )

total += 0;}

media = (double) total / 10;System.out.println( "\n\nEl promedio del grupo es: " +

media );}

}

6. Hacer que el programa lea notas hasta que el usuario introduzca una “Z”. Utilizar un bucle while y un do-while. import java.io.*;public class MediaWhile {

public static void main( String args[] ) throws IOException { double media; int contador=0, total=0; String nota; BufferedReader entrada=

new BufferedReader(new InputStreamReader(System.in)); System.out.println( "Teclee calificación (A,B,C,D,F), Z para terminar: " ); nota = entrada.readLine();

nota = nota.toUpperCase();

while ( ! nota.equals("Z") ) { if ( nota.equals("A") ) total = total + 4; else if ( nota.equals("B") ) total = total + 3; else if ( nota.equals("C") ) total = total + 2; else if ( nota.equals("D") ) total = total + 1; else if ( nota.equals("F") ) total = total + 0;

contador = contador + 1; System.out.println("\nTeclee calificación (A,B,C,D,F),Z para terminar:"); nota = entrada.readLine().toUpperCase(); } if ( contador != 0 ) { media = (double) total / contador; System.out.println( "\nEl promedio del grupo es: " + media ); } else System.out.println( "\nNo se introdujeron calificaciones." ); }}

14

Page 15: apuntesjava

7. Hacer que el programa solo lea las letras correspondientes a las calificaciones A, B, C, D y F o Z para finalizar. En caso de que el usuario introduzca otra letra se le avisará del error y no será tomada en cuenta. Solución:

import java.io.*;public class MediaDoWhile2{

public static void main( String args[] ) throws IOException{

double media; int contador, total;String nota;BufferedReader entrada=

new BufferedReader(new InputStreamReader(System.in));

total = 0;contador = 0;

do{

do{

System.out.println("Teclee calificación (A,B,C,D,F),

Z para terminar: ");nota = entrada.readLine().toUpperCase();if (!nota.equals("A") && !nota.equals("B") && !nota.equals("C") && !nota.equals("D") && !nota.equals("F") && !nota.equals("Z"))

System.out.println("Nota erronea");} while(!nota.equals("A") && !nota.equals("B")

&& !nota.equals("C") && !nota.equals("D")&& !nota.equals("F") && !nota.equals("Z"));

if ( nota.equals("A") ){

total = total + 4;contador = contador + 1;

}else if ( nota.equals("B") ){

total = total + 3;contador = contador + 1;

}else if ( nota.equals("C") ){

total = total + 2;contador = contador + 1;

}else if ( nota.equals("D") ){

total = total + 1;contador = contador + 1;

}else if ( nota.equals("F") ){

total = total + 0;contador = contador + 1;

15

Page 16: apuntesjava

}} while ( ! nota.equals("Z") );

if ( contador != 0 ){

media = (double) total / contador;System.out.println( "\nEl promedio del grupo es: " +

media );}else

System.out.println( "\nNo se introdujeron calificaciones." );

}}

16

Page 17: apuntesjava

7.1 Solución ejercicios propuestos:

1. Construir un programa en Java que sume los números del 1 al 100. public class Ejercicio1 {

public static void main (String args[]){

int i=0, suma100=0;for (i=1; i<=100; i++){

suma100 += i;}System.out.println ("\nSuma del 1 al 100: " + suma100);

}}

2. Construir un programa en Java que sume los números pares del 1 al 100. public class Ejercicio2 {

public static void main (String args[]){

int i=0, suma100pares=0;for (i=1; i<=100; i++){

if (i%2 == 0){

suma100pares += i;}

}System.out.println ("\nSuma de los pares del 1 al 100: "

+ suma100pares);}

}

3. Construir un programa en Java que sume los números del 1 al 100, pero solo aquellos que acaben en 2 o en 3. public class Ejercicio3 {

public static void main (String args[]){

int i=0, suma10023=0;for (i=1; i<=100; i++){

if (((i-2)%10 == 0) || ((i-3)%10 == 0)){

suma10023 += i;}

}System.out.println ("\nSuma de los números que terminan

en 2 o 3 del 1 al 100: " + suma10023);}

}

4. Construir un programa en Java que sume los números de 1 al n, siendo n un número introducido por teclado mayor que 0. import java.io.*;public class Ejercicio4 {

public static void main (String args[]) throws IOException{

int i=0, suma=0, num;

17

Page 18: apuntesjava

BufferedReader entrada=new BufferedReader(new InputStreamReader(System.in));

System.out.println("Introduzca el número>=0: ");num=Integer.parseInt(entrada.readLine());

for (i=1; i<=num; i++){

suma += i;}System.out.println ("\nSuma del 1 al "+num+": " + suma);

}}

5. Construir un programa en Java que muestre la tabla de multiplicar de la forma tradicional (Ej. 2x4=8). public class Ejercicio5 {

public static void main (String args[]){

int i=0, j=0, res=0;for (i=1; i<=10; i++){

for (j=1; j<=9; j++){

res = i*j;System.out.println (i+"x"+j+"="+res);

}}

}}

18

Page 19: apuntesjava

6.

SESIÓN 2 (Añadido)PROGRAMACIÓN BÁSICA EN JAVA

Ejercicios para practicar con Java Básico

A. Crear un programa que imprime el mayor de tres enteros.B. Crear un programa que dados dos enteros imprime su suma, resta, producto

y división.C. Crear un programa que dados cuatro enteros imprime la suma y la media.D. Crear un programa que dado un entero imprima un valor lógico que indica si

el número es par o impar. E. Realizar un programa que dados un entero y una cadena repita tantas veces

la cadena como indique el entero.F. Realizar un programa que pida dos cadenas al usuario que deben ser “V” o

“F” para ser convertidas en valores lógicos y presente el resultado de las tres operaciones lógicas (y, o, no) sobre dichos valores.

G. Codificar el programa que dado un número devuelva el número de cifras que lo componen. Considerar que el número 0 tiene 1 cifra.

H. Realizar un programa que pida los datos de altura y sexo de personas y calcule la media de altura para hombres y la media para mujeres.

I. Realizar un programa que pida datos de altura, sexo y edad y realice la media de altura para cada uno de los siguientes grupos:

i. mujeres, menores de 20 años no incluidas las de 20ii. hombres, menores de 20 años no incluidos los de 20

iii. mujeres, entre 20 y 40 años ambos inclusiveiv. mujeres, de más de 40 añosv. hombres de más de 20 años

vi. personas entre 15 y 35 años ambos inclusiveJ. Codificar un programa que, dados tres números enteros que recogen la

información del día, mes y año de una fecha, determine si es una fecha válida, considerando el 29 de febrero para los años bisiestos.

K. Hacer un programa que dadas dos fechas diga la diferencia en días entre ellas.

L. Escribir un programa que determine si un número es primo. M. Notas: Un número es primo si sólo es divisible por sí mismo y por 1. N. Si un número no es primo diremos que es compuesto.O. El 0 y el 1 son números especiales que no se consideran primos ni

compuestos.

19

Page 20: apuntesjava

SESIÓN 2aPROGRAMACIÓN BÁSICA EN JAVA

Solución de los ejercicios

1. Crear un programa que imprime el mayor de tres enteros. public class Ej1 { public static void main (String[] args) { int e1=5, e2=4, e3=3, tmp; //defino los enteros con valor if (e1 > e2) tmp=e1; else tmp=e2; if (tmp > e3) System.out.println ("el mayor es: "+tmp); else System.out.println ("el mayor es: "+e3); }}

2. Crear un programa que dados dos enteros imprime su suma, resta, producto y división. public class Ej2 { public static void main (String[] args) { // dos enteros int ent1=23, ent2=3; System.out.println ("suma: "+(ent1+ent2)); System.out.println ("resta: "+(ent1-ent2)); System.out.println ("multi: "+(ent1*ent2)); System.out.println ("divi: "+(ent1/ent2)); }}

3. Crear un programa que dados cuatro enteros imprime la suma y la media. public class Ej3 { public static void main (String[] args) { // cuatro enteros int ent1=23, ent2=3, ent3=123, ent4=0; System.out.println ("suma: "+(ent1+ent2+ent3+ent4)); System.out.println ("media: "+((ent1+ent2+ent3+ent4) / 4)); }}

4. Crear un programa que dado un entero imprima un valor lógico que indica si el número es par o impar. public class Ej4 { public static void main (String[] args) { // entero int ent1=23; System.out.println("par: "+ (ent1 % 2 == 0)); }}

5. Realizar un programa que dados un entero y una cadena repita tantas veces la cadena como indique el entero.

20

Page 21: apuntesjava

public class Ej5 { public static void main (String[] args) { int entero=3; String cadena="Java"; // si el entero no es positivo no hacemos nada // si la cadena es "" no hacemos nada if (entero>0 && !cadena.equals("")) { for (int i = 0; i < entero; i++) System.out.println(cadena); } }}

6. Realizar un programa que pida dos cadenas al usuario que deben ser “V” o “F” para ser convertidas en valores lógicos y presente el resultado de las tres operaciones lógicas (y, o, no) sobre dichos valores. import java.io.*;

public class Ej6 { public static void main (String[] args) throws IOException { BufferedReader entrada= new BufferedReader(new InputStreamReader(System.in)); String cad1,cad2; boolean log1,log2; System.out.println ("Introduce cadena 1 (V/F): "); cad1=entrada.readLine().toUpperCase(); System.out.println ("Introduce cadena 2 (V/F): "); cad2=entrada.readLine().toUpperCase(); log1=cad1.equals("V"); log2=cad2.equals("V"); System.out.println("Operación OR: "+(log1 || log2)); System.out.println("Operación AND: "+(log1 && log2)); System.out.println("Operación NOT 1: "+(!log1)); System.out.println("Operación NOT 2: "+(!log2)); } }

7. Codificar el programa que dado un número devuelva el número de cifras que lo componen. Considerar que el número 0 tiene 1 cifra. public class Ej7 { public static void main (String[] args) { int entero=4560; int cifras=0; if (entero==0) cifras=1; else { for (int ent=entero; ent>0; cifras++) { ent/=10; System.out.println(ent); }

} System.out.println("Cifras del número " + entero + ": "+cifras); }}

21

Page 22: apuntesjava

8. Realizar un programa que pida los datos de altura y sexo de personas y calcule la media de altura para hombres y la media para mujeres. import java.io.*;

public class Ej8 { public static void main (String[] args) throws IOException { BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); String leido; int alturasMas=0, numMas=0, alturasFem=0, numFem=0; for (int i = 0; i < 10; i++) { do { System.out.println ("Introduzca sexo (M/F): "); leido=entrada.readLine().toUpperCase(); } while (!leido.equals("M") && !leido.equals ("F")); System.out.println("Introduzca altura:"); if (leido.equals("M")) { alturasMas += Integer.parseInt(entrada.readLine()); numMas++; } else { alturasFem += Integer.parseInt(entrada.readLine()); numFem++; } } System.out.println ("\n\nMedia de alturas Masc.="+(alturasMas/numMas)); System.out.println ("\n\nMedia de alturas Fem.="+(alturasFem/numFem)); }}

9. Realizar un programa que pida datos de altura, sexo y edad y realice la media de altura para cada uno de los siguientes grupos:

mujeres, menores de 20 años no incluidas las de 20 hombres, menores de 20 años no incluidos los de 20 mujeres, entre 20 y 40 años ambos inclusive mujeres, de más de 40 años hombres de más de 20 años personas entre 15 y 35 años ambos inclusive

import java.io.*;

public class Ej9 { public static void main (String[] args) throws IOException { BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); String leido; int enteroLeido=0; int alturasMujeresMenores=0, numMujeresMenores=0; int alturasHombresMenores=0, numHombresMenores=0; int alturasMujeresMedia =0, numMujeresMedia =0; int alturasMujeresMayores=0, numMujeresMayores=0; int alturasHombresMedia =0, numHombresMedia =0; int alturasGrupoSuelto =0, numGrupoSuelto =0; for (int i = 0; i < 10; i++) { do {

22

Page 23: apuntesjava

System.out.println ("Introduzca sexo (M/F): "); leido=entrada.readLine().toUpperCase(); } while (!leido.equals("M") && !leido.equals("F")); do { System.out.println ("Introduzca edad (1-100): "); enteroLeido=Integer.parseInt(entrada.readLine()); } while (enteroLeido<1 || enteroLeido>100); System.out.println ("Introduzca altura:"); enteroLeido=Integer.parseInt (entrada.readLine ()); if (leido.equals("M")) { //hombres if (enteroLeido<20) { alturasHombresMenores+=enteroLeido; numHombresMenores+=1; } else { alturasHombresMedia+=enteroLeido; numHombresMedia+=1; } } else { // mujeres if (enteroLeido<20) { alturasMujeresMenores+=enteroLeido; numMujeresMenores+=1; } else { if (enteroLeido>40) { alturasMujeresMayores+=enteroLeido; numMujeresMayores+=1; } else { alturasMujeresMedia+=enteroLeido; numMujeresMedia+=1; } } } // el grupo de 15 a 35 de cualquier sexo if (enteroLeido>=15 && enteroLeido<=35) { alturasGrupoSuelto+=enteroLeido; numGrupoSuelto+=1; } } System.out.println ("\n\nMedia de alturas:"); if (numMujeresMenores>0) System.out.println ("Mujeres <20 años: "+(alturasMujeresMenores/numMujeresMenores)); if (numMujeresMedia>0) System.out.println ("Mujeres >20 y <40 años: "+(alturasMujeresMedia/numMujeresMedia)); if (numMujeresMayores>0) System.out.println ("Mujeres >40 años: "+(alturasMujeresMayores/numMujeresMayores)); if (numHombresMenores>0) System.out.println ("Hombres <20 años: "+(alturasHombresMenores/numHombresMenores)); if (numHombresMedia>0) System.out.println ("Hombres >20 años: "+(alturasHombresMedia/numHombresMedia)); if (numGrupoSuelto>0) System.out.println ("General 15-35 años: "+(alturasGrupoSuelto/numGrupoSuelto));

23

Page 24: apuntesjava

} }

10. Codificar un programa que, dados tres números enteros que recogen la información del día, mes y año de una fecha, determine si es una fecha válida, considerando el 29 de febrero para los años bisiestos. import java.io.*;public class Ej10 { public static void main (String[] args) throws IOException { BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); int dia, mes, año; // valores de fecha boolean correcta=true; System.out.println ("Introduzca día: "); dia=Integer.parseInt(entrada.readLine()); System.out.println ("Introduzca mes: "); mes=Integer.parseInt(entrada.readLine()); System.out.println ("Introduzca año: "); año=Integer.parseInt(entrada.readLine()); // rangos base if (año<1 || año>2008 || mes<1 || mes>12 || dia<1 || dia>31) {correcta=false; } else { if (mes==2 ) {

//Febrero if ((año%4==0) && !((año%100==0) && (año%400!=0) )) { //Bisiesto if (dia>29) {correcta=false;} } else {if (dia>28) correcta=false;} } else { if ((mes<8 && mes%2==0 && dia>30) || (mes<8 && mes%2!=0 && dia>31) || (mes>7 && mes%2==0 && dia>31) || (mes>7 && mes%2!=0 && dia>30) ) {correcta=false;} } } if (correcta) System.out.println("Fecha correcta"); else System.out.println("Fecha incorrecta!"); }}

11. Hacer un programa que dadas dos fechas diga la diferencia en días entre ellas. public class Ej11 { public static void main (String[] args) { // valores de fecha1 int dia1=29, mes1=7, año1=2006; // valores de fecha2 int dia2=2, mes2=3, año2=2004; // restamos fecha1 - fecha2 int fecha1=año1*365+mes1*30+dia1; int fecha2=año2*365+mes2*30+dia2;

24

Page 25: apuntesjava

System.out.println("La diferencia es de "+(fecha1-fecha2) +" días"); }}

12. Escribir un programa que determine si un número es primo. Notas: Un número es primo si sólo es divisible por sí mismo y por 1. Si un número no es primo diremos que es compuesto.El 0 y el 1 son números especiales que no se consideran primos ni compuestos.import java.io.*;public class Ej12 {

public static void main( String args[] ) throws IOException {

BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));

int num, resto=1, n=2;

System.out.println( "\nIntroduce un número:" );num = Integer.parseInt(entrada.readLine());

while ((n<num/2) && (resto!=0)) {resto = (int) (num%n);n++;

}

if (resto!=0) System.out.println( "\nEl número " + num + " es primo.");

else System.out.println( "\nEl número " + num + " no es primo.");

}}

25

Page 26: apuntesjava

Sesión 3MODULARIDAD Y UTILIZACIÓN DE CLASES

BÁSICAS EN JAVA

8. 1.       Modularidad

En este apartado realizaremos una primera aproximación a la modularidad dentro de una clase en Java realizando descomposición funcional. El siguiente ejemplo muestra una clase con un método auxiliar y el paso de parámetros por valor y por referencia.

//Paso de parámetros por valor y por referenciapublic class Parametros{

static String global= "global"; //variable global a la clase

public static void main(String args[]){

int num = 1; //por valorint numeros[] = {1,2,3,4,5}; //los arrays se pasan por

referenciaString cadena = "abc"; //por valor

System.out.println("\nNúmero antes de la llamada al método:"+num);

System.out.println("\nArray antes de la llamada al método:");for (int i=0; i<5; i++){

System.out.print(" "+numeros[i]);}System.out.println("\nCadena antes de la llamada al

método:"+cadena);System.out.println("\nGlobal antes de la llamada al

método:"+global);

//llamamos al métodoconvierte(num, numeros, cadena);

System.out.println("\nNúmero después de la llamada al método:"+num);

System.out.println("\nArray después de la llamada al método:");for (int i=0; i<5; i++){

System.out.print(" "+numeros[i]);}System.out.println("\nCadena después de la llamada al

método:"+cadena);System.out.println("\nGlobal después de la llamada al

método:"+global);}

public static void convierte(int num, int numeros[], String cadena){

num += 1;//sumamos 1 al array de enterosfor (int i=0; i<5; i++){

numeros[i] += 1;}cadena = "def";global = "nueva";

26

Page 27: apuntesjava

}}

En el siguiente ejemplo calculamos la potencia de un número. Para realizarlo nos basamos en la clase Math que define múltiples métodos matemáticos.

import java.io.*;

public class Potencia{

public static void main(String args[]) throws IOException{

BufferedReader entrada=new BufferedReader(new InputStreamReader(System.in));

double base = 0, exponente = 0, resultado;

System.out.println("\nIntroduce la base:");base = Double.parseDouble(entrada.readLine());

System.out.println("\nIntroduce el exponente:");

exponente = Double.parseDouble(entrada.readLine());

//llamamos al métodoresultado = calcula(base, exponente);System.out.println("\n\nEl resultado es: "+resultado);

}

public static double calcula(double num1, double num2){

//Calculamos con el método pow de la clase Mathreturn Math.pow(num1, num2);

}}

8.1 1.1        Ejercicio sobre modularidad:

1. Escribir un programa conversor de pesetas a euros y viceversa. Para realizarlo se le debe pedir al usuario la cantidad a convertir y el tipo de conversión.  

9. 2.       Arrays

Para familiarizarse con el uso de los arrays y clases básicas de Java presentamos el siguiente ejemplo, que genera de forma aleatoria 10 números entre el 0 y el 15 (haciendo uso de la clase Random) y a continuación nos indica que introduzcamos un número y comprueba si ese número está en el array (utilizando la clase Arrays):

import java.io.*;import java.util.*;

public class Adivina{

public static void main(String args[]) throws IOException{

BufferedReader entrada=new BufferedReader(new InputStreamReader(System.in));

int i, num;int numeros[] = new int[10];

27

Page 28: apuntesjava

boolean adivinado = false;Random rand = new Random();

for (i=0;i<=9;i++){

numeros[i]=rand.nextInt(15);}

//Ordenamos el arrayArrays.sort(numeros);

//Pedimos el númeroSystem.out.println("Introduzca el número (0-15):" );num = Integer.parseInt(entrada.readLine());

//llamamos al métodoadivinado = adivinado(numeros, num);

if (adivinado){

System.out.println("\nNúmero adivinado");}else{

System.out.println("\nNúmero NO adivinado");}

//Imprimimos todos los númerosSystem.out.println("\nTodos los números:");

for (i=0; i<=9; i++){

System.out.print(" "+numeros[i]);}

}

public static boolean adivinado(int numeros[], int num){

if (Arrays.binarySearch(numeros,num)>=0){

return true;}else{

return false;}

}}

9.1 2.1        Ejercicios sobre arrays:

1. Escribir un programa que pida 10 números por teclado y los introduzca en un array. A continuación debe decir cuales son el mayor y el menor.

2. Escribir un programa que pida 10 letras por teclado, las convierta a mayúsculas y los introduzca en un array. A continuación debe decir la posición de aquellas letras que sean vocales.

3. Escribir un programa que pida 10 letras por teclado y las introduzca en un array. Las letras solo pueden ser S o N. A continuación debe decir cuantas S y N se han introducido.

4. Escribir un programa que pida 10 cadenas por teclado y los introduzca en un array. A continuación debe decir cuales son la mayor y la menor haciendo uso del método compareTo() de la clase String.

28

Page 29: apuntesjava

5. Realizar un programa que simule al sorteo de la lotería primitiva de la siguiente forma: Se construirá un array de 6 valores enteros del 1 al 49, no pudiendo repetirse ningún valor. A continuación se pedirá al usuario su combinación de 6 valores que también se introducirá en otro array. El programa debe indicar el número de aciertos del usuario

10. 3.       Cadenas de caracteres

      Haciendo uso de la clase String hacer los siguientes ejercicios:1. Escribir un programa que emplee el método regionMatches() de la clase String

para comparar dos cadenas introducidas por el usuario. El programa deberá solicitar el número de caracteres que se van a comparar y el índice inicial de la comparación. El programa deberá indicar si la primera cadena es mayor, igual o menor que la segunda. No se tienen en cuenta mayúsculas y minúsculas.

2. Escribir un programa que solicite una cadena y una letra y nos devuelva las posiciones que ocupa esa letra en la cadena.

3. Escribir un programa que nos diga cuantas veces se repiten las vocales dentro de una cadena que el usuario introduce por teclado.

      Haciendo uso de la clase StringTokenizer hacer los siguientes ejercicios:

1. Escribir un programa al que se le pasa un número de teléfono de la forma: 91-8885566. El programa deberá usar la clase StringTokenizer para extraer el código de la comunidad y el resto del número, convertir el código de la comunidad en int y el resto en long, y presentarlo por pantalla.

2. Escribir un programa que lea una cadena y nos presente aquellas que empiecen por la letra b.

3. Escribir un programa que pida una cadena y la divida en palabras y presente las palabras en orden inverso. Consejo: Utilizar la clase StringBuffer.

4.

29

Page 30: apuntesjava

Sesión 4EXCEPCIONES EN JAVA

Para familiarizarse con los distintos mecanismos para el tratamiento de las excepciones realizar los ejemplos del capítulo 4 de teoría sobre Java.

11. Ejemplo de uso de Excepciones

En el siguiente ejemplo calculamos la media de unas calificaciones de examen, contemplando todos sus posibles errores en tiempo de ejecución.

import java.io.*;

public class Notas {

public static void main( String args[] ){

double media=0, total=0, notanum=0; int contador=0;String notatxt="";BufferedReader entrada = new BufferedReader(new

InputStreamReader(System.in));

while ( ! notatxt.equals("Z") ) {try {

System.out.println( "\nTeclee calificación (0-10), Z para terminar:" );

notatxt = entrada.readLine().toUpperCase();notanum = convierteNota(notatxt);if (notanum < 0 || notanum > 10) throw new

NotaMal();total += notanum;contador = contador + 1;

} catch ( NotaMal nm ) {System.out.println( "\n" + nm.getMessage() );

} catch( NumberFormatException nfe ) {if ( ! notatxt.equals("Z") )System.out.println("\nError de formato numérico: " +

nfe.toString());} catch( IOException ioe ) {

System.out.println( "\nError de entrada/salida: " + ioe.toString() );

} catch( Exception e ) {// Captura cualquier otra excepciónSystem.out.println( e.toString() );

}}

if ( contador != 0 ) { media = (double) total / contador; System.out.println( "\nEl promedio del grupo es: " + media );}else System.out.println( "\nNo se introdujeron calificaciones."

);}

public static double convierteNota(String notatxt) throws NumberFormatException {

30

Page 31: apuntesjava

double nota = Double.parseDouble(notatxt);return nota;

} }

class NotaMal extends Exception {public NotaMal(){

super( "Excepción definida por el usuario: NOTA INCORRECTA." );}

}

11.1 Ejercicio sobre excepciones:

Escribir un programa llamada Calculadora que realice las funciones típicas de una calculadora. Para ello pedirá al usuario tres valores: operación (+,-,*,/), operando1, operando2 y a partir de ellos muestre el resultado de la operación. Cuando el usuario introduzca una Z como valor de la operación el programa parará, si se introduce cualquier otro carácter se debe producir una excepción definida por el usuario imprimiendo un mensaje de error.

Se deberán intentar utilizar todos los mecanismos de tratamiento de excepciones dados en teoría.

31

Page 32: apuntesjava

Sesión 4EXCEPCIONES EN JAVA (Soluciones)

11.2 Ejercicio sobre excepciones:

Escribir un programa llamada Calculadora que realice las funciones típicas de una calculadora. Para ello pedirá al usuario tres valores: operación (+,-,*,/), operando1, operando2 y a partir de ellos muestre el resultado de la operación. Cuando el usuario introduzca una Z como valor de la operación el programa parará, si se introduce cualquier otro carácter se debe producir una excepción definida por el usuario imprimiendo un mensaje de error.

Solución

/* * Calculadora.java * */

import java.io.*;

public class Calculadora {

public static void main(String[] args) { double op1=0, op2=0, total=0; String op=""; BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); while ( true ) { try { System.out.println( "\nTeclee operación (+,-,*,/), Z para terminar: " ); op = entrada.readLine().toUpperCase(); if (!op.equals("+") && !op.equals("-") && !op.equals("*") && !op.equals("/") && !op.equals("Z")) throw new OpMal(); if (op.equals("Z")) return; System.out.println( "\nTeclee operando 1: " ); op1 = Double.parseDouble(entrada.readLine()); System.out.println( "\nTeclee operando 2: " ); op2 = Double.parseDouble(entrada.readLine()); if (op.equals("+")) total = op1+op2; if (op.equals("-")) total = op1-op2; if (op.equals("*")) total = op1*op2; if (op.equals("/")) total = op1/op2; System.out.println( "\nEl resultado de "+op1+op+op2+" es: "+total ); } catch (OpMal om) { System.out.println( "\n" + om.getMessage() ); } catch( NumberFormatException nfe ) { System.out.println("\nError de formato numérico: " + nfe.toString()); } catch ( ArithmeticException ae ) { System.out.println("\nError aritmético: " + ae.toString()); } catch( IOException ioe ) {

32

Page 33: apuntesjava

System.out.println( "\nError de entrada/salida: " + ioe.toString() ); } catch( Exception e ) { // Captura cualquier otra excepción System.out.println( e.toString() ); e.printStackTrace(); } } }}

class OpMal extends Exception { public OpMal() { super( "Excepción: OPERACIÓN INCORRECTA." ); }}

33

Page 34: apuntesjava

Sesión 5 - 1POO Básica en JAVA

En esta sesión realizaremos programas orientados a objetos básicos utilizando el lenguaje Java. Se pretende enseñar cómo realizar aplicaciones OO utilizando varias clases.

12. POO CON JAVA

A continuación realizaremos unos ejemplos de utilización de las distintas técnicas de POO que nos proporciona Java. Con estos ejemplos aprenderemos la utilización de las interfaces, la herencia y las clases con métodos estáticos.

1. Ejemplo de definición y utilización de una interface:

interface Trabajo {double pagarSueldo(double horas);

}

public class Empresa1 implements Trabajo {//Esta empresa paga a 12 euros la hora de trabajopublic double pagarSueldo(double horas){

return horas*12;}

}

public class Empresa2 implements Trabajo {//Esta empresa paga a 15 euros la hora de trabajopublic double pagarSueldo(double horas){

return horas*15; }

}

2. Construir una interface en Java que contenga los siguientes métodos:

interface ModuloCalculo {double suma(double a, double b);double resta(double a, double b);double multiplica(double a, double b);double divide(double a, double b);

}

34

Page 35: apuntesjava

3. Construir una clase en Java que implemente la interface anterior:

public class ModuloCalculoImpl implements ModuloCalculo {public double suma(double a, double b) {

return a+b;}public double resta(double a, double b) {

return a-b;}public double multiplica(double a, double b) {

return a*b;}public double divide(double a, double b) {

return a/b; }

}

4. Construir una clase en Java que haga uso de la clase anterior y que sume 2+3, y multiplique el resultado por 8:

public class PruebaMCI {public static void main (String args[]) {

ModuloCalculoImpl mci = new ModuloCalculoImpl();System.out.println( mci.multiplica(mci.suma(2, 3), 8) );

}}

5. Crear una nueva clase a partir de la clase ModuloCalculoImpl que tenga la operación módulo (%).

public class ModuloCalculoImpl2 extends ModuloCalculoImpl {public double modulo(double a, double b) {

return a % b;}

}

6. Construir una clase en Java que haga uso de la clase anterior y que sume 2+3, y calcule el módulo de la división por 3:

public class PruebaMCI2 {public static void main (String args[]) {

ModuloCalculoImpl2 mci2 = new ModuloCalculoImpl2();System.out.println( mci2.modulo(mci2.suma(2, 3), 3) );

}}

35

Page 36: apuntesjava

7. Construir una clase en Java que contenga métodos estáticos:

public class Operaciones {public static double suma(double a, double b) {

return a+b;}public static double resta(double a, double b) {

return a-b;}public static double multiplica(double a, double b) {

return a*b;}public static double divide(double a, double b) {

return a/b; }public static double modulo(double a, double b) {

return a % b;}

}

8. Construir una clase en Java que haga uso de la clase anterior y que sume 2+3, y multiplique el resultado por 8:

public class PruebaOperaciones { public static void main (String args[]) {

System.out.println( Operaciones.multiplica(Operaciones.suma(2, 3), 8) ); }}

13. Ejemplo POO Coche

A continuación realizaremos un programa orientado a objetos para la instanciación y manejo de objetos de tipo coche. Lo primero que haremos será crear un proyecto en NetBeans donde crearemos las clases. Para ello, en NetBeans pulsamos en el icono de nuevo proyecto y seleccionamos la categoría “General” y dentro “Java Application”. Rellenamos con la información mostrada a continuación:

36

Page 37: apuntesjava

Una vez creado el proyecto pulsamos en el icono de nuevo fichero y seleccionamos la categoría “Java Classes” y dentro “Java Class”, incluyendo todas las clases que creemos dentro del paquete “vehiculos”:

Para crear los atributos y los métodos, desplegamos el árbol de navegación de la clase y pulsamos con el botón derecho del ratón en “Fields” y seleccionamos “Add Field”. De esta forma creamos los atributos: matrícula, marca, modelo y velocidad; los tres primeros de tipo String y el último int.

37

Page 38: apuntesjava

Una vez creados los atributos podemos generar de forma automática los métodos get y set de todos los atributos, para hacerlo pulsamos con el botón derecho del ratón en Coche y seleccionamos “Refactor” y “Encapsulate Fields”, después pulsamos “Do Refactoring”:

38

Page 39: apuntesjava

El último paso que nos queda es cambiar el constructor añadiendo los parámetros y asignándoselos a los atributos. Para cambiar los parámetros seleccionamos el método constructor y con el botón derecho del ratón seleccionamos “Refactor” y “Change Method Parameters”, después pulsamos “Do Refactoring”:

El código final de la clase es el siguiente:

- Clase Coche:

package vehiculos;public class Coche { /** Creates a new instance of Coche */ public Coche(String matricula, String marca, String modelo, int velocidad) { this.matricula = matricula; this.marca = marca; this.modelo = modelo; this.velocidad = velocidad; }

//Atributos private String matricula; private String marca; private String modelo; private int velocidad;

//Métodos public String getMatricula() { return matricula;

39

Page 40: apuntesjava

} public void setMatricula(String matricula) { this.matricula = matricula; } public String getMarca() { return marca; } public void setMarca(String marca) { this.marca = marca; } public String getModelo() { return modelo; } public void setModelo(String modelo) { this.modelo = modelo; } public int getVelocidad() { return velocidad; } public void setVelocidad(int velocidad) { this.velocidad = velocidad; } }

Para probar la clase Coche crearemos una clase con un método main, para hacerlo, pulsamos en el icono de nuevo fichero y seleccionamos la categoría “Java Classes” y dentro “Java Main Class”:

- Clase PruebaCoches:

package vehiculos;

public class PruebaCoches { /** Creates a new instance of PruebaCoches */ public PruebaCoches() { } /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Coche c1 = new Coche("1234 BCD", "Opel", "Astra", 0); Coche c2 = new Coche("2345 CDE", "BMW", "S1", 80); Coche c3 = new Coche("3456 DEF", "Audi", "A3", 100);

40

Page 41: apuntesjava

c1.setVelocidad(60); System.out.println("velocidad: " + c1.getVelocidad()); } }

14. Ejercicio Banco 1

Se pretende realizar una pequeña aplicación en Java para la gestión de las cuentas de un banco. La aplicación se compondrá de una clase Cuenta para representar las cuentas y PruebaCuentas para instanciar y gestionar diversos objetos de tipo cuenta. La clase Cuenta debe contar como mínimo con los atributos: número de cuenta (String), titular (String), saldo (double) y fecha de apertura (Calendar). Extraer los métodos get y set correspondientes y añadirle los métodos retirar e ingresar dinero.

41

Page 42: apuntesjava

15. Ejemplo POO Empleados

El siguiente ejemplo de POO consiste en la creación de una serie de clases que nos permiten gestionar los empleados de una empresa.

Crearemos una librería de Java que luego podremos utilizar en diversos proyectos. Para ello en NetBeans pulsamos en el icono de nuevo proyecto y seleccionamos la categoría “General” y dentro “Java Class Library”:

42

Page 43: apuntesjava

Una vez creado el proyecto crearemos las distintas clases que formarán la librería que serán: Persona, Empleado y Departamento.

Para crear estas clases pulsamos el icono de nuevo fichero y seleccionamos la categoría “Java Classes” y dentro “Java Class”, incluyendo todas las clases dentro del paquete “empleados”:

El código de las tres clases es el siguiente:

- Clase Persona:

package empleados;

public class Persona { //Atributos private String DNI; private String nombre; protected int edad; protected String estado; //Constructor public Persona(String p_dni, String p_nombre, int p_edad, String p_estado) { DNI = p_dni; nombre = p_nombre; edad = p_edad; estado = p_estado; } //Métodos public String getDNI() { return DNI; } public String getNombre() { return nombre; } public int getEdad() { return edad; } public void cumpleaños() { edad += 1; } public String getEstado() { return estado; } public void setEstado(String nuevo) { estado = nuevo; }

43

Page 44: apuntesjava

// Devuelve información textual de una persona public String toString() { return DNI + " " + nombre; } }

- Clase Empleado:

package empleados;

public class Empleado extends Persona { //Atributos private String categoria; private double sueldo; private Departamento dept; //Constructor public Empleado(String p_dni, String p_nombre, int p_edad, String p_estado, String categoria, double sueldo, Departamento dept) { super(p_dni, p_nombre, p_edad, p_estado); //constructor clase padre this.categoria = categoria; this.sueldo = sueldo;

this.dept = dept; } //Métodos public String getCategoria() { return categoria; } public void setCategoria(String nueva) { categoria = nueva; } public double getSueldo() { return sueldo; } public Departamento getDepartamento() { return dept; } public void setDepartamento(Departamento otroDept) { dept = otroDept; } public void subeSueldo(double cantidad) { sueldo += cantidad; } public void subeSueldo(int porcentaje) { sueldo += (sueldo * porcentaje/100); } //Redefine el método cumpleaños public void cumpleaños() { edad += 1; if (edad >65) estado = "JUBILADO"; } //Imprime los datos del empleado public String toString() { return "Empleado: " + super.toString() + " - Categoría: " + categoria + " - Sueldo: " + sueldo + " # Departamento: " + dept.toString(); }

}

44

Page 45: apuntesjava

- Clase Departamento:

package empleados;

import java.util.Vector;

public class Departamento { //Atributos private String id; private String nombre; private String localizacion; private Vector empleadosDept; //Constructor public Departamento( String p_id, String p_nombre, String p_loc ) { id = p_id; nombre = p_nombre; localizacion = p_loc; empleadosDept = new Vector(); } //Métodos public String getIdDept() { return this.id; } public String getNombreDept() { return this.nombre; } public void setNombreDept(String nombreDept) { this.nombre = nombreDept; } public String getLocalizacionDept() { return this.localizacion; } public void setLocalizacionDept(String localizacionDept) { this.localizacion = localizacionDept; } public Vector getEmpleadosDept() { return this.empleadosDept; } // Inserta un nuevo empleado en el departamento. Si lo inserta devuelve true public boolean setEmpleadoDept(Empleado emp) { if (!empleadosDept.contains(emp)) { this.empleadosDept.add(emp); return true; } else return false; } // Borra un empleado del departamento. Si lo borra devuelve true public boolean borraEmpleadoDept(Empleado emp) { if (empleadosDept.contains(emp)) { this.empleadosDept.remove(emp); return true; } else return false; } // Imprime los datos del Departamento public String toString() {

45

Page 46: apuntesjava

return getIdDept() + " - " + getNombreDept() + " - " + getLocalizacionDept(); } }

Para probar la librería vamos a realizar un segundo proyecto llamado “PruebaEmpleados” de tipo “Java Application” dentro de la categoría “General”:

Una vez creado accedemos a las propiedades del proyecto e incluimos la librería pulsando en “AddProject” y seleccionando el proyecto Empleados:

46

Page 47: apuntesjava

Rellenamos la clase “Main” como sigue:

package pruebaempleados;

import empleados.*;

public class Main { public static void main(String[] args) { // TODO code application logic here //Creamos dos empleados Departamento dep1 = new Departamento("1","Prensa", "Madrid"); Empleado emp1 = new Empleado("153647458S","Pepe",65,"casado","Jefe",1500,dep1); Empleado emp2 = new Empleado("452697419Z","Maria",25,"soltera","Redactora",1000,dep1); //Aplicamos metodos System.out.println("Empleado 1: " + emp1.toString()); System.out.println("Empleado 2: " + emp2.toString()); emp1.cumpleaños(); emp1.subeSueldo(100.0); System.out.println("Nombre: " + emp1.getNombre() + " Estado: " + emp1.getEstado() + " Sueldo: " + emp1.getSueldo()); emp2.subeSueldo(10); System.out.println("Nombre: " + emp2.getNombre() + " Sueldo: " + emp2.getSueldo()); }}

16. Ejercicio Banco 2

Se pretende modificar la aplicación de la gestión de las cuentas del banco de forma que se tenga una relación de asociación entre las cuentas y los clientes del banco. Para realizarlo tendremos que crear una clase Cliente que represente los clientes del banco. La clase Cliente debe contar como mínimo con los atributos: DNI (String), nombre (String), dirección (String) y fecha de nacimiento (Calendar) con sus métodos get y set correspondientes. Las clases deben representar la relación de asociación entre cuentas y clientes con la inclusión del atributo cuentas de tipo Vector en la clase Cliente y el atributo titulares de tipo Vector en la clase Cuenta. Se deben proporcionar los métodos necesarios para insertar y borrar clientes y cuentas.

47

Page 48: apuntesjava

Sesión 5 - 1POO Básica en JAVA

Soluciones a los ejercicios

17. Ejercicio Banco 1

Se pretende realizar una pequeña aplicación en Java para la gestión de las cuentas de un banco. La aplicación se compondrá de una clase Cuenta para representar las cuentas y PruebaCuentas para instanciar y gestionar diversos objetos de tipo cuenta. La clase Cuenta debe contar como mínimo con los atributos: número de cuenta (String), titular (String), saldo (double) y fecha de apertura (Calendar). Extraer los métodos get y set correspondientes y añadirle los métodos retirar e ingresar dinero.

- Clase Cuenta:

package banco;import java.util.Calendar;public class Cuenta { /** Creates a new instance of Cuenta */ public Cuenta(String numero, String titular, double saldo) { this.numero = numero; this.titular = titular; this.saldo = saldo; this.fechaApertura = Calendar.getInstance(); } private String numero; private String titular; private double saldo; private Calendar fechaApertura; public String getNumero() { return numero; } public String getTitular() { return titular; } public void setTitular(String titular) { this.titular = titular;} public double getSaldo() { return saldo; } public void setSaldo(double saldo) {this.saldo = saldo; } public Calendar getFechaApertura() {return fechaApertura;} public void setFechaApertura(Calendar fechaApertura) {this.fechaApertura = fechaApertura;} public void ingresar(double cantidad) {this.saldo += cantidad;} public void retirar(double cantidad) {this.saldo -= cantidad;} public String toString() {return "Cuenta: " + this.numero + " - " + this.titular + " - " + this.saldo;}}

- Clase PruebaCuentas:

package banco;public class PruebaCuentas { /** * @param args the command line arguments

48

Page 49: apuntesjava

*/ public static void main(String[] args) { // TODO code application logic here Cuenta c1 = new Cuenta("1","Pepe",100); Cuenta c2 = new Cuenta("2","Maria",200); c1.ingresar(200); c2.retirar(100); System.out.println(c1.toString()); System.out.println(c2.toString()); }}

18. Ejercicio Banco 2

Se pretende modificar la aplicación de la gestión de las cuentas del banco de forma que se tenga una relación de asociación entre las cuentas y los clientes del banco. Para realizarlo tendremos que crear una clase Cliente que represente los clientes del banco. La clase Cliente debe contar como mínimo con los atributos: DNI (String), nombre (String), dirección (String) y fecha de nacimiento (Calendar) con sus métodos get y set correspondientes. Las clases deben representar la relación de asociación entre cuentas y clientes con la inclusión del atributo cuentas de tipo Vector en la clase Cliente y el atributo titulares de tipo Vector en la clase Cuenta. Se deben proporcionar los métodos necesarios para insertar y borrar clientes y cuentas.

- Clase Cuenta2:

package banco;

import java.util.Calendar;import java.util.Vector;

public class Cuenta2 { /** Creates a new instance of Cuenta2 */ public Cuenta2(String numero, Cliente2 c, double saldo) { this.numero = numero; this.setTitularCuenta(c); this.saldo = saldo; this.fechaApertura = Calendar.getInstance(); } private String numero; private Vector titulares = new Vector(); private double saldo; private Calendar fechaApertura; public String getNumero() {return numero;} public Vector getTitulares() {return titulares;} public void setTitulares(Vector titulares) {this.titulares = titulares;} public double getSaldo() {return saldo;} public void setSaldo(double saldo) {this.saldo = saldo;} public Calendar getFechaApertura() {return fechaApertura;} public void setFechaApertura(Calendar fechaApertura) {this.fechaApertura = fechaApertura;} public void ingresar(double cantidad) {this.saldo += cantidad;} public void retirar(double cantidad) {this.saldo -= cantidad;}

// Inserta un nuevo titular en la cuenta. Si lo inserta devuelve true

49

Page 50: apuntesjava

public boolean setTitularCuenta(Cliente2 c) { if (!titulares.contains(c)) { this.titulares.add(c); c.setCuentaTitular(this); //insertamos la cuenta en el titular return true; } else return false; } // Borra un titular de la cuenta. Si lo borra devuelve true public boolean borraTitularCuenta(Cliente2 c) { if (!titulares.contains(c)) { this.titulares.remove(c); c.borraCuentaTitular(this); //borramos la cuenta del titular return true; } else return false; } public String toString() {return "Cuenta: " + this.numero + " - " + this.titulares.toString() + " - " + this.saldo; }}

- Clase Cliente2:

package banco;

import java.util.Calendar;import java.util.Vector;

public class Cliente2 { /** Creates a new instance of Cliente2 */ public Cliente2(String DNI, String nombre, String direccion, Calendar fecNac) { this.DNI = DNI; this.nombre = nombre; this.direccion = direccion; this.fecNac = fecNac; }

private String DNI; private String nombre; private String direccion; private Calendar fecNac; private Vector cuentas = new Vector(); public String getDNI() {return DNI;} public void setDNI(String DNI) {this.DNI = DNI;} public String getNombre() {return nombre;} public void setNombre(String nombre) {this.nombre = nombre;} public String getDireccion() {return direccion;} public void setDireccion(String direccion) {this.direccion = direccion;} public Calendar getFecNac() {return fecNac;} public void setFecNac(Calendar fecNac) {this.fecNac = fecNac;} public Vector getCuentas() {return cuentas;} public void setCuentas(Vector cuentas) {this.cuentas = cuentas;}

// Inserta una nueva cuenta. Si la inserta devuelve true public boolean setCuentaTitular(Cuenta2 c) { if (!cuentas.contains(c)) { this.cuentas.add(c);

50

Page 51: apuntesjava

return true; } else return false; } // Borra una cuenta. Si la borra devuelve true public boolean borraCuentaTitular(Cuenta2 c) { if (!cuentas.contains(c)) { this.cuentas.remove(c); return true; } else return false; } public String toString() {return "Cliente: " + this.DNI + " - " + this.nombre + " - " + this.direccion; }}

- Clase PruebaCuentas2:

package banco;

import java.util.Calendar;

public class PruebaCuentas2 { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Calendar f1 = Calendar.getInstance(); f1.set(1980,1,1); Calendar f2 = Calendar.getInstance(); f1.set(1982,2,2); Cliente2 t1 = new Cliente2("1","Pepe","dir1",f1); Cliente2 t2 = new Cliente2("2","Maria","dir2",f2); Cuenta2 c1 = new Cuenta2("1",t1,100); Cuenta2 c2 = new Cuenta2("2",t2,200); c1.ingresar(200); c2.retirar(100); System.out.println(c1.toString()); System.out.println(c2.toString()); }}

51

Page 52: apuntesjava

Sesión 5 - 2POO Avanzada en JAVA

En esta sesión realizaremos programas orientados a objetos avanzados utilizando el lenguaje Java. Se pretende enseñar cómo aplicar técnicas avanzadas de POO en aplicaciones Java.

19. Ejemplo POO Informáticos

En este ejemplo se muestra un ejemplo de clases abstractas y polimorfismo. Para probarla crear una aplicación Java con el siguiente código:

- Clase InformaticoAbs:

package informaticos;

public abstract class InformaticoAbs { //Atributos private String empresa; private double sueldo; //Constructor public InformaticoAbs(String empresa) { this.empresa = empresa; } //Métodos public String getEmpresa() { return this.empresa; } public void setEmpresa(String nueva) { this.empresa = nueva; }

52

Page 53: apuntesjava

public double getSueldo() { return this.sueldo; } public void setSueldo(double euros) { this.sueldo = euros; } //método abstracto public abstract double pagarSueldo(double horas); }

- Clase Analista:

package informaticos;

public class Analista extends InformaticoAbs { String especialidad; public Analista(String empresa, String especialidad) { super(empresa); this.especialidad = especialidad; } public double pagarSueldo(double horas) { return horas*12; } }

- Clase Programador:

package informaticos;

public class Programador extends InformaticoAbs { String lenguaje; public Programador(String empresa, String lenguaje) { super(empresa); this.lenguaje = lenguaje; } public double pagarSueldo(double horas) { return horas*6; } }

- Clase Main

package informaticos;

public class Main { public static void main(String[] args) { // TODO code application logic here //Creamos informáticos InformaticoAbs inf1 = new Analista("IBM","BBDD"); InformaticoAbs inf2 = new Programador("Indra","Java"); //Pagamos los sueldos utilizando polimorfismo inf1.setSueldo(inf1.pagarSueldo(160)); inf2.setSueldo(inf2.pagarSueldo(180)); System.out.println("Sueldo analista: "+inf1.getSueldo()); System.out.println("Sueldo programador: "+inf2.getSueldo()); }}

20. Ejercicio Banco 3

53

Page 54: apuntesjava

Realizar una pequeña aplicación en Java utilizando polimorfismo, como en el ejemplo anterior, para la gestión de los intereses de distintos tipos de cuentas de un banco. La aplicación se compondrá de una clase padre abstracta CuentaAbs que contendrá un método abstracto calculaInteres(double cantidad) que devolverá un double con el cálculo de los intereses aplicados a cierta cantidad de dinero. La clase CuentaAbs debe contar como mínimo con los atributos: número de cuenta (String), titular (String), saldo (double) y fecha de apertura (Calendar) y sus correspondientes métodos get y set. De la clase CuentaAbs heredarán dos clases llamadas CuentaAhorro y CuentaPlazo que implementarán el método abstracto dando un interés del 2 % la primera y un 5 % la segunda. La calse CuentaAhorro incorporará un nuevo atributo llamado numTarjCredito de tipo String y CuentaPlazo el atributo numAños de tipo int. Probar las clases con distintos objetos de los dos tipos de cuentas.

21. Ejemplo POO Censo Universitario

A continuación realizaremos un programa capaz de gestionar un censo universitario de alumnos y profesores.

54

Page 55: apuntesjava

El código de cada una de las clases y una aplicación capaz de manejarlas es el siguiente:

- Clase Persona:

package censouni;

public class Persona { private String dni; private String nombre; private Fecha2 fechaNac; private String direccion; private int tfno; //constructor public Persona(String p_dni, String p_nombre, Fecha2 p_fecnac, String p_direccion, int p_tfno) { dni = p_dni; nombre = p_nombre; fechaNac = p_fecnac; direccion = p_direccion; tfno = p_tfno; } //métodos public String getDni() {return this.dni;} public String getNombre() {return this.nombre;} public void setNombre(String nombre) {this.nombre = nombre;} public Fecha2 getFechaNac() {return this.fechaNac;} public void setFechaNac(Fecha2 fechaNac) {this.fechaNac = fechaNac;} public String getDireccion() {return this.direccion;} public void setDireccion(String direccion) {this.direccion = direccion;} public int getTfno() {return this.tfno;} public void setTfno(int tfno) {this.tfno = tfno;} public String toString() {return dni + " " + nombre;}}

55

Page 56: apuntesjava

Esta clase hace uso (asociación) de otra llamada Fecha2, esta clase se encarga de manejar fechas. El código de la clase se muestra a continuación:

- Clase Fecha2:

//Clase para manejar fechas (DD/MM/AAAA)

package censouni;

import java.util.Calendar;import java.util.StringTokenizer;

public class Fecha2 { //atributos private int año; private int mes; private int dia; //constructores public Fecha2(int dia, int mes, int año) { this.dia=dia; this.mes=mes; this.año=año; } public Fecha2(String cadenaFecha) { StringTokenizer st = new StringTokenizer( cadenaFecha,"/" ); String dd = st.nextToken(); String mm = st.nextToken(); String aa = st.nextToken(); this.dia=Integer.parseInt(dd); this.mes=Integer.parseInt(mm); this.año=Integer.parseInt(aa); } public Fecha2() { Calendar hoy = Calendar.getInstance(); año = hoy.get(Calendar.YEAR) ; mes = hoy.get(Calendar.MONTH) + 1 ; dia = hoy.get(Calendar.DAY_OF_MONTH) ; } //métodos public String toString() {return dia + "/" + mes+ "/" + año;} public int getAño() {return this.año;} public void setAño(int a) {this.año = año;} public int getDia() {return this.dia;} public void setDia(int dia) {this.dia = dia;} public int getMes() {return this.mes;} public void setMes(int mes) {this.mes = mes;}}

56

Page 57: apuntesjava

- Clase Alumno:

package censouni;

public class Alumno extends Persona { private String titulacion; private String asignaturas; //constructor public Alumno(String p_dni, String p_nombre, Fecha2 p_fecnac,

String p_direccion, int p_tfno, String titulacion, String asignaturas) { super(p_dni, p_nombre, p_fecnac, p_direccion, p_tfno); this.titulacion = titulacion; this.asignaturas = asignaturas; } //métodos public String getTitulacion() {return this.titulacion;} public void setTitulacion(String titulacion) {this.titulacion = titulacion;} public String getAsignaturas() {return this.asignaturas;} public void setAsignaturas(String asignaturas) {this.asignaturas = asignaturas;} public String toString() {return super.toString()+" # Alumno # - Titulación: "+ this.titulacion;}}

- Clase Profesor:

package censouni;

public class Profesor extends Persona { private String departamento; private double sueldo; //constructor public Profesor(String p_dni, String p_nombre, Fecha2 p_fecnac,

String p_direccion, int p_tfno, String departamento, double sueldo) { super(p_dni, p_nombre, p_fecnac, p_direccion, p_tfno); this.departamento = departamento; this.sueldo = sueldo; } //métodos public String getDepartamento() {return this.departamento;} public void setDepartamento(String departamento) {this.departamento = departamento;} public double getSueldo() {return this.sueldo;} public void setSueldo(double sueldo) {this.sueldo = sueldo;} public String toString() {return super.toString()+" # Profesor # - Departamento: " + this.departamento;}}

- Clase Main:

Por último se muestra una clase llamada Main encargada de realizar las operaciones básicas para gestionar un censo universitario. Estas operaciones son las de alta, bajas, modificaciones y consulta de los datos de las personas censadas.

/* Aplicación CensoUni: Permite introducir, borrar y buscar personas */

package censouni;

57

Page 58: apuntesjava

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Hashtable;import java.util.NoSuchElementException;

public class Main { /** Creates a new instance of Main */ public Main() { } private static String res, res2, dni, nombre, direccion, titulacion, asignaturas, departamento; //Tabla hash private static Hashtable<String, Persona> personas = new Hashtable<String, Persona>(); private static BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); private static int tfno, op; private static double sueldo; private static Fecha2 fecnac; private static Persona objper; private static Alumno alumno; private static Profesor profe; private static String clase; /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here while (true) { try { do { System.out.println("\n\n--- Operaciones del Censo Universitario ---"); System.out.println(" 1 - Alta. "); System.out.println(" 2 - Baja. "); System.out.println(" 3 - Consulta. "); System.out.println(" 4 - Modificación. "); System.out.println(" 5 - Salir. "); System.out.println(" Seleccione la operación: (1,2,3,4,5): "); res=entrada.readLine(); } while ( !res.equals("1") && !res.equals("2") && !res.equals("3") && !res.equals("4") && !res.equals("5") ); // alta if (res.equals("1")) {alta();} // baja else if (res.equals("2")) baja(); // consulta else if (res.equals("3")) consulta(); // modificación else if (res.equals("4")) modifica(); //salir else if (res.equals("5")) System.exit(0); } catch( NumberFormatException nfe ) { System.out.println("\nError de formato numérico: " + nfe.toString()); } catch( NoSuchElementException nsee ) { System.out.println( "\nError en formato de fecha. " ); } catch( IOException ioe ) { System.out.println( "\nError de entrada/salida: " + ioe.toString() ); } catch( Exception e ) { // Captura cualquier otra excepción

58

Page 59: apuntesjava

System.out.println( e.toString() ); } } } // alta private static void alta() throws IOException { System.out.println("\n -- Alta -- "); System.out.println("Introduzca el DNI: "); dni=entrada.readLine(); System.out.println("Introduzca nombre: "); nombre=entrada.readLine(); System.out.println("Introduzca fecha de nacimiento (DD/MM/AAAA): "); fecnac=new Fecha2(entrada.readLine()); System.out.println("Introduzca dirección: "); direccion=entrada.readLine(); System.out.println("Introduzca teléfono: "); tfno=Integer.parseInt(entrada.readLine()); do { System.out.println("Introduzca categoría (1-alumno, 2-profesor): "); res=entrada.readLine(); } while ( !res.equals("1") && !res.equals("2") ); if (res.equals("1")) { System.out.println("Introduzca titulación: "); titulacion=entrada.readLine(); System.out.println("Introduzca asignaturas: "); asignaturas=entrada.readLine(); //instanciamos un alumno alumno = new Alumno(dni, nombre, fecnac, direccion, tfno, titulacion, asignaturas); //introducimos en la tabla hash. personas.put(dni, alumno); System.out.println("\nAlumno dado de alta: "+ alumno.toString()); } else { System.out.println("Introduzca departamento: "); departamento=entrada.readLine(); System.out.println("Introduzca sueldo: "); sueldo=Double.parseDouble(entrada.readLine()); //instanciamos un profesor profe = new Profesor(dni, nombre, fecnac, direccion, tfno, departamento, sueldo); //introducimos en la tabla hash. personas.put(dni, profe); System.out.println("\nProfesor dado de alta: "+ profe.toString()); } } // baja private static void baja() throws IOException { System.out.println("\n -- Baja -- "); System.out.println("Introduzca el DNI de la persona a borrar: "); dni = entrada.readLine(); //obtenemos la persona de la tabla hash. objper = personas.get(dni); if (objper != null) { personas.remove(dni); System.out.println("Persona borrada: "+ objper.toString()); } else { System.out.println(" Error: - Persona no encontrada - "); } } // consulta private static void consulta() throws IOException { System.out.println("\n -- Consulta -- ");

59

Page 60: apuntesjava

System.out.println("Introduzca el DNI de la persona: "); dni = entrada.readLine(); //obtenemos la persona de la tabla hash. objper = personas.get(dni); if (objper != null) { System.out.println("- Nombre: "+ objper.getNombre()); System.out.println("- Fecha de nacimiento: "+ objper.getFechaNac().toString()); System.out.println("- Dirección: "+ objper.getDireccion()); System.out.println("- Teléfono: "+ objper.getTfno()); //sacamos la categoría de la persona clase = objper.getClass().getName(); if (clase.equals("censouni.Alumno")) { alumno = (censouni.Alumno) objper; System.out.println("- Titulación: "+ alumno.getTitulacion()); System.out.println("- Asignaturas: "+ alumno.getAsignaturas()); } else { profe = (censouni.Profesor) objper; System.out.println("- Departamento: "+ profe.getDepartamento()); System.out.println("- Sueldo: "+ profe.getSueldo()); } } else { System.out.println(" Error: - Persona no encontrada - "); } } // modifica private static void modifica() throws IOException { System.out.println("\n -- Modificación -- "); System.out.println("Introduzca el DNI de la persona: "); dni = entrada.readLine(); //obtenemos la persona de la tabla hash. objper = personas.get(dni); if (objper != null) { System.out.println("Introduzca el dato a modificar (1-Nombre, 2-FecNac, 3-Dir, 4-Tfno, 5-Otro): "); op = Integer.parseInt(entrada.readLine()); switch(op) { case 1: System.out.println("Introduzca nuevo nombre: "); nombre=entrada.readLine(); objper.setNombre(nombre); break; case 2: System.out.println("Introduzca nueva fecha de nacimiento: "); fecnac=new Fecha2(entrada.readLine()); objper.setFechaNac(fecnac); break; case 3: System.out.println("Introduzca nueva dirección: "); direccion=entrada.readLine(); objper.setDireccion(direccion); break; case 4: System.out.println("Introduzca nuevo teléfono: "); tfno=Integer.parseInt(entrada.readLine()); objper.setTfno(tfno); break; case 5: //sacamos la categoría de la persona clase = objper.getClass().getName(); if (clase.equals("censouni.Alumno")) { alumno = (censouni.Alumno) objper; System.out.println("Introduzca el dato a modificar (1-Titulación, 2-Asignaturas): "); res2 = entrada.readLine(); if (res2.equals("1")) { System.out.println("Introduzca nueva titulación: "); titulacion=entrada.readLine();

60

Page 61: apuntesjava

alumno.setTitulacion(titulacion); } else if (res2.equals("2")) { System.out.println("Introduzca nuevas asignaturas: "); asignaturas=entrada.readLine(); alumno.setAsignaturas(asignaturas); } } else { profe = (censouni.Profesor) objper; System.out.println("Introduzca el dato a modificar (1-Dpto, 2-Sueldo): "); res2 = entrada.readLine(); if (res2.equals("1")) { System.out.println("Introduzca nuevo departamento: "); departamento=entrada.readLine(); profe.setDepartamento(departamento); } else if (res2.equals("2")) { System.out.println("Introduzca nuevo sueldo: "); sueldo=Double.parseDouble(entrada.readLine()); profe.setSueldo(sueldo); } } break; default: System.out.println("Opción incorrecta"); } System.out.println("Persona modificada: "+ objper.toString()); } else { System.out.println(" Error: - Persona no encontrada - "); } }}

61

Page 62: apuntesjava

22. Ejercicio Tienda Informática

Se pretende realizar una aplicación en Java para la gestión y venta de productos de una tienda de informática.

En la tienda se venden dos tipos de productos: ordenadores y teléfonos móviles. La información que hay que guardar de cualquier producto es un código de producto único para la tienda, el modelo, el precio y la cantidad que tienen actualmente para vender. De los ordenadores hay que guardar una cadena con las características del mismo como el procesador, la cantidad de memoria, la capacidad de su disco duro, etc. De los teléfonos móviles hay que guardar el operador que lo comercializa.

Codificar las clases que representan los productos de la tienda y una aplicación que realice las siguientes operaciones:

1. Alta de nuevos productos: Se pedirán los datos del producto y se dará de alta en la tienda.

2. Baja de productos: Se pedirá el código del producto y se dará de baja de la tienda.

3. Consulta de productos: Se pedirá el código del producto y se mostrará su información.

4. Venta de productos: Se pedirá el código del producto y la cantidad y se restará esa cantidad de la actual.

5. Reponer producto: Se pedirá el código del producto a reponer y se incrementará el valor de su cantidad.

De forma voluntaria se puede realizar la operación de modificación de los datos de algún producto.

62

Page 63: apuntesjava

Sesión 5 - 2POO Avanzada en JAVA

(Soluciones a los ejercicios)

23. Solución Banco 3

Realizar una pequeña aplicación en Java utilizando polimorfismo, como en el ejemplo anterior, para la gestión de los intereses de distintos tipos de cuentas de un banco. La aplicación se compondrá de una clase padre abstracta CuentaAbs que contendrá un método abstracto calculaInteres(double cantidad) que devolverá un double con el cálculo de los intereses aplicados a cierta cantidad de dinero. La clase CuentaAbs debe contar como mínimo con los atributos: número de cuenta (String), titular (String), saldo (double) y fecha de apertura (Calendar) y sus correspondientes métodos get y set. De la clase CuentaAbs heredarán dos clases llamadas CuentaAhorro y CuentaPlazo que implementarán el método abstracto dando un interés del 2 % la primera y un 5 % la segunda. La calse CuentaAhorro incorporará un nuevo atributo llamado numTarjCredito de tipo String y CuentaPlazo el atributo numAños de tipo int. Probar las clases con distintos objetos de los dos tipos de cuentas.

- Clase CuentaAbs:

package banco;

import java.util.Calendar;

public abstract class CuentaAbs { /** Creates a new instance of CuentaAbs */ public CuentaAbs(String numero, String titular, double saldo) { this.numero = numero; this.titular = titular; this.saldo = saldo; this.fechaApertura = Calendar.getInstance(); } private String numero; private String titular; private double saldo; private Calendar fechaApertura; public String getNumero() {return numero;} public String getTitular() {return titular;} public void setTitular(String titular) {this.titular = titular;} public double getSaldo() {return saldo;} public void setSaldo(double saldo) {this.saldo = saldo;} public Calendar getFechaApertura() {return fechaApertura;} public void setFechaApertura(Calendar fechaApertura) {this.fechaApertura = fechaApertura;} public void ingresar(double cantidad) {this.saldo += cantidad;} public void retirar(double cantidad) {this.saldo -= cantidad;} public String toString() {return "Cuenta: " + this.numero + " - " + this.titular + " - " + this.saldo;} public abstract double calculaInteres(double cantidad);}

63

Page 64: apuntesjava

- Clase CuentaAhorro :

package banco;

public class CuentaAhorro extends CuentaAbs {

/** Creates a new instance of CuentaAhorro */ public CuentaAhorro(String numero, String titular, double saldo, String numTarjetaCredito) { super(numero, titular, saldo); this.numTarjetaCredito = numTarjetaCredito; } private String numTarjetaCredito; public double calculaInteres(double cantidad){return cantidad*0.02;} public String toString() {return super.toString() + " - " + this.numTarjetaCredito;}}

- Clase CuentaPlazo:

package banco;

public class CuentaPlazo extends CuentaAbs { /** Creates a new instance of CuentaPlazo */ public CuentaPlazo(String numero, String titular, double saldo, int numAños) { super(numero, titular, saldo); this.numAños = numAños; } private int numAños; public double calculaInteres(double cantidad){return cantidad*0.05;} public String toString() {return super.toString() + " - " + this.numAños;}}

64

Page 65: apuntesjava

- Clase PruebaCuentas3:

package banco;

public class PruebaCuentas3 { public static void main(String[] args) { // TODO code application logic here CuentaAbs c1 = new CuentaAhorro("1","Pepe",100,"124236987364"); CuentaAbs c2 = new CuentaPlazo("2","Maria",200,4); c1.ingresar(200); c2.retirar(100); System.out.println(c1.toString()); double c1i = c1.calculaInteres(c1.getSaldo()) + c1.getSaldo(); double c2i = c2.calculaInteres(c2.getSaldo()) + c2.getSaldo(); System.out.println("Tu saldo de la CuentaAhorro + los intereses queda en: "+ c1i); System.out.println(c2.toString()); System.out.println("Tu saldo de la CuentaPlazo + los intereses queda en: "+ c2i); }}

24.

25. Solución Ejercicio Tienda Informática

Se pretende realizar una aplicación en Java para la gestión y venta de productos de una tienda de informática.

En la tienda se venden dos tipos de productos: ordenadores y teléfonos móviles. La información que hay que guardar de cualquier producto es un código de producto único para la tienda, el modelo, el precio y la cantidad que tienen actualmente para vender. De los ordenadores hay que guardar una cadena con las características del mismo como el procesador, la cantidad de memoria, la capacidad de su disco duro, etc. De los teléfonos móviles hay que guardar el operador que lo comercializa.

Codificar las clases que representan los productos de la tienda y una aplicación que realice las siguientes operaciones:

6. Alta de nuevos productos: Se pedirán los datos del producto y se dará de alta en la tienda.

7. Baja de productos: Se pedirá el código del producto y se dará de baja de la tienda.

8. Consulta de productos: Se pedirá el código del producto y se mostrará su información.

9. Venta de productos: Se pedirá el código del producto y la cantidad y se restará esa cantidad de la actual.

10. Reponer producto: Se pedirá el código del producto a reponer y se incrementará el valor de su cantidad.

De forma voluntaria se puede realizar la operación de modificación de los datos de algún producto.

65

Page 66: apuntesjava

66

Page 67: apuntesjava

4.1 Solución Tienda Informática

A continuación mostramos una aplicación capaz de gestionar una tienda de informática. Para ello lo primero que haremos será definir el diagrama de clases como sigue:

El código de cada una de las clases es el siguiente:

- Clase Producto:

package tienda;

public class Producto { private String codigo; private String modelo; private double precio; private int cantidad; private static int contador=0; public Producto(String modelo, double precio, int cantidad) { this.modelo = modelo; this.precio = precio; this.cantidad = cantidad; this.codigo = Integer.toString(getContador()); }

67

Page 68: apuntesjava

public static int getContador() { return contador++; } public String getCodigo() { return this.codigo; } public String getModelo() { return this.modelo; } public void setModelo(String modelo) { this.modelo = modelo; } public double getPrecio() { return this.precio; } public void setPrecio(double precio) { this.precio = precio; } public int getCantidad() { return this.cantidad; } public void sumaCantidad(int cantidad) { this.cantidad += cantidad; } public boolean restaCantidad(int cantidad) { if (this.cantidad<=cantidad) { System.out.println("No hay suficiente cantidad..."); return false; } else { this.cantidad -= cantidad; return true; } } public String toString() { return "- Codigo: "+ codigo + " - Modelo: " + modelo + "\n- Precio: " + precio + " - Cantidad: " + cantidad; } }

- Clase Ordenador:

package tienda;

public class Ordenador extends Producto { private String caracteristicas;

68

Page 69: apuntesjava

public Ordenador(String modelo, double precio, int cantidad, String caracteristicas) { super(modelo, precio, cantidad); this.caracteristicas = caracteristicas; } public String getCaracteristicas() { return this.caracteristicas; } public void setCaracteristicas(String caracteristicas) { this.caracteristicas = caracteristicas; } public String toString() { return super.toString()+"\n # Ordenador # - Características: "+ caracteristicas; } }

- Clase Movil:

package tienda;

public class Movil extends Producto { private String operador; public Movil(String modelo, double precio, int cantidad, String operador) { super(modelo, precio, cantidad); this.operador = operador; } public String getOperador() { return this.operador; } public void setOperador(String operador) { this.operador = operador; } public String toString() { return super.toString()+"\n # Movil # - Operador: "+ operador; } }

- Clase Tienda:

import java.io.*;import java.util.*;

public class Tienda { private static Hashtable<String, Producto> productos = new Hashtable<String, Producto>();

69

Page 70: apuntesjava

private static BufferedReader entrada= new BufferedReader(new InputStreamReader(System.in)); private static String codigo, modelo, caracteristicas, operador, res; private static int cantidad; private static double precio; private static Ordenador ord; private static Movil mov; private static Producto pro; /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here while (true) { try { do { System.out.println("\n\n--- Operaciones de la Tienda ---"); System.out.println(" 1 - Alta de producto. "); System.out.println(" 2 - Baja de producto. "); System.out.println(" 3 - Consulta de producto. "); System.out.println(" 4 - Venta de producto. "); System.out.println(" 5 - Reponer producto. "); System.out.println(" 6 - Modificar producto. "); System.out.println(" 7 - Salir. "); System.out.println(" Seleccione la operación: "); res=entrada.readLine(); } while ( !res.equals("1") && !res.equals("2") && !res.equals("3") && !res.equals("4") && !res.equals("5") && !res.equals("6") && !res.equals("7") ); // alta if (res.equals("1")) { alta(); } // baja else if (res.equals("2")) { baja(); } // consulta else if (res.equals("3")) { consulta(); } // venta else if (res.equals("4")) { venta(); } // reponer else if (res.equals("5")) { reponer(); }

70

Page 71: apuntesjava

// modifica else if (res.equals("6")) { modifica(); } // salir else if (res.equals("7")) System.exit(0); } catch( NumberFormatException nfe ) { System.out.println("\nError de formato numérico: " + nfe.toString()); } catch( NoSuchElementException nsee ) { System.out.println( "\nError en formato de fecha. " ); } catch( IOException ioe ) { System.out.println( "\nError de entrada/salida: " + ioe.toString() ); } catch( Exception e ) { // Captura cualquier otra excepción System.out.println( e.toString() ); } } } // alta private static void alta() throws IOException { System.out.println("\n -- Alta de producto -- "); System.out.println("Introduzca modelo producto: "); modelo=entrada.readLine(); System.out.println("Introduzca el precio del producto: "); precio=Double.parseDouble(entrada.readLine()); System.out.println("Introduzca cantidad del producto: "); cantidad=Integer.parseInt(entrada.readLine()); do { System.out.println("Introduzca tipo de producto (1-ordenador, 2-tfno. móvil): "); res=entrada.readLine(); } while ( !res.equals("1") && !res.equals("2") ); if (res.equals("1")) { System.out.println("Introduzca características ordenador: "); caracteristicas=entrada.readLine(); ord = new Ordenador(modelo, precio, cantidad, caracteristicas); codigo = ord.getCodigo(); productos.put(codigo,ord); System.out.println("\nOrdenador dado de alta: "+ ord.toString()); } else { System.out.println("Introduzca operador del móvil: "); operador=entrada.readLine(); mov = new Movil(modelo, precio, cantidad, operador); codigo = mov.getCodigo(); productos.put(codigo,mov); System.out.println("\nMóvil dado de alta: "+ mov.toString()); } } // baja private static void baja() throws IOException {

71

Page 72: apuntesjava

System.out.println("\n -- Baja de producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); pro = productos.get(codigo); if (pro != null) { productos.remove(codigo); System.out.println("\nProducto borrado."); } else { System.out.println(" Error: - Producto no encontrado - "); } } // consulta private static void consulta() throws IOException { System.out.println("\n -- Consulta de producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); pro = productos.get(codigo); if (pro != null) { System.out.println("\nInformación del Producto:\n"+pro.toString()); } else { System.out.println(" Error: - Producto no encontrado - "); } } // venta private static void venta() throws IOException { System.out.println("\n -- Venta de producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); System.out.println("Introduzca la cantidad: "); cantidad=Integer.parseInt(entrada.readLine()); pro = productos.get(codigo); if (pro != null) { if (pro.restaCantidad(cantidad)) { System.out.println("\nPrecio: "+ pro.getPrecio()*cantidad); System.out.println("Producto comprado: "+ pro.toString()); } } else { System.out.println(" Error: - Producto no encontrado - "); } } // reponer private static void reponer() throws IOException { System.out.println("\n -- Reponer producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); System.out.println("Introduzca la cantidad: "); cantidad=Integer.parseInt(entrada.readLine()); pro = productos.get(codigo); if (pro != null) { pro.sumaCantidad(cantidad); System.out.println("\nProducto repuesto: "+ pro.toString()); } else { System.out.println(" Error: - Producto no encontrado - "); }

72

Page 73: apuntesjava

} // modifica private static void modifica() throws IOException { System.out.println("\n -- Modificar producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); pro = productos.get(codigo); //sacamos el tipo de producto String tipo = pro.getClass().getName(); int op; if (tipo.equals("tienda.Ordenador")) { ord = (tienda.Ordenador) pro; System.out.println("Introduzca el dato a modificar (1-modelo, 2-precio, 3-características): "); op = Integer.parseInt(entrada.readLine()); switch(op) { case 1: System.out.println("Introduzca modelo producto: "); modelo=entrada.readLine(); ord.setModelo(modelo); break; case 2: System.out.println("Introduzca el precio del producto: "); precio=Double.parseDouble(entrada.readLine()); ord.setPrecio(precio); break; case 3: System.out.println("Introduzca características ordenador: "); caracteristicas=entrada.readLine(); ord.setCaracteristicas(caracteristicas); break; default: System.out.println("Opción incorrecta"); } } else { mov = (tienda.Movil) pro; System.out.println("Introduzca el dato a modificar (1-modelo, 2-precio, 3-operador): "); op = Integer.parseInt(entrada.readLine()); switch(op) { case 1: System.out.println("Introduzca modelo producto: "); modelo=entrada.readLine(); mov.setModelo(modelo); break; case 2: System.out.println("Introduzca el precio del producto: "); precio=Double.parseDouble(entrada.readLine()); mov.setPrecio(precio); break; case 3: System.out.println("Introduzca operador del móvil: "); operador=entrada.readLine(); mov.setOperador(operador); break; default: System.out.println("Opción incorrecta"); } } System.out.println("\nProducto modificado: "+ pro.toString()); }}

73

Page 74: apuntesjava

Sesión 5 - 3POO y Utilidades JAVA

En esta sesión realizaremos programas orientados a objetos donde utilizaremos las utilidades del lenguaje Java vistas en el capítulo 6 de teoría.

26. Ejemplos I/O

Lectura de ficheros de texto:

import java.io.*;public class LeeFichero {

public static void main(String[] args) { String cad;try {

BufferedReader br =new BufferedReader(new FileReader("ejemplo.txt"));while ((cad = br.readLine()) != null) {

System.out.println(cad);}//Cerramos el stream br.close();

} catch (IOException ioe) {System.out.println(ioe);

}}

}

Escritura de ficheros de texto:

import java.io.*;public class EscribeFichero2 {

public static void main(String[] args) { String cad1 = "Esto es una cadena.";String cad2 = "Esto es otra cadena.";

try {PrintWriter salida = new PrintWriter(new BufferedWriter(new

FileWriter("salida.txt")));salida.println(cad1);salida.println(cad2);

//Cerramos el streamsalida.close();

} catch (IOException ioe) {System.out.println("Error IO: "+ioe.toString());

}}

}

26.1 Ejercicio I/O

Tomando como referencia el código anterior para la lectura y escritura de ficheros, realizar una aplicación en la que se tomará como entrada un fichero de texto, donde cada una de sus líneas representa un producto donde el último dato es el precio sin IVA, y producirá como salida otro fichero idéntico pero con los precios con IVA.

74

Page 75: apuntesjava

Ejemplo de línea de producto:

Portátil Dell; Intel C2D 7100; 2Gb RAM; 160GB HD; nVidia GeForce 8600 GT; 15.4 Panorámico; 1000;

Nota: Para la lectura de los distintos campos de los productos se recomienda la utilización de la clase StringTokenizer o el método split de la clase String.

27. Ejercicio Tienda de Informática con Serialización

Siguiendo los ejemplos de serialización y ordenación de objetos vistos en el capítulo 6 de teoría, se pretende modificar la aplicación en Java para la gestión y venta de productos de una tienda de informática vista en el capítulo anterior.

Ampliar la aplicación para que realice las siguientes operaciones:

Serialización de los productos:Se serializarán todos los objetos de tipo producto en un fichero llamado “productos.dat”.

Recuperación de los productos:Se recuperarán todos los productos del fichero “productos.dat” y se asignarán a la tabla hash de productos utilizada en la aplicación.

Listado de los productos:Se le presentarán al usuario todos los productos ordenados por precio.

Factura de venta:Cuando se venda un producto se generará un fichero de texto con los datos del producto vendido así como la cantidad y el importe total.

De forma voluntaria se puede serializar y recuperar la variable estática contador para poder seguir asignando códigos únicos a los productos.

75

Page 76: apuntesjava

Sesión 5 - 3POO y Utilidades JAVA

(Soluciones a los ejercicios)

27.1 Ejercicio I/O

- Clase Productos:

import java.io.*;import java.text.NumberFormat;

public class Productos { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here String cad; NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(3); nf.setMinimumFractionDigits(1); try { BufferedReader br = new BufferedReader(new FileReader("productos.txt")); PrintWriter salida = new PrintWriter(new BufferedWriter(new FileWriter("productosiva.txt"))); while ((cad = br.readLine()) != null) { String[] productos = cad.split(";"); int num = productos.length; double precioiva = Double.parseDouble(productos[num-1])*1.16; System.out.println(precioiva); productos[num-1] = " " + nf.format(precioiva); for (int i=0; i<productos.length; i++) { salida.print(productos[i]); salida.print(";"); } salida.println(""); } //Cerramos los streams br.close(); salida.close(); } catch (IOException ioe) {System.out.println(ioe);} }}

28. Ejercicio Tienda de Informática con Serialización

Siguiendo los ejemplos de serialización y ordenación de objetos vistos en el capítulo 6 de teoría, se pretende modificar la aplicación en Java para la gestión y venta de productos de una tienda de informática vista en el capítulo anterior.

Ampliar la aplicación para que realice las siguientes operaciones:

Serialización de los productos:Se serializarán todos los objetos de tipo producto en un fichero llamado “productos.dat”.

76

Page 77: apuntesjava

Recuperación de los productos:Se recuperarán todos los productos del fichero “productos.dat” y se asignarán a la tabla hash de productos utilizada en la aplicación.

Listado de los productos:Se le presentarán al usuario todos los productos ordenados por precio.

Factura de venta:Cuando se venda un producto se generará un fichero de texto con los datos del producto vendido así como la cantidad y el importe total.

El código de cada una de las clases es el siguiente:

- Clase Producto:

package tiendainf;

import java.io.Serializable;

public class Producto implements Serializable { private String codigo; private String modelo; private double precio; private int cantidad; private static int contador=0; public Producto(String modelo, double precio, int cantidad) { this.modelo = modelo; this.precio = precio; this.cantidad = cantidad; this.codigo = Integer.toString(incrementaContador()); } public static int getContador() { return contador; } public static void setContador(int contador) { Producto.contador = contador; } private static int incrementaContador() { return Producto.contador++; } public String getCodigo() { return this.codigo; } public String getModelo() { return this.modelo; } public void setModelo(String modelo) { this.modelo = modelo; } public double getPrecio() { return this.precio; } public void setPrecio(double precio) { this.precio = precio; }

77

Page 78: apuntesjava

public int getCantidad() { return this.cantidad; } public void sumaCantidad(int cantidad) { this.cantidad += cantidad; } public boolean restaCantidad(int cantidad) { if (this.cantidad<=cantidad) { System.out.println("No hay suficiente cantidad..."); return false; } else { this.cantidad -= cantidad; return true; } } public String toString() { return "- Codigo: "+ codigo + " - Modelo: " + modelo + "\n- Precio: " + precio + " - Cantidad: " + cantidad; } }

- Clase Ordenador:

package tiendainf;

import java.io.Serializable;

public class Ordenador extends Producto implements Serializable { private String caracteristicas; public Ordenador(String modelo, double precio, int cantidad, String caracteristicas) { super(modelo, precio, cantidad); this.caracteristicas = caracteristicas; } public String getCaracteristicas() { return this.caracteristicas; } public void setCaracteristicas(String caracteristicas) { this.caracteristicas = caracteristicas; } public String toString() { return super.toString()+"\n # Ordenador # - Características: "+ caracteristicas; } }

- Clase Movil:

package tiendainf;

import java.io.Serializable;

public class Movil extends Producto implements Serializable { private String operador;

78

Page 79: apuntesjava

public Movil(String modelo, double precio, int cantidad, String operador) { super(modelo, precio, cantidad); this.operador = operador; } public String getOperador() { return this.operador; } public void setOperador(String operador) { this.operador = operador; } public String toString() { return super.toString()+"\n # Movil # - Operador: "+ operador; } }

- Clase Tienda:

package tiendainf;

import java.io.*;import java.util.*;

public class Tienda { private static Hashtable productos = new Hashtable(); private static BufferedReader entrada= new BufferedReader(new InputStreamReader(System.in)); private static String codigo, modelo, caracteristicas, operador, res; private static int cantidad; private static double precio; private static Ordenador ord; private static Movil mov; private static Producto pro; public static void main(String args[]) { while (true) { try { do { System.out.println("\n\n--- Operaciones de la Tienda ---"); System.out.println(" 1 - Alta de producto. "); System.out.println(" 2 - Baja de producto. "); System.out.println(" 3 - Consulta de producto. "); System.out.println(" 4 - Venta de producto. "); System.out.println(" 5 - Reponer producto. "); System.out.println(" 6 - Modificar producto. "); System.out.println(" 7 - Serializar productos. "); System.out.println(" 8 - Recuperar productos. "); System.out.println(" 9 - Listar productos. "); System.out.println(" 0 - Salir. "); System.out.println(" Seleccione la operación: "); res=entrada.readLine(); } while ( !res.equals("1") && !res.equals("2") && !res.equals("3") && !res.equals("4") && !res.equals("5") && !res.equals("6") && !res.equals("7") && !res.equals("8") && !res.equals("9") && !res.equals("0") ); if (res.equals("1")) alta();

79

Page 80: apuntesjava

else if (res.equals("2")) baja(); else if (res.equals("3")) consulta(); else if (res.equals("4")) venta(); else if (res.equals("5")) reponer(); else if (res.equals("6")) modifica(); else if (res.equals("7")) serializa(); else if (res.equals("8")) recupera(); else if (res.equals("9")) lista(); // salir else if (res.equals("0")) System.exit(0); } catch( NumberFormatException nfe ) { System.out.println("\nError de formato numérico: " + nfe.toString()); } catch( IOException ioe ) { System.out.println( "\nError de entrada/salida: " + ioe.toString() ); } catch( Exception e ) { // Captura cualquier otra excepción System.out.println( e.toString() ); } } } // alta private static void alta() throws IOException { System.out.println("\n -- Alta de producto -- "); System.out.println("Introduzca modelo producto: "); modelo=entrada.readLine(); System.out.println("Introduzca el precio del producto: "); precio=Double.parseDouble(entrada.readLine()); System.out.println("Introduzca cantidad del producto: "); cantidad=Integer.parseInt(entrada.readLine()); do { System.out.println("Introduzca tipo de producto (1-ordenador, 2-tfno. móvil): "); res=entrada.readLine(); } while ( !res.equals("1") && !res.equals("2") ); if (res.equals("1")) { System.out.println("Introduzca características ordenador: "); caracteristicas=entrada.readLine(); ord = new Ordenador(modelo, precio, cantidad, caracteristicas); codigo = ord.getCodigo(); productos.put(codigo,ord); System.out.println("\nOrdenador dado de alta: "+ ord.toString()); } else { System.out.println("Introduzca operador del móvil: "); operador=entrada.readLine(); mov = new Movil(modelo, precio, cantidad, operador); codigo = mov.getCodigo(); productos.put(codigo,mov); System.out.println("\nMóvil dado de alta: "+ mov.toString()); } } // baja private static void baja() throws IOException { System.out.println("\n -- Baja de producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); pro = (Producto) productos.get(codigo); if (pro != null) { productos.remove(codigo); System.out.println("\nProducto borrado."); } else { System.out.println(" Error: - Producto no encontrado - "); } }

80

Page 81: apuntesjava

// consulta private static void consulta() throws IOException { System.out.println("\n -- Consulta de producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); pro = (Producto) productos.get(codigo); if (pro != null) { System.out.println("\nInformación del Producto:\n"+pro.toString()); } else { System.out.println(" Error: - Producto no encontrado - "); } } // venta private static void venta() throws IOException { System.out.println("\n -- Venta de producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); System.out.println("Introduzca la cantidad: "); cantidad=Integer.parseInt(entrada.readLine()); pro = (Producto) productos.get(codigo); if (pro != null) { if (pro.restaCantidad(cantidad)) { System.out.println("\nPrecio: "+ pro.getPrecio()*cantidad); System.out.println("Producto comprado: "+ pro.toString()); //generamos la factura del producto generarFactura(pro, cantidad); } else System.out.println("No hay stock."); } else { System.out.println(" Error: - Producto no encontrado - "); } } // generar factura private static void generarFactura(Producto pro, int cant) throws IOException { PrintWriter salida = new PrintWriter(new BufferedWriter(new FileWriter("factura.txt"))); salida.println("------------------------ Factura Venta -----------------------"); salida.println("\n"); salida.println(pro.toString()); salida.println("\n"); salida.println("\n"); salida.println("--------------------------------------------------------------"); salida.println("\n"); salida.println("\tCantidad: "+cant); salida.println("\tPrecio: "+pro.getPrecio()*cant); salida.println("\n"); salida.println("--------------------------------------------------------------"); salida.close(); } // reponer private static void reponer() throws IOException { System.out.println("\n -- Reponer producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); System.out.println("Introduzca la cantidad: "); cantidad=Integer.parseInt(entrada.readLine()); pro = (Producto) productos.get(codigo); if (pro != null) { pro.sumaCantidad(cantidad); System.out.println("\nProducto repuesto: "+ pro.toString());

81

Page 82: apuntesjava

} else { System.out.println(" Error: - Producto no encontrado - "); } } // modifica private static void modifica() throws IOException { System.out.println("\n -- Modificar producto -- "); System.out.println("Introduzca el código del producto: "); codigo = entrada.readLine(); pro = (Producto) productos.get(codigo); if (pro == null) { System.out.println(" Error: - Producto no encontrado - "); return; } //sacamos el tipo de producto String tipo = pro.getClass().getName(); int op; if (tipo.equals("Ordenador")) { ord = (Ordenador) pro; System.out.println("Introduzca el dato a modificar (1-modelo, 2-precio, 3-características): "); op = Integer.parseInt(entrada.readLine()); switch(op) { case 1: System.out.println("Introduzca modelo producto: "); modelo=entrada.readLine(); ord.setModelo(modelo); break; case 2: System.out.println("Introduzca el precio del producto: "); precio=Double.parseDouble(entrada.readLine()); ord.setPrecio(precio); break; case 3: System.out.println("Introduzca características ordenador: "); caracteristicas=entrada.readLine(); ord.setCaracteristicas(caracteristicas); break; default: System.out.println("Opción incorrecta"); } } else { mov = (Movil) pro; System.out.println("Introduzca el dato a modificar (1-modelo, 2-precio, 3-operador): "); op = Integer.parseInt(entrada.readLine()); switch(op) { case 1: System.out.println("Introduzca modelo producto: "); modelo=entrada.readLine(); mov.setModelo(modelo); break; case 2: System.out.println("Introduzca el precio del producto: "); precio=Double.parseDouble(entrada.readLine()); mov.setPrecio(precio); break; case 3: System.out.println("Introduzca operador del móvil: "); operador=entrada.readLine(); mov.setOperador(operador); break; default: System.out.println("Opción incorrecta"); } } System.out.println("\nProducto modificado: "+ pro.toString()); } // serializa

82

Page 83: apuntesjava

private static void serializa() throws IOException { System.out.println("\n -- Serializar productos -- "); System.out.println("Estás seguro (S/N):"); String res = entrada.readLine().toUpperCase(); if (res.equals("S")){ //Serialización de la tabla hash de productos y el contador FileOutputStream fosPro = new FileOutputStream("productos.dat"); ObjectOutputStream oosPro = new ObjectOutputStream(fosPro); oosPro.writeObject(productos); Integer cont = new Integer(Producto.getContador()); oosPro.writeObject(cont); fosPro.close(); System.out.println("\n Productos serializados..."); } } // recupera private static void recupera() throws IOException { System.out.println("\n -- Recuperar productos -- "); FileInputStream fisPro = new FileInputStream("productos.dat"); ObjectInputStream oisPro = new ObjectInputStream(fisPro); try { while (true) { productos = (Hashtable) oisPro.readObject(); Integer ci = (Integer) oisPro.readObject(); Producto.setContador(ci.intValue()); } } catch (EOFException e) { System.out.println("Lectura de productos finalizada..."); System.out.println(productos.toString()); } catch (ClassNotFoundException cnf) { System.out.println("Error de clase: " + cnf.toString()); } fisPro.close(); } // lista private static void lista() throws IOException { System.out.println("\n -- Listar productos -- "); //Comparador para ordenar los productos por precio Comparator PreProComp = new Comparator() { public int compare(Object o1, Object o2) { Producto pro1 = (Producto) o1; Producto pro2 = (Producto) o2; Double p1 = new Double(pro1.getPrecio()); Double p2 = new Double(pro2.getPrecio()); return p1.compareTo(p2); } }; //Convertimos la tabla hash en un array de objetos Object productosA[] = productos.values().toArray(); //Ordenamos los objetos del array por el atributo Precio Arrays.sort(productosA, PreProComp); //Presentamos la información int i; System.out.println("\nProductos ordenadas por Precio:"); for (i=0; i<productosA.length; i++) System.out.println(productosA[i].toString()); }}

83

Page 84: apuntesjava

Sesión 6Diseño de Aplicaciones con Interfaz Gráfica mediante

SWING

29. Ejemplos SwingLo primero que haremos será crear un proyecto llamado SwingGUI donde meteremos todos nuestros ejemplos y ejercicios.

29.1 BOTONES

La primera aplicación que haremos consistirá en una ventana con una caja de texto en la que se introducirá un texto que copiaremos en otra caja mediante la pulsación de un botón. Para realizarla tenemos que crear en el proyecto un nuevo fichero de tipo JFrame.

84

Proyecto NetBeansPuedes descargarte el proyecto LTP-Sesion6-SwingGUI y tras descomprimirlo, cargarlo directamente en NetBeans.

Page 85: apuntesjava

85

Page 86: apuntesjava

Para realizar la aplicación tendremos que ir arrastrando componentes a la ventana. NetBeans nos proporciona un Layout propio que irá situando los componentes en el contenedor en las posiciones y tamaños que nosotros deseemos. Situaremos un JLabel con el texto correspondiente, dos JTextField (en uno de ellos no se permite la edición) y dos botones.

Para el tratamiento de los eventos, pulsamos con el botón derecho del ratón en cada uno de los botones y seleccionamos “Events – Action – actionPerformed” y rellenamos con el código en negrita.

En las propiedades del JFrame debemos poner como título de la ventana “BotonesTexto” y desmarcar la casilla “resizable” y en el código seleccionar “Generate Resize Code”.

86

Page 87: apuntesjava

Código final: package gui;

public class BotonesTexto extends javax.swing.JFrame { /** Creates new form BotonesTexto */ public BotonesTexto() { initComponents(); } // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jTextField2 = new javax.swing.JTextField();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("BotonesTexto"); setResizable(false); jLabel1.setText("Introduce un texto y pulsa Copiar");

jButton1.setText("Copiar"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } });

jButton2.setText("Borrar"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } });

jTextField2.setEditable(false);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addGap(39, 39, 39) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jButton2) .addGap(51, 51, 51))) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 152, Short.MAX_VALUE) .addGap(52, 52, 52)) .addGroup(layout.createSequentialGroup()

87

Page 88: apuntesjava

.addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(61, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup() .addComponent(jButton1) .addContainerGap()))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(52, 52, 52) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(31, 31, 31) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton2) .addComponent(jButton1)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 21, Short.MAX_VALUE) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(22, 22, 22)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-425)/2, (screenSize.height-225)/2, 425, 225); }// </editor-fold> //BORRAR private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: jTextField1.setText(""); jTextField2.setText(""); } //COPIAR private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: String txt = jTextField1.getText();

if (txt.equals("")) JOptionPane.showMessageDialog(this,"Rellene el texto.","Mensaje",JOptionPane.INFORMATION_MESSAGE); jTextField2.setText(txt); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new BotonesTexto().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; // End of variables declaration

88

Page 89: apuntesjava

}

Ejercicio: Escribir un programa que represente una ventana que contenga dos cajas de texto y dos botones, uno etiquetado con “MAYÚSCULAS” y otro con “minúsculas”. Cuando se pulse el botón de mayúsculas se deberá convertir el contenido de la primera caja de texto a mayúsculas y si se pulsa el otro a minúsculas y presentarlo en la segunda caja de texto. Si no hay texto se debe presentar un mensaje de error.

29.2 LISTAS

En este ejemplo utilizaremos las listas como componentes principales. Para realizarlo tenemos que crear en el proyecto un nuevo fichero de tipo JFrame.En la ventana de aplicación pondremos un JLabel con el texto correspondiente, un JComboBox, un JList y un JTextField (no se permite la edición).

Para dar los datos iniciales de las listas debemos abrir sus propiedades y editar el campo “Model”.

89

Page 90: apuntesjava

Para el tratamiento de los eventos, pulsamos con el botón derecho del ratón en cada una de las listas y seleccionamos: para el JComboBox “Events – Action – actionPerformed” y para el JList “Events – ListSelection – valueChanged”, por último, rellenamos con el código en negrita.

Código final: package gui;public class Listas extends javax.swing.JFrame { /** Creates new form Listas */ public Listas() { initComponents(); } // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jComboBox1 = new javax.swing.JComboBox(); jScrollPane1 = new javax.swing.JScrollPane(); jList1 = new javax.swing.JList(); jTextField1 = new javax.swing.JTextField();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Listas"); setResizable(false); jLabel1.setText("Selecciona Marca y Equipamiento");

jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Citroen", "Fiat", "Ford", "Opel", "Peugeot", "Renault" })); jComboBox1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jComboBox1ActionPerformed(evt); } });

jList1.setModel(new javax.swing.AbstractListModel() { String[] strings = { "ABS", "Aire Ac.", "Air-Bag", "Dir. Asist.", "EE", "Pintura Met.", "MP3" }; public int getSize() { return strings.length; } public Object getElementAt(int i) { return strings[i]; } });

90

Page 91: apuntesjava

jList1.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jList1ValueChanged(evt); } }); jScrollPane1.setViewportView(jList1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(41, 41, 41) .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 155, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(40, 40, 40)) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 277, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(47, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(75, 75, 75) .addComponent(jLabel1) .addContainerGap(101, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(27, 27, 27) .addComponent(jLabel1) .addGap(8, 8, 8) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(39, 39, 39)) .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 19, Short.MAX_VALUE) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(21, 21, 21)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-350)/2, (screenSize.height-275)/2, 350, 275);

91

Page 92: apuntesjava

}// </editor-fold>

private void jList1ValueChanged(javax.swing.event.ListSelectionEvent evt) { // TODO add your handling code here: //borramos texto e inicializamos equipamiento jTextField1.setText(""); equipamiento = " - "; //capturamos los items seleccionados // y los convertimos en cadena Object equipo_selec[] = jList1.getSelectedValues(); for(int j=0;j<equipo_selec.length;++j) equipamiento += equipo_selec[j]+" - "; //presentamos la selección de marca y equipamiento jTextField1.setText(marca_selec+equipamiento); } private String marca_selec, equipamiento; private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: //borramos texto jTextField1.setText(""); //deseleccionamos el equipamiento jList1.clearSelection(); //capturamos la marca seleccionada marca_selec = "Marca: "+(String)jComboBox1.getSelectedItem()+" # "; jTextField1.setText(marca_selec); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Listas().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JComboBox jComboBox1; private javax.swing.JLabel jLabel1; private javax.swing.JList jList1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField jTextField1; // End of variables declaration }

Ejercicio: Escribir un programa que represente una ventana que contenga dos cajas de texto y una lista desplegable con las opciones “MAYÚSCULAS” y “minúsculas”. Cuando se pulse la opción de mayúsculas se deberá convertir el contenido de la primera caja de texto a mayúsculas y si se pulsa la otra a minúsculas y a continuación presentarla en la segunda caja de texto.

29.3 LISTAS DINÁMICAS

En este ejemplo utilizaremos las listas como componentes principales, pero en este caso las opciones que aparecen en las listas se recogerán de ficheros de texto para poder hacer cambios de forma dinámica. Para realizarlo tenemos que crear en el proyecto un nuevo fichero de tipo JFrame.

92

Page 93: apuntesjava

En la ventana de aplicación pondremos un JLabel con el texto correspondiente, un JComboBox, un JList y un JTextField (no se permite la edición).

Para dar los datos iniciales de las listas debemos abrir sus propiedades y programar el campo “Model”. Pulsamos el botón Advanced y rellenamos como se muestra a continuación:

Para el tratamiento de los eventos, pulsamos con el botón derecho del ratón en cada una de las listas y seleccionamos: para el JComboBox “Events – Action – actionPerformed” y para el JList “Events – ListSelection – valueChanged”, por último, rellenamos con el código en negrita.

Código final: package gui;

93

Page 94: apuntesjava

import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.Vector;import javax.swing.JComboBox;

/** * * @author SALVAPORT */public class ListasDin extends javax.swing.JFrame { /** Creates new form ListasDin */ public ListasDin() { initComponents(); jComboBox1.setSelectedIndex(0); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jComboBox1 = new javax.swing.JComboBox(); jTextField1 = new javax.swing.JTextField(); jScrollPane1 = new javax.swing.JScrollPane(); jList1 = new javax.swing.JList();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setResizable(false); jLabel1.setFont(new java.awt.Font("Tahoma", 0, 18)); jLabel1.setText("Selecciona una marca de portatil y extras:");

getMarcas(); jComboBox1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jComboBox1ActionPerformed(evt); } });

jTextField1.setEditable(false);

getExtras(); jList1.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jList1ValueChanged(evt); } });

jScrollPane1.setViewportView(jList1);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(36, 36, 36) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1)

94

Page 95: apuntesjava

.addGroup(layout.createSequentialGroup() .addGap(22, 22, 22) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 307, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(41, 41, 41) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 166, Short.MAX_VALUE))))) .addGap(36, 36, 36)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(59, 59, 59) .addComponent(jLabel1) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(45, 45, 45) .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGap(22, 22, 22) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGap(30, 30, 30) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(56, Short.MAX_VALUE)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-416)/2, (screenSize.height-336)/2, 416, 336); }// </editor-fold> private String marca_selec, extras; private void jList1ValueChanged(javax.swing.event.ListSelectionEvent evt) { // TODO add your handling code here: //borramos texto e inicializamos equipamiento jTextField1.setText(""); extras = " - "; //capturamos los items seleccionados // y los convertimos en cadena Object extras_selec[] = jList1.getSelectedValues(); for(int j=0;j<extras_selec.length;++j) extras += extras_selec[j]+" - "; //presentamos la selección de marca y equipamiento jTextField1.setText(marca_selec+extras); } private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: //borramos texto jTextField1.setText(""); //deseleccionamos el equipamiento jList1.clearSelection();

95

Page 96: apuntesjava

//capturamos la marca seleccionada marca_selec = "Marca: "+(String)jComboBox1.getSelectedItem()+" # "; jTextField1.setText(marca_selec); } // rellenamos las opciones de la lista desplegable private void getMarcas() { String cad; Vector marcas = new Vector(); try { BufferedReader br = new BufferedReader(new FileReader("marcas.txt")); while ((cad = br.readLine()) != null) { marcas.add(cad); } //Cerramos el stream br.close(); jComboBox1 = new JComboBox(marcas); } catch (IOException ioe) { System.out.println(ioe); } } // rellenamos las opciones de la lista private void getExtras() { String cad; Vector extras = new Vector(); try { BufferedReader br = new BufferedReader(new FileReader("extras.txt")); while ((cad = br.readLine()) != null) { extras.add(cad); } //Cerramos el stream br.close(); jList1.setListData(extras); } catch (IOException ioe) { System.out.println(ioe); } } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new ListasDin().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JComboBox jComboBox1; private javax.swing.JLabel jLabel1; private javax.swing.JList jList1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField jTextField1; // End of variables declaration }

30. Ejercicio Calculadora Swing

96

Page 97: apuntesjava

Escribir un programa en Java que permita realizar las operaciones típicas de una calculadora: suma, resta, multiplicación y división. El usuario introducirá el operando 1 el 2 y luego seleccionará la operación a realizar, mostrando el resultado correspondiente. También debe tener la posibilidad de convertir de pesetas a euros y viceversa. El programa deberá tratar todos los posibles errores en tiempo de ejecución, dando un mensaje con un diálogo de error.

El aspecto gráfico del programa puede ser como el siguiente:

31. Ejercicio Censo

El segundo ejercicio consiste en la gestión de un censo donde tenemos los datos de una serie de personas. Las operaciones que se pueden hacer en la aplicación serán las típicas de este tipo de SI, es decir, altas, bajas, modificaciones y consultas. Utilizaremos una clase Persona que nos servirá como base de la aplicación y que tendrá como atributos el DNI, el nombre, la dirección y el teléfono.

A continuación se presentan unas pantallas de la aplicación a modo de ejemplo.

97

Page 98: apuntesjava

98

Page 99: apuntesjava

Sesión 7Diseño de clases con UML y

generación de código en JAVA

32. UML EN NETBEANS

Para poder realizar diagramas UML en NetBeans es necesario descargarse los módulos de UML e instalarlos ya que por defecto no viene preinstalado. Para realizarlo seleccionar en el menú Tools – Update Center. Una vez presentados todos los módulos seleccionar los de UML.

33. DISEÑO DE CLASES

33.1 Ejemplo POO Cuentas

En este ejemplo completo de POO crearemos un sistema bancario muy sencillo donde gestionaremos las cuentas y los clientes de un banco.

99

Page 100: apuntesjava

Para empezar crearemos el diagrama de clases UML en NetBeans. Para ello seleccionamos la creación de un nuevo proyecto de tipo UML como se muestra en la figura siguiente:

Daremos al nombre del proyecto “Banco” y seleccionaremos el diagrama de clases al que llamaremos “BancoDC”:

Una vez creado el proyecto podemos diseñar las clases que formarán parte del sistema, en nuestro caso tendremos dos clases: los clientes del banco y sus cuentas.

100

Page 101: apuntesjava

Los clientes tendrán como atributos: DNI, nombre, dirección, teléfono y cuentas (asociación con las cuentas que posee en el banco); y como métodos los “getters” y “setters” de los atributos.

Las cuentas tendrán como atributos: número, saldo y clientes (asociación con los clientes que poseen la cuenta en el banco); y como métodos además de los “getters” y “setters” de los atributos, los métodos ingresar(cantidad) y retirar(cantidad).

Para que en la asociación aparezcan los nombres de los atributos asociados y la multiplicidad hay que pulsar con el botón derecho del ratón en la asociación y seleccionar en “Labels”: “Both End Names” y “Both End Multiplicities”.

101

Page 102: apuntesjava

Para completar la asociación debemos rellenar varios de sus apartados como la multiplicidad 1..*, marcar la navegabilidad y poner nombre a los atributos de la asociación como se muestra en la siguiente pantalla:

102

Page 103: apuntesjava

El siguiente paso para completar el sistema será generar el código en Java de las clases (botón derecho del ratón en el proyecto y “Generate Code”), completarlo y probar el sistema. Para ello creamos un nuevo proyecto en NetBeans como sigue:

103

Page 104: apuntesjava

Una vez generado el proyecto completamos el código como sigue:

- Clase Cliente:

import java.util.ArrayList;

public class Cliente { private String DNI; private String nombre; private String direccion; private int tfno; private ArrayList<Cuenta> cuentas; public Cliente(String dni, String nombre, String direccion, int tfno) { this.DNI = dni; this.nombre = nombre; this.direccion = direccion; this.tfno = tfno; cuentas = new ArrayList(); } public String getDNI() { return DNI; } public void setDNI(String val) { this.DNI = val; } public String getNombre() { return nombre; }

104

Page 105: apuntesjava

public void setNombre(String val) { this.nombre = val; } public String getDireccion() { return direccion; } public void setDireccion(String val) { this.direccion = val; } public int getTfno() { return tfno; } public void setTfno(int val) { this.tfno = val; } public ArrayList<Cuenta> getCuentas() { return cuentas; } //añadir un conjunto de cuentas public void setCuentas(ArrayList<Cuenta> val) { this.cuentas = val; } //añadir una cuenta public void setCuenta(Cuenta c) { cuentas.add(c); } //información de las cuentas public String getInfoCuentas() { return cuentas.toString(); } //información del cliente public String toString() { return "Cliente " + DNI + " - " + nombre; } }

105

Page 106: apuntesjava

- Clase Cuenta:

import java.util.ArrayList;

public class Cuenta { private String numero; private double saldo; private ArrayList<Cliente> clientes; public Cuenta(String numero, double saldo) { this.numero = numero; this.saldo = saldo; clientes = new ArrayList(); } public String getNumero() { return numero; } public void setNumero(String val) { this.numero = val; } public double getSaldo() { return saldo; } public void setSaldo(double val) { this.saldo = val; } public void ingresar(double cantidad) {

this.saldo += cantidad; } public void retirar(double cantidad) { this.saldo -= cantidad; } public ArrayList<Cliente> getClientes() { return clientes; } //añadir un conjunto de clientes public void setClientes(ArrayList<Cliente> val) { this.clientes = val; } //añadir un cliente public void setCliente(Cliente c) { clientes.add(c); } //información de los clientes public String getInfoClientes() { return clientes.toString(); } //información de la cuenta public String toString() { return "Cuenta " + numero + " - " + saldo; } }

106

Page 107: apuntesjava

Para probar el código creamos una nueva clase de tipo “Java Main Class” llamada PruebaBanco.

- Clase PruebaBanco:

public class PruebaBanco { /** Creates a new instance of PruebaBanco */ public PruebaBanco() { } /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Cliente cli1 = new Cliente("12345678A", "Salva", "dir", 987654321); Cuenta cu1 = new Cuenta("1", 3000); Cuenta cu2 = new Cuenta("2", 20000); cli1.setCuenta(cu1); cli1.setCuenta(cu2); cu1.setCliente(cli1); cu2.setCliente(cli1); System.out.println(cli1.toString()); System.out.println(cli1.getInfoCuentas()); } }

34. INGENIERÍA INVERSA

En este apartado aprenderemos a generar un esquema de clases a partir de código Java. Lo primero que debemos hacer es comprobar que el código sea correcto, para ello lo primero es compilarlo y verificar que no tiene errores.

Vamos a tomar como ejemplo la aplicación del Censo Universitario visto en la sesión 5-2.

34.1 Opción 1

Podemos definir el diagrama de clases a partir del código fuente de la aplicación creando un nuevo proyecto como el siguiente:

107

Page 108: apuntesjava

108

Page 109: apuntesjava

34.2 Opción 2

Otra manera de hacerlo de forma directa es desde el proyecto que queremos realizar la ingeniería inversa pulsar el botón derecho del ratón en el paquete y seleccionar Reverse Engineer:

Una vez generado el proyecto podremos crear el diagrama de clases a partir del código fuente de las clases que forman la aplicación, para ello pulsaremos con el botón derecho del ratón en “censouni” dentro del modelo y seleccionaremos “Create Diagram From Selected Elements“.

109

Page 110: apuntesjava

110

Page 111: apuntesjava

El resultado final será el siguiente:

111