380 likes | 674 Views
Estructuras. Programación. Estructuras en Java. Las estructuras en Java se definen como clases. La estructura permite almacenar datos de diferentes tipos en una sola entidad. Es conveniente definir constructores para las estructuras, esto permite tener siempre datos bien definidos.
E N D
Estructuras Programación
Estructuras en Java Las estructuras en Java se definen como clases. La estructura permite almacenar datos de diferentes tipos en una sola entidad. Es conveniente definir constructores para las estructuras, esto permite tener siempre datos bien definidos. Se acostumbra definir métodos get y set para accesar a los miembros dato.
Una estructura para fechas Miembros dato Constructor sin parámetros class Fecha{publicint dia,mes,anyo;public Fecha(){ dia = 1; mes = 1; anyo = 2000; }public Fecha(int d, int m, int a){ dia = d; mes = m; anyo = a; }public String toString(){return""+dia+" de "+mes+" de "+anyo; }} Constructor con parámetros Convierte fecha a cadena
Ejemplo de fechas publicclass TestEstructuras{staticpublicvoid main(String []args){ Fecha hoy,otroDia; hoy = new Fecha(13,11,2005);//crea una fecha (13 de nov 2005) otroDia = new Fecha();//crea otra fecha (1 de enero 2000) System.out.println("Hoy es:"+hoy.toString()); System.out.println("El primer dia fue:"+otroDia.toString()); }}
La clase Empleado nombre direccion telefono diaNacimiento ingreso salario dia mes anyo dia mes anyo class Empleado{public String nombre;public String direccion;public String telefono;public Fecha diaNacimiento,ingreso;publicfloat salario;public Empleado(String nom,String dir,String tel,Fecha dn,Fecha ingr,float s){ nombre = nom; direccion = dir; telefono = tel; diaNacimiento = dn; ingreso = ingr; salario = s; }} Nombre Dirección Teléfono Día de nacimiento Carrera Sexo (utilice un booleano) Lugar de nacimiento Estado civil
Ejemplo de empleado publicclass TestEstructuras{staticpublicvoid main(String []args){ Empleado e = new Empleado("Juan Perez","Calle Olmo #23","555-33-22",new Fecha(5,4,1994),new Fecha(12,9,2004),30000); System.out.println("Nombre:"+e.nombre); System.out.println("Direccion:"+e.direccion); System.out.println("Telefono:"+e.telefono); System.out.println("Nació el "+ e.diaNacimiento.toString()); System.out.println("Ingresó el "+e.ingreso.toString()); System.out.println("Salario:"+e.salario); }} Nombre:Juan PerezDireccion:Calle Olmo #23Telefono:555-33-22Nació el 5 de 4 de 1994Ingresó el 12 de 9 de 2004Salario:30000.0 Salida
Números racionales Un número racional es aquel que puede expresarse como el cociente de dos enteros. Ejemplos: 1/2, 34/17, -5/4, 8 (8/1) publicclass Racional{privateint num, den; } . . Racional r1, r2;
Constructor de racionales public Racional(int a,int b){ num = a; den = b;} Ejemplo Racional r1, r2; r1 = new Racional(5,7); // r1 = 5/7 r2 = new Racional(3,8); // r2 = 3/8
Igualdad de racionales Dos racionales son iguales si representan el mismo número real. Ejemplo: 3/8 = 6/16, 5/15 = 1/3 Para comparar dos racionales hay que expresarlos en su forma reducida, es decir, de forma que el numerador y el denominador sean primos entre sí. Para esto divida el numerador y el denominador entre su m.c.d.
Reducción de un racional privatevoid simplifica(){int a,b,res;if(num>den){ a = num; b = den; }else{ a = den; b = num; }while(b != 0){ res = a%b; a = b; b = res; } num = num/a; den = den/a;} Reducción de un racional mediante el algoritmo de Euclides.
Comparación de racionales Implementación de la comparación como método de clase. Correcto Incorrecto Racional a,b; Racional a,b,c;a = new Racional(3,4); a = new Racional(3,4);b = new Racional(5,6); b = new Racional(5,6);if(Racional.igual(a,b)) if(a.igual(b)) son iguales son igualeselse else NO son iguales NO son iguales Indica que el método es de clase publicstaticboolean igual(Racional a,Racional b){ a.simplifica(); b.simplifica();return (a.num == b.num && a.den == b.den);}
Operaciones con racionales Suma Resta Multiplicación División
Implementación de la suma Implementación de la suma como método de clase. Correcto Incorrecto Racional a,b,c; Racional a,b,c;a = new Racional(3,4); a = new Racional(3,4);b = new Racional(5,6); b = new Racional(5,6);c = Racional.suma(a,b); c = a.suma(b); Indica que el método es de clase publicstatic Racional suma(Racional a,Racional b){int n,d; n = a.num*b.den+b.num*a.den; d = a.den*b.den; Racional c = new Racional(n,d); c.simplifica();return c;}
Ejemplo de evaluación Se desea calcular el valor de la siguiente expresión con racionales: Racional a,b,c,d,e;a = Racional.multiplica(new Racional(5,2),new Racional(6,5));// a = (5/2)x(6/5)b = Racional.resta(new Racional(1,4),new Racional(3,7));// b = (1/4)-(3/7)c = Racional.divide(a,b); // c = a/bd = Racional.resta(new Racional(7,15),c); // d = 7/5 - ce = Racional.suma(d,new Racional(13,6)); // e = d + 13/6Syatem.out.println(e.toString()) 5/2x 6/5= 3/1 1/4- 3/7= -5/28 (3/1)/ -5/28= -84/5 7/15- -84/5= 259/15 259/15+ 13/6= 583/30
Resumen El acceso a miembros de una clase se logra empleando el operador punto (.). Las clases permiten al programador modelar objetos con atributos (datos) y comportamiento (métodos), se definen mediante la palabra class. El cuerpo de la definición de clases se encierra en llaves ({}). Cualquier variable de ejemplar (instancia) o método declarado public en una clase esta visible para cualquier método con acceso a un objeto de la clase. Cualquier variable de ejemplar (instancia) o método declarado private solo esta solo esta visible para los demás miembros de la clase. Un constructor es un método especial con el mismo nombre de la clase y que sirve para inicializar los miembros dato de un objeto de la clase. Los constructores se invocan cuando se ejemplarizan (crean) los objetos. El conjunto de métodos public de una clase se conoce como la interfaz publica de la clase.
Resumen (continuación) Dentro del alcance de una clase, podemos hacer referencia a los miembros de la clase simplemente con sus nombres. Fuera del alcance de la clase, hacemos referencia a los miembros de la clase mediante una referencia a un objeto. Los constructores pueden sobrecargarse. Se pueden definir varios constructores siempre y cuando no coincidan en el número y tipo de los parámetros. Los constructores no pueden regresar ningún valor. Las clases pueden estar compuestas por objetos de otras clases. Los miembros dato privados se pueden acceder por métodos get y set. Los métodos get obtienen el valor de un dato y los métodos set lo modifican. Si una clase tiene un método toString(), este se utiliza automáticamente cuando se mezcla un objeto de la clase en una expresión de cadena. Es decir System.out.print(“”+c.toString()); System.out.print(“”+c);
Conjuntos (ejemplo) Un conjunto de enteros puede representarse utilizando un arreglo de enteros. Si un elemento se encuentra en el conjunto, el elemento del arreglo con el índice igual al entero se hace 1. Ejemplo: A = {3, 5, 7, 12, 14} B = {2, 3, 6, 7, 8, 12} Representación de A 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[9] a[10] a[11] a[12] a[13] a[14] a[8] Representación de B 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[9] a[10] a[11] a[12] a[13] a[14] a[8] A B = {2, 3, 5, 6, 7, 8, 12, 14} 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[9] a[10] a[11] a[12] a[13] a[14] a[8] 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 A B = {3, 7, 12} a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[9] a[10] a[11] a[12] a[13] a[14] a[8]
Miembro dato privado class ConjuntoEnteros{privateint a[];public ConjuntoEnteros(){ a = newint[100];for(int i=0; i<100 ; i++) a[i] = 0; }publicvoid agregar(int n){if(n>=0 && n<100) a[n] = 1; }publicstatic ConjuntoEnteros union( ConjuntoEnteros c1,ConjuntoEnteros c2){ ConjuntoEnteros c = new ConjuntoEnteros();for(int i=0; i<100 ; i++) if(c1.a[i]==1 || c2.a[i]==1) c.a[i] = 1;return c; } Constructor Agrega un elemento Calcula la unión De dos conjuntos (Método de clase)
publicvoid imprime(){int j = 0; System.out.print("{");for(int i=0; i<a.length ; i++)if(a[i]==1){ System.out.print(" "+i); j++;if(j==50) System.out.println(""); } System.out.println("}"); }}
Uso de la clase ConjuntoEnteros ConjuntoEnteros a = new ConjuntoEnteros();ConjuntoEnteros b = new ConjuntoEnteros();a.agregar(3);a.agregar(5);a.agregar(7);a.agregar(12);a.agregar(14);b.agregar(2);b.agregar(3);b.agregar(6);b.agregar(7);b.agregar(8);b.agregar(12);a.imprime();b.imprime();ConjuntoEnteros c = ConjuntoEnteros.union(a,b);c.imprime(); Crea 2 conjuntos vacíos A = {3, 5, 7, 12, 14} B = {2, 3, 6, 7, 8, 12} c = a b
La clase Complejo Class Complejo{ double re, im; public Complejo(){ re = 0; im =0; } public Complejo(double r){ re = r; im =0; } public Complejo(double r,double c){ re = r; im =c; }} Ejemplos:Complejo a = new Complejo();// 0+0iComplejo b = new Complejo(5);//5+0iComplejo c = new Complejo(3,4);//3+4i
Suma de complejos (a + bi) + (c + di) = (a + c) + (b + d)i public static Complejo suma(Complejo a,Complejo b){ double c,d; c = a.re+b.re; d = a.im+b.im; Complejo t = new Complejo(c,d); return(t);} Calcula la suma de dos complejos (Método de clase)
Otros métodos public static Complejo resta(Complejo a,Complejo b){ double c,d; c = a.re-b.re; d = a.im-b.im; Complejo t = new Complejo(c,d); return(t); } public static Complejo multiplica(Complejo a,Complejo b){ double c,d; c = a.re*b.re-a.im*b.im; d = a.im*b.re+a.re*b.im; Complejo t = new Complejo(c,d); return(t); } public static Complejo divide(Complejo a,Complejo b){ double c,d,den; den = b.re*b.re+b.im*b.im; c = (a.re*b.re+a.im*b.im)/den; d = (a.re*b.im-a.im*b.re)/den; Complejo t = new Complejo(c,d); return(t); } public String toString(){ return(""+re+" + i("+im+")"); }
Actividad 1. Amplíe la clase Complejo para agregar un métodos para extraer la raíz cuadrada de un complejo con la fórmula.
La clase Matriz Construye una matrizde nxn rellena de ceros Arreglo de double class Matriz{double m[][];public Matriz(int n){ m = newdouble[n][n]; cero(); }public Matriz(double m1[][]){int n = m1.length; m = newdouble[n][n];for(int i=0;i<n;i++)for(int j=0;j<n;j++) m[i][j] = m1[i][j]; } Construye una matrizcopiando un arreglo
métodos staticpublic Matriz suma(Matriz a,Matriz b){ Matriz m1 = new Matriz(a.m.length);for(int i=0;i<m1.m.length;i++)for(int j=0;j<m1.m.length;j++) m1.m[i][j] = a.m[i][j] + b.m[i][j];return m1;}publicvoid imprime(){for(int i=0;i<m.length;i++){for(int j=0;j<m.length;j++) System.out.print(" "+m[i][j]); System.out.println(""); } System.out.println("");} publicvoid cero(){for(int i=0;i<m.length;i++)for(int j=0;j<m.length;j++) m[i][j] = 0;}publicvoid unidad(){for(int i=0;i<m.length;i++)for(int j=0;j<m.length;j++)if(i==j) m[i][j] = 1;else m[i][j] = 0;}
Ejemplo de matrices class TestMatriz{staticpublicvoid main(String[] args){double d[][] = {{1,2,3},{4,5,6},{7,8,9}}; Matriz a = new Matriz(d); Matriz b = new Matriz(d); Matriz c = Matriz.suma(a,b); a.imprime(); b.imprime(); c.imprime(); }}
La clase Fecha /*archivo Fecha.java, Deitel & Deitel*/publicclass Fecha{privateint mes; // 1-12privateint dia; // 1-31privateint anyo;//cualquiera //constructor: Confirma valor correcto para mes. //llama al método checaDia para checar el día.public Fecha(int m, int d, int a){if(m>0 && m<=12)//valida el mes mes = m;else{ mes = 1; System.out.println("mes "+m+" no válido. Se usará 1."); } anyo = a; dia = checaDia(d); System.out.println("Constructor de objeto Fecha para la fecha "+toString()); }
privateint checaDia(int d){int diaPorMes[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};if(d>0 && d<=diaPorMes[mes])return d;if(mes == 2 && //Febrero: determinar si año bisiesto d == 29 && (anyo % 400 == 0 || (anyo % 4 == 0 && anyo % 100 != 0)))return d; System.out.println("Día "+d+" no válido. Usar dia 1.");return 1; //dejar objeto en estado consistente }public String toString(){return dia+"/"+mes+"/"+anyo; }}
Ejemplo import java.util.*;publicclass testFecha{staticpublicvoid main(String []args){ GregorianCalendar d = new GregorianCalendar(); Fecha hoy = new Fecha(d.get(Calendar.MONTH), d.get(Calendar.DAY_OF_MONTH), d.get(Calendar.YEAR)); System.out.println(hoy.toString()); }}
Juego del gato Para el gato se requiere un arreglo de 3x3, en donde cada elemento puede ser 0 (vacío), 1 (X) o 2 (O). Un contador de jugadas para determinar a quien le toca (X o O). Tablero class ClaseGato{int tablero[][];int numJugada;... } Contador de jugadas, si es par le toca a X, sino a O.
Inicio del juego public ClaseGato(){ tablero = newint[3][3]; inicia();}publicvoid inicia(){int i,j; numJugada = 0;for(i=0; i<3 ; i++)for(j=0; j<3 ; j++) tablero[i][j] = BLANCO;//tablero vacío}
Procesar una jugada Columna de la jugada Renglón de la jugada publicvoid jugada(int r, int c){if(tablero[r][c]==BLANCO){ numJugada++;if(numJugada%2==0) tablero[r][c]=X;elsetablero[r][c]=O; }} Constantes con valores adecuados
Dibujo del tablero w2 w1 g.fillRect(20+(w1+w2)*j, 20+(w1+w2)*i,w1,w1); j = columna i = renglón g.fillRect(20,20,3*w1+2*w2,3*w1+2*w2);
Detección de renglón y columna Este método regresa el número de renglón que corresponde a una coordenada y. Si cae fuera del tablero regresa -1. La detección de columna es igual que la de renglón así que definimos una sola función. publicint renglonColumna(int y){if(y>=20 && y<=20+w1)return 0;elseif(y>=20+w1+w2 && y<=20+2*w1+w2)return 1;elseif(y>=20+2*w1+2*w2 && y<=20+3*w1+2*w2)return 2;else return -1;}
Applet para el gato import java.applet.*;import java.awt.*;publicclass Gato extends Applet{ ClaseGato gato; Button b;publicvoid init(){ gato = new ClaseGato(); b = new Button("Iniciar"); setLayout(null); b.setBounds(200,10,100,25); add(b); }publicvoid paint(Graphics g){ gato.dibuja(g); }
Lectura del mouse Renglón y columna de la jugada publicboolean mouseDown(Event e, int x, int y){int r = gato.renglonColumna(y);int c = gato.renglonColumna(x);if(r>=0 && c>=0){ showStatus("renglon "+r+" columna "+c); gato.jugada(r,c); repaint(); }elseshowStatus("Fuera");returntrue;} Ejecuta jugada
Procesamiento del botón publicboolean action(Event e, Object o){if(e.target == b){ gato.inicia(); repaint(); }returntrue;}