El pato y la Serpiente
-¿A qué animal dio el cielo los dones que me ha dado? Soy de agua, tierra y aire; cuando de andar me canso, si
se me antoja, vuelo; si se me antoja, nado.
Una serpiente astuta, que le estaba escuchando, le llamó con un silbido y le dijo:
-No hay que ser tan arrogante señor pato, pues ni anda como el ciervo, ni vuela como el halcón, ni nada como
el pez; y así tenga sabido que lo importante y raro no es entender de todo, sino ser diestro en algo.
De Tomás de Iriarte
Introducción
Para procesar información en un computador es necesario hacer una abstracción de los datos que
tomamos del mundo real, abstracción en el sentido de que se ignoran algunas propiedades
de los objetos reales, es decir, se simplifican. Se hace una selección de los datos más
representativos de la realidad a partir de los cuales pueda trabajar el computador para
obtener unos resultados.
Cualquier lenguaje suministra una serie de tipos de datos simples, como son los números enteros,
caracteres, números reales. En realidad suministra un subconjunto de éstos, pues la memoria del
ordenador es finita. Los punteros (si los tiene) son también un tipo de datos. El tamaño de todos
los tipos de datos depende de la máquina y del compilador sobre los que se trabaja.
Abstracción
Una abstracción es un proceso mental donde se extraen rasgos esenciales de algo para
representarlos por medio de un lenguaje gráfico o escrito.
Abstracción de datos
Técnica o metodología que permite diseñar estructuras de datos, permite representar bajo ciertos
lineamientos las características esenciales de las estructuras de datos.
Programación II 1
Lic. Peregrina Carazas
Definición de Estructuras de Datos
Una estructura de datos es cualquier colección de datos organizados de tal forma que tengan
asociados un conjunto de operaciones para poder manipularlos.
OPERACIONES
Lista de elementos Ordenar
Archivos (conjunto de registros) Buscar
Eliminar
Vector (conjunto de elementos)
Modificar
Registros Insertar
Desplegar
Al diseñar una estructura de datos con la técnica de abstracción pasa a ser un TDA, que:
Ejemplo:
En java los arreglos no solo deben ser declarados, sino también deben ser creados
Vector[0] Vector[10]
Programación II 2
Lic. Peregrina Carazas
A continuación vemos en la siguiente figura el TDA vector con sus diferentes operaciones
VECTOR
sumar
quitar
buscar
asignar
insertar
cambiar
Estructuras Fundamentales
Simples
Estructurados
Los datos simples ocupan sólo una casilla de memoria, por tanto una variable simple hace
referencia a un único valor a la vez.
Los datos Estructurados se caracterizan por el hecho de que con un nombre (identificador de
variable estructurada) se hace referencia a un grupo de casillas de memoria. Tiene varios
componentes.
Ejemplos:
Dato Simple
Declaramos una variable A de tipo entero y asignamos el valor 25.
A Identificador
int A; 25
A = 25;
Dato Estructurado
Declaramos un dato compuesto o estructurado A que tendrá 5 elementos de tipo
entero.
A Identificador
Int A[ ] = new int [5] ; 20 30 40 50 60
A = {20,30,40,50,60};
Programación II 3
Lic. Peregrina Carazas
Arreglos
Con frecuencia se presentan problemas cuya solución no resulta fácil de implementar (a veces es
imposible) si se utilizan datos simples.
A continuación se presentará un problema y dos posibles soluciones del mismo utilizando tipos
simples de datos. El objetivo de este ejemplo es ilustrar lo complejo que resulta un algoritmo de
solución para ciertos problemas, sin usar tipos estructurados de datos.
BEGIN
Integer I, CONT
Real AC, PROM, C
AC = 0; I = 1;
while ( I < = 50)
write (Introduzca la calificación del alumno )
read C;
AC = AC + C
I =I +1
endwhile
PROM = AC / 50;
CONT = 0; I = 1;
while ( I < = 50 )
write (“Introduzca la calificación del alumno “)
read C
if ( C > PROM )
then
CONT = CONT + 1;
endif
I =I +1;
enwhile
write(“el numero de alumnos cuya calificación es mayor al promedio son “, CONT)
END
Programación II 4
Lic. Peregrina Carazas
Esta solución, resuelve el problema planteado utilizando múltiples variables.
SEGUNDA SOLUCION
BEGIN
Integer CONT, C1,C2, C3, …, C50;
Real PROM, AC, C;
Write( “ introduzca la calificación del alumno 1 “)
Read C1;
Write( “ introduzca la calificación del alumno 2 “)
Read C2
.
.
Write( “ introduzca la calificación del alumno 50 “)
Read C50;
AC = C1 + C2 + … + C50;
PROM = AC / 50; CONT = 0;
If ( C1 > PROM ) then
CONT = CONT + 1;
endif
If ( C2 > PROM ) then
CONT = CONT + 1;
endif
.
.
If ( C50 > PROM ) then
CONT = CONT + 1;
endif
write( “el numero de alumnos cuya calificación es mayor al promedio son “)
write(CONT)
END
Se observa que ninguna de las dos soluciones resulta práctica ni eficiente. Es necesario un nuevo
tipo de datos que permita tratar estos problemas de una manera más adecuada. Los tipos de datos
estructurados que ayudan a resolver problemas como éste son los arreglos.
Programación II 5
Lic. Peregrina Carazas
BEGIN
Finita: Todo arreglo tiene un límite; es decir, debe determinarse cuál será el número máximo de
elementos que podrán formar parte del arreglo.
Homogénea: Todos los elementos del arreglo son del mismo tipo (todos enteros, todos voléanos,
etc. , pero nunca una combinación de distintos tipos)
componente
C= 30 50 70 60
1 2 3 … 50
Programación II 6
Lic. Peregrina Carazas
Identificador
Indice
Declaración de vectores
Ejemplo. En esta línea se declaran dos vectores de double, uno con 20 componentes y otro con
100:
Ejemplos:
Podemos inicializar todos los valores de un vector a cero con un bucle for:
Matrices
Una matriz es un arreglo de dos dimensiones, y para especificar cualquier elemento, debemos
hacer referencia a dos índices (que representan la posición como renglón y columna). Aunque no
Programación II 7
Lic. Peregrina Carazas
se justificará aquí, es conveniente mencionar que la representación matricial es puramente
conceptual y con el único fin de facilitar al programador el manejo de los elementos, ya que la
computadora almacena los datos en una forma totalmente diferente
• Java soporta hasta arreglos con 12 dimensiones. En arreglos de dos dimensiones, el primer
elemento representa el renglón y el segundo la columna.
donde:
• tipo puede ser cualquier tipo de dato (int, float, char, etc.).
• nombre_de_variable es el nombre del arreglo.
• rango 1 corresponde al número de renglones que conforman el arreglo.
• rango 2 corresponde al número de columnas.
X[3][5] = 20;
Las operaciones que pueden realizarse con arreglos bidimensionales son las siguientes:
• Lectura/escritura
• Asignación
• Actualización:
Inserción
Eliminación
Modificación
• Ordenación
Programación II 8
Lic. Peregrina Carazas
• Búsqueda
En general los arreglos bidimensionales son una generalización de los unidimensionales, por lo
que se realizará un ejemplo con algunas de estas operaciones a continuación.
Ejemplo: La Tabla contiene gastos que registra una ama de casa correspondientes a los 12
meses del año anterior.
Es posible interpretar esta tabla de la siguiente manera: dado un mes, se conocen los gastos
realizados por la ama de casa; y dado un gasto se conocen los gastos mensuales.
for ( i= 1 to m do)
for ( j=1 to g do)
endproc
Programación II 9
Lic. Peregrina Carazas
Proc Imprime_Gastos(G[][], m, g)
integer TotalGastos=0
BEGIN
DIM GASTOS[100][100]
Lee_Gastos (GASTOS, 12, 4)
Imprime_Gastos (GASTOS, 12,4)
Suma_Gastos(GASTOS, 12,4)
END
Matriz es un término matemático utilizado para definir un conjunto de elementos organizados por
medio de renglones y columnas, equivalente al término arreglo bidimensional utilizado en
computación.
Poco Densa indica una proporción muy alta de ceros entre los elementos de la matriz. Es decir
una matriz poco densa es aquella que tiene gran cantidad de elementos ceros.
Ejemplo:
La matriz A de 4 filas por 4 columnas, del total de elementos que es 16, solo 4 de ellos son
diferentes de cero.
Programación II 10
Lic. Peregrina Carazas
0 1 1 0
A= 0 0 1 0
0 1 0 0
0 1 0 0
Proc MatrizPdensa(G[][], m, g)
endfor
endfor
endproc
Proc Imprime(G[][], m, g)
Registros (Estructuras)
Cuando se habló de los arreglos se mencionó que se trataba de una colección de datos, todos del
mismo tipo, que era un tipo estructurado de datos, y que son ellos se podía solucionar un gran
número de problemas. Sin embargo, en la práctica a veces se necesitan estructuras que permitan
almacenar distintos tipos de datos (característica con la cual no cuentan los arreglos).
Ejemplo
Programación II 11
Lic. Peregrina Carazas
• Edad (entero)
• Sexo (carácter)
• Antigüedad (entero)
Nombre Direccion
Nom Pat Mat Calle Nro Zona Edad Sexo Antig
Juan Rodríguez Salas Av. Arce 123 Central 25 M 2
Maria Alvarez Vargas Calle 12 1345 Obrajes 29 F 3
Si se quisiera almacenar estos datos no sería posible usar un arreglo, ya que sus componentes
deben ser todos del mismo tipo.
Definición De Registro
Un registro es un dato estructurado, donde cado uno de sus componentes se denomina campo.
Los campos de un registro pueden ser todos de diferentes tipos. Cada campo se identifica por un
nombre único (el identificador de campo). No se establece orden entre los campos.
Un registro es un clase en Java es un grupo de campos, existen muchas formas de organizar los
registros la forma más común se denomina archivo secuencial.
Java no obliga a crear una estructura de registro, por tanto los programadores deben estructurar
estos a modo de satisfacer las necesidades de las aplicaciones.
Los archivos se abren creando objetos de las clases de flujos FileInputStream y FileOutputStream.
Programación II 12
Lic. Peregrina Carazas
El programa presenta un botón Guardar o Grabar el cual invocará a un método especifico que
permita almacenar el registro en el archivo, en este método cada campo del registro se escribe
individualmente con llamadas al métodos writeInt, writeUTF, writeDouble de la clase
DataOutputStream
Programación II 13
Lic. Peregrina Carazas
txtapellido.reshape (50, 155, 150, 20);
txtsemestre.reshape (50, 425, 100, 20);
txtcarrera.reshape (50, 225, 100, 20);
txtmatricula.reshape (50, 490, 100, 20);
txtdia.reshape (50, 290, 30, 20);
txtmes.reshape (90, 290, 30, 20);
txtano.reshape (130, 290, 40, 20);
txtobservacion.reshape (230, 115, 230, 20);
add (txtnombre);
add (txtapellido);
add (txtsemestre);
add (txtcarrera);
add (txtmatricula);
add (txtdia);
add (txtmes);
add (txtano);
add (txtobservacion);
R = new CheckboxGroup ();
a = new Checkbox ("si", R, true);
a.reshape (300, 455, 40, 15);
b = new Checkbox ("no", R, true);
b.reshape (300, 480, 40, 15);
add (a);
add (b);
lblnombre = new Label ("NOMBRE");
lblapellido = new Label ("APELLIDO");
lblsemestre = new Label ("SEMESTRE");
lblpago = new Label ("PAGO");
lblcarrera = new Label ("CARRERA");
lblmatricula = new Label ("MATRICULA");
lblfecha = new Label ("FECHA DE INSCRIPCION");
lblobservacion = new Label ("OBSERVACIONES");
lblnombre.reshape (55, 50, 80, 20);
lblapellido.reshape (55, 130, 80, 20);
lblsemestre.reshape (55, 400, 80, 20);
lblpago.reshape (300, 430, 40, 20);
lblcarrera.reshape (55, 200, 100, 20);
lblmatricula.reshape (55, 465, 80, 20);
lblfecha.reshape (55, 265, 150, 20);
lblobservacion.reshape (280, 80, 120, 20);
add (lblnombre);
add (lblapellido);
add (lblsemestre);
add (lblpago);
add (lblcarrera);
add (lblmatricula);
add (lblfecha);
add (lblobservacion);
btnregistrar = new Button ("ADICIONAR");
btnlistar = new Button ("MOSTRAR");
btnsalir = new Button ("SALIR");
btnbuscar = new Button ("BUSCAR");
btnregistrar.reshape (50, 550, 80, 30);
btnlistar.reshape (150, 550, 80, 30);
Programación II 14
Lic. Peregrina Carazas
btnsalir.reshape (370, 550, 80, 30);
btnbuscar.reshape (260, 550, 80, 30);
add (btnregistrar);
add (btnlistar);
add (btnsalir);
add (btnbuscar);
uno = new Choice ();
uno.addItem ("nuevo");
uno.addItem ("antiguo");
uno.addItem ("otros");
uno.reshape (300, 340, 100, 100);
add (uno);
resize (510, 600);
show ();
}
Programación II 15
Lic. Peregrina Carazas
{
txtestado = new TextField ("antiguo");
}
if (uno.getSelectedItem ().equals ("otros"))
{
txtestado = new TextField ("otros");
}
}
if (e.arg.equals ("SALIR"))
{
hide ();
}
if (e.arg.equals ("BUSCAR"))
{
busqueda asd = new busqueda ();
}
if (e.arg.equals ("ADICIONAR"))
{
if (txtnombre.getText ().equals ("") && txtapellido.getText ().equals ("") &&
txtsemestre.getText ().equals ("") && txtpago.getText ().equals ("") && txtcarrera.getText ().equals
("") && txtobservacion.getText ().equals ("") && txtdia.getText ().equals ("") && txtmes.getText
().equals ("") && txtano.getText ().equals ("") && txtmatricula.getText ().equals ("") &&
txtestado.getText ().equals (""))
{
return false;
}
DataOutputStream fos = null;
try
{
fos = new DataOutputStream (new FileOutputStream ("d:\\alumnos.dat"));
fos.writeUTF (txtnombre.getText ());
fos.writeUTF (txtapellido.getText ());
fos.writeUTF (txtsemestre.getText ());
fos.writeUTF (txtpago.getText ());
fos.writeUTF (txtcarrera.getText ());
fos.writeUTF (txtmatricula.getText ());
fos.writeInt (Integer.parseInt (txtdia.getText ()));
fos.writeInt (Integer.parseInt (txtmes.getText ()));
fos.writeInt (Integer.parseInt (txtano.getText ()));
fos.writeUTF (txtobservacion.getText ());
fos.writeUTF (txtestado.getText ());
fos.close ();
limpiar ();
}
catch (FileNotFoundException fnfe)
{
System.out.println ("no existe el archivo");
}
catch (IOException ioe)
{
System.out.println ("error");
}
}
if (e.arg.equals ("MOSTRAR"))
Programación II 16
Lic. Peregrina Carazas
{
lista a = new lista ();
}
return true;
}
Ejercicios Propuestos
4. Hallar la moda de los elementos de un vector de dimensión n (la moda es el valor que más
se repite)
5. Diseñe un programa que pida el valor de N números enteros distintos y los almacene en un
vector. Si se da el caso, el programa advertirá al usuario, tan pronto sea posible, si
introduce un número repetido y solicitará nuevamente el número hasta que sea diferente
de todos los anteriores. A continuación, el programa mostrará los N números por pantalla
Programación II 17
Lic. Peregrina Carazas
7. En un arreglo se ha almacenado el número total de toneladas de cereales cosechadas
durante cada mes del año anterior. Se desea la siguiente información:
ARREGLOS MULTIDIMENSIONALES
2 3 4 5 6
3 7 8 9 5
4 8 10 8 4
5 9 8 7 3
6 5 4 3 2
A 5 7 B 16 12
9 4 19 14
V 5 7 9 4 16 19 12 14
21 19
28 18
Programación II 18
Lic. Peregrina Carazas
ARCHIVOS
a) Venta de un producto: se deben actualizar los campos que correspondan, y verificar que la
nueva existencia no esté por debajo del mínimo. (datos: clave, cantidad_vendida)
b) Reabastecimientos de un producto: se deben actualizar los campos que correspondan.
(Datos: clave, cantidad comprada)
Programación II 19
Lic. Peregrina Carazas