Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmo y Estructura de Datos II MATER
Algoritmo y Estructura de Datos II MATER
SEMANA 01 a SEMANA 03
ARREGLO DE OBJETOS
CONCEPTOS BÁSICOS
Definición:
Los arreglos, conocidos también como arrays, son estructuras de datos que permiten almacenar
más de un dato del mismo tipo a la vez. Es decir, un arreglo contiene un conjunto de datos, todos
del mismo tipo. Un arreglo puede almacenar un conjunto limitado de datos. Cada dato
perteneciente al arreglo se almacena en una posición y puede ser mostrado, modificado o
eliminado.
Ventajas:
Los datos están almacenados en una sola estructura de datos siendo más fácil el acceso
a los mismos.
Se utiliza un único nombre (nombre del arreglo) para referirse al conjunto de datos
almacenados en el arreglo. Esto nos permite reducir el uso de variables y constantes.
Los arreglos permiten almacenar datos de entrada y datos utilizados durante el
procesamiento.
Al igual que otras estructuras de datos (como las variables y constantes), los arreglos
tienen un tiempo de vida, por lo que pueden ser considerados como globales o locales.
Desventajas:
Un arreglo no puede almacenar datos de diferente tipo. Se puede tener un arreglo de
números enteros, o un arreglo de cadenas, pero no se puede tener un arreglo que
contenga, por ejemplo, cadenas y números enteros a la vez.
Dependiendo del tipo de arreglo, unidimensional o bidimensional, se necesitará uno o dos
índices para acceder a los datos almacenados en el arreglo.
Antes de crear un arreglo es necesario conocer el número exacto de datos que se
necesitan almacenar (esto no es tan cierto ya que se pueden crear algoritmos que
permiten redimensionar los arreglos. También, existe una clase en Java, denominada
Vector, que pertenece al paquete java.util, que tiene métodos que permiten crear un
vector y redefinir su tamaño cada vez que sea necesario).
Pág. 2
ESTRUCTURA DE DATOS: Arreglo de objetos
Definición:
Los arreglos unidimensionales conocidos también como vectores o registros, son estructuras
de datos que permiten almacenar más de un dato del mismo tipo a la vez. Es decir, un vector
contiene un conjunto de datos, todos del mismo tipo, a los cuales se puede acceder a través de
un índice.
Representación gráfica:
nombre
X0 X1 X2 ... X i-1 i
0 1 2 ... i -1
Donde:
Declaración:
Para declarar un arreglo unidimensional es necesario, en primer lugar, definir un nombre. Para
definir un nombre de un arreglo unidimensional se siguen las mismas reglas utilizadas para la
definición de nombres de variables y constantes.
En segundo lugar, se debe determinar qué tipo de dato podrá almacenar el arreglo
unidimensional. Un arreglo unidimensional sólo puede almacenar datos del mismo tipo. Los tipos
Pág. 3
ESTRUCTURA DE DATOS: Arreglo de objetos
de datos válidos para declarar un arreglo unidimensional son los mismos tipos de datos válidos
definidos para declarar variables y constantes.
En Java:
TipoDeDato arreglo[ ] ;
TipoDeDato[ ] arreglo;
Donde TipoDeDato debe ser un tipo de arreglo o tipo de dato válido y arreglo es el nombre
del arreglo unidimensional (puede existir más de un arreglo, los cuales serán separados por
comas).
Para declarar un arreglo unidimensional se utiliza sólo un corchete de apertura y cierre “[ ]” al final
del nombre del arreglo.
En Java:
TipoDeDato[ ] arreglo ;
TipoDeDato[ ] arreglo;
Pág. 4
ESTRUCTURA DE DATOS: Arreglo de objetos
Creación:
Antes de crear un arreglo unidimensional se debe determinar cuál va ser el tamaño del mismo. Es
decir, cuál va a ser la cantidad total de datos que se podrá almacenar.
En Java:
CREAR arreglo[tamaño]
Donde TipoDeDato debe ser un tipo de arreglo unidimensional o tipo de dato válido y
arreglo es el nombre del arreglo.
El operador new nos permite crear un arreglo unidimensional. Cuando se crea un arreglo
unidimensional con el operador new, se debe indicar el tamaño, es decir cuántos datos podrá
almacenar.
Es importante mencionar que el tipo de dato utilizado para crear un arreglo unidimensional
deberá ser el mismo tipo de dato con el cual se declaró y que para crearlo es necesario
especificar un índice.
En Java, existe también una forma directa para declarar y crear arreglos unidimensionales,
utilizando el siguiente formato:
En Java:
Pág. 5
ESTRUCTURA DE DATOS: Arreglo de objetos
Donde TipoDeDato debe ser un tipo de arreglo unidimensional o tipo de dato válido y
arreglo es el nombre del arreglo unidimensional.
Utilizando este formato se declara y crea el arreglo unidimensional en forma directa (esto es
conocido como “Definición de un arreglo”).
Inicialización:
Generalmente, los arreglos numéricos (tipo NUMERO) se inicializan con cero (0), los arreglos
lógicos (tipo LOGICO) o booleanos se inicializan con false, los arreglos de caracteres con ‘0’ y los
arreglos de objetos con null.
Ingreso de datos:
Es necesario que se ingresen datos a todas las posiciones del arreglo unidimensional. Si no se
ingresan datos a todas las posiciones del arreglo unidimensional deberá asegurarse de
inicializarlo o en su defecto de mantener un adecuado control de las posiciones que tienen datos
almacenados y aquellas que no. Recuerde que tratar de acceder a una posición que no tiene un
dato o que no ha sido inicializada, produce un error que ocasiona que se interrumpa la ejecución
del programa.
Pág. 6
ESTRUCTURA DE DATOS: Arreglo de objetos
Definición:
Los arreglos bidimensionales conocidos también como matrices o tablas, son estructuras de
datos que permiten almacenar más de un dato del mismo tipo a la vez. Es decir, una matriz
contiene un conjunto de datos, todos del mismo tipo, a los cuales se puede acceder a través de
dos índices.
Representación gráfica:
nombre
Columnas
0 1 2 j-1
1 X 1,0
Filas 2 X 2,0
Donde:
Es importante indicar que para declarar, crear, inicializar e ingresar datos en un arreglo
bidimensional o matriz se siguen las mismas reglas definidas para los arreglos unidimensionales
o vectores. La diferencia radica en el número de índices que se utilizarán.
Pág. 7
ESTRUCTURA DE DATOS: Arreglo de objetos
ARREGLOS EN PARALELO
Introducción:
Cuando en una solución se utiliza más de un arreglo y el orden en que se disponen los datos
entre los arreglos tiene un significado, se les denomina vectores paralelos.
Ejemplos:
En la siguiente Gráfica de Estructura de Datos se utiliza una variable y dos vectores en forma
simultánea (en paralelo). En la variable (numTrab) se almacena el número de trabajadores y con
este valor se crean los dos vectores (los arreglos en paralelo deben tener el mismo tamaño). En
uno de los vectores (nombre[ ]) se almacenan los nombres de todos los trabajadores y en el otro
vector (sueldo[ ]) se almacenan sus respectivos sueldos. Se puede observar que un dato
almacenado en una posición de un vector está relacionado con el dato almacenado en la misma
posición del otro vector.
Pág. 8
ESTRUCTURA DE DATOS: Arreglo de objetos
nombre sueldo
0 “Danae” 1000
Datos del mismo
1
trabajador.
. .
: :
numTrab - 1
numTrab
(String) (double) ( int )
La pregunta lógica que se pueden formular sería la siguiente: ¿por qué en vez de crear dos
vectores en paralelo no creamos una matriz con dos columnas?, y la respuesta sería que en una
matriz solo se pueden almacenar datos del mismo tipo, mientras que usando dos vectores en
paralelo se pueden almacenar datos de diferente tipo. En el planteamiento de la solución anterior
en uno de los vectores se almacenan datos de tipo TEXTO mientras que en el otro vector se
almacenan datos de tipo NUMERO.
En la siguiente Gráfica de Estructura de Datos se utiliza una variable y tres vectores en forma
simultánea (en paralelo). En la variable (numSoc) se almacena el número de socios de un club y
con este valor se crean los tres vectores. En uno de los vectores (nombre[ ]) se almacenan los
nombres de los socios, en otro de los vectores (sexo[ ]) se almacena el sexo de cada uno de los
socios y en el tercer vector (edad[ ]) sus respectivas edades. Como ejemplo, se puede observar,
que todos los datos del socio Rodrigo están almacenados en la posición cero de los vectores en
paralelo.
Pág. 9
ESTRUCTURA DE DATOS: Arreglo de objetos
. . .
: : :
numSoc - 1
numSoc
Finalmente, en la siguiente Gráfica de Estructura de Datos se utiliza una variable, un vector y una
matriz con dos columnas en forma simultánea (en paralelo).
nombre precio
PC (0) PV (1)
. . .
: : :
numArt - 1
numArt
(String) (double) ( int )
PV = Precio de venta.
Pág. 10
ESTRUCTURA DE DATOS: Arreglo de objetos
Un arreglo de gran tamaño es aquel que se crea con una capacidad mayor a la cantidad de datos
que va a almacenar. Los arreglos de gran tamaño se utilizan cuando no se puede determinar
desde un inicio cuál debe ser el tamaño con el que se debe crear un arreglo. Observe la siguiente
Gráfica de Estructuras de Datos:
Dado el vector:
codigo
9999
numAlu = 0
(long) ( int )
En la gráfica mostrada se especifica que el vector codigo[ ] se creará con un tamaño de 1000.
Tamaño suficiente para poder almacenar todos los códigos de los alumnos de un salón de clase
(se supone que en un salón de clase no habrá tal cantidad de alumnos). Para manejar los datos
almacenados en un arreglo de gran tamaño se necesita una variable que indica el tamaño lógico
Pág. 11
ESTRUCTURA DE DATOS: Arreglo de objetos
del arreglo. En este caso, la variable numTrab nos indicará el total de códigos de alumnos que se
han almacenado en el vector en un determinado momento. Al inicio, el valor de la variable
numAlu deberá ser cero (esto significa que cuando se inicia la ejecución de la aplicación no se
tiene almacenado ningún código de alumno). Esto también puede ser aplicado en arreglos en
paralelo. Observe e interprete la siguiente Gráfica de Estructuras de Datos:
nombre sueldo
0 “Danae” 1000
. .
: :
99999
numTrab = 0
Pág. 12
ESTRUCTURA DE DATOS: Arreglo de objetos
ARREGLO DE OBJETOS
Definición:
Un arreglo de objetos es una estructura de datos que permiten almacenar objetos del mismo
tipo en lugar de almacenar datos simples. Es decir, un arreglo de objetos contiene un conjunto de
objetos, todos del mismo tipo, a los cuales se puede acceder utilizando uno o dos índices. Es
importante considerar que se podrá acceder a los datos almacenados en los objetos utilizando los
métodos definidos en su clase.
Representación gráfica:
“Danae”
1000.0
10
- setNombre ()
- getNombre ()
- setSueldo () datos
- getSueldo ()
- setCodigo () 10
- getCodigo ()
“Danae”
1000.0
0 1 2
( Empleado )
Pág. 13
ESTRUCTURA DE DATOS: Arreglo de objetos
Pág. 14
ESTRUCTURA DE DATOS: Arreglo de objetos
Problema 01
Desarrolle una solución que permita almacenar el código, nombre y sueldo de todos los
empleados de una empresa textil teniendo en cuenta el Diagrama de Clase y la Gráfica de
Estructura de Datos mostrados. También desarrolle los métodos para agregar datos, mostrar
datos y buscar datos en base al código del empleado. Utilice dos clases para el desarrollo de la
solución.
Diagrama de Clases:
Pág. 15
ESTRUCTURA DE DATOS: Arreglo de objetos
datos
numEmp = 0
(Empleado) ( int )
Donde:
Clase Empleado
package domPro;
public Empleado(){
codigo = 0;
nombre = null;
sueldo = 0;
}
Pág. 16
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase Empleado
Clase PrgEmpleado
package domApli;
import biblioteca.LE;
import domPro.Empleado;
public PrgEmpleado() {
datos = new Empleado[5];
numEmp = 0;
}
Pág. 17
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgEmpleado
double sueldo;
do {
codigo = LE.leerLong("Ingrese el código");
nombre = LE.leerString("Ingrese el nombre");
sueldo = LE.leerDouble("Ingrese el sueldo");
datos[numEmp] = objEmp;
numEmp++;
Pág. 18
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgEmpleado
do {
codigo = LE.leerLong ( “Ingrese el código” ) ;
nombre = LE.leerString ( “Ingrese el nombre” ) ;
sueldo = LE.leerDouble ( “Ingrese el sueldo” ) ;
Pág. 19
ESTRUCTURA DE DATOS: Arreglo de objetos
Primero, se solicitan los datos del empleado, los cuales se almacenan en las variables codigo,
nombre y sueldo. Imagínese que se ingresan los datos de un empleado que tiene código 10, su
nombre es “Juan José” y su sueldo es 1000.00.
…
codigo = LE.leerLong ( "Ingrese el código" ) ;
nombre = LE.leerString ( "Ingrese el nombre" ) ;
sueldo = LE.leerDouble ( "Ingrese el sueldo" ) ;
…
Empleado objEmp = new Empleado ( ) ;
…
Al crearse el objeto se ejecuta en forma automática el método constructor con el cual el objeto se
inicializa. La siguiente figura muestra una representación, en forma gráfica, de la creación del
objeto.
Pág. 20
ESTRUCTURA DE DATOS: Arreglo de objetos
Una vez creado el objeto objEmp se procede a almacenar los datos ingresados y almacenados
en las variables codigo, nombre y sueldo en el objeto objEmp. Para ello, utilizamos los métodos
setter, tal y como se muestra a continuación:
…
objEmp.setCodigo ( codigo ) ;
objEmp.setNombre ( nombre ) ;
objEmp.setSueldo ( sueldo ) ;
…
Ahora, el objeto objEmp contiene los datos ingresados, lo cual se representa en la figura
siguiente:
Pág. 21
ESTRUCTURA DE DATOS: Arreglo de objetos
datos
numEmp = 0
(Empleado) ( int )
…
datos [numEmp ] = objEmp ;
…
Finalmente, es necesario incrementar la variable numEmp con la finalidad que el próximo objeto
que se desee almacenar se almacene en la posición siguiente del arreglo.
Pág. 22
ESTRUCTURA DE DATOS: Arreglo de objetos
…
numEmp ++ ;
…
En resumen, para almacenar un objeto en un arreglo, hay que seguir los siguientes pasos:
objEmp.setCodigo ( codigo ) ;
objEmp.setNombre ( nombre ) ;
objEmp.setSueldo ( sueldo ) ;
numEmp ++ ;
Pág. 23
ESTRUCTURA DE DATOS: Arreglo de objetos
Es posible codificar y utilizar un segundo método constructor de la clase Empleado el cual reciba
los datos necesarios para inicializar los atributos del objeto creado. Para ello, modifique la clase
Empleado agregando el método constructor (cuando existe más de un método constructor en una
clase se denomina sobrecarga de métodos constructores) que se muestra a continuación:
Clase Empleado
package domPro ;
public class Empleado {
public Empleado ( ) {
codigo = 0 ;
nombre = null ;
sueldo = 0 ;
}
/* …
Incluir los métodos setter y getter
…
*/
Si se cuenta con un método constructor de la clase Empleado que reciba datos para que los
valores de los atributos sean inicializados se podría reducir las líneas de código utilizadas para
almacenar un objeto de la clase Empleado en el arreglo datos [ ]; y solo se utilizarían las
siguientes sentencias:
Pág. 24
ESTRUCTURA DE DATOS: Arreglo de objetos
do {
codigo = LE.leerLong ( “Ingrese el código” ) ;
nombre = LE.leerString ( “Ingrese el nombre” ) ;
sueldo = LE.leerDouble ( “Ingrese el sueldo” ) ;
Ahora, para poder mostrar los datos almacenados en un arreglo de objetos es necesario utilizar
los métodos getter. Imagínese que se han ingresado los códigos, nombres y sueldos de tres
empleados los cuales se muestran en la siguiente Gráfica de estructura de Datos:
datos
codigo = 10
0 nombre = “Juan José”
sueldo = 1000.00
codigo = 20
1 nombre = “Carmen”
sueldo = 2000.00
codigo = 30
2 nombre = “Danae”
sueldo = 3500.00
numEmp = 3
(Empleado) ( int )
Pág. 25
ESTRUCTURA DE DATOS: Arreglo de objetos
Si deseo recuperar el código del empleado almacenado en la posición 1 del arreglo de objetos
datos [ ] debería utilizar la siguiente sentencia:
…
int codigo = datos [ 1 ].getCodigo ( ) ;
…
Especifica la
posición del arreglo
Si se desea recuperar todos los datos almacenados en el arreglo se podrá utilizar la estructura de
repetición for, tal y como se emplea en el método mostrarDatos( ) de la clase PrgEmpleado.
Finalmente, intente modificar la aplicación anterior e incluya un método que permita aumentar el
tamaño del arreglo, un método que permite ordenar por código los datos, un método para eliminar
datos y otro para modificar datos. También incluya un método menu( ) desde el cual se puedan
ejecutar los métodos creados.
Tenga presente que si incluye un método que permita eliminar datos (eliminarDatos ( )) y un
método que permita modificar datos (modificarDatos ( )) el criterio de búsqueda de datos será a
través del código el cual deberá ser único (los códigos no se pueden repetir). Para ello, deberá
crear un método que permita buscar un código (buscarCodigo ( )) y devuelva un valor -1 si el
código no es encontrado o un valor igual a la posición del arreglo donde fue encontrado el código.
De ser este el caso, el método ingresarDatos ( ) y el método mostrarDatosEmpleado ( ) deberán
modificarse para que puedan utilizar el método de búsqueda creado.
Pág. 26
ESTRUCTURA DE DATOS: Arreglo de objetos
Problema 02
Desarrolle una solución que permita almacenar el código, nombre y la nota final de todos los
alumnos de un salón de clase teniendo en cuenta el Diagrama de Clase y la Gráfica de Estructura
de Datos mostrados. También desarrolle todos los métodos necesarios para actualizar y controlar
los datos almacenados. Utilice 2 clases para el desarrollo de la solución.
Diagrama de Clases:
Pág. 27
ESTRUCTURA DE DATOS: Arreglo de objetos
datos
numAlu = 0
(Alumno) ( int )
Donde:
Clase Alumno
package domPro;
Pág. 28
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase Alumno
this.codigo = codigo;
}
Clase PrgAlumno
package domApli;
import java.awt.Color;
import biblioteca.LE;
import domPro.Alumno;
public PrgAlumno() {
datos = new Alumno[5];
numAlu = 0;
}
Pág. 29
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
do {
opc = LE.leerInt(opciones);
switch (opc) {
case 1:
ingresarDatos();
acceso = true;
opciones = opciones2;
break;
case 2:
if (acceso) {
mostrarDatos();
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
case 3:
if (acceso) {
mostrarDatosAlumno();
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
Pág. 30
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
case 4:
if (acceso) {
modificarDatos();
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
case 5:
if (acceso) {
eliminarDatos();
if (numAlu == 0) {
acceso = false;
opciones = opciones1;
}
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
case 6:
if (acceso) {
ordenarDatos();
mostrarDatos();
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
case 0:
break;
default:
LE.mostrarError("La opción ingresada no es válida");
}
} while (opc != 0);
Pág. 31
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
do {
if (datos.length == numAlu) {
aumentar();
}
do {
codigo = LE.leerLong("Ingrese el código del alumno");
pos = buscarCodigo(codigo);
if (pos != -1) {
LE.mostrarInformacion("El código ingresado ya existe!.., verifique\n\n");
}
datos[numAlu] = objAlu;
numAlu++;
Pág. 32
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
if (rpta == 0) {
String nombre = LE.leerString("Ingrese el nombre del alumno");
double nota = LE.leerDouble("Ingrese la nota del alumno");
datos[pos].setNombre(nombre);
datos[pos].setNota(nota);
}
} else {
LE.mostrarInformacion("El código del alumno no existe");
}
}
if (rpta == 0) {
Pág. 33
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
} else {
LE.mostrarInformacion("El código del alumno no existe");
}
}
}
return -1;
}
Pág. 34
ESTRUCTURA DE DATOS: Arreglo de objetos
Pág. 35
ESTRUCTURA DE DATOS: Arreglo de objetos
Problema 03
Desarrolle una solución que permita almacenar el código, nombre y sueldo de todos los
empleados de una empresa textil teniendo en cuenta el Diagrama de Clase y la Gráfica de
Estructura de Datos mostrados. También desarrolle los métodos para agregar datos, mostrar
datos y buscar datos en base al código del empleado. Utilice 3 clases para el desarrollo de la
solución (MVC).
Diagrama de Clases:
Pág. 36
ESTRUCTURA DE DATOS: Arreglo de objetos
datos
numEmp = 0
(Empleado) ( int )
Donde:
Clase Empleado
package modelo;
public Empleado(){
codigo = 0;
nombre = null;
sueldo = 0;
}
Pág. 37
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase Empleado
this.nombre = nombre;
this.sueldo = sueldo;
Clase ArregloEmpleado
package controlador;
import modelo.Empleado;
public ArregloEmpleado() {
numEmp = 0;
datos = new Empleado[5];
}
Pág. 38
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase ArregloEmpleado
public int agregarDatos(long codigo, String nombre, double sueldo) {
int pos = buscarCodigo(codigo);
if (pos != -1) {
return -1;
} else {
if (numEmp == datos.length) {
aumentar();
}
Empleado objEmp = new Empleado(codigo, nombre, sueldo);
datos[numEmp] = objEmp;
numEmp++;
return 0;
}
}
Pág. 39
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase ArregloEmpleado
}
Clase PrgEmpleado
package vista;
import biblioteca.LE;
import controlador.ArregloEmpleado;
ArregloEmpleado objArray;
public PrgEmpleado() {
objArray = new ArregloEmpleado();
}
do {
codigo = LE.leerLong("Ingrese el código");
nombre = LE.leerString("Ingrese el nombre");
sueldo = LE.leerDouble("Ingrese el sueldo");
Pág. 40
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgEmpleado
if (listaDatos != "") {
if (listaDatos != "") {
LE.mostrarInformacion("Datos del Empleado\n\n" + listaDatos);
} else {
LE.mostrarInformacion("Código de empleado no existe");
}
}
public ArregloEmpleado() {
numEmp = 0;
datos = new Empleado[5];
}
Pág. 41
ESTRUCTURA DE DATOS: Arreglo de objetos
Reflexione las implicancias de declarar al atributo datos [ ] sin el modificador de acceso public.
Por otro lado, es importante mencionar sobre la necesidad de aumentar el tamaño del arreglo de
objetos cuando se ingresen más datos de los que se pueden almacenar. Analice la modificación
en el método agregarDatos ( ) y la codificación del método aumentar ( ).
if (pos != -1) {
return -1;
} else {
if (numEmp == datos.length) {
aumentar();
}
Empleado objEmp = new Empleado(codigo, nombre, sueldo);
datos[numEmp] = objEmp;
numEmp++;
return 0;
}
}
Cada vez que se ingresen más datos de los que se pueden almacenar se ejecutará él método
aumentar ( ) para permitir el ingresar y almacenamiento de los datos de cinco empleados más. El
Pág. 42
ESTRUCTURA DE DATOS: Arreglo de objetos
método aumentar ( ) también puede ser codificado utilizando el método ArrayCopy de la clase
System de Java.
Pág. 43
ESTRUCTURA DE DATOS: Arreglo de objetos
Una pregunte que sería importante formularse estaría referida a la forma en que se podría o
debería utilizarse los métodos modificarDatos ( ), eliminarDatos ( ) y ordenarDatos ( ) desde la
clase PrgEmpleado. ¿Cuál es su opinión al respecto?
Pág. 44
ESTRUCTURA DE DATOS: Arreglo de objetos
Problema 04
Desarrolle una solución que permita almacenar el código, nombre y la nota final de todos los
alumnos de un salón de clase teniendo en cuenta el Diagrama de Clase y la Gráfica de Estructura
de Datos mostrados. También, desarrolle todos los métodos necesarios para actualizar y
controlar los datos almacenados. Utilice 3 clases para el desarrollo de la solución (MVC).
Diagrama de Paquetes:
biblioteca
Pág. 45
ESTRUCTURA DE DATOS: Arreglo de objetos
Diagrama de clases:
datos
numAlu = 0
(Alumno) ( int )
Donde:
Pág. 46
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase Alumno
package modelo;
public Alumno(){
codigo = 0;
nombre = null;
nota = 0;
}
Pág. 47
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase ArregloAlumno
package controlador;
import modelo.Alumno;
public ArregloAlumno() {
numAlu = 0;
datos = new Alumno[5];
}
Pág. 48
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase ArregloAlumno
+ datos[i].getNota();
return listaDatos;
}
}
return listaDatos;
}
datos[pos].setNombre(nombre);
datos[pos].setNota(nota);
}
Pág. 49
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase ArregloAlumno
Clase PrgAlumno
package vista;
import java.awt.Color;
import biblioteca.LE;
import controlador.ArregloAlumno;
ArregloAlumno objArray;
public PrgAlumno() {
objArray = new ArregloAlumno();
}
Pág. 50
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
do {
opc = LE.leerInt(opciones);
switch (opc) {
case 1:
ingresarDatos();
acceso = true;
opciones = opciones2;
break;
case 2:
if (acceso) {
mostrarDatos();
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
case 3:
if (acceso) {
mostrarDatosAlumno();
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
case 4:
if (acceso) {
modificarDatos();
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
Pág. 51
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
case 5:
if (acceso) {
eliminarDatos();
if (objArray.getNumAlu() == 0) {
acceso = false;
opciones = opciones1;
}
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
case 6:
if (acceso) {
ordenarDatos();
mostrarDatos();
} else {
LE.mostrarError("La opción ingresada no es válida");
}
break;
case 0:
break;
default:
LE.mostrarError("La opción ingresada no es válida");
}
} while (opc != 0);
do {
codigo = LE.leerLong("Ingrese el código");
nombre = LE.leerString("Ingrese el nombre");
nota = LE.leerDouble("Ingrese la nota");
Pág. 52
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
if (listaDatos != "") {
LE.mostrarInformacion("Datos de los alumnos","Código Nombre
Notas",listaDatos, "Ok", Color.cyan);
} else {
LE.mostrarInformacion("No existen datos registrados");
}
}
if (listaDatos != "") {
LE.mostrarInformacion("Datos del alumno\n" + listaDatos);
} else {
LE.mostrarInformacion("Código de alumno no existe");
}
}
if (rpta == 0) {
String nombre = LE.leerString("Ingrese el nombre del alumno");
double nota = LE.leerDouble("Ingrese la nota del alumno");
objArray.modificarDatos(pos, nombre, nota);
}
} else {
LE.mostrarInformacion("El código del alumno no existe");
}
}
Pág. 53
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase PrgAlumno
if (rpta == 0) {
objArray.eliminarDatos(pos);
}
} else {
LE.mostrarInformacion("El código del alumno no existe");
}
}
Pág. 54
ESTRUCTURA DE DATOS: Arreglo de objetos
Problema 05
Resultado Deseado:
Almacenar y manipular los datos de los empleados de una empresa.
Datos Necesarios:
Código, nombre y sueldo de los empleados.
Procesamiento:
Se ingresarán los datos de los empleados y se almacenarán en un arreglo de objetos. Se
desarrollarán métodos para poder manipular los datos almacenados.
swing
(from javax)
event
biblioteca
(from java)
Pág. 55
ESTRUCTURA DE DATOS: Arreglo de objetos
Diagrama de Clases:
Pág. 56
ESTRUCTURA DE DATOS: Arreglo de objetos
datos
numEmp = 0
(Empleado) ( int )
Donde:
Clase Empleado
package modelo;
public Empleado() {
codigo = 0;
nombre = "";
sueldo = 0;
}
Pág. 57
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase Empleado
Clase ArregloEmpleado
package controlador;
import modelo.Empleado;
public ArregloEmpleado() {
Pág. 58
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase ArregloEmpleado
numEmp = 0;
datos = new Empleado[5];
}
if (numEmp == datos.length) {
aumentar();
}
Pág. 59
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase ArregloEmpleado
Pág. 60
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase GUIEmpleado
package vista;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import controlador.ArregloEmpleado;
import biblioteca.LE;
ArregloEmpleado objArray;
public GUIEmpleado() {
// Creo el objeto
objArray = new ArregloEmpleado();
// Construcción de la GUI
getContentPane().setLayout(null);
// Etiqueta lblTitulo
lblTitulo = new JLabel("DATOS DE EMPLEADOS");
lblTitulo.setBounds(50, 20, 200, 30);
getContentPane().add(lblTitulo);
// Etiqueta lblCodigo
lblNombre = new JLabel("Codigo :");
lblNombre.setBounds(50, 60, 50, 30);
getContentPane().add(lblNombre);
// Etiqueta lblNombre
lblNombre = new JLabel("Nombre :");
lblNombre.setBounds(50, 85, 60, 30);
getContentPane().add(lblNombre);
Pág. 61
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase GUIEmpleado
// Etiqueta lblSueldos
lblSueldo = new JLabel("Sueldo :");
lblSueldo.setBounds(50, 110, 50, 30);
getContentPane().add(lblSueldo);
// Etiqueta txtCodigo
txtCodigo = new JTextField();
txtCodigo.setBounds(110, 65, 50, 20);
getContentPane().add(txtCodigo);
// Etiqueta txtNombre
txtNombre = new JTextField();
txtNombre.setBounds(110, 90, 100, 20);
getContentPane().add(txtNombre);
// Etiqueta txtSueldo
txtSueldo = new JTextField();
txtSueldo.setBounds(110, 115, 50, 20);
getContentPane().add(txtSueldo);
// Boton Agregar
btnAgregar = new JButton("Agregar");
btnAgregar.setBounds(370, 65, 130, 25);
btnAgregar.addActionListener(this);
getContentPane().add(btnAgregar);
// Boton Mostrar
btnMostrar = new JButton("Mostrar");
btnMostrar.setBounds(370, 90, 130, 25);
btnMostrar.addActionListener(this);
getContentPane().add(btnMostrar);
// Boton Eliminar
btnEliminar = new JButton("Eliminar");
btnEliminar.setBounds(370, 115, 130, 25);
btnEliminar.addActionListener(this);
getContentPane().add(btnEliminar);
// Boton Ordenar
btnOrdenar = new JButton("Ordenar Codigo");
btnOrdenar.setBounds(370, 140, 130, 25);
btnOrdenar.addActionListener(this);
getContentPane().add(btnOrdenar);
Pág. 62
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase GUIEmpleado
// Boton Buscar
btnBuscar = new JButton("Buscar");
btnBuscar.setBounds(370, 165, 130, 25);
btnBuscar.addActionListener(this);
getContentPane().add(btnBuscar);
this.addWindowListener(this);
this.setTitle("Empresa TALENTOS");
this.setSize(550, 400);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
if (e.getSource() == btnAgregar) {
// Evalua si hay datos en los txtArea
if (txtCodigo.getText().equalsIgnoreCase("")
|| txtNombre.getText().equalsIgnoreCase("")
|| txtSueldo.getText().equalsIgnoreCase("")) {
LE.mostrarError("Ingrese los datos solicitados!");
} else {
if (respuesta == -1) {
LE.mostrarError("El código ingresado ya existe");
}
limpiarCajas();
txaResultados.setText("");
}
Pág. 63
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase GUIEmpleado
if (e.getSource() == btnMostrar) {
mostrarDatos();
}
if (e.getSource() == btnEliminar) {
long codigo = LE.leerLong("Ingrese el código del empleado cuyos datos deseas
eliminar");
if (e.getSource() == btnOrdenar) {
objArray.ordenarDatos();
mostrarDatos();
}
if (e.getSource() == btnBuscar) {
long codigo = LE.leerLong("Ingrese código para buscar");
String listaDatos = objArray.obtenerDatosEmpleado(codigo);
if (listaDatos == null) {
LE.mostrarInformacion("Código no encontrado");
} else {
txaResultados.setText("");
txaResultados.append(listaDatos);
}
}
}
Pág. 64
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase GUIEmpleado
Pág. 65
ESTRUCTURA DE DATOS: Arreglo de objetos
Problema 06
Implemente una Interfaz Gráfica de Usuario (GUI) utilizando componentes del paquete java.awt
para la clase PrgArreglo, la cual se denominará FrmArreglo y estará almacenada en el paquete
gui de tal forma que se pueda utilizar todos los métodos creados para la clase Arreglo.
Pág. 66
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
package gui;
import java.awt.Frame;
import java.awt.Dimension;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.Label;
import java.awt.TextField;
import java.awt.ScrollPane;
import java.awt.TextArea;
import java.awt.Button;
import java.awt.Dialog;
import javax.swing.JOptionPane;
import javax.swing.text.AbstractDocument.LeafElement;
import java.awt.BorderLayout;
import java.awt.SystemColor;
import domApli.Arreglo;
import biblioteca.LE;
Pág. 67
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
public FrmArreglo( ) {
super ( );
initialize( );
}
this.setLayout(null);
this.setSize(607, 437);
this.setBackground(SystemColor.desktop);
this.setTitle("FrmArreglo");
this.add(lblCodigo, null);
this.add(lblNombre, null);
this.add(lblSueldo, null);
this.add(getTxtCodigo(), null);
this.add(getTxtNombre(), null);
this.add(getTxtSueldo(), null);
this.add(getTxASalida(), null);
this.add(getBtnIngresar(), null);
this.add(getBtnMostrar(), null);
this.add(getBtnOrdenar(), null);
this.add(getBtnModificar(), null);
this.add(getBtnEliminar(), null);
this.add(getBtnSalir(), null);
this.add(getBtnBuscar(), null);
}
Pág. 68
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
if ( txtCodigo == null) {
txtCodigo = new TextField ( );
txtCodigo.setBounds(new Rectangle(127, 70, 174, 23));
}
return txtCodigo;
}
if (txtNombre == null) {
txtNombre = new TextField ( );
txtNombre.setBounds(new Rectangle(127, 105, 174,
23));
}
return txtNombre;
}
if (txtSueldo == null) {
txtSueldo = new TextField ( );
txtSueldo.setBounds(new Rectangle(127, 140, 174, 23));
}
return txtSueldo;
}
if ( txASalida == null ) {
txASalida = new TextArea ( );
txASalida.setBounds(new Rectangle(49, 185, 377, 212));
}
return txASalida;
}
if (btnIngresar == null) {
btnIngresar = new Button ( );
btnIngresar.setBounds(new Rectangle(466, 76, 98, 35));
btnIngresar.setLabel("Ingresar");
btnIngresar.addActionListener(new
java.awt.event.ActionListener() {
Pág. 69
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
if (btnMostrar == null) {
btnMostrar = new Button ( );
btnMostrar.setBounds(new Rectangle(466, 123, 98, 35));
btnMostrar.setLabel("Mostrar");
btnMostrar.addActionListener(new
java.awt.event.ActionListener() {
if (btnOrdenar == null) {
btnOrdenar = new Button ( );
btnOrdenar.setBounds(new Rectangle(466, 217, 98,
35));
btnOrdenar.setLabel("Ordenar");
btnOrdenar.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
ordenar();
}
});
}
return btnOrdenar;
}
Pág. 70
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
if (btnModificar == null) {
btnModificar = new Button ( );
btnModificar.setBounds(new Rectangle(466, 264, 98,
35));
btnModificar.setLabel("Modificar");
btnModificar.addActionListener(new
java.awt.event.ActionListener() {
if (btnBuscar == null) {
btnBuscar = new Button ( );
btnBuscar.setLabel("Buscar");
btnBuscar.setBounds(new Rectangle(466, 170, 98, 35));
btnBuscar.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
e) {
buscar();
}
});
}
return btnBuscar;
}
if (btnEliminar == null) {
btnEliminar = new Button ( );
btnEliminar.setBounds(new Rectangle(466, 311, 98,
35));
btnEliminar.setLabel("Eliminar");
btnEliminar.addActionListener(new
java.awt.event.ActionListener() {
Pág. 71
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
void ingresar( ){
void mostrar( ){
txASalida.setText("Código Nombre
Sueldo\n"+objA.mostrarDatos());
}
void buscar( ){
Pág. 72
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
if ( pos > 0 ) {
LE.mostrarInformacion ( "Empleado
"+objA.objE[pos].getNombre()+ "\n Sueldo: "
+objA.objE[pos].getSueldo()) ;
mostrar();
} else {
LE.mostrarInformacion ("Código de empleado no existe") ;
}
}
void ordenar( ){
objA.ordenarXCodigo();
void modificar(){
int cod=LE.leerInt("Ingresa el codigo a modificar:");
int pos=objA.buscarXCodigo(cod);
if ( pos > 0 ) {
String nombreTemp= LE.leerString("Ingresa nuevo
nombre:");
mostrar();
} else {
LE.mostrarError("El código a modificar no existe") ;
}
void eliminar( ){
int cod=LE.leerInt("Ingresa el codigo a eliminar:");
int pos=objA.buscarXCodigo(cod);
if ( pos > 0 ) {
objA.eliminarDatos(pos);
mostrar();
} else {
Pág. 73
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
void salir(){
System.exit(0);
}
void limpiar(){
txtCodigo.setText("");
txtNombre.setText("");
txtSueldo.setText("");
txtCodigo.requestFocus();
}
}
Pág. 74
ESTRUCTURA DE DATOS: Arreglo de objetos
Problema 07
Pág. 75
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
package gui;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JTextField;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import javax.swing.border.TitledBorder;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JTextArea;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import java.awt.event.KeyEvent;
import javax.swing.JScrollPane;
import domApli.Arreglo;
import javax.swing.JOptionPane;
Pág. 76
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
public FrmArreglo ( ) {
super( );
initialize( );
}
txtNombre.setBorder(BorderFactory.createTitledBorder(null,
"Ingrese nombre:",TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, new Font("Dialog",
Font.BOLD, 12), new Color(51, 51, 51)));
}
return txtNombre;
}
Pág. 77
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
Pág. 78
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
pnlBotones.add(getBtnBuscar(), null);
pnlBotones.add(getBtnOrdenar(), null);
pnlBotones.add(getBtnModificar(), null);
pnlBotones.add(getBtnEliminar(), null);
pnlBotones.add(getBtnSalir(), null);
}
return pnlBotones;
}
Pág. 79
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
Pág. 80
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
return btnModificar;
}
Pág. 81
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
}
return jScrollPane;
}
void ingresar ( ){
int codigo= Integer.parseInt(txtCodigo.getText( ) );
String nombre = txtNombre.getText( );
double sueldo= Double.parseDouble(txtSueldo.getText( ));
void mostrar ( ){
txASalida.setText("Código Nombre
Sueldo\n"+objA.mostrarDatos( ));
}
void buscar ( ){
int cod=Integer.parseInt(op.showInputDialog("Ingresa el código a
buscar"));
int pos=objA.buscarXCodigo(cod);
if ( pos >= 0 ) {
op.showMessageDialog(this, "Empleado
"+objA.objE[pos].getNombre( )+ "\n Sueldo: "
+objA.objE[pos].getSueldo( ));
mostrar( );
} else {
op.showMessageDialog(this, "Código de empleado no existe") ;
}
}
void ordenar ( ){
objA.ordenarXCodigo( );
}
Pág. 82
ESTRUCTURA DE DATOS: Arreglo de objetos
Clase FrmArreglo
void modificar ( ){
int cod=Integer.parseInt(op.showInputDialog("Ingresa el código a
modificar"));
int pos=objA.buscarXCodigo(cod);
if ( pos >= 0 ) {
String nombreTemp= LE.leerString("Ingresa nuevo
nombre:");
double sueldoTemp= LE.leerDouble("Ingresa nuevo
sueldo:");
objA.modificarDatos(pos,nombreTemp,sueldoTemp);
mostrar();
} else {
op.showMessageDialog(this, "El código a modificar no
existe");
}
}
void eliminar ( ){
int cod=Integer.parseInt(op.showInputDialog("Ingresa el codigo a
eliminar:"));
int pos=objA.buscarXCodigo(cod);
if ( pos >= 0 ) {
objA.eliminarDatos(pos);
mostrar();
} else {
op.showMessageDialog(this,"El código a eliminar no
existe") ;
}
}
void salir ( ){
System.exit(0);
}
void limpiar ( ){
txtCodigo.setText("");
txtNombre.setText("");
txtSueldo.setText("");
txtCodigo.requestFocus();
}
Pág. 83