Вы находитесь на странице: 1из 8

Estructuras de Datos

Una estructura de datos es una colección de datos que pueden ser caracterizados por su organización y las
operaciones que se definen en ella.

Tipos de datos usados por los lenguajes de programación


Datos Simples Estándar Entero (int)
(o primitivos significan que no Real (float)
están compuestos de otras Carácter (char)
estructuras de datos) Lógico (boolean)

Definido por el programador (no estándar) Subrango (subrange- en Lenguaje C no


existen)
Enumerados (enum)
Datos Estructurados Estáticos Arrays (vectores/matrices)
(están construidos basados (el tamaño ocupado en memoria se define Registros (struct)
en tipos de datos primitivos) antes de que el programa se ejecute y no Archivos
puede modificarse dicho tamaño durante la Conjuntos
ejecución del programa) Cadenas (string)

Dinámicos Listas (pilas/colas)


Listas enlazadas
(no tienen las limitaciones o restricciones en
el tamaño de memoria) Árboles
Grafos
 Las estructuras de datos dinámicas emplean un tipo de datos específico, denominado puntero.
 Una característica importante que diferencia a los tipos de datos es que los tipos de datos simples tienen como
característica común que cada variable representa a un elemento; los tipos de datos estructurados tienen como
característica común que un identificador (nombre) puede representar múltiples datos individuales, pudiendo cada uno de
éstos ser referenciado independientemente.

DATOS SIMPLES DEFINIDOS POR EL PROGRAMADOR


DATOS SUBRANGO
Es aquel que puede tomar por valor uno de los pertenecientes a un subrango definido por el programador. Por
ejemplo, suponiendo que se han definido el siguiente conjunto de valores enteros:

{ -32768, -32767, ..., -1, 0, 1, ..., 32766, 32767 }

Los valores mínimo y máximo de ese rango son los números -32768 y 32767, respectivamente. Pues bien, un
subrango es un subconjunto de valores de un rango. posibles subrangos son:

{ 1, 2, 3, 4, 5, 6 } / { 0, 1, 2, ..., 8, 9, 10 } / { -10, -9, -8, -7 } / { 1240, 1241, 1243, ..., 2999, 3000, 3001 }

no pertenecen los siguientes subrangos:

{ 0, 1, 2, ... 34998, 34999, 35000 } / { -50000, -49999, -49998, ..., 49998, 49999, 50000 }

Como se puede observar, el conjunto de valores de un subrango también está comprendido entre un valor mínimo
y un valor máximo. Además, en el subrango tienen que estar todos los elementos que están en el rango entre
ambos valores.

DATOS ENUMERADOS
En programación, un dato de un tipo enumerado es aquel que puede tomar por valor uno de los pertenecientes a
una lista ordenada de valores definida por el programador, en la cual se asocia nombres a números,

Pseudocodigo:
Enumerado <tipo> {<constante_1>[=valor_1], {<constante_2>[=valor_2], … {<constante_n>[=valor_n]}

Lenguaje C++
enum tipo_enumerado{
<definición de nombres de constantes enteras>
}; // donde tipo_enumerado es un identificador que nombra al nuevo tipo definido.
Ing. Omar Velandia – SubProyecto Algoritmos y Programación I – UNELLEZ Municipalizada
Estructuras de Datos

El siguiente ejemplo declara una variable llamada color del tipo enumerado colores, la cual puede tomar cualquier
valor especificado en la lista.
enum colores{azul, amarillo, rojo, verde, blanco, negro};
colores color;
color = azul;
Cada identificador de la lista de constantes en una enumeración, tiene asociado un valor. Por defecto, el primer
identificador tiene asociado el valor ―0, el siguiente el valor ―1 y así sucesivamente, de tal forma que:
color = verde; es equivalente a color = 3;

Ejemplo
// Decalaración de tipos enumerados
#include <iostream>
using namespace std;
int main()
{
enum TipoFigura {Cuadro, Triangulo, Circulo};
TipoFigura Figura; //Definimos Figura de tipo enumerado TipoFigura
Figura = Circulo;

switch (Figura) {
case Cuadro: cout << "Actividades para Cuadros"; break;
case Triangulo: cout << "Actividades para Triángulo"; break;
case Circulo: cout << "Actividades para Círculo"; break;
default: cout << "Función no implementada"; break;
}

//Revisamos el valor predeterminado que asigna el compilador a los enumeradores


cout << endl<< endl << "Valor de Cuadro: " << Cuadro << endl;
cout << "Valor de Triangulo: " << Triangulo << endl;
cout << "Valor de Circulo: " << Circulo << endl;
system(“pause”);
return 0;
}

DATOS ESTRUCTURADOS
ARRAYS o ARREGLOS
Un arreglo es un conjunto finito y ordenado de elementos homogéneos.
 Finito: porque todo arreglo tiene un límite, es decir, debe determinarse cual será el número máximo n de
elementos que podrán formar parte del arreglo.
 Ordenado: porque cada elemento se localiza por medio de un índice que va de 0 a n-1 (en C++). Otros
lenguajes de programación usan la notación de 1 a n.
 Homogéneo: porque todos los elementos de un arreglo son del mismo tipo (todos enteros, todos de punto
flotante, etc.), pero nunca combinaciones entre distintos tipos.

Vectores
El tipo más simple de array es el array unidimensional o vector (matriz de una dimensión). Un vector de una
dimensión denominado NOMBRES que consta de n elementos se puede representar como sigue:

Nombre (1) Nombre(2) ... Nombre(I) ... Nombre(N)

Sintaxis:
<tipo> <nombre> [ <tamaño> ];
El nombre del arreglo sirve para hacer referencia a él en el programa. Para hacer referencia a alguno de sus
elementos se usa, además del nombre, un índice (entre corchetes) que es un número entero correspondiente al
lugar que ocupa cada elemento en el arreglo.

Ing. Omar Velandia – SubProyecto Algoritmos y Programación I – UNELLEZ Municipalizada


Estructuras de Datos

Por ejemplo, un arreglo de enteros llamado EDADES con 8 elementos se declara como: int edades [ 8 ];

Ejemplos:
Un vector llamado Enteros que almacenará 10 enteros: int Enteros[10];
Un arreglo llamado Reales que almacenará 5 Valores de tipo doublé: double Reales[5];
Un vector llamado Caracteres‖ que almacenará 11 caracteres: char Caracteres[11];
Un arreglo llamado Clase que almacenará calificaciones de 25: estudiantes de tipo float: float Clase[25];

Las tres operaciones básicas con los arreglos son:


 Pedir los datos de un arreglo.
 Recorrer un arreglo para trabajar con sus datos.
 Desplegar en pantalla los datos del arreglo.

Pedir los datos de un arreglo


Pedir los datos del arreglo: float Clase[25]; Pedir los datos del arreglo: double Datos[300];

for( int i = 0; i < 25; i++ ){ for( int i = 0; i < 300; i++ ){
cout << “\n Clase[ ” << i << “ ]=?”; cout << “\n Datos[ ” << i << “ ]=?”;
cin >> Clase[ i ]; cin >> Datos[ i ];
}; };

Mostrar en pantalla datos de un arreglo Recorrer un arreglo para trabajar con sus datos.
// Recorrido de arreglos ArregloRecorre.cpp //programa que saca el promedio de 5 calificaciones
#include <iostream> //promedio.cpp
using namespace std; #include <iostream>
int main() { using namespace std;
int edades[8]; int main() {
for( int i = 0; i < 8; i++ ){ float calif[5], suma=0, promedio;
cout << " cual es la edad numero " << i+1 << "?"; // pedir los datos
cin >> edades[ i ]; for( int j = 0; j < 5; j++ ){
}; cout << "introduce el elemento" << j+1;
for( int i = 0; i < 8; i++ ){ cin >> calif[ j ];
cout << " edades[ " << i << "]= "<< edades[ i ] << endl; };
}; //obtener el promedio
return 0; for( int i = 0; i < 5; i++ )
} suma = suma + calif[ i ];
promedio = suma / 5;
cout << "el promedio es " << promedio << endl;
system ("pause");
return 0;
}
Es importante hacer notar la diferencia entre el i-ésimo elemento del arreglo y el elemento con subíndice i en el
arreglo. El i-ésimo elemento de un arreglo tiene subíndice i-1(para C++).
Por ejemplo: el tercer elemento del arreglo EDADES, edades[2]: Elemento 3.

Ing. Omar Velandia – SubProyecto Algoritmos y Programación I – UNELLEZ Municipalizada


Estructuras de Datos

Ejemplos con pseudocódigo


Este ejemplo procesa un vector, realizando las Este ejemplo ejecuta la Lectura de veinte valores
siguientes operaciones; a) lectura del vector, b) cálculo enteros de un vector.
de la suma de los valores del vector, c) cálculo de la
media de los valores. algoritmo leer_vector
tipo
algoritmo media_puntos array[1..20] de entero : FINAL
const var
LIMITE = 40 FINAL : F
tipo Entero: i
array[1..LIMITE] de real : PUNTUACION inicio
var para (i ← 1, i<20, 1++) hacer
PUNTUACION : PUNTOS leer(F[i])
real : suma, media fin_para
entero : i fin
inicio
suma ← 0
escribir('Datos del array')
para (i ← 1, i<LIMITE, i++) hacer
leer(PUNTOS[i])
suma ← suma + PUNTOS[i]
fin_desde
media ← suma / LIMITE
escribir('La media es', media)
fin

Matrices
También llamado array bidimensional es un conjunto de elementos, todos del mismo tipo, en el cual el orden de los
componentes es significativo y en el que se necesita especificar dos subíndices para poder identificar cada
elemento del array.

En esta representación tenemos una matriz de dimensión MxN, donde M es el número de columnas y N el número
de filas, donde M=4 y N=4, por lo tanto el número total de elementos de la matriz es 4x4, es decir 16 posiciones
para utilizar.

Una vez que le hallamos asignado datos a la matriz, notaremos que para referirnos a alguno de sus elementos
tendremos que conocer en que fila y en que columna residen.

matEjemplo(1,1) “Lunes”
matEjemplo(1,3) “Fuente”
matEjemplo(3,2) 5000
matEjemplo(4,4) “Ultimo”

Ing. Omar Velandia – SubProyecto Algoritmos y Programación I – UNELLEZ Municipalizada


Estructuras de Datos

Además de cargar los valores de manera independiente, al igual que en los vectores, utilizaremos estructuras de
control repetitivas para recorrer las matrices.

En este ejemplo la variable ifila comienza con


el valor 1, luego se da inicio al bucle icolumna
desde 1 hasta 4, el cual debe terminar su
recorrido para que comience el siguiente valor
de la fila.

Declarar una matriz en C++ es muy similar a la de un vector, se deben seguir las mismas normas para declarar
una variable pero una vez más con un pequeño cambio en la sintaxis, la cual es la siguiente:

tipoDato nombreMatriz[filas][columnas];

Declaración de una matriz en C++


int myMatriz1[10][5]; Esta línea contiene la declaración de una matriz llamada myMatriz1 que tendrá 10 filas y 5
columnas y cada una de las 50 casillas tendrá datos de tipo entero.
float myMatriz2[5][10]; Esta línea contiene la declaración de una matriz llamada myMatriz2 que tendrá 5 filas y 10
columnas y cada una de las 50 casillas tendrá datos de tipo flotante.
string myMatriz3[15][15]; Esta línea contiene la declaración de una matriz llamada myMatriz3 que tendrá 15 filas y 15
columnas (una matriz cuadrada) y cada una de las 225 casillas tendrá datos de tipo string.
bool myMatriz4[1000][3]; Esta línea contiene la declaración de una matriz llamada myMatriz4 que tendrá 1000 filas (sí,
leíste bien) y 3 columnas y cada una de las 3000 casillas (también leíste bien, tres mil casillas)
tendrá datos de tipo booleano.

int myMatriz1[2][2] = {{1,2},{3,4}}; aquí hemos declarado una matriz de tipo int de dos filas y dos columnas y la
hemos inicializado con diferentes valores. El valor inicial corresponde a la casilla 0,0 (fila cero, columna cero) y
tiene el valor de 1, en la fila cero columna uno tenemos el valor de 2, en la fila uno columna cero el valor de 3 y
finalmente en la fila uno columna uno el valor de 4. Es importante notar que el primer tanto la fila como la columna
comienzan desde cero y no desde uno, por esto la primer casilla corresponde a la fila y columna cero.

Para obtener el valor de una casilla especifica se hace uso de los corchetes, pero esta vez no para declarar
tamaños (porque eso ya lo hicimos) sino para indicar posiciones (fila y columna).

int myMatriz1[2][2] = {{1,2},{1,1}}; //Matriz con 4 elementos


int fila1Casilla1 = myMatriz[1][1]; //Para acceder a la casilla 1,1 se usan dichos índices
int primerNumero = myMatriz[0][0]; //La primer casilla siempre será la siempre será la de la fila 0 columna 0

Para obtener todos los datos que se encuentran al interior de una matriz, debemos acceder a cada posición y esto
se hace fácilmente con dos ciclos for (anidados). La lógica de este procedimiento es la siguiente, el primer ciclo for
comenzará desde cero e ira hasta el número de filas, de modo que la variable de control que generalmente
llamamos "i", será la que va a ir variando entre cero y el tamaño del array, de esta forma al poner la i al interior de
los corchetes, estaremos accediendo al valor de cada fila y el segundo ciclo irá de cero al número de columnas y
normalmente se usa la variable llamada j para acceder a cada columna.

Ing. Omar Velandia – SubProyecto Algoritmos y Programación I – UNELLEZ Municipalizada


Estructuras de Datos

En el siguiente código uso una forma sencilla y rápida de obtener la cantidad o número de filas de una matriz y
también cómo obtener el número o cantidad de columnas de una matriz. Ten en cuenta que esto es importante,
pues a veces no tenemos la certeza del tamaño de la matriz.
Línea 7: declaración de una matriz que contiene las
#include <iostream> edades de tres parejas de personas y asignamos cada
uno de los valores.
using namespace std; Líneas 8 y 9: En estas líneas, tenemos la declaración del
número de filas y columnas de la matriz, que serán el
límite del primer y segundo ciclo, respectivamente.
int main() Líneas 10 a 13: ciclo for que comienza en cero y termina
{ en el número de filas y luego tenemos otro ciclo for
int edades[3][2] = {{1,2},{9,8},{14,21}}; (anidado) que irá de cero hasta el número de columnas
int filas = (sizeof(edades)/sizeof(edades[0])); (es importante notar que la condición usada en ambos
int columnas = (sizeof(edades[0])/sizeof(edades[0][0])); ciclos es estrictamente menor "<" y no menor o igual
for (int i = 0; i < filas; i++) "<="), al interior del segundo ciclo, es donde accedemos a
{ cada una de las casillas de la matriz usando los
for (int j = 0; j < columnas; j++) corchetes.
Línea 14: en esta línea, estamos accediendo a cada una
{ de las casillas de la matriz, fila por fila y columna por
cout<<edades[i][j]<<endl; columna. Accedemos a cada elemento poniendo entre los
} corchetes la variable i y j, que son las que están
} cambiando a medida que los ciclos van "girando", así
} estaremos accediendo a todos los elementos e
imprimiéndolos por pantalla por medio de cout.

Crear un programa con el cual podamos guardar los títulos y los autores de diferentes libros sin perder ninguno de
ellos. El usuario es el encargado de suministrar la información de cada libro. Vamos a suponer que el usuario solo
podrá ingresar un máximo de 5 libros, para así tener un tamaño de vector fijo.

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
En este código, debido a que tenemos la completa certeza de
using namespace std; sólo usar dos columnas, no es necesario usar otro ciclo for
(de hecho, eso complicaría todo) basta con poner de manera
int main() explícita que el valor del título va en la columna cero y el del
{ autor en la columna uno.
string libros[5][2]; En este caso tenemos una matriz con una cantidad de fila que
cout << "ingrese la siguiente información de los Libros: \n"; dependen de la cantidad de libros y dos columnas. Para el
string titulo ,autor; ejemplo, decidimos tener 5 posibles libros. Donde cada uno
for(int i = 0; i < 5; i++) tendrá su respectivo título y autor. Así entonces, en la
{ columna cero (0) iría el titulo y en la columna uno (1) el autor.
cout << "\n******* Libro " << i + 1 << "********:\n"; Por cada libro que queremos agregar, debemos especificar su
cout << "Titulo: "; título y su autor. Por ello, la segunda posición que se
getline(cin,titulo); especifica en esta matriz de libros siempre será 0 o 1, según
cout << "Autor: "; sea el caso. Mientras que en la primera posición usamos la
getline(cin,autor); variable i del ciclo, que va a variar de 0 a 4, para un total de
libros[i][0] = titulo; cinco libros.
libros[i][1] = autor;
}

return 0;
}

Compilado con Geany 1.27

El operador sizeof
Sirve para calcular el tamaño en bytes de un tipo de dato, ya sea un entero, un char, un arreglo etc. Su sintaxis es
sizeof(dato)

Ing. Omar Velandia – SubProyecto Algoritmos y Programación I – UNELLEZ Municipalizada


Estructuras de Datos

CADENAS
Una cadena en C++ es un conjunto de caracteres, o valores de tipo "char", terminados con el carácter nulo.
Internamente se almacenan en posiciones consecutivas de memoria en forma de arreglo, por lo que no son más
que un es un array unidimensional de caracteres. En cada elemento del array se almacena un carácter de la
cadena y a continuación del último carácter se añade un elemento más que contiene el carácter nulo, el cual sirve
como indicador de fin de cadena.

char c[10]={'M','a','r','t','e','s','\0'}; En este caso hemos indicado que el tamaño es 10 pero solo hemos
proporcionado 7 caracteres. Los tres elementos restantes tomarán un valor indeterminado.

Los arrays de caracteres en C/C++ son de tamaño fijo y longitud variable. Esto significa que cuando
declaramos un array de caracteres tendremos que indicar el tamaño máximo del array o sea el número de
caracteres máximo que tendrá la cadena de caracteres más el carácter nulo. Pero esto no significa que este array
no se pueda utilizar para contener una cadena más corta. El array seguirá teniendo un tamaño fijo pero su longitud
será el de la cadena que contiene en cada momento.

Como una cadena se implementa en C++ como un array de caracteres, podemos leer por teclado carácter a
carácter utilizando el método get y asignar valores como los demás arrays, elemento a elemento.
Ejemplo de lectura de cadena de caracteres elemento a elemento:

#include <iostream>
using namespace std;
int main(void)
{
char cadena[10];
int i;
for(i=0;i<9;i++) // máximo 9 caracteres
cin.get(cadena[i]); // se lee por teclado un carácter y
// se guarda en el array
cadena[i]='\0'; // debemos añadir el nulo al final
cout << "Ha escrito: " << cadena << endl;
system("pause");
}

Debemos asegurarnos de que las cadenas creadas carácter a carácter acaban con el carácter nulo. En el ejemplo,
la cadena se ha declarado con un tamaño máximo de 10 caracteres por lo que solo se podrán guardar 9 caracteres
ya que el último se debe reservar al carácter nulo.

También podemos asignar una cadena completa a un array de caracteres utilizando el método getline.
cin.getline(cadena, num, carácter_final);

cadena es el array donde vamos a almacenar los caracteres.


getline lee una serie de caracteres desde el flujo de entrada y los almacena en la variable cadena. Se leen
caracteres hasta el final del flujo, hasta el primer carácter que coincide con el carácter_final especificado, el cual
se desecha ó hasta que se han leído num-1 caracteres.
getline añade el carácter nulo (\0) al final de la cadena extraída.
Utilizando getline para leer por teclado la cadena del ejemplo anterior escribiremos la instrucción:
cin.getline(cadena, 10, '\n');

El carácter final se puede omitir, si no aparece se supone que es \n : cin.getline(nombre, 50);

Ing. Omar Velandia – SubProyecto Algoritmos y Programación I – UNELLEZ Municipalizada


Estructuras de Datos

Ejemplo: Leer por teclado una cadena de caracteres y la guarda en el array cadena. A continuación lo recorre
desde el principio y muestra cada carácter por pantalla hasta que encuentra el carácter nulo.

#include <iostream>
using namespace std;
int main(void)
{
char cadena[30];

cin.getline(cadena,30); //lectura de la cadena por teclado


//se asignarán 29 caracteres como máximo
//el carácter nulo se añade de forma automática

//recorrido de la cadena de caracteres


int i=0; //variable índice para recorrer la cadena
while(cadena[i]!='\0') //mientras no lleguemos al nulo
{
cout << cadena[i]; //se muestra el carácter
i++; //se incrementa el índice
}
cout << endl;
system("pause");
}

Nota: donde no se indique el programa fue compilado con DevC++.

Ing. Omar Velandia – SubProyecto Algoritmos y Programación I – UNELLEZ Municipalizada

Вам также может понравиться