Algoritmos y Estructura de Datos - TI

2

CARRERAS PROFESIONALES

CIBERTEC

ALGORITMOS Y ESTRUCTURA DE DATOS

3

ÍNDICE
Presentación Red de contenidos Sesiones de aprendizaje 5 6

UNIDAD DE APRENDIZAJE 1
SEMANA 1 SEMANA 2 SEMANA 3 : Encapsulamiento: conceptos básicos. : Encapsulamiento: control de acceso. : Modificador static y referencia this 7 13 19

UNIDAD DE APRENDIZAJE 2
SEMANA 4 SEMANA 5 SEMANA 6 : Manejo de arreglos: Arreglos unidimensionales : Manejo de arreglos: Arreglos biidimensionales : Manejo de arreglos: Arreglo de objetos SEMANA DE EXÁMENES PARCIALES 37 49 63

SEMANA 7

:

UNIDAD DE APRENDIZAJE 3
SEMANA 8 SEMANA 9 SEMANA 10 : Clase ArrayList: métodos y operaciones variadas : Clase ArrayList : métodos y operaciones variadas : Clase ArrayList y Archivos de texto 75 75 89

UNIDAD DE APRENDIZAJE 4
SEMANA 11 : Herencia y polimorfismo: Modificador protected, relación esun. SEMANA 12 : Herencia y polimorfismo: Sobre-escritura, clases y métodos abstractos. SEMANA 13 SEMANA 14 : Herencia y polimorfismo: relación tiene-un. : Herencia y polimorfismo: polimorfismo y enlace dinámico 113 125 113 103

UNIDAD DE APRENDIZAJE 5
SEMANA 15 SEMANA 16 SEMANA 17 ANEXO : Interfaces : Interfaces : SEMANA DE EXÁMENES FINALES 149 137 137

: Caso práctico

CIBERTEC

CARRERAS PROFESIONALES

4 CARRERAS PROFESIONALES CIBERTEC .

5

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, Redes y Comunicaciones, Administración y Sistemas, y Electrónica. 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.

El manual para el curso ha sido diseñado bajo la modalidad de unidades de aprendizaje, las que se desarrollan durante semanas determinadas. En cada una de ellas, hallará los logros que debe alcanzar al final de la unidad; el tema tratado, el cual será ampliamente desarrollado; y los contenidos, que debe desarrollar, es decir, los subtemas. Por último, encontrará las actividades que deberá desarrollar en cada sesión, que le permitirán reforzar lo aprendido en la clase.

El curso es teórico práctico. Está basado en el paradigma de la programación orientada a objetos. En primer lugar, se inicia con la creación de clases y objetos. Continúa con el manejo de arreglos. Se utiliza la clase ArrayList así como el manejo de archivos de texto. Luego, se desarrollan aplicaciones donde se plasma el concepto de herencia y polimorfismo empleando clases abstractas. Se concluye con la implementación de Interfaces.

CIBERTEC

CARRERAS PROFESIONALES

6

RED DE CONTENIDOS

Algoritmos y Estructura de Datos
Encapsulamiento Creación de clases y paquetes Creación de objetos Modificadores de acceso y static, referencia this Manejo de arreglos Arreglos unidimensionales 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, Relación tiene-un Técnicas de casting, Polimorfismo Interfaces Creación de interfaces y Herencia múltiple

CARRERAS PROFESIONALES

CIBERTEC

ALGORITMOS Y ESTRUCTURA DE DATOS

7

UNIDAD DE APRENDIZAJE

1
SEMANA

1-2
ENCAPSULAMIENTO
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, los alumnos crean clases agrupadas en paquetes, crean objetos, emplean los modificadores de acceso: public y prívate, así como el modificador static y la referencia this en Java. Finalmente, aplican el concepto de encapsulamiento.

TEMARIO
• • • Creación de clases y paquetes Creación de objetos Modificadores

ACTIVIDADES PROPUESTAS
• • • • Los alumnos crean clases agrupadas en paquetes. Los alumnos crean objetos de diversas clases. Los alumnos emplean y diferencian los modificadores de acceso: public y private. Los alumnos realizan diversas operaciones con los objetos creados.

CIBERTEC

CARRERAS PROFESIONALES

1 PAQUETE Un paquete es un conjunto de clases agrupadas que guardan una relación entre sí.*. La sintaxis es: import nombre_paquete. Los atributos se especifican mediante variables (variables miembro) y el comportamiento mediante métodos (métodos miembro). Ejemplo: import semana1. CONCEPTOS BASICOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS 1.8 1.. este nuevo tipo se puede utilizar para crear objetos..nombre_clase. CARRERAS PROFESIONALES CIBERTEC . Ejemplo: import semana1. public class Alumno{ . En nuestro ejemplo se creará la carpeta semana1. Esta instrucción debe colocarse al inicio del archivo y debe ser la primera sentencia que debe ejecutarse. Su aplicación se aprecia cuando se hace referencia a una clase desde otra que se encuentra fuera del paquete. 1.Alumno. Los paquetes se declaran utilizando la palabra package seguida del nombre del paquete. De esta forma. Uso de la sentencia import La sentencia import se utiliza para incluir una lista de paquetes en donde se buscará una determinada clase.2 CLASE Una clase es una plantilla que especifica los atributos y el comportamiento de un determinado tipo de objeto. Ejemplo: package semana1. 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. } Al crearse un paquete se crea una carpeta con el mismo nombre del paquete. En la Programación Orientada a Objetos (POO) una clase define un nuevo tipo de dato. En la sentencia import se puede emplear el caracter Asterisco “ * “ con lo cual se estaría indicando que se importe todas las clases del paquete. Una vez definido. Si coloca la misma instrucción package al inicio de otras clases logrará agrupar varias clases en el mismo paquete.

.2. .2. public class NombreClase { // Declaración de variables miembro public tipo1 variable1. CIBERTEC CARRERAS PROFESIONALES . public tipo2 variable2.ALGORITMOS Y ESTRUCTURA DE DATOS 9 1. . . Java crea un constructor por defecto que no tiene parámetros y que no realiza ninguna inicialización especial. El constructor de una clase se caracteriza por tener el mismo nombre de su clase y no tener tipo de retorno. } 1.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. Si una clase no define un constructor. // Definición del constructor public NombreClase (parámetros) { } // Definición de métodos miembro public tipo1 metodo1(parámetros) { } public tipo2 metodo2(parámetros) { } .2 Constructor Un constructor es un método especial que se utiliza para inicializar un objeto inmediatamente después de su creación. .

1.1 Creación de objetos Se siguen los siguientes pasos: . la clase cargada. se denominan: variables de instancia. 2.3. . nombreReferencia = new nombreClase( lista de argumentos ). CARRERAS PROFESIONALES CIBERTEC .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. un punto y el nombre del miembro (variable miembro o método miembro) al que se desea acceder.Los dos pasos anteriores pueden efectuarse en un solo paso de la siguiente manera: nombreClase nombreReferencia = new nombreClase( lista de argumentos ). El operador new crea el objeto dinámicamente (en tiempo de ejecución) y devuelve la dirección de memoria del objeto creado. . . será utilizada como una fábrica de objetos. . ACCESO A LOS MIEMBROS DE UNA CLASE Para acceder a un miembro de una clase se escribe el nombre de la variable referencia.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.Se crea el objeto y se asigna su dirección de memoria a la variable referencia.Cada vez que se crea un objeto se crea una copia de cada una de las variables miembro declaradas por su clase.En cambio. Además. Estas variables. los métodos. propias de cada objeto. debe crear un método promedio que retorne la nota promedio. El nombre de la clase seguido por los paréntesis invoca al constructor de la clase. En adelante. . Para esto se usa el operador new.10 1.Un objeto es una instancia (o ejemplar) de una clase. Ejemplo 1: • Declare la clase Alumno dentro del paquete semana1 que permita registrar un nombre y dos notas. nombreClase nombreReferencia.3 OBJETO .

el código de la clase principal quedaría de este forma: CIBERTEC CARRERAS PROFESIONALES .nota2). a. x.Alumno a = new semana1.nota1). y luego de ingresar sus datos visualice la data ingresada.ALGORITMOS Y ESTRUCTURA DE DATOS 11 package semana1. nota2.nota1 = 13. a. public int nota1. public class Alumno { // Variables miembro public String nombre. 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. Ahora sí. además del promedio obtenido. Se habrá dado cuenta que realizar esta acción se vuelve tedioso.Alumno imprimir("nombre : " + imprimir("nota 1 : " + imprimir("nota 2 : " + imprimir("promedio : " } nombre nota 1 nota 2 promedio : : : : Juan 13 15 14. 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.0.promedio()).nombre).nombre = "Juan". x. Por lo tanto.0 x) { x. } void listado(semana1. En este ejemplo. + x.Alumno. listado(a). void procesar() { semana1. // Operaciones public double promedio() { return (nota1 + nota2) / 2.nota2 = 15.Alumno().Alumno. se debe incluir en las sentencias de importación la siguiente linea: import semana1. } } • En la clase principal (clase donde se ha creado la GUI) cree un objeto de la clase Alumno. a.

public class Alumno { // Variables miembro public String nombre. nota2. listado(a). } void listado(Alumno x) { imprimir("nombre : " imprimir("nota 1 : " imprimir("nota 2 : " imprimir("promedio : } nombre nota 1 nota 2 promedio : : : : Juan 13 15 14.12 void procesar() { Alumno a = new Alumno(). x. a.0.nombre). + x. int n2) { nombre = nom.15).13. En los siguientes ejemplos. Ejemplo 2: • Añada un constructor a la clase Alumno para inicializar sus variables miembro al momento de crear el objeto. a la vez.nota2 = 15.nota1 = 13. void procesar() { Alumno a = new Alumno("Juan".nombre = "Juan". int n1. } // Operaciones public double promedio() { return (nota1 + nota2) / 2. } } • A la pulsación de un botón cree el objeto y. x. } CARRERAS PROFESIONALES CIBERTEC .nota1). nota1 = n1.0 + + + " x.promedio()). listado(a). a. inicialice sus variables miembro.nota2). nota2 = n2. package semana1. // Constructor public Alumno(String nom. public int nota1. se asume que se ha importado el paquete correspondiente. a.

nota1). La cuarta columna indica si todas las clases tienen acceso a los miembros. Por otra parte. Para controlar el acceso a los miembros de una clase. La tercera columna indica si las clases del mismo paquete que la clase (sin importar su parentesco) tienen acceso a los miembros. Se ve la aplicación del especificador de acceso protected cuando se trabaja con herencia.nombre). pues los métodos de acceso pueden actuar como filtros que prueben los datos que se pretenden ingresar a las variables miembro.ALGORITMOS Y ESTRUCTURA DE DATOS 13 void listado(Alumno x){ imprimir("Objeto:"+x). imprimir("nota 1:"+x.Alumno@92e78c Juan 13 15 : 14. 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. se muestra el uso de los especificadores de acceso. En la tabla que sigue. Esto permite controlar el uso correcto de las variables miembro. por lo que lo veremos más adelante. Este ocultamiento nos permite restringir y controlar el uso de la CIBERTEC CARRERAS PROFESIONALES . imprimir("nota 2:"+x. se usan especificadores o modificadores de acceso que se anteponen a las declaraciones de los miembros a controlar.nota2). 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. Los especificadores de acceso son public. Encapsulamiento 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.0 3. private y protected. CONTROL DE ACCESO Y ENCAPSULAMIENTO Una clase puede controlar qué partes de un programa pueden acceder a los miembros de su clase: variables miembro y métodos miembro. } Objeto : nombre : nota 1 : nota 2 : promedio semana1. imprimir("promedio:"+x. imprimir("nombre:"+x. 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. La segunda columna indica si las subclases de la clase (sin importar dentro de qué paquete se encuentren estas) tienen acceso a los miembros.promedio()).

por ejemplo. } public int getNota1() { return nota1. nota2. nota2 = n2. } // Métodos de acceso: get public String getNombre() { return nombre. } 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. private int nota1. } public void setNota1(int n) { nota1 = n.14 clase. } // Métodos de acceso: set public void setNombre(String nom) { nombre = nom. public class Alumno { // Variables miembro private String nombre. los métodos de acceso.0. porque habrán ciertos mecanismos para modificar el estado de nuestra clase como. // Constructor public Alumno(String nom. int n2) { nombre = nom. } public void setNota2(int n) { nota2 = n. } } CARRERAS PROFESIONALES CIBERTEC . package semana2. } // Operaciones public double promedio() { return (nota1 + nota2) / 2. Restringir. porque habrán ciertos atributos y métodos privados o protegidos y controlar. int n1. nota1 = n1.

ALGORITMOS Y ESTRUCTURA DE DATOS 15 • A la pulsación de un botón.15).0 Juan 19 18 : 18.getNombre()). void procesar() { Alumno a = new Alumno("Juan". Ejemplo 4: Cilindro ra = new Cilindro(2. a. cree el objeto y. a. se asigna la dirección de memoria contenida en ra. 4. listado(a).getNota1()). ra radio : 2 altura : 5 Objeto Cilindro rb null rb = ra. x. inicialice sus variables miembro.setNota1(19). + x.5 + + + " x. Luego de ello.promedio()). ra radio : 2 altura : 5 Objeto Cilindro rb CIBERTEC CARRERAS PROFESIONALES . Cilindro rb. tanto ra como rb referencian (controlan) al mismo objeto.setNota2(18).getNota2()). modifique sus notas. } 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. Luego. ASIGNACIÓN ENTRE VARIABLES REFERENCIA Cuando se asigna la variable referencia ra a la variable referencia rb. a la vez.13.5). x. listado(a).

ra radio : 8 altura : 5 Objeto Cilindro rb imprimir(“Radio : “ + ra.15).setRadio(8).16 Note que a partir de este momento tanto ra como rb se refieren al mismo objeto. a través de la referencia b. Alumno b = a. listado(a).13. Ejemplo 5: • A la pulsación de un botón. listado(a).5 CARRERAS PROFESIONALES CIBERTEC .getRadio()). Extrae el valor del radio del objeto a través de la referencia ra e imprime 8. rb. b. Luego. b. modifique las notas.setNota1(19). void procesar() { Alumno a = new Alumno("Juan".setNota2(18).0 Juan 19 18 : 18. Cambia por 8 el valor del radio del objeto a través de la referencia rb. cree el objeto a de la clase Alumno inicializando sus variables miembro. } nombre : nota 1 : nota 2 : promedio nombre : nota 1 : nota 2 : promedio Juan 13 15 : 14.

horas (int). Los datos serán capturados de la GUI. precio unitario en soles (double) e implemente los siguientes métodos: a) b) c) d) Un constructor que inicialice a los atributos Métodos de acceso: set/get para cada atributo Un método que retorne el importe a pagar soles (cantidad * precio unit) Un método que retorne el importe a pagar dólares. nombre (String). c) Disminuya el precio unitario del producto en 7% e imprima su nuevo precio unitario. implemente lo siguiente: a) Cree un objeto de tipo producto cada vez que se pulse el botón procesar. b) Cree un método listar que imprima todos los atributos del producto y el importe a pagar en dólares. implemente lo siguiente: a) Cree un objeto de tipo empleado con datos fijos. descripción (String).descuento) En la clase principal (donde esta la GUI). El método recibirá como parámetro el tipo de cambio. Asuma la existencia de los métodos para la captura de datos. tarifa (double) e 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 (11% del sueldo bruto) Un método que retorne el sueldo neto (sueldo bruto . 2) Cree la clase producto dentro del paquete semana2 y declare los siguientes atributos como privados: codigo (int). c) Incremente la tarifa del empleado en 10% e imprima su nueva tarifa. b) Cree un método listar que imprima todos los atributos del empleado y el sueldo neto.ALGORITMOS Y ESTRUCTURA DE DATOS 17 Ejercicios 1) Cree la clase empleado dentro del paquete semana2 y declare los siguientes atributos como privados: codigo (int). CIBERTEC CARRERAS PROFESIONALES . En la clase principal (donde está la GUI). cantidad (int).

18 CARRERAS PROFESIONALES CIBERTEC .

TEMARIO • • • • Modificador static Referencia this Sobrecarga de constructores Inicializadores estáticos ACTIVIDADES PROPUESTAS • • • • Los alumnos emplean el modificador static y la referencia this.ALGORITMOS Y ESTRUCTURA DE DATOS 19 UNIDAD DE APRENDIZAJE 1 SEMANA 3 MODIFICADOR STATIC Y REFERENCIA THIS LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. emplean los modificadores de acceso: public y private así como el modificador static y la referencia this en Java. Los alumnos entienden el concepto de sobrecarga. los alumnos crean clases clasificadas en paquetes. Finalmente. CIBERTEC CARRERAS PROFESIONALES . crean objetos. aplican el concepto de encapsulamiento. Los alumnos reconocen una librería empleando métodos estáticos Los alumnos emplean inicializadores estáticos.

nota2. MODIFICADOR: STATIC Una variable de instancia es una variable de la que se crea una copia independiente para cada objeto de la clase. Las variables de clase se crean en el momento en que la clase se carga a la memoria. public class Alumno { // Variables miembro private String nombre. } CARRERAS PROFESIONALES CIBERTEC . public static int cantidad = 0. int n1. lo que ocurre antes de crear cualquier objeto de la clase. Ejemplo 1 Haga que la clase Alumno cuente la cantidad de objetos creados. nota1 = n1. Esto significa que las variables de clase pueden existir aún cuando no exista objeto de la clase. cantidad++. // Constructor public Alumno(String nom.20 1. En cambio. private int nota1. una variable de clase es una variable de la que se crea una sola copia para todos los objetos de la clase. int n2) { nombre = nom. } public int getNota1() { return nota1. Para que una variable sea variable de clase hay que preceder su declaración con el modificador static. package semana3. } public void setNota2(int n) { nota2 = n. } // Métodos de acceso: get/set public String getNombre() { return nombre. } public void setNota1(int n) { nota1 = n. } public int getNota2() { return nota2. nota2 = n2. 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.

además. imprimir("# objetos creados : " + Alumno. } } • A la pulsación de un botón.15).16. Ejemplo 2 Haga que los parámetros del constructor y de los métodos set tengan el mismo nombre que las variables miembro.20). cree tres objetos y visualice sus contenidos. su objetivo es diferenciar la variable miembro del parámetro en sí. listado(a2).0 Pedro 16 17 : 16. Una de sus aplicaciones más comunes es cuando el nombre de un parámetro coincide con el nombre de una variable miembro. a2 = new Alumno("Pedro". agregue un método que calcule el mayor promedio entre 2 objetos de tipo Alumno. } nombre : nota 1 : nota 2 : promedio nombre : nota 1 : nota 2 : promedio nombre : nota 1 : nota 2 : promedio Juan 13 15 : 14.ALGORITMOS Y ESTRUCTURA DE DATOS 21 // Operaciones public double promedio() { return (nota1 + nota2) / 2. CIBERTEC CARRERAS PROFESIONALES . listado(a1). Muestre. En este caso.17).5 María 14 20 : 17.13.0. void procesar() { Alumno a1 = new Alumno("Juan".0 3 # objetos creados : 2. la referencia this contiene la dirección de memoria del objeto que invocó al método. la cantidad de objetos.cantidad). listado(a3). REFERENCIA: THIS Dentro de un método de la clase. La referencia this es un parámetro oculto añadido por el compilador.14. Adicionalmente. a3 = new Alumno("María".

} public int getNota1() { return nota1. } // Métodos de acceso: get/set public String getNombre() { return nombre. // Constructor public Alumno(String nombre.nota2 = nota2. int nota1.promedio()>obj. } // Operaciones public double promedio() { return (nota1 + nota2) / 2. } public int getNota2() { return nota2.nombre = nombre.22 package semana3. nota2.promedio()) return this. this. } } CARRERAS PROFESIONALES CIBERTEC .nombre = nombre. int nota2) { this. private int nota1. cantidad++. } public void setNota1(int nota1) { this. public static int cantidad = 0.nota2 = nota2.0. this. } public void setNombre(String nombre) { this. public class Alumno { // Variables miembro private String nombre. } public Alumno mayorPromedio(Alumno obj){ /* this contiene la referencia del objeto que invocó al método */ if(this. } public void setNota2(int nota2) { this.nota1 = nota1.nota1 = nota1. else return obj.

Alumno objMaxProm=a1. se utiliza el número y tipo de parámetros que tiene el método y no su tipo de retorno. imprimir("Promedio:"+x. imprimir("Nota1:"+x. imprimir("El alumno con mayor promedio es:"+ objMaxProm.mayorPromedio(a2). Ejemplo 3 Haga que las variables miembro de la clase Alumno se inicialicen por defecto y.getNota1()).15.cantidad). imprimir("Nota2:"+x. cantidad++.13). Los constructores también pueden ser sobrecargados. package semana3. cree dos objetos y visualice sus contenidos.nombre = nombre. imprimir("Nombre:"+x. this. void procesar(){ Alumno a1 = new Alumno("Juan". la cantidad de objetos y el nombre del alumno con mayor promedio. imprimir("# objetos creados : " + Alumno. además. // Constructores public Alumno(String nombre.promedio()). listado(a1).14). cantidad++. SOBRECARGA DE MÉTODOS La sobrecarga de métodos consiste en crear varios métodos con el mismo nombre. a2 = new Alumno("Pedro". } public Alumno(String nombre) { this. } CIBERTEC CARRERAS PROFESIONALES . private int nota1 = 88. imprimir("").getNota2()).getNombre()). nota2 = 88.nota2 = nota2. public static int cantidad = 0. public class Alumno { // Variables miembro private String nombre = "ninguno". } 3.nota1 = nota1. int nota1.nombre = nombre. this. } void listado(Alumno x){ imprimir("Objeto:"+x). considere tres constructores. luego. listado(a2).getNombre()). Para diferenciar un método de otro.ALGORITMOS Y ESTRUCTURA DE DATOS 23 • A la pulsación de un botón. Muestre.12. int nota2) { this.

} nombre : nota 1 : nota 2 : promedio Juan 13 15 : 14.24 public Alumno() { /* En este caso el this se utiliza para llamar al segundo constructor */ this("Monica").0.nota2 = nota2. } // Métodos de acceso: get/set public String getNombre() { return nombre. } public int getNota2() { return nota2.cantidad). } public void setNota2(int nota2) { this. listado(a3).nombre = nombre.13. } public void setNombre(String nombre) { this. listado(a1). } } • A la pulsación de un botón. a3 = new Alumno(). } public int getNota1() { return nota1.15). listado(a2). } public void setNota1(int nota1) { this.0 nombre : Pedro CARRERAS PROFESIONALES CIBERTEC .nota1 = nota1. imprimir("# objetos creados : " + Alumno. cree tres objetos y visualice sus contenidos. } // Operaciones public double promedio() { return (nota1 + nota2) / 2. void procesar() { Alumno a1 = new Alumno("Juan". a2 = new Alumno("Pedro").

hay que anteponer a su tipo de retorno la palabra static. contador = 0.ALGORITMOS Y ESTRUCTURA DE DATOS 25 nota 1 : 88 nota 2 : 88 promedio : 88. una clase que contenga métodos a los cuales invocaremos desde cualquier otra clase de un proyecto sin necesidad de crear un objeto. Ejemplo 4 Declare la clase Clase que cuente la cantidad de objetos creados. 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. a la pulsación de un botón. } 5. imprimir("# objetos creados :" + Clase. Para declarar un método como método de clase. c2 = new Clase(). MÉTODOS DE CLASE Así como existen variables de clase. cree tres objetos. public class Clase { private static int public Clase() { contador++. APLICACIÓN DE METODOS DE CLASE Una aplicación interesante donde empleamos métodos de clase es cuando creamos una librería. } 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.0 nombre : nota 1 : nota 2 : promedio Monica 88 88 : 88. c3 = new Clase().0 3 # objetos creados : 4. existen métodos de clase. Luego. es decir. } } void procesar() { Clase c1 = new Clase().getContador()). package semana3. CIBERTEC CARRERAS PROFESIONALES .

no podrá crear un objeto de tipo LibNumeros. double exp){ return Math.44567.cant). package compartido. 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). } Los resultados son: potencia de 5 elevado a 2:25.3)). public class LibNumeros { private LibNumeros(){ } public static double pot(double num.26 Ejemplo 5 Diseñe una clase que contenga métodos que puedan ser invocados desde cualquier clase sin necesidad de crear un objeto. de esta forma.(1/raiz)).pow(num. int cant){ return Math.redondeoN(13.cant))/pot(10.0 redondeo del número 13. La llamada a los métodos sería de la siguiente manera: void procesar(){ imprimir("potencia de 5 elevado a 2:"+ LibNumeros. imprimir("raiz cúbica de 27:"+ LibNumeros. } } El constructor de la clase tiene un acceso privado para que no pueda ser invocado y.446 CARRERAS PROFESIONALES CIBERTEC . double raiz){ return Math.exp).0 raiz cúbica de 27:3.3)). imprimir("redondeo del número 13.raizN(27. } public static double redondeoN(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).44567 a 3 decimales:" + LibNumeros. Método raizN: el método retorna la raíz (parámetro raíz) de un número (parámetro num).2)).pow(num.pot(5.44567 a 3 decimales:13. } public static double raizN(double num.rint(num*pot(10.

int tam = cad. return cad. int pos){ // pos en el rango de 1 . else return "Verifique los parámetros".length(). cad=cad. } } Descripción de los métodos de la clase LibCadenas: Método mayus: El método retorna la cadena en mayúsculas. for(int i=tam. int posFin){ // pos en el rango de 1 .substring(posIni-1. } public static String rellena(String cad.trim().posFin). } public static String minus(String cad){ return cad.length().toUpperCase().ALGORITMOS Y ESTRUCTURA DE DATOS 27 Ejemplo 6 Otro ejemplo de librería.toLowerCase().length(). pero esta vez trabajando con cadenas: package compartido.. int tam=cad. int posIni. Método minus: El método retorna la cadena en minúsculas. CIBERTEC CARRERAS PROFESIONALES . longitud de la cadena. } public static String extrae(String cad. public class LibCadenas { private LibCadenas (){ } public static String mayus(String cad){ return cad.. } public static String extrae(String cad. int num){ int tam=cad. else return "Verifique los parámetros". i<num. if(posIni>=1 && posFin<=tam) return cad. longitud de la cadena. i++) cad+=' '. if(pos>=1 && pos<=tam) return ""+cad.charAt(pos-1).

imprimir(LibCadenas. los cuales se ejecutan en el orden en el que han sido definidos. En una clase.posIni. se pueden definir varios inicializadores estáticos. .extrae(cadena. posición inicial y posición final).28 - - 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).posFin). 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. La forma de crear un inicializador static es la siguiente: static{ . imprimir(LibCadenas. . el método retornará la cadena comprendida desde la posición inicial hasta la posición final indicada. Si utilizamos la sintaxis: LibCadenas. Método extrae: El método extrae es un método sobrecargado.extrae("hola como estas".extrae("Cibertec". imprimir(LibCadenas. métodos escritos por ejemplo en lenguaje C.9)). . es decir.5)). . También se utilizan para invocar a métodos nativos.minus("CIBERTEC")). el método retornará una cadena que contenga el caracter que se encuentre en la posición pos.10)+"|"). La llamada a los métodos sería de la siguiente manera: void procesar(){ imprimir(LibCadenas.pos). . imprimir("|"+LibCadenas.rellena("hola". Si utilizamos la sintaxis: LibCadenas. CARRERAS PROFESIONALES CIBERTEC .6. Esto quiere decir que se puede invocar al método mandándole 2 parámetros (cadena y posición) o mandándole 3 parámetros (cadena.extrae(cadena. sino una sola vez para toda la clase. } Este bloque de código se utiliza para darle valores iniciales a las variables estáticas.mayus("CibertEc")). } Los resultados son: CIBERTEC cibertec |hola | r como 6. Se diferencia del constructor en que no es invocado para cada objeto.

el sueldo bruto.ALGORITMOS Y ESTRUCTURA DE DATOS 29 Ejemplo 7 Cree la clase Empleado en el paquete semana3 y declare los siguiente atributos como privados: cod (int). private double horas. el porcentaje de descuento. Debe existir la posibilidad de que el usuario pueda modificar la tarifa y el porcentaje de descuento. public class Empleado { // Atributos privados private int cod. d) Imprima el sueldo neto acumulado de todos los empleados. 40 y 11%. c) Imprima la cantidad de empleados creados. Los datos serán capturados de la GUI. Solución del problema: Cabe resaltar que. b) Cree un método listar que imprima todos los atributos del empleado. e) Cree un método modificar que permita ingresar la nueva tarifa y el nuevo porcentaje de descuento para los empleados.swing. La clase debe tener las siguientes variables estáticas con acceso privado: tarifa.*. CIBERTEC CARRERAS PROFESIONALES .descuento) La tarifa y el porcentaje de descuento se debe inicializar con S/. deben ser variables estáticas porque se va aplicar la misma tarifa y porcentaje de descuento a todos los empleados). nom (String) y horas (double). contador de empleados y el sueldo neto acumulado de todos los empleados. el descuento en soles y el sueldo neto del empleado. respectivamente. 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 . como el porcentaje de descuento. en esta solución. Para ello. utilice inicializadores estáticos. la tarifa. implemente lo siguiente: a) Cree un objeto de tipo empleado cada vez que se pulse el botón Procesar. Este método debe ser llamado al pulsar el botón Modificar. Código de la clase Empleado: package semana3. En la clase principal (donde esta la GUI). private String nom. import javax. estamos aplicando casi todo lo que hemos visto en la primera unidad del curso. porcentaje de descuento (la tarifa.

} public void setHoras(double horas){ this.cod=cod. mostrar("llamada al inicializador 1"). private static double snetoAcum. this. snetoAcum=0. String nom. // Inicializadores static static{ tarifa=40. } static{ cont=0. private static int cont. mostrar("llamada al inicializador 2").cod=cod. } // Métodos de acceso: get public int getCodigo(){ return cod. } public void setNombre(String nom){ this.horas=horas. double horas) { this. private static double pordscto. snetoAcum+=sneto().nom=nom. this.30 // Variables de clase o estáticas private static double tarifa. pordscto=11. mostrar("llamada al constructor"). } CARRERAS PROFESIONALES CIBERTEC . cont++.horas=horas. } public String getNombre(){ return nom. } // Constructor public Empleado(int cod. } // Métodos de acceso: set public void setCodigo(int cod){ this.nom=nom.

cad).showMessageDialog(null. } } CIBERTEC CARRERAS PROFESIONALES . } public static double getPordscto(){ return pordscto. } public static double getSnetoAcum(){ return snetoAcum. } public static int getContador(){ return cont. } // Métodos de clase o estáticos tipo void public static void setTarifa(double t){ tarifa=t. } public double descuento(){ return sbruto()*(pordscto/100). } public static void mostrar(String cad){ JOptionPane.ALGORITMOS Y ESTRUCTURA DE DATOS 31 public double getHoras(){ return horas. } public double sneto(){ return sbruto()-descuento(). } public static void setPordscto(double p){ pordscto=p. } // Métodos de cálculo public double sbruto(){ return horas*tarifa. } // Métodos de clase o estáticos con valor de retorno public static double getTarifa(){ return tarifa.

getContentPane().awt.awt.100. lblNombre.add(lblHoras).add(txtHoras).event. btnModificar. getContentPane().*.setLayout(null).10. // lblNombre lblNombre=new JLabel("Nombre:"). getContentPane().100.setBackground(new Color (214.32 Código de la clase Principal: import import import import java. java. getContentPane(). // txtCodigo txtCodigo=new JTextField().20). // lblCodigo lblCodigo=new JLabel("Codigo:"). semana3.206)). lblHoras.setBounds(120. txtNombre. getContentPane().swing. CARRERAS PROFESIONALES CIBERTEC .20).setBounds(10. // lblHoras lblHoras=new JLabel("Horas:").100. // txtHoras txtHoras=new JTextField().100. public void init() { getContentPane(). txtHoras. txtNombre. public class Principal extends JApplet implements ActionListener{ // Declaración de variables globales JLabel lblCodigo.20). txtHoras.50.add(txtNombre). javax. getContentPane().100. JScrollPane scpScroll. txtCodigo.setBounds(120.add(txtCodigo).Empleado.50.20). // txtNombre txtNombre=new JTextField().20).30.211.add(lblCodigo). JButton btnProcesar. getContentPane().20). JTextField txtCodigo. btnBorrar. lblCodigo.setBounds(120.*.setBounds(10.add(lblNombre). JTextArea txtS. lblNombre.30.setBounds(10.100. lblHoras.*.10.

0. } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ if( e.getSource() == btnModificar ) modificar().setBounds(10. btnBorrar. btnProcesar.getSnetoAcum()). // scpScroll scpScroll=new JScrollPane(txtS). btnBorrar. txtS.getSource() == btnBorrar ) borrar(). getContentPane(). imprimir("").getContador()). scpScroll. if( e.addActionListener(this). 350. 100.setBounds(250.setBounds(250. getContentPane().getSource() == btnProcesar ) procesar().setBounds(250.setFont(new Font("monospaced". btnProcesar. imprimir("Sueldo neto acumulado:" + Empleado.add(scpScroll). getContentPane(). 100.add(btnProcesar).add(btnBorrar). 30.getHoras()).add(btnModificar). if( e. getContentPane(). // txtS txtS = new JTextArea().addActionListener(this). 100.addActionListener(this). imprimir("Cantidad de empleados creados:" + Empleado. 240). 20). 90. } void procesar(){ Empleado emp = new Empleado(getCodigo().getNombre(). 20). 12)). 50. // btnBorrar btnBorrar = new JButton("Borrar"). } CIBERTEC CARRERAS PROFESIONALES . btnModificar. btnModificar.ALGORITMOS Y ESTRUCTURA DE DATOS 33 // btnProcesar btnProcesar = new JButton("Procesar"). 10. // btnModificar btnModificar = new JButton("Modificar"). listar(emp). 20).

getTarifa()). //Modificando las variables estáticas Empleado. imprimir("Horas:"+x. imprimir("Código:"+x.valueOf(valor2).34 void listar(Empleado x){ imprimir("Objeto:"+x).setTarifa(tarifa).setText(""). } int getCodigo(){ return Integer. txtS. txtHoras. imprimir("Sueldo neto:"+x.getHoras()).parseInt(txtCodigo.sbruto()).getPordscto()). } CARRERAS PROFESIONALES CIBERTEC .getText()).setText(""). } catch(Exception x){ JOptionPane. String valor2 = JOptionPane."Ingrese el nuevo % descuento:"."Verifique los datos ingresados").setText("").descuento()).showInputDialog( this. txtNombre.getNombre()).getCodigo()). double tarifa = Double. double pordscto = Double."Ingrese la nueva tarifa:".append(s + "\n").showMessageDialog(this. } } void borrar(){ txtCodigo.setPordscto(pordscto). Empleado. Empleado.valueOf(valor1). imprimir("% de descuento:"+x.getTarifa()).setText(""). imprimir("Nombre:"+x. imprimir("Descuento S/.:"+x. Empleado.showInputDialog( this.requestFocus().sneto()). txtCodigo. imprimir(""). imprimir("Sueldo bruto:"+x.getPordscto()). imprimir("Tarifa:"+x. } void modificar(){ try{ String valor1 = JOptionPane. } void imprimir( String s ){ txtS.

una vez que la clase se carga en la memoria (esto ocurre al crearse el primer objeto o al utilizar un variable o método static). primero se ejecutan los inicializadores static y. luego. } double getHoras(){ return Double.getText().ALGORITMOS Y ESTRUCTURA DE DATOS 35 String getNombre(){ return txtNombre. } } Importante: Cabe resaltar que.parseDouble(txtHoras. CIBERTEC CARRERAS PROFESIONALES . el constructor de la clase.getText()).

c) d) e) CARRERAS PROFESIONALES CIBERTEC . Para ello. 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. utilice inicializadores estáticos. el porcentaje de comisión. Cree un método modificar que permita ingresar el nuevo porcentaje de comisión para los vendedores. porque es el mismo para todos los vendedores). Imprima la cantidad de vendedores creados. Debe existir la posibilidad de que el usuario pueda modificar el porcentaje de comisión.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% . la comisión en soles y el sueldo bruto del vendedor. Este método debe ser llamado al pulsar el botón Modificar. Los datos serán capturados de la GUI. 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 basico (sueldo fijo de S/ 550. nom (String) y monto vendido (double). contador de vendedores y el sueldo bruto acumulado de todos los vendedores. La clase debe tener las siguientes variables estáticas con acceso privado: porcentaje de comisión (debe ser variable estática. el sueldo basico. Cree un método listar que imprima todos los atributos del vendedor. Imprima el sueldo bruto acumulado de todos los vendedores.36 Ejercicios Cree la clase Vendedor en el paquete semana3 y declare los siguiente atributos como privados: cod (int).

así como arreglo de objetos en diversas aplicaciones. TEMARIO • • Arreglos unidimensionales Operaciones variadas ACTIVIDADES PROPUESTAS • • Los alumnos reconocen un arreglo unidimensional. CIBERTEC CARRERAS PROFESIONALES . los alumnos manipulan arreglos unidimensionales y bidimensionales con tipos primitivos.ALGORITMOS Y ESTRUCTURA DE DATOS 37 UNIDAD DE APRENDIZAJE 2 SEMANA 4 MANEJO DE ARREGLOS LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. Los alumnos emplean arreglos unidimensionales en diversas aplicaciones.

38 1. ejemplo: int n[] = new int[7]. se pueden almacenar diferentes valores. donde cada elemento conserva su propio espacio (tamaño en bytes). b) Creación: nombre_arreglo = new tipo[tamaño]. a) Declaración: Forma 1: tipo_dato nombre_arreglo[]. El espacio ocupado por cada elemento es igual para todos y. El tipo más simple de un arreglo es el unidimensional. double[] sueldos. Forma 2: tipo_dato[] nombre_arreglo. 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. ARREGLO UNIDIMENSIONAL Un arreglo es un conjunto de elementos dispuestos uno a continuación de otro. en él.pero del mismo tipo de dato. String[] apellidos. ejemplos: n = new int [10]. Con la declaración sólo se crea la variable que hace referencia al arreglo y su contenido es null. apellidos = new String[12]. double sueldos[]. ejemplos: int n[]. ejemplos: int[] n. sueldos = new double[8]. CARRERAS PROFESIONALES CIBERTEC . c) Declaración y creación en la misma linea: tipo_dato nombre_arreglo[] = new tipo_dato[tamaño]. String apellidos[].

int max) { return (int)((max .random()+ min).-5. un arreglo de tipo String con null y un arreglo de tipo boolean con false.length . crear e inicializar un arreglo en una misma linea de la siguiente forma: tipo_de_dato nombre_del_arreglo[]={valor1. CIBERTEC CARRERAS PROFESIONALES . } int aleatorio (int min. valor2. } e) Declaración. .12. n[3].min + 1) * Math. un arreglo de tipo double con 0.0. n[5]..ALGORITMOS Y ESTRUCTURA DE DATOS 39 gráficamente: 0 i 0 n 0 1 0 2 0 3 0 4 0 5 0 6 Consideraciones: Java. i++) n[i]=aleatorio(10.. 7) El indice i se encuentra en el rango: 0 <= i < n.25}. Ejemplos: int n[]={1. por defecto.}.length d) Inicialización: Se puede inicializar un arreglo con números aleatorios de la siguiente forma: void generar() { for(int i=0. n[6] n[7] no está definido n. String nombres[]= {”Juan”. inicializa un arreglo de tipo int con 0.”Pedro”. Java cuenta las posiciones a partir de 0 Esta posición se denomina indice: i Los siete elementos del arreglo n son: n[0]. creación e inicialización: Se puede declarar.0.length devuelve el tamaño del arreglo (en este caso.”Ana”}. i< n. n[2].99). n[1]. n[4].

indice=0. Código de la clase ArregloUnidimensional package semana4. public class ArregloUnidimensional { //Atributos privados private int edades[]. } //Métodos públicos public void adicionar(int edad) { edades[indice]=edad. } CARRERAS PROFESIONALES CIBERTEC . } public int obtener(int pos){ return edades[pos]. i++) edades[i]=aleatorio(10.40 2. 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). indice=longTotal(). } public int longTotal(){ return edades. } public void generar(){ for(int i=0. indice++. } public int getIndice(){ return indice. //Constructor public ArregloUnidimensional() { edades = new int[10]. indice=0. } public void reinicializar(){ edades = new int[10]. i<longTotal(). private int indice.length.99).

i<indice. return max. i++) suma+=edades[i]. i<indice. } } Podemos apreciar que la clase ArregloUnidimensional tiene 2 atributos privados: Un arreglo de edades de tipo int La variable indice de tipo int. i++) if(edades[i]<min) min=edades[i]. i<indice. for(int i=1. int max) { return (int)((max . 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. for(int i=0. for(int i=1. } public int sumaEdades(){ int suma=0. return -1. } public double edadPromedio(){ return sumaEdades()*1. } public int edadMayor(){ int max=edades[0]. i++) if(edades[i]>max) max=edades[i]. return min. return suma. que almacena la cantidad de edades ingresadas y la posición del arreglo donde se almacenará una nueva edad. i++) if(edad==edades[i]) return i.0/indice. CIBERTEC CARRERAS PROFESIONALES .ALGORITMOS Y ESTRUCTURA DE DATOS 41 public int buscar(int edad){ for(int i=0.min + 1) * Math. } public int edadMenor(){ int min=edades[0]. } //Método privado private int aleatorio (int min.random()+ min). i<indice.

El método getIndice es un método de acceso para el atributo índice. Los métodos sumaEdades. btnBuscar. El garbage collector se encargará de destruir el bloque anterior.*. CARRERAS PROFESIONALES CIBERTEC . lblEdad.setBounds(40. // Creación de la interfaz gráfica de usuario: GUI public void init() { getContentPane(). El método generar llena el arreglo de números aleatorios de 2 cifras.awt. 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. getContentPane(). getContentPane().100.swing. getContentPane(). lblArreglo. JTextArea txtS. btnReinicializar. Devuelve la cantidad de edades ingresadas. semana4. edadMayor y edadPromedio son métodos de cálculo.ArregloUnidimensional.lightGray). que es un indicador de no encontrado. JButton btnIngresar. devuelve -1. JScrollPane scpScroll. public class Principal extends JApplet implements ActionListener { // Declaración de variable globales JLabel lblEdad. JTextField txtEdad.*.*.setLayout(null).setSize(460.20.400).event. javax. El método buscar localiza una edad y devuelve la posición donde lo encontró. btnReportar. ArregloUnidimensional a=new ArregloUnidimensional().add(lblEdad).25). ya que éste es privado. ya que desde afuera de la clase no se tiene acceso al arreglo por ser privado. Código de la clase Principal import import import import java.awt. Si la edad no existe. txtEdad = new JTextField().42 - - - El método adicionar se encarga de almacenar la edad en el arreglo e incrementa la variable indice en uno.setBackground(Color. btnListar. edadMenor. java. 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. btnGenerar. lblEdad = new JLabel("Edad :").

btnGenerar = new JButton("generar"). getContentPane().add(scpScroll). btnIngresar.addActionListener(this).23).155.setBounds(320. btnListar.150.setBounds(320. lblArreglo. lblArreglo = new JLabel("Arreglo Lineal".300.add(btnBuscar). lblArreglo. btnReinicializar. txtS = new JTextArea().add(btnGenerar). btnListar = new JButton("listar").setBounds(10. getContentPane().addActionListener(this). getContentPane().setOpaque(true). btnReportar = new JButton("reportar").black). btnReinicializar = new JButton("reinicializar arreglo"). getContentPane().add(btnListar).20. btnReportar.3. btnBuscar.setBounds(320. btnReinicializar. btnBuscar = new JButton("Buscar").setBounds(250.150.150.setBackground(new Color(226.199. btnIngresar. } CIBERTEC CARRERAS PROFESIONALES . btnIngresar = new JButton("Ingresar"). btnGenerar.180. btnListar.add(btnReportar).223. scpScroll=new JScrollPane(txtS).setFont(new Font("dialog".addActionListener(this).setBounds(120.addActionListener(this).setBounds(320. getContentPane(). lblArreglo.130.setBounds(320.80.ALGORITMOS Y ESTRUCTURA DE DATOS 43 txtEdad.80.addActionListener(this).105.150.add(lblArreglo).addActionListener(this).298). scpScroll.205.234)).19)).20.80.23). getContentPane().23).40).23).23).setBounds(320. btnGenerar.25).add(btnIngresar). btnBuscar. btnReportar.add(btnReinicializar).23). lblArreglo.JLabel. getContentPane(). getContentPane().150.150. getContentPane().CENTER).add(txtEdad).setForeground(Color. lblArreglo.

imprimir("Edad mayor:"+a.edadMayor()).getIndice()>0){ imprimir("Suma de edades:"+a. listar(). limpiar(). } else mensaje("Arreglo lleno").getSource() == btnIngresar) ingresar(). i<a.getSource() == btnReinicializar) reinicializarArreglo().getSource() == btnReportar) reportar().edadPromedio()). if (e.. if (e.obtener(i)). } CARRERAS PROFESIONALES CIBERTEC . imprimir("Promedio de edades:" + a. a. } } void listar() { txtS. if(a.getSource() == btnBuscar) buscar().44 // Ejecución de los eventos tipo ActionEvent public void actionPerformed (ActionEvent e) { if (e. } catch(Exception x){ mensaje("Edad incorrecta").sumaEdades())."). if (e.edadMenor()).getIndice()>0){ for(int i=0. } void ingresar() { try{ if(a. } void reportar() { txtS.setText(""). imprimir("Edad menor:"+a.getSource() == btnGenerar) generar(). if (e. i++) imprimir("edad["+i+"] =" + a.getIndice().adicionar(edad).getSource() == btnListar) listar(). if(a.setText("").getIndice()<a. if (e. } else mensaje("Arreglo vacío.longTotal()){ int edad=getEdad()..

} else mensaje("Arreglo vacío.").parseInt(txtEdad.generar(). } void mensaje(String cad){ JOptionPane. if(pos==-1) mensaje("La edad no existe").getText()).setText("").reinicializar(). } void generar() { a. } } CIBERTEC CARRERAS PROFESIONALES .showMessageDialog(this.").append(cadena + "\n"). } void buscar(){ try{ int edad=getEdad().buscar(edad). a..setText(""). listar().. } catch(Exception x){ mensaje("Edad incorrecta"). } void imprimir (String cadena) { txtS.requestFocus().getIndice()>0){ txtS. } } void limpiar() { txtEdad. mensaje("El arreglo se reinicializó"). } void reinicializarArreglo() { if(a. txtEdad.ALGORITMOS Y ESTRUCTURA DE DATOS 45 else mensaje("Arreglo vacío.. else mensaje("La edad se encuentra en la posición: "+pos).cad). } int getEdad() { return Integer. int pos=a..

i<indice.46 GUI del Ejemplo 1: Ejemplo 2 Cree un método que permita adicionar edades en forma ilimitada. indice++. } CARRERAS PROFESIONALES CIBERTEC . edades[indice]=edad. i++) edades[i]=aux[i]. for(int i=0. que si el arreglo edades se llena. } private void ampliarArreglo(){ int aux[]=edades. En la clase ArregloUnidimensional: public void adicionar(int edad) { if(indice==edades. es decir. éste se amplie.length) ampliarArreglo(). edades=new int[indice+10].

j<indice. listar(). edades[j]=aux. for(int i=0. j++) if(edades[i]>edades[j]){ //intercambio aux=edades[i]. a.ALGORITMOS Y ESTRUCTURA DE DATOS 47 En la clase Principal: void ingresar() { try{ int edad=getEdad(). i<indice-1. } } En la clase Principal: void ordenar(){ a. listar(). } CIBERTEC CARRERAS PROFESIONALES .adicionar(edad). i++) for(int j=i+1. } } Ejemplo 3 Cree un método que permita ordenar en forma ascendente el arreglo de edades. edades[i]=edades[j]. } catch(Exception x){ mensaje("Edad incorrecta").ordenarAscendente(). En la clase ArregloUnidimensional: public void ordenarAscendente(){ int aux.

debe programar los botones generar. imprime el número mayor. 3000 .Un método que retorne la cantidad de números impares .Una variable indice de tipo int que almacene la cantidad de números Implemente los siguientes métodos: . que al pulsarlo. sueldo promedio y cantidad de sueldos de tal forma que.. la cantidad de números impares y la cantidad de números capicuas.. se llamen a los métodos creados en la clase ArregloSueldos.48 Ejercicios 1) Cree la clase ArregloSueldos en el paquete semana4 y declare los siguientes atributos como privados: .Un método que calcule el número mayor .Un constructor que cree el arreglo .Un constructor que cree el arreglo .Un método que retorne la cantidad de números capicuas En la clase Principal.Reportar.Generar. se genere los 15 números en el arreglo . debe programar los botones: .Un método que genere 15 numeros en el rango: 10 . 99 . 2) Cree la clase ArregloNumeros en el paquete semana4 y declare los siguientes atributos como privados: . CARRERAS PROFESIONALES CIBERTEC .Un arreglo de sueldos de tipo double .Un método que calcule el sueldo promedio. .Un arreglo de números de tipo int .Un método que retorne la cantidad de sueldos mayores a 2000 En la clase Principal. que al pulsarlo.Una variable indice de tipo int que almacene la cantidad de sueldos Implemente los siguientes métodos: . al pulsar estos botones.Un método que genere 10 sueldos en el rango: 500 .

TEMARIO • • Arreglo Bidimensional Operaciones variadas ACTIVIDADES PROPUESTAS • • Los alumnos reconocen un arreglo bidimensional. CIBERTEC CARRERAS PROFESIONALES . así como arreglo de objetos en diversas aplicaciones. Los alumnos emplean arreglos bidimensionales en diversas aplicaciones.ALGORITMOS Y ESTRUCTURA DE DATOS 49 UNIDAD DE APRENDIZAJE 2 SEMANA 5 ARREGLO BIDIMENSIONAL LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. los alumnos manipulan arreglos unidimensionales y bidimensionales con tipos primitivos.

El espacio ocupado por cada elemento es igual para todos y. n[2][2]. 5 CARRERAS PROFESIONALES CIBERTEC .50 1. En forma genérica: n[i][j] 0 <= i < FILAS 0 <= j < COLUMNAS n. se puede almacenar diferentes valores. n[2][0]. en él. 3 n[i]. n[0][3]. pero del mismo tipo de dato. n[1][3]. en este caso. n[1][1]. n[2][4] n[3][5] no está definido. n[1][4]. El índice i lo usaremos para acceder a una fila y el índice j para acceder a una columna. n[1][0]. Los 15 elementos del arreglo n son: n[0][0]. 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. en este caso. n[2][1].length devuelve la cantidad de filas. Arreglo bidimensional (dos direcciones) Ej: int j n[][] = new int[3][5].length devuelve la cantidad de columnas de la fila i. n[0][2]. n[0][4]. n[0][1]. n[1][2]. n[2][3].

n[2][4] se refiere al (2 * 5 + 4) + 1 = 15vo.append("\n").n[1][0] se refiere al (1 * 5 + 0) + 1 = 6to. i<FILAS. void generarNumeros() { for (int i=0. void listar() { for (int i=0. 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 CIBERTEC CARRERAS PROFESIONALES . j<COLUMNAS.99).append("n[" + i + "][" + j + "] : " + n[i][j] + "\t"). elemento . txtS. y último elemento INGRESO: Elabore un método que genere números de dos cifras. i++) { for (int j=0. j++) txtS. j<COLUMNAS. i<FILAS.n[2][0] se refiere al (2 * 5 + 0) + 1 = 11vo. i++) for (int j=0.ALGORITMOS Y ESTRUCTURA DE DATOS 51 NÚMERO DE ELEMENTO: e = (i*columnas + j) + 1 Así: i j i j e . elemento .n[0][0] se refiere al (0 * 5 + 0) + 1 = 1er. } 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++) n[i][j] = aleatorio(10.

col.52 2. al pulsar el botón Procesar. int col){ n = new int[fil][col]. } public int obtener(int posFil. public class ArregloBidimensional { //Atributos privados private int fil. un arreglo bidimensional de números en función de la cantidad de filas y columnas que el usuario ingrese. } //Métodos públicos public int getFilas(){ return fil. generar(). } CARRERAS PROFESIONALES CIBERTEC . Luego. Código de la clase ArregloBidimensional package semana5. private int n[][].fil=fil.col=col. Los números deben estar en el rango de 10 a 99. OPERACIONES VARIADAS Ejemplo 1 Diseñe un programa que genere. int posCol){ return n[posFil][posCol]. aleatoriamente. this. //Constructor public ArregloBidimensional(int fil. que calcule lo siguiente: a) La cantidad de números b) La suma de los números c) El número mayor d) El número menor e) El promedio de los números f) La suma de los números de la fila 2 g) La suma de los números de la columna 3 El arreglo Bidimensional se debe crear en la clase ArregloBidimensional dentro del paquete semana5 y la GUI se debe controlar desde la clase Principal. } public int getColumnas(){ return col. } public int getLongitud(){ return fil*col. this.

j++) if(n[i][j]>max) max=n[i][j]. CIBERTEC CARRERAS PROFESIONALES . } public int menor(){ int min=n[0][0]. i++) if(i==f) for(int j=0. i<fil. return sum. j<col. } //Métodos privados private void generar(){ for(int i=0. j++) sum+=n[i][j]. j++) if(j==c) for(int i=0.ALGORITMOS Y ESTRUCTURA DE DATOS 53 public int suma(){ int sum=0. return sum. i<fil. j++) n[i][j]=aleatorio(10. for(int i=0. i++) for(int j=0. return max. return sum. i<fil. j++) sum+=n[i][j]. for(int i=0. j<col. j<col. i++) for(int j=0. i<fil.0/getLongitud(). j<col. } public int mayor(){ int max=n[0][0]. i<fil. j++) if(n[i][j]<min) min=n[i][j]. for(int j=0. } public int sumaFila(int f){ int sum=0. i++) for(int j=0.99). i++) for(int j=0. } public int sumaColumna(int c){ int sum=0. j<col. for(int i=0. j<col. return min. i++) sum+=n[i][j]. for(int i=0. i<fil. } public double promedio(){ return suma()*1.

JScrollPane scpScroll. JTextArea txtS.add(lblFilas).add(txtColumnas).100. JTextField txtFilas. // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().20.add(lblColumnas). btnGenerar.awt.setBackground(Color.addActionListener(this).100.setLayout(null). getContentPane().add(btnProcesar). JButton btnGenerar.*. txtColumnas = new JTextField().setBounds(300.100. CARRERAS PROFESIONALES CIBERTEC .awt. getContentPane(). lblFilas = new JLabel("Filas"). getContentPane(). btnProcesar. getContentPane().54 } private int aleatorio(int min. } } Código de la clase Principal import import import import java.20). java.lightGray).20). btnProcesar.add(btnGenerar). getContentPane().lblColumnas.*.60.setBounds(30.20).txtColumnas.add(txtFilas).20.setBounds(30. lblColumnas = new JLabel("Columnas").50. lblFilas. javax.addActionListener(this).setBounds(300. semana5.60.20).20. btnProcesar.50. lblColumnas. ArregloBidimensional a.20).ArregloBidimensional. btnGenerar. txtFilas = new JTextField().20).setBounds(150.setBounds(150.event.*. txtFilas. txtColumnas. getContentPane(). btnProcesar=new JButton("Procesar"). public class Principal extends JApplet implements ActionListener{ JLabel lblFilas.50.random()+min).100. getContentPane(). int max){ return (int)((max-min+1)*Math. btnGenerar=new JButton("Generar").swing.

try { num = Integer.getLongitud()).ALGORITMOS Y ESTRUCTURA DE DATOS 55 txtS=new JTextArea(). imprimir("a) Cantidad de números:"+a. i<a. getContentPane().j). for(int i=0.append("n["+i+"]["+j+"]="+x+"\t").mayor()). imprimir("c) Número mayor:"+a. i++){ for(int j=0. } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ if(e.sumaFila(2)). } void generar(){ int filas=getFilas().setBounds(30. CIBERTEC CARRERAS PROFESIONALES .getText()).setText("").getSource()==btnGenerar) generar().getColumnas().col).220). imprimir("f) Suma de números fila 2:"+a. j++){ int x = a. int col=getColumnas(). txtS.promedio()). if(e.add(scpScroll).getSource()==btnProcesar) procesar().append("\n"). listar(). if(filas>0 && col>0){ a = new ArregloBidimensional(filas. imprimir("b) Suma de números:"+a.suma()). imprimir("e) Promedio de números:"+a.400. j<a. scpScroll=new JScrollPane(txtS).obtener(i.getFilas(). scpScroll. imprimir("d) Número menor:"+a. } void listar(){ txtS. imprimir("g) Suma de números columna 3:"+ a. } int getFilas() { int num. } else mensaje("datos incorrectos").sumaColumna(3)).menor()). } } void procesar(){ imprimir(""). } txtS.100.parseInt(txtFilas.

try { num = Integer. } void imprimir(String cad){ txtS.append(cad + "\n").56 } catch(Exception e) { num = 0. } return num. } return num.cad). } catch(Exception e) { num = 0.getText()). } } GUI : CARRERAS PROFESIONALES CIBERTEC . } void mensaje(String cad){ JOptionPane.showMessageDialog(this. } int getColumnas() { int num.parseInt(txtColumnas.

swing. Código de la clase ArregloEncuestas package semana5. Coca Cola. } public int getColumnas(){ return col.awt.*. CIBERTEC CARRERAS PROFESIONALES . } //Métodos públicos public int getFilas(){ return filas. } public void registrar(int per.awt.*.ArregloEncuestas.ALGORITMOS Y ESTRUCTURA DE DATOS 57 Ejemplo 2 Diseñe un programa para encuestar a un grupo de personas de diferentes edades acerca de sus preferencias en bebidas gaseosas entre Pepsi Cola. java. javax. public class ArregloEncuestas { //Atributos privados private final int filas =5.col= 4. 2) Cuántas personas fueron encuestadas en cada rango de edades El arreglo Bidimensional se debe crear en la clase ArregloEncuestas dentro del paquete semana5 y la GUI se debe controlar desde la clase Principal.event. private int encuestas[][]. int posCol){ return encuestas[posFila][posCol]. prefieren cada tipo de gaseosa. semana5. La empresa encuestadora desea saber lo siguiente: 1) Cuántas personas en total. //Constructor public ArregloEncuestas() { encuestas=new int[filas][col]. int gas){ encuestas[per][gas]++.*. } } Código de la clase Principal import import import import java. Fanta y Crush. } public int obtener(int posFila.

cboGaseosas.100.20. 110. cboGaseosas. getContentPane().add(lblPersonas).add(btnCalcular).15 años").addItem("Fanta").add(cboGaseosas).setBounds(150. CARRERAS PROFESIONALES CIBERTEC . getContentPane(). cboPersonas.addItem("Coca Cola"). btnEncuestar.setBounds(150. cboPersonas.addItem("Crush").setBounds(30. cboPersonas.addItem("Pepsi Cola").addActionListener(this). btnCalcular. JScrollPane scpScroll. btnCalcular.50.addItem("21 .add(lblGaseosas). // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().cboGaseosas.30 años").100. ArregloEncuestas a = new ArregloEncuestas().addItem("31 . lblPersonas. lblPersonas = new JLabel("Personas").lblGaseosas.50 años").20).add(cboPersonas).20).addActionListener(this).setBounds(30.setBackground(Color.500.setBounds(30.lightGray). cboGaseosas = new JComboBox(). scpScroll=new JScrollPane(txtS). txtS=new JTextArea(). 50. cboGaseosas.20. lblGaseosas. getContentPane(). getContentPane().340). JButton btnEncuestar. getContentPane().addItem("más 50 años"). 20). cboGaseosas. scpScroll.20 años"). cboGaseosas.20). 110. btnCalcular=new JButton("Calcular").58 public class Principal extends JApplet implements ActionListener{ JLabel lblPersonas. cboPersonas.50. JTextArea txtS.20).add(btnEncuestar). JComboBox cboPersonas.setBounds(350. getContentPane().addItem("12 .setLayout(null). cboPersonas.addItem("16 .100. cboPersonas. btnEncuestar.btnCalcular. 20.add(scpScroll). cboPersonas = new JComboBox().100. 20). btnEncuestar=new JButton("Encuestar"). getContentPane().100. lblGaseosas = new JLabel("Gaseosas").setBounds(350. getContentPane().

} void encuestar(){ int per. i++) tot+=a.setText("").j). i++){ tot=0. for(int j=0.getItemAt(j)+":"+tot).j).append(cad + "\n"). CIBERTEC CARRERAS PROFESIONALES . j++) tot+=a. } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ if(e.getSelectedIndex(). for(int i=0.getColumnas(). if(e. for(int i=0. j<a. imprimir("Total gaseosa "+ (String)cboGaseosas.gas. } } void imprimir(String cad){ txtS. j++){ tot=0. i<a.registrar(per. for(int j=0. } void listar(){ txtS. i<a.getFilas().getColumnas().obtener(i.ALGORITMOS Y ESTRUCTURA DE DATOS 59 listar(). a. } void calcular(){ pregunta1(). imprimir("Total personas "+ (String)cboPersonas.getSource()==btnCalcular) calcular(). j<a.getSource()==btnEncuestar) encuestar().getSelectedIndex(). pregunta2(). } void pregunta1(){ int tot. } } void pregunta2(){ int tot.getItemAt(i)+":"+tot).getFilas(). listar().gas). per=cboPersonas. gas=cboGaseosas.obtener(i.

imprimir("").getItemAt(i)+"\t\t"). } } } GUI : CARRERAS PROFESIONALES CIBERTEC .append(a.60 imprimir("\t\t Preferencia de Gaseosas \n"). i<a. imprimir("Rango de Edades \t Pepsi Cola \t Coca Cola \t Fanta \t Crush"). for(int j=0.obtener(i. j<a. for(int i=0.append((String)cboPersonas.getFilas().j)+"\t").getColumnas(). j++) txtS. i++){ txtS.

ALGORITMOS Y ESTRUCTURA DE DATOS

61

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. Las edades deben estar en el rango de 18 a 90 años. Luego, 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 semana5 y la GUI se debe controlar desde la clase Principal. 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). 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). El arreglo Bidimensional se debe crear en la clase MatrizCuadrada dentro del paquete semana5 y la GUI se debe controlar desde la clase Principal.

CIBERTEC

CARRERAS PROFESIONALES

62

CARRERAS PROFESIONALES

CIBERTEC

ALGORITMOS Y ESTRUCTURA DE DATOS

63

UNIDAD DE APRENDIZAJE

2
SEMANA

6
ARREGLO DE OBJETOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, los alumnos manipulan arreglos unidimensionales y bidimensionales con tipos primitivos, así como arreglo de objetos en diversas aplicaciones.

TEMARIO
• • Arreglo de objetos Operaciones variadas

ACTIVIDADES PROPUESTAS
• • Los alumnos reconocen un arreglo de objetos. Los alumnos emplean arreglo de objetos en diversas aplicaciones.

CIBERTEC

CARRERAS PROFESIONALES

85). 2005. alib[1]=new Libro(902. 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[] es el nombre del arreglo.”Estadística descriptiva”. 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. ARREGLO DE OBJETOS Un arreglo de objetos es un conjunto de variables de referencia que controlan objetos del mismo tipo.64 1. a) Creación de un arreglo de objetos: Libro alib[] = new Libro[3]. 2006. 90).”Programación en Java”. alib[2]=new Libro(903. 2004. Donde: Libro es el nombre de la clase.”Matemática Aplicada”. alib i 0 1 2 Código: 901 Titulo: Programación en Java Año: 2006 Precio: 90 Código: 903 Titulo: Estadística descriptiva Año: 2005 Precio: 78 Código: 902 Titulo: Matemática Aplicada Año: 2004 Precio: 85 CARRERAS PROFESIONALES CIBERTEC . new es el operador para reservar memoria. 78).

String titulo.titulo = titulo. año. es decir.codigo = codigo.precio = precio. eliminar y listar libros.precio = precio. } public void setPrecio( double precio ){ this. } public void setAño( int año ){ this. double precio){ this. } //Métodos de acceso public void setCodigo( int codigo ){ 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). Adicionalmente. La aplicación consiste en un mantenimiento de libros. public class Libro { // Atributos privados private int codigo.codigo = codigo. 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: . this. int año. 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). se consideran las opciones de ingresar. } public int getCodigo(){ return codigo. consultar.año = año. this. modificar.El título del libro más caro . private double precio. // Constructor public Libro( int codigo. this.ALGORITMOS Y ESTRUCTURA DE DATOS 65 2. private String titulo.titulo = titulo.año = año. } public void setTitulo( String titulo ){ this. } CIBERTEC CARRERAS PROFESIONALES .El título del libro más barato Código de la clase Libro package semana6.

} //Métodos públicos public void adicionar(Libro x){ if(indice==alib. //Constructor public ArregloLibros() { alib = new Libro[5]. } public double getPrecio(){ return precio. i<indice. i++) if(cod==alib[i]. alib[indice]=x. } public int getAño(){ return año.getCodigo()) return i. } public Libro obtener(int pos){ return alib[pos]. } public int tamaño(){ return indice. return -1.66 public String getTitulo(){ return titulo. public class ArregloLibros { //Atributos privados private Libro alib[]. private int indice. } } Código de la clase ArregloLibros package semana6. } public int buscar(int cod){ for(int i=0. indice=0. indice++.length) ampliarArreglo(). } CARRERAS PROFESIONALES CIBERTEC .

alib=new Libro[indice+5]. for(int i=0.getPrecio()*1. tit=x. i<indice.15).getPrecio(). i++){ Libro x=alib[i].ALGORITMOS Y ESTRUCTURA DE DATOS 67 public void eliminar(int pos){ for(int i=pos.getPrecio()>max){ max=x. String tit="". for(int i=0. i<indice. indice--. if(x. } } return tit. if(x.getPrecio()<min){ min=x. } //Método privado private void ampliarArreglo(){ Libro aux[]=alib. for(int i=0.getAño()>2003) x.setPrecio(x.getTitulo(). i<indice. if(x. } public void aumento(){ for(int i=0.MAX_VALUE. i++){ Libro x=alib[i].getTitulo(). i<indice-1. i++) alib[i]=alib[i+1]. } } public String masCaro(){ double max=0. i++){ Libro x=alib[i].getPrecio(). i<indice. tit=x. } public String masBarato(){ double min=Double. } } CIBERTEC CARRERAS PROFESIONALES . String tit="". i++) alib[i]=aux[i]. } } return tit.

txtPrecio. cboOpcion = new JComboBox(). 23). 87. CARRERAS PROFESIONALES CIBERTEC . lblAno. JTextArea txtS. 23). btnEstadisticas. add(lblCodigo). 90.*.setBounds(15. 90. add(lblPrecio).addItem("Consultar"). txtTitulo. lblPrecio = new JLabel("Precio"). txtAno. JTextField txtCodigo. 15.setBounds(15.addItem("Modificar").setBounds(15.68 Código de la clase Principal import import import import java. cboOpcion. lblPrecio.awt. getContentPane(). // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane(). ArregloLibros a = new ArregloLibros(). 111.*. 23). add(lblOpcion). lblTitulo = new JLabel("Titulo"). lblPrecio.setBounds(105. btnProcesar.setBackground(new Color(214.setBounds(15. java. cboOpcion. 150. lblTitulo.addItem("Listar"). 39. cboOpcion. cboOpcion. JScrollPane scpScroll. 90. lblCodigo.*. 90.211. cboOpcion. lblAno. semana6. lblTitulo.addItem("Ingresar"). cboOpcion. JComboBox cboOpcion. 90. add(lblTitulo).206)).*. JLabel lblOpcion. 63. 15. 23). 23).addItem("Eliminar"). add(lblAno). cboOpcion. 23).btnAumento. lblCodigo = new JLabel("Codigo").setLayout(null). lblOpcion = new JLabel("Opción").event. ItemListener{ // Declaración de variables JButton btnBorrar. add(cboOpcion).addItemListener(this).swing. lblAno = new JLabel("Año"). javax.awt. public class Principal extends JApplet implements ActionListener. lblCodigo. lblOpcion.setBounds(15.

add(scpScroll).setBounds(15. 23). btnProcesar. 150. btnBorrar. txtS. btnBorrar.setBounds(365.setBounds(365. txtAno = new JTextField(). scpScroll = new JScrollPane(txtS). 23).setEditable(false). btnProcesar = new JButton("Procesar"). CIBERTEC CARRERAS PROFESIONALES . 39. add(btnProcesar). 227). 23). btnAumento. 110. txtPrecio = new JTextField().getSource() == btnAumento ) aumento().setBounds(105. add(txtPrecio). Font.setBounds(105.setBounds(105. txtS = new JTextArea(). txtCodigo.addActionListener(this). btnBorrar = new JButton("Borrar"). 110.setBounds(365. add(txtAno). 140. 23). txtS. txtTitulo = new JTextField().setFont(new Font("monospaced". txtPrecio.addActionListener(this). btnProcesar. btnAumento. btnEstadisticas.setBounds(105. 15.PLAIN. 23). btnEstadisticas = new JButton("Estadisticas").addActionListener(this). btnAumento = new JButton("Aumento"). 39.getSource() == btnProcesar ) procesar(). 23).87.addActionListener(this). add(btnEstadisticas). 12)). scpScroll.getSource() == btnBorrar ) borrar().setBounds(365. add(txtTitulo). txtTitulo. 23). 110. add(txtCodigo). 150. 450. 110. add(btnBorrar). if( e. 150. 23). 111. 150. if( e. 63.ALGORITMOS Y ESTRUCTURA DE DATOS 69 txtCodigo = new JTextField(). txtAno. btnEstadisticas. } //-----------------------------------------------------public void actionPerformed( ActionEvent e ){ if( e. 87. 63. add(btnAumento).

setVisible(false).setVisible(true). lblPrecio.getSelectedIndex()){ case 0: case 1: lblCodigo. txtPrecio.setVisible(false). txtAno.setVisible(true). lblAno.setVisible(false). txtTitulo.setText(""). txtCodigo. lblTitulo.setVisible(false). txtCodigo. lblPrecio. break.setVisible(false).setVisible(false).setVisible(true).setVisible(false). } } //--------------------------------------------------------void borrar(){ txtCodigo.setText(""). txtCodigo.setVisible(false). lblTitulo. lblAno.setVisible(false). lblTitulo. txtAno.setVisible(false).setVisible(true).setVisible(false). txtAno. lblPrecio. txtAno. case 2: case 3: lblCodigo. default: lblCodigo. txtPrecio.getSource() == btnEstadisticas ) estadisticas(). break. txtTitulo. txtPrecio.setVisible(true). } //--------------------------------------------------------void seleccionar(){ switch(cboOpcion. txtTitulo.setVisible(true). txtTitulo.setVisible(true). } //--------------------------------------------------------void procesar(){ switch(cboOpcion.getSource() == cboOpcion ) seleccionar().setText("").70 if( e. } //--------------------------------------------------------public void itemStateChanged(ItemEvent e){ if( e.setVisible(true).setVisible(false).getSelectedIndex()){ CARRERAS PROFESIONALES CIBERTEC . lblAno.requestFocus().setVisible(true).setVisible(false).setText(""). txtPrecio.setVisible(true). txtCodigo.setVisible(false).

for(int i=0. break.parseInt(txtCodigo. } //--------------------------------------------------------void listar(){ imprimir(). CIBERTEC CARRERAS PROFESIONALES . case 1: modificar(). default: listar(). } //--------------------------------------------------------void imprimir( String s ){ txtS.s). i<a.parseDouble(txtPrecio. case 2: consultar().obtener(i). i++){ Libro x =a. } //--------------------------------------------------------void mensaje( String s){ JOptionPane.tamaño().tamaño()>0){ imprimir("Código \t Título \t Año \t Precio"). } //--------------------------------------------------------void imprimir(){ txtS. } //--------------------------------------------------------int getAño(){ return Integer. if(a. } //--------------------------------------------------------double getPrecio(){ return Double.getText(). case 3: eliminar(). break.append( s + "\n").setText(""). } } //--------------------------------------------------------int getCodigo(){ return Integer.ALGORITMOS Y ESTRUCTURA DE DATOS 71 case 0 : ingresar(). } //--------------------------------------------------------String getTitulo(){ return txtTitulo.showMessageDialog(this.getText()).getText()).parseInt(txtAno. break.getText()). break.

getTitulo()+"\t"+ x. } else mensaje("Código no existe"). mensaje("Libro agregado").getTitulo(). x. if(pos!=-1){ a.adicionar(x). } //--------------------------------------------------------void eliminar(){ int pos =a.getPrecio()).buscar(getCodigo()).obtener(pos).72 imprimir(x.getCodigo()). } //--------------------------------------------------------void ingresar(){ int pos =a. listar(). imprimir("Código:"+x.setPrecio(getPrecio()).buscar(getCodigo()).setAño(getAño()).getCodigo()+"\t"+x. a. } //--------------------------------------------------------void modificar(){ int pos =a. x.getTitulo()).getPrecio()). } //--------------------------------------------------------void consultar(){ int pos =a. imprimir("Año:"+x.obtener(pos). mensaje("Libro modificado"). } } else mensaje("No hay Libros"). if(pos!=-1){ Libro x =a.getPrecio()).getAño()). } else mensaje("Código no existe"). imprimir("Título:"+x. x.setTitulo(getTitulo()).buscar(getCodigo()). listar().eliminar(pos). } else mensaje("Código ya existe"). imprimir(). if(pos == -1){ Libro x = new Libro(getCodigo() . imprimir("Precio:"+x.buscar(getCodigo()).getAño()+"\t"+x. CARRERAS PROFESIONALES CIBERTEC . if(pos!=-1){ Libro x =a. getAño().

ALGORITMOS Y ESTRUCTURA DE DATOS 73 mensaje("Libro eliminado"). imprimir("El título del libro más barato:" + a. listar().aumento(). } //--------------------------------------------------------void estadisticas(){ imprimir().masBarato()). imprimir("El título del libro más caro:" + a.masCaro()). } //--------------------------------------------------------void aumento(){ a. listar(). } else mensaje("Código no existe"). } } GUI del Problema: CIBERTEC CARRERAS PROFESIONALES .

nombre (cadena). Diseñe las opciones de ingresar. implemente las clases ArregloEmpleados (clase que maneja el arreglo de objetos) y la clase Principal (clase que controla la GUI) Adicionalmente. consultar y eliminar del mantenimiento de vendedores. Para ello. Diseñe las opciones de ingresar. nombre (cadena). Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. implemente. CARRERAS PROFESIONALES CIBERTEC . y monto vendido (real).74 Ejercicios 1) Asuma la existencia de la clase Empleado que cuenta con los siguientes atributos privados: código (entero). b) Diseñe un método que retorne el nombre del empleado que tiene la tarifa más alta. implemente. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. en la clase ArregloVendedores. b) Diseñe un método que retorne el nombre del vendedor que vendió menos. modificar y listar del mantenimiento de empleados. los siguientes métodos: a) Diseñe un método que aumente la tarifa a los empleados cuyo nombre empiece con la letra ‘R’. implemente las clases ArregloVendedores (clase que maneja el arreglo de objetos) y la clase Principal (clase que controla la GUI). 2) Asuma la existencia de la clase Vendedor que cuenta con los siguientes atributos privados: código (entero). Para ello. los siguientes métodos: a) Diseñe un método que retorne el monto promedio de aquellos vendedores cuyo nombre empiece con ‘A’. horas trabajadas (entero) y tarifa (real). Adicionalmente. en la clase ArregloEmpleados.

CIBERTEC CARRERAS PROFESIONALES . FileReader. Los alumnos crean un mantenimiento. listar entre otras).ALGORITMOS Y ESTRUCTURA DE DATOS 75 UNIDAD DE APRENDIZAJE 3 SEMANA 8-9 CLASE ARRAYLIST Y ARCHIVOS DE TEXTO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. Utilizan las clases BufferedReader. eliminar. los alumnos utilizan los métodos de la clase ArrayList para efectuar operaciones con objetos (ingresar. consultar. modificar. TEMARIO • • Métodos de la clase ArrayList Operaciones con objetos ACTIVIDADES PROPUESTAS • • Los alumnos emplean los métodos de la clase ArrayList para manipular un arreglo de objetos. PrintWriter. FileWriter y StringTokenizer para almacenar la data en archivos de texto.

Para crear un ArrayList.x). de no encontrarlo devuelve -1. add(Object) public void adicionar(Producto x){ prod. prod es un objeto de tipo ArrayList que va a manipular un arreglo de objetos de tipo Producto. clear() prod. } Agrega un elemento en la posición especificada en el primer parámetro.get(pos). Es necesario importar el paquete: java.add(x). MÉTODOS DESCRIPCIÓN Agrega un elemento al final.indexOf(x). CLASE ARRAYLIST Métodos de la clase ArrayList Esta Clase dispone de diversos métodos para manipular una colección de objetos dinámicamanete.util. Devuelve el elemento de la posición especificada.clear().76 1. Object) indexOf(Object) CARRERAS PROFESIONALES CIBERTEC . se utiliza la siguiente instrucción: ArrayList <nombre_clase> var_referencia = new ArrayList < nombre_clase > (). public int posicion(Producto x){ return prod. } add(int. Elimina todos los elementos.ArrayList. } Devuelve el índice del elemento especificado. get(int) public Producto obtener(int pos){ return prod.add(0. Ejemplo: ArrayList <Producto> prod = new ArrayList <Producto> (). prod.

stock. } CIBERTEC CARRERAS PROFESIONALES .remove(x). double pu. String descripcion. size() public int tamaño(){ return prod. this.pu=pu. private String descripcion.size(). remove(Object) public void eliminar(Producto x){ prod. } set(int. Implemente métodos de acceso set/get package semana8. int stock ){ this. precio unitario y stock. this. Operaciones con objetos a) Operaciones de mantenimiento: Empleando la clase ArrayList realice un mantenimiento de productos.codigo=codigo. descripción. remove(int) public void eliminar(int x){ prod. } Devuelve la cantidad de elementos agregados. Producto x){ prod. Paso 1 Diseñe la clase Producto en el paquete semana8 que tenga como atributos privados los siguientes datos: código. private double pu. // Constructor public Producto( int codigo.set(pos. public class Producto{ // Atributos privados private int codigo. Para ello.remove(x). } Reemplaza el elemento de la posición especificada en el primer parámetro por el elemento del segundo parámetro. this.x). } Elimina el elemento especificado. Object) 2. implemente las clases Producto. public void modificar(int pos.ALGORITMOS Y ESTRUCTURA DE DATOS 77 Elimina el elemento de la posición especificada. ArregloProductos y Principal.stock=stock.descripcion=descripcion.

Un método eliminar que reciba un producto y lo elimine del ArrayList .descripcion = descripcion.78 // Fija el código public void setCodigo( int codigo ){ this. } // Retorna el precio unitario public double getPu(){ return pu. implemente los siguientes métodos: . } // Fija el stock public void setStock( int stock ){ this.Un método adicionar que reciba un producto y lo adicione al ArrayList . } // Retorna el stock public int getStock(){ return stock. } // Fija el precio unitario public void setPu( double pu ){ this.stock = stock.codigo = codigo. } // Retorna la descripción public String getDescripcion(){ return descripcion.Un constructor sin parámetros que cree el objeto ArrayList . luego.Un método menorprecio que retorne el producto más barato CARRERAS PROFESIONALES CIBERTEC .Un método obtener que reciba una posición y retorne el producto de esa posición .Un método tamaño que retorne la cantidad de productos ingresados al ArrayList . } } Paso 2 Diseñe la clase ArregloProductos en el paquete semana8 que tenga como atributo privado un objeto de tipo ArrayList. } // Retorna el código public int getCodigo(){ return codigo.Un método buscar que reciba un código y retorne el producto con ese código .pu = pu.Un método mayorprecio que retorne el producto más caro . } // Fija la descripción public void setDescripcion( String descripcion ){ this.

util.getPu(). public ArregloProductos(){ prod=new ArrayList <Producto> ().get(i). return max. } public Producto buscar(int codigo){ for(int i=0. import java.ALGORITMOS Y ESTRUCTURA DE DATOS 79 package semana8. } public void adicionar(Producto x){ prod. } public double mayorPrecio(){ double max=prod. for(int i=1.size(). i++) if(codigo==prod. } public void eliminar(Producto x){ prod.get(pos). i++) if(prod. return min.ArrayList. i<prod.getPu().getPu(). } public double menorPrecio(){ double min=prod. public class ArregloProductos{ private ArrayList <Producto> prod.get(i). i++) if(prod.size().size().get(i).remove(x).add(x).getPu().get(0). } public Producto obtener(int pos){ return prod.getPu()<min) min=prod. for(int i=1. i<prod.get(0).get(i).get(i).size(). i<prod.getPu()>max) max=prod.getCodigo()) return prod.get(i). return null. } public int tamaño(){ return prod. } } CIBERTEC CARRERAS PROFESIONALES .

consulta. implemente los siguientes métodos del programa principal: ingreso. modificación.80 Paso 3 Una vez desarrollada las clases Producto y ArregloProductos. 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 . En todo momento. eliminación y listado.

setBounds(15. JTextField txtCodigo. 15. 90. 63. 150.setBounds(105.swing. JTextArea txtS. cboOpcion = new JComboBox(). 23).setBounds(15.setBounds(15.awt.addItemListener(this).awt. lblStock. 39. cboOpcion. lblCodigo = new JLabel("Codigo"). JLabel lblOpcion. semana8.ALGORITMOS Y ESTRUCTURA DE DATOS 81 import import import import java. public class Principal extends JApplet implements ActionListener.add(lblOpcion). txtCodigo = new JTextField(). getContentPane(). 90. 23). lblCodigo.setBackground(new Color(214. getContentPane().206)). getContentPane(). 90.addItem("Ingresar"). lblPrecio = new JLabel("Precio"). 111.*. lblDescripcion.btnBorrar.add(lblDescripcion). getContentPane(). // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane(). cboOpcion. txtCodigo.setBounds(15. lblOpcion = new JLabel("Opción"). 90. 39. cboOpcion.add(lblCodigo). CIBERTEC CARRERAS PROFESIONALES . 23).addItem("Modificar"). lblDescripcion = new JLabel("Descripcion"). lblPrecio.211. JScrollPane scpScroll. 23).setBounds(15. java. lblOpcion. 90.addItem("Consultar"). 15.add(lblStock).addItem("Eliminar"). getContentPane(). JComboBox cboOpcion.event. lblPrecio.setBounds(105. txtStock. 23). lblDescripcion. txtDescripcion. cboOpcion. txtPrecio.add(lblPrecio).add(cboOpcion). 87. getContentPane().*. getContentPane(). cboOpcion. cboOpcion. 150. lblStock = new JLabel("Stock").*.setLayout(null). ItemListener{ // Declaración de variables JButton btnProcesar. javax.*. //Creo el objeto de tipo ArregloProductos ArregloProductos p=new ArregloProductos(). lblStock. lblCodigo. 23). 23).

getSource() == btnBorrar ) borrar().setBounds(365. txtS. lblStock. txtDescripcion.add(txtDescripcion). 39. txtS = new JTextArea().add(btnProcesar). txtDescripcion = new JTextField(). Font.PLAIN.setBounds(105. txtStock. 23). btnProcesar = new JButton("Procesar"). 23). txtPrecio = new JTextField().82 getContentPane().setVisible(false). getContentPane().setFont(new Font("courier".addActionListener(this). if( e. } CARRERAS PROFESIONALES CIBERTEC . 111. 450. 227). 23). scpScroll=new JScrollPane(txtS). 12)). } //--------------------------------------------------------public void actionPerformed( ActionEvent e ){ if( e. 140.setBounds(15.setVisible(false). btnBorrar. getContentPane(). 15.setBounds(105.add(txtPrecio). btnBorrar. 101. txtStock = new JTextField(). } //--------------------------------------------------------void seleccionar(){ int opcion=cboOpcion.getSource() == btnProcesar ) procesar().add(txtStock). txtDescripcion.setVisible(false). 101.setVisible(false). btnProcesar. txtPrecio. 150. } //--------------------------------------------------------public void itemStateChanged(ItemEvent e){ if( e.add(btnBorrar). getContentPane().63. 150. btnBorrar = new JButton("Borrar"). 23). 150. getContentPane(). scpScroll.setBounds(105.getSource() == cboOpcion ) seleccionar().setVisible(false).setVisible(false). if( opcion == 1 || opcion == 3 ){ lblDescripcion. 87.setBounds(365.add(txtCodigo). lblPrecio. txtStock. btnProcesar.getSelectedIndex().add(scpScroll). 23). getContentPane(). txtPrecio. getContentPane().addActionListener(this).

setText("").setText("").parseDouble(txtPrecio.setText("").setVisible(true).setText("").setVisible(true). } //--------------------------------------------------------double getPrecio(){ return Double.setVisible(true). txtPrecio.JOptionPane. } //--------------------------------------------------------String getDescripcion(){ return txtDescripcion.INFORMATION_MESSAGE). txtDescripcion.getText()).requestFocus().tipo. txtPrecio. break.parseInt(txtStock.setVisible(true). } //--------------------------------------------------------int getStock(){ return Integer. } //--------------------------------------------------------void procesar(){ switch(cboOpcion. break. } //--------------------------------------------------------String rellena(String cad){ CIBERTEC CARRERAS PROFESIONALES . lblPrecio. txtStock.parseInt(txtCodigo. } //--------------------------------------------------------void mensaje( String m.getText().getSelectedIndex()){ case 0 : ingresar().getText()).ALGORITMOS Y ESTRUCTURA DE DATOS 83 else{ lblDescripcion.setVisible(true). case 2: modificar(). break. } } //--------------------------------------------------------int getCodigo(){ return Integer. txtCodigo.showMessageDialog(this.setVisible(true). m. } } //--------------------------------------------------------void borrar(){ txtCodigo. txtStock. txtDescripcion. case 1: consultar().getText()). default: eliminar(). lblStock. String tipo ){ JOptionPane.

getCodigo()+"\t" + rellena(prod.obtener(i). } //--------------------------------------------------------// Ingresa un producto evitando que el código se repita void ingresar(){ Producto prod=p. mensaje("Producto Ingresado". getDescripcion(). i<p. precio y stock de un producto dado su código CARRERAS PROFESIONALES CIBERTEC . } //--------------------------------------------------------void imprimir(String s){ txtS. } //--------------------------------------------------------void imprimir(){ txtS. } //--------------------------------------------------------// Consulta la descripción.tamaño()). i++){ Producto prod=p.append( s + "\n").getStock()). } //--------------------------------------------------------// Muestra el listado solicitado void listar(){ imprimir(). } else mensaje("Codigo ya existe".getPu() + "\t\t"+prod. if(p. return cad. } imprimir("").buscar(getCodigo()).mayorPrecio()).84 int longitud=cad. if(prod==null){ prod=new Producto(getCodigo().tamaño()>0){ imprimir("Codigo \t Descripción \t\t P_Unitario \t Stock"). i++) cad+=" ". imprimir(prod. p.getPrecio().getStock()).adicionar(prod).tamaño(). listar().length().getDescripcion())+"\t\t"+ prod. for(int i=0.menorPrecio()). for(int i=longitud. } else imprimir("No hay productos"). imprimir("Total de Productos:"+p. "Mensaje de confirmación"). "Mensaje de error"). i<15. imprimir("Producto mas caro:"+p. imprimir("Producto mas barato:"+ p.setText("").

imprimir("Descripción : "+ prod. } } CIBERTEC CARRERAS PROFESIONALES . } else mensaje("Producto no existe". } //--------------------------------------------------------// Modifica la descripción. listar(). if(prod!=null){ p.setDescripcion(getDescripcion()). } //--------------------------------------------------------// Elimina un producto dado su código void eliminar(){ Producto prod=p. } else mensaje("Producto no existe". "Mensaje de error"). } else mensaje("Producto no existe".getDescripcion()).setPu(getPrecio()).getCodigo()).eliminar(prod). listar().setStock(getStock()).buscar(getCodigo()).getPu()). imprimir("Stock : "+ prod.getStock()). "Mensaje de error").ALGORITMOS Y ESTRUCTURA DE DATOS 85 void consultar(){ imprimir(). "Mensaje de confirmación"). prod. mensaje("Producto Modificado". prod. precio y stock de un producto dado su código void modificar(){ Producto prod=p. "Mensaje de confirmación"). "Mensaje de error"). mensaje("Producto Eliminado". Producto prod=p. if(prod!=null){ imprimir("Código : "+ prod.buscar(getCodigo()).buscar(getCodigo()). if(prod!=null){ prod. imprimir("Precio Unitario : "+prod.

sustituya el método modificar por el siguiente: // Modifica la descripción. "Mensaje de confirmación").posicion(prod). if(letra==’m’ && x. 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.getPrecio(). i++){ Producto x = p. for(int i=0.getDescripcion(). "Mensaje de error"). Producto x){ prod.getCodigo()+"\t"+x.getStock()).obtener(i). precio y stock de un producto dado su código void modificar(){ Producto prod=p.tamaño(). } else mensaje("Producto no existe". char letra = x.getStock()). } En la clase Principal.charAt(0).getPu()+"\t"+x. listar().86 En el mantenimiento.getDescripcion()+"\t"+ x.modificar(p.buscar(getCodigo()). se muestra otra forma de obtener los mismos resultados: Agregue los siguientes métodos en la clase ArregloProductos public int posicion(Producto x){ return prod. 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.getPu()<=getPreFin()) imprimir(x. i<p. p.x).indexOf(x).set(pos.getPu()>=getPreIni() && x. } } CARRERAS PROFESIONALES CIBERTEC . void mostrar(){ imprimir("Codigo \t Descripción \t P_Unitario \t Stock"). if(prod!=null){ Producto x=new Producto( getCodigo(). mensaje("Producto Modificado".x). A continuación. } Esta segunda forma consiste en reemplazar el nuevo objeto de tipo Producto por el anterior. } public void modificar(int pos. getDescripcion().

tamaño(). if(x.getDescripcion()+"\t"+ x. getStock()==0) imprimir(x. } } listar(). if(x.tamaño(). if(letra==’a’ && x.obtener(i). i<p. } listar(). void eliminarVarios(){ for(int i=0. i++){ Producto x = p. } } 3) Diseñe un método que disminuya en 10% el precio unitario de aquellos productos cuyo stock sea mayor a 100.charAt(pos).tamaño(). i++){ Producto x = p.getStock()<getStock()){ p. } 4) Diseñe un método que elimine a los productos cuyo stock sea menor al stock ingresado desde la GUI.getStock()>100) x. int pos = x. char letra = x. i<p. getDescripcion().eliminar(x).90).getPu()+"\t"+x.getPu()*0. void mostrar(){ imprimir("Codigo \t Descripción \t P_Unitario \t Stock").obtener(i). } CIBERTEC CARRERAS PROFESIONALES .obtener(i).setPu(x.length()-1.ALGORITMOS Y ESTRUCTURA DE DATOS 87 2) Diseñe un método que muestre los productos que terminen con la letra ‘a’ cuyo stock sea cero. getDescripcion(). i--. i<p. for(int i=0. i++){ Producto x = p. void rebaja(){ for(int i=0.getStock()).getCodigo()+"\t"+x.

Diseñe las opciones de ingresar. Diseñe un método que imprima el precio unitario promedio de aquellos videos del género suspenso. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. 2=terror) y precio unitario (real). Diseñe un método que elimine los videos del género ingresado desde la GUI. implemente las clases ArregloVideos (clase que maneja un objeto privado de tipo ArrayList) y la clase Principal (clase que controla la GUI). marca (cadena). b. nombre de película (cadena). Diseñe las opciones de ingresar. implemente en la clase ArregloCelulares los siguientes métodos: a. Para ello. Diseñe un método que retorne los modelos de celular de la marca enviada como parámetro. Considere que la clase cuenta con un constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo. implemente en la clase Principal los siguientes métodos: a. consultar y eliminar del mantenimiento de videos.88 Ejercicios 1) Asuma la existencia de la clase Celular que cuenta con los siguientes atributos privados: código (entero). b. implemente las clases ArregloCelulares (clase que maneja un objeto privado de tipo ArrayList) y la clase Principal (clase que controla la GUI) Adicionalmente. Para ello. Adicionalmente. codGenero (0=comedia. modificar y listar del mantenimiento de celulares. Diseñe un método que aumente en 8% el precio unitario a los celulares cuya marca termine con la letra ‘a’. 2) Asuma la existencia de la clase Video que cuenta con los siguientes atributos privados: codVideo (entero). modelo (cadena) y precio unitario (real). CARRERAS PROFESIONALES CIBERTEC . 1=suspenso.

FileReader. consultar. TEMARIO • • • Configuración del JDK Clases y métodos para manipular archivos de texto.ALGORITMOS Y ESTRUCTURA DE DATOS 89 UNIDAD DE APRENDIZAJE 3 SEMANA 10 ARCHIVOS DE TEXTO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. listar. Para manipular el arreglo de objetos. FileWriter y StringTokenizer para almacenar un arreglo de objetos en archivos de texto. FileWriter y StringTokenizer para almacenar la data en archivos de texto. PrintWriter. FileReader. entre otras). CIBERTEC CARRERAS PROFESIONALES . Utilizan las clases BufferedReader. eliminar. Operaciones de lectura y escritura en archivos de texto ACTIVIDADES PROPUESTAS • Los alumnos emplean las clases BufferedReader. utilizan los métodos de la clase ArrayList. PrintWriter. los alumnos utilizan los métodos de la clase ArrayList para efectuar operaciones con objetos (ingresar. modificar.

si no existe el archivo. 12. luego.. Seleccione CodeBase <ALL> y pulse "Editar entrada de norma". 3. siga los siguientes pasos: 1. 7. write. seleccione "read. Haga click en Archivo .output). En la ventana de Error pulse el botón Aceptar. 11. 2. por esta razón.io. En "Permiso". delete. Por último cierre la ventana. 10. CARRERAS PROFESIONALES CIBERTEC .policy 4.*.6." dele Aceptar. En "Acciones". Todo código que involucre manejo de archivos debe estar en una estructura try-catch. CONFIGURACIÓN DEL JDK Lo primero que debemos hacer para poder manejar una aplicación usando archivos es configurar el JDK. ya que podría producirse algún error. seleccione "<<ALL FILES>>".6. En "Nombre de destino". 5. Buscar en java\jdk1.90 1. execute".. Desde el Explorador ejecute java\jdk1. 8. por ejemplo.0\jre\lib\security\java. Haga click en Archivo – Guardar. "Terminar". import java. Recomendaciones: Debemos incluir la librería que permite manejar archivos (input . seleccione "FilePermission". 6.Abrir. Pulse "Aceptar".0\bin\policytool. 9. Pulse "Agregar permiso". Al mensaje "Norma escrita satisfactoriamente.

CLASES Y MÉTODOS PARA EL MANEJO DE ARCHIVOS: BufferedReader. abre un archivo como sólo lectura. Lo primero que tenemos que hacer es crear una variable de tipo BufferedReader por ejemplo: BufferedReader br.Es la clase que permite escribir los datos de la memoria hacia un archivo (output). De esta forma: br = new BufferedReader(new FileReader(archivo)). Luego. BufferedReader br = new BufferedReader(new FileReader(archivo)). Dicha cadena es convertida seguidamente al tipo de dato requerido. invocamos al constructor de la clase PrintWriter y le mandamos como parámetro un objeto de tipo FileWriter.txt" 00011001 br 00011011 00010110 00011000 00011101 00010100 00010111 null br PrintWriter.. "archivo. El método readLine() asociado a br captura una cadena de bits y salta a la siguiente línea de bits. CIBERTEC CARRERAS PROFESIONALES . invocamos al constructor de la clase BufferedReader y le mandamos como parámetro un objeto de tipo FileReader..ALGORITMOS Y ESTRUCTURA DE DATOS 91 2. Lo primero que tenemos que hacer es crear una variable de tipo PrintWriter por ejemplo: PrintWriter pw. Cuando no existen más cadenas br apunta a null. La clase FileReader.Es la clase que permite leer los datos de un archivo a memoria (input). El método close() cierra el acceso al archivo. De esta forma: pw = new PrintWriter(new FileWriter(archivo)). br apunta a la primera cadena de bits. Una vez abierto el archivo. Luego.

92 La clase FileWriter. si el archivo no existe. private String nombre. String nombre. Cree los métodos cargar y grabar en la clase ArregloEstudiantes. ArregloEstudiante (en el paquete semana10) y Principal. modificar. Código de la clase Estudiante package semana10. // Constructor public Estudiante( int codigo. PrintWriter pw = new PrintWriter(new FileWriter(archivo)). lo crea. El método close() cierra el acceso al archivo. OPERACIONES DE LECTURA Y ESCRITURA Diseñe un mantenimiento de estudiantes que permita ingresar.txt. se encarga de abrir el archivo en modo de escritura.ciclo = ciclo.nombre = nombre.pension = pension. public class Estudiante{ // Atributos privados private int codigo. this. Para ello. Al cargar el JApplet. eliminar y listar estudiantes. pw apunta al inicio. si el archivo contiene información ésta se pierde. 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. ciclo. Si el archivo no existe. "archivo. se deberán leer los datos del archivo estudiantes. this. deberá aparecer un mensaje de error. double pension){ this. Es decir.codigo = codigo. int ciclo. cree las clases Estudiante.txt" 00011001 pw 00011011 00010110 00011000 00011101 00010100 00010111 null pw 3. consultar. CARRERAS PROFESIONALES CIBERTEC . private double pension. Una vez abierto el archivo. this.

cargar().ALGORITMOS Y ESTRUCTURA DE DATOS 93 } // Métodos de acceso: set/get public void setCodigo( int codigo ){ this. } public int getCodigo(){ return codigo. } public void setPension( double pension ){ this. import java.util.io.ciclo = ciclo.pension = pension. import java. //Constructor public ArregloEstudiantes() { est=new ArrayList <Estudiante> ().*. public class ArregloEstudiantes{ //Atributo privado private ArrayList <Estudiante> est. } public int getCiclo(){ return ciclo.codigo = codigo. import javax. } public double getPension(){ return pension. } //Métodos para manipular el arreglo de objetos CIBERTEC CARRERAS PROFESIONALES . } public void setCiclo( int ciclo ){ this.*.nombre = nombre. } } Código de la clase ArregloEstudiantes package semana10. } public String getNombre(){ return nombre.swing.*. } public void setNombre( String nombre ){ this.

if(archivo.trim()). String nom=st. } public int tamaño(){ return est. } else JOptionPane. adicionar(x). i++) if(codigo==est.ciclo.remove(x). return null. int cod = Integer.txt")).add(x). String linea.trim(). double pension = Double.parseInt(st.get(i). } public Estudiante buscar(int codigo){ for(int i=0.parseInt(st.nextToken().close().94 public void adicionar(Estudiante x){ est. Estudiante x =new Estudiante( cod.readLine())!=null){ StringTokenizer st=new StringTokenizer(linea. } public void eliminar(Estudiante x){ est.size().exists()){ BufferedReader br=new BufferedReader(new FileReader("estudiantes. } br.trim()).get(i). nom. } catch(Exception x){ CARRERAS PROFESIONALES CIBERTEC .getCodigo()) return est.get(pos).pension).txt no existe"). i<est."."). } public Estudiante obtener(int pos){ return est.parseDouble(st. int ciclo = Integer.nextToken()."El archivo estudiantes. } //Métodos para manipular el archivo de texto private void cargar(){ try{ File archivo = new File("estudiantes.trim()).size().txt").nextToken().showMessageDialog(null.nextToken(). while((linea=br.

"+ obtener(i). btnProcesar. i++) pw. lblPension.*. java.showMessageDialog(null. CIBERTEC CARRERAS PROFESIONALES .*.211.ALGORITMOS Y ESTRUCTURA DE DATOS 95 JOptionPane. semana10.println(obtener(i).txt")). pw. JTextArea txtS. JTextField txtCodigo.206))."+ obtener(i). txtCiclo.close(). i<tamaño()."Se produjo un error= "+x). } catch(Exception x){ JOptionPane. } } public void grabar(){ try{ PrintWriter pw =new PrintWriter(new FileWriter("estudiantes. lblCodigo."Se produjo un error= "+x).swing. javax.*. txtNombre.*.getPension()).showMessageDialog(null."+ obtener(i).awt. JLabel lblOpcion. lblOpcion. lblOpcion = new JLabel("Opción").getCodigo()+". 23). JScrollPane scpScroll.event.getNombre()+". JComboBox cboOpcion. 90. } } } Código de la clase Principal import import import import java.awt. for(int i=0. lblCiclo. getContentPane().setLayout(null). public class Principal extends JApplet implements ActionListener.getCiclo()+". //Creo el objeto de tipo ArregloEstudiantes ArregloEstudiantes a=new ArregloEstudiantes().setBounds(15. lblNombre. ItemListener{ // Declaración de variables JButton btnBorrar. 15.setBackground(new Color(214. // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane(). txtPension.

111. add(lblPension). 110.addItemListener(this). 39. 150. add(txtPension). 15. 23). 15. 150. add(txtNombre). 23).setBounds(105. 111. 90. cboOpcion. txtPension. CARRERAS PROFESIONALES CIBERTEC . 90. 90. lblPension = new JLabel("Pension").PLAIN. 63. add(lblCiclo). cboOpcion. lblCiclo = new JLabel("Ciclo").addActionListener(this). txtS = new JTextArea(). txtNombre = new JTextField(). lblNombre. 150. btnBorrar. txtCodigo = new JTextField(). btnProcesar.setBounds(105. txtNombre. 23).setBounds(105. txtCiclo = new JTextField().setBounds(365.87. add(cboOpcion). cboOpcion. lblCiclo.addItem("Listar"). txtCiclo. 23). 87.addItem("Consultar"). cboOpcion. lblNombre = new JLabel("Nombre"). btnBorrar. 23). 23). btnProcesar = new JButton("Procesar"). 23).setBounds(105. 39. 12)). txtPension = new JTextField(). 63.addActionListener(this).addItem("Modificar").setBounds(15.setBounds(15. 23). 23). btnBorrar = new JButton("Borrar"). add(txtCodigo). Font. 150.setBounds(15.setBounds(15. cboOpcion. lblCodigo. 150. lblCodigo = new JLabel("Codigo"). 90.96 add(lblOpcion). lblPension. 23).addItem("Ingresar"). cboOpcion = new JComboBox(). cboOpcion. 110.setBounds(105. add(lblCodigo). 39. add(btnBorrar).addItem("Eliminar"). cboOpcion. txtCodigo. txtS. 23). add(txtCiclo). add(btnProcesar). add(lblNombre).setBounds(365.setFont(new Font("monospaced". btnProcesar.

setVisible(true). lblNombre.setVisible(true). lblPension.setVisible(false).setVisible(true). lblPension. } //--------------------------------------------------------public void itemStateChanged(ItemEvent e){ if( e.getSelectedIndex()){ case 0: case 1: lblCodigo. 450.setVisible(false). default: lblCodigo. if( e. 140.ALGORITMOS Y ESTRUCTURA DE DATOS 97 txtS. txtNombre. txtCiclo.setVisible(false).setVisible(true).setVisible(true).setVisible(false). lblCiclo.setBounds(15.setVisible(false).getSource() == btnBorrar ) borrar().setVisible(false).setVisible(false). add(scpScroll).setVisible(false). } //--------------------------------------------------------void seleccionar(){ switch(cboOpcion.setEditable(false). lblNombre. break. CIBERTEC CARRERAS PROFESIONALES . txtNombre.setVisible(false).getSource() == cboOpcion ) seleccionar(). txtPension. } //--------------------------------------------------------public void actionPerformed( ActionEvent e ){ if( e.getSource() == btnProcesar ) procesar(). 227). lblNombre.setVisible(false). txtCiclo. lblCiclo.setVisible(true). break. lblCiclo.setVisible(true).setVisible(true). txtCiclo.setVisible(false). txtCodigo. txtNombre. listar().setVisible(true). lblPension. scpScroll = new JScrollPane(txtS).setVisible(true). case 2: case 3: lblCodigo. txtCodigo.setVisible(false). scpScroll. txtCodigo.setVisible(false). txtPension.

parseDouble(txtPension. txtPension.getText()).getText()).getText(). txtCiclo.parseInt(txtCodigo. } } //--------------------------------------------------------int getCodigo(){ return Integer. } //--------------------------------------------------------- CARRERAS PROFESIONALES CIBERTEC . break. default: listar(). } //--------------------------------------------------------double getPension(){ return Double.requestFocus(). txtNombre. break. break. case 3: eliminar().setText(""). } //--------------------------------------------------------void procesar(){ switch(cboOpcion. txtCodigo.getText()). case 2: consultar().parseInt(txtCiclo.setText(""). } //--------------------------------------------------------void imprimir(){ txtS.98 txtPension. } //--------------------------------------------------------int getCiclo(){ return Integer.setText("").setText(""). } } //--------------------------------------------------------void borrar(){ txtCodigo.setVisible(false).getSelectedIndex()){ case 0 : ingresar().setText(""). } //--------------------------------------------------------String getNombre(){ return txtNombre. break. case 1: modificar().

} //--------------------------------------------------------void modificar(){ Estudiante e =a. listar().ALGORITMOS Y ESTRUCTURA DE DATOS 99 void imprimir(String s){ txtS.buscar(getCodigo()).getCiclo()+ "\t"+e. listar(). if(e == null){ e = new Estudiante( getCodigo().grabar(). a. } //--------------------------------------------------------void mensaje(String cad){ JOptionPane.setNombre(getNombre()).buscar(getCodigo()). for(int i=0. } else mensaje("Estudiante no existe").tamaño()>0){ imprimir("Codigo \t Nombre \t Ciclo \t Pensión").getPension()). imprimir(e. i<a. } //--------------------------------------------------------void listar(){ imprimir().grabar().getNombre()+"\t"+e. i++){ Estudiante e =a.setCiclo(getCiclo()). e.obtener(i).setPension(getPension()). getCiclo().getPension()). if(a. } else mensaje("Codigo ya existe").getNombre(). } //--------------------------------------------------------void consultar(){ imprimir().append( s + "\n"). a.getCodigo()+"\t" + e. mensaje("Estudiante Ingresado").showMessageDialog(this. a.tamaño().adicionar(e). mensaje("Estudiante Modificado"). e. if(e!=null){ e. } } else imprimir("No hay estudiantes"). CIBERTEC CARRERAS PROFESIONALES . } //--------------------------------------------------------void ingresar(){ Estudiante e =a.cad).

getCodigo()). if(e!=null){ a.grabar(). } else mensaje("Estudiante no existe"). } } GUI: CARRERAS PROFESIONALES CIBERTEC . a.getCiclo()). } else mensaje("Estudiante no existe"). listar().getPension()).buscar(getCodigo()). if(e!=null){ imprimir("Código : "+e. imprimir("Nombre : "+e. imprimir("Ciclo : "+e. } //--------------------------------------------------------void eliminar(){ Estudiante e =a. mensaje("Estudiante Eliminado").getNombre()).buscar(getCodigo()).100 Estudiante e =a.eliminar(e). imprimir("Pensión : "+e.

Al cargar el JApplet se deberán leer los datos del archivo celulares.txt. deberá aparecer un mensaje de error. 2=terror) y precio unitario (real). eliminar y listar estudiantes. 1=suspenso.txt. consultar. modificar. cree las clases Celular. consultar. Asuma la existencia de la clase Celular que cuenta con los siguientes atributos privados: código (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. nombre de película (cadena). CIBERTEC CARRERAS PROFESIONALES . codGenero (0=comedia. eliminar y listar videos. Al cargar el JApplet.ALGORITMOS Y ESTRUCTURA DE DATOS 101 Ejercicios 1) Diseñe un mantenimiento de celulares que permita ingresar. Asuma la existencia de la clase Video que cuenta con los siguientes atributos privados: codVideo (entero). 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. Cree los métodos cargar y grabar en la clase ArregloVideos. Para ello. ArregloCelulares (en el paquete semana10) y Principal. se deberán leer los datos del archivo videos. deberá aparecer un mensaje de error. Para ello. cree las clases Video. marca (cadena). modificar. Cree los métodos cargar y grabar en la clase ArregloCelulares. ArregloVideos (en el paquete semana10) y Principal. 2) Diseñe un mantenimiento de videos que permita ingresar. si el archivo no existe. si el archivo no existe.

102 CARRERAS PROFESIONALES CIBERTEC .

ALGORITMOS Y ESTRUCTURA DE DATOS 103 UNIDAD DE APRENDIZAJE 4 SEMANA 11 HERENCIA Y POLIMORFISMO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. CIBERTEC CARRERAS PROFESIONALES . la relación de generalización/especialización entre clases. TEMARIO • • • Conceptos básicos Uso del modificador protected Relación es-un ACTIVIDADES PROPUESTAS • • Los alumnos aplican el concepto de Herencia (relación es-un). se emplean las técnicas de casting y clases abstractas en casos prácticos. Los alumnos emplean el modificador protected. los alumnos aplican el concepto de herencia y polimorfismo.

mientras que la clase más general se denomina clase padre o superclase. La clase más específica se denomina clase hija o subclase y posee información adicional. Las clases se organizan en una estructura jerarquica. CARRERAS PROFESIONALES CIBERTEC .104 1. mientras que la especialización es una perspectiva descendente (top-down). La relación generalización / especialización es la relación de una clase más general y una clase más específica. 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. La generalización y la especialización son diferentes perspectivas del mismo concepto. la generalización es una perspectiva ascendente (bottom-up). 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.

. HERENCIA La herencia es el mecanismo mediante el cual se puede definir una clase (subclase) sobre la base de otra clase (superclase) heredando aquellos miembros de la superclase (atributos y métodos) que hayan sido declarados como public. } Vaca extends Mamifero { . 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... Un Ave es un Animal.. } Si una clase no tiene una superclase explícita... } Mamifero extends Animal { . por lo que no es heredado por las subclases..ALGORITMOS Y ESTRUCTURA DE DATOS 105 2. protected o sin especificador de acceso. implícitamente figura como: class Animal extends Object { .. } CIBERTEC CARRERAS PROFESIONALES . } Pato extends Ave {. 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". a la vez que impide el acceso al miembro desde el exterior de la superclase.. Redefinir un miembro de la superclase implica definir en la subclase un miembro con el mismo nombre que el de la superclase. La nueva clase puede añadir nuevos miembros e incluso puede redefinir miembros de la superclase.. Un Pato es un Ave. Así. } Ave extends Animal {. El constructor no es un miembro. Ejemplo 1: Un Mamífero es un Animal. A la redefinición de métodos se denomina también sobrescritura de métodos. implícitamente su superclase es la clase Object. Esto hace que el miembro de la superclase quede oculto en la subclase. Lo que puede expresarse como: class class class class class Animal { . Una Vaca es un Mamífero.. en el caso de la clase Animal..

106

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); Esta instrucción tiene que ser la primera sentencia a ejecutarse dentro del constructor de la subclase. Ejemplo 2: Define una superclase package padre; public class A { // Atributos public int v1; //se hereda private int v2; //no se hereda protected int v3; //se hereda // Constructor public A(int v1, int v2, int v3){ this.v1=v1; this.v2=v2; this.v3=v3; } // Métodos de acceso public int getv2(){ // se hereda return v2; }

//no se hereda

CARRERAS PROFESIONALES

CIBERTEC

ALGORITMOS Y ESTRUCTURA DE DATOS

107

public int getv3(){ return v3; } } Define una subclase package hijo; import padre.A;

// se hereda

public class B extends A{ // Atributo public int v4; // Constructor public B(int v1, int v2, int v3, int v4){ //super invoca al constructor de la superclase super(v1,v2,v3); this.v4=v4; } public int suma(){ return v1+getv2()+v3+v4; } } Ejemplo de uso import hijo.B; //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,3,5,7); imprimir("Objeto r de tipo B:"+r); imprimir("V1:"+r.v1); imprimir("V2:"+r.getv2()); // utilizamos el método getv3() heredado ya que no se //puede emplear v3 por tener acceso protejido imprimir("V3:"+r.getv3()); imprimir("V4:"+r.v4); imprimir("Suma:"+r.suma()); }

CIBERTEC

CARRERAS PROFESIONALES

108

Ejemplo 3: Implemente la clase Persona en el paquete padre con los siguientes miembros: - Atributos protegidos: apellidos, nombres y edad - Constructor que inicializa los atributos de la clase - Un método generarCorreo() que retorna el correo formado por el primer caracter del nombre, el primer caracter del apellido, la edad y al final “@cibertec.edu.pe”. Luego, implemente dos subclases de Persona: Docente y Alumno en el paquete hijo. Docente presenta los siguientes miembros: - Atributos privados: horas que dicta por semana y tarifa - Constructor con parámetros para inicializar los atributos: apellidos, nombres, edad horas y tarifa - Método calcularSueldo() que retorna horasXtarifa Alumno presenta los siguientes miembros: - Atributos privados: tres notas de tipo double - Constructor con parámetros para inicializar los atributos: apellidos, nombres, edad y las tres notas - Método calcularPromedio() que retorna el promedio simple de las tres notas Por último, 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. Clase Persona: package padre; public class Persona { protected String apellido,nombre; protected int edad; public Persona(String ape, String nom, int ed) { apellido=ape; nombre=nom; edad=ed; } public String generarCorreo(){ return ""+nombre.charAt(0)+apellido.charAt(0)+ edad+"@cibertec.edu.pe"; } } Subclase Docente: package hijo; import padre.Persona; public class Docente extends Persona{ private double horas,tarifa;

CARRERAS PROFESIONALES

CIBERTEC

ALGORITMOS Y ESTRUCTURA DE DATOS

109

public Docente(String ape, String nom, int ed, double h, double t) { super(ape,nom,ed); horas=h; tarifa=t; } public double calcularSueldo(){ return horas*tarifa; } public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Horas: "+horas+"\n"+ "Tarifa: "+tarifa+"\n"; } } Subclase Alumno: package hijo; import padre.Persona; public class Alumno extends Persona{ private double nota1,nota2,nota3; public Alumno(String ape, String nom, int ed, double n1, double n2, double n3) { super(ape,nom,ed); nota1=n1; nota2=n2; nota3=n3; } public double calcularPromedio(){ return (nota1+nota2+nota3)/3; } public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Nota1: "+nota1+"\n"+ "Nota2: "+nota2+"\n"+ "Nota3: "+nota3+"\n"; } }

CIBERTEC

CARRERAS PROFESIONALES

.mostrarDatos())."Sandra". imprimir("Sueldo:"+obj1.generarCorreo())..35). imprimir("su correo es:"+obj1.*.25.calcularSueldo()+"\n").100.13). 16. imprimir("Datos: \n"+obj2... } GUI : CARRERAS PROFESIONALES CIBERTEC .mostrarDatos()). imprimir("Datos: \n"+obj1.20. imprimir("su correo es:"+obj2.calcularPromedio()+"\n")."Juan". . void procesar(){ Docente obj1 = new Docente("Rojas". Alumno obj2 = new Alumno("Salazar". imprimir("Promedio:"+obj2..110 En la clase Principal: import hijo.14.generarCorreo()).

Atributos privados: x. . apellido. implemente dos subclases de Trabajador: Empleado y Consultor en el paquete hijo.Método area() que retorna el area del cuadrado (lado*lado) Círculo presenta los siguientes miembros: .Atributo privado: lado .Un método ubicacion() que retorna la ubicación de la figura geométrica según sus posiciones x e y.Un método boniSoles() que retorna la bonificación en soles (sbas* % bonificación) . apellido. telefono. . el último carácter del apellido y el teléfono del trabajador.Constructor con parámetros para inicializar los atributos: nombre.Un método sbruto() que retorna el sueldo bruto del empleado (sbas+bonificación en soles) .Atributo privado: radio . Luego. apellido.ALGORITMOS Y ESTRUCTURA DE DATOS 111 Ejercicios 1) Implemente la clase Figura en el paquete padre con los siguientes miembros: .Un método mostrarDatos() que retorne una cadena conteniendo: nombre. telefono de tipo String . radio . y que representa la ubicación de la figura geométrica .Un método generarCodigo() que retorna el código formado por el primer carácter del nombre.Atributos privados: sueldo básico y porcentaje de bonificación . bonificación en soles y el sueldo bruto CIBERTEC CARRERAS PROFESIONALES .Constructor con parámetros para inicializar los atributos: 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. Cuadrado presenta los siguientes miembros: . Luego.Atributos protegidos: nombre. sueldo básico y porcentaje de bonificación . teléfono. y.Método area() que retorna el área del círculo (pi*radio*radio) Por último.Constructor con parámetros para inicializar los atributos: x. implemente dos subclases de Figura: Cuadrado y Círculo en el paquete hijo. y. lado.Constructor que inicializa los atributos de la clase. Empleado presenta los siguientes miembros: . 2) Diseñe la clase Trabajador en el paquete padre con los siguientes miembros: .Constructor que inicializa los atributos de la clase. .

apellido.Un método mostrarDatos() que retorne una cadena conteniendo: nombre. horas y tarifa . apellido. telefono y el sueldo bruto Por último. CARRERAS PROFESIONALES CIBERTEC .112 Consultor presenta los siguientes miembros: .Atributos privados: horas trabajadas y tarifa horaria . teléfono. 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.Un método sbruto() que retorna el sueldo bruto del consultor (horas*tarifa) .Constructor con parámetros para inicializar los atributos: nombre.

los alumnos aplican el concepto de herencia y polimorfismo. se emplean las técnicas de casting y clases abstractas en casos prácticos. TEMARIO • • • Sobreescritura de métodos Clases y métodos abstractos Relación tiene-un 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) CIBERTEC CARRERAS PROFESIONALES . la relación de generalización/especialización entre clases.ALGORITMOS Y ESTRUCTURA DE DATOS 113 UNIDAD DE APRENDIZAJE 4 SEMANA 12-13 HERENCIA Y POLIMORFISMO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad.

La versión del método definida por la superclase queda oculta. } //Método public int suma() { return super. se dice que el método de la subclase sobrescribe al método de la superclase.114 1) Sobreescritura de métodos En una jerarquía de clases. int pj) { i = pi. los mismos parámetros y el mismo tipo de retorno que un método de su superclase. int pk) { super(pi.nombreDelMetodoSobreescrito (lista de argumentos) Ejemplo 1: // Superclase package semana12. } //Método public int suma() { return i + j. se usa la palabra super de la siguiente forma: super. } } // Subclase package semana12. } CARRERAS PROFESIONALES CIBERTEC .suma() + k. k = pk. //Constructor public B (int pi. //Constructor public A (int pi. siempre se refiere a la versión del método definida en la subclase. public class B extends A { //Atributo public int k. Cuando se llama a un método sobrescrito dentro de una subclase. public class A { //Atributos public int i. int pj. cuando un método de una subclase tiene el mismo nombre.nombreDeLaVariableOculta super. j = pj. 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. j.pj).

4). . Figura Atributos: x. } 2) Clases y métodos abstractos Una clase abstracta es una clase que no se puede instanciar. sino el compilador mostrará un mensaje de error. se usa únicamente para crear subclases..ALGORITMOS Y ESTRUCTURA DE DATOS 115 } // Ejemplo de uso import semana12.*. imprimir(obj2.. deberá declararse también como clase abstracta.j + " = " + obj1..k + " = " + obj2.. En Java. CIBERTEC CARRERAS PROFESIONALES . void procesar(){ A obj1 = new A(2.5). . Si una subclase de Figura no redefine o sobre-escribe area().3.j + " + " + obj2. pero sí la de un cuadrado o un círculo.i + " + " + obj1.suma()). tanto la clase como el método abstracto se etiqueta con la palabra reservada abstract. la clase tiene que ser abstracta. B obj2 = new B(1.suma()). Sí se tiene en una clase por lo menos un método abstracto.i + " + " + obj2. es decir en las subclases se va a sobre-escribir dicho método. imprimir(obj1. entonces. 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.y Métodos: Figura(constructor) ubicacion() area() Cuadrado Atributo: lado Métodos: Cuadrado(constructor) area() Círculo Atributo: radio Métodos: Circulo(constructor) area() Figura es una clase abstracta porque no tiene sentido calcular su área.

y = y. import padre.x = x. } public abstract double area(). public Cuadrado(int x. this. } public String ubicacion(){ return x+". public class Cuadrado extends Figura { private double lado. double lado) { super(x."+y. } Código de la clase Cuadrado: package hijo. int y) { this.116 Ejemplo 2: Código de la clase Figura: package padre. int y. public Figura(int x.lado = lado. } //Sobre-escritura public double area() { return lado*lado.Figura. protected int y. CARRERAS PROFESIONALES CIBERTEC . public class Circulo extends Figura { private double radio. import padre. public abstract class Figura { protected int x. this. } } Código de la clase Circulo: package hijo. y).Figura.

PI*radio*radio.. void procesar(){ Cuadrado obj1=new Cuadrado(100. public Vehiculo(int capacidad) { this.area())..200. cree la clase Principal que contiene el actionPerformed() para crear los objetos de tipo Carro y Avión e imprima las características de dichos objetos. } } Código de la clase Principal: import hijo. double radio) { super(x.area()).ubicacion()). // Superclase package padre. public abstract class Vehiculo { protected int capacidad. } public abstract String caracteristicas().. imprimir("Ubicación del círculo:"+obj2. } //Sobre-escritura public double area() { return Math. } 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. imprimir("Ubicación del cuadrado:"+obj1.20). int y. y). imprimir("Area del cuadrado:"+obj1. . Circulo obj2=new Circulo(300.ubicacion()). Por último.12).ALGORITMOS Y ESTRUCTURA DE DATOS 117 public Circulo(int x.capacidad=capacidad.*..20.radio=radio. . imprimir("Area del círculo:"+obj2. this. } CIBERTEC CARRERAS PROFESIONALES .

import padre.caracteristicas()).caracteristicas()).. imprimir(obj1.*. public class Avion extends Vehiculo{ public Avion(int cap) { super(cap). void procesar(){ Carro obj1 = new Carro(6). import padre. . imprimir(obj2.Vehiculo.118 // Subclase package hijo. } // Sobre-escritura public String caracteristicas(){ return "Tengo una capacidad de "+capacidad+ " pasajeros \n"+ "Puedo volar. . imprimir("\nObjeto Avión:"). imprimir("Objeto Carro:"). public class Carro extends Vehiculo{ public Carro(int cap) { super(cap)... } // 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".Vehiculo. } } // Subclase package hijo.. Avion obj2 = new Avion(300). tengo una velocidad enorme \n"+ "pero consumo mucho combustible". } CARRERAS PROFESIONALES CIBERTEC . } } // Ejemplo de uso – Clase Principal import hijo.

getApellidos()+ CIBERTEC CARRERAS PROFESIONALES . fecApertura = fec.getFecha(). saldo de la cuenta. permita abrir la cuenta de un cliente.saldo = saldo. Ejemplo 4: Diseñe un programa que. public class A { //Atributo privado private B obj. fec = new Fecha(). //Constructor public Cuenta(int nro. El titular de la cuenta es un cliente que tiene los siguientes datos: código de cliente. fecha de apertura (fecha del sistema en el formato: dd/mm/aaaa) y titular de la cuenta. private Fecha fec. double saldo) { this. apellidos y teléfono. this. Para ello. Código de la clase Cuenta: package semana12. this.ALGORITMOS Y ESTRUCTURA DE DATOS 119 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 semana12. se puede acceder a los miembros de la clase B. } public String getDatosTitular(){ return "Codigo Cliente:"+titular. private double saldo.getCodigo()+"\n"+ "Nombre Cliente:"+titular.titular = titular.nro = nro. } //Métodos de acceso: get public int getNro(){ return nro. Cliente titular. através de la referencia obj. private String fecApertura. considere que la cuenta tiene los siguientes datos: número de la cuenta. private Cliente titular. nombre.getNombre()+"\n"+ "Apellidos Cliente:"+ titular. } De tal forma que. a la pulsación del botón Procesar. public class Cuenta { //Atributos privados private int nro.

String telf) { this. } public String getFechaApertura(){ return fecApertura. import java. String nom. } public String getTelefono(){ return telf. } } Código de la clase Fecha: package semana12. String ape. private String nom.telf.nom=nom.ape=ape. } } Código de la clase Cliente: package semana12. CARRERAS PROFESIONALES CIBERTEC .getTelefono(). } //Métodos de acceso: get public int getCodigo(){ return cod. this. this. //Constructor public Cliente(int cod. } public String getApellidos(){ return ape.120 "\n"+ "Telefono Cliente:"+ titular.*.util. this. } public double getSaldo(){ return saldo.telf=telf. } public String getNombre(){ return nom.cod=cod.ape. public class Cliente { //Atributos privados private int cod.

imprimir("Titular de la cuenta:").. 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.getNro()).3500). //Constructor public Fecha() { gc = new GregorianCalendar().. .get(Calendar. dd = gc.getDatosTitular()).mm.getFechaApertura()). imprimir("Fecha de apertura de la cuenta:" + x.DAY_OF_MONTH).. } void listar(Cuenta x){ imprimir("Codigo de cuenta:"+x. imprimir("Saldo de la cuenta:"+x. aa = gc."Garcia". } 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().getFecha().. void procesar(){ Cliente cli = new Cliente(100.cli. . mm = gc.aa. Cuenta cta = new Cuenta(925671. La clase Fecha tiene un objeto de tipo GregorianCalendar por lo que podemos obtener el día.MONTH).ALGORITMOS Y ESTRUCTURA DE DATOS 121 public class Fecha { //Atributos privados private int dd. mes y año del sistema.get(Calendar.*.getSaldo())."Rodolfo".YEAR). } } Código de la clase Principal: import semana12. listar(cta). imprimir(x.get(Calendar. private GregorianCalendar gc. CIBERTEC CARRERAS PROFESIONALES . } //Método public String getFecha(){ return dd+"/"+(mm+1)+"/"+aa."4451234").

la clase CuadradoRelleno para implementar el programa DibujoCuadrado que lea el lado y el caracter de relleno. se le pide diseñar una clase CuadradoRelleno que herede de la clase Cuadrado y que. luego. Use. y dibuje y muestre el área del cuadrado.122 Ejemplo 5: Dada la clase Cuadrado que permite calcular el área de un cuadrado. } // Retorna el lado public int getLado(){ return lado. EJEMPLO: Datos ingresados: Lado : 4 Caracter : & Salida de resultados: ---------------------------&&&& &&&& &&&& &&&& Area : 16 ---------------------------public class Cuadrado { // Atributo private int lado.lado = lado. además de permitir obtener el área del cuadrado. // Constructor public Cuadrado( int lado ){ this. } } CARRERAS PROFESIONALES CIBERTEC . permita dibujar el cuadrado con un caracter de relleno especificado. } // Fija el lado public void setLado( int lado ){ this. } // Retorna el área public int area(){ return lado*lado.lado = lado.

c++) gui. gui.getText().append("\nEl Area es:"+area). c<=getLado(). char car.this). } 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. CuadradoRelleno c = new CuadradoRelleno (getLado(). DibujoCuadrado gui){ super(lado). c.parseInt(txtLado. } public void dibujar(){ for(int f=1. } } } Programa DibujoCuadrado: Tenemos los métodos para obtener los datos de la GUI //--------------------------------------------------------int getLado(){ return Integer. f++){ for(int c=1.getCaracter().ALGORITMOS Y ESTRUCTURA DE DATOS 123 public class CuadradoRelleno extends Cuadrado{ private char car.car = car.area(). private DibujoCuadrado gui. } //--------------------------------------------------------char getCaracter(){ return txtCaracter.gui = gui.append(""+car).charAt(0).append("\n"). this. txtS. } CIBERTEC CARRERAS PROFESIONALES . public CuadradoRelleno(int lado. f<=getLado().txtS. this.getText()).dibujar().txtS. area = c.

sexo. fecha de nacimiento. y los siguientes datos del DNI: Nro de dni. CARRERAS PROFESIONALES CIBERTEC . 2. estado civil. fecha de emisión y fecha de caducidad.124 Ejercicios 1. Implemente la clase abstracta Animal en el paquete padre que contenga el método abstracto habla() que se sobreescribirá en las subclases Perro. Por último. nombres. registre a una persona en la Reniec. se debe crear un objeto de tipo persona con los siguientes atributos: apellido paterno. apellido materno. Diseñe un programa que. a la pulsación del botón Procesar. Para ello. cree la clase Principal que contiene el actionPerformed() para crear los objetos Perro. Gato y Pollo (las subclases se crearán en el paquete hijo). fecha de inscripción. Gato y Pollo e imprima como habla cada Animal.

ALGORITMOS Y ESTRUCTURA DE DATOS 125 UNIDAD DE APRENDIZAJE 4 SEMANA 14 HERENCIA Y POLIMORFISMO LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. CIBERTEC CARRERAS PROFESIONALES . del operador instanceof y de clases abstractas. la relación de generalización/especialización entre clases. TEMARIO • • • Técnicas de casting: Upcasting y Downcasting Polimorfismo y enlace dinámico Operador instanceof ACTIVIDADES PROPUESTAS • Los alumnos emplean el polimorfismo haciendo uso de las técnicas de casting. los alumnos aplican el concepto de herencia y polimorfismo. emplea las técnicas de casting y clases abstractas en casos prácticos.

No hace falta especificarlo Downcasting: Permite interpretar un objeto de una clase base como del mismo tipo que su clase derivada. } } Clase Perro package semana14. 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". • Upcasting : Permite interpretar un objeto de una clase derivada como del mismo tipo que la clase base. public class Perro extends Mamifero{ public String mensaje(){ return "Soy perro". no modifican al objeto. } } Clase Mamifero package semana14. sólo su tipo. } public String hacerRuido(){ return "Guau". } } CARRERAS PROFESIONALES CIBERTEC . Se especifica precediendo al objeto a convertir con el nuevo tipo entre paréntesis.126 1) Técnicas de Casting: Upcasting y Downcasting Las técnicas de casting consiste en realizar conversiones de 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. Únicamente tienen sentido por la existencia de la herencia.

Se entenderá su aplicación con el ejemplo completo de polimorfismo que se verá en las siguientes páginas. si en la clase Perro no se hubierá sobre-escrito el método mensaje().hacerRuido()). } Se está creando un objeto de tipo Perro que se almacena en la variable de referencia a de tipo Animal (clase superior en la jerarquía de clases del ejemplo). Sólo su tipo. la referencia a se convierte a tipo Perro y através de p se accesa al objeto.mensaje()). m1 es de tipo Mamífero (clase superior en la jerarquía de clases del ejemplo). Perro p = (Perro)a.ALGORITMOS Y ESTRUCTURA DE DATOS 127 Clase Principal Aplicando Upcasting: void procesar(){ Mamifero m1 = new Perro(). la salida hubierá sido: soy mamífero no definido Al ejecutar un método. imprimir(m1. imprimir(p. Aplicando Downcasting: void procesar(){ Animal a = new Perro(). la salida es: Soy perro Guau Pero. 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(). Como el objeto es un Perro y los métodos mensaje() y hacerRuido() se están sobre-escribiendo en la clase Perro. 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. CIBERTEC CARRERAS PROFESIONALES .hacerRuido()). Pero. Los casting no modifican al objeto. imprimir(m1. se busca su implementación de abajo hacia arriba en la jerarquía de clases. Luego. } Se está creando un objeto de tipo Perro. por lo que se siguen ejecutando sobre el mismo objeto.

hacerRuido()). } } Clase Perro package hijo. Al tener métodos sobre-escritos. import padre. //ERROR imprimir(p1. lista el comportamiento de un Perro. } 2) Polimorfismo y enlace dinámico El polimorfismo está presente cuando se realiza la llamada a un método de un objeto del que no se sabe su tipo hasta que el programa esté en ejecución. public String mensaje(){ return "soy mamífero". No se puede convertir un animal a perro. public class Perro extends Mamifero{ public String hacerRuido(){ return "Guau". cuando es llamado por primera vez. es la implementación del polimorfismo. Un método es polifórmico cuando actúa de diferentes formas dependiendo del objeto que reciba. void procesar(){ Animal a1 = new Animal().Mamifero. public abstract class Mamifero { public abstract String hacerRuido(). la segunda vez. lista el comportamiento de un Gato y. de tal forma que podemos escribir código de forma general sin preocuparnos del método concreto que se ejecutará en cada momento. El enlace dinámico se da cuando se elige el método a ejecutar en tiempo de ejecución. En el ejemplo que se muestra a continuación. el método listar de la clase Principal es un método polifórmico.128 El siguiente ejemplo. objetos de diferentes tipos pueden responder de forma diferente a la misma llamada. compila pero no funciona porque a1 hace referencia a un objeto de tipo Animal. } } CARRERAS PROFESIONALES CIBERTEC . ya que. en función de la clase del objeto. Perro p1 = (Perro)a1. Ejemplo 2: Clase Mamífero package padre.

.. listar(p). } // listar es un método polifórmico void listar( Mamifero x ){ imprimir(x.hacerRuido()). .Mamifero..mensaje()). import padre. } } Clase Principal import padre.*. CIBERTEC CARRERAS PROFESIONALES .. 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 está referenciando x.. listar(g). Perro p = new Perro(). imprimir(x.Mamifero.ALGORITMOS Y ESTRUCTURA DE DATOS 129 Clase Gato package hijo. } Salida: Miau soy gato Guau soy mamífero Importante: El polimorfismo se da en el método listar. import hijo. } public String mensaje(){ return "soy gato". public class Gato extends Mamifero{ public String hacerRuido(){ return "Miau". void procesar(){ Gato g = new Gato().

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. Luego.nombre. Clase Persona package semana14.Atributos privados: horas que dicta por semana y tarifa .Constructor que inicializa los atributos de la clase .Atributos privados: tres notas de tipo double.pe”. int ed) { apellido=ape.Un método abstracto: mostrarDatos() para mostrar los datos de la persona creada . Docente presenta los siguientes miembros: .Método calcularPromedio() que retorna el promedio simple de las tres notas.Método calcularSueldo() que retorna horasXtarifa Alumno presenta los siguientes miembros: . el primer caracter del apellido. CARRERAS PROFESIONALES CIBERTEC . Ejemplo 3: Implemente la clase abstracta Persona en el paquete semana14 con los siguientes miembros: . edad=ed. edad horas y tarifa . public abstract class Persona { protected String apellido.Atributos protegidos: apellidos. la edad y al final “@cibertec.130 3) Operador instanceof Se utiliza el operador instanceof para determinar si el objeto es de la clase esperada antes de realizar el casting.Redefina o sobrescriba el método mostrarDatos() . protected int edad. } public abstract String mostrarDatos().Constructor con parámetros para inicializar los atributos: apellidos. . edad y las tres notas .Constructor con parámetros para inicializar los atributos: apellidos. nombre=nom. public Persona(String ape. String nom. Por último. 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. nombres y edad .Redefina o sobrescriba el método mostrarDatos() . nombres.edu. nombres.

ALGORITMOS Y ESTRUCTURA DE DATOS 131 public String generarCorreo(){ return ""+nombre.nom. public Alumno(String ape. } } Clase Docente package semana14. double h.tarifa.nom.charAt(0)+apellido. } public double calcularPromedio(){ return (nota1+nota2+nota3)/3. tarifa=t. int ed. } public double calcularSueldo(){ return horas*tarifa. nota2=n2.nota2. public class Alumno extends Persona{ private double nota1. int ed. nota1=n1. double n3) { super(ape. String nom. double t) { super(ape. public class Docente extends Persona{ private double horas.edu. } public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Horas: "+horas+"\n"+ "Tarifa: "+tarifa+"\n".ed). nota3=n3.nota3. public Docente(String ape. horas=h. double n2. String nom. } CIBERTEC CARRERAS PROFESIONALES . double n1.pe".ed).charAt(0)+edad+ "@cibertec. } } Clase Alumno package semana14.

debe mostrarse posición x. radio y el área del objeto. alto y el área del objeto. debe mostrarse posición x.. . if(x instanceof Docente) imprimir("Sueldo:"+((Docente)x).100.20.16. cree un arreglo con 4 objetos con datos fijos.calcularSueldo()+"\n"). El programa debe mostrar en el JTextArea lo siguiente: Si es un objeto de tipo Rectángulo. ancho. Si es un objeto de tipo Círculo. else imprimir("Promedio:"+((Alumno)x).calcularPromedio()+"\n").*..132 public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Nota1: "+nota1+"\n"+ "Nota2: "+nota2+"\n"+ "Nota3: "+nota3+"\n". } // listar es un método polifórmico void listar(Persona x){ imprimir("Datos: \n"+x. 2 objetos de tipo Rectángulo y 2 de tipo Círculo. posición y. posición y. al pulsar el botón Procesar."Ricardo". imprimir("su correo es:"+x.. debe calcular e imprimir el área mayor de los objetos creados. CARRERAS PROFESIONALES CIBERTEC .14. } } Clase Principal import semana14.generarCorreo()). listar(obj2). Adicionalmente..40). } Ejemplo 4: Diseñe un programa que.mostrarDatos()). Alumno obj2=new Alumno("Salazar".35."Sandra".13). listar(obj1). void procesar(){ Docente obj1=new Docente("Gálvez". .

y=y.x=x. alto. } public abstract double area(). public Figura(int x. protected int y.y). this. this. } Clase Rectángulo package semana14. double alto){ super(x. int y. double ancho. } CIBERTEC CARRERAS PROFESIONALES . public class Rectangulo extends Figura{ private double ancho.ALGORITMOS Y ESTRUCTURA DE DATOS 133 GUI del problema: Clase Figura package semana14. public abstract String mostrarDatos(). int y) { this. public abstract class Figura { protected int x. this. public Rectangulo(int x.ancho=ancho.alto=alto.

int y. } } Clase Principal import semana14.PI*radio*radio."+y+"\n"+ "radio: "+radio+"\n"+ "area: "+area()+"\n".area().area()>areaMayor){ areaMayor=figuras[i]. mFigura=figuras[i]. . } } Clase Círculo package semana14. } public String mostrarDatos(){ return "posición: "+x+"."+y+"\n"+ "ancho: "+ancho+"\n"+ "alto: "+alto+"\n"+ "area: "+area()+"\n". i++){ if(figuras[i]. double areaMayor=0. double radio){ super(x. .. } public String mostrarDatos(){ return "posición: "+x+". } CARRERAS PROFESIONALES CIBERTEC ..*..134 public double area(){ return ancho*alto. for(int i=0. Figura figuraMayor(Figura[] figuras){ Figura mFigura=null. public class Circulo extends Figura{ private double radio. } } return mFigura. this. i<figuras.radio=radio.length.. } public double area(){ return Math. public Circulo(int x.y).

getClass(). - CIBERTEC CARRERAS PROFESIONALES . 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.length. 0. Rectangulo(50. 50. Figura fMayor = figuraMayor(fig). estamos enviando el arreglo como parámetro. 50. Cuando hacemos listar(fig). 7. Circulo(30. fig[0] fig[1] fig[2] fig[3] = = = = new new new new Rectangulo(0. } void listar(Figura[] x){ for(int i=0. Circulo(10.0).0. 4.0). 7. 5.area()). imprimir("El área mayor es " + fMayor.0.0). 20. i++){ imprimir("Datos del "+x[i]. 5. 6.getName()). imprimir(x[i].0). listar(fig). } } Importante: fig es un arreglo de objetos de tipo Figura. por esa razón. i<x.mostrarDatos()).ALGORITMOS Y ESTRUCTURA DE DATOS 135 void procesar(){ Figura[] fig = new Figura[4].

CARRERAS PROFESIONALES CIBERTEC .136 Ejercicios Implemente los ejercicios de la página 108 aplicando clases y métodos abstractos. polimorfismo y el operador instanceof.

ALGORITMOS Y ESTRUCTURA DE DATOS 137 UNIDAD DE APRENDIZAJE 5 SEMANA 15-16 INTERFACES LOGRO DE LA UNIDAD DE APRENDIZAJE Al término de la unidad. TEMARIO • • Creación e implementación de Interfaces Herencia múltiple ACTIVIDADES PROPUESTAS • • Los alumnos crean e implementan interfaces Los alumnos aplican el concepto de herencia múltiple CIBERTEC CARRERAS PROFESIONALES . los alumnos aplican el concepto de herencia múltiple. Crean e implementan interfaces.

14. La ventaja principal del uso de interfaces es que puede ser implementada por cualquier número de clases. 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. La principal diferencia entre interface y clase abstracta es que una interface proporciona un mecanismo de encapsulamiento sin forzar al usuario a utilizar la herencia. public interface Constantes { double pi = 3.138 1) Creación de interfaces Una interfaz es una clase completamente abstracta. Ejemplo 1 Código de la interfaz: Constantes package interfaces. } Código de la interfaz: Interfaz1 package interfaces. Al utilizar implements para el interfaz es como si se hiciese una acción de copiar y pegar del código del interfaz. Una interfaz podrá verse. CARRERAS PROFESIONALES CIBERTEC . las interfaces se declaran con la palabra reservada interface. puesto que lo son implícitamente. import interfaces. Y si adicionalmente tiene miembros datos. como una forma.*. La clase que implementa una o más interfaces utiliza la palabra reservada implements. con lo cual no se hereda nada. static y final. solamente se pueden usar los métodos. } Código de la clase: ClaseA package clases. Para ello. Una interfaz es cuando lo único que puede tener son declaraciones de métodos y definiciones de constantes simbólicas. public interface Interfaz1 { void put( int dato ). solamente permite declarar nombres de métodos. éstos serán constantes. es como un molde. no es necesario definirlos como abstractos. int get(). En este caso. int constanteInt = 5. simplemente. es decir. es necesario que la clase implemente todos los métodos definidos por la interfaz. En Java. es decir es una clase sin implementación.

ALGORITMOS Y ESTRUCTURA DE DATOS 139 public class ClaseA implements Constantes. imprimir("dato objA = "+objA. // El método show pertenece a la claseA imprimir(objA. objA. import interfaces. } } Código de la clase: Principal import interfaces. public class ClaseB implements Constantes. } // El método get del interfaz1 public int get() { return( (int)dato ).dato = dato * constanteInt. // El método put del interfaz1 public void put( int dato ) { // Se usa "pi" del interfaz Constantes this. . void procesar(){ // Se crea un objeto de tipo ClaseA ClaseA objA = new ClaseA(). CIBERTEC CARRERAS PROFESIONALES .. Interfaz1 { int dato. Interfaz1 { double dato.*. } // El método show() no esta declarado en el interfaz1 public String show() { return "imprime " + dato.dato = dato * pi. } // El método get del interfaz1 public int get() { return dato. // El método put del interfaz1 public void put( int dato ) { // Se usa "constanteInt" del interfaz Constantes this. } } Código de la clase: ClaseB package clases. ..*.get())..*..show()). import clases.put(2).

} CARRERAS PROFESIONALES CIBERTEC .put(4). Por ejemplo: Cuadrado implementa la interfaz Dibujable y Círculo implementa las interfaces Dibujable y Rotable. pero sólo puede extender una clase (extends). Lo que se puede es crear una clase que implemente (implements) más de un interfaz. La siguiente figura muestra la implementación de interfaces: Dibujable Método: dibujar() Figura Atributos: x.140 // Se crea un objeto de tipo ClaseB ClaseB objB = new ClaseB(). } Salida: imprime 6. public interface Dibujable { String dibujar(). objB.28 dato objA = 6 dato objB = 20 2) Herencia múltiple En Java. cuyos métodos serán implementados en otras clases. Ejemplo 2 package interfaces. imprimir("dato objB = " + objB. realmente.get()).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. no existe la herencia múltiple.

} //Sobre-escritura public String dibujar() { return "El cuadrado puede ser dibujado".*. } //Sobre-escritura public double area() { return lado*lado. public abstract class Figura{ protected int x. this. protected int y. } package clases. } public abstract double area() .ALGORITMOS Y ESTRUCTURA DE DATOS 141 package interfaces.lado = lado. int y. double lado) { super(x. public class Circulo extends Figura implements Dibujable. "+y. import interfaces. y). this. public interface Rotable { String rotar(). CIBERTEC CARRERAS PROFESIONALES . Rotable { private double radio. int y) { this. public class Cuadrado extends Figura implements Dibujable{ private double lado. } package clases.x = x. import interfaces. public Cuadrado(int x.y = y. } } package clases. } public String ubicacion(){ return "figura ubicada en: "+x+".Dibujable. public Figura(int x.

} //Sobre-escritura public double area() { return Math.. .rotar()). double radio) { super(x.PI * radio * radio.8). } } Clase Principal import clases.ubicacion()).110. imprimir("El área es:"+x. imprimir(((Circulo)x). } imprimir("").. Circulo obj2 = new Circulo(40.*.3). listar(obj2). if(x instanceof Cuadrado) imprimir(((Cuadrado)x). } //Sobre-escritura public String dibujar() { return "El círculo puede ser dibujado". int y. ... else{ imprimir(((Circulo)x). listar(obj1).142 public Circulo(int x. } //Sobre-escritura public String rotar() { return "El círculo puede rotar".20.dibujar()). } CARRERAS PROFESIONALES CIBERTEC . y). } void listar(Figura x){ imprimir(x.area()). this. void procesar(){ Cuadrado obj1 = new Cuadrado(10.radio = radio.dibujar()).

por ejemplo. } public abstract String mostrarCapacidad(). En la solución. Por lo tanto. public Transporte(int capacidad){ this. subir y bajar que puede hacer los siguientes medios de transporte: Auto. Moto. public abstract class Transporte implements Movimiento{ protected int capacidad. Bicicleta. pero no un auto.Movimiento. } package interfaces.capacidad=capacidad. detener. String detener(). String bajar(). public String avanzar(){ return "no hay mensaje". import interfaces. } public String retroceder(){ return "no hay mensaje". } package clases. String retroceder(). hay operaciones que. public interface Volar{ String subir(). Considere que hay vehículos que son terrestres y otros que son aereos. } public String detener(){ return "no hay mensaje". Avión y Helicóptero. package interfaces. clases abstractas y subclases. un avión puede hacer. public interface Movimiento{ String avanzar(). emplee interfaces.ALGORITMOS Y ESTRUCTURA DE DATOS 143 Aplicación 1: Diseñe una aplicación que muestre las operaciones de avanzar. } } CIBERTEC CARRERAS PROFESIONALES . retroceder.

} public String mostrarCapacidad(){ return "Capacidad de pasajeros de la Bicicleta:"+capacidad. } public String detener(){ return "la bicicleta se detuvo". } } package clases. public class Auto extends Transporte{ public Auto(int capacidad){ super(capacidad). CARRERAS PROFESIONALES CIBERTEC . } public String avanzar(){ return "el auto esta avanzando". } } package clases. public class Bicicleta extends Transporte{ public Bicicleta(int capacidad){ super(capacidad). } public String mostrarCapacidad(){ return "Capacidad de pasajeros de la Moto:"+capacidad.144 package clases. } public String avanzar(){ return "la moto esta avanzando". } public String mostrarCapacidad(){ return "Capacidad de pasajeros del Auto:"+capacidad. } public String avanzar(){ return "la bicicleta esta avanzando". public class Moto extends Transporte{ public Moto(int capacidad){ super(capacidad).

} public String mostrarCapacidad(){ return "Capacidad de pasajeros del Avión:"+capacidad. } public String subir(){ return "el avión esta subiendo". } public String retroceder(){ return "la moto esta retrocediendo". } } package clases. } public String bajar(){ return "el avión esta bajando". } public String retroceder(){ return "el avión esta retrocediendo". public class Avion extends Transporte implements Volar{ public Avion(int capacidad){ super(capacidad). } public String detener(){ return "el avión se detuvo". import interfaces. import interfaces.Volar.Volar. } CIBERTEC CARRERAS PROFESIONALES . public class Helicoptero extends Transporte implements Volar{ public Helicoptero(int capacidad){ super(capacidad). } } package clases.ALGORITMOS Y ESTRUCTURA DE DATOS 145 } public String detener(){ return "la moto se detuvo". } public String avanzar(){ return "el avión esta avanzando".

} public String retroceder(){ return "el helicoptero esta retrocediendo". java. btnProcesar. getContentPane().lightGray).*.setBackground(Color.20.addActionListener(this).setLayout(null).awt. } public String bajar(){ return "el helicoptero esta bajando".146 public String mostrarCapacidad(){ return "Capacidad de pasajeros del Helicoptero:"+capacidad. JTextArea txtS. clases.setBounds(170.*. // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().event. JScrollPane scpScroll.20). } } Clase Principal: import import import import java. public class Principal extends JApplet implements ActionListener{ JButton btnProcesar. } public String detener(){ return "el helicoptero se detuvo". btnProcesar.*.add(btnProcesar). txtS=new JTextArea(). getContentPane().swing. javax. } public String avanzar(){ return "el helicoptero esta avanzando".*. btnProcesar=new JButton("Procesar"). } public String subir(){ return "el helicoptero esta subiendo".100. CARRERAS PROFESIONALES CIBERTEC .awt.

Bicicleta bici1=new Bicicleta(1). Avion avion1=new Avion(300).detener()).setBounds(20. } void listar(Transporte x){ imprimir(x.mostrarCapacidad()).ALGORITMOS Y ESTRUCTURA DE DATOS 147 scpScroll=new JScrollPane(txtS). imprimir(heli1. imprimir(avion1.subir()). imprimir(avion1.add(scpScroll). imprimir(x. Helicoptero heli1=new Helicoptero(10).60. getContentPane().420).subir()). } } CIBERTEC CARRERAS PROFESIONALES .avanzar()). imprimir(heli1.bajar()). imprimir(x. listar(heli1). scpScroll. } void imprimir(String cad){ txtS.append(cad + "\n"). listar(bici1).getSource()==btnProcesar){ procesar(). listar(moto1). Moto moto1=new Moto(2).bajar()). listar(avion1). listar(auto1).430. } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ if(e.retroceder()). imprimir(x. } } void procesar(){ Auto auto1=new Auto(5).

148 Interfaz Gráfica de usuario: CARRERAS PROFESIONALES CIBERTEC .

ALGORITMOS Y ESTRUCTURA DE DATOS 149 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. paquetes y objetos Modificador Static y referencia this Modificadores de acceso : public. herencia y polimorfismo CIBERTEC CARRERAS PROFESIONALES .

se muestra la interfaz gráfica de usuario (GUI) CARRERAS PROFESIONALES CIBERTEC . debe considerar las siguientes opciones: ingresos.Búsqueda según un intervalo de área . sólo para casas Aplicar los conceptos de la POO aprendidos en el curso. para lo cual se debe desarrollar lo siguiente: Mantenimiento de propiedades que renta.Búsqueda según un intervalo de área y un intervalo de precio . Diariamente acuden muchos clientes a la inmobiliaria buscando Información sobre casas y departamentos que estén disponibles y que cubra sus expectativas. consultas.150 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. A continuación.Búsqueda de la propiedad más cara 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. se desea que la aplicación realice las siguientes búsquedas: .Búsqueda según un intervalo de precio . por lo tanto.Búsqueda de la propiedad más barata . modificación y eliminación. es decir. se refiere a la ubicación del departamento dentro del edificio) : true (con jardín) y false (sin jardín).

etc). consulta.ALGORITMOS Y ESTRUCTURA DE DATOS 151 En las opciones de mantenimiento de casas y mantenimiento de departamentos. el usuario puede realizar las opciones de ingreso. precio. puede realizar las consultas de que casas y/o departamentos están disponibles dependiendo de los criterios seleccionados (según el área. CIBERTEC CARRERAS PROFESIONALES . el más barato. En la opción de búsquedas. el más caro. modificación y eliminación.

debe desmarcar la casilla de verificación Disponibilidad. La información ingresada o modificada alterará a los archivos de texto correspondientes. CARRERAS PROFESIONALES CIBERTEC . por ejemplo. debe darle clic a la casilla de verificación Jardin. modificación o eliminación. Sólo cuando una casa no esté disponible porque. ya se rentó. En el caso de las casas que tengan jardín. consulta.152 Utilice el JComboBox de opción para seleccionar la opción de ingreso.

consulta. modificación o eliminación. CIBERTEC CARRERAS PROFESIONALES . El JTextField de piso se refiere a la ubicación del departamento dentro del edificio o condominio. La información ingresada o modificada alterará a los archivos de texto correspondientes.ALGORITMOS Y ESTRUCTURA DE DATOS 153 Utilice el JComboBox de opción para seleccionar la opción de ingreso.

el más barato y el más caro). CARRERAS PROFESIONALES CIBERTEC . precio.154 Utilice el JComboBox Propiedad para seleccionar entre casa o departamento y el JComboBox Buscar por para seleccionar el criterio de búsqueda (según área. Ingrese los rangos de área y precio según sea el caso y dele clic al botón Procesar para ejecutar la búsqueda. área y precio.

this.largo = largo. } public void setLargo( double largo ){ this. boolean disp){ this.hab. this. public abstract class Propiedad { protected int codigo. this. protected double precio. } public int getCodigo(){ return codigo. } public void setDisp( boolean disp ){ this. this.precio = precio.disp = disp. } public void setAncho( double ancho ){ this. } public double getAncho(){ return ancho. protected boolean disp.hab = hab.hab = hab. this.ALGORITMOS Y ESTRUCTURA DE DATOS 155 Solución del caso propuesto: Clase Propiedad package renta. protected double ancho. } CIBERTEC CARRERAS PROFESIONALES . public Propiedad( int codigo. int hab. } public void setPrecio( double precio ){ this.codigo = codigo. } public int getHab(){ return hab.disp = disp.largo = largo. double ancho.codigo = codigo. double largo.ancho = ancho. largo. } public void setCodigo( int codigo ){ this. double precio.precio = precio.ancho = ancho. } public void setHab( int hab ){ this.

hab. } public double getPrecio(){ return precio. } public double area(){ return ancho*largo. int piso){ CARRERAS PROFESIONALES CIBERTEC .ancho. } } Clase Departamento package renta. } public String comoCadena(){ return codigo + "\t" + ancho + "\t" + largo + "\t" + precio + "\t" + area() + "\t" + jardin.jardin=jardin. public class Casa extends Propiedad { private boolean jardin. boolean jardin){ super(codigo. double ancho. public class Departamento extends Propiedad { private int piso. int hab. boolean disp. boolean disp. } public boolean getDisp(){ return disp.disp). double ancho. double precio.largo. this. } public abstract String comoCadena(). public Casa( int codigo. } Clase Casa package renta. public Departamento( int codigo. int hab. double largo. double precio. double largo.jardin = jardin. } public boolean getJardin(){ return jardin. } public void setJardin( boolean jardin ){ this.precio.156 public double getLargo(){ return largo.

} public void agregar(Casa x){ aCasas.Casa.hab. this. } public Casa buscar(int cod){ for(int i=0. import java.remove(x).largo.size().ancho.*. } public Casa obtener(int pos){ return aCasas. } public String comoCadena(){ return codigo + "\t" + ancho + "\t" + largo + "\t" + precio + "\t" + area() + "\t"+ piso. CIBERTEC CARRERAS PROFESIONALES .precio.add(x). } } Clase ArregloCasas package arreglos.size().util. import java. public ArregloCasas(){ aCasas=new ArrayList <Casa> (). } public int getPiso(){ return piso.getCodigo(). import renta.io.disp). public class ArregloCasas{ private ArrayList <Casa> aCasas.ALGORITMOS Y ESTRUCTURA DE DATOS 157 super(codigo. } public int tamaño(){ return aCasas.piso=piso.get(pos). i++){ int pcod=obtener(i). } public void setPiso( int piso ){ this. i<aCasas. if(pcod==cod) return obtener(i).piso = piso. } return null. } public void eliminar(Casa x){ aCasas.*.

trim()). } catch( Exception x ){ System. int hab = Integer.getPrecio().nextToken().nextToken().parseBoolean( tokens. boolean jardin = Boolean.add(new Casa(codigo. double ancho = Double.MIN_VALUE.").trim()). i < aCasas.trim()).size().nextToken(). aCasas.readLine()) != null ){ StringTokenizer tokens = new StringTokenizer(linea. while( (linea = br. largo.get(i).out.nextToken().nextToken().parseDouble( tokens.hab. for( int i = 0.trim()).parseInt( tokens. for( int i = 0. } } public void grabarCasa(){ try{ PrintWriter pw = new PrintWriter(new FileWriter("casas.MAX_VALUE.txt")).parseInt( tokens. i++ ) if( aCasas.158 } public double precioMenor(){ double menor = Double.close().parseBoolean( tokens.getPrecio() < menor && aCasas. return mayor.get(i).trim()).". i++ ) if( aCasas.trim()). boolean disp = Boolean.getDisp() ) menor = aCasas.get(i).nextToken().txt")). double largo = Double.getPrecio() > mayor && aCasas. int codigo = Integer. String linea. i < aCasas.trim()).getDisp() ) mayor = aCasas. return menor.jardin)).ancho.get(i).disp. CARRERAS PROFESIONALES CIBERTEC .precio.parseDouble( tokens. } br.get(i).getPrecio(). } public void cargarCasas(){ try{ BufferedReader br = new BufferedReader(new FileReader("casas.nextToken().get(i). } public double precioMayor(){ double mayor = Double. double precio = Double.parseDouble( tokens.println("Error: " + x).size().

"+ aCasas. if(pcod==cod) return obtener(i). import renta.Departamento. for(int i=0.get(i). } public Departamento buscar(int cod){ for(int i=0. public class ArregloDepartamentos{ private ArrayList <Departamento> aDptos.close().getPrecio()+ ".get(i). i<aCasas.getJardin().get(pos).getCodigo()+ ". } public int tamaño(){ return aDptos."+ aCasas. import java. import java.println(linea)."+ aCasas. } CIBERTEC CARRERAS PROFESIONALES .getAncho()+ ". i<aDptos."+ aCasas.getCodigo().get(i).get(i).*."+ aCasas.getHab()+ ". } pw.size(). } public void agregar(Departamento x){ aDptos."+ aCasas.*.ALGORITMOS Y ESTRUCTURA DE DATOS 159 String linea.io.getLargo()+ ". public ArregloDepartamentos(){ aDptos=new ArrayList <Departamento> ().get(i).add(x).util.size().get(i). i++){ int pcod=obtener(i). } catch( Exception x ){ } } } Clase ArregloDepartamentos package arreglos.getDisp()+ ".get(i). } public Departamento obtener(int pos){ return aDptos. pw. i++){ linea =aCasas. } return null.size().

txt")).get(i). } catch( Exception x ){ System.trim()).nextToken().getDisp() ) mayor = aDptos.size().get(i).println("Error: " + x). i < aDptos. while( (linea = br. for( int i = 0. ancho.getDisp() ) menor = aDptos.trim()). int hab = Integer.precio.nextToken(). } public double precioMenor(){ double menor = Double.nextToken(). return mayor. } public void cargarDepartamentos(){ try{ BufferedReader br = new BufferedReader(new FileReader("departamentos.get(i).parseDouble( tokens.getPrecio(). } } public void grabarDepartamento(){ try{ CARRERAS PROFESIONALES CIBERTEC . for( int i = 0. double largo = Double.largo.parseInt( tokens. double ancho = Double.").trim()). int codigo = Integer. String linea.MAX_VALUE.get(i). aDptos.nextToken(). double precio = Double.add(new Departamento(codigo. boolean disp = Boolean.getPrecio() > mayor && aDptos. } public double precioMayor(){ double mayor = Double.out.trim()).disp.nextToken().160 public void eliminar(Departamento x){ aDptos.remove(x).readLine()) != null ){ StringTokenizer tokens = new StringTokenizer(linea. i++ ) if( aDptos.trim()).nextToken().trim()).getPrecio() < menor && aDptos.close().nextToken(). } br.size().parseBoolean( tokens.parseDouble( tokens.parseDouble( tokens.hab.parseInt( tokens.MIN_VALUE. int piso = Integer. i++ ) if( aDptos.get(i).".getPrecio(). i < aDptos.get(i).piso)). return menor.parseInt( tokens.trim()).

javax."+ aDptos.getAncho()+ ".println(linea)."+ aDptos.applet. PCasa pnlCasa.txt")).parseDouble(t. } } Clase Principal import import import import java.getCodigo()+ ".get(i).getLargo()+ ". java. i<aDptos.getText()).*."+ aDptos. i++){ linea =aDptos. PDepartamento pnlDpto. for(int i=0.getPiso().getText()).*.get(i). public class LibGUI { private LibGUI(){ } public static int getInteger( JTextField t ){ return Integer. } } } Clase LibGUI (Librería) package compartido. public class Principal extends JApplet { PPrincipal pnlPrincipal.swing. CIBERTEC CARRERAS PROFESIONALES .*.println("Error: " + x)."+ aDptos. } catch( Exception x ){ System. String linea.parseInt(t.getPrecio()+ ".*. arreglos.get(i)."+ aDptos.awt.get(i). import javax."+ aDptos.*. pw.get(i). } public static double getDouble( JTextField t ){ return Double. } pw.getDisp()+ ".get(i).swing.size().out. PBusqueda pnlBusqueda.getHab()+ ".close().ALGORITMOS Y ESTRUCTURA DE DATOS 161 PrintWriter pw = new PrintWriter(new FileWriter("departamentos.get(i).

pnlBusqueda. public void init() { setLayout(null). JLabel.0. pnlBusqueda=new PBusqueda(this). pnlBusqueda.setBounds(0. pnlPrincipal=new PPrincipal(this). add(pnlCasa). lblTitulo.lblFoto3.awt.setVisible(false). add(pnlDpto). } } Clase PPrincipal import java.setVisible(false). add(lblTitulo).*. pnlDpto. setLayout(null).20.600.event.setBounds(0.600.0.btnMtoDptos.setBounds(0.swing.500).600.500). pnlCasa.0.setBounds(0.20)).600.500). pnlCasa.20). pnlDpto. lblTitulo. lblTitulo=new JLabel("Caso Inmobiliaria".awt. import javax. public class PPrincipal extends JPanel implements ActionListener { private JLabel lblTitulo. pnlPrincipal. pnlPrincipal. public ArregloDepartamentos aDpt = new ArregloDepartamentos(). add(pnlPrincipal).lblFoto1.*.600.500).BOLD.lightGray).setVisible(false).162 public ArregloCasas aCas = new ArregloCasas().lblFoto2.0. add(pnlBusqueda).btnBusquedas. setBackground(Color. pnlDpto=new PDepartamento(this).*. private Principal pri. CARRERAS PROFESIONALES CIBERTEC . import java. private JButton btnMtoCasas.setBounds(0.setVisible(true).Font. pnlCasa=new PCasa(this).setFont(new Font("Arial". public PPrincipal(Principal x){ pri=x.CENTER).

250.setVisible(false).setBounds(380.pnlPrincipal. add(lblFoto2). add(btnBusquedas).setVisible(false). btnMtoCasas. add(lblFoto1).setVisible(true). if(e.150.180.260.setVisible(true). btnBusquedas.pnlBusqueda.setVisible(true).setBounds(175. lblFoto2. btnMtoCasas. } public void busquedas(){ pri.pnlPrincipal. } public void mtoCasas(){ pri. lblFoto1=new JLabel(new ImageIcon("foto1.addActionListener(this).addActionListener(this). pri. } public void mtoDptos(){ pri.260.pnlDpto. btnMtoDptos.150. lblFoto2=new JLabel(new ImageIcon("foto2.100.150.25). if(e.setBounds(220.140. add(lblFoto3).jpg")).jpg")). lblFoto3=new JLabel(new ImageIcon("foto3.addActionListener(this). btnMtoDptos.100).100). pri. lblFoto1. btnMtoDptos=new JButton("Mantenimiento de Departamentos").250. add(btnMtoCasas).getSource()==btnMtoCasas) mtoCasas().getSource()==btnBusquedas) busquedas().setBounds(175. } public void actionPerformed(ActionEvent e){ if(e.25).260. add(btnMtoDptos). } CIBERTEC CARRERAS PROFESIONALES .getSource()==btnMtoDptos) mtoDptos().jpg")).pnlPrincipal. pri.setBounds(50.pnlCasa. btnBusquedas.ALGORITMOS Y ESTRUCTURA DE DATOS 163 btnMtoCasas=new JButton("Mantenimiento de Casas").250.setVisible(false).25). lblFoto3.setBounds(175. btnBusquedas=new JButton("Busquedas").100).

setBounds(10. txtPrecio. lblTitulo. lblLargo=new JLabel("Largo:").20)). lblAncho. protected JTextField txtCodigo.70. protected JButton btnAceptar. lblFoto2.lblFoto3.150.20). add(lblLargo).20). add(lblHab).txtHab.20).150. lblCodigo=new JLabel("Codigo:").132.164 } Clase PFormulario import javax.awt.txtAncho.setBounds(10.setBounds(10.swing.Font.20).lblLargo. lblTitulo.lblHab.*.20. add(lblTitulo). lblHab. lblAncho. CARRERAS PROFESIONALES CIBERTEC .setFont(new Font("Arial".150.setBounds(150. lblHab=new JLabel("Habitaciones:"). txtLargo. cboOpcion=new JComboBox(). lblAncho=new JLabel("Ancho:").setBounds(10.92. add(lblAncho).CENTER).70. public class PFormulario extends JPanel{ protected JComboBox cboOpcion.150.lightGray). lblPrecio=new JLabel("Precio:"). add(lblOpcion). lblOpcion=new JLabel("Opción:").150. lblFoto1. lblOpcion. public PFormulario() { setLayout(null). lblCodigo.150. btnModificar.20).20).*.setBounds(10.setBounds(0. lblTitulo=new JLabel("". cboOpcion.150.600.BOLD.lblPrecio. lblPrecio.lblOpcion.JLabel. add(lblPrecio).setBounds(10.lblCodigo. import java. add(lblCodigo).172.20).addItem("Ingresos"). cboOpcion. setBackground(Color.20).btnEliminar.152. lblLargo. protected JLabel lblTitulo. protected JCheckBox chkDispo.btnCancelar.112.

jpg")).172.150. txtAncho. btnModificar.152.setBounds(400.setVisible(false).20).setBounds(150.100.80.150.100. txtHab=new JTextField(). add(lblFoto2). txtPrecio=new JTextField().80. add(chkDispo).setBounds(150.setBounds(220. btnAceptar. CIBERTEC CARRERAS PROFESIONALES .152.92. add(cboOpcion).110. txtLargo. add(txtHab).25). chkDispo=new JCheckBox("Disponibilidad"). chkDispo.25).132. add(txtLargo).ALGORITMOS Y ESTRUCTURA DE DATOS 165 cboOpcion.addItem("Modificación"). add(txtCodigo).lightGray). txtCodigo=new JTextField(). add(btnAceptar).setBounds(400. add(txtPrecio).25). btnModificar. add(lblFoto1).100.jpg")). btnEliminar.150. add(btnEliminar).100).150.setBounds(400.100).260. cboOpcion.100. lblFoto2.setBounds(150. txtAncho=new JTextField().setBounds(150.setBounds(400.setVisible(false).20). btnEliminar. txtLargo=new JTextField().80. txtHab. chkDispo. add(txtAncho).150.112. lblFoto2=new JLabel(new ImageIcon("foto2.setBounds(50. lblFoto1=new JLabel(new ImageIcon("foto1.setBackground(Color.150. add(btnModificar).25). btnAceptar = new JButton("Aceptar").setBounds(150.20).150. txtPrecio.20).addItem("Eliminación").20). btnCancelar. btnEliminar = new JButton("Eliminar").150.setBounds(400.260. cboOpcion. lblFoto1. txtCodigo. add(btnCancelar). btnModificar = new JButton("Modificar"). btnCancelar = new JButton("Cancelar").addItem("Consultas").20).

setText("").setBounds(380.100).260.setText(""). private JCheckBox chkJardin.setEditable(true). } protected void cambio(){ btnAceptar. cboOpcion.setEditable(true). txtLargo. } } Clase PCasa import import import import import java. txtHab.setEditable(true).awt. renta. cboOpcion.setEnabled(true).setEditable(true). txtPrecio.LibGUI. btnModificar.*. lblFoto3.*.setText("").setVisible(false).Casa.setEditable(false). chkDispo.setVisible(false).swing. txtPrecio.setEditable(false). } protected void limpiarControles(){ txtCodigo. add(lblFoto3).150.setEditable(false). chkDispo.setSelected(false).setEnabled(false). txtHab. flagJardin=false.setEditable(true).setText("").jpg")). java.event. txtHab.setEditable(false).166 lblFoto3=new JLabel(new ImageIcon("foto3. txtPrecio. txtAncho.setVisible(true). public PCasa(Principal x) { CARRERAS PROFESIONALES CIBERTEC .setEnabled(true). compartido. txtLargo. chkDispo. javax. txtCodigo. ItemListener{ private Principal pri. txtLargo. existe=false.*. btnEliminar. private boolean flagDispo=false.setText(""). public class PCasa extends PFormulario implements ActionListener. } protected void habilitarControles(){ txtAncho. } protected void desabilitarControles(){ txtAncho.setSelectedIndex(0).awt.

cboOpcion. chkJardin. add(chkJardin).setBackground(Color.cargarCasas().getSource()==btnModificar) modificarCasa().habilitarControles().addActionListener(this).aCas.getItemSelectable()==chkDispo){ flagDispo=!flagDispo. } if(e.addActionListener(this). if(e. } public void actionPerformed(ActionEvent e){ if(e. chkJardin.setText("Mantenimiento de Casas").addItemListener(this).addActionListener(this).addItemListener(this). } public void itemStateChanged(ItemEvent e){ if(e. btnEliminar. else habilitarControles(). btnModificar. chkJardin.150.getSource()==btnCancelar) cancelar(). } } protected void habilitarControles(){ super.setBounds(400. btnAceptar. CIBERTEC CARRERAS PROFESIONALES .getItemSelectable()==chkJardin){ flagJardin=!flagJardin.lightGray). if(e.getSource()==btnAceptar) aceptar().172. chkJardin=new JCheckBox("Jardin").20). lblTitulo. if(indice==1 || indice==3) desabilitarControles(). btnCancelar.addActionListener(this).addItemListener(this).getSelectedIndex(). chkDispo. if(e.getSource()==cboOpcion){ int indice=cboOpcion.getSource()==btnEliminar) eliminarCasa().ALGORITMOS Y ESTRUCTURA DE DATOS 167 pri=x. } if(e. pri.

case 2: modificar().aCas.desabilitarControles().getInteger(txtHab). Ocasa=new Casa(cod. break.getDouble(txtLargo).flagDispo. default: eliminar(). switch(indice){ case 0: ingresar().getInteger(txtCodigo). existe=false. cambio(). break. double precio=LibGUI.setVisible(false). break.showMessageDialog(this. pri.grabarCasa(). } } public void cancelar(){ pri.showMessageDialog(this. } public void consultar(){ CARRERAS PROFESIONALES CIBERTEC .ancho. double largo=LibGUI.aCas. chkJardin.setEnabled(false).setEnabled(true). precio."Código ya existe"). pri.getSelectedIndex(). pri.buscar(cod). int hab=LibGUI."Casa Agregada"). } else JOptionPane. } protected void desabilitarControles(){ super.agregar(Ocasa).getDouble(txtPrecio). } public void aceptar(){ int indice=cboOpcion.flagJardin).pnlPrincipal.pnlCasa. limpiarControles().aCas.getDouble(txtAncho). Casa Ocasa=pri. } public void ingresar(){ int cod=LibGUI.setVisible(true). case 1: consultar().168 chkJardin.hab. limpiarControles(). if(Ocasa==null){ double ancho=LibGUI.setSelected(false). JOptionPane.largo.limpiarControles(). chkJardin. habilitarControles(). } protected void limpiarControles(){ super.

Ocasa."Cambio efectuado"). txtCodigo. boolean flag1=Ocasa. if(flag2) chkJardin.setText(""+Ocasa. txtHab.setSelected(true). existe=false.setSelected(true).setText(""+Ocasa.grabarCasa().buscar(cod).setDisp(flagDispo).setEditable(false).setEnabled(false). Ocasa.getDouble(txtAncho)).setSelected(false).getLargo()).getHab()).setText(""+Ocasa.aCas. txtPrecio. else chkDispo.getPrecio()).getAncho()).setSelected(false).setHab(LibGUI.setLargo(LibGUI.showMessageDialog(this. } else{ JOptionPane. limpiarControles().aCas. existe=true. txtLargo. if(Ocasa!=null){ txtAncho.aCas.setText(""+Ocasa. else chkJardin.getInteger(txtHab)). if(existe){ btnAceptar.buscar(cod). } } public void modificarCasa(){ int cod=LibGUI.setPrecio(LibGUI. pri.getJardin(). cboOpcion. Ocasa. btnModificar. Ocasa.setAncho(LibGUI. cambio().setVisible(true). if(flag1) chkDispo.ALGORITMOS Y ESTRUCTURA DE DATOS 169 int cod=LibGUI.setJardin(flagJardin). Ocasa. if(existe){ CIBERTEC CARRERAS PROFESIONALES .getDisp().showMessageDialog(this.getDouble(txtPrecio)).setVisible(false). limpiarControles().getInteger(txtCodigo). Casa Ocasa=pri.getDouble(txtLargo)). JOptionPane. Casa Ocasa=pri.getInteger(txtCodigo). } } public void modificar(){ consultar(). } public void eliminar(){ consultar(). boolean flag2=Ocasa. Ocasa."Código no existe").

"Casa eliminada").addActionListener(this). pri.showMessageDialog(this. lblPiso. txtCodigo.setBounds(150.20). lblPiso=new JLabel("Piso:").getInteger(txtCodigo). renta.20).150.*. java.LibGUI.150. } } Clase PDepartamento import import import import import java.addActionListener(this). existe=false.grabarCasa().eliminar(pri. txtPiso. JTextField txtPiso. javax.event. cboOpcion.addActionListener(this). btnCancelar. chkDispo. limpiarControles().addItemListener(this).192. btnEliminar.*.setVisible(true). btnEliminar. public PDepartamento(Principal x) { pri=x.setVisible(false).setEditable(false). btnAceptar. cambio().Departamento.aCas.*.setEnabled(false). cboOpcion. txtPiso=new JTextField().addActionListener(this).setBounds(10. CARRERAS PROFESIONALES CIBERTEC .aCas. compartido. JOptionPane. } } public void eliminarCasa(){ int cod=LibGUI.awt. ItemListener { private private private private Principal pri.addItemListener(this).aCas.setText("Mantenimiento de Departamentos"). JLabel lblPiso. pri. btnModificar.cargarDepartamentos().swing. lblTitulo.170 btnAceptar.aDpt. boolean flagDispo=false.awt. add(txtPiso). pri. add(lblPiso).buscar(cod)). public class PDepartamento extends PFormulario implements ActionListener.192.

txtPiso.getSource()==btnCancelar) cancelar().setEditable(false). switch(indice){ case 0: ingresar(). case 1: consultar().getSelectedIndex(). } public void itemStateChanged(ItemEvent e){ if(e. default: eliminar(). txtPiso. } if(e.getSource()==cboOpcion){ int indice=cboOpcion.habilitarControles().getSource()==btnEliminar) eliminarDpto(). if(e. } public void aceptar(){ int indice=cboOpcion.getSource()==btnAceptar) aceptar(). } } CIBERTEC CARRERAS PROFESIONALES .setEditable(true).getItemSelectable()==chkDispo){ flagDispo=!flagDispo.setText("").getSelectedIndex(). txtPiso. break. break. } protected void desabilitarControles(){ super. case 2: modificar(). if(e. } protected void limpiarControles(){ super.desabilitarControles(). else habilitarControles().getSource()==btnModificar) modificarDpto(). if(e. break. } } protected void habilitarControles(){ super. if(indice==1 || indice==3) desabilitarControles().ALGORITMOS Y ESTRUCTURA DE DATOS 171 } public void actionPerformed(ActionEvent e){ if(e.limpiarControles().

getPrecio()). habilitarControles().getDouble(txtLargo).getInteger(txtCodigo). if(flag1) chkDispo.getInteger(txtCodigo).setVisible(true). txtHab.ancho. else chkDispo. pri. precio. existe=true.getInteger(txtPiso).setSelected(false).buscar(cod).setText(""+Odepa.aDpt. if(Odepa!=null){ txtAncho. } public void consultar(){ int cod=LibGUI. int piso=LibGUI.showMessageDialog(this.aDpt. JOptionPane.getPiso()). double precio=LibGUI.showMessageDialog(this. if(Odepa==null){ double ancho=LibGUI.aDpt.setText(""+Odepa.pnlPrincipal. } else{ JOptionPane.setText(""+Odepa.getInteger(txtHab)."Código no existe"). } else JOptionPane.172 public void cancelar(){ pri. cambio(). int hab=LibGUI.setSelected(true).getHab()). Departamento Odepa=pri."Departamento Agregado").getDisp().largo. } } CARRERAS PROFESIONALES CIBERTEC . txtPiso. existe=false.setText(""+Odepa. txtLargo."Código ya existe"). double largo=LibGUI. txtPrecio.aDpt. boolean flag1=Odepa. } public void ingresar(){ int cod=LibGUI.setText(""+Odepa. Departamento Odepa=pri.getDouble(txtPrecio).piso).pnlDpto.showMessageDialog(this.getDouble(txtAncho).buscar(cod). pri.hab.getAncho()).setVisible(false).getLargo()). limpiarControles().flagDispo. Odepa=new Departamento(cod. pri. limpiarControles(). existe=false.grabarDepartamento().agregar(Odepa). limpiarControles().

grabarDepartamento().aDpt.buscar(cod). } } Clase PBusqueda import import import import import java. Odepa.setVisible(true)."Departamento eliminado").getInteger(txtHab)).Propiedad.setPrecio(LibGUI.setDisp(flagDispo). if(existe){ btnAceptar. renta.aDpt. Odepa. pri. javax.showMessageDialog(this.buscar(cod)).setEditable(false). pri.setEditable(false).setAncho(LibGUI. Odepa.setVisible(false). JOptionPane.setVisible(false).aDpt.getDouble(txtPrecio)). limpiarControles(). } public void eliminar(){ consultar(). txtCodigo.getInteger(txtCodigo). cboOpcion.getInteger(txtCodigo).LibGUI.*.*. pri.swing. Departamento Odepa=pri.setVisible(true). CIBERTEC CARRERAS PROFESIONALES . } } public void modificarDpto(){ int cod=LibGUI. btnModificar. cboOpcion. if(existe){ btnAceptar.setLargo(LibGUI.setEnabled(false).aDpt. cambio(). btnEliminar.ALGORITMOS Y ESTRUCTURA DE DATOS 173 public void modificar(){ consultar().awt. Odepa. cambio(). Odepa. } } public void eliminarDpto(){ int cod=LibGUI.awt.event.getDouble(txtLargo)). txtCodigo.setEnabled(false).*.grabarDepartamento().eliminar(pri.aDpt.setHab(LibGUI.getInteger(txtPiso)).setPiso(LibGUI.getDouble(txtAncho)). JOptionPane. compartido.showMessageDialog(this. limpiarControles()."Cambio efectuado"). Odepa. java.

lblArea.60.20). cboTipo=new JComboBox().JLabel.setFont(new Font("Arial". txtPrecioMax. cboBusqueda.lightGray). private JComboBox cboTipo. private JScrollPane scpScroll. add(cboTipo).setBounds(330.60.addItem("Casa").setBounds(90.600. cboBusqueda = new JComboBox().BOLD.20). cboBusqueda. cboTipo.60.txtPrecioMin.lblTipo.110.addItem("Area y Precio").80. public class PBusqueda extends JPanel implements ActionListener. add(cboBusqueda). setLayout(null). private JTextArea txtS. CARRERAS PROFESIONALES CIBERTEC .Font. private JLabel lblTitulo. lblA1.CENTER). cboBusqueda. lblBusqueda.lblA2. add(lblArea).120.lblPrecio.60. cboBusqueda.setBounds(90. cboBusqueda. lblTitulo. private JButton btnProcesar. lblTitulo=new JLabel("Busquedas".txtAreaMin.setBounds(0.btnCancelar. private JTextField txtAreaMax. add(lblTipo).addItem("Area"). setBackground(Color.174 import arreglos.90. lblTitulo.20. lblBusqueda = new JLabel("Buscar por"). cboTipo. cboBusqueda. cboTipo.20)).20).setBounds(10.addItem("Precio"). lblArea = new JLabel("Area").60. cboBusqueda. lblTipo.20). add(lblTitulo). ItemListener { private Principal pri. lblTipo = new JLabel("Propiedad"). lblArea. cboBusqueda. add(lblBusqueda).20).setBounds(250.addItemListener(this). public PBusqueda(Principal x) { pri=x.lblBusqueda.addItem("Departamento").*.addItem("Mas caro").60.20).addItem("Mas barato").

20. btnCancelar.ALGORITMOS Y ESTRUCTURA DE DATOS 175 txtAreaMin = new JTextField().100. if(e.setBounds(150.20). scpScroll.20).90. deshabilita_area(). btnProcesar.110. } public void actionPerformed(ActionEvent e){ if(e. JLabel. txtAreaMax = new JTextField(). add(lblA2).60. lblPrecio.setBounds(150.90. lblA2. add(btnProcesar).20). txtPrecioMax = new JTextField(). add(txtAreaMax). txtPrecioMin. add(lblPrecio).20). txtPrecioMax.setBounds(230.CENTER). txtS = new JTextArea().addActionListener(this). lblA1.100. txtS.setBounds(230.110. lblA1 = new JLabel("a". add(txtPrecioMax). add(btnCancelar).CENTER).setBounds(210. JLabel. add(scpScroll). add(lblA1).20).90. 150.setEditable(false).20).setEnabled(false).60.60. lblA2 = new JLabel("a".getSource()==btnCancelar) cancelar(). txtPrecioMin = new JTextField(). btnCancelar = new JButton("Cancelar").90.110.20. txtAreaMin.20).60.setBounds(460.20). btnProcesar = new JButton("Procesar").110. deshabilita_precio().60. btnProcesar. scpScroll=new JScrollPane(txtS). 300).setBounds(10. btnProcesar. } CIBERTEC CARRERAS PROFESIONALES . add(txtAreaMin). txtAreaMax.setBounds(210.60. btnCancelar.setBounds(460.getSource()==btnProcesar) procesar().addActionListener(this).setBounds(90.20). lblPrecio = new JLabel("Precio"). 580. add(txtPrecioMin).

} } public void habilita_area(){ lblArea. habilita_precio(). switch(indice){ case 0: habilita_area(). txtPrecioMax. case 2: habilita_area(). deshabilita_precio().pnlPrincipal.setVisible(true). break. lblA1.setVisible(false). lblA1.setVisible(true). default:deshabilita_area().setVisible(true). break. txtAreaMax. pri.setEnabled(true). habilita_precio(). } public void deshabilita_area(){ lblArea. txtAreaMax. break. CARRERAS PROFESIONALES CIBERTEC .setVisible(false). } btnProcesar.getSource()==cboBusqueda){ int indice=cboBusqueda. case 1: deshabilita_area(). } public void habilita_precio(){ lblPrecio. txtPrecioMax.setVisible(true).setVisible(false). lblA2. lblA2.setVisible(false).setVisible(true).setVisible(false).setVisible(true). txtPrecioMin.setVisible(false). } public void cancelar(){ pri.setVisible(false).setVisible(true).setVisible(true).pnlBusqueda.getSelectedIndex(). } public void deshabilita_precio(){ lblPrecio. txtAreaMin. break. deshabilita_area(). txtAreaMin. txtPrecioMin. deshabilita_precio().176 public void itemStateChanged(ItemEvent e){ if(e.setVisible(false).setVisible(false). deshabilita_precio().setVisible(true).

break.aDpt.aCas. for( int i = 0. break. double areamax = LibGUI. } public void limpiar(){ txtAreaMax.setText("").obtener(i).getDouble(txtAreaMax). i < pri. txtPrecioMin. CIBERTEC CARRERAS PROFESIONALES . i++ ){ Propiedad prop=pri. i++ ){ Propiedad prop=pri. break. double areamin = LibGUI. } } public void buscar_area(){ int indice=cboTipo.comoCadena()).area() <= areamax){ imprimir(prop.setText("").obtener(i). txtPrecioMax.tamaño(). txtAreaMin. switch(indice){ case 0: buscar_area().setText(""). if(prop. case 1: buscar_precio(). limpiar(). break.getSelectedIndex().aDpt.setText("").area() >= areamin && prop.getDouble(txtAreaMin). if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin").setEnabled(false).tamaño(). } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso"). i < pri. case 3: buscar_mas_barato(). conta++. default:buscar_mas_caro(). imprimir(). } public void procesar(){ int indice=cboBusqueda.getSelectedIndex(). } } imprimir(conta + " casa(s) encontrada(s)"). int conta = 0.aCas. case 2: buscar_area_precio().ALGORITMOS Y ESTRUCTURA DE DATOS 177 btnProcesar.getDisp() && prop. for( int i = 0.

int conta = 0. double preciomax = LibGUI. } } imprimir(conta + " departamento(s) encontrado(s)").178 if(prop. i < pri.aDpt. for( int i = 0. } } public void buscar_precio(){ int indice=cboTipo.comoCadena()). } } CARRERAS PROFESIONALES CIBERTEC . conta++. double preciomin = LibGUI. i++ ){ Propiedad prop=pri.getPrecio() >= preciomin && prop.tamaño().getDisp() && prop.getDisp() && prop. i < pri. if(prop.getDisp() && prop. if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin").comoCadena()). } } imprimir(conta + " departamento(s) encontrado(s)"). i++ ){ Propiedad prop=pri. } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso").obtener(i).tamaño().getPrecio() >= preciomin && prop. imprimir(). conta++. if(prop.area() >= areamin && prop.getDouble(txtPrecioMax).getPrecio()<= preciomax){ imprimir(prop.getPrecio() <= preciomax){ imprimir(prop.aCas.obtener(i). conta++.getSelectedIndex(). } } imprimir(conta + " casa(s) encontrada(s)").aCas.area() <= areamax){ imprimir(prop.comoCadena()).aDpt.getDouble(txtPrecioMin). for( int i = 0.

getPrecio() >= preciomin && prop. int conta = 0.aCas. int conta = 0. i++ ){ Propiedad prop=pri.comoCadena()).getDisp() && prop.obtener(i). if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin").getPrecio() <= preciomax){ imprimir(prop. i < pri. CIBERTEC CARRERAS PROFESIONALES . double preciomin = LibGUI. i++ ){ Propiedad prop=pri.aDpt.getDouble(txtPrecioMax). imprimir(). } } imprimir(conta + " casa(s) encontrada(s)"). conta++.getSelectedIndex().area() <= areamax && prop.getPrecio() >= preciomin && prop.ALGORITMOS Y ESTRUCTURA DE DATOS 179 public void buscar_area_precio(){ int indice=cboTipo.area() >= areamin && prop.getDisp() && prop.tamaño().area() <= areamax && prop. if( prop.aCas. double preciomax = LibGUI.getDouble(txtPrecioMin). } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso").getPrecio() <= preciomax){ imprimir(prop. } } imprimir(conta + " departamento(s) encontrado(s)").tamaño(). for( int i = 0.comoCadena()).getDouble(txtAreaMin).getDouble(txtAreaMax).obtener(i). if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin"). for( int i = 0.aDpt. double areamin = LibGUI. conta++. } } public void buscar_mas_caro(){ int indice=cboTipo. double areamax = LibGUI.getSelectedIndex(). i < pri.area() >= areamin && prop. imprimir(). if( prop.

180 for( int i = 0. i < pri. } } CARRERAS PROFESIONALES CIBERTEC .tamaño(). i < pri.getPrecio() == pri.getSelectedIndex().comoCadena()). } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso").getDisp() && prop.aCas. int conta = 0.obtener(i). i++ ){ Propiedad prop=pri.aCas. } } imprimir(conta + " casa(s) encontrada(s)").aDpt. } } imprimir(conta + " departamento(s) encontrado(s)"). for( int i = 0.getPrecio() == pri. imprimir().getPrecio() == pri.comoCadena()).aCas. } } public void buscar_mas_barato(){ int indice=cboTipo.precioMenor() ){ imprimir(prop. conta++.getDisp() && prop.aCas.obtener(i).aDpt. i < pri.precioMayor() ){ imprimir(prop.tamaño().aDpt. conta++. if(indice==0){ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin"). } } imprimir(conta + " casa(s) encontrada(s)").precioMayor() ){ imprimir(prop. for( int i = 0.aDpt. for( int i = 0. i++ ){ Propiedad prop=pri.comoCadena()).obtener(i). i++ ){ Propiedad prop=pri. if( prop. if( prop. i < pri. conta++.precioMenor() ){ imprimir(prop. if( prop. conta++. } else{ imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso").comoCadena()).getDisp() && prop.aCas.tamaño().aDpt.getPrecio() == pri.obtener(i). if( prop.getDisp() && prop.tamaño().aCas. i++ ){ Propiedad prop=pri.aDpt.

} } CIBERTEC CARRERAS PROFESIONALES .setText("").append(cad + "\n"). } public void imprimir(String cad){ txtS. } } public void imprimir(){ txtS.ALGORITMOS Y ESTRUCTURA DE DATOS 181 imprimir(conta + " departamento(s) encontrado(s)").