Sunteți pe pagina 1din 91

JAVA Java es un lenguaje de programacin creado por Sun Microsystems para poder funcionar en distintos tipos de procesadores.

Su sintaxis es muy parecida a la de C o C++, e incorpora como propias algunas caractersticas que en otros lenguajes son extensiones: gestin de hilos, ejecucin remota, etc. El cdigo Java, una vez compilado, puede llevarse sin modificacin alguna sobre cualquier mquina, y ejecutarlo. Esto se debe a que el cdigo se ejecuta sobre una mquina hipottica o virtual, la Java Virtual Machine, que se encarga de interpretar el cdigo (ficheros compilados .class) y convertirlo a cdigo particular de la CPU que se est utilizando (siempre que se soporte dicha mquina virtual). Cuando se programa con Java, se dispone de antemano de un conjunto de clases ya implementadas. Estas clases (aparte de las que pueda hacer el usuario) forman parte del propio lenguaje (lo que se conoce como API (Application Programming Interface) de Java). Tipos de datos Se tienen los siguientes tipos de datos simples. Adems, se pueden crear complejos, todos los cuales sern subtipos de Object .
Tipo Byte Short Int Long Float Double Char String Bolean true / false Tamao/Formato 8 bits, complemento a 2 16 bits, complemento a 2 32 bits, complemento a 2 64 bits, complemento a 2 32 bits, IEEE 754 64 bits, IEEE 754 16 bits, carcter Descripcin Entero de 1 byte Entero corto Entero Entero largo Real simple precisin Real doble precisin Carcter simple Cadena de caracteres verdadero / falso Ejemplos 210, 0x456 " " " 3.12, 3.2E13 " 'a' "cadena" true, false

Identificadores Nombran variables, funciones, clases y objetos. Comienzan por una letra, carcter de subrayado _ o smbolo $. El resto de caracteres pueden ser letras o dgitos (o _). Se distinguen maysculas de minsculas, y no hay longitud mxima. Las variables en Java slo son vlidas desde el punto donde se declaran hasta el final de la sentencia compuesta (las llaves) que la engloba. No se puede declarar una variable con igual nombre que una de mbito exterior. En Java se tiene tambin un trmino NULL, pero si bien el de C es con maysculas (NULL), ste es con minsculas (null): String a = null; ... if (a == null)...

______________________________________________________________________ FISI UNMSM Luis Guerra G. 1

Operadores Se muestra una tabla con los operadores en orden de precedencia:

Operador . [] () ++ , --

Ejemplo a.length a[6] (a + b) a++; b--

Descripcin Campo o mtodo de objeto Referencia a elemento de array Agrupacin de operaciones Autoincremento / Autodecremento de 1 unidad Negacin / Complemento Indica si a es del tipo TipoDato Multiplicacin, divisin y resto de divisin entera Suma y resta Desplazamiento de bits a izquierda y derecha Comparaciones (mayor, menor, igual, distinto...) AND, OR y XOR lgicas AND y OR condicionales Condicional: si a entonces b , si no c Asignacin. a += b equivale a (a = a + b)

!, ~ instanceof *, /, % +, <<, >> <, >, <=, >=, ==, != &, |, ^ &&, || ?: =, +=, -=, *=, /= ...

!a ; ~b a instanceof TipoDato a*b; b/c; c%a a+b; b-c a>>2; b<<1 a>b; b==c; c!=a a&b; b|c a&&b; b||c a?b:c a=b; b*=c

1. Clase, Objeto, Campos, Mtodos

______________________________________________________________________ FISI UNMSM Luis Guerra G. 2

Conceptos de la POO, veremos los conceptos de clase, atributo y operacin usando notacin UML; luego su implementacin utilizando Java, donde se conoce como clase, campo y mtodo. Definicin de una clase Una clase define un tipo de objeto en particular. Por ejemplo, en una empresa la clase Factura define a todas las facturas que la empresa emite. Su sintaxis en Java es: [ModificadorClase] class NombreClase { // Campos // Mtodos } El ModificadorClase se resume en el siguiente cuadro: Palabra Clave public abstract Descripcin Define una clase como pblica; en caso contrario su visibilidad ser solamente a nivel del paquete donde se encuentra. Esta palabra clave determina que la clase no puede ser instanciada; es decir no podemos crear objetos de este tipo de clase. Final Este tipo de clase solo puede ser heredada. Esta palabra clave determina que la clase no puede ser heredada, quiere decir que no podemos crear subclases de este tipo de clase. Este tipo de clase solo puede ser instanciada.

Ejemplo: class Factura { // Campos private int numero; private double importe; // Mtodos ______________________________________________________________________ FISI UNMSM Luis Guerra G. 3

public void grabar () { ... ... } } // Factura Representacin UML de una Clase Para tener una representacin grfica de una clase se utiliza UML (Unified Modeling Language), tal como se ilustra en la figura:

Figura 1: Representacin UML de una clase

Declaracin de Objetos El operador new se utiliza para crear un objeto de un tipo de clase especfica, es decir, que asigne memoria para el objeto. Para utilizar el operador new tenemos dos sintaxis. Sintaxis 1 NombreDeClase nombreDeVariable; nombreDeVariable = new NombreDeClase ( ); En la primera instruccin se define la variable que apuntar a un objeto que se crea en la segunda instruccin. Sintaxis 2 NombreDeClase nombreDeVariable = new NombreDeClase ( ); En este caso tanto la creacin de la variable y la creacin del objeto se realizan en la misma instruccin.

______________________________________________________________________ FISI UNMSM Luis Guerra G. 4

Figura 2: Instanciacin de una clase (Creacin de un objeto)

Asignacin de Objetos Cuando creamos un objeto internamente existe un puntero al que no tenemos acceso, pero cuando asignamos objetos, lo que realmente estamos asignando son las direcciones de memoria donde estn definidos los objetos, como se explica en la figura 3.

Figura 3: Asignacin de objetos

TRABAJANDO CON CAMPOS Definicin Los campos definen los datos de un objeto; cuando definimos una clase debemos definirlos y establecer su visibilidad: La visibilidad determina desde que parte del cdigo se puede acceder al campo. Sintaxis: [TipoAcceso] [ModificadorCampo] Tipo nombreCampo [= ValorInicial]; El TipoAcceso puede tomar los valores que se resume en el siguiente cuadro: Palabra Clave public abstract Descripcin Indica que el campo es de acceso pblico. El acceso se realiza a travs de una instancia del objeto. Indica que solo se puede acceder al campo desde mtodos de la misma clase y clases derivadas Final (subclases) Indica que solo se puede acceder al campo desde mtodos de la misma clase. Sin especificar ______________________________________________________________________ FISI UNMSM Luis Guerra G. 5 UML + # -

El ModificadorCampo puede tomar los valores que se resumen en el siguiente cuadro: Palabra Clave static Final Descripcin El campo pertenece a la clase, no a los objetos creados a partir de ella. El campo es una constante, en ese caso debe tener un valor inicial obligatoriamente. Por convenio en java las transient volatile constantes se escriben en maysculas. Marca el campo como transitorio, para no ser serializado. Se usa cuando se trabaja con java beans. Es un campo accedido de forma asncrona mediante hilos, con este modificador se lo notificamos a java. El ValorInicial permite inicializar la variable con un valor. De acuerdo a la forma en que se especifica un atributo, objetos de otras clases tienen distintas posibilidades de accederlos, tal como se resume en el siguiente cuadro: Acceso Desde La propia clase Subclase en el mismo paquete Otras clases en el mismo paquete Subclases en otros paquetes Otras clases en otros paquetes Ocultando los Datos Uno de los fundamentos de la programacin orientada a objetos es que el usuario solo debe tener acceso a los datos que le son de su inters, y del modo que le corresponde, por ejemplo solo lectura, solo escritura, ambos. Para conseguir esto se debe declarar los atributos como privados, y se debe implementar mtodos para acceder a ellos. Existe un estndar para definir estos mtodos, por ejemplo, si el campo es nombre los mtodos son: - setNombre Este mtodo permite asignar un valor al campo. - getNombre Este mtodo permite leer el valor del campo. Como puede apreciar existen dos prefijos, el prefijo set que se utiliza para asignar un valor al campo y el prefijo get para leer el valor del campo; de esta manera podemos seleccionar si se implementa el mtodo set, get, ambos, y restringir el nivel de acceso a los datos. private protected Si Si No Si No No No Si No No public Si Si Si Si Si (package) Si Si Si No No

Los paquetes permiten organizar clases segn su naturaleza.

______________________________________________________________________ FISI UNMSM Luis Guerra G. 6

Otra posibilidad que nos da la implementacin de estos mtodos es de poder agregar funcionalidad que puede servir para verificar, por ejemplo, si el dato que se est signando es correcto no. Ejemplo: En este ejemplo se lustra el uso de los mtodos set y get. class Factura { // Campos private int numero; // Mtodos set y get public void setNumero (int numero) { this.numero = numero; } public int getNumero ( ) { return this.numero; } . . . . . . } // Factura Como puede apreciar en el cdigo, el mtodo setNumero se utiliza para asignar un valor al campo numero, mientras que el mtodo getNumero se utiliza para leer su valor. Es posible agregar lgica en cualquiera de los dos mtodos, o en ambos si el caso lo amerita. TRABAJANDO CON MTODOS Definicin Los mtodos definen el comportamiento de un objeto de una clase concreta y tienen las siguientes caractersticas: Agrupan las responsabilidades del objeto (competencias). Describen sus acciones.

Las acciones realizadas por un objeto son consecuencia directa de un estmulo externo (un mensaje enviado desde otro objeto) y dependen del estado del objeto. El estado y comportamiento de un objeto estn relacionados. Por ejemplo, un avin no puede aterrizar (accin) sino est en vuelo (estado). ______________________________________________________________________ FISI UNMSM Luis Guerra G. 7

Sintaxis: [TipoAcceso] [ModificadorMtodo] Tipo NombreMtodo ( [ ListaDeParmetros ] ) // Cuerpo de mtodo } El TipoAcceso puede tomar los valores que se resumen en el siguiente cuadro: Palabra Clave Public Protected Descripcin Indica que el mtodo es de acceso pblico. El acceso se realiza a travs de una instancia del objeto. Indica que solo se puede acceder al mtodo desde mtodos de la misma clase y clases derivadas private sin especificar (subclases) Indica que solo se puede acceder al mtodo desde mtodos de la misma clase. Indica visibilidad de paquete, se puede acceder al mtodo a travs de una instancia, pero slo desde clases que se encuentren en el mismo paquete. El ModificadorMtodo puede tomar los valores que se resumen en el siguiente cuadro: Palabra Clave static Final transient volatile Descripcin El mtodo pertenece a la clase, no a los objetos creados a partir de ella. El mtodo es definido como mtodo definitivo, esto quiere decir que no se puede redefinir en una subclase. Determina que el mtodo no se implementa en la clase, su implementacin ser en las clases heredadas o subclases. Permiten sincronizar varios threads para el caso en que dos o ms accedan concurrentemente a los mismos datos. El Tipo determina el tipo de dato que debe retornar el mtodo, puede ser cualquier tipo vlido, incluso los tipos de clases creados por el programador. Si el mtodo no retorna ningn valor se debe especificar void. Los parmetros son opcionales, pero si son necesarios se deben especificar de la siguiente manera: Tipol parmetro1, tipo2 parametro2, ... ; Los parmetros son variables que reciben valores de los argumentos que se le pasan al mtodo cuando ste es invocado. ______________________________________________________________________ FISI UNMSM Luis Guerra G. 8 UML + # {

Los mtodos que son de un tipo diferente de void, deben retornan un valor a la instruccin que realiza la llamada mediante la instruccin return, utilizando la siguiente sintaxis: return expresin; Donde expresin representa el valor que retorna el mtodo. Sobrecarga de Mtodos Un mtodo se identifica por su nombre, la cantidad de parmetros y el tipo de sus parmetros; esto constituye la firma del mtodo (signature). La sobrecarga permite tener varios mtodos con igual nombre pero con diferente forma, o sea, con diferente cantidad de parmetros y diferentes tipos de datos de sus parmetros. Los mtodos tendrn comportamientos diferentes segn el tipo de dato, cantidad de parmetros o ambos. Al invocar un mtodo, el compilador busca en la clase el mtodo que corresponda a los argumentos de la invocacin. Un ejemplo ilustrativo lo tenemos con el mtodo valueOf de la clase String. A continuacin tenemos su implementacin en Java: public class Clasel { // Mtodos sobrecargados public void Operacin1 () // Implementacin } public void Operacion1 (int Param1) { // Implementacin } public void Operacion1 (String Param1) { // Implementacin } public int Operacion1 (int Param1, String Param2) { // Implementacin return 0; } public String Operacion1 (long Param1, String Param2) { // Implementacin return null; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 9 {

} } // Clase1 Ejemplo: Supongamos que queremos un mtodo que sume dos nmeros, podras necesitar que sume dos nmeros de tipo int o double; entonces debemos implementar dos mtodos con el mismo nombre por que se trata de la misma operacin, podra ser sumar, pero con diferentes tipos de datos de sus parmetros, tal como se lustra a continuacin: package egcc; public class Matematica { public int sumar (int n1, int n2) { int suma; suma = n1 + n2; return suma; } public double sumar (double n1, doble n2 double suma; suma = n1 + n2; return suma; } } // Matemtica Cuando usamos la clase Matemtica el IDE nos permite visualizar los diversos mtodos que estn sobrecargados: Matematica obj=new Matematica(); System.out.println(obj.sumar(.)); EJEMPLO Una institucin financiera necesita de un programa que le permita encontrar el importe que deben pagar sus clientes por los prstamos que realiza, se sabe que se trata de un inters compuesto, capitalizare mensualmente. La formula que debe aplicarse es: M= C(1+i)n Donde: C : Capital ______________________________________________________________________ FISI UNMSM Luis Guerra G. 10

I n M

: : :

Tasa de inters por periodo, por ejemplo puede ser mensual Nmero de periodos Importe acumulado en el nmero de periodos

Abstraccin A continuacin tenemos algunas alternativas de abstraer el problema. Caso 01 En este caso los atributos son pblicos (visibilidad publica) lo tanto se puede acceder de manera directa desde cualquier otra clase u objeto. El mtodo calcularlmporte hace el clculo en funcin al valor de los campos capital, inters y periodo. Caso 02 En este caso tenemos un solo mtodo que tiene tres parmetros, a travs de los cuales recibe los datos para hacer el clculo y retorna el resultado correspondiente. Banco
+ calcularImporte(capital: double, interes : double, periodos : int) : Double

Banco + capital : double + interes : double + periodo : int + calcularImporte()

por

______________________________________________________________________ FISI UNMSM Luis Guerra G. 11

package tpagoxPrestamo; public class Banco { private double capital; private double interes; private int periodos; public void setCapital(double capital){ this.capital=capital; } public double getCapital(){ return this.capital; } public void setInteres(double interes){ this.interes=interes; } public double getInteres(){ return this.interes; } public void setPeriodos(int periodos){ this.periodos=periodos; } public int getPeriodos(){ return this.periodos; } public double getImporte(){ double importe; importe=this.getCapital()*Math.pow((1+this.getInteres()),this.getPeriodos()); return importe; } }

______________________________________________________________________ FISI UNMSM Luis Guerra G. 12

public class Principal extends javax.swing.JFrame { /** Creates new form Principal */ public Principal() { initComponents(); } private void btnCalcularActionPerformed(java.awt.event.ActionEvent evt) { double capital=Double.parseDouble(this.txtCapital.getText()); double interes=Double.parseDouble(this.txtInteres.getText()); int periodos=Integer.parseInt(this.txtPeriodos.getText()); //Instanciar la clase Banco tpagoxPrestamo.Banco objBanco=new tpagoxPrestamo.Banco(); //Proceso objBanco.setCapital(capital); objBanco.setInteres(interes); objBanco.setPeriodos(periodos); double importe=objBanco.getImporte(); //Redondear importe a dos decimales importe =importe*100; importe=Math.round(importe); importe=importe/100; //resultado this.txtImporte.setText(String.valueOf(importe)); } private void btnLimpiarActionPerformed(java.awt.event.ActionEvent evt) { this.txtCapital.setText(""); this.txtInteres.setText(""); this.txtPeriodos.setText(""); this.txtImporte.setText(""); } private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Principal().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton btnCalcular; private javax.swing.JButton btnCerrar; private javax.swing.JButton btnLimpiar; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JTextField txtCapital;

______________________________________________________________________ FISI UNMSM Luis Guerra G. 13

private javax.swing.JTextField txtImporte; private javax.swing.JTextField txtInteres; private javax.swing.JTextField txtPeriodos; // End of variables declaration }

Referencia: Desarrollando soluciones con Java y MySql. Eric Gustavo Coronel. Captulo 3

Ejemplo Dada la clase persona con los atributos: nombre, edad, generar dos instancias de la clase: alumno, profesor; y los mtodos: para asignar nombre nombre, edad, y luego visualizar dichos datos. public class Persona { //privados: String nombre; int edad; //publicos: public void AsignarNombre(String nom){ nombre=nom; } public void AsignarEdad(int e){ edad=e; } public String ObtenerNombre(){ return nombre; } public int ObtenerEdad(){ return edad; } public static void main(String[] args) { Persona alumno=new Persona(); ______________________________________________________________________ FISI UNMSM Luis Guerra G. 14

Persona profesor=new Persona(); alumno.AsignarNombre("Miguel"); alumno.AsignarEdad(20); profesor.AsignarNombre("Jos"); System.out.println("Nombre del alumno:"+alumno.ObtenerNombre()); System.out.println("edad del alumno:"+alumno.ObtenerEdad()); System.out.println("Nombre del profesor:"+profesor.ObtenerNombre()); } } ****************************** Ejemplo 2 public class CComputador { String marca; String procesador; boolean computadorencendido=true; public void encendercomputador() { if(computadorencendido==true) System.out.println("\n computador encendido"); else System.out.println("\n computador apagado"); } public void estado() { System.out.println("\n Estado del computador:"+"\n Marca:" +marca+ "\n procesador:" +procesador); if(computadorencendido==true) System.out.println("\n computador encendido"); else System.out.println("\n computador apagado"); } public static void main(String[] args) { CComputador computador1=new CComputador(); computador1.marca="DELL"; computador1.procesador="Core 2 duo"; computador1.encendercomputador(); computador1.estado(); } }

Inicializacin y Constructores
public class cRectangulo { ______________________________________________________________________ FISI UNMSM Luis Guerra G. 15

private float x1,y1,x2,y2; public static void main(String[] args) { cRectangulo prueba=new cRectangulo(); System.out.println(prueba.CalcularArea()); cRectangulo prueba1=new cRectangulo(1,4,7,6); System.out.println(prueba1.CalcularArea()); } public cRectangulo() { x1=0; y1=0; x2=0; y2=0; } public cRectangulo(float ex1, float ey1,float ex2, float ey2) { x1=ex1; y1=ey1; x2=ex2; y2=ey2; } public float CalcularArea() { return (x2-x1)*(y2-y1); } }

2. Lectura de datos en Java Lectura de un dato entero en Java


Clase Leer: import java.io.*;

public class Leer {


public static void main(java.lang.String[] args) { // Inserte aqu cdigo para iniciar la aplicacin. int dato_int=0; System.out.print("Ingrese un dato entero : "); dato_int=Leer.datoInt(); System.out.println("El numero ingresado fue : "+dato_int); } //Mtodo datoInt : public static int datoInt() { return Integer.parseInt(dato()); } //Mtodo dato:

______________________________________________________________________ FISI UNMSM Luis Guerra G. 16

public static String dato() { String sdato=""; try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader flujoE = new BufferedReader(isr); sdato=flujoE.readLine(); } catch (IOException e) { System.err.println("ERROR:"+e.getMessage()); } return sdato; }

Leer un caracter desde el teclado


import java.io.*; public class leercaracter { public static void main(String[] args) { int n; try{ System.out.print("Dato(Caracter o letra): "); n=System.in.read(); // Leer caracter desde teclado System.out.println("Dato ingresado: "+(char)n); // Visualiza el caracter } catch(IOException e){ System.err.println("Error: "+e.getMessage()); } } }

Leer y mostrar un caracter desde el teclado


import java.io.*; public class LeerMostrarCaracter { public static void main(String[] args) { char opcion; InputStreamReader isr=new InputStreamReader(System.in); BufferedReader flujoE=new BufferedReader(isr); PrintStream flujoS=System.out; try{

______________________________________________________________________ FISI UNMSM Luis Guerra G. 17

do{ flujoS.print("Continuar<s/n>: "); opcion=(char)flujoE.read(); flujoE.readLine(); //Limpiar caracteres: \r\n //flujoS.print("Opcion ingresada:"+opcion); System.out.println("Opcion ingresada: "+opcion); }while(opcion!='n'); } catch(IOException e){ System.out.println("Error:"+e.getMessage()); } } }

Leer los datos de un arreglo entero en Java


Clase ALeer import java.io.*;

public class ALeer {


public static void main(java.lang.String[] args) { int nElementos; System.out.print("Numero de elementos del arreglo: "); nElementos=ALeer.datoInt(); int[] m=new int[nElementos]; int i=0,j=0; System.out.print("Valores del arreglo: "); for(i=0;i<nElementos;i++) { j=i+1; System.out.print("m["+j+"]="); m[i]=ALeer.datoInt(); } System.out.println(); for(i=0;i<nElementos;i++) { j=i+1; System.out.println("m["+j+"]="+m[i]); } } //Mtodo datoInt public static int datoInt() { return Integer.parseInt(dato()); } //Mtodo dato public static String dato() { String sdato=""; try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader flujoE = new BufferedReader(isr); sdato=flujoE.readLine(); } catch (IOException e) {

______________________________________________________________________ FISI UNMSM Luis Guerra G. 18

System.err.println("ERROR:"+e.getMessage()); } return sdato;

} Leer una cadena de caracteres o un texto


Utilizando flujo de caracteres de entrada: flujoE, y, para imprimir, referencia al flujo estndar de salida: flujoS. import java.io.*; public class leerunacadena_u_fe_fs { public static void main(String[] args) { //Definir un flujo de caracteres de entrada: flujoE InputStreamReader isr=new InputStreamReader(System.in); BufferedReader flujoE=new BufferedReader(isr); //Definir una referencia al flujo estandar de salida: flujoS PrintStream flujoS=System.out; String sdato; try{ flujoS.print("Ingrese un texto: "); sdato=flujoE.readLine(); flujoS.println("Texto ingresado: "+sdato); } catch(IOException e){ System.err.println("Error:"+e.getMessage()); } } }

EJERCICIO
1. Programa en Java para leer datos de alumnos: cdigo, nombre, edad, nacionalidad y notas; hallar el promedio de las notas, y mensaje de aprobado o desaprobado.

import java.io.*;

public class CAlumno {


public static void main(java.lang.String[] args) { // Inserte aqu cdigo para iniciar la aplicacin. int cod; String nom; int edad,cant,i; String nac; double nota1,nota2,nota3,prom; System.out.print("Ingrese la cantidad de alumnos:"); cant=Leer.datoInt(); for(i=0;i<cant;i++) { System.out.println("Alumno["+(i+1)+"] "); System.out.print("codigo["+(i+1)+"]:"); cod=Leer.datoInt(); System.out.print("Nombre["+(i+1)+"]:"); nom=Leer.dato(); System.out.print("Edad["+(i+1)+"]:"); edad=Leer.datoInt(); System.out.print("Nacionalidad["+(i+1)+"]:"); nac=Leer.dato(); //INGRESE LAS NOTAS

______________________________________________________________________ FISI UNMSM Luis Guerra G. 19

System.out.print("Nota [1]: "); nota1=Leer.datoDouble(); System.out.print("Nota [2]: "); nota2=Leer.datoDouble(); System.out.print("Nota [3]: "); nota3=Leer.datoDouble(); //PROMEDIO prom=(nota1+nota2+nota3)/3; if(prom>=10.5){ System.out.print("El promedio de "+nom+"es :"+prom+" APROBADO"); } else { System.out.print("El promedio de "+nom+"es :"+prom+".DESAPROBADO"); } System.out.println(); } }

} import java.io.*; public class Leer {


//Mtodo datoInt : public static int datoInt() { return Integer.parseInt(dato()); } // datoDouble public static double datoDouble() { return Double.parseDouble(dato()); } //Mtodo dato: public static String dato() { String sdato=""; try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader flujoE = new BufferedReader(isr); sdato=flujoE.readLine(); } catch (IOException e) { System.err.println("ERROR:"+e.getMessage()); } return sdato; }

Ejercicios Propuestos 1. Realizar un programa que muestre una clase para representar nmeros racionales. Por ejemplo: el nmero racional 1/3 representado por un nmero fraccionario sera 0,333333, ______________________________________________________________________ FISI UNMSM Luis Guerra G. 20

Valor mas fcil de manipular, pero a costa de perder precisin. Evidentemente, 1/3 * 3 = 1, pero 0,333333 * 3 = 0,999999; para esto se recomiendo utilizar dos mtodos: uno para asignar datos y el otro para visualizar los datos. 2. Realizar un programa que utilice objetos de una clase ecuacin para evaluar las ecuaciones de la forma: ax3 + bx2 + cx + d 3. Implementar una clase bancaria simule el comportamiento bsico de una cuenta abierta en una entidad bancaria cualquiera. Para esto se tiene en cuenta los siguientes datos como: inters, ingresar dinero, retirar dinero, saldo actual, despus de abonado el inters. 4. Realizar una aplicacin que d como resultado los intereses producidos y el capital total acumulado de una cantidad c, invertida en un inters r durante t das. La formula a utilizar es: I = c*r*t 360*100 5. Realizar una aplicacin que d como resultado las soluciones reales x1 y x2 de una ecuacin de segundo grado, de la forma: ax2 + bx + c = 0 Las soluciones de una ecuacin de segundo grado viene dadas por la formula:

4ac

2a

6. Realizar un programa que a travs de un men permita realizar las operaciones de sumar, restar, multiplicar, dividir y salir. Las operaciones constarn solamente de dos operandos. El men ser visualizado por un mtodo sin argumentos, que devolver como resultado la opcin elegida. 7. Realizar un programa que calcule e imprima la suma de los mltiplos de 5 comprendidos entre dos valores a y b. El programa permitir introducir valores negativos para a y b, y verificar que a es menor que b. si a es mayor que b, intercambiar estos valores. 8. Realizar un programa que lea una lista de nombres y los almacene en una matriz. Una vez construida la matriz, visualizaremos su contenido. 9. Realizar un programa que lea una lista de valores introducidas por el teclado. A continuacin, y sobre las listas, buscar los valores mximo y mnimo, y escribirlos. 10. Realizar un programa que los peso e imprima el histograma correspondiente. Suponer que los pesos estn comprendidos entre los valores 10 y 100 Kg. En el histograma slo aparecer los pesos que se corresponden con 1 o mas alumnos. 11. Utilizando el mtodo random de la clase Math del paquete java.lang, realizar un programa que muestre 6 nmeros aleatorios entre 1 y 49 ordenados ascendentemente. 12. Realizar un programa que partiendo de dos matrices de cadenas de caracteres clasificadas en orden ascendente, construya y visualice una tercera matriz tambin clasificada en orden ascendente; est tercera matriz ser el resultado de la fusin de las dos primeras matrices. ______________________________________________________________________ FISI UNMSM Luis Guerra G. 21

13. Escribir un programa que calcule la serie:

e = 1 + x! + x! + x! + ... 1 2 3
x

Para un valor de x dado, se calcularn y se sumarn trminos sucesivos de la serie, hasta que el ltimo trmino sumado sea menor o igual que una constante de error predeterminada (por ejemplo 1 e-7). 14. Elaborar un programa de directorios telefnicos est aplicacin mostrar un men que presentar las operaciones que se pueden realizar sobre la lista de telfonos. Como Aadir, Buscar, Buscar Siguiente, Eliminar y salir; pero despus de realizada una de las opciones deber regresar al men principal. 15. Elaborar un programa que permita operar con nmeros racionales en: la suma, resta, multiplicacin, divisin, si son iguales, si es mayor o menor, que acepte entrar tanto negativos como positivos. 16. Construir una clase llamada Luz que simule una luz de semforo. El atributo color de la clase debe cambiar de Verde a Amarillo y a Rojo y de nuevo regresar a Verde mediante la funcin Cambio. Cuando se crea un objeto Luz, su color inicial ser Rojo.

Acceso en Java usando los mtodos getXXX( ), setXXX( ), operador this


Asignar y mostrar el nombre y nmero de dni de una persona public class PruebaPersona { public static void main(String[] args) { Persona persona1=new Persona(); persona1.setNombre("Misael"); persona1.setDni("15645459"); System.out.println("El nombre de persona1 es: "+persona1.getNombre()); System.out.println("y su numero de DNI es : "+persona1.getDni()); } } public class Persona { private String nombre,dni; public void setNombre(String nom) { nombre=nom; } public String getNombre() { return nombre; } public void setDni(String dni) { ______________________________________________________________________ FISI UNMSM Luis Guerra G. 22

this.dni=dni; } public String getDni() { return this.dni; } } Arreglos Bidimensionales (Matrices) Declaracin: tipo identificador[][]; o bien: tipo[][] identificador; Creacin: Utilizando el operador new. matriz = new tipo [filas][columnas]; Ejemplo: int[][] temperaturas = new int[12][30]; ************************* matriz[ndice1][ndice2] ************************* En Java el ndice de la primera componente de un vector es 0 , por lo que matriz[0][0], ser el primer elemento de la matriz. El tamao del arreglo puede obtenerse utilizando la propiedad: length matriz.length : nos da el nmero de filas matriz[0].length : nos da el nmero de columnas Ejemplo
Dada una matriz de reales de dos dimensiones, visualizar la suma de cada fila de la matriz. public class sumafilasdeunamatriz { public static void main(String[] args) { int nfilas, ncols; // filas y columnas de la matriz do { System.out.print("Nmero de filas de la matriz: "); nfilas = Leer.datoInt(); } while (nfilas < 1); // no permitir un valor negativo do { System.out.print("Nmero de columnas de la matriz: "); ncols = Leer.datoInt(); } while (ncols < 1); // no permitir un valor negativo

______________________________________________________________________ FISI UNMSM Luis Guerra G. 23

float[][] m = new float[nfilas][ncols]; // crear la matriz m int fila = 0, col = 0; // subndices float sumafila = 0; // suma de los elementos de una fila System.out.println("Introducir los valores de la matriz."); for (fila = 0; fila < nfilas; fila++) { for (col = 0; col < ncols; col++) { System.out.print("m[" + fila + "][" + col + "] = "); m[fila][col] = Leer.datoFloat(); } } // Visualizar la suma de cada fila de la matriz System.out.println(); for (fila = 0; fila < nfilas; fila++) { sumafila = 0; for (col = 0; col < ncols; col++) sumafila += m[fila][col]; System.out.println("Suma de la fila " + fila + ": " + sumafila); } System.out.println("\nFin del proceso."); } }

Arreglo de objetos
Cuando el tipo de dato de un arreglo es una clase, hablamos de arreglo de objetos, donde cada elemento del arreglo es un objeto. Ejemplo: Alumno[ ] ca; //Un arreglo de objetos de la clase Alumno (arreglo de registros de alumno) public class Alumno { String codigo; String nombre; int promediofinal; public Alumno(){ } .. .. } // Registro de datos de un alumno

Ejercicios usando arreglo de objetos 1.Definir un vector de objetos de la clase Alumno, esta clase contiene el cdigo, nombre y nota, adems los mtodos para ingresar y presentar los datos. 2. Con el vector de objetos del ejercicio 1, presentar los Alumnos de un curso y generar el promedio de la nota del curso. Ejemplo usando arreglo de objetos ______________________________________________________________________ FISI UNMSM Luis Guerra G. 24

Generar una lista de telfonos. La lista debe ser un objeto que encapsula la matriz de objetos persona, la clase CPersona define los atributos privados nombre, direccin, telfono relativos a una persona, mtodos respectivos que en un men de opciones permita: aadir, eliminar y buscar en una lista. ///////////////////////////////////////////////////////////////// // Ejemplo para trabajar con matriz de objetos // import java.io.*; public class Test { public static void main(String[] args) { // Definir un flujo de caracteres de entrada: flujoE InputStreamReader isr = new InputStreamReader(System.in); BufferedReader flujoE = new BufferedReader(isr); // Definir una referencia al flujo estndar de salida: flujoS PrintStream flujoS = System.out; // Crear un objeto lista de telfonos vaco (con cero elementos) CListaTfnos listatfnos = new CListaTfnos(); int opcion = 0, pos = -1; String cadenabuscar = null; String nombre, direccion; long telefono; boolean eliminado = false; do { try { opcion = menu(); switch (opcion) { case 1: // buscar flujoS.print("conjunto de caracteres a buscar "); cadenabuscar = flujoE.readLine(); pos = listatfnos.buscar(cadenabuscar, 0); if (pos == -1) if (listatfnos.longitud() != 0) flujoS.println("bsqueda fallida"); else flujoS.println("lista vaca"); else { flujoS.println(listatfnos.valorEn(pos).obtenerNombre()); flujoS.println(listatfnos.valorEn(pos).obtenerDireccion()); flujoS.println(listatfnos.valorEn(pos).obtenerTelefono()); } break; case 2: // buscar siguiente pos = listatfnos.buscar(cadenabuscar, pos + 1); if (pos == -1) if (listatfnos.longitud() != 0) flujoS.println("bsqueda fallida"); else ______________________________________________________________________ FISI UNMSM Luis Guerra G. 25

flujoS.println("lista vaca"); else { flujoS.println(listatfnos.valorEn(pos).obtenerNombre()); flujoS.println(listatfnos.valorEn(pos).obtenerDireccion()); flujoS.println(listatfnos.valorEn(pos).obtenerTelefono()); } break; case 3: // aadir flujoS.print("nombre: "); nombre = flujoE.readLine(); flujoS.print("direccin: "); direccion = flujoE.readLine(); flujoS.print("telfono: "); telefono = Leer.datoLong(); listatfnos.aadir(new CPersona(nombre, direccion, telefono)); break; case 4: // eliminar flujoS.print("telfono: "); telefono = Leer.datoLong(); eliminado = listatfnos.eliminar(telefono); if (eliminado) flujoS.println("registro eliminado"); else if (listatfnos.longitud() != 0) flujoS.println("telfono no encontrado"); else flujoS.println("lista vaca"); break; case 5: // salir listatfnos = null; } } catch (IOException ignorada) {} } while(opcion != 5); } public static int menu() { System.out.print("\n\n"); System.out.println("1. Buscar"); System.out.println("2. Buscar siguiente"); System.out.println("3. Aadir"); System.out.println("4. Eliminar"); System.out.println("5. Salir"); System.out.println(); System.out.print(" Opcin: "); int op; do op = Leer.datoInt(); while (op < 1 || op > 5); return op; } } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 26

///////////////////////////////////////////////////////////////// // Definicin de la clase CListaTfnos. // public class CListaTfnos { private CPersona[] listaTelefonos; // matriz de objetos private int nElementos; // nmero de elementos de la matriz public CListaTfnos() { // Crear una lista vaca nElementos = 0; listaTelefonos = new CPersona[nElementos]; } /** * Method unElementoMas * @param listaActual */ private void unElementoMas(CPersona[] listaActual) { nElementos = listaActual.length; listaTelefonos = new CPersona[nElementos + 1]; // Copiar la lista actual for ( int i = 0; i < nElementos; i++ ) listaTelefonos[i] = listaActual[i]; nElementos++; } /** * Method unElementoMenos * @param listaActual */ private void unElementoMenos(CPersona[] listaActual) { if (listaActual.length == 0) return; int k = 0; nElementos = listaActual.length; listaTelefonos = new CPersona[nElementos - 1]; // Copiar la lista actual for ( int i = 0; i < nElementos; i++ ) if (listaActual[i] != null) listaTelefonos[k++] = listaActual[i]; nElementos--; } /** * Method ponerValorEn * @param i * @param objeto */ public void ponerValorEn(int i, CPersona objeto) { if (i >= 0 && i < nElementos) ______________________________________________________________________ FISI UNMSM Luis Guerra G. 27

listaTelefonos[i] = objeto; else System.out.println("ndice fuera de lmites"); } /** * Method valorEn * @param i */ public CPersona valorEn(int i) { if (i >= 0 && i < nElementos) return listaTelefonos[i]; else { System.out.println("ndice fuera de lmites"); return null; } } /** * Method longitud */ public int longitud() { return nElementos; } /** * Method aadir */ public void aadir(CPersona obj) { unElementoMas(listaTelefonos); ponerValorEn( nElementos - 1, obj ); } /** * Method eliminar */ public boolean eliminar(long tel) { // Buscar el telfono y eliminar registro for ( int i = 0; i < nElementos; i++ ) if (listaTelefonos[i].obtenerTelefono() == tel) { listaTelefonos[i] = null; unElementoMenos(listaTelefonos); return true; } return false; } /** ______________________________________________________________________ FISI UNMSM Luis Guerra G. 28

* Method buscar * @param str * @param pos * @return */ public int buscar(String str, int pos) { String nom; if (str == null) return -1; if (pos < 0) pos = 0; for ( int i = pos; i < nElementos; i++ ) { nom = listaTelefonos[i].obtenerNombre(); if (nom == null) continue; // str est contenida en nom? if (nom.indexOf(str) > -1) return i; } return -1; } } ///////////////////////////////////////////////////////////////// // Definicin de la clase CPersona // public class CPersona { // Atributos private String nombre; private String direccion; private long telefono; public CPersona() {} public CPersona(String nom, String dir, long tel) { nombre = nom; direccion = dir; telefono = tel; } /** * Method asignarNombre */ public void asignarNombre(String nom) { nombre = nom; } /** * Method obtenerNombre */ public String obtenerNombre() { return nombre; } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 29

/** * Method asignarDireccion */ public void asignarDireccion(String dir) { direccion = dir; } /** * Method obtenerDireccion */ public String obtenerDireccion() { return direccion; } /** * Method asignarTelefono */ public void asignarTelefono(long tel) { telefono = tel; } /** * Method obtenerTelefono */ public long obtenerTelefono() { return telefono; } } ///////////////////////////////////////////////////////////////// // Definicin de la clase Leer // import java.io.*; public class Leer { public static int datoInt() { return Integer.parseInt(dato()); } public static String dato() { String sdato=""; try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader flujoE = new BufferedReader(isr); sdato=flujoE.readLine(); } catch (IOException e) { System.err.println("ERROR:"+e.getMessage()); } return sdato; } public static long datoLong() { ______________________________________________________________________ FISI UNMSM Luis Guerra G. 30

return Long.parseLong(dato()); } }

Relacin entre clases


Ejemplo de Composicin y dependencia Construir una aplicacin que permita pintar un tringulo en la pantalla. La aplicacin debe permitir que el usuario introduzca los datos del tringulo: coordenada x del vrtice superior, coordenada y del vrtice superior, base, altura, seleccin del color a travs de un combobox en un formulario, usando la siguiente relacin de clases:

FormularioTriangulo -int verticesuperiorx -int verticesuperiory -int base -int altura -Color color -JLabel verticesuperiorLabel -JLabel verticesuperiorLabel -JLabel baseLabel -JLabel alturaLabel -JLabel colorLabel -String verticesuperiorxString -String verticesuperioryString -String baseString -String alturaString -String colorString -JTextField verticesuperiorxTextField -JTextField verticesuperioryTextField -JTextField baseTextField -JTextField alturaTextField -JComboBox colorField +FormularioTriangulo() +obtenerVerticeSuperiorx() +obtenerVerticeSuperiory() +obtenerBase() +obtenerAltura() +obtenerColor()

Triangulo Ventana -Triangulo triangulo +Ventana() -asignarLookAndFeel() -setCloseClick() +paint(entrada Graphics g) +main(entrada String[] args) -int verticesuperiorx -int verticesuperiory -int base -int altura -Color color -boolean haydatos +Triangulo() +paint(entrada Graphics g) +mover(entrada int desplazamientox, entrada int desplazamientoy) +ampliar(entrada int zoomout) +reducir(entrada int zoomin) +borrar()

Fig. 1. Diagrama de clases para pintar un Tringulo En JCreator: File-New-Project //Clase Ventana public class Ventana { public static void main(String[] args) { // Create application frame. VentanaFrame frame = new VentanaFrame(); // Show frame. frame.setVisible(true); } } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 31

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class VentanaFrame extends JFrame { private Triangulo triangulo; /** * The constructor */ public VentanaFrame() { //Pintar la ventana vaca setTitle("Pintar Triangulo "); asignarLookAndFeel(); setCloseClick(); setExtendedState(MAXIMIZED_BOTH); setVisible(true); //Crear un triangulo y aadirlo a la ventana triangulo=new Triangulo(); getContentPane().add(triangulo); //Repintar la ventana con el triangulo pack(); setExtendedState(MAXIMIZED_BOTH); repaint(); } private void asignarLookAndFeel() { //Forzar el Look and Feel de la ventana al del sistema String laf = UIManager.getSystemLookAndFeelClassName(); try { UIManager.setLookAndFeel(laf); } catch (UnsupportedLookAndFeelException exc) {System.err.println("Unsupported: " + laf);} catch (Exception exc) {System.err.println("Error cargando: " + laf);} } private void setCloseClick() { //Controlar el cierre de la ventana addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); } public void paint (Graphics g) { super.paint(g); if (triangulo!=null) triangulo.paint(g); ______________________________________________________________________ FISI UNMSM Luis Guerra G. 32

} } // Clase JPanel: Triangulo import javax.swing.JPanel; import java.awt.*; import javax.swing.*; public class Triangulo extends JPanel { private int verticesuperiorx; private int verticesuperiory; private int base; private int altura; private Color color; private boolean haydatos=false; public Triangulo() { //Mostrar el formulario para obtener //los datos del triangulo FormularioTriangulo formulario=new FormularioTriangulo(); JDialog dialog =new JDialog(); dialog.setTitle("Introduzca los datos del triangulo"); dialog.setModal(true); dialog.setContentPane(formulario); dialog.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE); dialog.pack(); dialog.show(); // Obtener los datos introducidos por el usuario verticesuperiorx=formulario.obtenerVerticeSuperiorx(); verticesuperiory=formulario.obtenerVerticeSuperiory(); base=formulario.obtenerBase(); altura=formulario.obtenerAltura(); color=formulario.obtenerColor(); haydatos=true; } public void paint(Graphics g) { int [] coordenadasx=getCoordenadasX(); int [] coordenadasy=getCoordenadasY(); super.paint(g); //Si el usuario ha introducido los datos pinta el triangulo if (haydatos){ g.setColor(color); g.drawPolygon(coordenadasx, coordenadasy, 3); g.fillPolygon(coordenadasx, coordenadasy, 3); g.dispose(); } } private int [] getCoordenadasX() { int [] coordenadasx = new int [3]; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 33

coordenadasx[0]=verticesuperiorx; coordenadasx[1]=verticesuperiorx-(base/2); coordenadasx[2]=verticesuperiorx+(base/2); return coordenadasx; } private int [] getCoordenadasY() { int [] coordenadasy= new int[3]; coordenadasy[0]=verticesuperiory; coordenadasy[1]=verticesuperiory+altura; coordenadasy[2]=verticesuperiory+altura; return coordenadasy; } public void mover(int desplazamientox, int desplazamientoy) { verticesuperiorx = verticesuperiorx + desplazamientox; verticesuperiory = verticesuperiory + desplazamientoy; } public void ampliar(int zoomin) { if (zoomin > 0){ base= base * zoomin; altura=altura*zoomin; } } public void reducir(int zoomout) { if (zoomout > 0){ base = base / zoomout; altura = altura / zoomout; } } public void borrar() { //Pintarme del color del fondo de la ventana color= this.getBackground(); repaint(); } } // Clase JPanel: FormularioTriangulo import javax.swing.JPanel; import java.awt.*; import java.awt.event.*; import javax.swing.*; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 34

public class FormularioTriangulo extends JPanel { //Valores de los cuadros de texto private int verticesuperiorx; private int verticesuperiory; private int base; private int altura; private Color color; //Etiquetas de los campos de texto private JLabel verticesuperiorxLabel; private JLabel verticesuperioryLabel; private JLabel baseLabel; private JLabel alturaLabel; private JLabel colorLabel; //Textos de las etiquetas private static String verticesuperiorxString = "Coordenada x del vrtice superior: "; private static String verticesuperioryString = "Coordenada y del vrtice superior: "; private static String baseString = "Base: "; private static String alturaString = "Altura: "; private static String colorString = "Color: "; //Campos de texto y combo para introducir los datos private JTextField verticesuperiorxTextField; private JTextField verticesuperioryTextField; private JTextField baseTextField; private JTextField alturaTextField; private JComboBox colorField; public FormularioTriangulo() { //crear las etiquetas verticesuperiorxLabel = new JLabel(verticesuperiorxString); verticesuperioryLabel= new JLabel(verticesuperioryString); baseLabel= new JLabel(baseString); alturaLabel= new JLabel(alturaString); colorLabel= new JLabel(colorString); //crear los campos de texto verticesuperiorxTextField = new JTextField(5); verticesuperioryTextField= new JTextField(5); baseTextField= new JTextField(5); alturaTextField= new JTextField(5); //crear el combo de colores String [] colorValues= {"Azul","Naranja","Verde","Rojo","Amarillo","Gris"}; colorField = new JComboBox(colorValues); colorField.setEditable(false); //Asignar las etiquetas a los campos de texto verticesuperiorxLabel.setLabelFor(verticesuperiorxTextField); verticesuperioryLabel.setLabelFor(verticesuperioryTextField); ______________________________________________________________________ FISI UNMSM Luis Guerra G. 35

baseLabel.setLabelFor(baseTextField); alturaLabel.setLabelFor(alturaTextField); colorLabel.setLabelFor(colorField); //Distribuir las etiqueta en un panel JPanel labelPane = new JPanel(); labelPane.setLayout(new GridLayout(0, 1)); labelPane.add(verticesuperiorxLabel); labelPane.add(verticesuperioryLabel); labelPane.add(baseLabel); labelPane.add(alturaLabel); labelPane.add(colorLabel); //Distribuir los campos de texto en otro panel. JPanel fieldPane = new JPanel(); fieldPane.setLayout(new GridLayout(0, 1)); fieldPane.add(verticesuperiorxTextField); fieldPane.add(verticesuperioryTextField); fieldPane.add(baseTextField); fieldPane.add(alturaTextField); fieldPane.add(colorField); //Poner los dos paneles en un nuevo panel, las etiquetas a la izquierda, //los campos de texto a la derecha. JPanel contentPane = new JPanel(); contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); contentPane.setLayout(new BorderLayout()); contentPane.add(labelPane, BorderLayout.CENTER); contentPane.add(fieldPane, BorderLayout.EAST); add(contentPane); } public Color obtenerColor() { String string=(String)colorField.getSelectedItem(); Color color; if (string.equals("Azul")) color=Color.BLUE; else if (string.equals("Verde")) color=Color.GREEN; else if (string.equals("Naranja")) color=Color.ORANGE; else if (string.equals("Rojo")) color=Color.RED; else if (string.equals("Amarillo")) color=Color.YELLOW; else if (string.equals("Gris")) color=Color.GRAY; else color=Color.BLACK; return color; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 36

} public int obtenerVerticeSuperiorx() { //Obtiene la coordenada x del vertice superior introducida por el usuario if (verticesuperiorxTextField.getText()!= null) return Integer.parseInt(verticesuperiorxTextField.getText()); else return 0; } public int obtenerVerticeSuperiory() { //Obtiene la coordenada y del vertice superior introducida por el usuario if (verticesuperioryTextField.getText()!= null) return Integer.parseInt(verticesuperioryTextField.getText()); else return 0; } public int obtenerBase() { if (baseTextField.getText()!= null) return Integer.parseInt(baseTextField.getText()); else return 0; } public int obtenerAltura() { if (alturaTextField.getText()!= null) return Integer.parseInt(alturaTextField.getText()); else return 0; } }

______________________________________________________________________ FISI UNMSM Luis Guerra G. 37

______________________________________________________________________ FISI UNMSM Luis Guerra G. 38

En NetBeans IDE 6.1 File New Project Java Java Application Next - Nombre del Proyecto desactivar: Create Main Class y Set as Main Project finish. Luego de creada la Aplicacin sobre el paquete click derecho New JFrame para la clase con el mtodo principal, luego similar para las otras clases JPanel.

import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Ventana extends javax.swing.JFrame { private Triangulo triangulo; public Ventana() { //Pintar la ventana vaca setTitle("Pintar Triangulo "); asignarLookAndFeel(); setCloseClick(); setExtendedState(MAXIMIZED_BOTH); setVisible(true); //Crear un triangulo y aadirlo a la ventana triangulo=new Triangulo(); getContentPane().add(triangulo); ______________________________________________________________________ FISI UNMSM Luis Guerra G. 39

//Repintar la ventana con el triangulo pack(); setExtendedState(MAXIMIZED_BOTH); repaint(); } private void asignarLookAndFeel() { //Forzar el Look and Feel de la ventana al del sistema String laf = UIManager.getSystemLookAndFeelClassName(); try { UIManager.setLookAndFeel(laf); } catch (UnsupportedLookAndFeelException exc) {System.err.println("Unsupported: " + laf);} catch (Exception exc) {System.err.println("Error cargando: " + laf);} } private void setCloseClick() { //Controlar el cierre de la ventana addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); } public void paint (Graphics g) { super.paint(g); if (triangulo!=null) triangulo.paint(g); } public static void main(String args[]) { new Ventana(); } } import java.awt.*; import javax.swing.*; public class Triangulo extends javax.swing.JPanel { //Coordenada x del vertice superior private int verticesuperiorx; //Coordenada y del vertice superior private int verticesuperiory; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 40

//Base private int base; //Altura private int altura; //Color private Color color; private boolean haydatos=false; // Crea una nueva instancia de Triangulo */ public Triangulo() { // Mostrar el formulario para obtener los datos del triangulo FormularioTriangulo formulario= new FormularioTriangulo(); JDialog dialog =new JDialog(); dialog.setTitle("Introduzca los datos del triangulo"); dialog.setModal(true); dialog.setContentPane(formulario); dialog.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE); dialog.pack(); dialog.show(); // Obtener los datos introducidos por el usuario verticesuperiorx=formulario.obtenerVerticeSuperiorx(); verticesuperiory=formulario.obtenerVerticeSuperiory(); base=formulario.obtenerBase(); altura=formulario.obtenerAltura(); color=formulario.obtenerColor(); haydatos=true; } public void paint(Graphics g) { int [] coordenadasx=getCoordenadasX(); int [] coordenadasy=getCoordenadasY(); super.paint(g); //Si el usuario ha introducido los datos pinta el triangulo if (haydatos){ g.setColor(color); g.drawPolygon(coordenadasx, coordenadasy, 3); g.fillPolygon(coordenadasx, coordenadasy, 3); g.dispose(); } } private int [] getCoordenadasX(){ int [] coordenadasx = new int [3]; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 41

coordenadasx[0]=verticesuperiorx; coordenadasx[1]=verticesuperiorx-(base/2); coordenadasx[2]=verticesuperiorx+(base/2); return coordenadasx; } private int [] getCoordenadasY(){ int [] coordenadasy= new int[3]; coordenadasy[0]=verticesuperiory; coordenadasy[1]=verticesuperiory+altura; coordenadasy[2]=verticesuperiory+altura; return coordenadasy; } public void mover (int desplazamientox, int desplazamientoy){ verticesuperiorx = verticesuperiorx + desplazamientox; verticesuperiory = verticesuperiory + desplazamientoy; } public void ampliar (int zoomin){ if (zoomin > 0){ base= base * zoomin; altura=altura*zoomin; } } public void reducir (int zoomout){ if (zoomout > 0){ base = base / zoomout; altura = altura / zoomout; } } public void borrar(){ //Pintarme del color del fondo de la ventana color= this.getBackground(); repaint(); } } import java.awt.*; import javax.swing.JPanel; import java.awt.event.*; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 42

import javax.swing.*; public class FormularioTriangulo extends javax.swing.JPanel { //Valores de los cuadros de texto private int verticesuperiorx; private int verticesuperiory; private int base; private int altura; private Color color; //Etiquetas de los campos de texto private JLabel verticesuperiorxLabel; private JLabel verticesuperioryLabel; private JLabel baseLabel; private JLabel alturaLabel; private JLabel colorLabel; //Textos de las etiquetas private static String verticesuperiorxString = "Coordenada x del vrtice superior: "; private static String verticesuperioryString = "Coordenada y del vrtice superior: "; private static String baseString = "Base: "; private static String alturaString = "Altura: "; private static String colorString = "Color: "; //Campos de texto y combo para introducir los datos private JTextField verticesuperiorxTextField; private JTextField verticesuperioryTextField; private JTextField baseTextField; private JTextField alturaTextField; private JComboBox colorField; //Crea una nueva instancia de FormularioTriangulo public FormularioTriangulo() { //crear las etiquetas verticesuperiorxLabel = new JLabel(verticesuperiorxString); verticesuperioryLabel= new JLabel(verticesuperioryString); baseLabel= new JLabel(baseString); alturaLabel= new JLabel(alturaString); colorLabel= new JLabel(colorString); //crear los campos de texto verticesuperiorxTextField = new JTextField(5); verticesuperioryTextField= new JTextField(5); baseTextField= new JTextField(5); alturaTextField= new JTextField(5); //crear el combo de colores String [] colorValues= {"Azul","Naranja","Verde","Rojo","Amarillo","Gris"}; colorField = new JComboBox(colorValues); colorField.setEditable(false); ______________________________________________________________________ FISI UNMSM Luis Guerra G. 43

//Asignar las etiquetas a los campos de texto verticesuperiorxLabel.setLabelFor(verticesuperiorxTextField); verticesuperioryLabel.setLabelFor(verticesuperioryTextField); baseLabel.setLabelFor(baseTextField); alturaLabel.setLabelFor(alturaTextField); colorLabel.setLabelFor(colorField); //Distribuir las etiqueta en un panel JPanel labelPane = new JPanel(); labelPane.setLayout(new GridLayout(0, 1)); labelPane.add(verticesuperiorxLabel); labelPane.add(verticesuperioryLabel); labelPane.add(baseLabel); labelPane.add(alturaLabel); labelPane.add(colorLabel); //Distribuir los campos de texto en otro panel. JPanel fieldPane = new JPanel(); fieldPane.setLayout(new GridLayout(0, 1)); fieldPane.add(verticesuperiorxTextField); fieldPane.add(verticesuperioryTextField); fieldPane.add(baseTextField); fieldPane.add(alturaTextField); fieldPane.add(colorField); //Poner los dos paneles en un nuevo panel, las etiquetas a la izquierda, //los campos de texto a la derecha. JPanel contentPane = new JPanel(); contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); contentPane.setLayout(new BorderLayout()); contentPane.add(labelPane, BorderLayout.CENTER); contentPane.add(fieldPane, BorderLayout.EAST); add(contentPane); } //Obtiene el Color seleccionado por el usuario public Color obtenerColor() { String string=(String)colorField.getSelectedItem(); Color color; if (string.equals("Azul")) color=Color.BLUE; else if (string.equals("Verde")) color=Color.GREEN; else if (string.equals("Naranja")) color=Color.ORANGE; else if (string.equals("Rojo")) color=Color.RED; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 44

else if (string.equals("Amarillo")) color=Color.YELLOW; else if (string.equals("Gris")) color=Color.GRAY; else color=Color.BLACK; return color; } //Obtiene la coordenada x del vertice superior introducida por el usuario public int obtenerVerticeSuperiorx(){ if (verticesuperiorxTextField.getText()!= null) return Integer.parseInt(verticesuperiorxTextField.getText()); else return 0; } //Obtiene la coordenada y del vertice superior introducida por el usuario public int obtenerVerticeSuperiory(){ if (verticesuperioryTextField.getText()!= null) return Integer.parseInt(verticesuperioryTextField.getText()); else return 0; } //Obtiene la base introducida por el usuario public int obtenerBase(){ if (baseTextField.getText()!= null) return Integer.parseInt(baseTextField.getText()); else return 0; } //Obtiene la altura introducida por el usuario public int obtenerAltura(){ if (alturaTextField.getText()!= null) return Integer.parseInt(alturaTextField.getText()); else return 0; } } EJERCICIOS 1. Construir una aplicacin que pinte un rectngulo en la pantalla. La aplicacin debe permitir que el usuario ingrese los datos del rectngulo: coordenada x del vrtice superior izquierdo, coordenada y del vrtice superior izquierdo, base, altura, seleccin del color a travs de un combobox en un formulario, usar diagrama de clases similar al ejercicio anterior. ______________________________________________________________________ FISI UNMSM Luis Guerra G. 45

2. Implementar un juego que consista en ir formando una tortuga con los valores que los jugadores obtengan de los nmeros al tirar un dado: seis para el cuerpo, uno para cada pata y dos para la cabeza. Las reglas son las siguientes: Pueden jugar N jugadores El dado ira pasando de mano en mano por todos los jugadores y cada jugador tirar el dado una vez que le toque. Cuando saque 6 significa que form el cuerpo, y puede recin formar las patas. Cuando halla formado el cuerpo y todas las patas, recin puede buscar la cabeza. Gana el que primero forme la tortuga Elaborar diagrama de clases, programa en Java. HERENCIA SIMPLE Ejercicio 1 Elaborar una aplicacin dada una clase Test que permita crear objetos de la clase CCuentaAhorro con el atributo cuota de mantenimiento o comisin, sta clase es derivada de la clase base CCuenta que tiene los atributos: nombre, cuenta, saldo, inters. Mostrar: nombre, cuenta, saldo, inters para dos clientes. // Aplicacin para trabajar con la clase base: CCuenta... // public class Test { public static void main(String[] args) { CCuentaAhorro cliente01 = new CCuentaAhorro(); CCuentaAhorro cliente02 = new CCuentaAhorro("Un nombre", "Una cuenta", 1000000, 3.5, 300); cliente01.asignarNombre("Un nombre"); cliente01.asignarCuenta("Una cuenta"); cliente01.asignarTipoDeInters(2.5); cliente01.asignarCuotaManten(300); cliente01.ingreso(1000000); cliente01.reintegro(500000); cliente01.comisiones(); System.out.println("Cliente 1"); System.out.println("Nombre: "+cliente01.obtenerNombre()); System.out.println("Cuenta: "+cliente01.obtenerCuenta()); System.out.println("Saldo: "+cliente01.estado()); System.out.println("Inters: "+cliente01.obtenerTipoDeInters()); System.out.println(); System.out.println("Cliente 2"); System.out.println("Nombre: "+cliente02.obtenerNombre()); System.out.println("Cuenta: "+cliente02.obtenerCuenta()); System.out.println("Saldo: "+cliente02.estado()); System.out.println("Inters: "+cliente02.obtenerTipoDeInters()); ______________________________________________________________________ FISI UNMSM Luis Guerra G. 46

} } ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// // Clase CCuentaAhorro: clase derivada de CCuenta // import java.util.*; public class CCuentaAhorro extends CCuenta { // Atributos private double cuotaMantenimiento; // Mtodos public CCuentaAhorro() {} // constructor sin parmetros public CCuentaAhorro(String nom, String cue, double sal, double tipo, double mant) { super(nom, cue, sal, tipo); // invoca al constructor CCuenta asignarCuotaManten(mant); // inicia cuotaMantenimiento } public void asignarCuotaManten(double cantidad) { if (cantidad < 0) { System.out.println("Error: cantidad negativa"); return; } cuotaMantenimiento = cantidad; } public double obtenerCuotaManten() { return cuotaMantenimiento; } public void comisiones() { // Se aplican mensualmente por el mantenimiento de la cuenta GregorianCalendar fechaActual = new GregorianCalendar(); int da = fechaActual.get(Calendar.DAY_OF_MONTH); if (da == 1) reintegro(cuotaMantenimiento); } } ////////////////////////////////////////////////////////////////// // Clase CCuenta: clase abstracta que agrupa los datos comunes a // cualquier tipo de cuenta bancaria. // public abstract class CCuenta { ______________________________________________________________________ FISI UNMSM Luis Guerra G. 47

// Atributos private String nombre; private String cuenta; private double saldo; private double tipoDeInters; // Mtodos public CCuenta() {}; public CCuenta(String nom, String cue, double sal, double tipo) { asignarNombre(nom); asignarCuenta(cue); ingreso(sal); asignarTipoDeInters(tipo); } public void asignarNombre(String nom) { if (nom.length() == 0) { System.out.println("Error: cadena vaca"); return; } nombre = nom; } public String obtenerNombre() { return nombre; } public void asignarCuenta(String cue) { if (cue.length() == 0) { System.out.println("Error: cuenta no vlida"); return; } cuenta = cue; } public String obtenerCuenta() { return cuenta; } public double estado() { return saldo; } public abstract void comisiones(); public void ingreso(double cantidad) ______________________________________________________________________ FISI UNMSM Luis Guerra G. 48

{ if (cantidad < 0) { System.out.println("Error: cantidad negativa"); return; } saldo += cantidad; } public void reintegro(double cantidad) { if (saldo - cantidad < 0) { System.out.println("Error: no dispone de saldo"); return; } saldo -= cantidad; } public void asignarTipoDeInters(double tipo) { if (tipo < 0) { System.out.println("Error: tipo no vlido"); return; } tipoDeInters = tipo; } public double obtenerTipoDeInters() { return tipoDeInters; } } Bibliografa: Cap. 10 - Java 2 - Fco. Javier Ceballos.

Ejercicio 2 Dada la clase base Figura y las clases derivadas crculo y rectngulo hallar el rea de dos objetos Crculo y rectngulo dada la clase base respectiva y datos dados, desde el programa principal como radio, largo y ancho, respecto a un punto en la clase base. import java.io.*; public class JerarquiadeClases { /** * @param args the command line arguments */ public static void main(String[] args) { ______________________________________________________________________ FISI UNMSM Luis Guerra G. 49

Figura f=new Circulo(0,0,5.5); System.out.println("Area del circulo: "+f.area()); //f=new Rectangulo(0,0,5.5,2.0); Figura r=new Rectangulo(0,0,5.5,2.0); //Rectangulo r=new Rectangulo(0,0,5.5,2.0); System.out.println("Area del rectangulo: "+r.area()); } } public abstract class Figura { protected int x; protected int y; public Figura(int x,int y){ this.x=x; this.y=y; } public abstract double area(); } class Circulo extends Figura{ protected double radio; public Circulo(int x,int y,double radio){ super(x,y); this.radio=radio; } public double area(){ return Math.PI*radio*radio; } } class Rectangulo extends Figura{ protected double ancho,alto; public Rectangulo(int x,int y, double ancho, double alto){ super(x,y); this.ancho=ancho; this.alto=alto; } public double area(){ return ancho*alto; } }

______________________________________________________________________ FISI UNMSM Luis Guerra G. 50

CLASE ABSTRACTA POLIMORFISMO Dada un clase CBanco que define una matriz de referencias a objetos de tipo cuenta bancaria (clase CCuenta), siendo CCuenta una clase abstracta con los atributos: nombre, cuenta, saldo, inters, que incluye a dos clases derivadas: CCuentaAhorro con el atributo cuota de mantenimiento; y la clase CCuentaCorriente con los atributos: transacciones, importe por transacciones, transacciones exentas; y, a la vez CCuentaCorriente es clase base de CCuentaCorrienteConIn (Cuenta corriente con intereses). En una clase Test definir un men de opciones que permita: 1. Saldo 2. Buscar siguiente 3. Ingreso 4. Reintegro // Ingreso 5. Aadir 6. Eliminar 7. Mantenimiento 8. Salir Seleccione opcin: Asimismo en la clase Test en el mtodo principal crear un objeto banco del tipo CBanco ( con cero elementos). import java.io.*; ///////////////////////////////////////////////////////////////// // Aplicacin para trabajar con la clase CBanco y la jerarqua // de clases derivadas de CCuenta // public class Test { // Para la entrada de datos se utiliza Leer.class public static CCuenta leerDatos(int op) { CCuenta obj = null; String nombre, cuenta; double saldo, tipoi, mant; System.out.print("Nombre.................: "); nombre = Leer.dato(); System.out.print("Cuenta.................: "); cuenta = Leer.dato(); System.out.print("Saldo..................: "); saldo = Leer.datoDouble(); System.out.print("Tipo de inters........: "); tipoi = Leer.datoDouble(); if (op == 1) { System.out.print("Mantenimiento..........: "); mant = Leer.datoDouble(); obj = new CCuentaAhorro(nombre, cuenta, saldo, tipoi, mant); } else { int transex; double imptrans; System.out.print("Importe por transaccin: "); imptrans = Leer.datoDouble(); System.out.print("Transacciones exentas..: "); transex = Leer.datoInt(); if (op == 2) obj = new CCuentaCorriente(nombre, cuenta, saldo, tipoi,

______________________________________________________________________ FISI UNMSM Luis Guerra G. 51

imptrans, transex); else obj = new CCuentaCorrienteConIn(nombre, cuenta, saldo, tipoi, imptrans, transex); } return obj; } public static int men() { System.out.print("\n\n"); System.out.println("1. Saldo"); System.out.println("2. Buscar siguiente"); System.out.println("3. Ingreso"); System.out.println("4. Reintegro"); System.out.println("5. Aadir"); System.out.println("6. Eliminar"); System.out.println("7. Mantenimiento"); System.out.println("8. Salir"); System.out.println(); System.out.print(" Opcin: "); int op; do op = Leer.datoInt(); while (op < 1 || op > 8); return op; } public static void main(String[] args) { // Definir una referencia al flujo estndar de salida: flujoS PrintStream flujoS = System.out; // Crear un objeto banco vaco (con cero elementos) CBanco banco = new CBanco(); int opcin = 0, pos = -1; String cadenabuscar = null; String nombre, cuenta; double cantidad; boolean eliminado = false; do { opcin = men(); switch (opcin) { case 1: // saldo flujoS.print("Nombre o cuenta, total o parcial "); cadenabuscar = Leer.dato(); pos = banco.buscar(cadenabuscar, 0); if (pos == -1) if (banco.longitud() != 0) flujoS.println("bsqueda fallida"); else flujoS.println("no hay clientes"); else { flujoS.println(banco.clienteEn(pos).obtenerNombre());

______________________________________________________________________ FISI UNMSM Luis Guerra G. 52

flujoS.println(banco.clienteEn(pos).obtenerCuenta()); flujoS.println(banco.clienteEn(pos).estado()); } break; case 2: // buscar siguiente pos = banco.buscar(cadenabuscar, pos + 1); if (pos == -1) if (banco.longitud() != 0) flujoS.println("bsqueda fallida"); else flujoS.println("no hay clientes"); else { flujoS.println(banco.clienteEn(pos).obtenerNombre()); flujoS.println(banco.clienteEn(pos).obtenerCuenta()); flujoS.println(banco.clienteEn(pos).estado()); } break; case 3: // ingreso case 4: // reintegro flujoS.print("Cuenta: "); cuenta = Leer.dato(); pos = banco.buscar(cuenta, 0); if (pos == -1) if (banco.longitud() != 0) flujoS.println("bsqueda fallida"); else flujoS.println("no hay clientes"); else { flujoS.print("Cantidad: "); cantidad = Leer.datoDouble(); if (opcin == 3) banco.clienteEn(pos).ingreso(cantidad); else banco.clienteEn(pos).reintegro(cantidad); } break; case 5: // aadir flujoS.print("Tipo de cuenta: 1-(CA), 2-(CC), 3-CCI "); do opcin = Leer.datoInt(); while (opcin < 1 || opcin > 3); banco.aadir(leerDatos(opcin)); break; case 6: // eliminar flujoS.print("Cuenta: "); cuenta = Leer.dato(); eliminado = banco.eliminar(cuenta); if (eliminado) flujoS.println("registro eliminado"); else if (banco.longitud() != 0) flujoS.println("cuenta no encontrada"); else flujoS.println("no hay clientes"); break; case 7: // mantenimiento for (pos = 0; pos < banco.longitud(); pos++) { banco.clienteEn(pos).comisiones(); banco.clienteEn(pos).intereses();

______________________________________________________________________ FISI UNMSM Luis Guerra G. 53

} break; case 8: // salir banco = null; } } while(opcin != 8); } } ///////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// // Clase CBanco: clase que mantiene una matriz de referencias a // objetos de cualquier tipo de cuenta bancaria. // public class CBanco { private CCuenta[] clientes; // matriz de objetos private int nElementos; // nmero de elementos de la matriz public CBanco() { // Crear una matriz vaca nElementos = 0; clientes = new CCuenta[nElementos]; } private void unElementoMs(CCuenta[] clientesActuales) { nElementos = clientesActuales.length; // Crear una matriz con un elemento ms clientes = new CCuenta[nElementos + 1]; // Copiar los clientes que hay actualmente for ( int i = 0; i < nElementos; i++ ) clientes[i] = clientesActuales[i]; nElementos++; } private void unElementoMenos(CCuenta[] clientesActuales) { if (clientesActuales.length == 0) return; int k = 0; nElementos = clientesActuales.length; // Crear una matriz con un elemento menos clientes = new CCuenta[nElementos - 1]; // Copiar los clientes no nulos que hay actualmente for ( int i = 0; i < nElementos; i++ ) if (clientesActuales[i] != null) clientes[k++] = clientesActuales[i]; nElementos--; } public void insertarCliente( int i, CCuenta objeto ) { // Asignar al elemento i de la matriz, un nuevo objeto if (i >= 0 && i < nElementos) clientes[i] = objeto; else System.out.println("ndice fuera de lmites"); } public CCuenta clienteEn( int i ) {

______________________________________________________________________ FISI UNMSM Luis Guerra G. 54

// Devolver la referencia al objeto i de la matriz if (i >= 0 && i < nElementos) return clientes[i]; else { System.out.println("ndice fuera de lmites"); return null; } } public int longitud() { return nElementos; } public void aadir(CCuenta obj) { // Aadir un objeto a la matriz unElementoMs(clientes); insertarCliente( nElementos - 1, obj ); } public boolean eliminar(String cuenta) { // Buscar la cuenta y eliminar el objeto for ( int i = 0; i < nElementos; i++ ) if (cuenta.compareTo(clientes[i].obtenerCuenta()) == 0) { clientes[i] = null; // enviar el objeto a la basura unElementoMenos(clientes); return true; } return false; } public int buscar(String str, int pos) { // Buscar un objeto y devolver su posicin String nom, cuen; if (str == null) return -1; if (pos < 0) pos = 0; for ( int i = pos; i < nElementos; i++ ) { // Buscar por el nombre nom = clientes[i].obtenerNombre(); if (nom == null) continue; // str est contenida en nom? if (nom.indexOf(str) > -1) return i; // Buscar por la cuenta cuen = clientes[i].obtenerCuenta(); if (cuen == null) continue; // str est contenida en cuen? if (cuen.indexOf(str) > -1) return i; } return -1; } } //////////////////////////////////////////////////////////////////

______________________________________________________________________ FISI UNMSM Luis Guerra G. 55

////////////////////////////////////////////////////////////////// // Clase CCuenta: clase abstracta que agrupa los datos comunes a // cualquier tipo de cuenta bancaria. // public abstract class CCuenta { // Atributos private String nombre; private String cuenta; private double saldo; private double tipoDeInters; // Mtodos public CCuenta() {}; public CCuenta(String nom, String cue, double sal, double tipo) { asignarNombre(nom); asignarCuenta(cue); ingreso(sal); asignarTipoDeInters(tipo); } public void asignarNombre(String nom) { if (nom.length() == 0) { System.out.println("Error: cadena vaca"); return; } nombre = nom; } public String obtenerNombre() { return nombre; } public void asignarCuenta(String cue) { if (cue.length() == 0) { System.out.println("Error: cuenta no vlida"); return; } cuenta = cue; } public String obtenerCuenta() { return cuenta; } public double estado() { return saldo; } public abstract void comisiones();

______________________________________________________________________ FISI UNMSM Luis Guerra G. 56

public abstract double intereses(); public void ingreso(double cantidad) { if (cantidad < 0) { System.out.println("Error: cantidad negativa"); return; } saldo += cantidad; } public void reintegro(double cantidad) { if (saldo - cantidad < 0) { System.out.println("Error: no dispone de saldo"); return; } saldo -= cantidad; } public void asignarTipoDeInters(double tipo) { if (tipo < 0) { System.out.println("Error: tipo no vlido"); return; } tipoDeInters = tipo; } public double obtenerTipoDeInters() { return tipoDeInters; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// import java.io.*; public class Leer { public static int datoInt() { return Integer.parseInt(dato()); } public static String dato() { String sdato=""; try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader flujoE = new BufferedReader(isr); sdato=flujoE.readLine(); } catch (IOException e) { System.err.println("ERROR:"+e.getMessage()); } return sdato;

______________________________________________________________________ FISI UNMSM Luis Guerra G. 57

} public static long datoLong() { return Long.parseLong(dato()); } public static double datoDouble() { return Double.parseDouble(dato()); } } import java.util.*; ////////////////////////////////////////////////////////////////// // Clase CCuentaAhorro: clase derivada de CCuenta // public class CCuentaAhorro extends CCuenta { // Atributos private double cuotaMantenimiento; // Mtodos public CCuentaAhorro() {} // constructor sin parmetros public CCuentaAhorro(String nom, String cue, double sal, double tipo, double mant) { super(nom, cue, sal, tipo); // invoca al constructor CCuenta asignarCuotaManten(mant); // inicia cuotaMantenimiento } public void asignarCuotaManten(double cantidad) { if (cantidad < 0) { System.out.println("Error: cantidad negativa"); return; } cuotaMantenimiento = cantidad; } public double obtenerCuotaManten() { return cuotaMantenimiento; } public void comisiones() { // Se aplican mensualmente por el mantenimiento de la cuenta GregorianCalendar fechaActual = new GregorianCalendar(); int da = fechaActual.get(Calendar.DAY_OF_MONTH); if (da == 1) reintegro(cuotaMantenimiento); } public double intereses() { GregorianCalendar fechaActual = new GregorianCalendar(); int da = fechaActual.get(Calendar.DAY_OF_MONTH); if (da != 1) return 0.0;

______________________________________________________________________ FISI UNMSM Luis Guerra G. 58

// Acumular los intereses por mes slo los das 1 de cada mes double interesesProducidos = 0.0; interesesProducidos = estado() * obtenerTipoDeInters() / 1200.0; ingreso(interesesProducidos); // Devolver el inters mensual por si fuera necesario return interesesProducidos; } } ////////////////////////////////////////////////////////////////// import java.util.*; ////////////////////////////////////////////////////////////////// // Clase CCuentaCorriente: clase derivada de CCuenta // public class CCuentaCorriente extends CCuenta { // Atributos private int transacciones; private double importePorTrans; private int transExentas; // Mtodos public CCuentaCorriente() {} // constructor sin parmetros public CCuentaCorriente(String nom, String cue, double sal, double tipo, double imptrans, int transex) { super(nom, cue, sal, tipo); // invoca al constructor CCuenta transacciones = 0; // inicia transacciones asignarImportePorTrans(imptrans); // inicia importePorTrans asignarTransExentas(transex); // inicia transExentas } public void decrementarTransacciones() { transacciones--; } public void asignarImportePorTrans(double imptrans) { if (imptrans < 0) { System.out.println("Error: cantidad negativa"); return; } importePorTrans = imptrans; } public double obtenerImportePorTrans() { return importePorTrans; } public void asignarTransExentas(int transex) { if (transex < 0) { System.out.println("Error: cantidad negativa");

______________________________________________________________________ FISI UNMSM Luis Guerra G. 59

return; } transExentas = transex; } public int obtenerTransExentas() { return transExentas; } public void ingreso(double cantidad) { super.ingreso(cantidad); transacciones++; } public void reintegro(double cantidad) { super.reintegro(cantidad); transacciones++; } public void comisiones() { // Se aplican mensualmente por el mantenimiento de la cuenta GregorianCalendar fechaActual = new GregorianCalendar(); int da = fechaActual.get(Calendar.DAY_OF_MONTH); if (da == 1) { int n = transacciones - transExentas; if (n > 0) reintegro(n * importePorTrans); transacciones = 0; } } public double intereses() { GregorianCalendar fechaActual = new GregorianCalendar(); int da = fechaActual.get(Calendar.DAY_OF_MONTH); if (da != 1) return 0.0; // Acumular los intereses por mes slo los das 1 de cada mes double interesesProducidos = 0.0; // Hasta 3000 euros al 0.5%. El resto al inters establecido. if (estado() <= 3000) interesesProducidos = estado() * 0.5 / 1200.0; else { interesesProducidos = 3000 * 0.5 / 1200.0 + (estado() - 3000) * obtenerTipoDeInters() / 1200.0; } ingreso(interesesProducidos); // Este ingreso no debe incrementar las transacciones decrementarTransacciones(); // Devolver el inters mensual por si fuera necesario return interesesProducidos; }

______________________________________________________________________ FISI UNMSM Luis Guerra G. 60

} ////////////////////////////////////////////////////////////////// import java.util.*; ////////////////////////////////////////////////////////////////// // Clase CCuentaCorrienteConIn: clase derivada de CCuentaCorriente // public class CCuentaCorrienteConIn extends CCuentaCorriente { // Mtodos public CCuentaCorrienteConIn() {} // constructor sin parmetros public CCuentaCorrienteConIn(String nom, String cue, double sal, double tipo, double imptrans, int transex) { // Invocar al constructor de la superclase super(nom, cue, sal, tipo, imptrans, transex); } public double intereses() { GregorianCalendar fechaActual = new GregorianCalendar(); int da = fechaActual.get(Calendar.DAY_OF_MONTH); if (da != 1 || estado() < 3000) return 0.0; // Acumular inters mensual slo los das 1 de cada mes double interesesProducidos = 0.0; interesesProducidos = estado() * obtenerTipoDeInters() / 1200.0; ingreso(interesesProducidos); // Este ingreso no debe incrementar las transacciones decrementarTransacciones(); // Devolver el inters mensual por si fuera necesario return interesesProducidos; } } ////////////////////////////////////////////////////////////////// Interfaz IFecha import java.util.*; ////////////////////////////////////////////////////////////////// // Interfaz IFecha: mtodos y constantes para obtener // el da, mes y ao // public interface IFecha { public final static int DIA_DEL_MES = Calendar.DAY_OF_MONTH; public final static int MES_DEL_AO = Calendar.MONTH; public final static int AO = Calendar.YEAR; public abstract int da(); public abstract int mes(); public abstract int ao(); }

______________________________________________________________________ FISI UNMSM Luis Guerra G. 61

EJERCICIOS 1. Vaca, cerdo son animales que tienen peso y no hablan pero si dicen algo, es el caso de la vaca (muu), o, caso del cerdo (oinc). Crear una instancia de vaca por ejemplo daisy, una instancia de cerdo por ejemplo porky. Usando polimorfismo redefinir un mtodo para que al seleccionar un animal de los indicados se diga algo de uno de ellos, y el proceso continu mientras no se desee salir, en un men de opciones. 2. Controlar o manejar una excepcin de divisin por cero, dados dos nmeros enteros cualesquiera. Cuando los datos son correctos el proceso continua, y pregunta si desea terminar. 3. Dado las instancias cuadrado, crculo, rectngulo, adems una clase base Figura; redefinir el mtodo calcular el rea, para cada una de las figuras, cuando se solicite en el programa principal desde un men de opciones el rea de ellas. Recuerde leer: lado, radio, largo y ancho, 1. 2. 3. 4. MENU rea de un cuadrado Area de un crculo Area de un rectngulo Salir Seleccione opcin:

CLASES GENERICAS Clases con variables o parmetros que representan tipos. Por ejemplo, dada una clase genrica Par que permita establecer un tipo T, para manejar enteros y caracteres, y luego a travs de un mtodo intercambiar los valores, para luego presentar intercambiado los valores en el programa principal.

public class Par <T>{ private T a, b; public Par(T a, T b){ this.a = a; this.b = b; } public void setA(T a){this.a=a;} public T getA(){return a;} public void setB(T b){this.b=b;} public T getB(){return b;} public Par<T> swap(){ return new Par<T>(b, a); } } import java.io.*; import javax.swing.JOptionPane; public class Prueba { ______________________________________________________________________ FISI UNMSM Luis Guerra G. 62

public static void main(String[] args) { int n1,n2; char ca=' ',cb=' '; System.out.println("Numeros para intercambiar usando clase generica"); n1=Integer.parseInt(JOptionPane.showInputDialog("Primer numero:")); n2=Integer.parseInt(JOptionPane.showInputDialog("Segundo numero:")); // Instanciacin de la clase genrica para Integer(Enteros) // No se puede usar int porque no es una clase Par<Integer> p = new Par<Integer>(n1,n2); System.out.println("Par de enteros, antes del cambio: n1="+p.getA()+" n2="+p.getB()); p = p.swap(); System.out.println("Par de enteros, despues del cambio: n1="+p.getA()+" n2="+p.getB()); System.out.println("Caracteres para intercambiar usando clase generica"); InputStreamReader isr=new InputStreamReader(System.in); BufferedReader flujoE=new BufferedReader(isr); PrintStream flujoS=System.out; try{ flujoS.print("Primer caracter<letra>: "); ca=(char)flujoE.read(); flujoE.readLine(); //Limpiar caracteres: \r\n flujoS.print("Segundo caracter<letra>: "); cb=(char)flujoE.read(); flujoE.readLine(); //Limpiar caracteres: \r\n } catch(IOException e){ System.out.println("Error:"+e.getMessage()); } // Instanciacin de la clase genrica para Character(Caracteres) //Par<Character> p1 = new Par<Character>('a','b'); Par<Character> p1 = new Par<Character>(ca,cb); System.out.println("Par de aracteres, antes del cambio: ca="+p1.getA()+" cb="+p1.getB()); p1=p1.swap();
System.out.println("Par de caracteres, despues del cambio: ca="+p1.getA()+" cb="+p1.getB());

} } Ejercicios: 1. Programa utilizando clase genrica, para hallar el menor, intemedio y mayor de tres nmeros enteros, a su vez de tres letras. 2. Programa utilizando clase genrica para ordenar cinco nmeros y ordenar cinco letras, ascendente y/o descendente.
Clase genrica de Conexin a Bases de datos
Una clase Genrica de conexin a bases de datos. Una clase generica que realiza una conexin a bases de datos mysql, la cual esta declarada dentro del paquete conexin, recibe cuatro parametros:

______________________________________________________________________ FISI UNMSM Luis Guerra G. 63

String ip, String bd, String usr, String pass, los cuales se pueden enviar desde otra clase en donde se instancie y se invoque... ejemplo: GenericaDb np = new GenericaDb("192.168.54.2","listadb","admin","4dm1n1str"); despues se puede acceder a los elementos de la clase de la siguiente forma: //Para obtener la conexion Connexion conexion = qpn.getConexion(); package conexion; /**************************************** **

http://www.comunidadjava.org/?q=node/430

* @author Marco A. Trejo Lemus * * 17/06/2008 09:47:01 AM * ****************************************/ import java.sql.*; public class GenericaDb { public String driver,url,ip,bd,usr,pass; public Connection conexion; public GenericaDb(String ip, String bd, String usr, String pass) { driver="com.mysql.jdbc.Driver"; this.bd = bd; this.usr = usr; this.pass = pass; url = new String("jdbc:mysql://"+ip+"/"+bd); try { Class.forName(driver).newInstance(); conexion=DriverManager.getConnection(url,usr,pass); System.out.println("Conexion a Base de Datos "+bd+" Ok"); } catch (Exception exc) { System.out.println("Error al tratar de abrir la base de Datos"+bd+" : "+exc); } } public Connection getConexion() { return conexion; } public Connection CerrarConexion() throws SQLException { conexion.close(); conexion = null; return conexion; } } //fin de la clase "Por mas dificil que parezca un reto si se puede alcanzar si realmente lo intentamos" Marco Antonio Trejo Lemus ******** Comunidad Java Mxico

*****************************************************************
EXCEPCIONES

______________________________________________________________________ FISI UNMSM Luis Guerra G. 64

Excepciones en Java pemiten manejar situaciones anmalas. Las palabras try y catch trabajan conjuntamente y pueden traducirse: probar un fragmento de cdigo, si es satisfactorio continuar con la ejecucin del programa, de no ser as atrapar la excepcin y manejarla. Ejemplo: Dado un arreglo de objeto, para guardar diez nmeros reales, si se ingresara otro carcter(s) que no sea nmero real, manejar la excepcin, indicando, Ese dato no es vlido. Teclee otro. Utilizar la clase Leer, dada anteriormente. public class LeerDatos { public static void main(String[] args) { boolean eof = true; float[] a = new float[10]; int i = 0; System.out.println("Ingresar datos "); System.out.print("Dato float: "); while (i < 10 && Float.isNaN(a[i] = Leer.datoFloat()) != eof) { i++; System.out.print("Dato float: "); } System.out.println(); for (int k = 0; k < i; k++) System.out.print(a[k] + " "); System.out.println(); } } import java.io.*; public class Leer { public static String dato() { String sdato = ""; try { // Definir un flujo de caracteres de entrada: flujoE InputStreamReader isr = new InputStreamReader(System.in); BufferedReader flujoE = new BufferedReader(isr); // Leer. La entrada finaliza al pulsar la tecla Entrar sdato = flujoE.readLine(); } catch(IOException e) { System.err.println("Error: " + e.getMessage()); } return sdato; // devolver el dato tecleado } public static short datoShort() { try { String sdato = dato(); if (sdato == null) { System.out.println(); return Short.MIN_VALUE;

______________________________________________________________________ FISI UNMSM Luis Guerra G. 65

} else return Short.parseShort(sdato); } catch(NumberFormatException e) { System.out.print("Ese dato no es vlido. Teclee otro: "); return datoShort(); } } public static int datoInt() { try { String sdato = dato(); if (sdato == null) { System.out.println(); return Integer.MIN_VALUE; } else return Integer.parseInt(sdato); } catch(NumberFormatException e) { System.out.print("Ese dato no es vlido. Teclee otro: "); return datoInt(); } } public static long datoLong() { try { String sdato = dato(); if (sdato == null) { System.out.println(); return Long.MIN_VALUE; } else return Long.parseLong(sdato); } catch(NumberFormatException e) { System.out.print("Ese dato no es vlido. Teclee otro: "); return datoLong(); } } public static float datoFloat() { try { String sdato = dato(); if (sdato == null) { System.out.println();

______________________________________________________________________ FISI UNMSM Luis Guerra G. 66

return Float.NaN; // No es un Nmero; valor float. } else { Float f = new Float(sdato); return f.floatValue(); } } catch(NumberFormatException e) { System.out.print("Ese dato no es vlido. Teclee otro: "); return datoFloat(); } } /* public static float datoFloat() { try { Float f = new Float(dato()); return f.floatValue(); } catch(NumberFormatException e) { System.out.print("Ese dato no es vlido. Teclee otro: "); return datoFloat(); } catch(NullPointerException e) { return Float.NaN; // No es un Nmero; valor float. } } */ public static double datoDouble() { try { Double d = new Double(dato()); return d.doubleValue(); } catch(NumberFormatException e) { System.out.print("Ese dato no es vlido. Teclee otro: "); return datoDouble(); } catch(NullPointerException e) { return Double.NaN; // No es un Nmero; valor double. } } } //******** Bibliografa Cap. 11 Ceballos Java 2

Excepciones Propias

Ejemplo: ______________________________________________________________________ FISI UNMSM Luis Guerra G. 67

Se conoce la longitud de los tres lados enteros de un tringulo, el rea puede calcularse de la siguiente manera: area = Math.sqrt(s*(s-a)*(s-b)*(s-c)); donde: s=(a+b+c)/2 En un programa elabore un mtodo para calcular y devolver el rea; permita que lance una excepcin cuando las tres longitudes no puedan formar un tringulo. Desarrolle un mtodo invocador que atrape la excepcin
import java.util.InputMismatchException; import java.util.Scanner; class Cuando3LnofT extends Exception{} public class ExcepcionCuando3LnofT { public static double area(double l1,double l2, double l3) throws Exception, InputMismatchException{ double s,carea; if(l1<l2+l3 && l2<l1+l3 && l3<l1+l2){ s=(l1+l2+l3)/2; carea=Math.sqrt(s*(s-l1)*(s-l2)*(s-l3)); return carea; } else throw new Cuando3LnofT(); } public static void main(String[] args) throws Exception{ Scanner lado=new Scanner(System.in); double resultado=0; try{ System.out.println("Tres lados enteros de un triangulo para hallar area:"); System.out.println("\n 1er lado: "); double lado1=lado.nextDouble(); System.out.println("\n 2do lado: "); double lado2=lado.nextDouble(); System.out.println("\n 3er lado: "); double lado3=lado.nextDouble(); resultado = area(lado1, lado2, lado3); System.out.println("El area es:"+resultado); } catch(Cuando3LnofT e){ System.err.println("ERROR: los tres lados no forman un triangulo"); } catch(InputMismatchException inputMismatchException){ System.err.printf("\n Excepcion: %s\n",inputMismatchException); System.out.println("Debe ingresar numeros enteros. Intente de nuevo\n"); } } }

PERSISTENCIA ______________________________________________________________________ FISI UNMSM Luis Guerra G. 68

Caracterstica de la programacin orientada a objetos que permite la persistencia de los objetos. Llevar la informacin a disco, y reconstruir despus en el momento de la lectura. import java.io.*; ///////////////////////////////////////////////////////////////// // Aplicacin: Lista de telfonos. Cuando la aplicacin finaliza // la lista es salvada en un archivo "listatfnos.dat" y cuando // se inicia se recupera de ese archivo. // public class Test { public static int men() { System.out.print("\n\n"); System.out.println("1. Buscar"); System.out.println("2. Buscar siguiente"); System.out.println("3. Aadir"); System.out.println("4. Eliminar"); System.out.println("5. Salir"); System.out.println(); System.out.print(" Opcin: "); int op; do op = Leer.datoInt(); while (op < 1 || op > 5); return op; } public static void main(String[] args) { // Definir un flujo de caracteres de entrada: flujoE InputStreamReader isr = new InputStreamReader(System.in); BufferedReader flujoE = new BufferedReader(isr); // Definir una referencia al flujo estndar de salida: flujoS PrintStream flujoS = System.out; CListaTfnos listatfnos; int opcin = 0, pos = -1; String cadenabuscar = null; String nombre, direccin; long telfono; boolean eliminado = false; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 69

boolean listaModificada = false; try { // Crear un objeto lista de telfonos vaco (con 0 elementos) // o con el contenido del fichero listatfnos.dat si existe. File fichero = new File("listatfnos.dat"); if (!fichero.exists()) { listatfnos = new CListaTfnos(); flujoS.println("Se ha creado una lista de telfonos nueva"); } else { ObjectInputStream ois = new ObjectInputStream( new FileInputStream("listatfnos.dat")); listatfnos = (CListaTfnos)ois.readObject(); ois.close(); flujoS.println("Se carg la lista de telfonos con xito"); } do { opcin = men(); switch (opcin) { case 1: // buscar flujoS.print("conjunto de caracteres a buscar "); cadenabuscar = flujoE.readLine(); pos = listatfnos.buscar(cadenabuscar, 0); if (pos == -1) if (listatfnos.longitud() != 0) flujoS.println("bsqueda fallida"); else flujoS.println("lista vaca"); else { flujoS.println(listatfnos.valorEn(pos).obtenerNombre()); flujoS.println(listatfnos.valorEn(pos).obtenerDireccin()); flujoS.println(listatfnos.valorEn(pos).obtenerTelfono()); } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 70

break; case 2: // buscar siguiente pos = listatfnos.buscar(cadenabuscar, pos + 1); if (pos == -1) if (listatfnos.longitud() != 0) flujoS.println("bsqueda fallida"); else flujoS.println("lista vaca"); else { flujoS.println(listatfnos.valorEn(pos).obtenerNombre()); flujoS.println(listatfnos.valorEn(pos).obtenerDireccin()); flujoS.println(listatfnos.valorEn(pos).obtenerTelfono()); } break; case 3: // aadir flujoS.print("nombre: "); nombre = flujoE.readLine(); flujoS.print("direccin: "); direccin = flujoE.readLine(); flujoS.print("telfono: "); telfono = Leer.datoLong(); listatfnos.aadir(new CPersona(nombre, direccin, telfono)); listaModificada = true; break; case 4: // eliminar flujoS.print("telfono: "); telfono = Leer.datoLong(); eliminado = listatfnos.eliminar(telfono); if (eliminado) { flujoS.println("registro eliminado"); listaModificada = true; } else if (listatfnos.longitud() != 0) flujoS.println("telfono no encontrado"); else flujoS.println("lista vaca"); break; case 5: // salir // guardar lista if (listaModificada) { ObjectOutputStream ous = new ObjectOutputStream( ______________________________________________________________________ FISI UNMSM Luis Guerra G. 71

new FileOutputStream("listatfnos.dat")); ous.writeObject(listatfnos); ous.close(); } listatfnos = null; } } while(opcin != 5); } catch (IOException e) { System.out.println("Error: " + e.getMessage()); } catch (ClassNotFoundException e) { System.out.println("Error: " + e.getMessage()); } } } ///////////////////////////////////////////////////////////////// // Definicin de la clase CListaTfnos. // import java.io.*; public class CListaTfnos implements Serializable { private CPersona[] listaTelfonos; // matriz de objetos private int nElementos; // nmero de elementos de la matriz private CPersona[] asignarMemoria(int nElementos) { try { return new CPersona[nElementos]; } catch (OutOfMemoryError e) { System.out.println(e.getMessage()); return listaTelfonos; } }

______________________________________________________________________ FISI UNMSM Luis Guerra G. 72

public CListaTfnos() { // Crear una lista vaca nElementos = 0; listaTelfonos = asignarMemoria(nElementos); } private void unElementoMs(CPersona[] listaActual) { nElementos = listaActual.length; listaTelfonos = asignarMemoria(nElementos + 1); // Copiar la lista actual for ( int i = 0; i < nElementos; i++ ) listaTelfonos[i] = listaActual[i]; nElementos++; } private void unElementoMenos(CPersona[] listaActual) { if (listaActual.length == 0) return; int k = 0; nElementos = listaActual.length; listaTelfonos = asignarMemoria(nElementos - 1); // Copiar la lista actual for ( int i = 0; i < nElementos; i++ ) if (listaActual[i] != null) listaTelfonos[k++] = listaActual[i]; nElementos--; } public void ponerValorEn( int i, CPersona objeto ) { if (i >= 0 && i < nElementos) listaTelfonos[i] = objeto; else System.out.println("ndice fuera de lmites"); } public CPersona valorEn( int i ) { if (i >= 0 && i < nElementos) ______________________________________________________________________ FISI UNMSM Luis Guerra G. 73

return listaTelfonos[i]; else { System.out.println("ndice fuera de lmites"); return null; } } public int longitud() { return nElementos; } public void aadir(CPersona obj) { unElementoMs(listaTelfonos); ponerValorEn( nElementos - 1, obj ); } public boolean eliminar(long tel) { // Buscar el telfono y eliminar registro for ( int i = 0; i < nElementos; i++ ) if (listaTelfonos[i].obtenerTelfono() == tel) { listaTelfonos[i] = null; unElementoMenos(listaTelfonos); return true; } return false; } public int buscar(String str, int pos) { String nom; if (str == null) return -1; if (pos < 0) pos = 0; for ( int i = pos; i < nElementos; i++ ) { nom = listaTelfonos[i].obtenerNombre(); if (nom == null) continue; // str est contenida en nom? if (nom.indexOf(str) > -1) return i; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 74

} return -1; } } ///////////////////////////////////////////////////////////////// // Definicin de la clase CPersona // import java.io.*; public class CPersona implements Serializable { // Atributos private String nombre; private String direccin; private long telfono; // Mtodos public CPersona() {} public CPersona(String nom, String dir, long tel) { nombre = nom; direccin = dir; telfono = tel; } public void asignarNombre(String nom) { nombre = nom; } public String obtenerNombre() { return nombre; } public void asignarDireccin(String dir) { direccin = dir; } public String obtenerDireccin() { ______________________________________________________________________ FISI UNMSM Luis Guerra G. 75

return direccin; } public void asignarTelfono(long tel) { telfono = tel; } public long obtenerTelfono() { return telfono; } }

CONEXIN A BASE DE DATOS: JAVA SQL SERVER ______________________________________________________________________ FISI UNMSM Luis Guerra G. 76

Probar DSN en SQL SERVER package paquetePconexion; import java.sql.*; public class PanelPrincipal extends javax.swing.JPanel { /** Creates new form PanelPrincipal */ public PanelPrincipal() { initComponents(); } private void btnProbarDsnDatosActionPerformed(java.awt.event.ActionEvent evt) { try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa",""); DatabaseMetaData meta=cn.getMetaData(); txtSalida.append("\nDatabase:\t"+meta.getDatabaseProductName()); txtSalida.append("\nversion:\t"+meta.getDatabaseProductVersion()); cn.close(); } catch(Exception ex){ txtSalida.setText("La conexion fracas por:\n\n"); txtSalida.append(ex.toString()); } } private javax.swing.JButton btnProbarDsnDatos; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea txtSalida; } public class Principal extends javax.swing.JFrame { /** Creates new form Principal */ public Principal() { initComponents(); add(new PanelPrincipal()); setSize(300,200); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Principal().setVisible(true); } }); } } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 77

Mantenimiento a una Base de Datos Se podr insertar, eliminar y actualizar registros de una tabla mediante las sentencias del SQI: Insert, Delete y Update. La sentencia INSERT INSERT INTO NombreTabla (ColumnasDeTabla) VALUES (DatosParaColumnas) Ejemplo: Insert Into Personas (Nombre, edad) Values (Sergio Vsquez Fano,17) La sentencia DELETE DELETE FROM NombreTabla WHERE CondicinDeBsqueda Ejemplo: Delete From Personas Where Nombre like Sergio Vsquez Fano La sentencia UPDATE UPDATE Nombre Tabla SET Columna 1 = Expresin, Columna 2 = Expresin... WHERE CondicinDeBsqueda Ejemplos: Update Personas Set Edad = 22 Where Nombre = Diva Martinez

EJEMPLO (NetBeans SqlServer) Desarrollar una aplicacin que permite dar mantenimiento (nuevo, eliminar y actualizar datos) a una tabla de una base de datos creada con SQL Server en un men de opciones.

______________________________________________________________________ FISI UNMSM Luis Guerra G. 78

Paso 1: Ejecutar en el Analizador de Consultas(Quero Analyzer) del SQL Server el siguiente script: -- Crea base de datos con nombre: Datos
CREATE DATABASE Datos ON PRIMARY(NAME=DatosData, FILENAME='c:\Datos.mdf') LOG ON(NAME=DatosLog, FILENAME='c:\Log.ldf') GO USE Datos GO -- crea tabla Personas Create Table Personas(idPersona int identity(1,1),Nombre varchar(60) NOT NULL,Email varchar(60),Telefono varchar(10)) -- Inserta filas a tabla personas Insert Personas values('Joel Penia','jp99@gmail.com','1234567') Insert Personas(Nombre,Email,Telefono) values('Beatriz Llontop','btop777@hotmail.com','7654321') -- activa Datos

Paso 2: El paso consiste en crear el dsn: dsnDatos mediante ODBC y debe apuntar a la base de datos: Datos del paso 1. Paso 3: Una vez creada la base de datos (Datos) y el dsn (dsnDatos), entonces podemos iniciar el desarrollo de nuestra aplicacin. Nuevo proyecto de nombre ProyectoBds1, nuevo paquete de nombre proyectobds1. ______________________________________________________________________ FISI UNMSM Luis Guerra G. 79

Las clases para sta aplicacin son: JDBComboBox, JDBTable, Mantenimiento, MiMenu, PanelNuevo, PanelEliminar y PanelActualizar. package proyectobds1; import java.sql.*; import javax.swing.*; public class JDBComboBox extends JComboBox{ // constructor public JDBComboBox(String select, String dsn, String login, String password){ try{ Class.forName("sun.jdbc.odbc.Jdbc0dbcDriver"); Connection cn = DriverManager.getConnection("jdbc:odbc:"+dsn, login, password); Statement st = cn.createStatement(); ResultSet rs = st.executeQuery(select); while(rs.next()) addItem(rs.getString(1)); // columna 1 cn.close ( ); } catch(Exception ex){ String s = "La consulta fracas por: \n\n" + ex.toString(); JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE); } // fin del catch } // fin del constructor } // fin de la clase package proyectobds1; import java.sql.*; import java.util.Vector; import javax.swing.*; import javax.swing.table.*; public class JDBTable extends JTable{ Vector cache; int colCount; String[] headers; public JDBTable(String dsn, String login, String password, String query){ setModel(formaMiTabla(dsn,login,password,query)); } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 80

public TableModel formaMiTabla(String dsn, String login, String password, String query){ cache=new Vector(); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection cn=DriverManager.getConnection("jdbc:odbc:"+dsn,login,password); Statement st=cn.createStatement(); ResultSet rs=st.executeQuery(query); ResultSetMetaData meta=rs.getMetaData(); colCount =meta.getColumnCount(); // nombres de columnas headers=new String[colCount]; for(int h=1;h<=colCount;h++){ headers[h-1]=meta.getColumnName(h); } while(rs.next()){ String[] record=new String[colCount]; for(int i=0;i<colCount;i++) record[i]=rs.getString(i+1); cache.addElement(record); } // notifica que tenemos una nueva tabla ((AbstractTableModel)getModel()).fireTableChanged(null); cn.close(); } catch(Exception e){ JOptionPane.showMessageDialog(null, "Fracas por:\n\n"+e.toString()); } return new AbstractTableModel(){ //titulo de columna @Override public String getColumnName(int i){ return headers[i]; } // cuntas columnas public int getColumnCount(){ return colCount;} // cuntas filas public int getRowCount(){ return cache.size();} //cadena en fila, columna. Inicia en (0,0) public Object getValueAt(int row, int col){ return ((String[])cache.elementAt(row))[col]; ______________________________________________________________________ FISI UNMSM Luis Guerra G. 81

} }; } } package proyectobds1; import java.awt.event.*; import javax.swing.*; public class Mantenimiento extends JFrame{ public Mantenimiento(String s,JPanel p, int width, int height){ super(s); getContentPane().add(p); addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e){ setVisible(false); dispose(); } }); setSize(width,height); setVisible(true); } } A continuacin, construimos un Frame para el men en una clase de nombre MiMen. Clic derecho en el paquete proyectobds1, nuevo JFrame, nuevo JFrame Form de nombre MiMenu donde hacemos el siguiente diseo: Mi Menu con BorderLayout. En el norte colocamos una barra de men (jMenuBar1) donde modificamos las opciones por defecto y agregamos un nuevo men para Ver la tabla de personas. En cada opcin de men colocamos sus respectivos Menu Items hasta lograr el diseo requerido. Utilice la propiedad title para escribir un ttulo del frame. Observe la distribucin de los objetos y los nombres de variable utilizados.

______________________________________________________________________ FISI UNMSM Luis Guerra G. 82

Vamos al cdigo fuente (source) de MiMenu para establecer el tamao de la ventana y escribir un mtodo que retorne el men Item que permite ver la tabla de personas. package proyectobds1; import java.sql.*; import javax.swing.*; public class MiMenu extends javax.swing.JFrame { public MiMenu() { initComponents(); setSize(500,400); } public JMenuItem getMniVerTablaPersonas(){ return mniVerTablaPersonas; } Regresamos al diseo de MiMenu y hacemos clic derecho en el menultem Salir, elegimos Events, Action, ActionPerformed para programar su accin private void mniArchivoSalirActionPerformed(java.awt.event.ActionEvent evt) { dispose(); System.exit(0); } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 83

Regresamos al diseo de MiMenu y hacemos clic derecho en el menultem MantenimientoNuevo, elegimos Events, Action, ActionPerformed para programar su accin. private void mniMantenimientoNuevoActionPerformed(java.awt.event.ActionEvent evt) { new Mantenimiento("Nuevo Registro", new PanelNuevo(this),300,200); } Regresamos al diseo de MiMenu y hacemos clic derecho en el menultem Ver Tabla de Personas, elegimos Events, Action, ActionPerformed para programar su accin. private void mniVerTablaPersonasActionPerformed(java.awt.event.ActionEvent evt) { JDBTable jdbt=new JDBTable("dsnDatos","sa","","Select Nombre, Email, Telefono from Personas"); getContentPane().removeAll(); getContentPane().add(jdbt); paintComponents(getContentPane().getGraphics()); } public boolean hayRegistros(String select){ boolean hay=false; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa",""); Statement st=cn.createStatement(); ResultSet rs=st.executeQuery(select); hay=rs.next(); cn.close(); } catch(Exception ex){ String s="El Select fracas por:\n\n"+ex.toString(); JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE); } return hay; } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MiMenu().setVisible(true); } }); } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 84

// Variables declaration - do not modify private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem mniArchivoSalir; private javax.swing.JMenuItem mniMantenimientoActualizar; private javax.swing.JMenuItem mniMantenimientoEliminar; private javax.swing.JMenuItem mniMantenimientoNuevo; private javax.swing.JMenuItem mniVerTablaPersonas; private javax.swing.JMenu mnuArchivo; private javax.swing.JMenu mnuMantenimiento; private javax.swing.JMenu mnuVer; // End of variables declaration } A continuacin diseamos el PanelNuevo. Clic derecho en el paquete proyectobds1, nuevo JPanelForm de nombre PanelNuevo donde hacemos el siguiente diseo. PanelNuevo con BorderLayout. En el sur colocamos un botn para grabar. En el centro colocamos otro panel (jPanel1) con BorderLayout. En el oste colocamos otro panel (jPanel2) con GridLayout de 1 columna, 3 filas donde colocamos las etiquetas. En el centro del panel jPanel1 colocamos otro panel (jPanel3) con GridLayout de 1 columna, 3. filas donde colocamos las cajas de texto.

Observe la distribucin de los objetos y los nombres de variable utilizados.

______________________________________________________________________ FISI UNMSM Luis Guerra G. 85

Vamos al cdigo fuente (source) de PanelNuevo para declarar un objeto Men y recibirlo a travs de su constructor: package proyectobds1; import java.sql.*; import javax.swing.*; public class PanelNuevo extends javax.swing.JPanel { MiMenu menu=null; /** Creates new form PanelNuevo */ public PanelNuevo(MiMenu menu) { initComponents(); this.menu=menu; }

Regresamos al diseo del PanelNuevo y hacemos doble clic en el botn Grabar para programar su accin: ______________________________________________________________________ FISI UNMSM Luis Guerra G. 86

private void btnGrabarActionPerformed(java.awt.event.ActionEvent evt) { try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa",""); Statement st=cn.createStatement(); String no=txtNombre.getText(); String em=txtEmail.getText(); String te=txtTelefono.getText(); if(no.length()!=0) st.execute("Insert Into Personas Values('"+no+"','"+em+"','"+te+"')"); cn.close(); menu.getMniVerTablaPersonas().doClick(); // Actualiza JTable } catch(Exception ex){ String s = "La sentencia fracas por: \n\n" + ex.toString(); JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE); } // cierra el formulario ((Mantenimiento) getTopLevelAncestor()).dispose(); }

Referencia: Java for Windows with NetBeans IDE Julio Vsquez Paragulla Captulo 13

______________________________________________________________________ FISI UNMSM Luis Guerra G. 87

Seguidamente diseamos el PanelEliminar. Clic derecho en el paquete proyectobds1, nuevo JPanelForm de nombre PanelEliminar donde hacemos el siguiente diseo: PanelEliminar con BorderLayout. En el sur colocamos un botn para eliminar un registro. En el norte colocaremos un comboBox con los nombres de personas que se encuentren en la tabla de la base de datos, pero lo haremos escribiendo el cdigo.

Vamos al cdigo fuente (source) del PanelEliminar para escribir lo siguiente: package proyectobds1; import java.awt.BorderLayout; import proyectobds1.JDBComboBox; public class PanelEliminar extends javax.swing.JPanel { JDBComboBox lst = new JDBComboBox("Select Nombre From Personas","dsnDatos","sa",""); MiMenu menu = null; public PanelEliminar(MiMenu menu) { initComponents(); this.menu=menu; add(lst,BorderLayout.NORTH); } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 88

private javax.swing.JButton btnEliminar; } Observe que el objeto lst de la clase JDBComboBox es creado y agregado al norte del panel. Regresamos al diseo del PanelEliminar y hacemos doble clic en el botn Eliminar para programar su accin: private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) { try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa",""); Statement st=cn.createStatement(); String n=lst.getSelectedItem().toString(); st.execute("Delete From Personas Where Nombre like '"+n+"'"); cn.close(); menu.getMniVerTablaPersonas().doClick(); // Actualiza JTable } catch(Exception ex){ String s="La sentencia fracas por:\n\n"+ex.toString(); JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE); } // cierra el formulario ((Mantenimiento) getTopLevelAncestor()).dispose(); } private void mniMantenimientoEliminarActionPerformed(java.awt.event.ActionEvent evt) { if(hayRegistros("select * from Personas")) new Mantenimiento("Eliminar Registro", new PanelEliminar(this),300,200); else JOptionPane.showMessageDialog(null,"No hay Registros..!","Sin Registros!",JOptionPane.ERROR_MESSAGE); } public boolean hayRegistros(String select){ boolean hay=false; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa",""); Statement st=cn.createStatement(); ResultSet rs=st.executeQuery(select); hay=rs.next(); } ______________________________________________________________________ FISI UNMSM Luis Guerra G. 89

catch(Exception ex){ String s="El select fracas por:\n\n"+ex.toString(); JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE); } return hay; }

______________________________________________________________________ FISI UNMSM Luis Guerra G. 90

REFERENCIAS

1. Joyanes, Luis; Zahonero, Luis. Programacin en C, C++, Java y UML. 2010. Edit. Mc Graw Hill. Mxico. 2. Deitel & Deitel. Java como programar. 2008. Edit. Pearson Prentice Hall. Mxico. 3. Francisco, Javier Ceballos. Java 2. Curso de Programacin. 2000 . Edit. Alfa Omega Rama. Espaa. 4. Douglas Bell, Mike Parr. Java para estudiantes. 2003. Edit. Pearson. 5. Jhon Zukowski. Java 2. 2003. Edit. Anaya Multimedia. 6. Marco Trejo Lemus. Comunidad Java Mxico. http://www.comunidadjava.org/? q=node/43. 17-6-2008. 7. Garca-Bermejo, Jos Rafael. Java SE6 & Swing. 2007. Edit. Pearson. Espaa. 8. Coronel Castillo, Eric. Java y MySql. 2009. Editora Macro. Per. 9. Vsquez Paragulla, Julio. Java SE for Windows with NetBeans IDE. 2008. Lima.

______________________________________________________________________ FISI UNMSM Luis Guerra G. 91

S-ar putea să vă placă și