Documente Academic
Documente Profesional
Documente Cultură
Estructura de datos.
En computacin, una estructura de datos es una manera organizada de almacenar
informacin (datos) en un computador de modo que puedan ser usados de una forma
eficiente.
Una seleccin cuidadosa de la estructura permitir
usar un algoritmo ms eficiente.
Una estructura bien diseada permitir efectuar
una variedad de operaciones, usando un mnimo de
tiempo de ejecucin y espacio de memoria. A la
derecha se muestran los tipos de datos mas
utilizados.
Declaracin y Definicion.
Utilizando un lenguaje formal, se puede decir que una declaracin es una sentencia o
instruccin que introduce un nombre de variable (identificador) en un programa. A partir de
ese momento se dice que esa variable existe" dentro del programa.
Tipo se refiere al dato que van a ser almacenado (int, float, char, etc).
Computacin
Dimension.
Existen arreglos de 1,2,3, , n dimensiones. La
forma general de la declaracin de un arreglo de
ms de una dimensin es:
Pseudoc
Tipo NombreArreglo[T1, T2, T n]
C++
C++
int CEDULA[12];
float NOTAS[12][3];
Computacin
REFERENCIAS.Una vez que se declara un arreglo en un programa empieza a "existir" como una estructura
de datos, por lo que podemos comenzar a utilizarlo o a hacer referencias a l dentro de las
instrucciones del programa. Podemos leerlo, mostrarlo, copiarlo, modificar uno, dos o todos
sus elementos, etc. Para hacer una referencia a un arreglo se usa el siguiente formato:
NombreArreglo[ Indice ]
Donde:
NombreArreglo corresponde al identificador con el cual fue declarado
el arreglo.
Indice corresponde a la posicin de un elemento dentro del arreglo.
Este valor puede ser una constante de tipo entero, una variable de tipo
entero o inclusive una expresin que al evaluarse produce un resultado
de tipo entero.
El valor del ndice no puede ser mayor al tamao del arreglo porque se
estara intentando referenciar un elemento fuera de la estructura.
En C++ el ndice comienza en 0 por lo tanto en el arreglo
CEDULA
los elementos van de CEDULA[0] a CEDULA[11]. C++ no controla los
lmites del arreglo, es el programador quien debe incluir las
instrucciones necesarias dentro del programa para que no haya
desbordamiento.
Ejemplo:
CEDULA[6]
CEDULA[I]
CEDULA[2*I+1]
Computacin
Donde:
Indice1 corresponde a la FILA del elemento referenciado.
Indice2 corresponde
referenciado.
la
COLUMNA
del
elemento
Ejemplo:
NOTAS[6][1]
NOTAS[I][J]
n=3
i=2, j=3
P=3*(21)+3=6
NOTAS[2,3] del
Computacin
cout<<sizeof(NOTAS);
se muestra en pantalla el valor 144, ya que el arreglo tiene 36 elementos y cada elemento
ocupa 4 bytes, si se desea mostrar la cantidad de elementos que tiene el arreglo se hace:
cout<<sizeof(NOTAS)/ sizeof(float);
Cadenas de Caracteres.Un tipo muy comn de datos es el texto (tipo char) el cual se usa normalmente en
paquetes o bloques (Nombres, Direcciones, Mensajes, etc) por lo que se requiere una
estructura para almacenarlo. Un vector tipo char permite almacenar un mensaje por
ejemplo:
1
1
0
1
1
1
2
1
3
14
Si se desea almacenar nombres por ejemplo, existe una amplia variedad de longitudes,
como por ejemplo, Ana Paz o Francisco Fernndez; y como es necesario especificar el
tamao para declarar el arreglo, entonces se coloca un tamao estimado, por ejemplo
NOMBRE[20];
1 2 3 4 5 6 7 8 9
A N A
1
0
P A Z & % 4
1
1
V
1
2
K
1
3
?
1
4
#
1
5
@
1
6
)
1
7
1
8
8
1
9
2
0
(
El espacio reservado se ocupa con un nombre, ANA PAZ por ejemplo, y el resto queda con
cualquier cosa &%4VK?....., que no es til. Para facilitar el manejo de la informacin
almacenada de esta manera se agrega una separacin entre la informacin que es til y la
que no lo es, esta separacin es el fin de cadena, un carcter especial que se escribe '\0'.
1 2 3 4 5 6 7 8
A N A
P A Z \
0
1
0
% 4
1
1
V
1
2
K
1
3
?
1
4
#
1
5
@
1
6
)
1
7
1
8
8
1
9
2
0
(
10
&
\
0
L
2
3
F
J
R
U
A
A
N
N
C
A
C
)
\0
8
I
\
0
A
\
0
S
@
\
0
Computacin
LISTA[5][10] es una estructura de dos dimensiones donde el primer ndice representa las
filas o cantidad de elementos de la lista y el segundo ndice representa el ancho mximo o
cantidad mxima de caracteres que debe tener cada nombre, incluyendo el fin de cadena.
R 2. Asignacin
3.
ecorrido
Lectura /
Escritura
4.
Ordenacin
Bsqueda.
RECORRIDO
Para utilizar la informacin almacenada en arreglos
es necesario recorrer el arreglo. El recorrido puede
incluir todo o parte del arreglo. La operacin se
realiza usando estructuras cclicas, relacionando
variables de control con los ndices del arreglo. De
esta manera se pueden hacer acciones (leer,
mostrar, asignar valores, etc) sobre los elementos
referenciados con el indice I.
repetir_desde(I=1,I<=N,I=I+1)
Accin sobre ARREGLO[I]
fin_repetir_desde
void main(void)
{ int P[10],I ;
for(I=0 ;I<10 ;I++ )
{ Accion_sobre sobre P[I];
}
}
void main(void)
{ int P[10],I ;
I=0;
while(I<10)
{ Accion_sobre sobre P[I];
I++;
}
}
void main(void)
{ int P[10],I ;
I=0;
do
{ Accion_sobre sobre P[I];
I++;
Computacin
}while(I<10) ;
Recorrido caso dos dimensiones.El recorrido de un arreglo de dos dimensiones tiene ms posibilidades. Un arreglo declarado
como int A[3][3]; se podra recorrer por filas, por columnas o por diagonales, como se
muestra en la figura de la pagina siguiente. Estas no son las nicas posibilidades, y al igual
del caso unidimensional el diseo del recorrido depende del enunciado del problema.
El recorrido de un arreglo de dos dimensiones
requiere el uso de un lazo doble (anidado).
repetir_desde(I=1,I<= N,I=I+1)
repetir_desde(J=1,J<=M,J=J+1)
Accion_sobre A[I,J]
fin_repetir_desde
fin_repetir_desde
A[I][J]
A[1][1]
repetir_desde(J=1,J<=M,J=J+1)
Accion_sobre A[I,J]
fin_repetir_desde
fin_repetir_desde
A[1][2]
A[1][3]
N=FILAS
M=COLUMNAS
A[2][1]
repetir_desde(I=1,I<=N,I=I+1)
Accion_sobre A[I,J]
fin_repetir_desde
fin_repetir_desde
N=COLUMNAS
M=FILAS
A[2][2]
A[2][3]
A[3][1]
A[3][1]
A[3][3]
for(I=0;I<FILAS;I++)
{ for(J=0;J<COLUMNAS;J++)
{
Accion_sobre A[I,J]
}
}
A[I][J]
A[1]
[1]
A[2]
[1]
A[3]
[1]
A[1]
[2]
A[2]
[2]
A[3]
[2]
A[1]
[3]
A[2]
[3]
A[3]
[3]
for(I=0;I<COLUMNAS;I++)
{ for(J=0;J<FILAS;J++)
{
Accion_sobre A[J,I]
}
}
Computacin
float A[6];
A[0]=10.8; A[1]=12; A[2]=17.5;
A[3]=15.1; A[4]=14; A[5]=16;
8
repetir_desde(i=1,i<=10,i=i+1)
B[i] = 0
fin_ repetir_desde
car nombre[15]
nombre[1]='C'; nombre[2]='A'; nombre[3]='R';
nombre[4]='M'; nombre[5]='E'; nombre[6]='N';
nombre[7]='\0';
En pseudocdigo: nombre="CARMEN"
En C++: strcpy(nombre,"CARMEN")
strcpy funcin de la librera <string.h>
repetir_desde(i=1, i<=10,i=i+1)
A[i] = 0
fin_ repetir_desde
lo que devuelve una funcin
repetir_desde(i=1, i<=10,i=i+1)
A[i] = 2*i+i^2
fin_ repetir_desde
valor leido del teclado
repetir_desde(i=1, i<=10,i=i+1)
A[i] = random(10)
fin_ repetir_desde
repetir_desde(i=1, i<=10,i=i+1)
leer (A[i])
fin_ repetir_desde
Si se desea asignar valores a todos los elementos de un vector, se debe recorrer el vector y
efectuar la operacin de asignacin con cada uno de los elementos del vector.
repetir_desde(i=1, i<=5,i=i+1)
A[i] = 6
fin_repetir_desde
INICIALIZACION DE ARREGLOS.C permite la inicializacin de arreglos al momento de declararlos usando la forma general:
Tipo NombreArreglo [T1][T2][Tn]={Lista_de_valores};
La lista de valores es una lista de constantes separadas por comas cuyo tipo debe ser
compatible con el Tipo definido para el arreglo.
float NOTAS[6]={10.8,12,17.5,15.1,14,16};
1
2 3
4
5 6
Esto es equivalente a hacer:
float NOTAS[6];
NOTAS[0]=10.8; NOTAS[1]=12; NOTAS[2]=17.5; NOTAS[3]=15.1; NOTAS[4]=14; NOTAS[5]=16;
Computacin
Esta permitido, solo en la declaracin, dejar en blanco el tamao del arreglo en el momento
de la inicializacion. El tamao se asigna automticamente a la cantidad de elementos
inicializados
int A[ ]={1,8,8,9,4,3,2,5,4,7};
Las siguientes declaraciones muestran como inicializar una cadena de caracteres
char
char
char
char
RIO[12]="ORINOCO";
RIO[12]={'O','R','I','N','O','C','O'};
RIO[12]={'O','R','I','N','O','C','O','\0'};
RIO[ ]="ORINOCO";
//Arreglo de caracteres
//Cadena de caracteres
//cadena de caracteres
Es importante diferenciar el uso de las comillas simples (') y las comillas dobles ("). La
comilla simple se usa cuando se maneja UN SOLO CARCTER, como por ejemplo 'A', 'L', 'm'.
Cuando se quiere especificar una cadena de caracteres se usa comilla doble por ejemplo
"ORINOCO".
'A'
"A"
En C++
leer(NombreArreglo[indice])
mostrar(NombreArreglo[indice])
cin>> NombreArreglo[indice];
cout<< NombreArreglo[indice];
Ejemplo 1:
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
void main()
{
int A[6],C[6],i;
int B[6]={2,3,6,77,12,8};
for(i=0;i<6;i++)
{
cin>>A[i];
C[i]=random(100);
}
for(i=0;i<6;i++)
{
cout<<setw(3)<<A[i]
<<setw(3)<<B[i]
<<setw(3)<<C[i]<<endl;
}
getch();
Computacin
10
Ejemplo 2:
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
{ char RIO[12],MAYOR12];
int I,LARGO,MAX=0;
for(I=0;I<=5;I++)
{ cin>>RIO; cin>>LARGO;
if(LARGO>MAX)
{ MAX=LARGO;
strcpy(MAYOR,RIO);
}
}
cout<<"Rio mas largo: "<<MAYOR;
getch();
}
strcpy(MAYOR,RIO);
Ejemplo 3:
El ejemplo 3 muestra dos programas en los que se utilizan arreglos de dos dimensiones. El
de la izquierda lee/ muestra un arreglo A[3][5] de tipo entero. En este caso se debe recorrer
el arreglo completo utilizando dos estructuras cclicas anidadas. En el programa de la
derecha se lee una lista de rios (5), con una longitud mxima de 12 caracteres para cada
cadena. En este caso a pesar de que RIOS es un arreglo bidimensional, no es necesario leer
cada elemento, como en el caso numrico de la izquierda, ya que se lee cada cadena
completa.
void main()
{
int A[3][5],i,j;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++
{
cin>>A[i][j];
}
}
for(i=0;i<3;i++)
{
for(j=0;j<5;j++
{
cout>>A[i][j];
}
}
getch();
}
void main()
{
char RIOS[5][12];
for(i=0;i<5;i++)
{
cin>>RIOS[i];
}
for(i=0;i<5;i++)
{
cout>>RIOS[i];
}
getch();
}
Computacin
11
Bsqueda secuencial
Suponemos una lista (vector) de elementos, donde no hay elementos repetidos, la forma
mas sencilla de buscar un elemento especifico es recorriendo la lista y verificando si existe
alguna coincidencia entre los elementos de la lista y el elemento buscado. Si existe el
elemento se muestra un mensaje Fin de bsqueda", en caso contrario mostrar Elemento
No Existe".
Ejemplo: Se desea buscar una cedula en una lista (100 valores), si se encuentra se
muestra un mensaje indicando que esta existe, en caso contrario se muestra un mensaje
indicando que existe. Se supone que no hay elementos repetidos.
Anlisis.- Se requiere recorrer toda la lista y preguntar si cada elemento de la lista es el
que estamos buscando. Se requiere un ciclo con contador (I desde 1 hasta 100) y una
estructura de decisin para confirmar la condicin del elemento buscado.
Diseo del algoritmo.El algoritmo de la izquierda muestra un mensaje indicando que la cedula existe y muestra su posicin
dentro de la lista. Si la cedula no existe el algoritmo no dice nada.
algoritmo bsqueda_secuencial
inicio
entero LISTA[100],I,B
repetir_desde I = 1 hasta I = 100
leer(LISTA[I])
fin_repetir_desde
leer (B)
repetir_desde(I=1, I<=100,I=I+1)
si LISTA(I) = B
mostrar(CEDULA EXISTE")
mostrar(Posicin = , I)
fin_si
fin_repetir_desde
fin
Para indicar cuando la cedula no existe", se
debe usar una variable tipo switch (flag),
como se muestra a la derecha:
Este algoritmo puede ser mejorado ya que, en
el anterior, aunque el encuentre el elemento
buscado sigue recorriendo la lista. Una forma
de evitar esto es usando un ciclo con
condicin.
Cuando se encuentra el elemento buscado se
interrumpe el ciclo de bsqueda y se
muestran los resultados.
algoritmo bsqueda_secuencial1
inicio
entero LISTA[100], I, B, flag
repetir_desde(I=1, I<=100,I=I+1)
leer(LISTA[I])
algoritmo bsqueda_secuencial
inicio
entero LISTA[100], I, B, flag
repetir_desde I = 1 hasta I = 100
leer(LISTA[I])
fin_repetir_desde
leer (B), flag = 0
// Cedula NO EXISTE
repetir_desde(I=1, I<=100,I=I+1)
si LISTA(I) = B
mostrar(CEDULA EXISTE")
mostrar(I = , I)
flag = 1
// Cedula SI EXISTE
fin_si
fin_repetir_desde
si flag = 0 entonces
mostrar(Cedula NO EXISTE")
fin_si
fin
leer (B)
I =1
repetir_mientras(I <= 100 && LISTA[I] != B)
I =I+1
fin_repetir_mientras
si LISTA(I) = B entonces
mostrar(CEDULA EXISTE")
mostrar(I = , I)
flag = 1
// Cedula SI EXISTE
si_no
mostrar(Cedula NO EXISTE")
fin_si
fin
Computacin
12
fin_repetir_desde
Bsqueda Menor / Mayor.El problema planteado es buscar el elemento menor/mayor de un conjunto de elementos
almacenados en un arreglo. Por ejemplo, buscar el elemento mayor del vector A mostrado:
A(1)
A(2)
A(3)
A(4)
A(5)
algoritmo Bsqueda_Mayor
inicio
entero I, MAYOR, A [5]
repetir_desde(I=1, I<=5,I=I+1)
Leer (A[I])
fin_repetir_desde
I=1
MAYOR = A [I]
repetir_mientras I <= 5
si A[I] > MAYOR
MAYOR = A[I]
Fin_si
I=I+1
fin_repetir_mientras
mostrar(El valor Mayor es: , MAYOR)
fin
A(1)
5
A(2)
6
A(3)
3
A(4)
2
A(5)
1
algoritmo ordenar_burbuja
inicio
entero A[5], I, J, aux, N
N=5
repetir_desde(I=1, I<=N,I=I+1)
leer (A [I])
fin_repetir_desde
repetir_desde(I=1, I<=N-1,I=I+1)
repetir_desde(J=1,J<=N-1,J=J+1)
si A[J] > A[J+1]
aux = A[J]
A[J] = A[J+1]
A[J+1] = aux
fin_si
fin_repetir_desde
fin_repetir_desde
fin
Computacin
13
El algoritmo
disminuyendo
necesarios:
se puede
el nmero
modificar
de ciclos
repetir_desde(I=1, I<=N-1,I=I+1)
repetir_desde(J=1,J<=N-I,J=J+1)
si A[J] > A[J+1]
aux = A[J]
A[J] = A[J+1]
A[J+1] = aux
fin_si
fin_repetir_desde
fin_repetir_desde