Algoritmos y Estructura de Datos - TI2 CARRERAS PROFESIONALES CIBERTEC ALGORITMOS Y ESTRUCTURA DE DATOS 3 ÍNDICE Presentación Red de contenidos Sesiones de aprendizaje 4 5 UNIDAD DE APRENDIZAJE 1 SEMANA 1 SEMANA 2 : Encapsulamiento: conceptos básicos. : Encapsulamiento: control de acceso. 6 12 UNIDAD DE APRENDIZAJE 2 SEMANA 3 SEMANA 4 SEMANA 5 SEMANA 6 SEMANA 7 SEMANA 8 SEMANA 9 : Manejo de arreglos: Arreglos Unidimensionales : Manejo de arreglos: Arreglos Unidimensionales : Modificador static y referencia this : Semana Integradora : SEMANA DE EXÁMENES PARCIALES Manejo de arreglos: Arreglos Bidimensionales Manejo de arreglos: Arreglo de Objetos 54 68 33 20 UNIDAD DE APRENDIZAJE 3 SEMANA 10 SEMANA 11 Clase ArrayList: métodos y operaciones variadas Clase ArrayList y Archivos de texto 81 95 UNIDAD DE APRENDIZAJE 4 SEMANA 12 : Herencia y Polimorfismo: Modificador protected, relación es-un. SEMANA 13 : Herencia y Polimorfismo: Sobre-escritura, Clases y métodos abstractos. SEMANA 14 : Herencia y Polimorfismo: polimorfismo y enlace dinámico 133 UNIDAD DE APRENDIZAJE 5 SEMANA 15 SEMANA 16 SEMANA 17 ANEXO : Interfaces : Semana Integradora : SEMANA DE EXÁMENES FINALES : Caso Práctico 158 146 120 110 CIBERTEC CARRERAS PROFESIONALES En cada una de ellas. Continúa con el manejo de arreglos. que debe alcanzar al final de la unidad. y los contenidos. Luego. El curso es teórico práctico. Se utiliza la clase ArrayList así como el manejo de archivos de texto. se desarrollan aplicaciones donde se plasma el concepto de Herencia y Polimorfismo empleando clases abstractas. Esta basado en el paradigma de la programación orientada a objetos. que le permitirán reforzar lo aprendido en la clase. encontrará las actividades que deberá desarrollar en cada sesión.ALGORITMOS Y ESTRUCTURA DE DATOS 4 PRESENTACIÓN Algoritmos y Estructura de Datos pertenece a la línea de programación y desarrollo de aplicaciones y se dicta en las carreras de Computación e Informática. el cual será ampliamente desarrollado. hallará los logros. Por último. el tema tratado. Brinda un conjunto de técnicas de programación que permite a los alumnos diseñar algoritmos apropiados y adquirir buenos hábitos de programación. que debe desarrollar. es decir. las que se desarrollan durante semanas determinadas. los subtemas. Redes y Comunicaciones. CARRERAS PROFESIONALES CIBERTEC . En primer lugar. El manual para el curso ha sido diseñado bajo la modalidad de unidades de aprendizaje. se inicia con la creación de clases y objetos. Se concluye con la implementación de Interfaces. y Administración y Sistemas. ALGORITMOS Y ESTRUCTURA DE DATOS 5 RED DE CONTENIDOS A Algoritmos y Estructura de Datos Encapsulamiento Creación de clases y paquetes Creación de objetos Manejo de arreglos Arreglos Unidimensionales Modificador static y referencia this Arreglos Bidimensionales Arreglo de Objetos Clase ArrayList y archivos de texto Métodos de la clase ArrayList Archivos de texto Herencia y Polimorfismo Relación es-un Clases abstractas. Polimorfismo Interfaces Creación de interfaces y Herencia múltiple CIBERTEC CARRERAS PROFESIONALES . Relación tiene-un Técnicas de casting. 6 UNIDAD DE APRENDIZAJE 1 SEMANA 1-2 ENCAPSULAMIENTO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. Finalmente. crean objetos. Los alumnos emplean y diferencian los especificadores de acceso: public y private. los alumnos crean clases clasificadas en paquetes. entienden el concepto de encapsulamiento. emplean los modificadores de acceso: public y private así como la referencia this en Java. CARRERAS PROFESIONALES CIBERTEC . TEMARIO Creación de clases y paquetes Creación de objetos Especificadores ACTIVIDADES PROPUESTAS Los alumnos crean clases clasificadas en paquetes. Los alumnos realizan diversas operaciones con los objetos creados. Los alumnos crean objetos de diversas clases. Los atributos se especifican mediante variables (variables miembro) y el comportamiento mediante métodos (métodos miembro). De esta forma.2 CLASE Una clase es una plantilla que especifica los atributos y el comportamiento de un determinado tipo de objeto. Una vez definido. CONCEPTOS BASICOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS 1. Si coloca la misma instrucción package al inicio de otras clases logrará agrupar varias clases en el mismo paquete. Ejemplo: import semana1. este nuevo tipo se puede utilizar para crear objetos. Ejemplo: package semana1. Ejemplo: import semana1. En la sentencia import se puede emplear el carácter Asterisco “ * “ con lo cual se estaría indicando que se importe todas las clases del paquete. Los paquetes se declaran utilizando la palabra package seguida del nombre del paquete. La sintaxis es: import nombre_paquete. se tiene acceso a todos los miembros (variables y métodos) de la clase Alumno que se encuentra en el paquete semana1 desde una clase que se encuentra fuera de dicho paquete. 1. CIBERTEC CARRERAS PROFESIONALES .Alumno.*. Su aplicación se aprecia cuando se hace referencia a una clase desde otra que se encuentra fuera del paquete.ALGORITMOS Y ESTRUCTURA DE DATOS 7 1. En nuestro ejemplo se creará la carpeta semana1.. public class Alumno{ .. } Al crearse un paquete se crea una carpeta con el mismo nombre del paquete. Esta instrucción debe colocarse al inicio del archivo y debe ser la primera sentencia a ejecutarse. Uso de la sentencia import La sentencia import se utiliza para incluir una lista de paquetes en donde se buscará una determinada clase.nombre_clase. En la Programación Orientada a Objetos (POO) una clase define un nuevo tipo de dato.1 PAQUETE Un paquete es un conjunto de clases agrupadas que guardan una relación entre sí. . } 1. .2. El constructor de una clase se caracteriza por tener el mismo nombre de su clase y no tener tipo de retorno.2. Java crea un constructor por defecto que no tiene parámetros y que no realiza ninguna inicialización especial. . CARRERAS PROFESIONALES CIBERTEC .1 Declaración y definición de una clase En su forma más simple una clase se declara y define de la siguiente manera: package nomnre_paquete. // Definición del constructor public NombreClase (parámetros) { } // Definición de métodos miembro public tipo1 metodo1(parámetros) { } public tipo2 metodo2(parámetros) { } . . public tipo2 variable2. . Si una clase no define un constructor.2 Constructor Un constructor es un método especial que se utiliza para inicializar un objeto inmediatamente después de su creación. public class NombreClase { // Declaración de variables miembro public tipo1 variable1.8 1. la clase cargada. ACCESO A LOS MIEMBROS DE UNA CLASE Para acceder a un miembro de una clase se escribe el nombre de la variable referencia. será utilizada como una fábrica de objetos. .ALGORITMOS Y ESTRUCTURA DE DATOS 9 1. propias de cada objeto. debe crear un método promedio que retorne la nota promedio.1 Creación de objetos Se siguen los siguientes pasos: . un punto y el nombre del miembro (variable miembro o método miembro) al que se desea acceder. se denominan: variables de instancia. nombreClase nombreReferencia. En adelante.3 OBJETO . 2. . Además.Se declara una variable referencia que almacenará la dirección de memoria del objeto a crear. son compartidos por todos los objetos de la misma clase desde el código de la clase previamente cargada. 1. .Se crea el objeto y se asigna su dirección de memoria a la variable referencia. nombreReferencia = new nombreClase( lista de argumentos ). Estas variables. El operador new crea el objeto dinámicamente (en tiempo de ejecución) y devuelve la dirección de memoria del objeto creado.Cada vez que se crea un objeto se crea una copia de cada una de las variables miembro declaradas por su clase.3. CIBERTEC CARRERAS PROFESIONALES .Los dos pasos anteriores pueden efectuarse en un solo paso de la siguiente manera: nombreClase nombreReferencia = new nombreClase( lista de argumentos ). Ejemplo 1: Declare la clase Alumno dentro del paquete semana1 que permita registrar un nombre y dos notas. El nombre de la clase seguido por los paréntesis invoca al constructor de la clase. los métodos. Para esto se usa el operador new. .La JVM carga a la memoria el código de bytes de una clase en el primer momento en que la clase sea mencionada durante la ejecución del programa. .En cambio.Un objeto es una instancia (o ejemplar) de una clase. nota2).nota1 = 13.0. public int nota1. Por lo tanto. x. listado(a). Ahora sí.nota2 = 15. a.10 package semana1. a.Alumno a = new semana1. lo más simple sería importar el paquete semana1 para que el compilador de java ubique a la clase Alumno y de esta forma evitar la referencia al paquete cada vez que se hace referencia a la clase. x. } void listado(semana1. void procesar() { semana1. public class Alumno { // Variables miembro public String nombre. Se habrá dado cuenta que realizar esta acción se vuelve tedioso.Alumno. a. y luego de ingresar sus datos visualice la data ingresada.nota1).Alumno. nota2. En este ejemplo se debe incluir en las sentencias de importación la siguiente linea: import semana1.promedio()). el codigo de la clase principal quedaría de este forma: CARRERAS PROFESIONALES CIBERTEC .Alumno(). } } En la clase principal (clase donde se ha creado la GUI) cree un objeto de la clase Alumno.nombre = "Juan".Alumno imprimir("nombre : " + imprimir("nota 1 : " + imprimir("nota 2 : " + imprimir("promedio : " } nombre nota 1 nota 2 promedio : : : : Juan 13 15 14. además del promedio obtenido. // Operaciones public double promedio() { return (nota1 + nota2) / 2. Importante: Como la clase Alumno se encuentra dentro del paquete semana1 y la clase principal esta fuera de dicho paquete se le debe anteponer al nombre de la clase el nombre del paquete tal como se aprecia en el ejemplo 1: semana1. + x.nombre).0 x) { x. nota1 = 13. public int nota1. + x.nombre = "Juan". } } A la pulsación de un botón cree el objeto y. a la vez. inicialice sus variables miembro.0.0 + + + " x. public class Alumno { // Variables miembro public String nombre. a.15). } CIBERTEC CARRERAS PROFESIONALES . nota2 = n2. } void listado(Alumno x) { imprimir("nombre : " imprimir("nota 1 : " imprimir("nota 2 : " imprimir("promedio : } nombre nota 1 nota 2 promedio : : : : Juan 13 15 14.promedio()).nombre). } // Operaciones public double promedio() { return (nota1 + nota2) / 2. a.13. x. nota1 = n1. int n2) { nombre = nom. listado(a).nota2). void procesar() { Alumno a = new Alumno("Juan". package semana1.ALGORITMOS Y ESTRUCTURA DE DATOS 11 void procesar() { Alumno a = new Alumno(). nota2. Ejemplo 2: Añada un constructor a la clase Alumno para inicializar sus variables miembro al momento de crear el objeto.nota2 = 15. int n1.nota1). a. En los siguientes ejemplos se asume que se ha importado el paquete correspondiente. // Constructor public Alumno(String nom. listado(a). x. promedio()). imprimir("nota 2:"+x. CONTROL DE ACCESO Y ENCAPSULAMIENTO Una clase puede controlar que partes de un programa pueden acceder a los miembros de su clase: variables miembro y métodos miembro.12 void listado(Alumno x){ imprimir("Objeto:"+x). algunos métodos de la clase pueden ser necesarios sólo desde el interior de la clase por lo que deben quedar restringidos sólo para uso interno. imprimir("nombre:"+x.nombre). Para controlar el acceso a los miembros de una clase se usan especificadores o modificadores de acceso que se anteponen a las declaraciones de los miembros a controlar. Por otra parte. Se ve la aplicación del especificador de acceso protected cuando se trabaja con herencia. Una clase bien diseñada impide el acceso directo a sus variables miembro proporcionando a cambio un conjunto de métodos de acceso que sirvan como intermediarios entre las variables miembro y el mundo exterior. imprimir("promedio:"+x. Este ocultamiento nos permite restringir y controlar el uso de la CARRERAS PROFESIONALES CIBERTEC . Acceso a los miembros Desde una Desde una clase subclase del mismo paquete X X X X X Especificador public private protected sin especificador Desde la misma clase X X X X Desde el exterior de la misma clase X La primera columna indica si la propia clase tiene acceso al miembro definido por el especificador de acceso.Alumno@92e78c Juan 13 15 : 14. La segunda columna indica si las subclases de la clase (sin importar dentro de que paquete se encuentren estas) tienen acceso a los miembros. Esto permite controlar el uso correcto de las variables miembro pues los métodos de acceso pueden actuar como filtros que prueben los datos que se pretenden ingresar a las variables miembro. imprimir("nota 1:"+x. La cuarta columna indica si todas las clases tienen acceso a los miembros.0 3. es la capacidad de ocultar los detalles internos del comportamiento de una clase y exponer o dar a conocer sólo los detalles que sean necesarios para el resto de clases.nota1). En la tabla que sigue se muestra el uso de los especificadores de acceso.nota2). private y protected. por lo que lo veremos más adelante. Encapsulamiento. La tercera columna indica si las clases del mismo paquete que la clase (sin importar su parentesco) tienen acceso a los miembros. } Objeto : nombre : nota 1 : nota 2 : promedio semana1. Los especificadotes de acceso son: public. } public void setNota1(int n) { nota1 = n. } } CIBERTEC CARRERAS PROFESIONALES . } public void setNota2(int n) { nota2 = n. package semana2. } public int getNota1() { return nota1. nota2. int n2) { nombre = nom. private int nota1. } public int getNota2() { return nota2. Ejemplo 3: Haga que las variables miembro de la clase Alumno sean de uso privado y declare sus respectivos métodos de acceso: get/set.0. nota2 = n2. } // Métodos de acceso: get public String getNombre() { return nombre. } // Métodos de acceso: set public void setNombre(String nom) { nombre = nom. public class Alumno { // Variables miembro private String nombre. // Constructor public Alumno(String nom. Restringir porque habrán ciertos atributos y métodos privados o protegidos y controlar porque habrán ciertos mecanismos para modificar el estado de nuestra clase como por ejemplo los métodos de acceso. } // Operaciones public double promedio() { return (nota1 + nota2) / 2. int n1.ALGORITMOS Y ESTRUCTURA DE DATOS 13 clase. nota1 = n1. ra radio : 2 altura : 5 Objeto Cilindro rb CARRERAS PROFESIONALES CIBERTEC . a. listado(a). tanto ra como rb referencian (controlan) al mismo objeto.getNombre()). Luego.promedio()). se asigna la dirección de memoria contenida en ra. listado(a). } void listado(Alumno x) { imprimir("nombre : " imprimir("nota 1 : " imprimir("nota 2 : " imprimir("promedio : } nombre : nota 1 : nota 2 : promedio nombre : nota 1 : nota 2 : promedio Juan 13 15 : 14. + x.0 Juan 19 18 : 18. Ejemplo 4: Cilindro ra = new Cilindro(2. Luego de ello. Cilindro rb. x. inicialice sus variables miembro. modifique sus notas.13. ra radio : 2 altura : 5 Objeto Cilindro rb null rb = ra. void procesar() { Alumno a = new Alumno("Juan".5 + + + " x. 4. a la vez.5).14 A la pulsación de un botón cree el objeto y. x.15). ASIGNACIÓN ENTRE VARIABLES REFERENCIA Cuando se asigna la variable referencia ra a la variable referencia rb.getNota1()).setNota1(19). a.getNota2()).setNota2(18). Extrae el valor del radio del objeto a través de la referencia ra e imprime 8.5 CIBERTEC CARRERAS PROFESIONALES .setNota2(18).ALGORITMOS Y ESTRUCTURA DE DATOS 15 Note que a partir de este momento tanto ra como rb se refieren al mismo objeto. inicializando sus variables miembro.15).setRadio(8). } nombre : nota 1 : nota 2 : promedio nombre : nota 1 : nota 2 : promedio Juan 13 15 : 14.0 Juan 19 18 : 18. b. Luego. a través de la referencia b modifique las notas. Alumno b = a.13. b. ra radio : 8 altura : 5 Objeto Cilindro rb imprimir(“Radio : “ + ra. listado(a). rb. listado(a). Ejemplo 5: A la pulsación de un botón cree el objeto a de la clase Alumno. Cambia por 8 el valor del radio del objeto a través de la referencia rb.setNota1(19).getRadio()). void procesar() { Alumno a = new Alumno("Juan". c) Incremente el precio de lista en soles en 10% e imprima el nuevo precio de lista. implemente lo siguiente: a) Cree un objeto de tipo Computadora con datos fijos. ( ) Al realizar la siguiente declaración: Alumno a. cantidad (int). precio unitario en soles (double) e implemente los siguientes métodos: a) Un constructor que inicialice a los atributos b) Un método que retorne el importe a pagar soles (cantidad * precio unitario en soles) c) Un método que retorne el importe a pagar dólares. Cree la clase Producto dentro del paquete semana1 y declare los siguientes atributos como públicos: codigo (int). marca (String).descuento) Un método que retorne el precio de venta en dólares. Los datos serán capturados de la GUI. 2. Marque Verdadero (V) o Falso (F) las siguientes afirmaciones: a) b) c) d) El método constructor es un método con valor de retorno. b) Cree un método listar que imprima todos los atributos del Producto y el importe a pagar en dólares.16 Ejercicios 1. ( ) Las variables de instancia se crean al crearse el objeto.80 soles En la clase Principal (donde está la GUI). implemente lo siguiente: a) Cree un objeto de tipo Producto cada vez que se pulse el botón Procesar. la variable “a” vale 0 ( ) CARRERAS PROFESIONALES CIBERTEC . descripción (String). Cree la clase Computadora dentro del paquete semana1 y declare los siguientes atributos como públicos: codigo (int). configuración básica (String). El método recibirá como parámetro el tipo de cambio. ( ) Al crearse una clase se crea un nuevo tipo de dato. Asuma la existencia de los métodos para la captura de datos. Considere que: 1 dólar = 2. 3. c) Disminuya el precio unitario del producto en 9% e imprima su nuevo precio unitario. precio de lista en soles (double) e implemente los siguientes métodos: a) b) c) d) Un constructor que inicialice a los atributos Un método que retorne el descuento en soles (15% del precio de lista en soles) Un método que retorne el precio de venta en soles (precio lista . b) Cree un método listar que imprima todos los atributos de la Computadora y los precios de venta en soles y dólares. En la clase Principal (donde está la GUI). 6.*. Justifique su respuesta. Grupo 1: public class A{ public void A(int x){ … } } A obj = new A(777). class MyClass{} 5. class Myclass {} Grupo 2: package MyPackage. Justifique su respuesta.*. nombre (String).*.awt. Cree la clase Empleado dentro del paquete semana2 y declare los siguientes atributos como privados: codigo (int). Grupo 1: import java. Grupo 2: public class A{ } A obj = new A().descuento) En la clase principal (donde esta la GUI) implemente lo siguiente: CIBERTEC CARRERAS PROFESIONALES .awt.ALGORITMOS Y ESTRUCTURA DE DATOS 17 4. Indique que grupo de instrucciones arrojará errores. package Mypackage. horas (int). Que grupo de instrucciones compilará sin error.awt. Métodos de acceso: set/get para cada atributo. class MyClass{} Grupo 3: /*This is a comment */ package MyPackage. import java. Un método que retorne el sueldo bruto (horas*tarifa) Un método que retorne el descuento (11% del sueldo bruto) Un método que retorne el sueldo neto (sueldo bruto . Grupo 3: public class A{ public A(int x){ … } } A obj = new A(). tarifa (double) e implemente los siguientes métodos: a) b) c) d) e) Un constructor que inicialice a los atributos. import java. El método recibirá como parámetro el tipo de cambio. Un método que retorne el importe a pagar soles (cantidad * precio unit) Un método que retorne el importe a pagar dólares. 8. marca (String). 3. Los datos serán capturados de la GUI. En la clase principal (donde esta la GUI) implemente lo siguiente: a) Cree un objeto de tipo producto cada vez que se pulse el botón procesar. 2. descripción (String). Modifique el modelo del celular. implemente lo siguiente: a) Cree un objeto de tipo Celular cada vez que se pulse el botón procesar. Considere que: 1 dólar = 2. c) Disminuya el precio unitario del producto en 7% e imprima su nuevo precio unitario. Cree la clase Celular dentro del paquete semana2 y declare los siguientes atributos como privados: codigo (int). precio unitario en soles (double) e implemente los siguientes métodos: a) b) c) d) Un constructor que inicialice a los atributos. c) Incremente la tarifa del empleado en 10% e imprima su nueva tarifa. Asuma la existencia de los métodos para la captura de datos. Incremente el precio en soles en 5% e imprima el nuevo precio. Asuma la existencia de los métodos para la captura de datos. 1. Los datos serán capturados de la GUI. modelo (String). b) Métodos de acceso: set/get para cada atributo. cantidad (int). Cree un método listar que imprima todos los atributos del Celular y el precio en dólares.18 a) Cree un objeto de tipo empleado con datos fijos.80 soles En la clase Principal (donde está la GUI). Métodos de acceso: set/get para cada atributo. b) Cree un método listar que imprima todos los atributos del empleado y el sueldo neto. b) Cree un método listar que imprima todos los atributos del producto y el importe a pagar en dólares. precio en soles (double) e implemente los siguientes métodos: a) Un constructor que inicialice a los atributos. c) Un método que retorne el precio en dólares. 7. Cree la clase Producto dentro del paquete semana2 y declare los siguientes atributos como privados: codigo (int). CARRERAS PROFESIONALES CIBERTEC . } } Marque Verdadero (V) o Falso (F): a) Arrojará errores de compilación ( ) b) Se respeta los estándares de la encapsulación ( ) 11. } public Auto(int x){ this(). } public String setNombre(){ return nombre. Que imprimirá: __________________ CIBERTEC CARRERAS PROFESIONALES .nombre = nombre. public void getNombre(String nombre){ this. imprime(8). c) La palabra reservada ____________ permite diferenciar entre el nombre de un parámetro y el nombre de una variable miembro.ALGORITMOS Y ESTRUCTURA DE DATOS 19 9. Dado el siguiente código: public class Auto{ private String nombre. Complete las siguientes afirmaciones: a) La palabra reservada _____________ permite restringir el acceso sólo dentro de la clase. } public void auto(int x){ imprime(7). } } Auto x = new Auto(20). Dado el siguiente código: public class Auto{ public Auto(){ imprime(6). d) Para importar todas las clases del paquete beans es necesario colocar la siguiente sentencia ____________________________ 10. b) Los métodos de acceso _______ se utilizan para cambiar el valor del atributo. ACTIVIDADES PROPUESTAS Los alumnos reconocen un arreglo unidimensional. Los alumnos emplean arreglos unidimensionales en diversas aplicaciones.20 UNIDAD DE APRENDIZAJE 2 SEMANA 3-4 ARREGLO UNIDIMENSIONAL LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. así como arreglo de objetos en diversas aplicaciones. Adicionalmente emplean el modificador static. CARRERAS PROFESIONALES CIBERTEC . los alumnos manipulan arreglos unidimensionales y bidimensionales con tipos primitivos. TEMARIO Arreglos unidimensionales Operaciones variadas. El espacio ocupado por cada elemento es igual para todos y en él se pueden almacenar diferentes valores pero del mismo tipo de dato. ARREGLO UNIDIMENSIONAL Un arreglo es un conjunto de elementos dispuestos uno a continuación de otro. String[] apellidos. Forma 2: tipo_dato[] nombre_arreglo. Con la declaración sólo se crea la variable que hace referencia al arreglo y su contenido es null. b) Creación: nombre_arreglo = new tipo[tamaño]. ejemplos: int[] n. donde cada elemento conserva su propio espacio (tamaño en bytes). String apellidos[].ALGORITMOS Y ESTRUCTURA DE DATOS 21 1. Con la creación le indicamos a Java la cantidad de elementos que va a tener el arreglo (tamaño del bloque de elementos) y la variable que hace referencia al arreglo almacena la dirección del primer elemento del arreglo. sueldos = new double[8]. double[] sueldos. ejemplos: n = new int [10]. double sueldos[]. CIBERTEC CARRERAS PROFESIONALES . apellidos = new String[12]. El tipo más simple de un arreglo es el unidimensional. ejemplos: int n[]. a) Declaración: Forma 1: tipo_dato nombre_arreglo[]. ejemplo: int n[] = new int[7]. c) Declaración y creación en la misma linea: tipo_dato nombre_arreglo[] = new tipo_dato[tamaño]. n[4]. n[2]..”Pedro”.12. i< n. Java cuenta las posiciones a partir de 0 Esta posición se denomina indice: i Los siete elementos del arreglo n son: n[0].length . n[1].min + 1) * Math. por defecto inicializa un arreglo de tipo int con 0.25}. } int aleatorio (int min.random()+ min). n[3].-5. .22 gráficamente: n i 0 0 0 1 0 2 0 3 0 4 0 5 0 6 Consideraciones: Java.length devuelve el tamaño del arreglo (en este caso: 7) El indice i se encuentra en el rango: 0 <= i < n. crear e inicializar un arreglo en una misma linea de la siguiente forma: tipo_de_dato nombre_del_arreglo[]={valor1. int max) { return (int)((max .}.99).0. } c) Declaración. Ejemplos: int n[]={1. un arreglo de tipo String con null y un arreglo de tipo boolean con false. String nombres[]= {”Juan”. n[6] n[7] no está definido n. CARRERAS PROFESIONALES CIBERTEC . valor2. un arreglo de tipo double con 0.0. i++) n[i]=aleatorio(10..length b) Inicialización: Se puede inicializar un arreglo con numeros aleatorios de la siguiente forma: void generar() { for(int i=0.”Ana”}. n[5]. creación e inicialización: Se puede declarar. private int indice. } public void reinicializar(){ edades = new int[10]. } //Métodos públicos public void adicionar(int edad) { edades[indice]=edad. public class ArregloUnidimensional { //Atributos privados private int edades[].ALGORITMOS Y ESTRUCTURA DE DATOS 23 2. indice=0. } public void generar(){ for(int i=0. } CIBERTEC CARRERAS PROFESIONALES .99). Código de la clase ArregloUnidimensional package semana3. } public int longTotal(){ return edades. indice=0. indice++. } public int getIndice(){ return indice. //Constructor public ArregloUnidimensional() { edades = new int[10]. i++) edades[i]=aleatorio(10. OPERACIONES VARIADAS Ejemplo 1 Este ejemplo esta compuesto de 2 clases: la clase ArregloUnidimensional (clase que maneja el arreglo) y la clase Principal (clase que interactúa con el usuario através de la GUI).length. indice=longTotal(). i<longTotal(). } public int obtener(int pos){ return edades[pos]. } public int edadMayor(){ int max=edades[0]. CARRERAS PROFESIONALES CIBERTEC . } public int edadMenor(){ int min=edades[0]. } } Podemos apreciar que la clase ArregloUnidimensional tiene 2 atributos privados: Un arreglo de edades de tipo int La variable indice de tipo int.min + 1) * Math. for(int i=1. que almacena la cantidad de edades ingresadas y la posición del arreglo donde se almacenará una nueva edad. i<indice. return -1. i<indice. return min. i<indice. } //Método privado private int aleatorio (int min. return suma. } public int sumaEdades(){ int suma=0. for(int i=0. i++) if(edades[i]<min) min=edades[i]. for(int i=1.random()+ min). int max) { return (int)((max . } public double edadPromedio(){ return sumaEdades()*1.24 public int buscar(int edad){ for(int i=0. i<indice. Descripción de métodos El método constructor se encarga de crear el arreglo con 10 elementos e inicializa la variable indice en cero ya que el arreglo esta vacío.0/indice. i++) suma+=edades[i]. return max. i++) if(edad==edades[i]) return i. i++) if(edades[i]>max) max=edades[i]. getContentPane().awt. getContentPane().20.setLayout(null).400). El método longTotal devuelve la longitud total de todo el arreglo El método obtener devuelve la edad que se encuentra en el arreglo en la posición pos ya que desde afuera de la clase no se tiene acceso al arreglo por ser privado. El método generar llena el arreglo de números aleatorios de 2 cifras. btnListar. CIBERTEC CARRERAS PROFESIONALES .*. JTextArea txtS. javax. btnBuscar. El método reinicializar crea un nuevo bloque de 10 elementos de tipo int y se almacena en la variable edades la referencia o dirección de éste nuevo bloque de elementos perdiendose la dirección del bloque anterior. semana3.lightGray). txtEdad = new JTextField(). lblEdad = new JLabel("Edad :"). El método getIndice es un método de acceso para el atributo indice ya que éste es privado. lblEdad.setSize(460.setBounds(40.ArregloUnidimensional.add(lblEdad).awt.setBackground(Color. El método buscar localiza una edad y devuelve la posición donde lo encontró.*. Devuelve la cantidad de edades ingresadas. lblArreglo. Si la edad no existe devuelve -1 que es un indicador de no encontrado.event. btnReportar. // Creación de la interfaz gráfica de usuario: GUI public void init() { getContentPane(). public class Principal extends JApplet implements ActionListener { // Declaración de variable globales JLabel lblEdad. btnGenerar. java. Los métodos: sumaEdades.25). El garbage collector se encargará de destruir el bloque anterior. edadMenor.swing. Código de la clase Principal import import import import java. btnReinicializar. ArregloUnidimensional a=new ArregloUnidimensional().100.ALGORITMOS Y ESTRUCTURA DE DATOS 25 - - - El método adicionar se encarga de almacenar la edad en el arreglo e incrementa la variable indice en uno.*. JScrollPane scpScroll. JButton btnIngresar. edadMayor y edadPromedio son métodos de cálculo. JTextField txtEdad. getContentPane(). 23).26 txtEdad. btnIngresar.add(btnIngresar). } CARRERAS PROFESIONALES CIBERTEC .234)).addActionListener(this). lblArreglo. btnGenerar.205.setBounds(120. txtS = new JTextArea().add(lblArreglo). lblArreglo = new JLabel("Arreglo Lineal". getContentPane().155.150.setBackground(new Color(226. btnBuscar.black).addActionListener(this).setBounds(320. btnIngresar.setBounds(320.JLabel.add(btnBuscar).addActionListener(this).setBounds(320.setBounds(320. btnListar = new JButton("listar").add(btnListar). btnGenerar = new JButton("generar").150.addActionListener(this).199. getContentPane().setOpaque(true). btnBuscar = new JButton("Buscar"). btnListar.298).add(btnGenerar).setBounds(250.150.addActionListener(this). getContentPane().130. btnListar.20. btnReportar = new JButton("reportar").23). getContentPane().150. lblArreglo.setFont(new Font("dialog". lblArreglo.20.add(btnReportar).setForeground(Color. btnReinicializar = new JButton("reinicializar arreglo"). lblArreglo.19)). getContentPane().setBounds(10.150. getContentPane().add(scpScroll).80.23). scpScroll. btnReportar.223.23).80. getContentPane().add(btnReinicializar).setBounds(320. btnReinicializar.addActionListener(this). btnBuscar.40). getContentPane().23).add(txtEdad). lblArreglo.80.150. btnGenerar. getContentPane(). btnReportar.CENTER).180.3.23).300.25). btnReinicializar.105. btnIngresar = new JButton("Ingresar"). scpScroll=new JScrollPane(txtS).setBounds(320. getSource() == btnIngresar) ingresar().obtener(i)).").edadMenor()). imprimir("Promedio de edades:" + a.getSource() == btnGenerar) generar(). } void ingresar() { try{ if(a.. } void reportar() { txtS.sumaEdades()). if (e. imprimir("Edad menor:"+a.getIndice()>0){ imprimir("Suma de edades:"+a.edadPromedio()).longTotal()){ int edad=getEdad().getSource() == btnReinicializar) reinicializarArreglo().getSource() == btnBuscar) buscar(). a. } catch(Exception x){ mensaje("Edad incorrecta").getIndice()<a. if (e.setText("").getIndice()>0){ for(int i=0. i<a.getIndice().setText("").ALGORITMOS Y ESTRUCTURA DE DATOS 27 // Ejecución de los eventos tipo ActionEvent public void actionPerformed (ActionEvent e) { if (e. i++) imprimir("edad["+i+"] =" + a. } CIBERTEC CARRERAS PROFESIONALES . } else mensaje("Arreglo lleno"). imprimir("Edad mayor:"+a.edadMayor()). listar().getSource() == btnListar) listar(). if (e.adicionar(edad). } else mensaje("Arreglo vacío. limpiar(). if(a. if(a. } } void listar() { txtS.getSource() == btnReportar) reportar().. if (e. if (e. } } void limpiar() { txtEdad.parseInt(txtEdad. } catch(Exception x){ mensaje("Edad incorrecta"). a..setText("").cad). } else mensaje("Arreglo vacío.. } void imprimir (String cadena) { txtS. } int getEdad() { return Integer.showMessageDialog(this.requestFocus().. if(pos==-1) mensaje("La edad no existe"). txtEdad.. } void buscar(){ try{ int edad=getEdad().28 else mensaje("Arreglo vacío.append(cadena + "\n"). mensaje("El arreglo se reinicializó").reinicializar(). } void generar() { a. else mensaje("La edad se encuentra en la posición: "+pos).buscar(edad). listar(). } } CARRERAS PROFESIONALES CIBERTEC .getText()).getIndice()>0){ txtS.").generar(). } void reinicializarArreglo() { if(a. } void mensaje(String cad){ JOptionPane."). int pos=a.setText(""). i++) edades[i]=aux[i]. } private void ampliarArreglo(){ int aux[]=edades. edades[indice]=edad. edades=new int[indice+10]. for(int i=0. } CIBERTEC CARRERAS PROFESIONALES . i<indice. es decir que si el arreglo edades se llena éste se amplie. indice++. En la clase ArregloUnidimensional: public void adicionar(int edad) { if(indice==edades.ALGORITMOS Y ESTRUCTURA DE DATOS 29 GUI del Ejemplo 1: Ejemplo 2 Cree un método que permita adicionar edades en forma ilimitada.length) ampliarArreglo(). i<indice-1. j<indice. edades[j]=aux. } CARRERAS PROFESIONALES CIBERTEC . i++) for(int j=i+1. listar(). } } Ejemplo 3 Cree un método que permita ordenar en forma ascendente el arreglo de edades. } } En la clase Principal: void ordenar(){ a. En la clase ArregloUnidimensional: public void ordenarAscendente(){ int aux. } catch(Exception x){ mensaje("Edad incorrecta").ordenarAscendente().adicionar(edad). a. listar(). edades[i]=edades[j]. for(int i=0.30 En la clase Principal: void ingresar() { try{ int edad=getEdad(). j++) if(edades[i]>edades[j]){ //intercambio aux=edades[i]. El arreglo se encuentra inicializado con números aleatorios de 2 cifras y se encuentra parcialmente lleno. 2) Cree la clase ArregloNumeros en el paquete semana4 y declare los siguientes atributos como privados: .Reportar. CIBERTEC CARRERAS PROFESIONALES . 99 . 3) Asuma la existencia del siguiente arreglo unidimensional: int n [] = new int [10]. Desarrolle los siguientes métodos en la clase donde se encuentra declarado el arreglo. que al pulsarlo imprime el número mayor.Un método que retorne la cantidad de números capicuas En la clase Principal debe programar los botones: .Generar.Un método que retorne la cantidad de números impares ... la cantidad de números impares y la cantidad de números capicuas.Un constructor que cree el arreglo .Un método que genere 10 sueldos en el rango: 500 .Un método que calcule el número mayor .Un método que genere 15 numeros en el rango: 10 . int indice.Una variable indice de tipo int que almacene la cantidad de sueldos Implemente los siguientes métodos: .Un método que calcule el sueldo promedio.Un constructor que cree el arreglo .Una variable indice de tipo int que almacene la cantidad de números Implemente los siguientes métodos: . sueldo promedio y cantidad de sueldos de tal forma que al pulsar estos botones se llamen a los métodos creados en la clase ArregloSueldos. .ALGORITMOS Y ESTRUCTURA DE DATOS 31 Ejercicios 1) Cree la clase ArregloSueldos en el paquete semana3 y declare los siguientes atributos como privados: .Un método que retorne la cantidad de sueldos mayores a 2000 En la clase Principal debe programar los botones: generar. 3000 . que al pulsarlo se genere los 15 números en el arreglo .Un arreglo de sueldos de tipo double .Un arreglo de números de tipo int . Problema_9: Intercambie el segundo número par por el penúltimo número impar. Problema_8: Intercambie el primer número par por el último número impar.32 Problema_1: Diseñe un método que reemplace el número mayor del arreglo por la suma de todos los números pares. En todos los casos considere los mensajes de error pertinentes. Problema_2: Diseñe un método que reemplace el segundo número impar por la suma de todos los números que empiezan con el dígito 2. Problema_7: Diseñe un método que elimine el segundo número par del arreglo si es que existe de lo contrario muestre un mensaje de error. Problema_10: Intercambie el primer número múltiplo de 3 por el último número múltiplo de 7. Asuma la existencia de los métodos: mensaje y listar. Problema_3: Diseñe un método que retorne la suma del tercer número impar con el penúltimo número múltiplo de 3. CARRERAS PROFESIONALES CIBERTEC . Problema_6: Diseñe un método que busque y elimine el número mayor del arreglo. Problema_5: Diseñe un método que busque y elimine el número menor del arreglo. Problema_4: Diseñe un método que busque un número y retorne la suma de todos los números del arreglo desde la posición cero hasta el número encontrado. Si el número no existe muestre un mensaje de error. CIBERTEC CARRERAS PROFESIONALES . TEMARIO Modificador static Referencia this Sobrecarga de constructores Inicializadores estáticos ACTIVIDADES PROPUESTAS Los alumnos emplean el modificador static y la referencia this. Los alumnos entienden el concepto de sobrecarga. Adicionalmente emplean el modificador static.ALGORITMOS Y ESTRUCTURA DE DATOS 33 UNIDAD DE APRENDIZAJE 2 SEMANA 5 MODIFICADOR STATIC Y REFERENCIA THIS LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. los alumnos manipulan arreglos unidimensionales y bidimensionales con tipos primitivos. Los alumnos reconocen una librería empleando métodos estáticos Los alumnos emplean inicializadores estáticos. así como arreglo de objetos en diversas aplicaciones. private int nota1. Ejemplo 1 Haga que la clase Alumno cuente la cantidad de objetos creados. public class Alumno { // Variables miembro private String nombre. cantidad++. int n2) { nombre = nom. } // Métodos de acceso: get/set public String getNombre() { return nombre. lo que ocurre antes de crear cualquier objeto de la clase. // Constructor public Alumno(String nom. package semana5. una variable de clase es una variable de la que se crea una sola copia para todos los objetos de la clase. Esto significa que las variables de clase pueden existir aún cuando no exista objeto de la clase. Para que una variable sea variable de clase hay que preceder su declaración con el modificador static. } public void setNota2(int n) { nota2 = n. Las variables de clase se crean en el momento en que la clase se carga a la memoria. Se puede acceder a una variable de clase pública a través de una referencia a un objeto de la clase o mediante el nombre de la clase. } public void setNota1(int n) { nota1 = n. } CARRERAS PROFESIONALES CIBERTEC . nota1 = n1. int n1. } public int getNota2() { return nota2. En cambio. nota2 = n2. } public int getNota1() { return nota1. public static int cantidad = 0. MODIFICADOR: STATIC Una variable de instancia es una variable de la que se crea una copia independiente para cada objeto de la clase.34 1. nota2. imprimir("# objetos creados : " + Alumno. La referencia this es un parámetro oculto añadido por el compilador.5 María 14 20 : 17.13. a3 = new Alumno("María". la referencia this contiene la dirección de memoria del objeto que invocó al método.0 Pedro 16 17 : 16. Ejemplo 2 Haga que los parámetros del constructor y de los métodos set tengan el mismo nombre que las variables miembro.0 3 # objetos creados : 2. } } A la pulsación de un botón cree tres objetos y visualice sus contenidos. listado(a3). CIBERTEC CARRERAS PROFESIONALES . En este caso. listado(a2).17). agregue un método que calcule el mayor promedio entre 2 objetos de tipo Alumno.15). Adicionalmente.ALGORITMOS Y ESTRUCTURA DE DATOS 35 // Operaciones public double promedio() { return (nota1 + nota2) / 2.0. } nombre : nota 1 : nota 2 : promedio nombre : nota 1 : nota 2 : promedio nombre : nota 1 : nota 2 : promedio Juan 13 15 : 14. REFERENCIA: THIS Dentro de un método de la clase. void procesar() { Alumno a1 = new Alumno("Juan". a2 = new Alumno("Pedro".14. su objetivo es diferenciar la variable miembro del parámetro en sí. la cantidad de objetos. Una de sus aplicaciones más comunes es cuando el nombre de un parámetro coincide con el nombre de una variable miembro. Muestre además.20). listado(a1).16.cantidad). nombre = nombre. public static int cantidad = 0. } // Métodos de acceso: get/set public String getNombre() { return nombre.0. nota2.nota2 = nota2. this.nombre = nombre. int nota1. private int nota1. // Constructor public Alumno(String nombre. } public int getNota1() { return nota1. } public int getNota2() { return nota2.promedio()>obj. } public Alumno mayorPromedio(Alumno obj){ /* this contiene la referencia del objeto que invocó al método */ if(this.promedio()) return this. public class Alumno { // Variables miembro private String nombre. } } CARRERAS PROFESIONALES CIBERTEC . this. } public void setNota1(int nota1) { this. cantidad++. } // Operaciones public double promedio() { return (nota1 + nota2) / 2.36 package semana5. int nota2) { this. else return obj.nota2 = nota2.nota1 = nota1. } public void setNombre(String nombre) { this. } public void setNota2(int nota2) { this.nota1 = nota1. listado(a1). imprimir("# objetos creados : " + Alumno. Muestre además. } void listado(Alumno x){ imprimir("Objeto:"+x). cantidad++. imprimir(""). Alumno objMaxProm=a1.nota1 = nota1. a2 = new Alumno("Pedro". nota2 = 88. void procesar(){ Alumno a1 = new Alumno("Juan". listado(a2).getNombre()).14).mayorPromedio(a2).getNota1()). imprimir("Nota1:"+x.15.cantidad). // Constructores public Alumno(String nombre. la cantidad de objetos y el nombre del alumno con mayor promedio. cantidad++.ALGORITMOS Y ESTRUCTURA DE DATOS 37 A la pulsación de un botón cree dos objetos y visualice sus contenidos. package semana5. public static int cantidad = 0. } 3.getNota2()). Para diferenciar un método de otro.nombre = nombre. this.13). imprimir("Promedio:"+x. public class Alumno { // Variables miembro private String nombre = "ninguno". imprimir("Nota2:"+x. } public Alumno(String nombre) { this. se utiliza el número y tipo de parámetros que tiene el método y no su tipo de retorno. int nota2) { this.12. } CIBERTEC CARRERAS PROFESIONALES . SOBRECARGA DE MÉTODOS La sobrecarga de métodos consiste en crear varios métodos con el mismo nombre. this.getNombre()). private int nota1 = 88. Ejemplo 3 Haga que las variables miembro de la clase Alumno se inicialicen por defecto y luego considere tres constructores. imprimir("Nombre:"+x. Los constructores también pueden ser sobrecargados.nombre = nombre.promedio()).nota2 = nota2. imprimir("El alumno con mayor promedio es:"+ objMaxProm. int nota1. } public void setNota2(int nota2) { this. listado(a3). } public int getNota1() { return nota1. } public void setNota1(int nota1) { this.0.0 nombre : Pedro CARRERAS PROFESIONALES CIBERTEC . } // Métodos de acceso: get/set public String getNombre() { return nombre. } nombre : nota 1 : nota 2 : promedio Juan 13 15 : 14.cantidad). void procesar() { Alumno a1 = new Alumno("Juan". } public int getNota2() { return nota2. imprimir("# objetos creados : " + Alumno.nota2 = nota2. listado(a1). } public void setNombre(String nombre) { this.38 public Alumno() { /* En este caso el this se utiliza para llamar al segundo constructor */ this("Monica").nota1 = nota1.nombre = nombre. } } A la pulsación de un botón cree tres objetos y visualice sus contenidos. listado(a2). a3 = new Alumno().15). a2 = new Alumno("Pedro").13. } // Operaciones public double promedio() { return (nota1 + nota2) / 2. ALGORITMOS Y ESTRUCTURA DE DATOS 39 nota 1 : 88 nota 2 : 88 promedio : 88. imprimir("# objetos creados :" + Clase. c3 = new Clase(). APLICACIÓN DE METODOS DE CLASE Una aplicación interesante donde empleamos métodos de clase es cuando creamos una librería. una clase que contenga métodos a los cuales invocaremos desde cualquier otra clase de un proyecto sin necesidad de crear un objeto. contador = 0. public class Clase { private static int public Clase() { contador++. Para declarar un método como método de clase hay que anteponer a su tipo de retorno la palabra static.0 nombre : nota 1 : nota 2 : promedio Monica 88 88 : 88.getContador()). } } void procesar() { Clase c1 = new Clase(). Se puede acceder a un método de clase público a través de una referencia a un objeto de la clase o mediante el nombre de la clase. MÉTODOS DE CLASE Así como existen variables de clase existen métodos de clase. Luego. es decir. Ejemplo 4 Declare la clase Clase que cuente la cantidad de objetos creados. c2 = new Clase().0 3 # objetos creados : 4. package semana5. a la pulsación de un botón cree tres objetos. CIBERTEC CARRERAS PROFESIONALES . } public static int getContador() { return contador. Un método de clase puede operar únicamente sobre variables de clase y/o métodos de clase y no puede usar la referencia this. } 5. } public static double raizN(double num. Método redondeoN : el método retorna un número (parámetro num) redondeado a una cantidad de decimales indicada (parámetro cant). } Los resultados son: potencia de 5 elevado a 2:25. } } El constructor de la clase tiene un acceso privado para que no pueda ser invocado y de esta forma no podrá crear un objeto de tipo LibNumeros.0 redondeo del número 13.3)). int cant){ return Math.exp). La llamada a los métodos sería de la siguiente manera: void procesar(){ imprimir("potencia de 5 elevado a 2:"+ LibNumeros. double exp){ return Math. double raiz){ return Math. package compartido.2)).pow(num. imprimir("raiz cúbica de 27:"+ LibNumeros.cant).44567 a 3 decimales:" + LibNumeros. imprimir("redondeo del número 13.rint(num*pot(10.44567 a 3 decimales:13.44567. Método raizN : el método retorna la raiz (parámetro raiz) de un número (parámetro num).cant))/pot(10.0 raiz cúbica de 27:3. Descripción de los métodos de la clase LibNumeros: Método pot : el método retorna la potencia de un número (parámetro num) elevado a un exponente (parámetro exp). public class LibNumeros { private LibNumeros(){ } public static double pot(double num.40 Ejemplo 5 Diseñe una clase que contenga métodos que puedan ser invocados desde cualquier clase sin necesidad de crear un objeto.pow(num.(1/raiz)).446 CARRERAS PROFESIONALES CIBERTEC .pot(5.3)). } public static double redondeoN(double num.raizN(27.redondeoN(13. ALGORITMOS Y ESTRUCTURA DE DATOS 41 Ejemplo 6 Otro ejemplo de librería pero esta vez trabajando con cadenas: package compartido; public class LibCadenas { private LibCadenas (){ } public static String mayus(String cad){ return cad.toUpperCase(); } public static String minus(String cad){ return cad.toLowerCase(); } public static String rellena(String cad, int num){ int tam=cad.length(); for(int i=tam; i<num; i++) cad+=' '; return cad; } public static String extrae(String cad, int pos){ // pos en el rango de 1 .. longitud de la cadena. cad=cad.trim(); int tam = cad.length(); if(pos>=1 && pos<=tam) return ""+cad.charAt(pos-1); else return "Verifique los parámetros"; } public static String extrae(String cad, int posIni, int posFin){ // pos en el rango de 1 .. longitud de la cadena. int tam=cad.length(); if(posIni>=1 && posFin<=tam) return cad.substring(posIni-1,posFin); else return "Verifique los parámetros"; } } Descripción de los métodos de la clase LibCadenas: Método mayus: el método retorna la cadena en mayúsculas. Método minus: el método retorna la cadena en minúsculas. CIBERTEC CARRERAS PROFESIONALES 42 - - Método rellena: el método rellena con espacios una cadena (parámetro cad) de tal forma que la cadena este compuesta por la cantidad de caracteres especificados (parámetro num). Método extrae: el método extrae es un método sobrecargado. Esto quiere decir que se puede invocar al método mandandole 2 parámetros (cadena y posición) o mandandole 3 parámetros (cadena, posición inicial y posición final). Si utilizamos la sintaxis: LibCadenas.extrae(cadena,pos); el método retornará una cadena que contenga el carácter que se encuentre en la posición pos. Si utilizamos la sintaxis: LibCadenas.extrae(cadena,posIni,posFin); el método retornará la cadena comprendida desde la posición inicial hasta la posición final indicada. La llamada a los métodos sería de la siguiente manera: void procesar(){ imprimir(LibCadenas.mayus("CibertEc")); imprimir(LibCadenas.minus("CIBERTEC")); imprimir("|"+LibCadenas.rellena("hola",10)+"|"); imprimir(LibCadenas.extrae("Cibertec",5)); imprimir(LibCadenas.extrae("hola como estas",6,9)); } Los resultados son: CIBERTEC cibertec |hola | r como 6. INICIALIZADORES ESTÁTICOS Un inicializador static es un bloque de código definido en la clase que se llama automáticamente al cargarse la clase en la memoria. Se diferencia del constructor en que no es invocado para cada objeto, sino una sola vez para toda la clase. La forma de crear un inicializador static es la siguiente: static{ . . . . . . } Este bloque de código se utiliza para darle valores iniciales a las variables estáticas. También se utilizan para invocar a métodos nativos, es decir, métodos escritos por ejemplo en lenguaje C. En una clase se pueden definir varios inicializadores estáticos, los cuales se ejecutan en el orden en el que han sido definidos. CARRERAS PROFESIONALES CIBERTEC ALGORITMOS Y ESTRUCTURA DE DATOS 43 Ejemplo 7 Cree la clase Empleado en el paquete semana5 y declare los siguiente atributos como privados: cod (int), nom (String) y horas (double). La clase debe tener las siguientes variables estáticas con acceso privado: tarifa, porcentaje de descuento (la tarifa como el porcentaje de descuento deben ser variables estáticas porque se va aplicar la misma tarifa y porcentaje de descuento a todos los empleados), contador de empleados y el sueldo neto acumulado de todos los empleados. Implemente los siguientes métodos: a) b) c) d) e) Un constructor que inicialice a los atributos. Métodos de acceso: set/get para cada atributo. Un método que retorne el sueldo bruto (horas*tarifa) Un método que retorne el descuento (un porcentaje del sueldo bruto) Un método que retorne el sueldo neto (sueldo bruto - descuento) La tarifa y el porcentaje de descuento se debe inicializar con S/. 40 y 11% respectivamente. Para ello, utilice inicializadores estáticos. Debe existir la posibilidad de que el usuario pueda modificar la tarifa y el porcentaje de descuento. En la clase principal (donde esta la GUI) implemente lo siguiente: a) Cree un objeto de tipo empleado cada vez que se pulse el botón Procesar. Los datos serán capturados de la GUI. b) Cree un método listar que imprima todos los atributos del empleado, la tarifa, el porcentaje de descuento, el sueldo bruto, el descuento en soles y el sueldo neto del empleado. c) Imprima la cantidad de empleados creados. d) Imprima el sueldo neto acumulado de todos los empleados. e) Cree un método modificar que permita ingresar la nueva tarifa y el nuevo porcentaje de descuento para los empleados. Este método debe ser llamado al pulsar el botón Modificar. Solución del problema: Cabe resaltar que en esta solución estamos aplicando casi todo lo que hemos visto en la primera unidad del curso. Código de la clase Empleado: package semana5; import javax.swing.*; public class Empleado { // Atributos privados private int cod; private String nom; private double horas; CIBERTEC CARRERAS PROFESIONALES String nom. private static double pordscto. mostrar("llamada al constructor"). } // Métodos de acceso: get public int getCodigo(){ return cod.horas=horas. this. } // Métodos de acceso: set public void setCodigo(int cod){ this. } public double getHoras(){ CARRERAS PROFESIONALES CIBERTEC .44 // Variables de clase o estáticas private static double tarifa. } public void setHoras(double horas){ this. cont++. } // Constructor public Empleado(int cod. private static int cont. private static double snetoAcum. double horas) { this.nom=nom. } public void setNombre(String nom){ this. } static{ cont=0. } public String getNombre(){ return nom.horas=horas. // Inicializadores static static{ tarifa=40. this. snetoAcum+=sneto().cod=cod. snetoAcum=0. pordscto=11.cod=cod.nom=nom. mostrar("llamada al inicializador 1"). mostrar("llamada al inicializador 2"). } public double descuento(){ return sbruto()*(pordscto/100). } public static double getPordscto(){ return pordscto. } // Métodos de clase o estáticos con valor de retorno public static double getTarifa(){ return tarifa. } public double sneto(){ return sbruto()-descuento().cad). } } CIBERTEC CARRERAS PROFESIONALES . } // Métodos de cálculo public double sbruto(){ return horas*tarifa. } public static int getContador(){ return cont. } public static void mostrar(String cad){ JOptionPane. } public static double getSnetoAcum(){ return snetoAcum.showMessageDialog(null. } public static void setPordscto(double p){ pordscto=p. } // Métodos de clase o estáticos tipo void public static void setTarifa(double t){ tarifa=t.ALGORITMOS Y ESTRUCTURA DE DATOS 45 return horas. setLayout(null). btnModificar.add(lblNombre).206)). CARRERAS PROFESIONALES CIBERTEC .add(lblCodigo). public void init() { getContentPane().20). java.20). getContentPane().100.awt. lblNombre. // lblCodigo lblCodigo=new JLabel("Codigo:").add(lblHoras).setBounds(10.setBounds(10. getContentPane().100. lblCodigo. JTextField txtCodigo. // txtCodigo txtCodigo=new JTextField(). lblNombre. javax. lblHoras. txtNombre.add(txtNombre).add(txtCodigo).46 Código de la clase Principal: import import import import java. txtHoras.100.20). // txtNombre txtNombre=new JTextField().*.swing. getContentPane().setBounds(120.20). getContentPane().event. JButton btnProcesar.add(txtHoras). // lblNombre lblNombre=new JLabel("Nombre:"). txtNombre.setBounds(10.*.211. txtHoras. btnBorrar.setBackground(new Color (214.Empleado.*.30.20).10.100. semana5.100. getContentPane().setBounds(120. // txtHoras txtHoras=new JTextField().setBounds(120. JTextArea txtS. txtCodigo. public class Principal extends JApplet implements ActionListener{ // Declaración de variables globales JLabel lblCodigo. getContentPane().awt.30. // lblHoras lblHoras=new JLabel("Horas:").50. JScrollPane scpScroll. lblHoras. getContentPane().20).100.50.10. ALGORITMOS Y ESTRUCTURA DE DATOS 47 // btnProcesar btnProcesar = new JButton("Procesar"); btnProcesar.setBounds(250, 10, 100, 20); btnProcesar.addActionListener(this); getContentPane().add(btnProcesar); // btnBorrar btnBorrar = new JButton("Borrar"); btnBorrar.setBounds(250, 30, 100, 20); btnBorrar.addActionListener(this); getContentPane().add(btnBorrar); // btnModificar btnModificar = new JButton("Modificar"); btnModificar.setBounds(250, 50, 100, 20); btnModificar.addActionListener(this); getContentPane().add(btnModificar); // txtS txtS = new JTextArea(); txtS.setFont(new Font("monospaced", 0, 12)); // scpScroll scpScroll=new JScrollPane(txtS); scpScroll.setBounds(10, 90, 350, 240); getContentPane().add(scpScroll); } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ if( e.getSource() == btnProcesar ) procesar(); if( e.getSource() == btnModificar ) modificar(); if( e.getSource() == btnBorrar ) borrar(); } void procesar(){ Empleado emp = new Empleado(getCodigo(),getNombre(),getHoras()); listar(emp); imprimir("Cantidad de empleados creados:" + Empleado.getContador()); imprimir("Sueldo neto acumulado:" + Empleado.getSnetoAcum()); imprimir(""); } CIBERTEC CARRERAS PROFESIONALES 48 void listar(Empleado x){ imprimir("Objeto:"+x); imprimir("Código:"+x.getCodigo()); imprimir("Nombre:"+x.getNombre()); imprimir("Horas:"+x.getHoras()); imprimir("Tarifa:"+x.getTarifa()); imprimir("% de descuento:"+x.getPordscto()); imprimir("Sueldo bruto:"+x.sbruto()); imprimir("Descuento S/.:"+x.descuento()); imprimir("Sueldo neto:"+x.sneto()); imprimir(""); } void modificar(){ try{ String valor1 = JOptionPane.showInputDialog( this,"Ingrese la nueva tarifa:", Empleado.getTarifa()); double tarifa = Double.valueOf(valor1); String valor2 = JOptionPane.showInputDialog( this,"Ingrese el nuevo % descuento:", Empleado.getPordscto()); double pordscto = Double.valueOf(valor2); //Modificando las variables estáticas Empleado.setTarifa(tarifa); Empleado.setPordscto(pordscto); } catch(Exception x){ JOptionPane.showMessageDialog(this,"Verifique los datos ingresados"); } } void borrar(){ txtCodigo.setText(""); txtNombre.setText(""); txtHoras.setText(""); txtS.setText(""); txtCodigo.requestFocus(); } void imprimir( String s ){ txtS.append(s + "\n"); } int getCodigo(){ return Integer.parseInt(txtCodigo.getText()); } CARRERAS PROFESIONALES CIBERTEC ALGORITMOS Y ESTRUCTURA DE DATOS 49 String getNombre(){ return txtNombre.getText(); } double getHoras(){ return Double.parseDouble(txtHoras.getText()); } } Importante: Cabe resaltar que una vez que la clase se carga en la memoria (esto ocurre al crearse el primer objeto o al utilizar una variable o método static) primero se ejecutan los inicializadores static y luego el constructor de la clase. CIBERTEC CARRERAS PROFESIONALES 50 Ejercicios 1) Cree la clase Vendedor en el paquete semana5 y declare los siguiente atributos como privados: cod (int). nom (String) y monto vendido (double).Un método de clase que retorne el contador. Para ello. Este método debe ser llamado al pulsar el botón Modificar. Implemente los siguientes métodos: . utilice inicializadores estáticos. la comisión en soles y el sueldo bruto del vendedor. el porcentaje de comisión. . Debe existir la posibilidad de que el usuario pueda modificar el porcentaje de comisión. contador de vendedores y el sueldo bruto acumulado de todos los vendedores.00) Un método que retorne la comisión en soles (monto vendido * % de comisión) Un método que retorne el sueldo bruto (sueldo basico + comisión) El porcentaje de comisión se debe inicializar con 5% . . Cree un método listar que imprima todos los atributos del vendedor. Imprima el sueldo bruto acumulado de todos los vendedores. precio(double) y cantidad(int). Imprima la cantidad de vendedores creados. La clase debe tener las siguientes variables estáticas con acceso privado: porcentaje de comisión.Un constructor que inicialice a los atributos. CARRERAS PROFESIONALES CIBERTEC .Métodos de acceso get y set para cada atributo. Los datos serán capturados de la GUI. Métodos de acceso: set/get para cada atributo.Un método de clase que retorne el mayor importe.Un método que retorne el importe a pagar (cantidad * precio). Un método que retorne el sueldo basico (sueldo fijo de S/ 550. nombre(String). importe mayor e importe acumulado para todas las ventas. . En la clase principal (donde esta la GUI) implemente lo siguiente: a) b) Cree un objeto de tipo vendedor cada vez que se pulse el botón Procesar. Implemente los siguientes métodos: a) b) c) d) e) Un constructor que inicialice a los atributos. Cree la clase Producto en el paquete semana5 y declare los siguientes atributos privados: código (String). el sueldo basico. c) d) e) 2. Declare las siguientes variables estáticas con acceso privado: contador. Cree un método modificar que permita ingresar el nuevo porcentaje de comisión para los vendedores. . } public Articulo(){ y -= 2. Dada la siguiente clase: public class Articulo{ public static int y = 5.Un método de clase que retorne el menor tiraje. mayor importe y el importe acumulado). titulo. precio. el importe mayor e importe acumulado se debe inicializar en cero. número de páginas y tiraje de impresión) y el valor de las variables estáticas (numero de colores de impresión. empleando para ello inicializadores estáticos. Asuma la existencia del método imprimir().Un método de clase que retorne el importe acumulado de todas las ventas. 3. El contador.Un método de clase que retorne el tiraje de impresión acumulado de los libros.ALGORITMOS Y ESTRUCTURA DE DATOS 51 . static{ y += 10. . número de páginas (int) y tiraje de impresión (int). Cree la clase Libro en el paquete semana5 y declare los siguientes atributos privados: código (int). } } CIBERTEC CARRERAS PROFESIONALES .. Emplee inicializadores estáticos para inicializar a las variables estáticas.Un método de clase que retorne el número de colores.Métodos de acceso get y set para cada atributo. nombre. cantidad) y el valor de las variables estáticas (cantidad de productos. Asuma la existencia del método imprimir().Un constructor que inicialice a los atributos. titulo (String). En la clase principal (donde está la GUI) implemente lo siguiente: a) Cree un objeto de tipo Libro cada vez que pulse el botón Procesar. Declare las siguiente variables estáticas con acceso privado: número de colores de impresión. .Un método que retorne el número de hojas (número de páginas / 2). Implemente los siguientes métodos: . . c) Cree un método modificar que permita ingresar el nuevo tiraje de impresión. Este método debe ser llamado al pulsar el botón Modificar. b) Cree un método listar que imprima todos los atributos del libro (código. menor tiraje y el tiraje de impresión acumulado). Los datos serán capturados de la GUI. . b) Cree un método listar que imprima todos los atributos del producto (código. . tiraje de impresión acumulado y el menor tiraje. En la clase principal (donde está la GUI) implemente lo siguiente: a) Cree un objeto de tipo Producto cada vez que pulse el botón Procesar. 4. Los datos serán capturados de la GUI. } } Cuál es el resultado de la impresión: Articulo a = new Articulo(5555).y += 5.y). static{ y += 10. imprimir(Articulo. } public Articulo(){ y -= 2. 5. static{ y += 2. imprimir(""+Articulo. 6. Dada la siguiente clase: public class Articulo{ public static int y = 5. imprimir(Articulo.52 Cuál es el resultado de la impresión: Articulo a = new Articulo(). Dada la siguiente clase: public class Articulo{ public static int y = 10. } public Articulo(int y){ y += 2. Articulo b = new Articulo(4444).y). } public Articulo(int y){ Articulo.y). } } Cuál es el resultado de la impresión: Articulo a = new Articulo(). Articulo b = new Articulo(). static{ y -= 10. 7. Dada la siguiente clase: public class Articulo{ public static int y = 20. } } CARRERAS PROFESIONALES CIBERTEC . Articulo b = new Articulo(14).sum--. Question("ff"). Dado el siguiente código: public class Question { public Question(float index){ } public Question(int index){ } } Cuál de los siguientes son correctos? A) B) C) D) E) Question Question Question Question Question a a a a a = = = = = new new new new new Question().y).sum--. Question(3.ALGORITMOS Y ESTRUCTURA DE DATOS 53 Cuál es el resultado de la impresión: Articulo a = new Articulo(12). 9. t2.2). imprimir("Suma "+Try. t1.2). Dado el siguiente código: public class Try { public static int sum.sum). Question(8). Try. Question(4. t1=new Try(). } Cuál es el resultado de la impresión: Try t1 = new Try(). CIBERTEC CARRERAS PROFESIONALES . 8. t1. imprimir(""+Articulo.sum++.sum++. Try t2 = new Try(). Adicionalmente emplean el modificador static. CARRERAS PROFESIONALES CIBERTEC . así como arreglo de objetos en diversas aplicaciones.54 UNIDAD DE APRENDIZAJE 2 SEMANA 8 ARREGLO BIDIMENSIONAL LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. los alumnos manipulan arreglos unidimensionales y bidimensionales con tipos primitivos. ACTIVIDADES PROPUESTAS Los alumnos reconocen un arreglo bidimensional. Los alumnos emplean arreglos bidimensionales en diversas aplicaciones. TEMARIO Arreglo Bidimensional Operaciones variadas. ALGORITMOS Y ESTRUCTURA DE DATOS 55 1. ARREGLO BIDIMENSIONAL Un arreglo bidimensional es una matriz donde cada elemento es referenciado através de una fila y una columna. FILAS COLUMNAS n i 00 01 02 03 04 10 11 12 13 14 20 21 22 23 24 Se ha declarado un arreglo bidimensional n del tipo de dato entero. n[1][0]. Los 15 elementos del arreglo n son: n[0][0]. En forma genérica: n[i][j] 0 <= i < FILAS 0 <= j < COLUMNAS n. El índice i lo usaremos para acceder a una fila y el índice j para acceder a una columna. n[0][4].length devuelve la cantidad de columnas de la fila i. en este caso: 3 n[i]. n[1][1]. en este caso: 5 CIBERTEC CARRERAS PROFESIONALES . n[1][3].length devuelve la cantidad de filas. n[2][3]. n[2][4] n[3][5] no está definido. n[2][1]. n[2][2]. El espacio ocupado por cada elemento es igual para todos y en él se pueden almacenar diferentes valores pero del mismo tipo de dato. n[0][2]. n[2][0]. Arreglo bidimensional (dos direcciones) Ej: int j n[][] = new int[3][5]. n[1][2]. n[0][3]. n[0][1]. n[1][4]. i<FILAS. i++) { for (int j=0. j++) txtS. elemento . i<FILAS.append("n[" + i + "][" + j + "] : " + n[i][j] + "\t"). } j n i 60 00 57 01 14 02 78 03 75 04 80 10 65 11 61 12 41 13 84 14 14 20 72 21 73 22 66 23 57 24 LISTADO: Visualice los números generados. j<COLUMNAS. txtS.append("\n"). j++) n[i][j] = aleatorio(10.n[0][0] se refiere al (0 * 5 + 0) + 1 = 1er. elemento .n[2][0] se refiere al (2 * 5 + 0) + 1 = 11vo. void generarNumeros() { for (int i=0.56 NÚMERO DE ELEMENTO: e = (i*columnas + j) + 1 Así: i j i j e . i++) for (int j=0.n[2][4] se refiere al (2 * 5 + 4) + 1 = 15vo. void listar() { for (int i=0. y último elemento INGRESO: Elabore un método que genere números de dos cifras. elemento . } } n[0][0]:60 n[1][0]:80 n[2][0]:14 n[0][1]:57 n[1][1]:65 n[2][1]:72 n[0][2]:14 n[1][2]:61 n[2][2]:73 n[0][3]:78 n[1][3]:41 n[2][3]:66 n[0][4]:75 n[1][4]:84 n[2][4]:57 CARRERAS PROFESIONALES CIBERTEC .99).n[1][0] se refiere al (1 * 5 + 0) + 1 = 6to. j<COLUMNAS. c) El número mayor. Luego. generar(). int posCol){ return n[posFil][posCol]. int col){ n = new int[fil][col]. d) El número menor. this. col. g) La suma de los números de la columna 3. } CIBERTEC CARRERAS PROFESIONALES . this. private int n[][].fil=fil. } //Métodos públicos public int getFilas(){ return fil. e) El promedio de los números. al pulsar el botón Procesar que calcule lo siguiente: a) La cantidad de números. OPERACIONES VARIADAS Ejemplo 1 Diseñe un programa que genere aleatoriamente un arreglo bidimensional de números en función de la cantidad de filas y columnas que el usuario ingrese. public class ArregloBidimensional { //Atributos privados private int fil. //Constructor public ArregloBidimensional(int fil. } public int obtener(int posFil.ALGORITMOS Y ESTRUCTURA DE DATOS 57 2. f) La suma de los números de la fila 2. Los números deben estar en el rango de 10 a 99.col=col. b) La suma de los números. } public int getLongitud(){ return fil*col. } public int getColumnas(){ return col. Código de la clase ArregloBidimensional package semana8. El arreglo Bidimensional se debe crear en la clase ArregloBidimensional dentro del paquete semana8 y la GUI se debe controlar desde la clase Principal. j<col. j++) n[i][j]=aleatorio(10. } public int menor(){ int min=n[0][0]. i++) for(int j=0. CARRERAS PROFESIONALES CIBERTEC . for(int j=0. i++) for(int j=0. } public int mayor(){ int max=n[0][0]. return sum. j++) sum+=n[i][j]. j++) sum+=n[i][j]. i<fil. j<col. for(int i=0. i<fil. i<fil. j<col. i<fil. for(int i=0. for(int i=0. j++) if(n[i][j]>max) max=n[i][j]. i<fil. return max. i++) if(i==f) for(int j=0.58 public int suma(){ int sum=0. i<fil. j<col. for(int i=0. j<col. i++) sum+=n[i][j].99). } //Métodos privados private void generar(){ for(int i=0. } public int sumaColumna(int c){ int sum=0. return sum. i++) for(int j=0. i++) for(int j=0. j++) if(n[i][j]<min) min=n[i][j].0/getLongitud(). j<col. } public int sumaFila(int f){ int sum=0. j++) if(j==c) for(int i=0. } public double promedio(){ return suma()*1. return min. return sum. addActionListener(this). getContentPane().add(lblColumnas). btnProcesar.awt.add(txtColumnas). JTextArea txtS.random()+min). int max){ return (int)((max-min+1)*Math. CIBERTEC CARRERAS PROFESIONALES . } } Código de la clase Principal import import import import java.setBounds(150.60.setBounds(30. javax. getContentPane(). btnGenerar.awt. JScrollPane scpScroll. btnGenerar=new JButton("Generar").20).lightGray).20). ArregloBidimensional a. lblFilas. txtColumnas.add(lblFilas).20. lblColumnas = new JLabel("Columnas").setBounds(300.50.event.*.*.addActionListener(this). getContentPane().50. txtFilas.20.setLayout(null).add(txtFilas).20).20). btnProcesar. lblFilas = new JLabel("Filas").100.add(btnProcesar).100. getContentPane(). java.setBounds(30. semana8.setBounds(150. // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().*. txtFilas = new JTextField().50.100. txtColumnas = new JTextField(). getContentPane(). getContentPane(). btnProcesar=new JButton("Procesar").ALGORITMOS Y ESTRUCTURA DE DATOS 59 } private int aleatorio(int min. btnProcesar.20). getContentPane(). JTextField txtFilas. lblColumnas.setBackground(Color.20.lblColumnas.swing.20). JButton btnGenerar.60.ArregloBidimensional. btnGenerar.setBounds(300.txtColumnas.add(btnGenerar). public class Principal extends JApplet implements ActionListener{ JLabel lblFilas.100. getText()). txtS. } int getFilas() { int num.parseInt(txtFilas. imprimir("e) Promedio de números:"+a. i++){ for(int j=0.menor()). listar().j). } txtS. i<a.append("n["+i+"]["+j+"]="+x+"\t"). imprimir("g) Suma de números columna 3:"+ a.add(scpScroll). } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ if(e. for(int i=0.promedio()).getSource()==btnGenerar) generar(). } void generar(){ int filas=getFilas(). scpScroll.getColumnas().220). } else mensaje("datos incorrectos").getSource()==btnProcesar) procesar(). j++){ int x = a. imprimir("b) Suma de números:"+a.col). imprimir("c) Número mayor:"+a. imprimir("a) Cantidad de números:"+a.60 txtS=new JTextArea(). scpScroll=new JScrollPane(txtS).setBounds(30. imprimir("f) Suma de números fila 2:"+a.getLongitud()).400.100.obtener(i. if(filas>0 && col>0){ a = new ArregloBidimensional(filas.getFilas(). if(e. } } void procesar(){ imprimir("").sumaFila(2)). imprimir("d) Número menor:"+a.suma()).mayor()). } void listar(){ txtS.append("\n"). getContentPane().setText(""). try { num = Integer. j<a. int col=getColumnas(). CARRERAS PROFESIONALES CIBERTEC .sumaColumna(3)). } void mensaje(String cad){ JOptionPane. } return num.getText()).ALGORITMOS Y ESTRUCTURA DE DATOS 61 } catch(Exception e) { num = 0. } catch(Exception e) { num = 0. } return num. try { num = Integer. } } GUI : CIBERTEC CARRERAS PROFESIONALES .append(cad + "\n").parseInt(txtColumnas.showMessageDialog(this. } int getColumnas() { int num. } void imprimir(String cad){ txtS.cad). } //Métodos públicos public int getFilas(){ return filas. Coca Cola. javax.ArregloEncuestas. int posCol){ return encuestas[posFila][posCol].62 Ejemplo 2 Diseñe un programa para encuestar a un grupo de personas de diferentes edades sobre sus preferencias en bebidas gaseosas entre: Pepsi Cola. semana8. public class ArregloEncuestas { //Atributos privados private final int filas =5. } } Código de la clase Principal import import import import java.*. prefieren cada tipo de gaseosa. } public void registrar(int per.col= 4. } public int getColumnas(){ return col. //Constructor public ArregloEncuestas() { encuestas=new int[filas][col].event. Fanta y Crush.*.awt. } public int obtener(int posFila.swing. java. CARRERAS PROFESIONALES CIBERTEC . private int encuestas[][]. La empresa encuestadora desea saber lo siguiente: 1) Cuántas personas en total. int gas){ encuestas[per][gas]++. Código de la clase ArregloEncuestas package semana8. 2) Cuántas personas fueron encuestadas en cada rango de edades El arreglo Bidimensional se debe crear en la clase ArregloEncuestas dentro del paquete semana8 y la GUI se debe controlar desde la clase Principal.awt.*. btnCalcular. scpScroll. getContentPane(). btnEncuestar.add(cboPersonas).setBounds(150. 110.ALGORITMOS Y ESTRUCTURA DE DATOS 63 public class Principal extends JApplet implements ActionListener{ JLabel lblPersonas.50 años"). getContentPane().20).addItem("21 .setBounds(350. lblGaseosas = new JLabel("Gaseosas").addItem("12 .addItem("Pepsi Cola").setLayout(null). cboGaseosas.50.setBounds(30.50.20 años").setBounds(150. cboPersonas. lblPersonas. // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().addItem("Coca Cola").100.20. 110.setBounds(30.add(btnEncuestar). 50. scpScroll=new JScrollPane(txtS). 20).setBackground(Color.100. cboPersonas.30 años").addItem("31 . JButton btnEncuestar. cboGaseosas = new JComboBox(). JTextArea txtS.add(scpScroll).add(lblPersonas).20).lblGaseosas.100.add(cboGaseosas). 20. ArregloEncuestas a = new ArregloEncuestas(). cboPersonas.20. getContentPane(). cboPersonas = new JComboBox().addActionListener(this). cboGaseosas.20). lblPersonas = new JLabel("Personas").20).cboGaseosas. getContentPane().addItem("16 .100. lblGaseosas.lightGray). getContentPane(). btnEncuestar. CIBERTEC CARRERAS PROFESIONALES .setBounds(350. cboPersonas. btnEncuestar=new JButton("Encuestar").add(btnCalcular). 20).addItem("Fanta"). cboPersonas.add(lblGaseosas). JComboBox cboPersonas. btnCalcular=new JButton("Calcular"). btnCalcular.btnCalcular. getContentPane().addItem("Crush").340).setBounds(30. txtS=new JTextArea(). cboGaseosas. getContentPane().100. cboGaseosas.500.addItem("más 50 años").addActionListener(this). JScrollPane scpScroll. getContentPane(). cboPersonas. cboGaseosas.15 años"). gas=cboGaseosas. } void encuestar(){ int per. } void listar(){ txtS. j<a. j++) tot+=a. } void pregunta1(){ int tot. CARRERAS PROFESIONALES CIBERTEC . } void calcular(){ pregunta1().getItemAt(j)+":"+tot).append(cad + "\n").getItemAt(i)+":"+tot).j).gas.registrar(per. } } void imprimir(String cad){ txtS. i<a. imprimir("Total gaseosa "+ (String)cboGaseosas. for(int i=0. for(int j=0.obtener(i. if(e.getSelectedIndex().getSelectedIndex(). } } void pregunta2(){ int tot.setText("").getFilas().getSource()==btnEncuestar) encuestar().getFilas().64 listar(). j++){ tot=0. listar(). pregunta2().getColumnas().obtener(i.gas).j). imprimir("Total personas "+ (String)cboPersonas. i++) tot+=a. per=cboPersonas.getColumnas(). for(int i=0. a. i++){ tot=0. for(int j=0.getSource()==btnCalcular) calcular(). j<a. i<a. } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ if(e. } } } GUI : CIBERTEC CARRERAS PROFESIONALES . j<a.getFilas().j)+"\t"). j++) txtS.getColumnas(). for(int i=0. for(int j=0.ALGORITMOS Y ESTRUCTURA DE DATOS 65 imprimir("\t\t Preferencia de Gaseosas \n").append(a. imprimir("Rango de Edades \t Pepsi Cola \t Coca Cola \t Fanta \t Crush"). imprimir(""). i++){ txtS. i<a.getItemAt(i)+"\t\t").append((String)cboPersonas.obtener(i. CARRERAS PROFESIONALES CIBERTEC . . . b) Un método que imprima los elementos y la suma que conforma su diagonal derecha (que inicia en la esquina superior derecha y termina en la esquina inferior izquierda). .La suma de todos los números que forman la letra O. . 2) Diseñe un programa que genere una matriz cuadrada (n x n) de números enteros e implemente los siguientes métodos: a) Un método que imprima los elementos y la suma que conforma su diagonal izquierda (que inicia en la esquina superior izquierda y termina en la esquina inferior derecha).La suma de todos los números que forman la letra C. . Calcular: .La suma de todos los números pares. calcule lo siguiente: a) La cantidad de edades generadas b) La suma de todas las edades c) La edad menor d) La edad mayor e) El promedio de edades f) La cantidad de personas que superan los 40 años El arreglo Bidimensional se debe crear en la clase ArregloEdades dentro del paquete semana8 y la GUI se debe controlar desde la clase Principal.66 Ejercicios 1) Diseñe un programa que genere un arreglo bidimensional de edades en función de la cantidad de filas y columnas que el usuario ingrese. 3) Diseñe un programa que permita almacenar en un arreglo bidimensional de 3x3 a números enteros de dos dígitos generados de forma aleatoria.La suma de todos los números que forman la letra X. El arreglo Bidimensional se debe crear en la clase MatrizCuadrada dentro del paquete semana8 y la GUI se debe controlar desde la clase Principal.El producto acumulado de todos los números impares que NO sean múltiplos de 5. Luego. . Las edades deben estar en el rango de 18 a 90 años.La suma de todos los números que forman la letra U. . Mostrar el contenido del arreglo en el formato más adecuado.La suma de los números que forman la letra L.La suma de todos los números que forman la letra Z. Recuerde que los números que representan a los alumnos NO deben repetirse. Determinar: .La ubicación del alumno con el número 20.La ubicación del alumno con el número 1. . Utilice la siguiente figura como guía. . Columnas Filas 1 2 3 4 5 1 4 11 13 22 5 2 1 15 21 6 14 3 10 20 2 16 18 4 12 7 19 8 24 5 9 17 23 25 3 CIBERTEC CARRERAS PROFESIONALES . La distribución de alumnos en el aula que aquí se muestra es sólo referencial. El lugar que ocupa cada alumno es asignado de forma aleatoria. los alumnos deben estar representados sólo por un número (del 1 al 25).ALGORITMOS Y ESTRUCTURA DE DATOS 67 4) Desarrolle un programa que permita simular la ubicación de 25 alumnos en un salón de clases.La ubicación del último alumno de la lista. 68 UNIDAD DE APRENDIZAJE 2 SEMANA 9 ARREGLO DE OBJETOS LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. Adicionalmente emplean el modificador static. así como arreglo de objetos en diversas aplicaciones. los alumnos manipulan arreglos unidimensionales y bidimensionales con tipos primitivos. CARRERAS PROFESIONALES CIBERTEC . Los alumnos emplean arreglo de objetos en diversas aplicaciones. ACTIVIDADES PROPUESTAS Los alumnos reconocen un arreglo de objetos. TEMARIO Arreglo de objetos Operaciones variadas. 2004. 90). 2005. 78). alib i 0 1 2 Codigo: 901 Titulo: Programación en Java Año: 2006 Precio: 90 Codigo: 903 Titulo: Estadística descriptiva Año: 2005 Precio: 78 Codigo: 902 Titulo: Matemática Aplicada Año: 2004 Precio: 85 CIBERTEC CARRERAS PROFESIONALES . 85).ALGORITMOS Y ESTRUCTURA DE DATOS 69 1.”Matemática Aplicada”.”Estadística descriptiva”. alib[1]=new Libro(902. 2006.”Programación en Java”. Donde: Libro es el nombre de la clase alib[] es el nombre del arreglo new es el operador para reservar memoria. b) Representación gráfica: alib i null 0 null 1 null 2 c) Creación y almacenamiento de objetos alib[0]=new Libro(901. alib[2]=new Libro(903. ARREGLO DE OBJETOS Un arreglo de objetos es un conjunto de variables de referencia que controlan objetos del mismo tipo. a) Creación de un arreglo de objetos: Libro alib[] = new Libro[3]. En este ejemplo se esta reservando 3 espacios o variables de referencia que por defecto tienen el valor de null hasta que se almacene la dirección o referencia de un objeto. precio = precio. eliminar y listar libros.año = año. consultar. } CARRERAS PROFESIONALES CIBERTEC . this. private double precio. } public void setPrecio( double precio ){ this. Código de la clase Libro package semana9. La aplicación consiste en un mantenimiento de libros.titulo = titulo. } public void setAño( int año ){ this. public class Libro { // Atributos privados private int codigo.año = año.El título del libro más barato. es decir se consideran las opciones de ingresar. this. // Constructor public Libro( int codigo. int año. año. this. double precio){ this. la clase ArregloLibros (clase que maneja el arreglo de objetos) y la clase Principal (clase que interactúa con el usuario através de la GUI). OPERACIONES VARIADAS El siguiente ejemplo esta compuesto de 3 clases: la clase Libro (clase que maneja los atributos de los objetos de tipo libro y métodos de acceso set y get).El título del libro más caro .codigo = codigo. } //Métodos de acceso public void setCodigo( int codigo ){ this. String titulo.precio = precio. } public int getCodigo(){ return codigo.titulo = titulo. } public void setTitulo( String titulo ){ this.70 2.codigo = codigo. Adicionalmente. modificar. private String titulo. se realiza un aumento de 15% al precio de todos los libros cuyo año de publicación sea mayor al 2003 y se muestra la siguiente información estadística: . i++) if(cod==alib[i]. } public int buscar(int cod){ for(int i=0. } //Métodos públicos public void adicionar(Libro x){ if(indice==alib. indice++. } public double getPrecio(){ return precio. return -1. } } Código de la clase ArregloLibros package semana9. alib[indice]=x. private int indice. i<indice. } public void eliminar(int pos){ CIBERTEC CARRERAS PROFESIONALES . //Constructor public ArregloLibros() { alib = new Libro[5]. public class ArregloLibros { //Atributos privados private Libro alib[].ALGORITMOS Y ESTRUCTURA DE DATOS 71 public String getTitulo(){ return titulo. } public int getAño(){ return año. } public int tamaño(){ return indice.length) ampliarArreglo(). } public Libro obtener(int pos){ return alib[pos]. indice=0.getCodigo()) return i. alib=new Libro[indice+5]. String tit="". tit=x. i<indice. } public void aumento(){ for(int i=0. i++) alib[i]=aux[i].getPrecio(). i++){ Libro x=alib[i].getTitulo(). } } return tit.getPrecio()<min){ min=x.setPrecio(x.getPrecio()>max){ max=x. if(x. } //Método privado private void ampliarArreglo(){ Libro aux[]=alib.15). } } public String masCaro(){ double max=0. indice--. } } CARRERAS PROFESIONALES CIBERTEC .getTitulo(). if(x.getAño()>2003) x. for(int i=0. } } return tit.72 for(int i=pos. String tit="". if(x.getPrecio(). i<indice. } public String masBarato(){ double min=Double. i++){ Libro x=alib[i]. tit=x. i<indice-1.MAX_VALUE. i<indice. i<indice. for(int i=0. i++) alib[i]=alib[i+1]. i++){ Libro x=alib[i].getPrecio()*1. for(int i=0. 90. cboOpcion. lblCodigo = new JLabel("Codigo"). java.setBounds(15. add(lblTitulo). lblTitulo. cboOpcion.setBounds(15. ItemListener{ // Declaración de variables JButton btnBorrar. lblCodigo.btnAumento. lblTitulo = new JLabel("Titulo"). lblPrecio.211. lblAno = new JLabel("Año"). txtTitulo. 90.*. 63. 87.*. cboOpcion. lblOpcion = new JLabel("Opción").addItem("Eliminar").setBounds(15. // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane(). btnProcesar. 150. btnEstadisticas.setLayout(null). 23). 23). 23). add(lblOpcion). txtAno. lblOpcion.setBounds(105. cboOpcion. 23). lblCodigo. cboOpcion.awt. add(lblCodigo). JTextArea txtS. 23). cboOpcion. ArregloLibros a = new ArregloLibros(). lblAno. public class Principal extends JApplet implements ActionListener. 90. semana9. 90.addItem("Listar"). JTextField txtCodigo.ALGORITMOS Y ESTRUCTURA DE DATOS 73 Código de la clase Principal import import import import java. javax.setBounds(15. CIBERTEC CARRERAS PROFESIONALES . 90. getContentPane().setBounds(15. JLabel lblOpcion.addItemListener(this). lblAno.event. lblTitulo.swing. 15. lblPrecio. add(cboOpcion).addItem("Modificar"). JComboBox cboOpcion. cboOpcion = new JComboBox(). 23).addItem("Consultar"). add(lblPrecio). 111.206)). txtPrecio.setBackground(new Color(214. add(lblAno).*. txtCodigo = new JTextField().addItem("Ingresar"). 39. cboOpcion.awt.*. lblPrecio = new JLabel("Precio"). JScrollPane scpScroll. 15. Font.setBounds(365. 23). 63. btnProcesar = new JButton("Procesar"). 110.PLAIN. txtTitulo.setBounds(105. 110. 150. 15. 23). btnAumento. 39.getSource() == btnAumento ) aumento().setFont(new Font("monospaced". txtAno.setEditable(false). 110.setBounds(15.addActionListener(this).addActionListener(this). if( e. add(btnProcesar). 450. add(btnEstadisticas). scpScroll = new JScrollPane(txtS). } //-----------------------------------------------------public void actionPerformed( ActionEvent e ){ if( e. add(btnBorrar). 12)).setBounds(365. 23). 150.getSource() == btnProcesar ) procesar(). btnProcesar. txtS.setBounds(365.addActionListener(this). scpScroll.getSource() == btnBorrar ) borrar(). txtPrecio = new JTextField(). txtAno = new JTextField(). btnProcesar. 23). btnAumento. 23). add(txtPrecio). btnEstadisticas.setBounds(105. add(scpScroll). 23). txtTitulo = new JTextField().setBounds(105. 140. 150. add(txtAno). btnBorrar. 150. 23). if( e. txtS.setBounds(105. add(txtTitulo).getSource() == btnEstadisticas ) CARRERAS PROFESIONALES CIBERTEC . btnAumento = new JButton("Aumento"). 63. btnEstadisticas = new JButton("Estadisticas"). btnEstadisticas.setBounds(365. 110. 111. if( e. 87. 227). btnBorrar. txtS = new JTextArea(). btnBorrar = new JButton("Borrar").74 txtCodigo. 39. 23).87. txtPrecio.addActionListener(this). add(btnAumento). add(txtCodigo). setVisible(true).setVisible(false).getSelectedIndex()){ case 0 : CIBERTEC CARRERAS PROFESIONALES .setVisible(false). txtCodigo. lblAno. } //--------------------------------------------------------public void itemStateChanged(ItemEvent e){ if( e. lblPrecio.setVisible(false).setVisible(false).setVisible(false). txtTitulo. txtAno.getSource() == cboOpcion ) seleccionar(). txtTitulo.setVisible(false).setText("").setVisible(false).setText(""). lblPrecio. default: lblCodigo.setText(""). txtPrecio.setVisible(true). txtCodigo. txtCodigo. txtCodigo. break. lblPrecio. } } //--------------------------------------------------------void borrar(){ txtCodigo. } //--------------------------------------------------------void procesar(){ switch(cboOpcion.setVisible(true).setVisible(false).setVisible(false).setVisible(false).setText("").setVisible(true). lblAno. txtAno.setVisible(true). lblTitulo.setVisible(false).ALGORITMOS Y ESTRUCTURA DE DATOS 75 estadisticas(). txtTitulo. txtPrecio. lblAno. lblTitulo. txtPrecio.setVisible(false).setVisible(false).setVisible(false).requestFocus().setVisible(true). txtPrecio.setVisible(true).getSelectedIndex()){ case 0: case 1: lblCodigo. } //--------------------------------------------------------void seleccionar(){ switch(cboOpcion. break. txtAno.setVisible(true).setVisible(true). lblTitulo. case 2: case 3: lblCodigo.setVisible(true). txtTitulo. txtAno. case 3: eliminar(). } //--------------------------------------------------------void imprimir( String s ){ txtS. } //--------------------------------------------------------int getAño(){ return Integer. } //--------------------------------------------------------String getTitulo(){ return txtTitulo.tamaño().parseDouble(txtPrecio.showMessageDialog(this. } } //--------------------------------------------------------int getCodigo(){ return Integer. } //--------------------------------------------------------double getPrecio(){ return Double. if(a.obtener(i). break. case 1: modificar().getText()). for(int i=0. break. break.append( s + "\n"). i++){ Libro x =a. CARRERAS PROFESIONALES CIBERTEC .s).76 ingresar(). case 2: consultar(). break. } //--------------------------------------------------------void imprimir(){ txtS. } //--------------------------------------------------------void listar(){ imprimir().getText()). } //--------------------------------------------------------void mensaje( String s){ JOptionPane. i<a. default: listar().getText()).getText().tamaño()>0){ imprimir("Código \t Título \t Año \t Precio").setText("").parseInt(txtAno.parseInt(txtCodigo. obtener(pos).getTitulo().getCodigo()). if(pos == -1){ Libro x = new Libro(getCodigo() .getPrecio()). x. imprimir("Título:"+x. } //--------------------------------------------------------void consultar(){ int pos =a.obtener(pos). getAño().getAño()+"\t"+x. imprimir("Precio:"+x. } //--------------------------------------------------------void eliminar(){ int pos =a.eliminar(pos). if(pos!=-1){ a.buscar(getCodigo()).ALGORITMOS Y ESTRUCTURA DE DATOS 77 imprimir(x. } //--------------------------------------------------------void ingresar(){ int pos =a. if(pos!=-1){ Libro x =a. } else mensaje("Código no existe"). } else mensaje("Código ya existe").buscar(getCodigo()).setPrecio(getPrecio()). listar(). x.getTitulo()).getCodigo()+"\t"+x. } //--------------------------------------------------------void modificar(){ int pos =a.getTitulo()+"\t"+ x.setTitulo(getTitulo()). x. imprimir().setAño(getAño()).buscar(getCodigo()).getAño()).adicionar(x). imprimir("Año:"+x. } } else mensaje("No hay Libros"). a. if(pos!=-1){ Libro x =a.buscar(getCodigo()).getPrecio()). } else mensaje("Código no existe").getPrecio()). CIBERTEC CARRERAS PROFESIONALES . listar(). imprimir("Código:"+x. mensaje("Libro agregado"). mensaje("Libro modificado"). listar().masBarato()). imprimir("El título del libro más caro:" + a. listar(). } //--------------------------------------------------------void estadisticas(){ imprimir().aumento(). } else mensaje("Código no existe").78 mensaje("Libro eliminado"). } //--------------------------------------------------------void aumento(){ a.masCaro()). } } GUI del Problema: CARRERAS PROFESIONALES CIBERTEC . imprimir("El título del libro más barato:" + a. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. stock (entero) y precio unitario (real). descripción (cadena). Para ello implemente las clases ArregloVendedores (clase que maneja el arreglo de objetos) y la clase Principal (clase que controla la GUI) Adicionalmente implemente en la clase ArregloVendedores los siguientes métodos: a) Diseñe un método que retorne el monto promedio de aquellos vendedores cuyo nombre empiece con „A‟ b) Diseñe un método que retorne el nombre del vendedor que vendió menos. y monto vendido (real). CIBERTEC CARRERAS PROFESIONALES . Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. Diseñe las opciones de ingresar. horas trabajadas (entero) y tarifa (real). consultar y eliminar del mantenimiento de vendedores. 3) Asuma la existencia de la clase Producto que cuenta con los siguientes atributos privados: codigo (entero). Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. Para ello implemente las clases ArregloProductos (clase que maneja el arreglo de objetos) y la clase Principal (clase que controla la GUI) Adicionalmente implemente en la clase ArregloProductos los siguientes métodos: a) Diseñe un método que retorne la descripción del producto más caro. Para ello implemente las clases ArregloEmpleados (clase que maneja el arreglo de objetos) y la clase Principal (clase que controla la GUI) Adicionalmente implemente en la clase ArregloEmpleados los siguientes métodos: a) Diseñe un método que aumente la tarifa a los empleados cuyo nombre empiece con la letra „R‟ b) Diseñe un método que retorne el nombre del empleado que tiene la tarifa más alta. nombre (cadena). modificar. modificar y listar del mantenimiento de empleados. Diseñe las opciones de ingresar. eliminar y listar del mantenimiento de productos. 2) Asuma la existencia de la clase Vendedor que cuenta con los siguientes atributos privados: codigo (entero).ALGORITMOS Y ESTRUCTURA DE DATOS 79 Ejercicios 1) Asuma la existencia de la clase Empleado que cuenta con los siguientes atributos privados: codigo (entero). nombre (cadena). b) Diseñe un método que retorne la cantidad de productos cuyo stock se encuentre en el rango ingresado desde la GUI. consultar. Diseñe las opciones de ingresar. Para ello implemente las clases ArregloAlumnos (clase que maneja el arreglo de objetos) y la clase Principal (clase que controla la GUI) Adicionalmente implemente en la clase ArregloAlumnos los siguientes métodos: a) Diseñe un método que retorne el nombre y los apellidos del alumno que tiene mejor promedio ponderado. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. CARRERAS PROFESIONALES CIBERTEC . ciclo (entero) y promedio ponderado (real). modelo (cadena) y precio unitario (real). Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. consultar. marca (cadena). nombre (cadena).80 4) Asuma la existencia de la clase Celular que cuenta con los siguientes atributos privados: codigo (entero). eliminar y listar del mantenimiento de alumnos. b) Diseñe un método que retorne la cantidad de alumnos que se encuentran en segundo ciclo con un promedio ponderado inferior a 13. apellidos (cadena). b) Diseñe un método que aumente en 10% el precio unitario de los celulares cuyo modelo se ingrese desde la GUI. modificar. eliminar y listar del mantenimiento de celulares. Para ello implemente las clases ArregloCelulares (clase que maneja el arreglo de objetos) y la clase Principal (clase que controla la GUI) Adicionalmente implemente en la clase ArregloCelulares los siguientes métodos: a) Diseñe un método que retorne el precio unitario acumulado de todos los celulares de la marca “Nokia”. c) Diseñe un método que elimine a todos los celulares cuyo precio unitario sea inferior a 120 soles y que la marca empiece con la letra „M‟ 5) Asuma la existencia de la clase Alumno que cuenta con los siguientes atributos privados: codigo (entero). Diseñe las opciones de ingresar. consultar. Diseñe las opciones de ingresar. modificar. TEMARIO Métodos de la clase ArrayList. ACTIVIDADES PROPUESTAS Los alumnos emplean los métodos de la clase ArrayList para manipular un arreglo de objetos. consultar. FileWriter y StringTokenizer para almacenar la data en archivos de texto. CIBERTEC CARRERAS PROFESIONALES . modificar. los alumnos utilizan los métodos de la clase ArrayList para efectuar operaciones con objetos (ingresar. eliminar. FileReader. PrintWriter. Operaciones con objetos. Utilizan las clases BufferedReader. Los alumnos crean un mantenimiento. listar entre otras).ALGORITMOS Y ESTRUCTURA DE DATOS 81 UNIDAD DE APRENDIZAJE 3 SEMANA 10 CLASE ARRAYLIST Y ARCHIVOS DE TEXTO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. 82 1. CLASE ARRAYLIST Métodos de la clase ArrayList Esta Clase dispone de diversos métodos para manipular una colección de objetos dinámicamanete. Para crear un ArrayList se utiliza la siguiente instrucción: ArrayList <nombre_clase> var_referencia = new ArrayList < nombre_clase > (); Ejemplo: ArrayList <Producto> prod = new ArrayList <Producto> (); prod es un objeto de tipo ArrayList que va a manipular un arreglo de objetos de tipo Producto. Es necesario importar el paquete: java.util.ArrayList; MÉTODOS add(Object) DESCRIPCIÓN Agrega un elemento al final. public void adicionar(Producto x){ prod.add(x); } Agrega un elemento en la posición especificada en el primer parámetro. prod.add(0,x); clear() Elimina todos los elementos. prod.clear(); Devuelve el elemento de la posición especificada. get(int) public Producto obtener(int pos){ return prod.get(pos); } Devuelve el índice del elemento especificado, de no encontrarlo devuelve -1. public int posicion(Producto x){ return prod.indexOf(x); } add(int, Object) indexOf(Object) CARRERAS PROFESIONALES CIBERTEC ALGORITMOS Y ESTRUCTURA DE DATOS 83 Elimina el elemento de la posición especificada. remove(int) public void eliminar(int x){ prod.remove(x); } Elimina el elemento especificado. remove(Object) public void eliminar(Producto x){ prod.remove(x); } Reemplaza el elemento de la posición especificada en el primer parámetro por el elemento del segundo parámetro. public void modificar(int pos, Producto x){ prod.set(pos,x); } Devuelve la cantidad de elementos agregados. size() public int tamaño(){ return prod.size(); } set(int, Object) 2. Operaciones con objetos: a) Operaciones de mantenimiento: Empleando la clase ArrayList realice un mantenimiento de productos, para ello implemente las clases: Producto, ArregloProductos y Principal. Paso 1 Diseñe la clase Producto en el paquete semana10 que tenga como atributos privados los siguientes datos: código, descripción, precio unitario y stock. Implemente métodos de acceso set/get package semana10; public class Producto{ // Atributos privados private int codigo,stock; private String descripcion; private double pu; // Constructor public Producto( int codigo, String descripcion, double pu, int stock ){ this.codigo=codigo; this.descripcion=descripcion; this.pu=pu; this.stock=stock; } CIBERTEC CARRERAS PROFESIONALES 84 // Fija el código public void setCodigo( int codigo ){ this.codigo = codigo; } // Fija la descripción public void setDescripcion( String descripcion ){ this.descripcion = descripcion; } // Fija el precio unitario public void setPu( double pu ){ this.pu = pu; } // Fija el stock public void setStock( int stock ){ this.stock = stock; } // Retorna el código public int getCodigo(){ return codigo; } // Retorna la descripción public String getDescripcion(){ return descripcion; } // Retorna el precio unitario public double getPu(){ return pu; } // Retorna el stock public int getStock(){ return stock; } } Paso 2 Diseñe la clase ArregloProductos en el paquete semana10 que tenga como atributo privado un objeto de tipo ArrayList. Luego implemente los siguientes métodos: - Un constructor sin parámetros que cree el objeto ArrayList - Un método adicionar que reciba un producto y lo adicione al ArrayList - Un método eliminar que reciba un producto y lo elimine del ArrayList - Un método obtener que reciba una posición y retorne el producto de esa posición - Un método buscar que reciba un código y retorne el producto con ese código - Un método tamaño que retorne la cantidad de productos ingresados al ArrayList - Un método mayorprecio que retorne el producto más caro - Un método menorprecio que retorne el producto más barato package semana10; CARRERAS PROFESIONALES CIBERTEC get(0).add(x).get(0). } public void eliminar(Producto x){ prod. i<prod.util. public class ArregloProductos{ private ArrayList <Producto> prod. for(int i=1.getPu(). return max. } } CIBERTEC CARRERAS PROFESIONALES . return null.getPu(). } public double menorPrecio(){ double min=prod.size().getPu()>max) max=prod.getPu(). } public void adicionar(Producto x){ prod.size().getCodigo()) return prod. } public Producto obtener(int pos){ return prod.size(). i<prod.get(i). for(int i=1.get(i).get(i). return min.get(i). i++) if(prod. i++) if(prod. i++) if(codigo==prod.get(i).getPu()<min) min=prod.getPu(). i<prod. } public Producto buscar(int codigo){ for(int i=0.ALGORITMOS Y ESTRUCTURA DE DATOS 85 import java.get(pos).ArrayList. } public double mayorPrecio(){ double max=prod.get(i).size().remove(x). public ArregloProductos(){ prod=new ArrayList <Producto> (). } public int tamaño(){ return prod. 86 Paso 3 Una vez desarrollada las clases: Producto y ArregloProductos implemente los siguientes métodos del programa principal: ingreso. consulta. En todo momento el programa mostrará un listado como el siguiente: Código Descripción P_Unitario Stock 901 Lavadora 600 10 902 Equipo 450 12 903 Refrigerador 1550 8 --------------------------------------------------------------------------------Total de Productos :3 Producto más caro : 1550 Producto más barato : 450 GUI: CARRERAS PROFESIONALES CIBERTEC . eliminación y listado. modificación. lblOpcion = new JLabel("Opción"). JTextField txtCodigo. //Creo el objeto de tipo ArregloProductos ArregloProductos p=new ArregloProductos(). 90.event. semana10. 90. 15.add(lblCodigo). txtCodigo.add(cboOpcion). 23). lblPrecio.addItem("Modificar").setBounds(15. JScrollPane scpScroll.awt. lblPrecio = new JLabel("Precio").setBounds(15.*. 23). getContentPane(). getContentPane(). java. 150.206)). cboOpcion.setBounds(105.setBounds(105.add(lblDescripcion).setBackground(new Color(214. public class Principal extends JApplet implements ActionListener. lblPrecio. lblDescripcion = new JLabel("Descripcion"). 90. lblCodigo.awt. lblStock. txtDescripcion. lblStock. cboOpcion. 23).addItemListener(this). lblDescripcion.addItem("Ingresar"). lblStock = new JLabel("Stock"). // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().swing. 15. 90. getContentPane(). cboOpcion = new JComboBox(). 63. getContentPane(). getContentPane(). 39.addItem("Eliminar").*. lblDescripcion. 90. txtCodigo = new JTextField().add(lblPrecio). 87.setLayout(null). cboOpcion. 111. txtPrecio. javax. txtStock. CIBERTEC CARRERAS PROFESIONALES . 23).btnBorrar. lblCodigo. JComboBox cboOpcion. getContentPane().setBounds(15. ItemListener{ // Declaración de variables JButton btnProcesar. JLabel lblOpcion. 150.*.add(lblOpcion). JTextArea txtS. 23).addItem("Consultar").add(lblStock). 23). 23). getContentPane(). cboOpcion.setBounds(15.211. cboOpcion. 39. lblCodigo = new JLabel("Codigo"). cboOpcion. lblOpcion.*.setBounds(15.ALGORITMOS Y ESTRUCTURA DE DATOS 87 import import import import java. setVisible(false). lblPrecio.setBounds(365. 15. 87. 101. lblStock.setBounds(15. getContentPane(). } //--------------------------------------------------------public void actionPerformed( ActionEvent e ){ if( e. if( opcion == 1 || opcion == 3 ){ lblDescripcion.setVisible(false).setVisible(false). scpScroll.addActionListener(this). } //--------------------------------------------------------public void itemStateChanged(ItemEvent e){ if( e. Font. if( e. txtStock. btnBorrar.setVisible(false). txtStock. } CARRERAS PROFESIONALES CIBERTEC . scpScroll=new JScrollPane(txtS).getSelectedIndex(). getContentPane(). txtPrecio. 23). 150. txtPrecio.getSource() == cboOpcion ) seleccionar(). 227). txtDescripcion.getSource() == btnBorrar ) borrar().add(txtPrecio).addActionListener(this). 450.add(txtDescripcion).add(txtCodigo).setBounds(105. btnProcesar. txtStock = new JTextField(). 150. 23).PLAIN.setVisible(false).add(scpScroll). 101.88 getContentPane().add(btnBorrar). btnProcesar.setBounds(365. 39. 150. txtDescripcion = new JTextField().setFont(new Font("courier".setVisible(false).setBounds(105. getContentPane().getSource() == btnProcesar ) procesar(). 23).setBounds(105. txtS. getContentPane(). 140.add(btnProcesar).63. getContentPane(). txtDescripcion. btnProcesar = new JButton("Procesar"). btnBorrar. btnBorrar = new JButton("Borrar"). 12)). 111. 23).add(txtStock). txtS = new JTextArea(). 23). getContentPane(). } //--------------------------------------------------------void seleccionar(){ int opcion=cboOpcion. txtPrecio = new JTextField(). getText()).tipo. } //--------------------------------------------------------int getStock(){ return Integer.setVisible(true). txtStock.parseDouble(txtPrecio. String tipo ){ JOptionPane.setVisible(true). txtPrecio.parseInt(txtCodigo.setVisible(true).setText(""). break.JOptionPane.setVisible(true). txtCodigo. } } //--------------------------------------------------------void borrar(){ txtCodigo.setText("").INFORMATION_MESSAGE).getSelectedIndex()){ case 0 : ingresar(). lblStock.getText().setText(""). } //--------------------------------------------------------String getDescripcion(){ return txtDescripcion. break. m.parseInt(txtStock.getText()). txtPrecio. lblPrecio. } //--------------------------------------------------------void mensaje( String m.getText()). } //--------------------------------------------------------double getPrecio(){ return Double. } } //--------------------------------------------------------int getCodigo(){ return Integer.setVisible(true). break.setText(""). default: eliminar(). } //--------------------------------------------------------String rellena(String cad){ CIBERTEC CARRERAS PROFESIONALES . txtStock. case 2: modificar(). txtDescripcion. case 1: consultar().requestFocus().setVisible(true). } //--------------------------------------------------------void procesar(){ switch(cboOpcion.showMessageDialog(this.ALGORITMOS Y ESTRUCTURA DE DATOS 89 else{ lblDescripcion. txtDescripcion. setText("").90 int longitud=cad. return cad. "Mensaje de confirmación"). for(int i=longitud. p.mayorPrecio()). for(int i=0. precio y stock de un producto dado su código CARRERAS PROFESIONALES CIBERTEC . } else mensaje("Codigo ya existe". getDescripcion(). } else imprimir("No hay productos").getPu() + "\t\t"+prod. imprimir("Producto mas barato:"+ p. "Mensaje de error"). imprimir("Producto mas caro:"+p.length().buscar(getCodigo()). } //--------------------------------------------------------// Consulta la descripción. imprimir("Total de Productos:"+p.getStock()). } //--------------------------------------------------------// Muestra el listado solicitado void listar(){ imprimir().adicionar(prod). imprimir(prod. i<p. if(prod==null){ prod=new Producto(getCodigo().getStock()). listar(). } imprimir("").menorPrecio()).append( s + "\n"). i++) cad+=" ".getDescripcion())+"\t\t"+ prod.getPrecio(). i++){ Producto prod=p.tamaño()>0){ imprimir("Codigo \t Descripción \t\t P_Unitario \t Stock").tamaño()).obtener(i). if(p. mensaje("Producto Ingresado". } //--------------------------------------------------------void imprimir(String s){ txtS.getCodigo()+"\t" + rellena(prod. } //--------------------------------------------------------void imprimir(){ txtS. i<15. } //--------------------------------------------------------// Ingresa un producto evitando que el código se repita void ingresar(){ Producto prod=p.tamaño(). } } CIBERTEC CARRERAS PROFESIONALES . imprimir("Stock : "+ prod.buscar(getCodigo()). prod.setStock(getStock()).setDescripcion(getDescripcion()). "Mensaje de error"). "Mensaje de error"). imprimir("Descripción : "+ prod. listar(). Producto prod=p. } //--------------------------------------------------------// Elimina un producto dado su código void eliminar(){ Producto prod=p. if(prod!=null){ imprimir("Código : "+ prod.setPu(getPrecio()).buscar(getCodigo()). } //--------------------------------------------------------// Modifica la descripción. prod.getDescripcion()). mensaje("Producto Eliminado". "Mensaje de error"). } else mensaje("Producto no existe". if(prod!=null){ p. } else mensaje("Producto no existe". if(prod!=null){ prod.getStock()).getPu()). "Mensaje de confirmación"). precio y stock de un producto dado su código void modificar(){ Producto prod=p.buscar(getCodigo()).getCodigo()). } else mensaje("Producto no existe". mensaje("Producto Modificado". "Mensaje de confirmación"). imprimir("Precio Unitario : "+prod. listar().eliminar(prod).ALGORITMOS Y ESTRUCTURA DE DATOS 91 void consultar(){ imprimir(). b) Operaciones variadas: En la clase Principal implemente los siguientes métodos: 1) Diseñe un método que muestre los productos que empiecen con la letra „m‟ cuyo precio unitario se encuentre en el rango de precios ingresados desde la GUI. precio y stock de un producto dado su código void modificar(){ Producto prod=p. if(prod!=null){ Producto x=new Producto( getCodigo().getPu()<=getPreFin()) imprimir(x. } Esta segunda forma. } En la clase Principal sustituya el método modificar por el siguiente: // Modifica la descripción.getCodigo()+"\t"+x.92 En el mantenimiento hemos visto que para realizar la opción de modificación se han utilizado los métodos de acceso set para modificar los atributos de un producto.getStock()). "Mensaje de error").tamaño(). consiste en reemplazar el nuevo objeto de tipo Producto por el anterior.charAt(0).x). char letra = x.x). p. "Mensaje de confirmación"). for(int i=0.modificar(p.getPrecio(). } else mensaje("Producto no existe". if(letra==’m’ && x. getDescripcion().posicion(prod). mensaje("Producto Modificado". } } CARRERAS PROFESIONALES CIBERTEC .getPu()>=getPreIni() && x. listar().getDescripcion()+"\t"+ x.buscar(getCodigo()). i<p. void mostrar(){ imprimir("Codigo \t Descripción \t P_Unitario \t Stock"). Producto x){ prod. } public void modificar(int pos. A continuación se muestra otra forma de obtener los mismos resultados: Agregar los siguientes métodos en la clase ArregloProductos public int posicion(Producto x){ return prod.obtener(i).getStock()).indexOf(x). i++){ Producto x = p.set(pos.getDescripcion().getPu()+"\t"+x. i<p.length()-1.getStock()).tamaño().charAt(pos). char letra = x. if(x. void mostrar(){ imprimir("Codigo \t Descripción \t P_Unitario \t Stock"). i<p.obtener(i).getCodigo()+"\t"+x.obtener(i). i++){ Producto x = p. i++){ Producto x = p. i--. getStock()==0) imprimir(x. } } 3) Diseñe un método que disminuya en 10% el precio unitario de aquellos productos cuyo stock sea mayor a 100. for(int i=0. getDescripcion().getStock()>100) x.tamaño(). i++){ Producto x = p.90). int pos = x. if(x. if(letra==’a’ && x. void rebaja(){ for(int i=0. getDescripcion().getPu()+"\t"+x. } CIBERTEC CARRERAS PROFESIONALES .getStock()<getStock()){ p.ALGORITMOS Y ESTRUCTURA DE DATOS 93 2) Diseñe un método que muestre los productos que terminen con la letra „a‟ cuyo stock sea cero. } listar(). i<p.getPu()*0. } } listar(). void eliminarVarios(){ for(int i=0. } 4) Diseñe un método que elimine a los productos cuyo stock sea menor al stock ingresado desde la GUI.obtener(i).tamaño().getDescripcion()+"\t"+ x.eliminar(x).setPu(x. consultar. Para ello implemente las clases ArregloVendedores (clase que maneja un objeto privado de tipo ArrayList) y la clase Principal (clase que controla la GUI) Adicionalmente implemente en la clase Principal los siguientes métodos: a) Diseñe un método que imprima el monto promedio de aquellos vendedores cuyo nombre empiece con „J‟ b) Diseñe un método que imprima el nombre del vendedor que vendió que generó más ingresos. Para ello implemente las clases ArregloVideos (clase que maneja un objeto privado de tipo ArrayList) y la clase Principal (clase que controla la GUI) Adicionalmente implemente en la clase Principal los siguientes métodos: a) Diseñe un método que imprima el precio unitario promedio de aquellos videos del género suspenso. nombre (cadena). Para ello implemente las clases ArregloCelulares (clase que maneja un objeto privado de tipo ArrayList) y la clase Principal (clase que controla la GUI) Adicionalmente implemente en la clase ArregloCelulares los siguientes métodos: a) Diseñe un método que aumente en 8% el precio unitario de los celulares cuya marca termine con la letra „a‟ b) Diseñe un método que retorne la cantidad de celulares de la marca enviada como parámetro. 1=suspenso. 3) Asuma la existencia de la clase Vendedor que cuenta con los siguientes atributos privados: codigo (entero). marca (cadena). 2=terror) y precio unitario (real). modificar y listar del mantenimiento de celulares. y monto vendido (real). eliminar y listar del mantenimiento de vendedores. CARRERAS PROFESIONALES CIBERTEC . Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. Diseñe las opciones de ingresar. 2) Asuma la existencia de la clase Video que cuenta con los siguientes atributos privados: codVideo (entero). consultar y eliminar del mantenimiento de videos. Diseñe las opciones de ingresar. modificar. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. modelo (cadena) y precio unitario (real). b) Diseñe un método que elimine los videos del género ingresado desde la GUI. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo.94 Ejercicios 1) Asuma la existencia de la clase Celular que cuenta con los siguientes atributos privados: codigo (entero). nombre de película (cadena). Diseñe las opciones de ingresar. codGenero (0=comedia. FileWriter y StringTokenizer para almacenar la data en archivos de texto. Operaciones de lectura y escritura en archivos de texto. PrintWriter. PrintWriter. ACTIVIDADES PROPUESTAS Los alumnos emplean las clases BufferedReader. TEMARIO Configuración del JDK Clases y métodos para manipular archivos de texto. Para manipular el arreglo de objetos utilizan los métodos de la clase ArrayList. FileReader. listar entre otras). Utilizan las clases BufferedReader. CIBERTEC CARRERAS PROFESIONALES . eliminar. los alumnos utilizan los métodos de la clase ArrayList para efectuar operaciones con objetos (ingresar. modificar. consultar. FileWriter y StringTokenizer para almacenar un arreglo de objetos en archivos de texto. FileReader.ALGORITMOS Y ESTRUCTURA DE DATOS 95 UNIDAD DE APRENDIZAJE 3 SEMANA 11 ARCHIVOS DE TEXTO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. Haga click en: Archivo .0\jre\lib\security y aparecerá: CARRERAS PROFESIONALES CIBERTEC . CONFIGURACIÓN DEL JDK Lo primero que debemos hacer para poder manejar una aplicación usando archivos es configurar el JDK.6.policy que se encuentra en la siguiente ubicación: java\jdk1. 2.Abrir Busque y abra el archivo java.6. por esta razón siga los siguientes pasos: 1.0\bin y se mostrará la aplicación Herramienta de normas.96 1. Desde el Explorador ejecute el archivo policytool que se encuentra en la siguiente ubicación: java\jdk1. Seleccione CodeBase <ALL> y pulse "Editar entrada de norma" y aparecerá la siguiente pantalla: CIBERTEC CARRERAS PROFESIONALES .ALGORITMOS Y ESTRUCTURA DE DATOS 97 3. 8. import java. write. Todo código que involucre manejo de archivos debe estar en una estructura try-catch ya que podría producirse algún error. 10.98 4. delete. En el JComboBox "Permiso" seleccione "FilePermission" En el JComboBox "Nombre de destino" seleccione "<<ALL FILES>>" En el JComboBox "Acciones" seleccione "read. Recomendaciones: Debemos incluir la librería que permite manejar archivos (input . execute" Pulse "Aceptar". por ejemplo si no existe el archivo. 7. 6. Por último cierre la ventana. CARRERAS PROFESIONALES CIBERTEC . 9. Pulse "Agregar permiso" y aparecerá la siguiente pantalla: 5.*.io. luego "Terminar" Haga click en: Archivo – Guardar y aparecerá el siguiente mensaje: dele Aceptar.output). El método close() cierra el acceso al archivo.ALGORITMOS Y ESTRUCTURA DE DATOS 99 2. Tan luego lo abre destruye íntegramente su contenido. CLASES Y MÉTODOS PARA EL MANEJO DE ARCHIVOS: BufferedReader.txt" 00011001 br 00011011 00010110 00011000 00011101 00010100 00010111 null br PrintWriter. que permite abrir el archivo sólo para lectura.es la clase que permite bajar una data de la memoria hacia un archivo (output). "archivo. BufferedReader br = new BufferedReader(new FileReader(archivo)). Una vez abierto el archivo. Para ser usada debemos asociar una variable (br) y aplicar un constructor. Una vez abierto el archivo. El método close() cierra el acceso al archivo. Para ser usada debemos asociar una variable (pw) y aplicar un constructor. El método readLine() asociado a br captura una cadena de bits y salta a la siguiente línea de bits. Dicha cadena es convertida seguidamente al tipo de dato requerido. En caso de no encontrar el archivo. CIBERTEC CARRERAS PROFESIONALES . pw apunta al inicio.es la clase que permite levantar una data de archivo a memoria (input).. que permite abrir el archivo sólo para escritura. Cuando no existen más cadenas br apunta a null. Además como parámetro el nombre del archivo antepuesto por FileWriter. El método println(data) asociado a pw graba como cadena de bits la data indicada y genera un salto de línea en el archivo. lo crea.. Además como parámetro el nombre del archivo antepuesto por FileReader. br apunta a la primera cadena de bits. double pension){ this.nombre = nombre. } // Métodos de acceso: set/get public void setCodigo( int codigo ){ this.100 PrintWriter pw = new PrintWriter(new FileWriter(archivo)). int ciclo. } public void setNombre( String nombre ){ this. cree las clases Estudiante.txt" 00011001 pw 00011011 00010110 00011000 00011101 00010100 00010111 null pw Diseñe un mantenimiento de estudiantes que permita ingresar.txt. 3.ciclo = ciclo.nombre = nombre. this. private double pension. eliminar y listar estudiantes. si el archivo no existe deberá aparecer un mensaje de error. private String nombre. this. "archivo. Cree los métodos cargar y grabar en la clase ArregloEstudiantes. ArregloEstudiante (en el paquete semana11) y Principal. ciclo. consultar. String nombre.codigo = codigo.pension = pension. public class Estudiante{ // Atributos privados private int codigo. Para ello. OPERACIONES DE LECTURA Y ESCRITURA Código de la clase Estudiante package semana11. // Constructor public Estudiante( int codigo.codigo = codigo. modificar. Al cargar el JApplet se deberán leer los datos del archivo estudiantes. this. } CARRERAS PROFESIONALES CIBERTEC . pension = pension. } CIBERTEC CARRERAS PROFESIONALES . } public int getCiclo(){ return ciclo. } //Métodos para manipular el arreglo de objetos public void adicionar(Estudiante x){ est.*.swing. } public double getPension(){ return pension. import java. } public String getNombre(){ return nombre. //Constructor public ArregloEstudiantes() { est=new ArrayList <Estudiante> (). } public int getCodigo(){ return codigo.io. cargar(). public class ArregloEstudiantes{ //Atributo privado private ArrayList <Estudiante> est. } } Código de la clase ArregloEstudiantes package semana11.*.add(x). } public void setPension( double pension ){ this. import java.ALGORITMOS Y ESTRUCTURA DE DATOS 101 public void setCiclo( int ciclo ){ this.get(pos).*.util.ciclo = ciclo. import javax. } public Estudiante obtener(int pos){ return est. } public void eliminar(Estudiante x){ est.remove(x). parseInt(st. } else JOptionPane. int cod = Integer. return null."Se produjo un error= "+x). i++) if(codigo==est.getCodigo()) return est.txt no existe"). while((linea=br.txt")).102 public Estudiante buscar(int codigo){ for(int i=0. } public int tamaño(){ return est."El archivo estudiantes.ciclo.txt").parseDouble(st.nextToken().". Estudiante x =new Estudiante( cod.nextToken(). nom.trim().size().readLine())!=null){ StringTokenizer st=new StringTokenizer(linea. String nom=st. adicionar(x).showMessageDialog(null. } catch(Exception x){ JOptionPane. if(archivo.nextToken(). double pension = Double.get(i).parseInt(st.pension).trim()).").trim()).close(). } } CARRERAS PROFESIONALES CIBERTEC . } br.nextToken().trim()). String linea.showMessageDialog(null. i<est. int ciclo = Integer. } //Métodos para manipular el archivo de texto private void cargar(){ try{ File archive = new File("estudiantes.exists()){ BufferedReader br=new BufferedReader(new FileReader("estudiantes.size().get(i). ItemListener{ // Declaración de variables JButton btnBorrar.txt")).event.211.getNombre()+"."+ obtener(i). lblOpcion.awt. CIBERTEC CARRERAS PROFESIONALES . lblOpcion = new JLabel("Opción").getCodigo()+". add(lblOpcion). for(int i=0. 23).close().awt. btnProcesar."Se produjo un error= "+x).*. add(lblCodigo).swing. javax. public class Principal extends JApplet implements ActionListener. 15. semana11. txtCiclo. JComboBox cboOpcion. 90.setLayout(null).setBounds(15.ALGORITMOS Y ESTRUCTURA DE DATOS 103 public void grabar(){ try{ PrintWriter pw =new PrintWriter(new FileWriter("estudiantes. lblCiclo. // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane(). JTextField txtCodigo. lblPension. } } } Código de la clase Principal import import import import java. lblCodigo. //Creo el objeto de tipo ArregloEstudiantes ArregloEstudiantes a=new ArregloEstudiantes()."+ obtener(i). i<tamaño(). getContentPane(). 23).setBackground(new Color(214.getPension()). lblNombre. txtNombre.setBounds(15. 39. JTextArea txtS. lblNombre = new JLabel("Nombre").*.println(obtener(i).206)).*."+ obtener(i). java.getCiclo()+". 90. JLabel lblOpcion.*. JScrollPane scpScroll.showMessageDialog(null. txtPension. lblCodigo. lblCodigo = new JLabel("Codigo"). i++) pw. pw. } catch(Exception x){ JOptionPane. 23). 23). btnBorrar. btnProcesar = new JButton("Procesar"). lblPension. lblCiclo.setBounds(15. txtS. 90.addActionListener(this). 150. cboOpcion. txtCiclo = new JTextField(). 150. 90. 90. 110. 39. lblCiclo = new JLabel("Ciclo"). 150.addItem("Ingresar"). CARRERAS PROFESIONALES CIBERTEC .setBounds(15. 140.addItem("Consultar"). btnBorrar = new JButton("Borrar").addItem("Listar").addItem("Modificar").setFont(new Font("monospaced".104 lblNombre.setBounds(365. txtPension. cboOpcion. btnBorrar. add(lblPension). 150. 227).setBounds(365. 450. add(lblCiclo). scpScroll = new JScrollPane(txtS).setBounds(105. 15. 87.PLAIN. 111.addItem("Eliminar"). 12)). 23). 23). 23).87. cboOpcion.setEditable(false). btnProcesar. 23). add(btnBorrar). txtS. cboOpcion = new JComboBox(). scpScroll. txtPension = new JTextField(). add(scpScroll).setBounds(105.setBounds(15. 111. txtS = new JTextArea(). txtCodigo = new JTextField(). cboOpcion. cboOpcion. 15. txtNombre = new JTextField(). add(txtPension). 110. 63. cboOpcion. lblPension = new JLabel("Pension"). btnProcesar. add(txtCodigo). 23). txtNombre. txtCodigo. listar(). add(cboOpcion). 150.setBounds(15. add(txtNombre). Font.addItemListener(this). 23). 23). add(btnProcesar). add(lblNombre). txtCiclo. 23).setBounds(105. cboOpcion. 63. add(txtCiclo).addActionListener(this).setBounds(105. 39.setBounds(105. setVisible(true). lblNombre. lblPension.setVisible(false).setText(""). txtPension. txtCodigo.setVisible(true). txtPension.setVisible(false).setVisible(false).setVisible(false). break.setVisible(false). CIBERTEC CARRERAS PROFESIONALES .setVisible(true).setVisible(false). txtCiclo. } //--------------------------------------------------------void seleccionar(){ switch(cboOpcion. txtCodigo. case 2: case 3: lblCodigo.getSource() == btnProcesar ) procesar(). if( e. } //--------------------------------------------------------public void itemStateChanged(ItemEvent e){ if( e.ALGORITMOS Y ESTRUCTURA DE DATOS 105 } //--------------------------------------------------------public void actionPerformed( ActionEvent e ){ if( e.setVisible(true).setVisible(false).setVisible(true). txtCiclo. txtNombre. txtNombre.setVisible(false). } } //--------------------------------------------------------void borrar(){ txtCodigo.setVisible(false). txtNombre. txtPension. lblCiclo.getSource() == cboOpcion ) seleccionar(). lblCiclo.getSource() == btnBorrar ) borrar().setVisible(false).setVisible(true).getSelectedIndex()){ case 0: case 1: lblCodigo. lblPension.setVisible(true). lblCiclo.setVisible(false).setVisible(true). lblNombre. default: lblCodigo.setVisible(false).setVisible(true).setVisible(false). lblNombre. break.setText("").setVisible(true). txtCodigo.setVisible(false). lblPension. txtCiclo. txtNombre. parseInt(txtCiclo. } } //--------------------------------------------------------int getCodigo(){ return Integer. } //--------------------------------------------------------int getCiclo(){ return Integer.getSelectedIndex()){ case 0 : ingresar(). txtPension.requestFocus(). case 2: consultar(). case 3: eliminar().setText(""). break.setText("").setText("").106 txtCiclo. break. break.getText()).append( s + "\n").cad). } //--------------------------------------------------------String getNombre(){ return txtNombre. } //--------------------------------------------------------void imprimir(String s){ txtS. } //--------------------------------------------------------double getPension(){ return Double.parseDouble(txtPension. } //--------------------------------------------------------void procesar(){ switch(cboOpcion. } //--------------------------------------------------------void imprimir(){ txtS. txtCodigo.parseInt(txtCodigo.showMessageDialog(this. } CARRERAS PROFESIONALES CIBERTEC . break.getText()). case 1: modificar(). default: listar(). } //--------------------------------------------------------void mensaje(String cad){ JOptionPane.getText()).getText(). getCiclo()). } //--------------------------------------------------------void modificar(){ Estudiante e =a. listar(). imprimir("Ciclo : "+e.getPension()). imprimir(e.adicionar(e). } } else imprimir("No hay estudiantes"). a.getNombre(). e. } //--------------------------------------------------------void ingresar(){ Estudiante e =a.tamaño(). if(a.ALGORITMOS Y ESTRUCTURA DE DATOS 107 //--------------------------------------------------------void listar(){ imprimir(). getCiclo().tamaño()>0){ imprimir("Codigo \t Nombre \t Ciclo \t Pensión").obtener(i). for(int i=0.setNombre(getNombre()).getPension()).getCiclo()+ "\t"+e. e. } else mensaje("Codigo ya existe").buscar(getCodigo()). if(e!=null){ imprimir("Código : "+e. mensaje("Estudiante Ingresado"). if(e!=null){ e. Estudiante e =a.grabar(). if(e == null){ e = new Estudiante( getCodigo().setCiclo(getCiclo()). imprimir("Nombre : "+e. i++){ Estudiante e =a. a. } CIBERTEC CARRERAS PROFESIONALES . } else mensaje("Estudiante no existe"). mensaje("Estudiante Modificado").buscar(getCodigo()).getNombre()).getCodigo()).getNombre()+"\t"+e. i<a. } //--------------------------------------------------------void consultar(){ imprimir(). listar().setPension(getPension()). a.getCodigo()+"\t" + e.grabar().buscar(getCodigo()). imprimir("Pensión : "+e.getPension()). a. mensaje("Estudiante Eliminado").108 else mensaje("Estudiante no existe"). listar().grabar(). } } GUI: CARRERAS PROFESIONALES CIBERTEC . } else mensaje("Estudiante no existe"). } //--------------------------------------------------------void eliminar(){ Estudiante e =a. if(e!=null){ a.buscar(getCodigo()).eliminar(e). txt. cree las clases Video. modelo (cadena) y precio unitario (real). cree las clases Celular. Para ello. 2=terror) y precio unitario (real). ArregloCelulares (en el paquete semana11) y Principal. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. 1=suspenso. eliminar y listar celulares.ALGORITMOS Y ESTRUCTURA DE DATOS 109 Ejercicios 1) Diseñe un mantenimiento de celulares que permita ingresar. eliminar y listar videos. Al cargar el JApplet se deberán leer los datos del archivo videos. Asuma la existencia de la clase Celular que cuenta con los siguientes atributos privados: codigo (entero). si el archivo no existe deberá aparecer un mensaje de error. Cree los métodos cargar y grabar en la clase ArregloVideos. consultar. CIBERTEC CARRERAS PROFESIONALES . si el archivo no existe deberá aparecer un mensaje de error. Para ello. 2) Diseñe un mantenimiento de videos que permita ingresar. nombre de película (cadena). consultar. modificar.txt. Cree los métodos cargar y grabar en la clase ArregloCelulares. Al cargar el JApplet se deberán leer los datos del archivo celulares. ArregloVideos (en el paquete semana11) y Principal. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. marca (cadena). codGenero (0=comedia. Asuma la existencia de la clase Video que cuenta con los siguientes atributos privados: codVideo (entero). modificar. Los alumnos emplean el modificador protected. TEMARIO Conceptos básicos. se emplean las técnicas de casting y clases abstractas en casos prácticos. los alumnos entienden el concepto de herencia y polimorfismo. CARRERAS PROFESIONALES CIBERTEC . Uso del modificador protected. la relación de generalización/especialización entre clases. Relación es-un ACTIVIDADES PROPUESTAS Los alumnos entienden el concepto de Herencia (relación es-un).110 UNIDAD DE APRENDIZAJE 4 SEMANA 12 HERENCIA Y POLIMORFISMO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. ALGORITMOS Y ESTRUCTURA DE DATOS 111 1. La clase más específica se denomina clase hija o subclase y posee información adicional mientras que la clase más general se denomina clase padre o superclase. La relación generalización / especialización es la relación de una clase más general y una clase más específica. Las clases se organizan en una estructura jerarquica. la generalización es una perspectiva ascendente (bottom-up). La generalización y la especialización son diferentes perspectivas del mismo concepto. CIBERTEC CARRERAS PROFESIONALES . RELACIÓN DE GENERALIZACIÓN / ESPECIALIZACIÓN La relación de generalización / especialización se da cuando dos o más clases tienen muchas de sus partes en común (atributos y métodos) lo que normalmente se abstrae en la creación de una nueva clase que reúne todas sus caracteristicas comunes. Subclases Superclase Docente Persona Apellidos Nombre Edad Persona () generarCorreo() Horas Tarifa Docente() calcularSueldo() Alumno Nota1 Nota2 Nota3 RUC Alumno() calcularPromedio() Las subclases heredan características de las clases de las que se derivan y añaden características específicas que las diferencian. mientras que la especialización es una perspectiva descendente (top-down). . implícitamente figura como: class Animal extends Object { . } Mamifero extends Animal { . El constructor no es un miembro por lo que no es heredado por las subclases.. A la redefinición de métodos se denomina también sobrescritura de métodos. implícitamente su superclase es la clase Object... Redefinir un miembro de la superclase implica definir en la subclase un miembro con el mismo nombre que el de la superclase. La forma general de la declaración de una clase que hereda de otra clase es la siguiente: public class nombreDeSubclase extends nombreDeSuperclase { // Cuerpo de la clase } La herencia permite establecer una jerarquía de especialización mediante la relación "es-un" o "es-una". } Pato extends Ave {. HERENCIA La herencia es el mecanismo mediante el cual se puede definir una clase (subclase) en base a otra clase (superclase) heredando aquellos miembros de la superclase (atributos y métodos) que hayan sido declarados como public. } CARRERAS PROFESIONALES CIBERTEC . } Vaca extends Mamifero { ... Ejemplo 1: Un Mamifero es un Animal. Lo que puede expresarse como: class class class class class Animal { . Un Pato es un Ave. } Si una clase no tiene una superclase explícita.112 2. Un Ave es un Animal. Así.. Una Vaca es un Mamifero. Esto hace que el miembro de la superclase quede oculto en la subclase.. } Ave extends Animal {. protected o sin especificador de acceso. La nueva clase puede añadir nuevos miembros e incluso puede redefinir miembros de la superclase. Una superclase declara un miembro como protected para permitir el acceso al miembro desde el interior de sus subclases y desde una clase que se encuentra en el mismo paquete a la vez que impide el acceso al miembro desde el exterior de la superclase.. en el caso de la clase Animal.... public class A { // Atributos public int v1.v2=v2. //se hereda // Constructor public A(int v1. Ejemplo 2: Define una superclase package padre.v3=v3. //se hereda private int v2. this.ALGORITMOS Y ESTRUCTURA DE DATOS 113 La clase Object define e implementa un comportamiento requerido por todas las clases dentro del Sistema Java. Uso de super para invocar al constructor de la superclase El constructor de la superclase puede invocarse desde la subclase utilizando la palabra super de la siguiente forma: super(lista de argumentos).v1=v1. this. } // Métodos de acceso public int getv2(){ // se hereda return v2. Esta instrucción tiene que ser la primera sentencia a ejecutarse dentro del constructor de la subclase. //no se hereda protected int v3. } //no se hereda CIBERTEC CARRERAS PROFESIONALES . int v3){ this. int v2. 7). // Constructor public B(int v1.v2.3. imprimir("V4:"+r. this. int v2. } } Ejemplo de uso import hijo. int v4){ //super invoca al constructor de la superclase super(v1.v3).B. imprimir("V2:"+r.114 public int getv3(){ return v3. } } Define una subclase package hijo. // se hereda public class B extends A{ // Atributo public int v4. import padre. int v3.v1).v4).5.suma()). // utilizamos el método getv3() heredado ya que no se //puede emplear v3 por tener acceso protejido imprimir("V3:"+r. imprimir("Objeto r de tipo B:"+r).getv2()).A. //hay que importar la clase B del paquete //hijo // procesar es un método de la clase principal que esta //fuera de los paquetes padre y hijo void procesar(){ B r = new B(1. } CARRERAS PROFESIONALES CIBERTEC .v4=v4. } public int suma(){ return v1+getv2()+v3+v4. imprimir("Suma:"+r. imprimir("V1:"+r.getv3()). Un método generarCorreo() que retorna el correo formado por el primer carácter del nombre. Luego. public Persona(String ape. la edad y al final “@cibertec.nombre.pe". String nom. implemente dos subclases de Persona: Docente y Alumno en el paquete hijo. edad=ed.Método calcularSueldo() que retorna horasXtarifa. nombre=nom. implemente el método Procesar de la clase Principal que contiene el actionPerformed() para crear los objetos de Docente y Alumno e invocar a sus métodos y a los de su superclase. } } Subclase Docente: package hijo. Clase Persona: package padre. protected int edad. } public String generarCorreo(){ return ""+nombre. Docente presenta los siguientes miembros: . edad y las tres notas. CIBERTEC CARRERAS PROFESIONALES .Constructor con parámetros para inicializar los atributos: apellidos. . . . . Alumno presenta los siguientes miembros: .edu.ALGORITMOS Y ESTRUCTURA DE DATOS 115 Ejemplo 3: Implemente la clase Persona en el paquete padre con los siguientes miembros: .Atributos privados: tres notas de tipo double. Por último.pe”. public class Docente extends Persona{ private double horas. public class Persona { protected String apellido.Constructor con parámetros para inicializar los atributos: apellidos. nombres. nombres y edad .charAt(0)+apellido.tarifa. el primer carácter del apellido. int ed) { apellido=ape.Persona.edu.Método calcularPromedio() que retorna el promedio simple de las tres notas.Atributos privados: horas que dicta por semana y tarifa.Atributos protegidos: apellidos. import padre. edad horas y tarifa.Constructor que inicializa los atributos de la clase. .charAt(0)+ edad+"@cibertec. nombres. } public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Horas: "+horas+"\n"+ "Tarifa: "+tarifa+"\n".ed). } public double calcularPromedio(){ return (nota1+nota2+nota3)/3.nom.ed).116 public Docente(String ape. tarifa=t.Persona. nota2=n2. double n3) { super(ape. String nom. } } Subclase Alumno: package hijo.nom. double n2. int ed. } public double calcularSueldo(){ return horas*tarifa. import padre. nota3=n3.nota2. } public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Nota1: "+nota1+"\n"+ "Nota2: "+nota2+"\n"+ "Nota3: "+nota3+"\n". double t) { super(ape. horas=h. public class Alumno extends Persona{ private double nota1. String nom. int ed. public Alumno(String ape. double h.nota3. nota1=n1. } } CARRERAS PROFESIONALES CIBERTEC . double n1. } GUI : CIBERTEC CARRERAS PROFESIONALES .generarCorreo())."Sandra".calcularSueldo()+"\n").. Alumno obj2 = new Alumno("Salazar". 16. imprimir("Datos: \n"+obj1.14. imprimir("Datos: \n"+obj2.generarCorreo()).. imprimir("Promedio:"+obj2. . imprimir("su correo es:"+obj2.20. imprimir("Sueldo:"+obj1.*. void procesar(){ Docente obj1 = new Docente("Rojas".ALGORITMOS Y ESTRUCTURA DE DATOS 117 En la clase Principal: import hijo. imprimir("su correo es:"+obj1. .13).calcularPromedio()+"\n").100...mostrarDatos()).35).mostrarDatos()).25."Juan". lado. telefono de tipo String . Empleado presenta los siguientes miembros: . 2) Diseñe la clase Trabajador en el paquete padre con los siguientes miembros: . Cuadrado presenta los siguientes miembros: .Un método ubicacion() que retorna la ubicación de la figura geométrica según sus posiciones x e y.Constructor con parámetros para inicializar los atributos: x. apellido.Método area() que retorna el area del cuadrado (lado*lado) Circulo presenta los siguientes miembros: .Constructor que inicializa los atributos de la clase. el último carácter del apellido y el teléfono del trabajador. bonificación en soles y el sueldo bruto.Atributo privado: radio . apellido.Atributos protegidos: nombre.Un método boniSoles() que retorna la bonificación en soles (sbas* % bonificación) . implemente dos subclases de Figura: Cuadrado y Circulo en el paquete hijo.Constructor con parámetros para inicializar los atributos: nombre.Un método mostrarDatos() que retorne una cadena conteniendo: nombre.Constructor con parámetros para inicializar los atributos: x. teléfono.Atributos privados: sueldo básico y porcentaje de bonificación .Atributo privado: lado . y.Constructor que inicializa los atributos de la clase. . radio. . sueldo básico y porcentaje de bonificación.Un método generarCodigo() que retorna el código formado por el primer carácter del nombre.Un método sbruto() que retorna el sueldo bruto del empleado (sbas+bonificación en soles) . implemente dos subclases de Trabajador: Empleado y Consultor en el paquete hijo.118 Ejercicios 1) Diseñe la clase Figura en el paquete padre con los siguientes miembros: . y que representa la ubicación de la figura geométrica .Atributos privados: x. implemente el método Procesar de la clase Principal que contiene el actionPerformed() y cree 2 objetos: uno de tipo Cuadrado y el otro de tipo Circulo e imprima su ubicación y área de cada objeto. . telefono. . Luego. Luego. apellido.Método area() que retorna el área del círculo (pi*radio*radio) Por último. y. . CARRERAS PROFESIONALES CIBERTEC . horas y tarifa .ALGORITMOS Y ESTRUCTURA DE DATOS 119 Consultor presenta los siguientes miembros: . telefono y el sueldo bruto. CIBERTEC CARRERAS PROFESIONALES . apellido.Un método sbruto() que retorna el sueldo bruto del consultor (horas*tarifa) .Constructor con parámetros para inicializar los atributos: nombre. teléfono. apellido. .Atributos privados: horas trabajadas y tarifa horaria. implemente el método Procesar de la clase Principal que contiene el actionPerformed() y cree 2 objetos: uno de tipo Empleado y el otro de tipo Consultor e imprima sus datos invocando al método mostrarDatos() y su código generado. Por último.Un método mostrarDatos() que retorne una cadena conteniendo: nombre. los alumnos entienden el concepto de herencia y polimorfismo. la relación de generalización/especialización entre clases. Clases y métodos abstractos. se emplean las técnicas de casting y clases abstractas en casos prácticos.120 UNIDAD DE APRENDIZAJE 4 SEMANA 13 HERENCIA Y POLIMORFISMO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. TEMARIO Sobreescritura de métodos. ACTIVIDADES PROPUESTAS Los alumnos emplean la sobreescritura de métodos Los alumnos emplean clases y métodos abstractos Los alumnos emplean la Herencia (relación tiene-un) CARRERAS PROFESIONALES CIBERTEC . Relación tiene-un. int pk) { super(pi. } CIBERTEC CARRERAS PROFESIONALES . k = pk. j = pj.pj). cuándo un método de una subclase tiene el mismo nombre. Uso de super para acceder a una variable oculta o a un método sobrescrito Si desde la subclase se quiere acceder a una variable oculta de la superclase o a un método sobrescrito de la superclase se usa la palabra super de la siguiente forma: super.suma() + k. } //Método public int suma() { return i + j. //Constructor public B (int pi. } } // Subclase package semana13. La versión del método definida por la superclase queda oculta. int pj. se dice que el método de la subclase sobrescribe al método de la superclase. public class B extends A { //Atributo public int k. } //Método public int suma() { return super.ALGORITMOS Y ESTRUCTURA DE DATOS 121 1) Sobreescritura de métodos En una jerarquía de clases. los mismos parámetros y el mismo tipo de retorno que un método de su superclase. siempre se refiere a la versión del método definida en la subclase. //Constructor public A (int pi. Cuándo se llama a un método sobrescrito dentro de una subclase. public class A { //Atributos public int i.nombreDelMetodoSobreescrito (lista de argumentos) Ejemplo 1: // Superclase package semana13. j.nombreDeLaVariableOculta super. int pj) { i = pi. i + " + " + obj2. Un método es abstracto cuando no tiene implementación y solamente se define con el objetivo de obligar a que en cada subclase que deriva de la clase abstracta se realice la correspondiente implementación. . imprimir(obj1.. es decir en las subclases se va a sobre-escribir dicho método.j + " + " + obj2. Si una subclase de Figura no redefine o sobre-escribe area().5). .y Métodos: Figura(constructor) ubicacion() area() Cuadrado Atributo: lado Métodos: Cuadrado(constructor) area() Circulo Atributo: radio Métodos: Circulo(constructor) area() Figura es una clase abstracta porque no tiene sentido calcular su área.suma()). Figura Atributos: x.k + " = " + obj2.. deberá declararse también como clase abstracta. se usa únicamente para crear subclases.j + " = " + obj1.. Sí se tiene en una clase por lo menos un método abstracto entonces la clase tiene que ser abstracta sino el compilador mostrará un mensaje de error. B obj2 = new B(1. void procesar(){ A obj1 = new A(2.4). En Java.*.122 } // Ejemplo de uso import semana13.3.i + " + " + obj1. tanto la clase como el método abstracto se etiqueta con la palabra reservada abstract. pero sí la de un cuadrado o un círculo.suma()). } 2) Clases y métodos abstractos Una clase abstracta es una clase que no se puede instanciar. CARRERAS PROFESIONALES CIBERTEC .. imprimir(obj2. double lado) { super(x. this. int y. } Código de la clase Cuadrado: package hijo. import padre. CIBERTEC CARRERAS PROFESIONALES .x = x. int y) { this.ALGORITMOS Y ESTRUCTURA DE DATOS 123 Ejemplo 2: Código de la clase Figura: package padre.lado = lado. } public abstract double area().y = y. public class Circulo extends Figura { private double radio. import padre. y). public abstract class Figura { protected int x. this. } //Sobre-escritura public double area() { return lado*lado. } public String ubicacion(){ return x+". public Cuadrado(int x.Figura. public Figura(int x.Figura. protected int y."+y. public class Cuadrado extends Figura { private double lado. } } Código de la clase Circulo: package hijo. imprimir("Ubicación del cuadrado:"+obj1. imprimir("Area del círculo:"+obj2. } Ejemplo 3: Implemente la clase abstracta Vehiculo en el paquete padre que contenga el atributo capacidad del vehículo y un método abstracto caracteristicas() que se sobrescribirá en las subclases Carro y Avión.20).radio=radio.ubicacion()). y). double radio) { super(x. Circulo obj2=new Circulo(300.12).. void procesar(){ Cuadrado obj1=new Cuadrado(100. .. } } Código de la clase Principal: import hijo. imprimir("Area del cuadrado:"+obj1.ubicacion()). imprimir("Ubicación del círculo:"+obj2. this. public abstract class Vehiculo { protected int capacidad.PI*radio*radio. } CARRERAS PROFESIONALES CIBERTEC . . } //Sobre-escritura public double area() { return Math. Por último..area()). int y.20.area()). // Superclase package padre.*.200. cree la clase Principal que contiene el actionPerformed() para crear los objetos de tipo Carro y Avión e imprima las caracteristicas de dichos objetos..124 public Circulo(int x. public Vehiculo(int capacidad) { this.capacidad=capacidad. } public abstract String caracteristicas(). tengo una velocidad enorme \n"+ "pero consumo mucho combustible". imprimir(obj1. public class Carro extends Vehiculo{ public Carro(int cap) { super(cap).caracteristicas()). } } // Subclase package hijo. . public class Avion extends Vehiculo{ public Avion(int cap) { super(cap). imprimir("Objeto Carro:").*.Vehiculo. import padre. Avion obj2 = new Avion(300). } // Sobre-escritura public String caracteristicas(){ return "Tengo una capacidad de "+capacidad+ " pasajeros \n"+ "Tengo 4 ruedas y una buena velocidad \n"+ "pero no puedo volar". void procesar(){ Carro obj1 = new Carro(6). } // Sobre-escritura public String caracteristicas(){ return "Tengo una capacidad de "+capacidad+ " pasajeros \n"+ "Puedo volar.ALGORITMOS Y ESTRUCTURA DE DATOS 125 // Subclase package hijo..Vehiculo.. import padre.. . } CIBERTEC CARRERAS PROFESIONALES . } } // Ejemplo de uso – Clase Principal import hijo. imprimir("\nObjeto Avión:"). imprimir(obj2..caracteristicas()). fec = new Fecha().saldo = saldo. El titular de la cuenta es un cliente que tiene los siguientes datos: código de cliente. saldo de la cuenta.getFecha(). private Cliente titular.getNombre()+"\n"+ "Apellidos Cliente:"+ titular. double saldo) { this. nombre.titular = titular. private String fecApertura. public class A { //Atributo privado private B obj. } De tal forma. } public String getDatosTitular(){ return "Codigo Cliente:"+titular. this. que através de la referencia obj se puede acceder a los miembros de la clase B. apellidos y teléfono. Ejemplo 4: Diseñe un programa que a la pulsación del botón Procesar permita aperturar la cuenta de un cliente. public class Cuenta { //Atributos privados private int nro. } //Métodos de acceso: get public int getNro(){ return nro. private Fecha fec. Cliente titular. considere que la cuenta tiene los siguientes datos: número de la cuenta. //Constructor public Cuenta(int nro.getApellidos()+ CARRERAS PROFESIONALES CIBERTEC .126 3) Relación tiene-un La relación tiene-un consiste en que la clase A tenga una referencia a un objeto de la clase B por ejemplo: package semana13. fecha de apertura (fecha del sistema en el formato: dd/mm/aaaa) y titular de la cuenta.getCodigo()+"\n"+ "Nombre Cliente:"+titular. private double saldo. Para ello. this. Código de la clase Cuenta: package semana13.nro = nro. fecApertura = fec. String ape. } public String getFechaApertura(){ return fecApertura.cod=cod.util.nom=nom.ALGORITMOS Y ESTRUCTURA DE DATOS 127 "\n"+ "Telefono Cliente:"+ titular.getTelefono(). this. private String nom. } } Código de la clase Fecha: package semana13. this. String nom. import java. CIBERTEC CARRERAS PROFESIONALES . String telf) { this. } public String getTelefono(){ return telf. } } Código de la clase Cliente: package semana13. this.ape=ape. public class Cliente { //Atributos privados private int cod. } public String getApellidos(){ return ape. } public String getNombre(){ return nom.*. } public double getSaldo(){ return saldo.telf. } //Métodos de acceso: get public int getCodigo(){ return cod.ape.telf=telf. //Constructor public Cliente(int cod. YEAR). aa = gc. private GregorianCalendar gc. imprimir("Fecha de apertura de la cuenta:" + x.*.getSaldo()).128 public class Fecha { //Atributos privados private int dd."Garcia". //Constructor public Fecha() { gc = new GregorianCalendar().MONTH). ."4451234"). void procesar(){ Cliente cli = new Cliente(100.DAY_OF_MONTH). } } Código de la clase Principal: import semana13. dd = gc. imprimir("Titular de la cuenta:").cli... CARRERAS PROFESIONALES CIBERTEC . } //Método public String getFecha(){ return dd+"/"+(mm+1)+"/"+aa.getFecha() La clase Fecha tiene un objeto de tipo GregorianCalendar por lo que podemos obtener el dia. mes y año del sistema."Rodolfo". . mm = gc.get(Calendar..get(Calendar.mm. } Importante: La clase Cuenta tiene un objeto de tipo Cliente por lo que podemos acceder a los métodos de la clase Cliente con el método getDatosTitular() La clase Cuenta tiene un objeto de tipo Fecha por lo que podemos acceder al método getFecha() de la clase Fecha cuando hacemos fec. imprimir("Saldo de la cuenta:"+x. listar(cta).. } void listar(Cuenta x){ imprimir("Codigo de cuenta:"+x.getFechaApertura()). imprimir(x.3500).getDatosTitular()).get(Calendar.aa.getNro()). Cuenta cta = new Cuenta(925671. ALGORITMOS Y ESTRUCTURA DE DATOS 129 Ejemplo 5: Dada la clase Cuadrado que permite calcular el área de un cuadrado. } // Retorna el lado public int getLado(){ return lado. se le pide diseñar una clase CuadradoRelleno que herede de la clase Cuadrado y que además de permitir obtener el área del cuadrado permita dibujar el cuadrado con un carácter de relleno especificado. } // Retorna el área public int area(){ return lado*lado.lado = lado.lado = lado. Use luego la clase CuadradoRelleno para implementar el programa DibujoCuadrado que lea el lado y el carácter de relleno y dibuje y muestre el área del cuadrado. EJEMPLO: Datos ingresados: Lado : 4 Carácter : & Salida de resultados: ---------------------------&&&& &&&& &&&& &&&& Area : 16 ---------------------------public class Cuadrado { // Atributo private int lado. // Constructor public Cuadrado( int lado ){ this. } } CIBERTEC CARRERAS PROFESIONALES . } // Fija el lado public void setLado( int lado ){ this. getText(). char car. DibujoCuadrado gui){ super(lado).car = car.area(). area = c.append("\n"). c++) gui.charAt(0). c<=getLado(). CuadradoRelleno c = new CuadradoRelleno (getLado(). private DibujoCuadrado gui.getText()). this.txtS.append("\nEl Area es:"+area). this. f<=getLado().append(""+car). f++){ for(int c=1.dibujar(). } } } Programa DibujoCuadrado: Tenemos los métodos para obtener los datos de la GUI //--------------------------------------------------------int getLado(){ return Integer. gui. public CuadradoRelleno(int lado.getCaracter().txtS.parseInt(txtLado.this).gui = gui. txtS.130 public class CuadradoRelleno extends Cuadrado{ private char car. } En el método Procesar se crea el objeto de tipo CuadradoRelleno y se llama a los métodos dibujar() y area() void procesar(){ int area. } CARRERAS PROFESIONALES CIBERTEC . } //--------------------------------------------------------char getCaracter(){ return txtCaracter. } public void dibujar(){ for(int f=1. c. Métodos no abstractos: MostrarDatos() donde se muestra los atributos. . . Proceso() que llama a los métodos mostrarDatos() y mostrarSueldo() CIBERTEC CARRERAS PROFESIONALES .Constructor que inicializa los atributos de la clase. implemente dos subclases de Persona: Docente y Alumno. Por último. edad y las tres notas. Diseñe la clase abstracta Animal en el paquete padre que contenga el método abstracto habla() que se sobreescribirá en las subclases: Perro. nombres y edad .Atributos privados: codigo(entero).Atributos privados: tres notas enteras. .Constructor con parámetros para inicializar los atributos: apellidos. . Docente presenta los siguientes miembros: . cree la clase Principal que contiene el actionPerformed() para crear los objetos de Docente y Alumno e invocar a sus métodos y a los de su superclase. . Alumno presenta los siguientes miembros: . edad y al final “@cibertec. nombres.Método calcularPromedio() que retorna el promedio simple de las tres notas.Atributos privados: horas que dicta por semana y tarifa. 3. Diseñe la clase abstracta Empleado con los siguientes miembros: .Atributos protegidos: apellidos. nombres(cadena). Gato y Pollo (las subclases se crearán en el paquete hijo). horas y tarifa.Método no abstracto: generarCorreo() que retorna el correo formado por el primer carácter del nombre. .pe”. . el primer carácter del apellido. cree la clase Principal que contiene el actionPerformed() para crear los objetos Perro. edad. apellidos(cadena) . Luego. Gato y Pollo e imprima como habla cada Animal. Diseñe la clase abstracta Persona con los siguientes miembros: .Método calcularSueldo() que retorna horas*tarifa.Método abstracto: mostrarDatos() para mostrar todos los datos de la persona creada. .edu.Constructor que inicializa los atributos de la clase.Constructor con parámetros para inicializar los atributos: apellidos. Por último.ALGORITMOS Y ESTRUCTURA DE DATOS 131 Ejercicios 1. 2.Métodos abstractos: mostrarSueldo() para mostrar el sueldo del empleado. nombres. Por último. sexo. bonificacion(real) y un constructor que inicialice a todos sus datos. Diseñe un programa que a la pulsación del botón Procesar registre a una persona en la Reniec. cree la clase Principal que contiene el actionPerformed() para crear los objetos de EmpPublico y EmpPrivado y llame al método proceso() para cada objeto. EmpPrivado tiene los siguientes atributos privados: horas(real). fecha de nacimiento. implemente dos subclases de Empleado: EmpPublico y EmpPrivado. Cree las clases que considere pertinentes. fecha de inscripción. 4. se debe crear un objeto de tipo persona con los siguientes atributos: apellido paterno. fecha de emisión y fecha de caducidad. estado civil y los siguientes datos del DNI: Nro de dni. CARRERAS PROFESIONALES CIBERTEC . apellido materno. tarifa(real) y un constructor que inicialice a todos sus datos. EmpPublico tiene los siguientes atributos privados: sueldo basico (real). nombres. Para ello.132 Luego. los alumnos entienden el concepto de herencia y polimorfismo. se emplean las técnicas de casting y clases abstractas en casos prácticos. la relación de generalización/especialización entre clases. Polimorfismo y enlace dinámico Operador instanceof ACTIVIDADES PROPUESTAS Los alumnos entienden el concepto de polimorfismo Los alumnos emplean el polimorfismo haciendo uso de las técnicas de casting. CIBERTEC CARRERAS PROFESIONALES . del operador instanceof y de clases abstractas. TEMARIO Técnicas de casting: Upcasting y Downcasting.ALGORITMOS Y ESTRUCTURA DE DATOS 133 UNIDAD DE APRENDIZAJE 4 SEMANA 14 HERENCIA Y POLIMORFISMO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. 134 1) Técnicas de Casting: Upcasting y Downcasting Las técnicas de casting consiste en realizar conversiones de tipo. } public String hacerRuido(){ return "Guau". } } CARRERAS PROFESIONALES CIBERTEC . } } Clase Perro package semana14. sólo su tipo. public class Animal { public String hacerRuido(){ return "no definido". También se puede ver como la conversión de un tipo en otro inferior en la jerarquia de clases. } } Clase Mamifero package semana14. Únicamente tienen sentido por la existencia de la herencia. • Upcasting : Interpretar un objeto de una clase derivada como del mismo tipo que la clase base. No hace falta especificarlo Downcasting: Interpretar un objeto de una clase base como del mismo tipo que su clase derivada. public class Perro extends Mamifero{ public String mensaje(){ return "Soy perro". no modifican al objeto. También se puede ver como la conversión de un tipo en otro superior en la jerarquia de clases. • Ejemplo1: Clase Animal package semana14. public class Mamifero extends Animal{ public String mensaje(){ return "soy mamífero". Se especifica precediendo al objeto a convertir con el nuevo tipo entre paréntesis. imprimir(p. Se entenderá su aplicación con el ejemplo completo de polimorfismo que se verá en las siguientes páginas. Sólo su tipo. la referencia “a” se convierte a tipo Perro y através de p se accesa al objeto. si en la clase Perro no se hubierá sobre-escrito el método mensaje() la salida hubierá sido: soy mamífero Guau Y si no se hubierá sobre-escrito ni el método mensaje() ni el método hacerRuido() la salida hubierá sido: soy mamífero no definido Al ejecutar un método. m1 es de tipo Mamífero (clase superior en la jerarquía de clases del ejemplo). se busca su implementación de abajo hacia arriba en la jerarquía de clases.ALGORITMOS Y ESTRUCTURA DE DATOS 135 Clase Principal Aplicando Upcasting: void procesar(){ Mamifero m1 = new Perro(). } Se esta creando un objeto de tipo Perro. Aplicando Downcasting: void procesar(){ Animal a = new Perro(). Perro p = (Perro)a. por lo que se siguen ejecutando sobre el mismo objeto. CIBERTEC CARRERAS PROFESIONALES . imprimir(m1. Como el objeto es un Perro y los métodos mensaje() y hacerRuido() se estan sobre-escribiendo en la clase Perro la salida es: Soy perro Guau Pero. Luego. Los casting no modifican al objeto. Pero.hacerRuido()). } Se esta creando un objeto de tipo Perro que se almacena en la variable de referencia “a” de tipo Animal (clase superior en la jerarquia de clases del ejemplo).mensaje()). Los métodos mensaje() y hacerRuido() deben existir en la clase Mamifero o se deben heredar de una clase superior (clase Animal) para que compile. imprimir(m1.hacerRuido()). } } CARRERAS PROFESIONALES CIBERTEC .136 El siguiente ejemplo compila. public abstract class Mamifero { public abstract String hacerRuido(). public String mensaje(){ return "soy mamífero". Al tener métodos sobre-escritos. es la implementación del polimorfismo. Pero.hacerRuido()). En el ejemplo que se muestra a continuación el método listar de la clase Principal es un método polifórmico ya que cuando es llamado por primera vez lista el comportamiento de un Gato y la segunda vez lista el comportamiento de un Perro.Mamifero. Perro p1 = (Perro)a1. El enlace dinámico se da cuando se elige el método a ejecutar en tiempo de ejecución. no funciona porque a1 hace referencia a un objeto de tipo Animal. en función de la clase del objeto. } 2) Polimorfismo y enlace dinámico El polimorfismo esta presente cuando se realiza la llamada a un método de un objeto del que no se sabe su tipo hasta que el programa este en ejecución. import padre. } } Clase Perro package hijo. void procesar(){ Animal a1 = new Animal(). public class Perro extends Mamifero{ public String hacerRuido(){ return "Guau". //ERROR imprimir(p1. Un método es polifórmico cuando actúa de diferentes formas dependiendo del objeto que reciba. No se puede convertir un animal a perro. Ejemplo 2: Clase Mamifero package padre. objetos de diferentes tipos pueden responder de forma diferente a la misma llamada de tal forma que podemos escribir código de forma general sin preocuparnos del método concreto que se ejecutará en cada momento. mensaje()). listar(g).Mamifero. . import padre. } public String mensaje(){ return "soy gato".*. CIBERTEC CARRERAS PROFESIONALES . import hijo.. } } Clase Principal import padre.. } // listar es un método polifórmico void listar( Mamifero x ){ imprimir(x... imprimir(x. public class Gato extends Mamifero{ public String hacerRuido(){ return "Miau". void procesar(){ Gato g = new Gato().hacerRuido()). Perro p = new Perro(). } Salida: Miau soy gato Guau soy mamífero Importante: El polimorfismo se dá en el método listar ya que la variable de referencia x va a recibir un objeto de diferente tipo cada vez que se llame al método listar y la ejecución de los métodos hacerRuido() y mensaje() se van a comportar dependiendo del objeto al cual esta referenciando x. .ALGORITMOS Y ESTRUCTURA DE DATOS 137 Clase Gato package hijo.Mamifero. listar(p). la edad y al final “@cibertec. Clase Persona package semana14. . protected int edad. . implemente el método Procesar de la clase Principal que contiene el actionPerformed() para crear los objetos de Docente y Alumno e invoque al método listar para mostrar los datos de los objetos creados.Atributos privados: tres notas de tipo double. el primer carácter del apellido. int ed) { apellido=ape. nombres. CARRERAS PROFESIONALES CIBERTEC .138 3) Operador instanceof Se utiliza el operador instanceof para determinar si el objeto es de la clase esperada antes de realizar el casting. .Constructor que inicializa los atributos de la clase. nombres. edad=ed.Un método abstracto mostrarDatos() para mostrar los datos de la persona creada. Alumno presenta los siguientes miembros: .nombre. Luego.pe”.Método calcularPromedio() que retorna el promedio simple de las tres notas.Atributos privados: horas que dicta por semana y tarifa. } public abstract String mostrarDatos(). String nom.Atributos protegidos: apellidos. nombres y edad . public abstract class Persona { protected String apellido.Redefina o sobrescriba el método mostrarDatos() .Redefina o sobrescriba el método mostrarDatos() . edad horas y tarifa. Ejemplo 3: Implemente la clase abstracta Persona en el paquete semana14 con los siguientes miembros: .edu. edad y las tres notas. .Un método generarCorreo() que retorna el correo formado por el primer carácter del nombre. . implemente dos subclases de Persona: Docente y Alumno en el paquete semana14.Método calcularSueldo() que retorna horasXtarifa. Docente presenta los siguientes miembros: .Constructor con parámetros para inicializar los atributos: apellidos. Por último. . public Persona(String ape. nombre=nom.Constructor con parámetros para inicializar los atributos: apellidos. double n1. } } Clase Alumno package semana14. tarifa=t.tarifa. } public double calcularPromedio(){ return (nota1+nota2+nota3)/3. double h.nom.ed). public Docente(String ape. public Alumno(String ape. nota2=n2. nota1=n1. } } Clase Docente package semana14.charAt(0)+edad+ "@cibertec. int ed. double n2.nota2. int ed.nom. nota3=n3.charAt(0)+apellido. } CIBERTEC CARRERAS PROFESIONALES . double t) { super(ape.ed). } public double calcularSueldo(){ return horas*tarifa.edu. String nom. horas=h. public class Docente extends Persona{ private double horas.nota3. } public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Horas: "+horas+"\n"+ "Tarifa: "+tarifa+"\n". String nom.pe".ALGORITMOS Y ESTRUCTURA DE DATOS 139 public String generarCorreo(){ return ""+nombre. double n3) { super(ape. public class Alumno extends Persona{ private double nota1. ancho.40). } Ejemplo 4: Diseñe un programa que al pulsar el botón Procesar cree un arreglo con 4 objetos con datos fijos. Alumno obj2=new Alumno("Tarazewicz". radio y el área del objeto. listar(obj2)..100.140 public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Nota1: "+nota1+"\n"+ "Nota2: "+nota2+"\n"+ "Nota3: "+nota3+"\n".calcularPromedio()+"\n").14. listar(obj1).20."Natalia". if(x instanceof Docente) imprimir("Sueldo:"+((Docente)x). Si es un objeto de tipo Círculo debe mostrarse: posición x.13).mostrarDatos()). } // listar es un método polifórmico void listar(Persona x){ imprimir("Datos: \n"+x. } } Clase Principal import semana14. 2 objetos de tipo Rectángulo y 2 de tipo Círculo. Adicionalmente. .16. posición y.. CARRERAS PROFESIONALES CIBERTEC . imprimir("su correo es:"+x. else imprimir("Promedio:"+((Alumno)x). posición y.. debe calcular e imprimir el área mayor de los objetos creados. .generarCorreo()).*."Ricardo".35.calcularSueldo()+"\n"). alto y el área del objeto. void procesar(){ Docente obj1=new Docente("Gálvez". El programa debe mostrar en el JTextArea lo siguiente: Si es un objeto de tipo Rectángulo debe mostrarse: posición x.. int y) { this.y). this. this. public class Rectangulo extends Figura{ private double ancho. public Rectangulo(int x.alto=alto. public Figura(int x. protected int y. double alto){ super(x.ancho=ancho. public abstract String mostrarDatos(). } Clase Rectángulo package semana14. } public abstract double area(). int y. alto. public abstract class Figura { protected int x. double ancho. } CIBERTEC CARRERAS PROFESIONALES .y=y. this.ALGORITMOS Y ESTRUCTURA DE DATOS 141 GUI del problema: Clase Figura package semana14.x=x. double radio){ super(x.y). } CARRERAS PROFESIONALES CIBERTEC . . public class Circulo extends Figura{ private double radio. mFigura=figuras[i]. } } Clase Círculo package semana14..area(). for(int i=0. } public String mostrarDatos(){ return "posición: "+x+". public Circulo(int x. i<figuras. double areaMayor=0.142 public double area(){ return ancho*alto."+y+"\n"+ "radio: "+radio+"\n"+ "area: "+area()+"\n".*. int y. } } return mFigura..radio=radio."+y+"\n"+ "ancho: "+ancho+"\n"+ "alto: "+alto+"\n"+ "area: "+area()+"\n". } public String mostrarDatos(){ return "posición: "+x+". this..length.. . } } Clase Principal import semana14. i++){ if(figuras[i]. Figura figuraMayor(Figura[] figuras){ Figura mFigura=null.area()>areaMayor){ areaMayor=figuras[i]. } public double area(){ return Math.PI*radio*radio. imprimir("El área mayor es " + fMayor. 5.0. Circulo(30. fig[0] fig[1] fig[2] fig[3] = = = = new new new new Rectangulo(0. i++){ imprimir("Datos del "+x[i]. 20.ALGORITMOS Y ESTRUCTURA DE DATOS 143 void procesar(){ Figura[] fig = new Figura[4]. i<x. 7.0). } } Importante: fig es un arreglo de objetos de tipo Figura. listar(fig). 5. 4.getName()). } void listar(Figura[] x){ for(int i=0. 7.getClass(). 6. 50. 50.mostrarDatos()).0). Rectangulo(50. - CIBERTEC CARRERAS PROFESIONALES . Circulo(10. Cuando hacemos listar(fig) estamos enviando el arreglo como parámetro por esa razón el método listar debe recibir el arreglo de la forma : void listar(Figura[] x) getClass() es un método de la clase Object y se utiliza para obtener el nombre de la clase de un objeto.area()). 0. imprimir(x[i].length.0.0). Figura fMayor = figuraMayor(fig).0). 144 Ejercicios 1. Dada la superclase Producto que se encuentra en el paquete padre, la cual cuenta con los atributos y métodos que se muestran a continuación: package padre; public abstract class Producto { protected String nombre; protected int stock; protected int contaObjetos; public Producto(String nombre, int stock) { this.nombre = nombre; this. stock = stock; contaObjetos++; } public abstract String autogenerado(); public abstract String mostrarDatos(); } Implemente en el paquete hijo las subclases: Artefacto, la cual debe tener como atributos privados: tipo y precio. En esta subclase debe implementar el método autogenerado (formado por “ART” y la concatenación de los 3 primeros caracteres del nombre con el contador de objetos) y el método mostrarDatos (que retorna una cadena indicando los datos del artefacto). EquipoComputo, la cual debe tener como atributo privado: precio y marca. En esta subclase debe implementar el método autogenerado (formado por “COMP” y la concatenación de los 3 primeros caracteres del nombre con el contador de objetos) y el método mostrarDatos (que retorna una cadena indicando los datos del equipo de cómputo). En la clase Principal, cree los métodos Procesar() y Listar(). - En el método Procesar() cree 2 objetos, el primero de tipo Artefacto y el segundo de tipo EquipoComputo. - En el método Listar() imprima los datos de los objetos creados. Aplique polimorfismo y el operador instanceof. CARRERAS PROFESIONALES CIBERTEC ALGORITMOS Y ESTRUCTURA DE DATOS 145 2. Dada la superclase Trabajador que se encuentra en el paquete padre, la cual cuenta con los atributos y métodos que se muestran a continuación: package padre; public abstract class Trabajador{ protected String nom,ape,dni; public Trabajador(String nom, String ape, String dni){ this.nom=nom; this.ape=ape; this.dni=dni; } public String generarCodigo(){ return ""+dni+ape.charAt(0)+nom.charAt(1); } public abstract String mostrarDatos(); } Implemente en el paquete hijo las subclases: Vendedor, la cual debe tener como atributos privados: montoVendido y porcentaje de comisión. En esta subclase debe implementar el método comisión en soles (montoVendido * porcentaje de comisión) y el método sueldo bruto (800 + comisión en soles). Supervisor, la cual debe tener como atributos privados: sueldo básico, horas extras, tarifa de horas extras. En esta subclase debe implementar el método montoExtras (horas extras* tarifaHorasExtras) y método sueldo bruto (sueldo básico + monto extras). En la clase Principal: En el método procesar cree 2 objetos. El primero de tipo Vendedor y el segundo de tipo Supervisor. Luego, llame a un solo método listar e imprima los 2 objetos con todos sus datos. Aplique polimorfismo y el operador instanceof. CIBERTEC CARRERAS PROFESIONALES 146 UNIDAD DE APRENDIZAJE 5 SEMANA 15 INTERFACES LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad, los alumnos entienden el concepto de herencia múltiple. Crean e implementan interfaces. TEMARIO Creación e implementación de Interfaces Herencia múltiple ACTIVIDADES PROPUESTAS Los alumnos crean e implementan interfaces Los alumnos entienden el concepto de herencia múltiple CARRERAS PROFESIONALES CIBERTEC public interface Constantes { double pi = 3. con lo cual no se hereda nada. La principal diferencia entre interface y clase abstracta es que un interfaz proporciona un mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la herencia.*. simplemente. int constanteInt = 5. La clase que implementa una o más interfaces utiliza la palabra reservada implements.14. es necesario que la clase implemente todos los métodos definidos por la interfaz. int get(). Y si adicionalmente tiene miembros datos. } Código de la interfaz: Interfaz1 package interfaces. permitiendo a cada clase compartir el interfaz de programación sin tener que ser consciente de la implementación que hagan las otras clases que implementen el interfaz. En Java. es decir es una clase sin implementación. import interfaces. } Código de la clase: ClaseA package clases. como una forma. Al utilizar implements para el interfaz es como si se hiciese una acción de copiar y pegar del código del interfaz. La ventaja principal del uso de interfaces es que puede ser implementada por cualquier número de clases. éstos serán constantes. public interface Interfaz1 { void put( int dato ). solamente se pueden usar los métodos. las interfaces se declaran con la palabra reservada interface. Una interfaz podrá verse. es decir.ALGORITMOS Y ESTRUCTURA DE DATOS 147 1) Creación de Interfaces Una interfaz es una clase completamente abstracta. es como un molde. Ejemplo 1 Código de la interfaz: Constantes package interfaces. CIBERTEC CARRERAS PROFESIONALES . Una interfaz es cuando lo único que puede tener son declaraciones de métodos y definiciones de constantes simbólicas. Para ello. solamente permite declarar nombres de métodos y en este caso no es necesario definirlos como abstractos puesto que lo son implícitamente. static y final. 148 public class ClaseA implements Constantes. objA. .dato = dato * constanteInt. import clases.put(2).dato = dato * pi. // El método put del interfaz1 public void put( int dato ) { // Se usa "pi" del interfaz Constantes this. Interfaz1 { double dato.get()).. . } } Código de la clase: ClaseB package clases. public class ClaseB implements Constantes. } // El método get del interfaz1 public int get() { return( (int)dato ). // Se crea un objeto de tipo ClaseB CARRERAS PROFESIONALES CIBERTEC . } // El método get del interfaz1 public int get() { return dato. Interfaz1 { int dato. } } Código de la clase: Principal import interfaces. import interfaces.show())..*. imprimir("dato objA = "+objA.*...*. } // El método show() no esta declarado en el interfaz1 public String show() { return "imprime " + dato. // El método put del interfaz1 public void put( int dato ) { // Se usa "constanteInt" del interfaz Constantes this. void procesar(){ // Se crea un objeto de tipo ClaseA ClaseA objA = new ClaseA(). // El método show pertenece a la claseA imprimir(objA. Ejemplo 2 package interfaces.y Métodos: Figura(constructor) ubicacion() area() Rotable Método: rotar() Cuadrado Atributo: lado Métodos: Cuadrado(constructor) area() dibujar() Circulo Atributo: radio Métodos: Circulo(constructor) area() dibujar() rotar() Dibujable y Rotable son interfaces.get()).28 dato objA = 6 dato objB = 20 2) Herencia Múltiple En Java realmente no existe la herencia múltiple lo que se puede es crear una clase que implemente (implements) más de un interfaz. public interface Dibujable { String dibujar(). Por ejemplo: Cuadrado implementa la interfaz Dibujable y Circulo implementa las interfaces Dibujable y Rotable. } CIBERTEC CARRERAS PROFESIONALES .put(4). objB. La siguiente figura muestra la implementación de interfaces: Dibujable Método: dibujar() Figura Atributos: x. } Salida: imprime 6.ALGORITMOS Y ESTRUCTURA DE DATOS 149 ClaseB objB = new ClaseB(). pero sólo puede extender una clase (extends). imprimir("dato objB = " + objB. cuyos métodos serán implementados en otras clases. public class Circulo extends Figura implements Dibujable. Rotable { private double radio. double lado) { super(x. import interfaces. int y) { this. } //Sobre-escritura public String dibujar() { return "El cuadrado puede ser dibujado". public class Cuadrado extends Figura implements Dibujable{ private double lado. } package clases. } public String ubicacion(){ return "figura ubicada en: "+x+".Dibujable. this. CARRERAS PROFESIONALES CIBERTEC . "+y. public interface Rotable { String rotar(). y).lado = lado.x = x.y = y.*. } package clases.150 package interfaces. import interfaces. public Cuadrado(int x. this. public abstract class Figura{ protected int x. } //Sobre-escritura public double area() { return lado*lado. } public abstract double area() . public Figura(int x. } } package clases. protected int y. int y. *.rotar()).PI * radio * radio. y).8).dibujar()). .20. imprimir("El área es:"+x. double radio) { super(x. } } Clase Principal import clases. } //Sobre-escritura public double area() { return Math. } //Sobre-escritura public String dibujar() { return "El círculo puede ser dibujado". imprimir(((Circulo)x). else{ imprimir(((Circulo)x). } CIBERTEC CARRERAS PROFESIONALES .110.. . Circulo obj2 = new Circulo(40. listar(obj2).. listar(obj1).radio = radio. } imprimir("").. if(x instanceof Cuadrado) imprimir(((Cuadrado)x).ALGORITMOS Y ESTRUCTURA DE DATOS 151 public Circulo(int x. } void listar(Figura x){ imprimir(x.3). this.dibujar()). void procesar(){ Cuadrado obj1 = new Cuadrado(10. } //Sobre-escritura public String rotar() { return "El círculo puede rotar".ubicacion()).area()).. int y. Considere que hay vehículos que son terrestres y otros que son aereos. } public String detener(){ return "no hay mensaje". import interfaces. String retroceder(). String bajar(). En la solución emplee interfaces. hay operaciones que por ejemplo un avión puede hacer pero no un auto. public interface Movimiento{ String avanzar().152 Aplicación 1: Diseñe una aplicación que muestre las operaciones de avanzar. } public abstract String mostrarCapacidad(). } package interfaces.capacidad=capacidad. } public String retroceder(){ return "no hay mensaje". detener. public abstract class Transporte implements Movimiento{ protected int capacidad. Moto. public interface Volar{ String subir(). subir y bajar que puede hacer los siguientes medios de transporte: Auto. public Transporte(int capacidad){ this. String detener(). Bicicleta. package interfaces. Avión y Helicóptero. clases abstractas y subclases. } } CARRERAS PROFESIONALES CIBERTEC . } package clases.Movimiento. Por lo tanto. retroceder. public String avanzar(){ return "no hay mensaje". } public String mostrarCapacidad(){ return "Capacidad de pasajeros de la Moto:"+capacidad. } public String mostrarCapacidad(){ return "Capacidad de pasajeros de la Bicicleta:"+capacidad. } CIBERTEC CARRERAS PROFESIONALES . public class Auto extends Transporte{ public Auto(int capacidad){ super(capacidad). } public String avanzar(){ return "el auto esta avanzando". public class Moto extends Transporte{ public Moto(int capacidad){ super(capacidad). } public String avanzar(){ return "la bicicleta esta avanzando". } public String mostrarCapacidad(){ return "Capacidad de pasajeros del Auto:"+capacidad. } public String avanzar(){ return "la moto esta avanzando".ALGORITMOS Y ESTRUCTURA DE DATOS 153 package clases. } public String detener(){ return "la bicicleta se detuvo". } } package clases. public class Bicicleta extends Transporte{ public Bicicleta(int capacidad){ super(capacidad). } } package clases. public class Helicoptero extends Transporte implements Volar{ public Helicoptero(int capacidad){ super(capacidad). } } package clases. import interfaces.Volar. } public String subir(){ return "el avión esta subiendo". public class Avion extends Transporte implements Volar{ public Avion(int capacidad){ super(capacidad).154 public String detener(){ return "la moto se detuvo". } public String retroceder(){ return "el avión esta retrocediendo". } public String mostrarCapacidad(){ return "Capacidad de pasajeros del Avión:"+capacidad. } } package clases. } public String mostrarCapacidad(){ CARRERAS PROFESIONALES CIBERTEC . import interfaces. } public String retroceder(){ return "la moto esta retrocediendo". } public String bajar(){ return "el avión esta bajando".Volar. } public String avanzar(){ return "el avión esta avanzando". } public String detener(){ return "el avión se detuvo". awt.addActionListener(this).*.100. getContentPane().lightGray).add(btnProcesar).20.*.*.awt.setBackground(Color. } public String detener(){ return "el helicoptero se detuvo". btnProcesar. clases. javax.setLayout(null). } public String bajar(){ return "el helicoptero esta bajando". btnProcesar.20). scpScroll=new JScrollPane(txtS). JTextArea txtS. txtS=new JTextArea(). getContentPane(). java.swing. } public String avanzar(){ return "el helicoptero esta avanzando". public class Principal extends JApplet implements ActionListener{ JButton btnProcesar. JScrollPane scpScroll. } } Clase Principal: import import import import java.event. // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().ALGORITMOS Y ESTRUCTURA DE DATOS 155 return "Capacidad de pasajeros del Helicoptero:"+capacidad.setBounds(170. btnProcesar=new JButton("Procesar"). } public String retroceder(){ return "el helicoptero esta retrocediendo". } public String subir(){ return "el helicoptero esta subiendo".*. CIBERTEC CARRERAS PROFESIONALES . append(cad + "\n").retroceder()). } } CARRERAS PROFESIONALES CIBERTEC .subir()).avanzar()). Moto moto1=new Moto(2). imprimir(avion1. } } void procesar(){ Auto auto1=new Auto(5). } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ if(e. listar(moto1). imprimir(heli1.setBounds(20.add(scpScroll). } void listar(Transporte x){ imprimir(x. imprimir(heli1. Helicoptero heli1=new Helicoptero(10). getContentPane(). imprimir(x. imprimir(avion1. Avion avion1=new Avion(300).subir()). listar(auto1).60.getSource()==btnProcesar){ procesar(). imprimir(x. listar(avion1). imprimir(x.430.bajar()).156 scpScroll. } void imprimir(String cad){ txtS.detener()). listar(bici1). Bicicleta bici1=new Bicicleta(1).bajar()). listar(heli1).420).mostrarCapacidad()). ALGORITMOS Y ESTRUCTURA DE DATOS 157 Interfaz Gráfica de usuario: CIBERTEC CARRERAS PROFESIONALES . 158 ANEXO CASO INMOBILIARIA OBJETIVO ESPECÍFICO Solución de un caso práctico donde se emplea la técnica POO TEMARIO Creación de clases. private y protected Uso de la clase ArrayList y archivos de texto Clases y métodos abstractos Encapsulamiento. Herencia y Polimorfismo CARRERAS PROFESIONALES CIBERTEC . paquetes y objetos Modificador Static y Referencia this Modificadores de acceso : public. ALGORITMOS Y ESTRUCTURA DE DATOS 159 Caso Inmobiliaria: Una inmobiliaria desea que le desarrollen una aplicación que le permita dar una información adecuada sobre las propiedades que renta a sus clientes. . Aplicar los conceptos de la POO aprendidos en el curso.Búsqueda según un intervalo de área. . .Búsqueda de la propiedad más cara. para lo cual se debe desarrollar lo siguiente: Mantenimiento de propiedades que renta. se refiere a la ubicación del departamento dentro del edificio) : true (con jardín) y false (sin jardín). . Modificación y Eliminación. De cada propiedad se conoce: Código Ancho Largo Precio Habitaciones Disponibilidad Piso Jardín : entero y único : real en metros : real en metros : real en soles : entero : true (no rentado) y false (rentado) : entero (sólo en el caso de departamentos.Búsqueda según un intervalo de área y un intervalo de precio. es decir debe considerar las siguientes opciones: Ingresos. Consultas.Búsqueda según un intervalo de precio. sólo para casas. Diariamente acuden muchos clientes a la inmobiliaria buscando Información sobre casas y departamentos que estén disponibles y que cubra sus expectativas. por lo tanto se desea que la aplicación realice las siguientes búsquedas: .Búsqueda de la propiedad más barata. A continuación se muestra la interfaz gráfica de usuario (GUI) CIBERTEC CARRERAS PROFESIONALES . precio. el más barato. En la opción de busquedas puede realizar las consultas de que casas y/o departamentos estan disponibles dependiendo de los criterios seleccionados (según el area. modificación y eliminación. el más caro.160 En las opciones de mantenimiento de casas y mantenimiento de departamentos el usuario puede realizar las opciones de ingreso. CARRERAS PROFESIONALES CIBERTEC . etc). consulta. CIBERTEC CARRERAS PROFESIONALES .ALGORITMOS Y ESTRUCTURA DE DATOS 161 Utilice el JComboBox de opción para seleccionar la opción de ingreso. En el caso de las casas que tengan jardin debe darle clic a la casilla de verificación Jardin. modificación o eliminación. consulta. La información ingresada o modificada alterará a los archivos de texto correspondientes. Sólo cuando una casa no este disponible porque por ejemplo ya se rentó debe desmarcar la casilla de verificación Disponibilidad. La información ingresada o modificada alterará a los archivos de texto correspondientes. consulta. modificación o eliminación. El JTextField de piso se refiere a la ubicación del departamento dentro del edificio o condominio.162 Utilice el JComboBox de opción para seleccionar la opción de ingreso. CARRERAS PROFESIONALES CIBERTEC . ALGORITMOS Y ESTRUCTURA DE DATOS 163 Utilice el JComboBox Propiedad para seleccionar entre casa o departamento y el JComboBox Buscar por para seleccionar el criterio de busqueda (según area. precio. area y precio. el más barato y el más caro). CIBERTEC CARRERAS PROFESIONALES . Ingrese los rangos de área y precio según sea el caso y déle clic al botón Procesar para ejecutar la busqueda. this.largo = largo. double largo.ancho = ancho.hab = hab.164 Solución del caso propuesto: Clase Propiedad package renta.precio = precio.codigo = codigo.precio = precio. } public double getAncho(){ return ancho. double ancho. this. this. } public void setHab( int hab ){ this. } public void setLargo( double largo ){ this. } public void setCodigo( int codigo ){ this. double precio.hab. this. } public void setDisp( boolean disp ){ this.largo = largo.disp = disp. public Propiedad( int codigo. int hab. this.disp = disp. largo. protected boolean disp. public abstract class Propiedad { protected int codigo. } public void setAncho( double ancho ){ this. protected double precio.hab = hab.ancho = ancho. boolean disp){ this. } public int getHab(){ return hab. } public void setPrecio( double precio ){ this. } public int getCodigo(){ return codigo. protected double ancho.codigo = codigo. } CARRERAS PROFESIONALES CIBERTEC . } } Clase Departamento package renta. double largo. } public double getPrecio(){ return precio. public Departamento( int codigo. } public boolean getDisp(){ return disp. } public void setJardin( boolean jardin ){ this.disp). public class Casa extends Propiedad { private boolean jardin. } public double area(){ return ancho*largo. double largo. } public String comoCadena(){ return codigo + "\t" + ancho + "\t" + largo + "\t" + precio + "\t" + area() + "\t" + jardin.jardin=jardin. boolean jardin){ super(codigo.ancho. double ancho. int hab. } public abstract String comoCadena(). boolean disp.largo.precio. this. int piso){ CIBERTEC CARRERAS PROFESIONALES . double precio.hab.ALGORITMOS Y ESTRUCTURA DE DATOS 165 public double getLargo(){ return largo. double ancho. public Casa( int codigo.jardin = jardin. public class Departamento extends Propiedad { private int piso. } public boolean getJardin(){ return jardin. } Clase Casa package renta. double precio. boolean disp. int hab. } public Casa buscar(int cod){ for(int i=0.io.ancho.getCodigo().precio. i<aCasas.util. CARRERAS PROFESIONALES CIBERTEC . import java. import java. } public String comoCadena(){ return codigo + "\t" + ancho + "\t" + largo + "\t" + precio + "\t" + area() + "\t"+ piso. } public void setPiso( int piso ){ this. } } Clase ArregloCasas package arreglos.166 super(codigo. } public int getPiso(){ return piso.hab.*.piso=piso. } public void agregar(Casa x){ aCasas.add(x).remove(x).piso = piso. if(pcod==cod) return obtener(i). public class ArregloCasas{ private ArrayList <Casa> aCasas. this. i++){ int pcod=obtener(i). public ArregloCasas(){ aCasas=new ArrayList <Casa> (). } return null.*.largo. } public Casa obtener(int pos){ return aCasas.Casa.size().size().get(pos). } public int tamaño(){ return aCasas. import renta. } public void eliminar(Casa x){ aCasas.disp). } public void cargarCasas(){ try{ BufferedReader br = new BufferedReader(new FileReader("casas. int hab = Integer. aCasas.parseInt( tokens.close().trim()). for( int i = 0.parseDouble( tokens. boolean jardin = Boolean. boolean disp = Boolean.nextToken().trim()). return mayor. } public double precioMayor(){ double mayor = Double.add(new Casa(codigo. i++ ) if( aCasas.trim()).getPrecio() < menor && aCasas. i < aCasas.".trim()).readLine()) != null ){ StringTokenizer tokens = new StringTokenizer(linea.trim()).precio.ALGORITMOS Y ESTRUCTURA DE DATOS 167 } public double precioMenor(){ double menor = Double.parseBoolean( tokens. } catch( Exception x ){ System.get(i).trim()).txt")). i++ ) if( aCasas.hab.MAX_VALUE. while( (linea = br.getPrecio().println("Error: " + x).nextToken().MIN_VALUE.out.nextToken(). String linea.getPrecio().nextToken(). CIBERTEC CARRERAS PROFESIONALES .get(i).getDisp() ) mayor = aCasas. i < aCasas.get(i). } } public void grabarCasa(){ try{ PrintWriter pw = new PrintWriter(new FileWriter("casas. double largo = Double.trim()).get(i).size().size(). return menor.").nextToken().parseDouble( tokens.parseInt( tokens. largo. int codigo = Integer. double ancho = Double.parseDouble( tokens.get(i).nextToken().txt")).ancho. } br.parseBoolean( tokens.get(i).jardin)).getDisp() ) menor = aCasas.nextToken().disp. double precio = Double. for( int i = 0.getPrecio() > mayor && aCasas. "+ aCasas.getCodigo()+ ". } public Departamento obtener(int pos){ return aDptos. i<aCasas. } CARRERAS PROFESIONALES CIBERTEC . } public void agregar(Departamento x){ aDptos. i++){ int pcod=obtener(i). for(int i=0.getCodigo().size(). pw."+ aCasas.println(linea). } pw.close(). public ArregloDepartamentos(){ aDptos=new ArrayList <Departamento> ().get(i).getDisp()+ ".getAncho()+ ". import java.util. import renta."+ aCasas.getLargo()+ ". } public int tamaño(){ return aDptos.Departamento.getPrecio()+ ".size(). i++){ linea =aCasas. } catch( Exception x ){ } } } Clase ArregloDepartamentos package arreglos.*.get(i)."+ aCasas.get(i). i<aDptos. if(pcod==cod) return obtener(i).get(i). } return null.getHab()+ ". } public Departamento buscar(int cod){ for(int i=0.add(x).get(i).size().get(i).get(pos).getJardin().io.*. import java.168 String linea.get(i). public class ArregloDepartamentos{ private ArrayList <Departamento> aDptos."+ aCasas."+ aCasas. txt")).getPrecio().get(i). } catch( Exception x ){ System.trim()). for( int i = 0.get(i).MIN_VALUE.parseDouble( tokens.trim()).ALGORITMOS Y ESTRUCTURA DE DATOS 169 public void eliminar(Departamento x){ aDptos.getPrecio().nextToken(). } public void cargarDepartamentos(){ try{ BufferedReader br = new BufferedReader(new FileReader("departamentos.largo. double ancho = Double.parseInt( tokens.trim()).getPrecio() < menor && aDptos. i < aDptos.parseInt( tokens.precio. boolean disp = Boolean.size().nextToken(). int hab = Integer.trim()). } br.trim()).trim()).nextToken().size(). int codigo = Integer.piso)). } } public void grabarDepartamento(){ try{ CIBERTEC CARRERAS PROFESIONALES . aDptos.close().parseInt( tokens.MAX_VALUE.trim()).disp.nextToken(). i++ ) if( aDptos.parseBoolean( tokens. return menor. int piso = Integer. } public double precioMenor(){ double menor = Double.parseDouble( tokens.hab. double largo = Double. return mayor. } public double precioMayor(){ double mayor = Double.getPrecio() > mayor && aDptos.").add(new Departamento(codigo.getDisp() ) menor = aDptos.parseDouble( tokens. while( (linea = br.get(i).readLine()) != null ){ StringTokenizer tokens = new StringTokenizer(linea. for( int i = 0.nextToken().nextToken().remove(x).get(i). i++ ) if( aDptos.nextToken().". ancho.println("Error: " + x). i < aDptos.get(i).out.getDisp() ) mayor = aDptos. String linea. double precio = Double.get(i). getPiso().get(i).get(i). public class LibGUI { private LibGUI(){ } public static int getInteger( JTextField t ){ return Integer. PCasa pnlCasa.getHab()+ ".awt. java.applet. for(int i=0. CARRERAS PROFESIONALES CIBERTEC .getCodigo()+ ".get(i).get(i). } catch( Exception x ){ System.*."+ aDptos.parseInt(t."+ aDptos. i++){ linea =aDptos.getAncho()+ ".getText()).getLargo()+ ".parseDouble(t.close(). i<aDptos. } public static double getDouble( JTextField t ){ return Double.size().*. } } Clase Principal import import import import java.*. javax. String linea. PBusqueda pnlBusqueda.getText()). import javax. arreglos."+ aDptos.swing."+ aDptos."+ aDptos.out."+ aDptos.println(linea). } } } Clase LibGUI (Librería) package compartido.170 PrintWriter pw = new PrintWriter(new FileWriter("departamentos. PDepartamento pnlDpto. } pw. pw.println("Error: " + x).get(i).*.txt")).get(i).getDisp()+ ".get(i). public class Principal extends JApplet { PPrincipal pnlPrincipal.getPrecio()+ ".*.swing. 600.0.600.600. setLayout(null). private Principal pri.setBounds(0. pnlDpto=new PDepartamento(this). pnlBusqueda. pnlPrincipal.swing. } } Clase PPrincipal import java.setVisible(false).Font. CIBERTEC CARRERAS PROFESIONALES . import javax. public void init() { setLayout(null). add(pnlDpto).lblFoto3. lblTitulo=new JLabel("Caso Inmobiliaria". pnlCasa. pnlBusqueda=new PBusqueda(this).0.lblFoto1.event. add(pnlPrincipal).500). pnlBusqueda. pnlCasa=new PCasa(this). public ArregloDepartamentos aDpt = new ArregloDepartamentos().btnMtoDptos.BOLD.setBounds(0. public PPrincipal(Principal x){ pri=x. setBackground(Color.CENTER).20.setBounds(0. lblTitulo.setBounds(0. pnlPrincipal.setVisible(false).awt.20)).ALGORITMOS Y ESTRUCTURA DE DATOS 171 public ArregloCasas aCas = new ArregloCasas(). JLabel. pnlDpto.500).*.setVisible(true). import java.*. add(lblTitulo).lblFoto2.600. public class PPrincipal extends JPanel implements ActionListener { private JLabel lblTitulo.setFont(new Font("Arial".600.0. pnlCasa. add(pnlBusqueda).setVisible(false).500).0.lightGray).500).setBounds(0.*.btnBusquedas.awt. lblTitulo. add(pnlCasa). pnlPrincipal=new PPrincipal(this).20). pnlDpto. private JButton btnMtoCasas. setVisible(false). lblFoto1=new JLabel(new ImageIcon("foto1.addActionListener(this).150. } public void mtoCasas(){ pri. btnMtoDptos.getSource()==btnBusquedas) busquedas(). } public void actionPerformed(ActionEvent e){ if(e.100).260. add(btnBusquedas).setVisible(false). lblFoto1.setBounds(175. btnMtoDptos.25).25).jpg")).getSource()==btnMtoCasas) mtoCasas(). lblFoto3=new JLabel(new ImageIcon("foto3.setBounds(50.250.150.pnlPrincipal.260. add(lblFoto1). pri. pri.250. add(lblFoto3). } CARRERAS PROFESIONALES CIBERTEC . lblFoto2=new JLabel(new ImageIcon("foto2. } public void mtoDptos(){ pri.setVisible(true). btnBusquedas=new JButton("Busquedas").pnlDpto.addActionListener(this). } public void busquedas(){ pri.180. btnMtoDptos=new JButton("Mantenimiento de Departamentos").getSource()==btnMtoDptos) mtoDptos().pnlBusqueda.setBounds(175. btnBusquedas. btnMtoCasas. btnBusquedas.172 btnMtoCasas=new JButton("Mantenimiento de Casas").150. btnMtoCasas.jpg")).pnlPrincipal. add(lblFoto2).pnlCasa.140.setVisible(false).100).250.setBounds(220.setVisible(true).100.100).jpg")).25).setBounds(175. lblFoto3. add(btnMtoCasas).setBounds(380.setVisible(true).addActionListener(this). if(e. lblFoto2.pnlPrincipal.260. add(btnMtoDptos). if(e. pri. 112. txtPrecio. lblHab.CENTER). add(lblAncho).setBounds(150.150.20).132.txtAncho. CIBERTEC CARRERAS PROFESIONALES . lblAncho=new JLabel("Ancho:").btnCancelar.70.setBounds(10.lightGray). add(lblCodigo).setBounds(10. lblCodigo=new JLabel("Codigo:"). txtLargo.btnEliminar.lblHab.setFont(new Font("Arial".JLabel.lblCodigo. import java.20). cboOpcion=new JComboBox().lblPrecio.600.150. add(lblTitulo). lblTitulo. lblPrecio=new JLabel("Precio:").20). protected JCheckBox chkDispo. lblLargo=new JLabel("Largo:"). protected JLabel lblTitulo.ALGORITMOS Y ESTRUCTURA DE DATOS 173 } Clase PFormulario import javax.20).lblLargo. add(lblOpcion).setBounds(10. lblFoto1. lblTitulo=new JLabel("". btnModificar.lblFoto3.152. add(lblPrecio). add(lblHab). lblAncho.70. protected JTextField txtCodigo.setBounds(10.awt.20.150.150. lblHab=new JLabel("Habitaciones:").*.setBounds(10. lblOpcion=new JLabel("Opción:"). lblPrecio. public PFormulario() { setLayout(null). add(lblLargo). cboOpcion. public class PFormulario extends JPanel{ protected JComboBox cboOpcion. lblCodigo. lblFoto2.*. lblAncho.172. lblTitulo.20).150.setBounds(0.setBounds(10. protected JButton btnAceptar.txtHab. setBackground(Color.swing. cboOpcion.BOLD.150.Font. lblOpcion.20).addItem("Ingresos").lblOpcion.20).20). lblLargo.20)).92.150. txtLargo. txtPrecio=new JTextField().setBounds(150.152.172.150. txtHab=new JTextField(). txtAncho=new JTextField(). txtLargo=new JTextField(). lblFoto1=new JLabel(new ImageIcon("foto1.20). btnEliminar.92. btnCancelar. btnAceptar.174 cboOpcion.260.150. add(btnCancelar).150.setBounds(400.20).20).setBounds(400. chkDispo. txtPrecio. add(lblFoto2). chkDispo=new JCheckBox("Disponibilidad").25).80.addItem("Consultas").addItem("Modificación"). add(btnEliminar). add(btnAceptar). btnAceptar = new JButton("Aceptar").setBackground(Color.setBounds(150. add(txtPrecio). add(txtAncho).260. add(txtHab).setBounds(400.addItem("Eliminación").setBounds(150. btnCancelar = new JButton("Cancelar").132.112.150.100.jpg")).150.100.20).110.jpg")). cboOpcion.80. lblFoto2=new JLabel(new ImageIcon("foto2.setVisible(false). txtCodigo=new JTextField().80.setBounds(400.100.lightGray). add(txtLargo).setBounds(220.20).setVisible(false).setBounds(150. btnModificar. txtCodigo.setBounds(400. btnModificar. CARRERAS PROFESIONALES CIBERTEC .100.20).150. btnEliminar = new JButton("Eliminar"). add(cboOpcion). add(btnModificar). add(chkDispo). lblFoto2. txtAncho.setBounds(50. btnModificar = new JButton("Modificar").25). txtHab.150.100).25). cboOpcion. chkDispo.152. btnEliminar.25). add(lblFoto1). lblFoto1.150. add(txtCodigo).setBounds(150.100). *. javax.setText(""). cboOpcion. java. txtHab. lblFoto3. public class PCasa extends PFormulario implements ActionListener. txtPrecio. txtPrecio. chkDispo.260.*.LibGUI. ItemListener{ private Principal pri.setText(""). private boolean flagDispo=false.Casa. cboOpcion.setVisible(false). txtLargo. btnModificar.setEnabled(true).100). } protected void desabilitarControles(){ txtAncho.setBounds(380. txtAncho.swing.awt. txtLargo. txtHab. public PCasa(Principal x) { CIBERTEC CARRERAS PROFESIONALES .event.setEditable(false).setSelectedIndex(0).setEditable(false).setEnabled(false).setEditable(true). } protected void cambio(){ btnAceptar.setEditable(false). } protected void habilitarControles(){ txtAncho. txtHab. txtCodigo.setEditable(true). txtPrecio. chkDispo. compartido. btnEliminar.setText("").ALGORITMOS Y ESTRUCTURA DE DATOS 175 lblFoto3=new JLabel(new ImageIcon("foto3. private JCheckBox chkJardin. flagJardin=false.setSelected(false).setEnabled(true).setEditable(true). add(lblFoto3).*. } protected void limpiarControles(){ txtCodigo.jpg")). txtLargo. existe=false. } } Clase PCasa import import import import import java.150. chkDispo.setText("").setText(""). renta.setEditable(false).setVisible(false).setVisible(true).awt.setEditable(true).setEditable(true). chkJardin. chkJardin.setBackground(Color. chkJardin.getItemSelectable()==chkDispo){ flagDispo=!flagDispo.getSource()==btnModificar) modificarCasa().20). if(e.getSource()==btnAceptar) aceptar(). if(indice==1 || indice==3) desabilitarControles().addItemListener(this).addItemListener(this).addActionListener(this).getSource()==cboOpcion){ int indice=cboOpcion. } public void itemStateChanged(ItemEvent e){ if(e. CARRERAS PROFESIONALES CIBERTEC .aCas.setBounds(400. lblTitulo.addActionListener(this).172. } if(e.150.habilitarControles(). cboOpcion.addActionListener(this). else habilitarControles().cargarCasas(). btnAceptar.getItemSelectable()==chkJardin){ flagJardin=!flagJardin. btnEliminar.getSource()==btnEliminar) eliminarCasa(). add(chkJardin).getSource()==btnCancelar) cancelar(). pri.addActionListener(this).lightGray). } if(e. chkJardin=new JCheckBox("Jardin"). chkDispo. btnCancelar. btnModificar. if(e.getSelectedIndex(). if(e.176 pri=x. } } protected void habilitarControles(){ super.setText("Mantenimiento de Casas").addItemListener(this). } public void actionPerformed(ActionEvent e){ if(e. pri. } else JOptionPane."Código ya existe").aCas.aCas.flagDispo. chkJardin. case 1: consultar(). pri. precio.buscar(cod).desabilitarControles().showMessageDialog(this.grabarCasa().getInteger(txtCodigo). double largo=LibGUI. } protected void desabilitarControles(){ super. existe=false.pnlCasa.agregar(Ocasa). } public void aceptar(){ int indice=cboOpcion.getInteger(txtHab).flagJardin).getDouble(txtAncho). int hab=LibGUI. limpiarControles(). switch(indice){ case 0: ingresar().ancho.ALGORITMOS Y ESTRUCTURA DE DATOS 177 chkJardin. cambio(). } public void ingresar(){ int cod=LibGUI. Casa Ocasa=pri.pnlPrincipal. limpiarControles(). double precio=LibGUI.setSelected(false). JOptionPane. Ocasa=new Casa(cod. case 2: modificar(). if(Ocasa==null){ double ancho=LibGUI. pri. break."Casa Agregada"). chkJardin. } } public void cancelar(){ pri.getDouble(txtPrecio). break.getDouble(txtLargo).getSelectedIndex().showMessageDialog(this.limpiarControles(). break.largo.setEnabled(true).setEnabled(false). } protected void limpiarControles(){ super. habilitarControles().hab.setVisible(true). } public void consultar(){ CIBERTEC CARRERAS PROFESIONALES . default: eliminar().setVisible(false).aCas. setText(""+Ocasa. limpiarControles(). boolean flag1=Ocasa. } } public void modificar(){ consultar(). if(flag2) chkJardin. else chkDispo.getLargo()).buscar(cod).setJardin(flagJardin).getDisp().aCas. } public void eliminar(){ consultar(). cambio().setHab(LibGUI.getDouble(txtLargo)).setSelected(true).grabarCasa().setText(""+Ocasa.aCas.getDouble(txtAncho)).setVisible(false). btnModificar. Casa Ocasa=pri.setPrecio(LibGUI.178 int cod=LibGUI.setAncho(LibGUI. Ocasa.setDisp(flagDispo).getInteger(txtCodigo).getPrecio()).setText(""+Ocasa. JOptionPane. boolean flag2=Ocasa."Código no existe").getInteger(txtHab)).getDouble(txtPrecio)). txtLargo.setSelected(true). Ocasa.getHab()). pri.buscar(cod). limpiarControles(). } else{ JOptionPane.setSelected(false).setText(""+Ocasa.showMessageDialog(this.setLargo(LibGUI. existe=true.getAncho()).getInteger(txtCodigo). else chkJardin. Ocasa. Ocasa. Casa Ocasa=pri.setSelected(false).showMessageDialog(this.getJardin().setEditable(false)."Cambio efectuado"). } } public void modificarCasa(){ int cod=LibGUI.setEnabled(false). if(flag1) chkDispo. Ocasa. if(existe){ CARRERAS PROFESIONALES CIBERTEC .setVisible(true). txtPrecio. if(Ocasa!=null){ txtAncho. cboOpcion.aCas. existe=false. if(existe){ btnAceptar. txtCodigo. txtHab. Ocasa. setVisible(false).aCas.addItemListener(this). } } Clase PDepartamento import import import import import java. existe=false. btnModificar.awt. cambio().showMessageDialog(this.aCas. pri.setEnabled(false). CIBERTEC CARRERAS PROFESIONALES .*.LibGUI. java.grabarCasa().setBounds(150.eliminar(pri. JTextField txtPiso. ItemListener { private private private private Principal pri.150. pri. cboOpcion. txtPiso. public class PDepartamento extends PFormulario implements ActionListener.ALGORITMOS Y ESTRUCTURA DE DATOS 179 btnAceptar.awt. add(lblPiso).addItemListener(this).192.20). add(txtPiso).aCas. lblPiso. JLabel lblPiso.*.aDpt. boolean flagDispo=false.setText("Mantenimiento de Departamentos").setEditable(false). public PDepartamento(Principal x) { pri=x.addActionListener(this).swing. txtCodigo.addActionListener(this). btnEliminar. txtPiso=new JTextField(). chkDispo.event. btnCancelar. lblPiso=new JLabel("Piso:").setVisible(true).addActionListener(this).*. javax.20).Departamento. pri. btnAceptar. } } public void eliminarCasa(){ int cod=LibGUI.192. JOptionPane. compartido. lblTitulo.cargarDepartamentos().setBounds(10. limpiarControles(). renta.addActionListener(this). cboOpcion.150."Casa eliminada"). btnEliminar.buscar(cod)).getInteger(txtCodigo). break.getSource()==btnAceptar) aceptar(). break. txtPiso. } protected void desabilitarControles(){ super. if(e. case 1: consultar().setEditable(true). if(indice==1 || indice==3) desabilitarControles(). break. default: eliminar().getSource()==btnEliminar) eliminarDpto().getSource()==btnCancelar) cancelar(). } } CARRERAS PROFESIONALES CIBERTEC . } public void aceptar(){ int indice=cboOpcion. } if(e.getSource()==btnModificar) modificarDpto().desabilitarControles().getSelectedIndex(). } public void itemStateChanged(ItemEvent e){ if(e. txtPiso. } } protected void habilitarControles(){ super. else habilitarControles().habilitarControles().getSelectedIndex().180 } public void actionPerformed(ActionEvent e){ if(e.limpiarControles().setText(""). txtPiso. switch(indice){ case 0: ingresar(). } protected void limpiarControles(){ super. if(e.getSource()==cboOpcion){ int indice=cboOpcion.getItemSelectable()==chkDispo){ flagDispo=!flagDispo. case 2: modificar(). if(e.setEditable(false). showMessageDialog(this. existe=false.setText(""+Odepa.pnlPrincipal.piso).getDisp().getInteger(txtPiso). if(Odepa==null){ double ancho=LibGUI.setSelected(true). boolean flag1=Odepa.getDouble(txtPrecio). pri.setSelected(false). double largo=LibGUI. Odepa=new Departamento(cod.setText(""+Odepa.setVisible(false).showMessageDialog(this.setText(""+Odepa. limpiarControles().aDpt. JOptionPane.flagDispo.getPiso()).getDouble(txtLargo). } else{ JOptionPane. txtPrecio.ancho. Departamento Odepa=pri. cambio(). existe=false.getInteger(txtHab). } else JOptionPane. limpiarControles().ALGORITMOS Y ESTRUCTURA DE DATOS 181 public void cancelar(){ pri. txtPiso.agregar(Odepa). pri.getLargo()). } public void consultar(){ int cod=LibGUI.aDpt.getInteger(txtCodigo)."Código ya existe"). else chkDispo.getInteger(txtCodigo). double precio=LibGUI. txtHab.pnlDpto."Departamento Agregado"). txtLargo."Código no existe").hab.buscar(cod).grabarDepartamento().getDouble(txtAncho). if(Odepa!=null){ txtAncho.getAncho()). existe=true. if(flag1) chkDispo.getPrecio()). int hab=LibGUI.setText(""+Odepa. limpiarControles().setText(""+Odepa.showMessageDialog(this.aDpt.setVisible(true). habilitarControles().aDpt. } public void ingresar(){ int cod=LibGUI.largo. Departamento Odepa=pri. } } CIBERTEC CARRERAS PROFESIONALES . pri. int piso=LibGUI.getHab()).buscar(cod). precio. LibGUI.buscar(cod).swing. CARRERAS PROFESIONALES CIBERTEC .setPrecio(LibGUI.grabarDepartamento(). Odepa.getDouble(txtPrecio)).aDpt.setDisp(flagDispo).aDpt.setAncho(LibGUI.getDouble(txtLargo)).event. JOptionPane.setVisible(false). btnModificar. } } Clase PBusqueda import import import import import java.setVisible(true). Odepa.getDouble(txtAncho)). } } public void modificarDpto(){ int cod=LibGUI.Propiedad."Departamento eliminado"). javax.setPiso(LibGUI.182 public void modificar(){ consultar().aDpt.grabarDepartamento().eliminar(pri. pri. Departamento Odepa=pri.aDpt.*. } } public void eliminarDpto(){ int cod=LibGUI.showMessageDialog(this. limpiarControles().getInteger(txtHab)). cambio(). JOptionPane. cambio().getInteger(txtCodigo).setHab(LibGUI. if(existe){ btnAceptar.aDpt.*.setEditable(false). cboOpcion. Odepa.showMessageDialog(this. txtCodigo. pri.buscar(cod)). Odepa.getInteger(txtPiso)). java. compartido.awt. btnEliminar.setVisible(true).setEnabled(false).getInteger(txtCodigo).awt.setEnabled(false). if(existe){ btnAceptar. renta. } public void eliminar(){ consultar(). pri.*. txtCodigo. Odepa."Cambio efectuado").setEditable(false). cboOpcion.setLargo(LibGUI.setVisible(false). limpiarControles(). Odepa. addItem("Precio"). cboBusqueda = new JComboBox().600.addItem("Departamento"). cboBusqueda. add(lblBusqueda). lblTitulo.CENTER). lblArea = new JLabel("Area").lblBusqueda. cboBusqueda. lblTipo = new JLabel("Propiedad"). add(lblTitulo). cboBusqueda. setBackground(Color.BOLD. lblA1.addItem("Casa").ALGORITMOS Y ESTRUCTURA DE DATOS 183 import arreglos. lblTitulo=new JLabel("Busquedas".setBounds(330. add(lblArea). public class PBusqueda extends JPanel implements ActionListener.lblTipo.20).110.setFont(new Font("Arial". private JLabel lblTitulo.addItemListener(this). add(lblTipo). cboTipo=new JComboBox().120. private JButton btnProcesar.20). add(cboTipo). lblBusqueda = new JLabel("Buscar por"). cboBusqueda.txtPrecioMin.*. cboTipo.addItem("Area y Precio").20).20).lightGray).lblPrecio.60.60.addItem("Area"). cboBusqueda. private JTextField txtAreaMax. cboTipo. private JScrollPane scpScroll. cboBusqueda. lblTipo. cboTipo. setLayout(null). lblArea.60. lblBusqueda.setBounds(90.setBounds(0. txtPrecioMax. ItemListener { private Principal pri.Font. CIBERTEC CARRERAS PROFESIONALES .addItem("Mas barato").90.20).addItem("Mas caro").setBounds(250.20)).lblA2. add(cboBusqueda).JLabel.60.80.20).60.20.lblArea. public PBusqueda(Principal x) { pri=x.txtAreaMin.setBounds(10. lblTitulo.btnCancelar. private JComboBox cboTipo. cboBusqueda. private JTextArea txtS.60.setBounds(90. cboBusqueda. add(scpScroll).setBounds(230. btnProcesar = new JButton("Procesar"). btnCancelar = new JButton("Cancelar").20).setBounds(460. lblA1 = new JLabel("a". add(lblPrecio). JLabel. txtPrecioMax.60. add(lblA2). lblA2 = new JLabel("a".setBounds(10.110.20).20).20). lblPrecio.setBounds(150.20).addActionListener(this).110.setBounds(210.addActionListener(this). txtS.184 txtAreaMin = new JTextField().20). btnProcesar.20). deshabilita_precio().20).CENTER).setBounds(90. txtS = new JTextArea(). add(lblA1). txtPrecioMin = new JTextField().setEnabled(false). } public void actionPerformed(ActionEvent e){ if(e. txtAreaMax. btnCancelar.setBounds(150. btnCancelar.100.90. lblA1.60.110.60.20). lblA2. 150.CENTER). } CARRERAS PROFESIONALES CIBERTEC .100.setBounds(460.60. txtAreaMin.getSource()==btnCancelar) cancelar(). btnProcesar. btnProcesar. add(btnProcesar). add(txtPrecioMax).setBounds(230. 300).60.setEditable(false). add(txtAreaMax). scpScroll. add(btnCancelar). 580.90. JLabel.110.60.90.20. txtPrecioMin. deshabilita_area().20. add(txtPrecioMin). txtPrecioMax = new JTextField().setBounds(210. scpScroll=new JScrollPane(txtS). add(txtAreaMin).getSource()==btnProcesar) procesar().90. lblPrecio = new JLabel("Precio"). txtAreaMax = new JTextField(). if(e. txtPrecioMin. lblA1. } public void habilita_precio(){ lblPrecio. deshabilita_precio(). txtAreaMin. CIBERTEC CARRERAS PROFESIONALES .ALGORITMOS Y ESTRUCTURA DE DATOS 185 public void itemStateChanged(ItemEvent e){ if(e. break.setVisible(false). } public void deshabilita_area(){ lblArea.setVisible(false).setVisible(true). txtPrecioMin. txtAreaMax.setVisible(true). txtAreaMin. habilita_precio(). } } public void habilita_area(){ lblArea.setVisible(false). txtAreaMax.setVisible(false). txtPrecioMax. txtPrecioMax. lblA2.setEnabled(true). case 2: habilita_area().getSelectedIndex().setVisible(true). break. case 1: deshabilita_area().setVisible(false).getSource()==cboBusqueda){ int indice=cboBusqueda. break.setVisible(false). lblA2.pnlPrincipal. break.setVisible(true). deshabilita_area(). lblA1.setVisible(true). deshabilita_precio().setVisible(false).setVisible(true).setVisible(false). habilita_precio(). } public void cancelar(){ pri.setVisible(false). pri.pnlBusqueda. deshabilita_precio(). } public void deshabilita_precio(){ lblPrecio.setVisible(true).setVisible(true). } btnProcesar. default:deshabilita_area().setVisible(true). switch(indice){ case 0: habilita_area(). getDouble(txtAreaMax). break.setEnabled(false). break. break.getSelectedIndex().setText(""). case 1: buscar_precio().getDouble(txtAreaMin). i < pri. if(prop.obtener(i). default:buscar_mas_caro().aCas. double areamax = LibGUI. } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso"). i++ ){ Propiedad prop=pri. for( int i = 0. imprimir().setText("").obtener(i).setText(""). switch(indice){ case 0: buscar_area(). } public void limpiar(){ txtAreaMax. txtAreaMin. i++ ){ Propiedad prop=pri. CARRERAS PROFESIONALES CIBERTEC . double areamin = LibGUI. int conta = 0.aDpt.186 btnProcesar.aCas. limpiar(). txtPrecioMin.aDpt.area() <= areamax){ imprimir(prop.comoCadena()). } } imprimir(conta + " casa(s) encontrada(s)"). txtPrecioMax.area() >= areamin && prop.setText("").getSelectedIndex(). } public void procesar(){ int indice=cboBusqueda. i < pri.getDisp() && prop.tamaño(). case 2: buscar_area_precio(). } } public void buscar_area(){ int indice=cboTipo. case 3: buscar_mas_barato(). conta++. if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin"). for( int i = 0.tamaño(). break. imprimir().ALGORITMOS Y ESTRUCTURA DE DATOS 187 if(prop. } } public void buscar_precio(){ int indice=cboTipo. if(prop. double preciomax = LibGUI.area() <= areamax){ imprimir(prop.getDouble(txtPrecioMin). if(prop. i < pri.comoCadena()).getPrecio() >= preciomin && prop. conta++. i++ ){ Propiedad prop=pri.aCas.aCas. for( int i = 0.tamaño().tamaño(). double preciomin = LibGUI.obtener(i).getDisp() && prop.aDpt.area() >= areamin && prop.getPrecio() <= preciomax){ imprimir(prop. } } imprimir(conta + " departamento(s) encontrado(s)").getDisp() && prop. if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin"). int conta = 0. for( int i = 0. } } imprimir(conta + " casa(s) encontrada(s)"). i < pri. conta++.getPrecio()<= preciomax){ imprimir(prop.comoCadena()).aDpt.getDouble(txtPrecioMax).getDisp() && prop. } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso").comoCadena()). conta++.getPrecio() >= preciomin && prop. } } imprimir(conta + " departamento(s) encontrado(s)").getSelectedIndex(). i++ ){ Propiedad prop=pri.obtener(i). } } CIBERTEC CARRERAS PROFESIONALES . comoCadena()). for( int i = 0.obtener(i).getDouble(txtAreaMax). double areamin = LibGUI. imprimir(). } } imprimir(conta + " departamento(s) encontrado(s)").area() <= areamax && prop. imprimir(). double preciomax = LibGUI.188 public void buscar_area_precio(){ int indice=cboTipo. i < pri. i++ ){ Propiedad prop=pri.getPrecio() >= preciomin && prop. double areamax = LibGUI.obtener(i).area() >= areamin && prop. } } imprimir(conta + " casa(s) encontrada(s)").getSelectedIndex(). } } public void buscar_mas_caro(){ int indice=cboTipo.tamaño(). int conta = 0.getDisp() && prop.getPrecio() <= preciomax){ imprimir(prop. conta++.getDouble(txtPrecioMax). if( prop.area() <= areamax && prop. if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin").aCas. for( int i = 0.area() >= areamin && prop.tamaño().aCas.aDpt.getDisp() && prop. int conta = 0.getPrecio() <= preciomax){ imprimir(prop. if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin"). if( prop.getDouble(txtPrecioMin). i < pri. double preciomin = LibGUI.aDpt. conta++.getDouble(txtAreaMin).getPrecio() >= preciomin && prop. i++ ){ Propiedad prop=pri. CARRERAS PROFESIONALES CIBERTEC .comoCadena()).getSelectedIndex(). } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso"). ALGORITMOS Y ESTRUCTURA DE DATOS 189 for( int i = 0. conta++.aCas. i < pri. for( int i = 0. } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso"). i < pri.precioMenor() ){ imprimir(prop.getPrecio() == pri.tamaño().precioMenor() ){ imprimir(prop.obtener(i). if( prop. } } public void buscar_mas_barato(){ int indice=cboTipo.getSelectedIndex(). if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin"). imprimir().aCas. for( int i = 0.precioMayor() ){ imprimir(prop. i++ ){ Propiedad prop=pri.aDpt.tamaño().aDpt.tamaño().comoCadena()). if( prop.aCas. } } CIBERTEC CARRERAS PROFESIONALES . i++ ){ Propiedad prop=pri. } } imprimir(conta + " casa(s) encontrada(s)").tamaño(). } } imprimir(conta + " casa(s) encontrada(s)"). if( prop.comoCadena()).getDisp() && prop. i++ ){ Propiedad prop=pri.aDpt.getPrecio() == pri.precioMayor() ){ imprimir(prop.obtener(i). conta++.comoCadena()).comoCadena()).aDpt. conta++. conta++.getDisp() && prop.aDpt.getPrecio() == pri.aDpt. i < pri.aCas. i < pri. i++ ){ Propiedad prop=pri.getDisp() && prop. } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso").aCas.aCas.obtener(i).getPrecio() == pri.getDisp() && prop. int conta = 0. } } imprimir(conta + " departamento(s) encontrado(s)"). if( prop. for( int i = 0.obtener(i). } public void imprimir(String cad){ txtS.setText(""). } } public void imprimir(){ txtS.190 imprimir(conta + " departamento(s) encontrado(s)"). } } CARRERAS PROFESIONALES CIBERTEC .append(cad + "\n").