You are on page 1of 69

CESVER Material Bibliogrfico de Apoyo Didctico

ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

MATERIAL BIBLIOGRFICO
DE APOYO DIDCTICO

Licenciatura:
INGENIERIA EN SISTEMAS
COMPUTACIONALES

Asignatura:
ALGORITMOS Y ESTRUCTURA
DE DATOS I

Semestre:
QUINTO

Nombre del compilador:


ING. JUAN ALBERTO VAZQUEZ
GONZALEZ
En coordinacin con los alumnos:
Elena Galvn De La Cruz
Miguel Hernndez Hernndez
Mara De Los ngeles Guzmn Hoyos
de 5 cuatrimestre de Ingeniera en Sistemas
Computacionales

ING JUAN ALBERTO VAZQUEZ G.


Pgina 1 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

INDICE
PRESENTACION
INTRODUCCION
MANEJO DE LA ANTOLOGIA
1 TIPOS DE DATOS ESTRUCTURADOS
1.1 Arreglos unidimensionales.
1.1.1 Bsqueda secuencial.
1.1.2 Bsqueda binaria.
1.1.3 Mtodos de ordenamiento.
1.1.4 Hashing.
1.2 Arreglos bidimensionales.
1.2.1 Operaciones matemticas sobre matrices.
1.2.2 Representacin de un arreglo bidimensional en un arreglo unidimensional.
1.3 Arreglos multidimensionales.
1.4 Registros.
1.4.1 Definicin de los campos de un registro.
1.4.2 Acceso a los campos de un registro.
1.4.3 Importancia de los registros.
1.4.4 Arreglos de los registros.

2 OPERACIONES SOBRE CADENAS DE CARACTERES

2.1 El tipo de dato string.


2.2 Operaciones bsicas sobre cadenas.
2.3 Procedimientos y funciones sobre cadenas.

3 DISEO MODULAR

3.1 Importancia y ventajas del diseo modular.


3.2 Variables globales y locales.
3.3 Procedimientos funcionales.

4 DISEO MODULAR
4.1 Pilas.
4.1.1 Operaciones bsicas sobre pilas: push y pop.
4.1.2 Implementacin de la pila mediante arreglos unidimensionales.
4.1.3 Ejemplos de aplicacin.
4.2 Colas.
4.2.1 Operaciones bsicas sobre colas.
4.2.2 Implementacin de una cola mediante arreglos unidimensionales.
4.2.3 Ejemplos de aplicacin.
4.3 Otras listas y su implementacin esttica.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 2 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

GLOSARIO
BIBLIOGRAFIA
REFERENCIAS

ING JUAN ALBERTO VAZQUEZ G.


Pgina 3 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

INTRODUCCION:

Como ya sabemos, las computadoras fueron diseadas o ideadas como una


herramienta mediante la cual podemos realizar operaciones de clculo
complicadas en un lapso de mnimo tiempo. Pero la mayora de las aplicaciones
de este fantstico invento del hombre, son las de almacenamiento y acceso de
grandes cantidades de informacin.
La informacin que se procesa en la computadora es un conjunto de datos,
que pueden ser simples o estructurados. Los datos simples son aquellos que
ocupan slo una localidad de memoria, mientras que los estructurados son un
conjunto de casillas de memoria a las cuales hacemos referencia mediante un
identificador nico.
Debido a que por lo general tenemos que tratar con conjuntos de datos y no
con datos simples (enteros, reales, booleanos, etc.) que por s solos no nos dicen
nada, ni nos sirven de mucho, es necesario tratar con estructuras de datos
adecuadas a cada necesidad.
Una estructura de datos se caracteriza por lo siguiente:
Pueden descomponerse en los elementos que la forman.
La manera en que se colocan los elementos dentro de la
estructura afectar la forma en que se realicen los accesos a cada
elemento.
La colocacin de los elementos y la manera en que se accede
a ellos puede ser encapsulada.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 4 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

MANEJO DE LA ANTOLOGA

Esta, como muchas otras antologas que he realizado han sido cubiertas
perfectamente en el saln de clases garantizando con este material el
aprendizaje y una posterior evaluacin prospera.
La antologa comprende 4 unidades correspondientes a la materia de
Algoritmo y Estructura de datos I que imparte el Centro de Estudios Superiores de
Veracruz (CESVER), incluye adems despus de cada unidad una evaluacin y
una serie de actividades a realizar.
Dentro de la antologa encontrara cdigo para ser compilado en C++, es
cdigo que funciona y que fue encerrado en color verde pero que adems
fueron ejercicios vistos en clase.
Al final de esta Antologa localizara un glosario de trminos que corresponde
a las palabras marcadas (subrayadas, con cursiva y encerradas en color gris).
Posterior al glosario una serie de libros recomendados para profundizar en los
temas vistos hasta aqu y una serie de referencias de Internet que ampliaran
evidentemente el conocimiento.
La mejor forma de tratar esta antologa y pretendiendo evitar que se quede
con lagunas en su conocimiento es llevar una doble revisin de los temas que
aqu se tratan, amplindolos con un buen libre de C++ (le aconsejo C++ en 21
das) y mucha disposicin para adquirir el conocimientos.
Es importante mencionar que el ultimo capitulo en su mayora fue diseado
por alumnos del 5 semestre de Ingeniera en Sistemas computacionales, me
gusto y veo bueno ponerlo.
Desendole lo mejor dejo este material que me costo mucho realizar en sus
manos
Comencemos...

ING JUAN ALBERTO VAZQUEZ G.


Pgina 5 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

OBJETIVO(S) GENERAL(ES) DE LA ASIGNATURA

Al finalizar el curso, el alumno:

 Disear algoritmos utilizando estructuras de datos estticas y


programacin modular, implementndolos mediante lenguajes
declarativos.

CRITERIOS Y PROCEDIMIENTOS DE EVALUACIN Y ACREDITACIN

EVALUACIN SOBRE EXPERIENCIAS DE 20%


APRENDIZAJE
EXAMEN PARCIAL 30%
EXAMEN FINAL 50%

ING JUAN ALBERTO VAZQUEZ G.


Pgina 6 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Unidad 1
TIPOS DE DATOS
ESTRUCTURADOS

1.1 Arreglos unidimensionales.


1.1.1 Bsqueda secuencial.
1.1.2 Bsqueda binaria.
1.1.3 Mtodos de ordenamiento.
1.1.4 Hashing.
1.2 Arreglos bidimensionales.
1.2.1 Operaciones matemticas sobre matrices.
1.2.2 Representacin de un arreglo bidimensional en un arreglo
unidimensional.
1.3 Arreglos multidimensionales.
1.4 Registros.
1.4.1 Definicin de los campos de un registro.
1.4.2 Acceso a los campos de un registro.
1.4.3 Importancia de los registros.
1.4.4 Arreglos de los registros.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 7 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

INTRODUCCION:

En muchos problemas es necesario almacenar y manipular datos formados


por colecciones de valores que presentan ciertas relaciones entre s. Para esto,
existen herramientas que permiten organizar eficientemente dichos datos en la
memoria del computador; estas son las estructuras de datos, que permiten
manipular datos complejos en cuanto a su organizacin, en forma relativamente
sencilla, dndole claridad y simplicidad a los programas.
Podemos entender a los datos estructurados como aquellos tipos de datos
definidos en funcin de otros tipos de datos previamente definidos. Sus instancias
se construyen como un agregado de otros tipos, llamados componentes o
constituyentes.
Normalmente los algoritmos se asocian con estructuras de datos. Un algoritmo
es una secuencia de instrucciones que realizan una tarea en un periodo de
tiempo finito. El algoritmo recibe cero o ms entradas, produce al menos una
salida, consiste en instrucciones claras y poco ambiguas, termina despus de un
nmero finito de pasos, y es lo suficientemente bsico que una persona puede
llevar a cabo el algoritmo utilizando lpiz y papel. Por el contrario, un programa
no es necesariamente finito: el programa, como un servidor Web, podra no
terminar nunca si no hay intervencin externa. Algunos ejemplos de algoritmos
asociados con estructuras de datos son: bsqueda-lineal, ordenacin-de-
burbuja, bsqueda-binaria, concatenacin-de-listas-enlazadas, etc. Esto es solo
una probadita de lo que estaremos viendo a lo largo de este capitulo.

OBJETIVO:

Introducirnos en el conocimiento de los datos estructurados en una y varias


dimensiones.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 8 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

TIPOS DE DATOS ESTRUCTURADOS


Los datos a procesar por una computadora se pueden clasificar en:
Simples
Estructurados
La principal caracterstica de los datos simples es que ocupan solo una
casilla de memoria, por lo tanto una variable simple hace referencia a un nico
valor a la vez. Dentro de este grupo de datos se encuentran: enteros, reales,
carcter y boleanos (los dos ltimos no existen en algunos lenguajes de
programacin).
Los datos estructurados se caracterizan por el hecho de que con un nombre
(Identificador de variable) se hace referencia a un grupo de casillas de
memoria). Es decir, un dato estructurado tiene varios componentes. Cada uno
de los componentes puede ser un dato simple o estructurado. Sin embargo los
componentes bsicos de cualquier dato estructurado son datos simples.

1.1 Arreglos unidimensionales.

La estructura ms simple es el arreglo unidimensional, que consiste de una


columna de localizaciones de memoria. Se representan como arreglo[5]
El nmero entre corchetes puede ser una constante, una variable o una
expresin y esta indicando el tamao del arreglo, un arreglo de una sola
dimensin suele ser llamado tambin vector.

1.1.1 Bsqueda secuencial.

Una bsqueda es el proceso mediante el cual podemos localizar un elemento


con un valor especfico dentro de un conjunto de datos. Terminamos con xito la
bsqueda cuando el elemento es encontrado.
Al mtodo de bsqueda secuencial se le conoce tambin como bsqueda
lineal y consiste en empezar al inicio del conjunto de elementos, e ir a travs de
ellos hasta encontrar el elemento indicado hasta llegar al final de arreglo.
Este es el mtodo de bsqueda ms lento, pero si nuestro arreglo se encuentra
completamente desordenado es el nico que nos podr ayudar a encontrar el
dato que buscamos. Un algoritmo creado para la bsqueda binaria seria el
siguiente:
ind <- 1
encontrado <- falso
mientras no encontrado y ind < N haz
si arreglo[ind] = valor_buscado entonces
encontrado <- verdadero
si no encontrado
ind <- ind +1
fin mientras

ING JUAN ALBERTO VAZQUEZ G.


Pgina 9 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

1.1.2 Bsqueda binaria.

Este es otro tipo de mtodo ms rpido, pero es necesario que el arreglo este
ordenado y que se conozca el numero de elementos.
Este mtodo consiste en lo siguiente: comparar el elemento buscado con el
elemento situado en la mitad del arreglo, si tenemos suerte y los dos valores
coinciden, en ese momento la bsqueda termina. Pero como existe un alto
porcentaje de que esto no ocurra, repetiremos los pasos anteriores en la mitad
inferior del arreglo si el elemento que buscamos resulto menor que el de la mitad
del arreglo, o en la mitad superior si el elemento buscado fue mayor.
La bsqueda termina cuando encontramos el elemento o cuando el tamao
del arreglo a examinar sea cero.
encontrado <- falso
primero <- 1
ultimo <- N
mientras primero <= ultimo y no encontrado haz
mitad <- (primero + ultimo)/2
si arreglo[mitad] = valor buscado entonces
encontrado <- verdadero
en caso contrario
si arreglo[mitad] > valor buscado entonces
ultimo <- mitad - 1
en caso contrario
primero <- mitad + 1
Este algoritmo deber ser realizarlo hasta que el elemento exista o el valor de
mitad sea 0.

1.1.3 Mtodos de ordenamiento.

Suponga el caso de los siguientes algoritmos en los cuales se cuente con a


siguiente estructura:
Const MAX = 100
A = arreglo[1MAX] de enteros
Variable N:entero
Existen diversos procedimientos para el orden de elementos como a
continuacin se muestran:
A. METODO DE BURBUJA.
Transporta en cada pasada el elemento ms pequeo a la parte izquierda del
arreglo A de N elementos.
Hacer I <-- 1 y Band <-- Falso
Repetir mientras (I <= N-1 y Band=Falso)
Hacer Band <-- Verdadero
Repetir con J desde 1 hasta N-1
Si A[J] > A[J+1] entonces
hacer Aux <-- A[J]
A[J] <-- A[J+1]
A[J+1] <-- Aux

ING JUAN ALBERTO VAZQUEZ G.


Pgina 10 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Band <-- Falso


Fin Si
Hacer I <-- I+1
Fin
Hemos de notar que mientras I contabiliza el nmero de pasadas que se
tienen que realizar J se encarga de llevar el conteo de la posicin en la cual se
localiza el arreglo. La primera pasada que se realiza para el arreglo que tiene los
dgitos A = 15,67,08,16,44,27,12,35 seria la siguiente:
1 Pasada.
A[7] > A[8] ---- 12 > 35 ---- No hay intercambio ----15 67 08 16 44 27 12 35
A[6] > A[7] ---- 27 > 12 ---- Si hay intercambio ---- 15 67 08 16 44 12 27 35
A[5] > A[6] ---- 44 > 12 ---- Si hay intercambio ---- 15 67 08 16 12 44 27 35
A[4] > A[5] ---- 16 > 12 ---- Si hay intercambio ---- 15 67 08 12 16 44 27 35
A[3] > A[4] ---- 08 > 12 ---- No hay intercambio ----15 67 08 12 16 44 27 35
A[2] > A[3] ---- 67 > 08 ---- Si hay intercambio ---- 15 08 67 12 16 44 27 35
A[1] > A[2] ---- 15 > 08 ---- Si hay intercambio ---- 08 15 67 12 16 44 27 35
Y el numero de pasadas que se debe realizar esta determinado por la
expresin:
Mmin = 0 (cuando el vector est ordenado).
Mmed = 0.75 * (n2-n) (cuando los elementos del vector estn distribuidos al
azar).
Mmx = 1.5 * (n2-n) (cuando los elementos del vector estn distribuidos al
revs).
Y el numero de comparaciones que es posible de realizar esta determinado
por C = (n2 - n) / 2
B. METODO DE INSERCION.
La idea central de este algoritmo consiste en insertar un elemento del arreglo
en la parte izquierda del mismo, que ya se encuentra ordenado. Este proceso se
repite desde el segundo hasta el n-simo elemento.
Para explicarlo proceder de forma inversa a como lo he hecho en el caso
anterior, es decir, tomare uno de los elementos y lo comparare con todos los
elementos que se localizan a la izquierda si hay uno menor en los elementos de
la izquierda lo colocare en la posicin debida, en caso contrario seguir con otro
elemento. Utilizando los mismos nmeros que en el caso anterior puedo darme
cuenta que algunas de las comparaciones que es posible realizar son las
siguientes:
A[2]<A[1] (67<15) no hay intercambio //Primera pasada
 El resultado: A: 15 67 08 16 44 27 12 35
A[3]<A[2] (08<67) s hay intercambio //Segunda pasada
A[2]<A[1] (08<15) s hay intercambio
 El resultado: A: 08 15 67 16 44 27 12 35
A[4]<A[3] (16<67) s hay intercambio //Tercera pasada
A[3]<A[2] (16<15) no hay intercambio
Los elementos ya ordenados al terminar la tercera pasada son los siguientes:

ING JUAN ALBERTO VAZQUEZ G.


Pgina 11 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

 El resultado es: A: 08 15 16 67 44 27 12 35
Como ha observado una vez que se localiza un elemento menor se
interrumpen las comparaciones por ejemplo en el caso anterior no se comparo
A[2]<A[1].
Creo conveniente para este momento llevar a cabo una comparacin entre
el algoritmo y el cdigo en la cual muestre la gran similitud existente entre ambos
por lo mismo he preferido para este caso escoger el cdigo.
void insercion_directa(int n)
{
int i,j,aux;
i=j=1;
for(;j<n;j++)
for(i=j;i > 0 && (arr[i] < arr[i-1]); i--)
{
aux=arr[i];
arr[i]=arr[i+1];
arr[i+1]=aux;
}
}
En el primer ciclo for se lleva a cabo la realizacin de las pasadas que es
necesario realizar desde 1 hasta N, en el segundo se realizan las comparaciones
correspondientes y si entra en este segundo for es porque se localizo un
elemento menor que el de la izquierda.
El nmero de movimientos que hay que realizar en este tipo de ejercicios esta
determinado por las siguientes formulas:
Mmin = 0
Mmed = (n2-n)/4
Mmax = (n2-n)/2
C. METODO DE SELECCIN DIRECTA.
El mtodo de ordenacin por seleccin directa es ms eficiente que los
mtodos analizados anteriormente.
Pero, aunque su comportamiento es mejor que el de aqullos y su
programacin es fcil y comprensible, no es recomendable utilizarlo cuando el
nmero de elementos del arreglo es grande.
La idea bsica de este algoritmo consiste en buscar el menor elemento en el
arreglo y colocarlo en primera posicin. Luego se busca el segundo elemento
ms pequeo del arreglo y se lo coloca en segunda posicin. El proceso
continua hasta que todos los elementos del arreglo hayan sido ordenados. El
mtodo se basa en los siguientes principios:
1. Seleccionar el menor elemento del arreglo.
2. Intercambiar dicho elemento con el primero.
3. Repetir los pasos anteriores con los (n-1), (n-2 ) elementos y as
sucesivamente hasta que slo quede el elemento mayor.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 12 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

D. METODO QUICKSORT
Esta es la tcnica de ordenamiento ms rpida conocida. Fue desarrollada
por C. Antony R. Hoare en 1960. El algoritmo original es recursivo, pero se utilizan
versiones iterativas para mejorar su rendimiento.
El procedimiento a seguir se ilustra en el siguiente ejemplo:
Vamos a tratar de ordenar la lista conformada por los nmeros 5,3,7,6,2,1,4
1. Tomaremos el pivote en 4 y lo comparamos con el 5 por la izquierda y el
1 por la derecha.
2. Intercambiamos dado que 5 es mayor que cuatro y 1 es menor. La lista
luego del intercambio queda del siguiente modo. 1 - 3 - 7 - 6 - 2 - 5 4
3. Repetimos el procedimiento anterior, avanzando por la izquierda y la
derecha, notando que 3 es menor que 4 y 2 es menor que 4: nos
mantenemos ah.
4. Si repetimos este procedimiento por tercera vez notamos que 7 es mayor
que 4 y 2 es menor: intercambiamos quedando la lista como 1 - 3 - 2 - 6 -
7 - 5 4.
5. Si volvemos a repetir este procedimiento llegamos a un elemento nico
que es el 6, este elemento ser intercambiado por el pivote y hemos
terminado un ciclo.
6. Empezamos de nuevo el ciclo teniendo ahora dos listas por la izquierda
y por la derecha y en el centro el 4, ahora realizaremos los 4 pasos
anteriores con estos nmeros.

1.1.4 Hashing.

Hashing es el proceso por el cual se transforma una cadena de caracteres en


un valor de un largo pre-establecido o clave de la cadena original. El Hashing se
utiliza en el ambiente de bases de datos para indexar y retribuir data debido a
que el valor clave es mucho ms corto y por lo mismo ms rpido de encontrar.
Hashing tambin se utiliza en muchos algoritmos de encriptacin.
Si tenemos una lista con nombres y apellidos en una tabla de base de datos,
tanto el nombre como el apellido seran campos clave para el momento de una
bsqueda. El manejador de base de datos BD tendra que buscar carcter por
carcter de forma vertical a travs de la lista de nombres y apellidos hasta
conseguir el primer carcter que cumpla con ese criterio, seguidamente tendra
que buscar horizontalmente el resto de los caracteres asociados al primero para
validar que la bsqueda ha tenido un efecto positivo.
Un algoritmo Hash genera un valor numrico nico para cada cadena de
caracteres y de esta forma al realizar una bsqueda el mismo algoritmo
calculara el valor deseado correspondiente por lo que sera mucho ms rpida y
eficiente la respuesta. Buscar 4 dgitos numricos donde cada uno tiene
solamente 10 posibles alternativas (0-9) es ms rpido que buscar caracteres de

ING JUAN ALBERTO VAZQUEZ G.


Pgina 13 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

largo indeterminado donde cada posicin puede tener hasta 27 alternativas (a-
z) diferentes.
El algoritmo Hash, llamado funcin hash, tambin se utiliza para los procesos
de encriptacin y decriptacin de firmas digitales (utilizadas para autentificar
quienes envan/reciben mensajes digitales). La firma digital se transforma a travs
de una funcin hash en un nmero nico que es decriptado en el otro extremo
del mensaje utilizando el mismo algoritmo y posteriormente verificado con el
agente autentificador que almacena estos datos.

1.2 Arreglos bidimensionales.

En programacin, un vector, array, arreglo o alineacin es un conjunto o


agrupacin de variables del mismo tipo cuyo acceso se realiza por ndices.
Los vectores o arreglos (array en ingls) de dos o ms dimensiones se
denominan con frecuencia matrices, y pueden tener tantas dimensiones como
se desee; aunque lo correcto es llamarlo arreglo (de memoria) ya que una
variable de ms de dos dimensiones, no cumple con las caractersticas
matemticas de una matriz numrica.
Desde el punto de vista del programa, un arreglo (matriz, array vector) es
una zona de almacenamiento contiguo, que contiene una serie de elementos
del mismo tipo, los elementos de la matriz. Desde el punto de vista lgico
podemos considerarlas como un conjunto de elementos ordenados en fila. As
pues, en principio todas las matrices son de una dimensin, la dimensin
principal, pero veremos que los elementos de esta fila pueden ser a su vez
arreglos (un proceso que puede ser recursivo), lo que nos permite hablar de la
existencia de arreglos multidimensionales, aunque las ms fciles de "ver" o
imaginar son las de dos y tres dimensiones.
Puede afirmarse que las matrices son un recurso de programacin simple y
socorrido; en realidad pueden considerarse como las "estructuras" de datos ms
simples que cabe imaginar (todos los elementos del mismo tipo). Presentan la
ventaja de que sus elementos son rpidamente accesibles, en especial si utiliza
punteros en vez de subndices, pero presentan una notable limitacin: son de
tamao fijo.
Todo vector se compone de un determinado nmero de elementos. Cada
elemento es referenciado por la posicin que ocupa dentro del vector.

1.2.1 Operaciones matemticas sobre matrices.

Un arreglo unidimensional es un tipo de datos estructurado que est formado


de una coleccin finita y ordenada de datos del mismo tipo. Es la estructura
natural para modelar listas de elementos iguales.
El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir,
podemos acceder a cualquier elemento del arreglo sin tener que consultar a

ING JUAN ALBERTO VAZQUEZ G.


Pgina 14 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

elementos anteriores o posteriores, esto mediante el uso de un ndice para cada


elemento del arreglo que nos da su posicin relativa.
Para implementarr arreglos unidimensionales se debe
reservar espacio en memoria, y se debe proporcionar la
direccin base del arreglo, la cota superior y la inferior.
int arreglo[10];
Para este caso nuestro arreglo es de elementos enteros y
contiene 10 elementos. Aun cuando es posible que la
direccin de cada uno de los elementos no importe se
debe de hacer notar que son elementos subsecuentes.
Podemos bajo esta misma estructura defindefinir un arreglo bidimensional como
aquel que esta compuesto, por un conjunto de elementos homogneos y se
puede acceder a los datos utilizando dos subndices, este tipo de arreglo es
tambin conocido como matriz.
Un arreglo bidimensional o matriz se define as:
int arreglo[10][10];
float matriz[10][10];
Tambin
ambin podemos utilizar constantes para defi
definir
nir la dimensin del arreglo de
dos dimensiones:
const int N = 10;
int arreglo[N][N];
En ambos casos de arreglos puede hacerse uso de operaciones que ahora
mostraremos:
LECTRURA:
Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada
uno de sus componentes.
La lectura se realiza de la siguiente manera:
para i desde 1 hasta N haz
x<--arreglo[i]
ESCRITURA.
Es un proceso inverso a el anterior ya que ahora a partir de una variable
podremos cargar valores a un arreglo.
para i desde 1 hasta N haz
arreglo[i]<--x
ACTUALIZACION
Dentro de esta operacin se encuent
encuentran
ran las operaciones de insertar y
modificar datos. El procedimiento para insertar un dato no es ms que escribir en
el arreglo en el subndice deseado, el procedimiento de modificar es similar a el
anterior, aun cuando existan ocasiones en las cuales sea deseable guardar el
dato que se actualizo.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 15 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

1.2.2 Representacin de un arreglo bidimensional en un arreglo


unidimensional.

Un arreglo bidimensional es un arreglo de arreglos unidimensionales.


Constituyen la forma ms simple de los arreglos multidimensionales.
Su forma general de declaracin es
tipo_dato variable[primer ndice][segundo ndice];
El primer ndice corresponde a la filas y el segundo a las columnas.
Cuando se utiliza un arreglo bidimensional como argumento de una funcin,
realmente se pasa slo la direccin del primer elemento (el[0][0]). Sin embargo,
la funcin que recibe un arreglo bidimensional como argumento tiene que definir
al menos la longitud de la segunda dimensin.
Esto es necesario debido a que el compilador de C necesita "conocer" la
longitud de cada fila para ordenar el arreglo correctamente.
Ejemplo: int x [3][4]
Entero tipo de dato
x nombre de la variable que representa a todo el arreglo
3 tamao del arreglo en filas
4 tamao del arreglo en columnas
La representacin en memoria de los arreglos bidimensionales de puede
realizar por columnas o por renglones como lo muestra cada una de las
imgenes siguientes.

Uno de los tipos ms utilizados de arreglos bidimensionales lo constituyen los


arreglos bidimensionales de caracteres.
char lista[3][10]={{'j'','o','r','g','e'},{'j','u','a','n'},{'p','e','d','r','o'}};
en donde puede deducirse que el primer nmero entre corchetes indica el
nmero de cadenas en el arreglo mientras que el segundo indica el nmero de
caracteres (mximo) de cada cadena. En el caso anterior estamos haciendo
uso de 3 cadenas con un espacio reservado de hasta 10 caracteres cada una.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 16 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

1.3 Arreglos multidimensionales.

Los arreglos multidimensionales son aquellos


que nos permiten manejar ms de una dimensin
para el almacenamiento de datos, en lenguaje C
se pueden manejar estructuras con diferentes
dimensiones, la necesidad de este tipo de
estructuras de datos surge con la organizacin de
conjuntos de datos homogneos en cuanto a la
informacin en conjunto, pero heterogneos en
cuanto a los datos individuales, es decir todos los datos son del mismo tipo.
En los arreglos multidimensionales se realizan diversos tipos de operaciones que
ahora procedo a citar:
OPERACIN DE ASIGNACION:
Para almacenar un elemento en la matriz debemos primero especificar el
valor de la posicin fila-columna respectivo para as almacenarlo, si el arreglo es
de ms de dos dimensiones ser necesario especificar detalladamente la
ubicacin.
INICIALIZACION DE UN ARREGLO:
Es posible llenar los valores de un arreglo partiendo desde un ndice
especificando cada uno de los componentes que forman la dimensin de un
arreglo. Por ejemplo si el arreglo es bidimensional es necesario inicializar las
columnas y filas a cero si se desea llenar todos los valores de dicho arreglo.
UTILIZACION DE LOS ELEMENTOS
De modo similar cuando se desea hacer uso de uno de los elementos que
componen al arreglo es necesario especificar la direccin completa de la
posicin que se desea extraer y cargarla a una variable.
Finalmente si solo se desean mostrar en pantalla los elementos del arreglo
entonces se necesita especificar desde el elemento 1 hasta el elemento N los
valores que contiene el arreglo. Esto comnmente se hace con dos ciclos for.
El siguiente ejemplo muestra el llenado de una matriz, siempre es utilizado un
doble ciclo for para esto.
#include <stdio.h>
main() /* Rellenamos una matriz */
{
int x,i,numeros[3][4];
/* rellenamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
scanf("%d",&numeros[x][i]);
/* visualizamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
printf("%d",numeros[x][i]);
}

ING JUAN ALBERTO VAZQUEZ G.


Pgina 17 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

1.4 Registros.

Cuando se hablo de los arreglos se hizo mencin de que se trataba de una


coleccin de datos, que era un tipo estructurado de datos, y que con ellos se
podran solucionar un gran nmero de problemas. Sin embargo, en la prctica a
veces se necesitan estructuras que permitan almacenar distintos tipos de datos
(caracterstica con la cual no cuentan los arreglos), tales como el
almacenamiento de datos de un grupo de personas.
Un registro, en programacin, es un tipo de dato estructurado formado por la
unin de varios elementos bajo una misma estructura. Estos elementos pueden
ser, o bien datos elementales (entero, real, carcter,...), o bien otras estructuras
de datos. A cada uno de esos elementos se le llama campo.
Un registro se diferencia de un vector en que ste es una coleccin de datos
iguales, es decir, todos del mismo tipo, mientras que en una estructura los
elementos que la componen, aunque podran serlo, no tiene porque ser del
mismo tipo.
De forma ms practica podemos entender por registro a un grupo de
informacin relacionada que se usa para almacenar datos acerca de un tema o
actividad. En los compiladores en C++ se les llama tambin estructura. Los
registros estn divididos en campos, un campo es una variable de un tipo
determinado.

1.4.1 Definicin de los campos de un registro.

Un registro es un dato estructurado, donde cada uno de sus componentes se


denomina campo. Los campos de un registro pueden ser todos de diferentes
tipos por lo tanto, tambin podrn ser registros o arreglos. Cada campo se
identifica por un nombre nico (el identificador de campo).
La Sintaxis empleada en el diseo de registros es la siguiente:
struct Nombre
{
tipo1 Campo1;
tipo2 Campo2;
...
tipoN CampoN;
};
Ahora le presento un ejemplo de una estructura llamada libros en la cual se
hace uso de caracteres y enteros y fueron definidos previamente en el campo.
struct libro {
char titulo[20]; /* ttulo del libro */
char autor[20]; /* autor del libro */
int num; /* nmero de libro */
};
struct libro lib1,lib2;

ING JUAN ALBERTO VAZQUEZ G.


Pgina 18 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

En la figura puede ver como se ven los campos para un registro que
almacena datos de una persona.

1.4.2 Acceso a los campos de un registro.

Los componentes de un registro se denominan campos. Cada campo tiene un


nombre llamado identificador de Campo, que es algn identificador elegido por
el programador cuando se declara el tipo de registro.
Como un registro es un dato estructurado no puede accesarse directamente
como un todo, si no que debe especificarse que elemento (campo) del registro
es el que interesa. Para ello, en la mayora de los lenguajes se sigue la siguiente
sintaxis:
Variable_registro . id _ campo
Donde : Variable _ registro es una variable de tipo, registro
Id _ campo es el identificador del campo deseado

Es decir, se usaran dos nombres para hacer referencia a un elemento: el


nombre de la variable tipo registro y el nombre de la componente, separados
entre si por un punto tal y como se muestra en el siguiente ejemplo.
struct medida {
char hora;
char minutos;
float temperatura;
} registro;
registro.hora = 10;
registro.minuto = 56;
registro.temperatura = 36.8;
if (registro.temperatura > TEMMAX) printf ("Fiebre\n");

Algo difcil de entender es que los registros se pueden anidar.


struct med_diaria {
char dia;

ING JUAN ALBERTO VAZQUEZ G.


Pgina 19 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

char mes;
int anyo;
struct medida med_uno;
struct medida med_dos;
struct medida med_tres;
} med_hoy;
med_hoy.med_uno.hora=8;
med_hoy.med_uno.minutos=3;
med_hoy.med_uno.temperatura=36.5;

1.4.3 Importancia de los registros.

Las estructuras (struct) tienen una importancia vital en la programacin pues


nos permiten construir complejas "uniones" de datos que servirn para trabajar
con "tablas de datos" distintas de un modo fcil y directo, ejemplo de ello son las
bases de datos.
En el ejemplo anterior se mostraba una de las formas de representar a una
variable del tipo registro. Los dos modos de hacerlo se ilustran en la siguiente
tabla, adems se aaden algunas observaciones que es importante tener
presente siempre.
struct Guerrero { Esto es una forma de hacerlo, si se
char *nombre; desea agregar o definir un guerrero se
int fuerza;
tiene que hacer declarando
int resistencia;
struct Guerrero jugador1;
int experiencia;
int edad;
};
struct Guerrero { Modo similar a el anterior, pero ya en la
char *nombre; definicin de la estructura se ha
int fuerza;
agregado al jugador1
int resistencia;
int experiencia;
int edad;
} jugador1;
Podemos de modo similar utilizar la estructura como si fuera un tipo de valor
empleando solamente Guerrero jugador1; para definir al jugador1.
No basta pensar mucho en el uso de los registros, dado que es utilizado en
infinidad de componentes como pueden ser juegos, bases de datos o incluso el
manejo de componentes para el acceso a los grficos.
La verdad es que manejar adecuadamente la entrada y salida de registros en
los diversos lenguajes de programacin puede facilitar mucho el trabajo.
Considerando que en los arreglos solo se puede manejar un tipo de datos
podemos emplear los registros cuando necesitemos tener en un mismo lugar
diversos tipos de datos ampliando con esto nuestro inmenso mundo de la
programacin.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 20 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

1.4.4 Arreglos de los registros.

Luego de haber dedicado parte de este capitulo al conocimiento de los


arreglos ha llegado el momento de profundizar en el manejo de registros que
contienen arreglos unidimensionales como los ilustra el siguiente ejemplo:
#include <stdio.h>
#include <conio.h>
1. struct mascota
{
char nom[20];
int edad;
float precio;
} x[20]; // se crea un arreglo de 20 elementos de tipo estructura

int posmax=0;
2. void lectura(mascota &x) // funcion que realiza la lectura de datos
{
clrscr();
printf("LECTURA DE DATOS\n");
printf(" Nombre :");
gets(x.nom);
printf(" Edad :");
scanf("%d",&x.edad);
printf(" Precio :");
scanf("%f",&x.precio);
posmax++;
printf("\n");
}
3. void mostrar(mascota x) // funcion que muestra una mascota
{
printf("DATOS LEIDOS\n");
printf(" Nombre : %s\n",x.nom);
printf(" Edad : %d\n",x.edad);
printf(" Precio : %f\n",x.precio);
getch();
}
4. void mostrartodos(void) // funcion que muestra todas las mascotas
{
int i;
for(i=0;i <posmax;i++)
mostrar(x[i]);
}
5. void truco(void)
{
float *a,b;
*a=b;
b=*a;
}

ING JUAN ALBERTO VAZQUEZ G.


Pgina 21 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

6. void main(void) // funcion principal


{
int opcion;
truco();
do
{
clrscr();
printf("MENU\n");
printf("1.- Lectura\n");
printf("2.- Mostrar\n");
printf("3.- Salir\n");
printf("Elija su Opcion: ");
scanf("%d%*c",&opcion);
switch(opcion)
{
case 1: lectura(x[posmax]);
break;
case 2: clrscr();
mostrartodos();
break;
}
} while(opcion!=3);
}

He dividido el programa en seis partes para una mejor comprensin del mismo.
En la parte 1 se define una variable con un espacio para 20 registros x[20] esto
quiere decir que se han reservado 20 espacios de memoria para guardar
registros de este tipo.
El caso 2,3 y 4 no tiene mayor relevancia, lo nico que se ha hecho ha sido
cargar los datos y mostrarlos, es una pequea estructura para una base de
datos, seguramente usted le sacara a esto mejor provecho.
Cuando se trabaja con arreglos de tipo estructura, donde la estructura
contiene un campo de tipo float, se presenta error en la ejecucin de la lectura
de ese campo "float".
Para solucionar este error existe un truco, en la cual se le debe informar o
recordar al compilador de Turbo C, el manejo de tipos de datos float, esta
operacin es realizada en el paso 5.
Finalmente y no menos importante de explicar el paso 6 en el cual se utiliza un
men para realizar las funciones definidas anteriormente.
Es asi como se trabaja con arreglos y registros, esto unto constituye el estudio
de las estructuras de datos.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 22 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

EJEMPLOS VISTOS EN CLASE.


EJEMPLO 01
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define TAM 10
void main()
{
int a[TAM], temp, i, j, num;
clrscr();
randomize(); //Inicializa el generador de numeros aleatorios
printf ("Llenando arreglo con nmeros aleatorios\n");
for (i=0; i< TAM; i++)
{
a[i]=random(10);
printf ("a[%d]=%d \n",i,a[i]);
}
printf ("Numero a buscar? ");
scanf ("%d", &num);
for (i=0; i< TAM; i++)
if (a[i] == num)
{
printf ("\nValor encontrado");
printf ("\nPosicion: %d", i);
}
else
printf ("\nNo existe");
printf ("\nEl arreglo era:\n");
for (i=0; i< TAM; i++)
printf ("a[%d]=%d \n ",i, a[i]);
getch();
}

/* ALGORITMO BUSQUEDA

INICIO
VAR TAM=10,I, A[TAM]
ALEATORIO
DE 1 A 10
I=NUMERO ALEATORIO
IMPRIME I
ESCRIBE NUMERO A BUSCAR
LEER NUMERO A BUSCAR
DE 1 A 10
IF A[I]=NUM
ESCRIBE VALOR ENCONTRADO
ESCRIBE POSICION I
SI NO
ESCRIBE NO EXISTE
ESCRIBIR EL ARREGLO ERA

ING JUAN ALBERTO VAZQUEZ G.


Pgina 23 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

DE 1 A 10
ESCRIBIR I, A[I]
FIN DE
FIN
*/

EJEMPLO 02

#include <stdio.h>
#define SIZE 3
void main(void)
{
double matriz[SIZE][SIZE];
double vector[SIZE];
double solucion[SIZE];
double sum;
int i,j;

printf("Introduzca los datos de la matriz:\n");


for(i=0; i<SIZE ; i++) {
for(j=0; j<SIZE; j++) {
printf("\nElemento (%d,%d): ", (i+1), (j+1));
scanf(" %lf", &matriz[i][j]);
}
}
printf("\n\nIntroduzca los datos del vector:\n");
for(i=0; i<SIZE ; i++) {
printf("\nElemento %d: ", (i+1));
scanf("%lf", &vector[i]);
}
for(i=0; i<SIZE; i++) {
sum=0;
for(j=0; j<SIZE; j++) {
sum += matriz[i][j]*vector[j];
}
solucion[i] = sum;
}
printf("\nEl vector solucion es:\n");
for(i=0; i<SIZE; i++) {
printf("Elemento %d = %lf\n", i+1, solucion[i]);
}
}

EJEMPLO 03
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define TAM 5
void main(){

ING JUAN ALBERTO VAZQUEZ G.


Pgina 24 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

int a[TAM], temp, i, j;


clrscr();
randomize(); //Inicializa el generador de numeros aleatorios
printf ("Llenando arreglo con nmeros aleatorios\n");
for (i=0; i< TAM; i++)
{
a[i]=random(100);
printf ("a[%d] = %d\n", i, a[i]);
}
//CUANDO ESTO TERMINA YA TENGO UN ARREGLO LLENO
for (j=1; j <= TAM; j++)
{ printf("\n");
for (i=0; i< TAM-1; i++)
if (a[i] > a[i+1])
{
temp = a[i];
a[i] = a[i+1];
printf("Cambio a[%d]=%d con a[%d]=%d\t",i,temp,i+1,a[i+1]);
a[i+1] = temp;
getchar();
}}
printf ("\nArreglo ordenado\n");
for (i=0; i< TAM; i++)
printf ("a[%d] = %d\n", i, a[i]);
getch();
}

/* ESTE ES EL ALGORITMO
VAR TAM 10-->CONSTANTE
INICIO
VAR A[TAM], TEMP, I,J -->INT
iNICIA RANDOM
LIMPIA PANTALLA
ESCRIBIR "LLENANDO ARREGLO CON NUMEROS ALEATORIOS"
DESDE I=0 HASTA TAM
A[I]=RAMDOM(100)
ESCRIBIR A[I]
DESDE J HASTA TAM
DESDE I=0 HASTA TAM
SI A[I] < A[I+1] ENTONCES
TEMP=A[I] PROCESO DE CAMBIO
A[I]=A[I+1]
A[I+1]=TEMP
FIN SI_NO
FIN DESDE
FIN DESDE
DESDE I HASTA TAM
ESCRIBIR ARREGLO
*/

ING JUAN ALBERTO VAZQUEZ G.


Pgina 25 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

EJEMPLO 04
#include <conio.h>
#include <stdio.h>
#include <string.h>
void main ()
{
//clrscr();
int cal[3][4];
int r,c,nc=5;
printf("CALIFICACIONES \n"); //ALTA CALIFICACIONES
for (r=0;r<=2;r++)
{
for (c=0;c<=3;c++)
{
gotoxy(nc,r+2);
printf("%d %d:",r,c );
scanf("%d", &cal[r][c]);
getchar();
nc=nc+10;
}
nc=5;
}
for(r=0;r<=2;r++)
{
for (c=0;c<=3;c++)
{
gotoxy (nc,r+6);
printf("%d:", cal[r][c]);
nc=nc+10;
}
nc=5;
}
getchar();
}

ING JUAN ALBERTO VAZQUEZ G.


Pgina 26 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

ACTIVIDADES DE APRENDIZAJE

Realice programas y algoritmos que realicen el ordenamiento y bsqueda


de datos.
Realice programas que manejen los datos estructurados vistos en esta
unidad.

Evaluacin:

Explique con sus propias palabras en que consiste el ordenamiento


burbuja.
Explique que es una bsqueda binaria.
Explique el concepto de arreglo.
Explique el concepto de estructura o registro.
Qu diferencia existe entre un vector, una matriz y un registro?

ING JUAN ALBERTO VAZQUEZ G.


Pgina 27 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Unidad 2
OPERACIONES SOBRE CADENAS DE
CARACTERES.

2.1 El tipo de dato string.


2.2 Operaciones bsicas sobre cadenas.
2.3 Procedimientos y funciones sobre cadenas.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 28 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

INTRODUCCION:

Hemos visto hasta ahora cmo manejar tipos de datos bsicos: varios tipos de
datos numricos, letras (char) y valores verdadero/falso (boolean). Pero para
poder empezar a aplicar nuestros conocimientos en ejemplos medianamente
complicados, nos interesa ver al menos un par de tipos de datos ms:
Es muy habitual tener que manejar "bloques" de letras, que darn lugar a
palabras o frases. Esto sern las "cadenas de texto" o "strings".
Las posibles de operaciones que se pueden realizar con los string son:
Devuelve la longitud (nmero de caracteres) de la cadena
Devuelve el carcter que hay en una cierta posicin
Devuelve la cadena convertida a minsculas
Devuelve la cadena convertida a maysculas
Devuelve una subcadena: varias letras a partir de una posicin dada
Devuelve una cadena con un carcter reemplazado por otro
Devuelve una cadena sin espacios de blanco inciales ni finales
Indica si la cadena empieza con una cierta subcadena
Indica si la cadena termina con una cierta subcadena
Indica la posicin en que se encuentra una cierta subcadena
(buscando desde el principio, a partir de una posicin opcional)
Indica la posicin en que se encuentra una cierta subcadena
(buscando desde el final, a partir de una posicin opcional)
Devuelve un String que es la representacin como texto del objeto que
se le indique (nmero, boolean, etc.)
Devuelve la cadena con otra aadida a su final (concatenada)
Tambin se pueden concatenar cadenas con "+"
Mira si las dos cadenas son iguales (lo mismo que "= =")
Comprueba si dos cadenas son iguales, pero despreciando las
diferencias entre maysculas y minsculas
Compara una cadena con la otra (devuelve 0 si son iguales, negativo si
la cadena es "menor" que cadena2 y positivo si es "mayor").

Como se ve, en ningn momento estamos modificando el String de partida.


Eso s, en muchos de los casos creamos un nuevo String

OBJETIVO:

Trabajar y conocer las operaciones que son realizables sobre cadenas de


texto para finalmente poder realizar problemas que involucren el uso de string.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 29 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

OPERACIONES SOBRE CADENAS DE CARACTERES


La mayora de los lenguajes de programacin trata las cadenas de texto de la
misma forma. Por ejemplo, el lenguaje PHP tiene una funcin o instruccin para
extraer parte de una cadena de texto: substr(Contrasea, 1, 5) nos proporciona
5 caracteres de la palabra Contrasea a partir de la posicin 1, esto es,
ontra. Como ven la numeracin empieza en 0.

2.1 El tipo de dato string.

El tipo de dato string es muy utilizado por los programadores debido a que con
este tipo de datos pueden manejar cadenas de caracteres. En muchos de los
lenguajes de programacin que conozco he notado que los datos string estn
encerrados entre comillas, por ejemplo Hola en C++ representa un string
tambin podemos mencionar que el string no es ms que una matriz de
caracteres (smbolos) y por lo mismo la visin que usted puede tener en memoria
es la misma que se uso para las matrices.
Para utilizar string en C++ se utiliza comnmente la librera cstring.h y como
todo dato que hay que utilizar primero es necesario declararlo, la forma de
hacerlo es muy similar a como se ha hecho con los datos previos:
string cadena1, cadena2;
Para asignar valores a las cadenas tenemos dos opciones:
cadena1 = "mi primer string";
Esto para el caso en el cual necesitemos asignar un texto a una cadena.
cin >> cadena1;
Tal y como lo hace scanf cuando lo que quiero es cargar texto que procede
de un printf lo que debo utilizar es cin es conveniente mencionar que cuando se
utiliza cin desde teclado solo la primera letra se almacena en la variables, asi por
ejemplo si escribo Hola mundo solo se ha cargado hola quedando afuera el
resto del texto.
Cuando se quiere almacenar ms de una palabra entonces podemos hacer
uso de getline(cin, cadena1) en la cual se lee los valores de las teclas que fueron
presionadas por el teclado hasta el Intro(enter) y son almacenadas en la variable
cadena1. Le recuerdo que los espacios tambin cuentan como carcter.
De modo opuesto cuando lo que se necesita es mostrar en pantalla el valor
de un string lo que utilizaremos ser cout.
cout << cadena1;
Cuando lo que se desea es conocer el tamao de la cadena y si estamos
programando en C++ podemos utilizar
cout << cadena1.length();
o guardando tal vez su valor numrico en una variable de tipo entera
n = cadena1.length();

ING JUAN ALBERTO VAZQUEZ G.


Pgina 30 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

2.2 Operaciones bsicas sobre cadenas.

CONCATENACION.
Entre las operaciones destacadas para el manejo de cadenas esta la
concatenacin que consiste en la unin de dos cadenas.
string cadena1=Hola;
string cadena2=Mundo;
string cadena3=cadena1+cadena2;
En este caso cadena3=HolaMundo dado que es el resultado de la suma de
las dos cadenas, quiero que tome en cuenta que en ningn lugar se ha dejado
el espacio por lo tanto juntara las dos palabras. Tampoco se ha colocado
comillas en cadena3 porque esta representando una suma de cadenas.
Tambin podemos concatenar con otras literales por ejemplo.
string cadena3=cadena1+ pequeo +cadena2;
El resultado: cadena3=Hola pequeo Mundo. En los dos ejemplos que se han
realizado ha cambiado el tamao de cadena3.
EXTRACCION.
Tambin es posible extraer pare del contenido de una cadena haciendo uso
de funciones que lo faciliten, para el caso de C++ que es lo que hemos venido
utilizando la funcin es substr, as a una cadena de cierto tamao puede
extrarsele parte de su contenido.

PROGRAMA DE H O Y
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
En el siguiente texto se han enumerado los caracteres, tomando en cuenta los
espacios (8,11), si yo creara y posteriormente aplicara una extraccin sobre esta
cadena con la instruccin
string cad1 = "Programa de Hoy";
string cad2 = cad1.substr(0,3);
entonces cad2=Pro dado que los valores entre 0 y 3 corresponde a estos
caracteres. Esta es una subcadena.

COMPARACION.
Para realizar una operacin de comparacin vamos a utilizar dos cadenas c1
y c2 adems de operadores de comparacin de modo que pueden existir los
siguientes casos:
Igualdad: c1 == c2.
Menor que: c1 < c2
Mayor que: c2 > c1
Las dos ultimas operaciones devuelven un valor numrico en orden
lexicogrfico similar a el orden alfabtico pero incluyendo caracteres de control.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 31 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

En la seccin anterior le mencione que podemos acceder a una de las partes


que componen la cadena, esto debido a que realmente una cadena esta
forma por un vector con caracteres.
La cadena string S = "HOLA"; puede ser interpretada como un vector de 4
caracteres H, O, L, A. Viendo la cadena de esta forma podemos acceder
al vector y cambiar su valor.
string s = "Hello";
s[3] = 'p';
s[4] = '!';
El contenido de s ha cambiado y ahora es Help!

2.3 Procedimientos y funciones sobre cadenas.

El operador cin, visto con anterioridad presenta un problema a la hora de


introducir una cadena de caracteres por teclado y es que no admite espacios
en blanco (recordar que cin utiliza los espacios en blanco como separadores, los
lee pero no los almacena).
Si introducimos por teclado la cadena HOLA A TODOS, tras la primera lectura
el valor de cadena ser HOLA, es decir, que se omite todo lo que va detrs del
primer espacio en blanco. Esto es debido a que los espacios en blanco actan
como marca de fin de cadena. En la segunda lectura, el valor que se lee para la
cadena sera A.
Para evitar este problema, utilizaremos la funcin gets(<cadena>) para
lectura. Por ejemplo,
char cadena[20];
gets(cadena);
La funcin strlen (string length, longitud de cadena) fue vista con anterioridad
tambin y devuelve el nmero de caracteres de la cadena que se le pasa como
parmetro sin contar el carcter \0. Por ejemplo, strlen(Hola) devuelve 4.
Excepto en el momento de la inicializacin, en C no es posible dar valor a una
variable cadena en una sentencia de asignacin. As,
char cadena[10];
cadena=Hola; /*ERROR!!!*/
es incorrecto. La nica forma de hacer esto es a travs de la funcin strcpy,
que copia en la variable cadena que se le pasa como primer parmetro el valor
de la cadena que se le pasa como segundo parmetro. La forma correcta de
hacer la asignacin anterior es pues:
char cadena[10];
strcpy(cadena,Hola); /*CORRECTO!!!*/

ING JUAN ALBERTO VAZQUEZ G.


Pgina 32 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

La funcin strcmp sirve para comparar dos cadenas lexicogrficamente (es


decir, por orden alfabtico). No compara cadenas por tamao. Devuelve un
entero negativo si la primera es menor que la segunda, un entero positivo si la
primera es mayor que la segunda y cero si las dos cadenas son la misma.
strcmp(Ala,Hola); /*Devuelve un valor <0*/
strcmp(Hola,Ala); /*Devuelve un valor >0*/
strcmp(Hola,Hola); /*Devuelve 0*/

EJEMPLO DE LA LONGITUD DE UNA CADENA.


#include <iostream.h>
#include <string.h>
int main() {
char *cadena = "Una cadena C++ termina con cero";
cout << "La cadena: [" << cadena << "] tiene " < strlen(cadena) << "
caracteres" << endl;
return 0;
}

EJEMPLO DE LA COPIA DE UNA CADENA EN OTRA.


#include <iostream.h>
#include <string.h>
int main() {
char *cadena = "Cadena ejemplo";
char cad[32];
cout << strcpy(cad, cadena) << endl;
cout << cad << endl;
return 0;
}

EJEMPLO DE LA COMPARACION DE DOS CADENAS.


#include <iostream.h>
#include <string.h>

int main() {
char *cadena1 = "Cadena ejemplo 1";
char *cadena2 = "Cadena ejemplo 2";
char *cadena3 = "Cadena";
char *cadena4 = "Cadena";

if(strcmp(cadena1, cadena2) < 0)


cout << cadena1 << " es menor que " << cadena2 << endl;
else if(strcmp(cadena1, cadena2) > 0)
cout << cadena1 << " es menor que " << cadena2 << endl;
else
cout << cadena1 << " es igual que " << cadena2 << endl;
cout << strcmp(cadena3, cadena2) << endl;
cout << strcmp(cadena3, cadena4) << endl;
return 0;
}
ING JUAN ALBERTO VAZQUEZ G.
Pgina 33 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

EJEMPLO DE LA CONCATENACION DE CADENAS.


#include <iostream.h>
#include <string.h>
int main() {
char *cadena1 = "Cadena de";
char *cadena2 = " ejemplo";
char cadena3[126];

strcpy(cadena3, cadena1);
cout << strcat(cadena3, cadena2) << endl;
return 0;
}

En los ejemplo que se han propuesto se ha utilizado el comando < < para
direccionar texto a la salida estndar, que en nuestro caso es la pantalla. El texto
entre dobles comillas se escribe literalmente en la salida estndar. El comando
endl produce un cambio de lnea.
Finalmente le invito a realizar los ejercicios que vienen a continuacin y aclarar
tus dudas con su profesor de materia.

EJERCICIO PROPUESTO EN CLASE


EJEMPLO 01
#include <conio.h>
#include <stdio.h>
main()
{
char cad[80];
int i;
clrscr();
printf("Escriba una cadena: ");
gets(cad); //Leer Cadena
i=0;
while (cad[i]!='\0')
{
if(cad[i]==' ')
printf("\n");
else
printf("%c",cad[i]);
i++;
}
getch();
return 0;
}
/* ALGORIMO CADENA
INICIO
VAR CADENA[80],I
ESCRIBE CADENA
LEER CADENA

ING JUAN ALBERTO VAZQUEZ G.


Pgina 34 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

MIENTRAS CADENA!=\0
IF CADENA[I]= ' '
ESCRIBE \N
SI NO
ESCRIBE CADENA[I]
I=I+1
FIN
*/

EJEMPLO 02
#include <stdio.h>
#include <string.h>
#define ELEMENTOS 5
int main()
{
char *dichos[ELEMENTOS] = {
"Gis",
"Alumnos",
"Sillas",
"Pizarron",
"Escritorio",
};
char *temp=0;
int i, j;
clrscr();
printf( "Lista desordenada:\n" );
for( i=0; i<ELEMENTOS; i++ )
printf( " %s.\n", dichos[i] );
for( i=0; i<ELEMENTOS; i++ )
{ for( j=0; j<ELEMENTOS; j++ )
{ if (strcmp(dichos[i], dichos[j])>0)
{
printf( "----> %d %d Se cambio --> %s por %s\n",
i,j,dichos[j],dichos[i]);
temp = dichos[i];
dichos[i] = dichos[j];
dichos[j] = temp;
}
printf("%d %d Se compara -->%s.\n", i,j,dichos[i]);
getch();
if(j==4) {printf("Tengo mi elemento %d ordenado\a\n",i+1);}
}
printf("%s\n %s\n %s\n %s\n %s\n",
dichos[0], dichos[1],dichos[2], dichos[3], dichos[4]);
}
printf( "Lista ordenada:\n" );
for( i=0; i<ELEMENTOS; i++ )
printf( " %s.\n", dichos[i] );
getch();
}

ING JUAN ALBERTO VAZQUEZ G.


Pgina 35 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

ACTIVIDADES DE APRENDIZAJE

Realice programas y algoritmos que involucren el uso de cadenas de texto.

Evaluacin:

Qu es un string?
Cules son las operaciones bsicas sobre strings?
Realice un algoritmo para unir los dos apellidos de un nombre.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 36 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Unidad 3
DISEO MODULAR.

3.1 Importancia y ventajas del diseo modular.


3.2 Variables globales y locales.
3.3 Procedimientos funcionales.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 37 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

INTRODUCCION:

El diseo forma parte de la ingeniera y consiste en crear un modelo o


representacin del problema que se pretende solucionar, cuando el problema
que necesitamos solucionar es demasiado extenso o complicado suele
separarse por partes o bloques y a cada bloque asignarle una tarea y
posteriormente unificar el conjunto de tareas.
Del diseo depende la calidad de nuestro programa y ms aun de el
depende en mucho de los casos el ofrecer buenas soluciones para crear mejoras
o actualizaciones, un buen programa, un programa separado por partes o
mdulos habla bien del creador y presenta la ventaja que muchas de las partes
pueden ser utilizadas en otros programas.
Hemos echado un vistazo a las ventajas de utilizar diseo modular, pero
Qu ventajas y desventajas presenta?
Dnde y como se utiliza?
Qu programa es apto para utilizar diseo modular?
Estas y otras muchas preguntas sern comprendidas cuando usted finalice
esta unidad prestando atencin a el material bibliogrfico que se proporcion

OBJETIVO:
Comprender las ventajas y desventajas que presenta el diseo modular y
aplicarlo en la elaboracin de sistemas.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 38 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

DISEO MODULAR
Se define como diseo modular, aquella actividad de ingeniera en la cual se
disea y ejecuta un proyecto tendiente a resolver un problema planteado,
desarrollando una metodologa que pretende subdividir el problema general en
tantas partes como sea posible, logrando establecer mdulos de trabajo sobre
los cuales se basar el diseo final. Resolver un problema enfocndolo desde su
perspectiva general puede ser muy difcil, he incluso muchas veces resulta
imposible darle solucin dadas las mltiples variables involucradas en el mismo,
sobre todo en el caso de problemas complejos. Un ingeniero ataca los
problemas modulndolos, es decir estudindolos, clasificndolos por categoras,
y finalmente aislndolos, para darle solucin a todas y cada una de sus partes en
forma individual aplicando criterios lgicos de trabajo. Finalmente la suma de
todas las soluciones modulares dar como resultado la solucin final al problema
original planteado.
En conclusin la programacin modular consiste en descomponer la
aplicacin a realizar en mdulos que se programan y compilan por separado.
Despus, la aplicacin se construye a partir de un programa principal que usa los
mdulos previamente programados.
Cuando los programas son grandes es absolutamente necesario
descomponerlos en mdulos. Cuando se desarrolla una aplicacin informtica
en equipo, cada programador se puede encargar de la realizacin de una
parte que se materializar en uno o varios mdulos y podr de esta forma
trabajar de forma independiente. Posteriormente los diferentes mdulos se unirn
para constituir la aplicacin final.
Otro aspecto importante de la programacin modular es que ofrece la
posibilidad de reutilizar partes de programas ya desarrollados en el diseo de
programas nuevos sin necesidad de volverlos a disear. Este aspecto de la
programacin modular ya lo has utilizado cuando reutilizas algunas de las
libreras (o mdulos) estndar que nos ofrece el lenguaje C++. Por ejemplo
cuando utilizas la librera de entrada/salida stdio mediante la directiva include
del preprocesador C++ que contiene, entre otras, las funciones printf y scanf que
utilizas para leer y escribir en pantalla:
#include <stdio.h>

3.1 Importancia y ventajas del diseo modular.

El diseo modular consiste en la creacin de mdulos o bloques que trabajan


juntos en la solucin de algn problema en particular y dado que estn
separados por bloques es ms fcil crear soluciones en el programa, crear
actualizaciones o incluso tomar partes del cdigo para dar soluciones a
programas similares.
El diseo modular efectivo reduce la complejidad, facilita los cambios y
produce como resultado una implementacin ms sencilla, permitiendo el

ING JUAN ALBERTO VAZQUEZ G.


Pgina 39 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

desarrollo paralelo(al mismo tiempo) de las diferentes partes del sistema y


garantizando con esto la rapidez en los sistemas creados.
Todos los programas de C estn formados por una o ms funciones o
pequeos programas que resuelven problemas sencillos. La nica funcin que
debe estar siempre presente es la denominada main(), y es, adems, la primera
funcin que es llamada cuando comienza la ejecucin el programa. La funcin
main() debe contener un esquema de lo que el programa hace. Ese esquema
estar compuesto por las llamadas a otras funciones, que resolvern ciertas
partes del problema completo. As, la forma general de un programa C ser:
tipo-devuelto main (lista de parmetros)
{
sentencia1
sentencia2
..........
}
tipo-devuelto funcin1 (lista de parmetros)
{
sentencia1
sentencia2
..........
}
............................
tipo-devuelto funcin N (lista de parmetros)
{
sentencia1
sentencia2
..........
}
La programacin modular es uno de los mtodos de diseo ms flexibles y
potentes para mejorar la productividad de un programa, en programacin
modular el programa se divide en mdulos (partes independientes) cada una de
las cuales ejecutan una nica actividad o tarea y se codifican
independientemente de otros mdulos. Cada uno de estos mdulos se analizan,
codifican y ponen a punto por separado. Cada programa tiene un modulo
denominado programa principal que controla todo lo que sucede, se transfiere
el control a submodulos de modo que ellos puedan ejecutar sus funciones, sin
embargo cada submodulo devuelve el control al modulo principal cuando se
haya completado su tarea, si la tarea asignada a cada submdulo es
demasiado compleja, este deber romperse en otros mdulos ms pequeos, el
proceso sucesivo de subdivisin de mdulos continua hasta que cada modulo
tenga solamente una tarea especifica que ejecutar, un modulo puede transferir
temporalmente el control a otro modulo, sin embargo cada modulo debe
devolver el control al modulo del cual se recibe originalmente el control.
Para aplicar el diseo modular existen 2 criterios:
Por criterios Funcionales: Este criterio es el menos usado hoy en da y se refiere
a dividir el programa principal en subprogramas que agrupaban funciones

ING JUAN ALBERTO VAZQUEZ G.


Pgina 40 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

similares, es decir cada uno de estos mdulos estaban relacionados entre si, por
tanto estos mdulos no son independientes, debido a esto era muy difcil
modificarlos ya que el modificar alguno de los mdulos, implicaba modificar
todos los dems mdulos.
Orientado a Objetos (O.O.): Este criterio es el ms usado hoy da, y consiste en
dividir el problema principal, en mdulos (Objetos) que encapsulan juntas la
definicin del objeto y todas sus operaciones. Se refiere a pequeos mdulos
que van a realizar una tarea independiente y especifica encaminada a la
resolucin del problema principal pero sin depender de otro modulo, debido a
esto es muy fcil modificar los mdulos sin afectar otros.
El diseo modular tiene, entre otras ventajas, la posibilidad de reutilizar
mdulos previamente escritos. Es habitual que una vez resuelto un problema
sencillo mediante una funcin o un procedimiento, ese mismo problema, o uno
muy parecido, se nos presente ms adelante, durante la realizacin de otro
programa. Entonces nos bastar con volver a utilizar esa funcin o
procedimiento, sin necesidad de volver a escribirlo.
Es por esto, entre otras razones, que los mdulos deben ser independientes
entre s, comunicndose con otros mdulos nicamente mediante los datos de
entrada (paso de parmetros por valor) y los de salida (devolucin de
resultados). Los mdulos que escribamos de este modo nos servirn
probablemente para otros programas, pero no as los mdulos que padezcan
efectos laterales (se define en el siguiente tema), pues sus relaciones con el resto
del programa del que eran originarios sern diferentes y difciles de precisar.
La programacin modular tiene entonces muchas ventajas:
facilita una buena organizacin del cdigo
facilita el reparto de trabajo entre varios programadores (cada uno
puede dedicarse a implementar uno de los mdulos)
facilita el mantenimiento de las aplicaciones (se puede mejorar un
mdulo sin tener que cambiar ms que los ficheros de ese mdulo)

3.2 Variables globales y locales.

Se llama mbito de una variable a la parte de un programa donde dicha


variable puede utilizarse.
En principio, todas las variables declaradas en un algoritmo son locales a ese
algoritmo, es decir, no existen fuera del algoritmo, y, por tanto, no pueden
utilizarse ms all de las fronteras marcadas por inicio y fin. El mbito de una
variable es local al algoritmo donde se declara.
Cuando el algoritmo comienza, las variables se crean, reservndose un
espacio en la memoria RAM del ordenador para almacenar su valor. Cuando el
algoritmo termina, todas sus variables se destruyen, liberndose el espacio en la
memoria RAM. Todos los resultados que un algoritmo obtenga durante su
ejecucin, por lo tanto, se perdern al finalizar, salvo que sean devueltos al

ING JUAN ALBERTO VAZQUEZ G.


Pgina 41 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

algoritmo que lo invoc o sean dirigidos a algn dispositivo de salida (como la


pantalla). Esta forma de funcionar ayuda a que los algoritmos sean mdulos
independientes entre s, que nicamente se comunican los resultados de sus
procesos unos a otros.
algoritmo cuadrado
variables
N, result son reales
inicio
leer(N)
calcular_cuadrado()
escribir("El cuadrado es ", result)
fin
procedimiento calcular_cuadrado () // Calcula el cuadrado de un nmero
inicio
result = N ^ 2
fin
Vamos a echarle un ojo a el algoritmo que hemos utilizado, primero observe
que se ha utilizado en el rengln 6 un procedimiento que fue creado a partir del
rengln 9 y se llama calcular_cuadrado, este procedimiento devuelve un valor
llamado result en el cual se aloja el resultado del cuadrado de un numero. Este
es el primer acercamiento a un programa que utiliza diseo modular.
Otra observacin es el grave error que hay en el algoritmo, ya que se han
intentado utilizar las variables result y N, que son locales al algoritmo principal, en
el subalgoritmo, desde donde no son accesibles, si se quieren utilizar hay que
volverlas a definir o hacerlas globales.
Es importante sealar que en algunos lenguajes de programacin, y bajo
determinadas circunstancias, cuando un algoritmo invoca a un subalgoritmo,
puede que todas las variables locales del algoritmo estn disponibles en el
subalgoritmo. As, el ejemplo anterior podra llegar a ser correcto. Esto no ocurre
en C, debido a que no se pueden anidar funciones dentro de funciones, pero
debe ser tenido en cuenta por el alumno/a si en algn momento debe
programar en otro lenguaje. El problema que surge en esas situaciones es similar
al de las variables globales que tratamos a continuacin.
Las variables globales
En ocasiones es conveniente utilizar variables cuyo mbito exceda el del
algoritmo donde se definen y puedan utilizarse en varios algoritmos y
subalgoritmos. Las variables globales implican una serie de riesgos, como
veremos ms adelante, por lo que no deben utilizarse a menos que sea
estrictamente necesario. A pesar de los riesgos, la mayora de los lenguajes de
programacin disponen de algn mecanismo para manejar variables globales.
Aunque ese mecanismo vara mucho de un lenguaje a otro, diremos como
regla general que las variables globales deben declararse en el algoritmo
principal, anteponiendo el identificador global al nombre de la variable, siendo
entonces accesibles a todos los algoritmos y subalgoritmos que conformen el
programa.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 42 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

algoritmo cuadrado
variables
global N es real
global result es reales
inicio
leer(N)
calcular_cuadrado()
escribir("El cuadrado es ", result)
fin
procedimiento calcular_cuadrado
inicio
result = N ^ 2
fin
El error que exista antes ya no ocurre, porque ahora las variables result y N han
sido declaradas como globales en el algoritmo principal, y por lo tanto pueden
utilizarse en cualquier subalgoritmo, como cuadrado().
Pudiera ocurrir que una variable global tenga el mismo nombre que una
variable local. En ese caso, el comportamiento depende del lenguaje de
programacin (los hay que ni siquiera lo permiten), pero lo habitual es que la
variable local sustituya a la global, haciendo que sta ltima sea inaccesible
desde el interior del subalgoritmo. Al terminar la ejecucin del subalgoritmo y
destruirse la variable local, volver a estar accesible la variable global que,
adems, habr conservado su valor, pues no ha podido ser modificada desde el
subalgoritmo.
De todas formas, y puestos a evitar la utilizacin de variables globales (a
menos que no quede otro remedio), con ms razn an evitaremos usar
variables locales que tengan el mismo nombre que las globales.
Al utilizar variables globales, muchas de las ventajas de la programacin
modular desaparecen.
Efectivamente, la filosofa de la programacin modular consiste en disear
soluciones sencillas e independientes (llamadas mdulos) para problemas
sencillos, haciendo que los mdulos se comuniquen entre s slo mediante el
paso de parmetros y la devolucin de resultados.
Cuando empleamos variables globales como en el ejemplo anterior, se crea
una comunicacin alternativa entre mdulos a travs de la variable global.
Ahora un mdulo puede influir por completo en otro modificando el valor de una
variable global. Los mdulos dejan de ser cajas negras y pasan a tener fuertes
dependencias mutuas que es necesario controlar. Cuando el programa es
complejo y consta de muchos mdulos, ese control de las dependencias es
cada vez ms difcil de hacer.
Cualquier comunicacin de datos entre un algoritmo y un subalgoritmo al
margen de los parmetros y la devolucin de resultados se denomina efecto
lateral. Los efectos laterales, como el ilustrado en el ejemplo anterior, son
peligrossimos y fuente habitual de malfuncionamiento de los programas. Por esa
razn, debemos tomar como norma:

ING JUAN ALBERTO VAZQUEZ G.


Pgina 43 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Primero, evitar la utilizacin de variables globales.


Segundo, si no quedara ms remedio que emplear variables globales,
no hacer uso de ellas en el interior de los procedimientos y las funciones,
siendo preferible pasar el valor de la variable global como un parmetro
ms al subalgoritmo.

3.3 Procedimientos funcionales.

En los programas que hemos hecho hasta ahora todo el cdigo se encuentra
en el programa principal (a partir del main). Esta estrategia resulta problemtica
cuando tenemos programas grandes, porque al encontrarse todo el cdigo en
el programa principal es ms difcil de entender, detectar errores, hacer
modificaciones, etc.
Todos los lenguajes de programacin tienen algn mecanismo que permite
definir bloques de cdigo o como lo hemos llamado anteriormente mdulos que
se escriben aparte del programa principal. Cada bloque realiza una cierta
operacin con entidad lgica (por ejemplo, ordenar un vector, o escribir unos
datos en pantalla), y el programa principal activa los bloques de cdigo cuando
necesita realizar esas operaciones.
Organizar los programas usando bloques hace que el cdigo est mejor
organizado y sea ms fcil de entender (y por tanto, de mantener). Incluso en
algunas ocasiones, el programa principal activa un mismo bloques varias veces,
con lo cual, aunque el cdigo ejecuta varias veces, slo hay que escribirlo una
vez.
Trabajaremos ahora con un ejemplo sencillo que ilustre lo aprendido.

#include <stdio.h>
void imprimir_mensaje()
{
printf("Dentro de la funcin imprimir_mensaje\n");
}
void main()
{
imprimir_mensaje();
printf("De nuevo en el programa principal\n");
}
En el programa anterior, main() es el punto de entrada al programa, y una vez
que comienza su ejecucin, se transfiere el control a la funcin
imprimir_mensaje(). Una vez en ella, la funcin imprime el mensaje en la terminal
y el control vuelve a la rutina principal. Despus de la llamada a la funcin, la
ejecucin continuar en el punto en el que se llam a dicha funcin.
Dejo en sus manos la solucin de ejercicios que involucren funciones o
procedimientos, puede apoyarse con el ejercicio que aparece al final del
capitulo 2 en el cual se hace uso de funciones y que adems tiene una
estructura modular.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 44 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

EJEMPLOS VISTOS EN CLASE


EJEMPLO 01
#include <stdio.h>
void multiplos (int a)
/* definicin de funcin */
{
int i;
for (i=a*2; i<=100; i=i+a)
printf (" %d", i);
}
main ()
/* funcin principal */
{
int i=3;
while (i <= 7)
{
printf ("\n Mltiplos del %d :", i);
multiplos (i);
i=i +1;
}}

ING JUAN ALBERTO VAZQUEZ G.


Pgina 45 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

ACTIVIDADES DE APRENDIZAJE

Realice programas y algoritmos que pueda separar por modulos.

Evaluacin:

El siguiente cdigo corresponde a un ejercicio que fue realizado utilizando


mdulos, sin utilizar mdulos redisee el programa.
#include <stdio.h>
void factorial (int x) /* definicin de funcin */
{
int i;
long int fac = 1;
for (i=2; i<=x; i=i+1) fac=fac*i;
printf ("El factorial de %d es %ld", x, fac);
}
main () /* funcin principal */
{
int a;
do
{
printf ("\n Introduce el nmero ");
scanf ("%d", &a);
if (a>0)
factorial (a);
} while (a > 0);
}

ING JUAN ALBERTO VAZQUEZ G.


Pgina 46 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Unidad 4
DISEO MODULAR.

4.1 Pilas.
4.1.1 Operaciones bsicas sobre pilas: push y pop.
4.1.2 Implementacin de la pila mediante arreglos unidimensionales.
4.1.3 Ejemplos de aplicacin.
4.2 Colas.
4.2.1 Operaciones bsicas sobre colas.
4.2.2 Implementacin de una cola mediante arreglos unidimensionales.
4.2.3 Ejemplos de aplicacin.
4.3 Otras listas y su implementacin esttica.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 47 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

INTRODUCCION:

En programacin, una estructura de datos es una forma de organizar un


conjunto de datos elementales (un dato elemental es la mnima informacin que
se tiene en el sistema) con el objetivo de facilitar la manipulacin de estos datos
como un todo o individualmente.
Una estructura de datos define la organizacin e interrelacin de estos, y un
conjunto de operaciones que se pueden realizar sobre l. Las operaciones
bsicas son:
Alta, adicionar un nuevo valor a la estructura.
Baja, borrar un valor de la estructura.
Bsqueda, encontrar un determinado valor en la estructura para realizar
una operacin con este valor, en forma SECUENCIAL o BINARIO (siempre
y cuando los datos estn ordenados)...
Las dos primeras operaciones mantendrn ocupada nuestra atencin a lo
largo de este capitulo y la tercera operacin no hace falta verla dado que fue
vista en el primer capitulo.
Otras operaciones que se pueden realizar son:
 Ordenamiento, de los elementos pertenecientes a la estructura.
 Apareo, dadas dos estructuras originar una nueva ordenada y que
contenga a las apareadas.
Cada estructura ofrece ventajas y desventajas en relacin a la simplicidad y
eficiencia para la realizacin de cada operacin. De esta forma, la eleccin de
la estructura de datos apropiada para cada problema depende de factores
como la frecuencia y el orden en que se realiza cada operacin sobre los datos.

OBJETIVO:
Conocer las diversas estructuras que existen para la solucin de problemas y
mostrar la diversas aplicaciones que se puede hacer de cada estructura.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 48 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Las estructuras de datos simples se pueden combinar de varias maneras para


formar estructuras ms complejas. Las dos clases principales de estructuras de
datos son las lineales y las no lineales, dependiendo de la complejidad de las
relaciones lgicas que representan. Las estructuras de datos lineales incluyen
pilas, colas y listas ligadas lineales y sern vistas en este cuatrimestre. Las
estructuras de datos no lineales incluyen grafos y rboles que sern vistas en el
siguiente cuatrimestre.

4.1 Pilas.

Una pila (stack) es una coleccin ordenada de elementos en la cual se


pueden insertar nuevos elementos por un extremo y se pueden retirar otros por el
mismo extremo.
Si tenemos un par de elementos en la pila, uno de ellos debe estar en la parte
superior de la pila, que se considera el ms alto'' en la pila que el otro. En la
figura el elemento F es el ms alto de todos los elementos que estn en la pila. El
elemento D es el ms alto de los elementos A,B,C, pero es menor que los
elementos E y F.

Para describir cmo funciona esta estructura, debemos agregar un nuevo


elemento, el elemento G. Despus de haber agregado el elemento G a la pila,
la nueva configuracin es la que se muestra en la figura.

De acuerdo con la definicin, existe solamente un lugar en donde cualquier


elemento puede ser agregado a la pila. Despus de haber insertado el nuevo
elemento, G ahora es el elemento en la cima. Debemos aclarar en qu pila
deseamos insertar elementos, puesto que es posible tener ms de una pila al
mismo tiempo.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 49 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Cuando se desea retirar un elemento de la pila, solo basta ordenar que sea
retirado un elemento; no podemos decir ``retira C de la pila'', porque C no est
en la cima de la pila y solamente podemos retirar el elemento que est en la
cima. Para que la sentencia:Retira C de la pila'' tenga sentido, debemos
replantear las rdenes a algo como:
Retira de la pila hasta que el elemento retirado sea C.
Ni siquiera es necesario decir: Retira un elemento de la pila...'' porque es
sobreentendido que solamente se puede sacar un elemento a la vez.
Siguiendo nuestro ejemplo, ahora deseamos retirar de la pila P. La
configuracin global de la pila es como se muestra en la figura.

El concepto de pila es muy importante en computacin y en especial en


teora de lenguajes de programacin. En lenguajes procedurales como Pascal o
C, la pila es una estructura indispensable, debido a las llamadas a funcin.
Resulta que el flujo de instrucciones va de arriba hacia abajo, y cuando ocurre
una llamada a alguna funcin, el estado global del sistema se almacena en un
registro y ste en una pila. As que la pila va a contener todas las llamadas a
procedimientos que se hagan.
Cuando se termina de ejecutar algn procedimiento, se recupera el registro
que est en la cima de la pila. En ese registro estn los valores de las variables
como estaban antes de la llamada a la funcin, o algunas pueden haber
cambiado su valor, dependiendo del mbito de las variables.
Cada elemento en la pila que es retirado, significa que se ha terminado de
ejecutar alguna funcin. Cuando se termina de ejecutar el programa, la pila de
llamadas a subprogramas debe haber quedado en 0 tambin, de otro modo
podra causar algn tipo de error.
Esto nos lleva a pensar en otras utilidades de la pila. La pila sirve para
encontrar errores.
La dinmica de la pila, es decir, la manera en cmo entran los datos a la
estructura de datos y cmo salen, se denomina FIFO, que viene del ingls first in
first out (primero en entrar, primero en salir).

ING JUAN ALBERTO VAZQUEZ G.


Pgina 50 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

En la figura se fotografa en distintos momentos de la pila, cuando se desea


insertar H justo debajo de F. Para hacer esto se requiere, retirar tantos elementos
como sean necesarios, aqu se han retirado de la cima G y F para luego insertar
H, que quedar posteriormente debajo de F.
Lo que sucede es que, cuando se retira el elemento G se debe hacer una
evaluacin para determinar si el elemento retirado es el elemento objetivo, en
este caso el elemento objetivo es F, puesto que se desea insertar un elemento
debajo de F.
Despus de haber insertado F, insertamos de nuevo los elementos F y G en ese
orden, adems de insertar finalmente el elemento I que queda en la cima de la
pila. Enseguida veremos con ms detalle las operaciones bsicas de las pilas.
En la vida cotidiana existen muchos ejemplos de pilas, una pila de platos en
una alacena, una pila de latas en el supermercado, una pila de papeles sobre el
escritorio, etc.

4.1.1 Operaciones bsicas sobre pilas: push y pop.

Las operaciones bsicas de una pila son:


La operacin push
Esta operacin sirve para insertar un elemento e en la pila S, lo vamos a escribir
como:
push(S,e)
Despus de hacer esta operacin sucede que:
El elemento en la cima de la pila S ahora es e.
La operacin pop

ING JUAN ALBERTO VAZQUEZ G.


Pgina 51 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Para retirar un elemento de la pila S y asig


asignarlo
narlo a una variable del mismo tipo
que el tipo de los elementos de la pila, usaremos la operacin pop escribindola
como:
v=pop(S);
En donde v es una variable que almacena el valor del elemento que estaba
en la cima de S. Hacer esta operacin tiene algunas implicaciones:
La variable v debe ser del mismo tipo que los elementos almacenados en la
pila.
Solamente se puede retirar un elem
elemento de la pila a la vez.
Antes de la operacin, e era el elemento en la cima, ahora ya no lo es ms. El
apuntador cima decrece en una unidad.
La operacin stackempty
Esta operacin toma como argumento una estructura del tipo stack (pila) y
devuelve un n valor booleano, devuelve un true si la pila est vaca y devuelve un
false si la pila tiene al menos un elemento, es decir:

La operacin stacktop
La operacin stacktop(S) devuelve el valor del elemento en la cima de la pila
S. Para hacer esta operacin escribiremos:
v=stacktop(S)
las implicaciones de usar esta operacin es hacer una copia del elemento
que est en la cima
En realidad se hacen dos operaciones, primero se hace v=pop(S), luego un
push(S,v), porque despus de la operacin stacktop, la pila S queda sin cambio
alguno.
Despus de haber visto las operaciones est estamos
amos en condiciones de
implementar una pila a partir de lo que hemo hemos revisado a lo largo de los
diferentes captulos,, cuidando de separar uno a uno los mdulos para explicarlos
y que usted cuando desee compilarlo solo tenga que juntar los mdulos en un
solo archivo.
#include<iostream.h>
#include<ctype.h>
#include<stdlib.h>
void push(int *b, int pila_i[10])
{
if(*b==10)
cout << "El maximo de elementos en la pila es de 10n";
else
{
cout << "Ingresa el elemento a la pila";
cin >> pila_i[*b];
*b=*b+1;

ING JUAN ALBERTO VAZQUEZ G.


Pgina 52 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

}
}
Esta es la funcin push en ella estamos trabajando con una pila que acepta
10 caracteres y se utiliza adems la variable b para ir cargando la posicin de la
pila. Los elementos como seguramente noto se almacenan realmente en un
registro.
void pop(int *c, int pila_e[10])
{

if (*c<=0)
{
cout << "No hay elementos en la pila, Ingrese un elemento primeron";
}
else
{
*c=*c-1;
cout << "nElemento expulsado de la fila:n";
cout << pila_e[*c];
}
}
Ahora hemos insertado la funcin pop esta encargada de eliminar a partir del
ultimo elemento que se inserto el contenido de la pila, en esta funcin es
importante considerar cuando no contemos con elementos en la pila y mandar
un aviso a la salida diciendo que la pila no cuenta con elementos y por lo tanto
no puede mostrar nada tal y como lo hemos hecho nosotros.
void mostar(int *cima, int pila_m[10])
{
int control;
cout << "tttELEMENTOS DE LA PILAnn";
for (control=0; control<*cima; control++)
cout << pila_m[control] << " ";
}
Este modulo solo se utiliza para mostrar los elementos con los que cuenta la
pila
void main()
{
int opcion, cima=0, pila[10];
char ans='s';

while (ans=='s')
{
cout << "SELECCIONE UNA OPCION DE LAS SIGUIENTES:n1)Ingresar
elementot2)Sacar elementot3)Mostrar elementosnnttOpcion=";
cin >> opcion;
switch(opcion)
{
case 1: push(&cima, pila);
break;

ING JUAN ALBERTO VAZQUEZ G.


Pgina 53 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

case 2: pop(&cima, pila);


break;
case 3: mostar(&cima, pila);
break;
default: cout << "ntttOpcion no validan";
}
cout << "nnRealizar Operacion: s/nn";
cin >> ans;
ans=tolower(ans);
}
}
Finalmente hemos insertado lo que es el programa principal en el cual
tambin hemos definido varias de las variables que estaremos utilizando como lo
es la cima en la cual se colocara el ultimo elemento de la pila, se defini la
misma pila y finalmente se hizo uso de la funcin switch para contar con un
men til para el usuario final.
En C++, la STL nos proporciona una clase pila. La forma de declararla es la
siguiente
#include <stack> // aqu esta implementada la clase
stack <int> s; // stack <tipo_de_dato> nombre_de_la_pila;
Las funciones para trabajar con ella son las siguientes
s.push(x); // inserta x en la pila (push)
s.pop(); // elimina el tope de la pila (pop)
s.top(); // regresa el tope de la pila (top)
s.empty() // esta vacia la pila? (empty)

4.1.2 Implementacin de la pila mediante arreglos unidimensionales.

Las pilas no son estructuras de datos fundamentales, es


decir, no estn definidas como tales en los lenguajes de
programacin. Podemos representar una pila usando un
arreglo. Para hacerlo debemos definir el tamao mximo de
la pila, adems de un apuntador al ltimo elemento
insertado en la pila el cual denominaremos SP. La
representacin grfica de una pila es la ilustrada en la figura
siguiente.
Como utilizamos un arreglo para implementar la pila, tenemos la limitante de
espacio de memoria reservada. Una vez establecido un mximo de capacidad
para la pila, ya no es posible insertar ms elementos.
Una implementacin en lenguaje C es la siguiente:
#define SIZE 100 // tamao mximo de la pila
int pila[SIZE]; // arreglo que usaremos como pila
int tope = 0; // tope de la pila, si tope = 0 la pila esta vacia

pila[tope++] = x; // inserta x en la pila (push)


pila[--tope]; // elimina el tope de la pila (pop)
ING JUAN ALBERTO VAZQUEZ G.
Pgina 54 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

pila[tope-1]; // regresa el tope de la pila (top)


tope == 0 // esta vacia la pila ? (empty)

4.1.3 Ejemplos de aplicacin.

Algunas aplicaciones de las pilas son:


1. Para modelar 'pilas reales' en el mundo de las computadoras: Recursin,
Llamadas a procedimientos, etc. Push al entrar al procedimiento, pop al
salir del procedimiento.
2. Verificar si los parntesis de una expresin estn balanceados. Push al
encontrar un "(" y pop al encontrar un ")".
3. Conversin de expresiones matemticas (infija, prefija, posfija).
4. Evaluacin de expresiones en notacin posfija.
5. Recorrido de grafos, bsqueda en profundidad. Push al descubrir un
vrtice, pop al terminar de visitar todas sus posibilidades.
En las matemticas y la qumica se hace uso de expresiones que involucran
parntesis y cada parntesis que se abre debe de ser cerrado una forma de
hacerlo es hacer uso del siguiente algoritmo.
1. Inicializar la pila
2. Mientras no se alcance el fin de la expresin
3. Si el caracter es:
4. PARENTESIS IZQUIERDO. Colocarlo en la pila
5. PARENTESIS DERECHO.
6. Si la pila esta vaca ir al paso 4.
7. Si el parntesis derecho no corresponde con el parntesis que est en
la pila ir al paso 4.
8. Sacar el parentsis de la pila.
9. OTRO CARACTER. Continua
10. Desplegar mensaje indicando que es correcto, ir al paso 5
11. Desplegar mensaje de error, ir al paso 5
12. FIN
La idea principal es ir almacenando los parntesis que se abren y cada vez
que se cierre un parntesis mandar a traer uno que se abri antes de modo tal
que cuando la pila este vaca se de por terminada la expresin.
Se ha implementado una pila en C++, maneja funciones que tal vez le resulten
desconocidas de momento, pero en la primera y segunda referencia(al final de
la antologa) se explica cada una de estas funciones.
#include <stdio.h>
#include <stdlib.h>
int x[10],lugar=0;
int imprime_pila()
{
int i;
if (lugar==0)
{
fprintf(stderr,"La pila est vaca\n");
return 0;

ING JUAN ALBERTO VAZQUEZ G.


Pgina 55 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

}
for (i=0;i<lugar;i++)
printf("%d ",x[i]);
printf("\n");
return 0;
}
int mete_pila(int a){
if (lugar==10)
{
fprintf(stderr,"La pila est llena\n");
return 0;
}
x[lugar]=a;
lugar++;
return 0;
}

int saca_pila()
{
int ex;
if (lugar==0)
{
fprintf(stderr,"La pila est vaca\n");
return 0;
}
ex=x[lugar-1];
lugar--;
return ex;
}
int main(){
int opt,a,ex;
char buff[64];

for(;;)
{
printf("Que deseas hacer?\n");
printf("[1] Meter un elemento a la pila\n");
printf("[2] Sacar un elemento de la pila\n");
printf("[3] Imprimir la pila\n");
printf("[0] Salir\n");
printf("Opcin: ");
opt=atoi(fgets(buff,64,stdin));
//atoi convierte de string a entero.
//el 64 indica que me guarda las 64 veces que
//presione el teclado. 64 caracteres
switch(opt)
{
case 0:
printf("Bye Bye\n");
return 0;

ING JUAN ALBERTO VAZQUEZ G.


Pgina 56 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

case 1:
printf("Que nmero deseas meter a la pila?\n");
a=atoi(fgets(buff,64,stdin));
mete_pila(a);
break;
case 2:
ex=saca_pila();
printf("Se elimino el nmero %d de la pila\n",ex);
break;
case 3:
imprime_pila();
break;
default:
printf("Opcin no vlida\n");
}
}
return 0;
}

4.2 Colas.

Una cola es una estructura de datos de acceso restrictivo a sus elementos. Un


ejemplo sencillo es la cola del cine o del autobs, el primero que llegue ser el
primero en entrar, y afortunadamente en un sistema informtico no se cuela
nadie salvo que el programador lo diga.
Las colas sern de ayuda fundamental para ciertos recorridos de rboles y
grafos.
Las colas son una estructura de datos similar a las pilas. Recordemos que las
pilas funcionan en un depsito en donde se insertan y se retiran elementos por el
mismo extremo. En las colas sucede algo diferente, se insertan elementos por un
extremo y se retiran elementos por el otro extremo. De hecho a este tipo de
estructura se les conoce como estructuras fifo'' (first in, first out) porque
funcionan como una tubera, lo que entra primero por un extremo, sale primero
por el otro extremo.
En una cola hay dos extremos, uno es llamado la parte delantera y el otro
extremo se llama la parte trasera de la cola. En una cola, los elementos se retiran
por la parte delantera y se agregan por la parte trasera.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 57 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

En la figura se muestra una actividad tpica de la col


cola,
a, en donde se muestra
que se agregan datos por la parte trasera de la cola y se elimina datos por el
frente de la cola.

Si es una cola y es un elemento, se pueden hacer tres operaciones


bsicas con las colas:
1. insert(Q,x),
Q,x), que inserta el elemento x en la parte trasera de la cola Q.
2. x=remove(Q), que almacena en x el valor del elemento retirado de la
parte frontal de la cola Q.
3. empty(Q), que es un predicado de valor booleano, y es verdadero
cuando la cola Q tiene 0 ele elementos,
mentos, y es falso cuando la cola Q tiene al
menos un elemento, en cuyo caso, ese nico elemento es la parte
frontal y la parte trasera de la cola al mismo tiempo.
Estas operaciones sern vistas ms a detalle en el prximo subtema.
Tericamente no hay lm lmite
ite para el tamao de la cola, asi que siempre se
debera poder insertar elementos a una cola, sin embargo, al igual que las pilas,
normalmente se deja un espacio de memoria para trabajar con esta estructura.
De manera similar a las pilas, las colas definen una estructura no estndar, de
manera que se debe crear un nuevo tipo de dado, el tipo cola, que debe tener
los siguientes elementos:
 Un arreglo de elementos de algn tipo especfico, puede incluso ser
un tipo estndar o no.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 58 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

 Un nmero que indica el elemento que est en la posicin del frente de


la cola.
 Un nmero que indica el elemento que est en la posicin trasera de la
cola.
Suponiendo que los elementos son nmeros enteros, una idea para
representar una cola en C/C++ es usar un arreglo para contener los elementos y
emplear otras dos variables para representar la parte frontal y trasera de la cola.
#define maxQueue 100
struct cola{
int items[maxQueue];
int front;
int rear;
};
Esta representacin con arreglos es completamente vlida, pero debemos
tener cuidado con los lmites del arreglo. Suponiendo que no existiera la
posibilidad de caer en un desbordamiento del arreglo, es decir, que se insertaran
ms elementos de lo que el arreglo puede almacenar. A este tipo de error se le
llama overflow

4.2.1 Operaciones bsicas sobre colas.

Las operaciones bsicas en una cola son:


 Crear_Cola: Esta operacin consistir en definir la variable del tipo
nuevo declarado, Cola (array que permitir almacenar la informacin y
las variables que apuntarn a los extremos de la estructura) e iniciar los
valores de manera que se indique explcitamente que la cola, trs la
creacin, est vaca.
 Encolar(x): Es insertar el elemento x al final de la cola (enqueue en
ingls).
 Sacar(): Consiste en retornar el elemento que se ubica al inicio de la
cola (dequeue en ingls).
 Vacia(): retorna verdadero si la cola esta vaca, falso en caso contrario.
Las variables de instancia necesarias en la implementacin son:
primero: indica el ndice de la posicin del primer elemento de la cola, es
decir, la posicin el elemento a retornar cuando se invoque sacar.
ultimo: indica el ndice de la posicin de ltimo elemento de la cola. Si se
invoca encolar, el elemento debe ser insertado en el casillero siguiente al que
indica la variable.
numElem: indica cuntos elementos posee la cola. Definiendo MAX_ELEM
como el tamao mximo del arreglo, y por lo tanto de la cola, entonces la cola
esta vaca si numElem==0 y est llena si numElem==MAX_ELEM.
Un detalle faltante es el siguiente: qu pasa si la variable ultimo sobrepasa el
rango de ndices del arreglo? Esto se soluciona definiendo que si despus de
insertar un elemento el ndice ultimo == MAX_ELEM, entonces se asigna ultimo = 0,

ING JUAN ALBERTO VAZQUEZ G.


Pgina 59 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

y los siguientes elementos sern insertados al comienzo del arreglo. Esto no


produce ningn efecto en la lgica de las operaciones del TDA, pues siempre se
saca el elemento referenciado por el ndice primero, aunque en valor absoluto
primero > ultimo. Este enfoque es conocido como implementacin con arreglo
circular, y la forma ms fcil de implementarlo es haciendo la aritmtica de
subndices mdulo MAX_ELEM.

CREAR COLA:
Es obvio que toda cola que se crea estar vaca por lo tanto desde inicio
podemos definir la cola vaca y nuestro algoritmo ser:
Algoritmo Cola_Vacia
Entrada
queue: Cola
Salida
(CIERTO, FALSO)
Inicio
Si ( queue.ini = queue.fin ) entonces
Devolver ( CIERTO )
Sino
Devolver ( FALSO )
Fin_si
Fin
Como se observa en el presente algoritmo dependiendo de la situacin de las
variables de inicio y fin podemos determinar cuando nuestra cola esta vaca, As
si en inicio es igual a el final nuestra cola esta vaca.

INSERTAR ELEMENTO EN COLA:


Al igual que en las pilas, la insercin de elementos est condicionada por la
representacin que se hace de la estructura. Al representar la cola con un array
(tamao finito), es preciso comprobar previamente si existe espacio disponible
en la cola para almacenar ms informacin. En el caso en que se pueda insertar
la nueva informacin, la colocaremos en el lugar correspondiente dentro del
vector y actualizaremos las marcas de inicio y final de la cola.
Algoritmo Encolar
Entradas
x: Valor {* elemento que desea insertar *}
queue: Cola de Valor
Salidas

ING JUAN ALBERTO VAZQUEZ G.


Pgina 60 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

queue
Inicio
{* comprobar si en la cola se pueden insertar ms elementos *}
{* esto es necesario por el tipo de representacin de la estructura *}
Si ( queue.fin = MAX ) entonces
Error "cola llena"
Sino
queue.info [queue.fin] x
queue.fin queue.fin + 1
Fin_sino
Fin
Suponiendo que la cola no este llena es necesario luego de insertar el valor
actualizar el inicio y fin de la cola.

ELIMINAR ELEMENTO EN COLA:


Para eliminar elementos de la estructura, es preciso determinar si realmente
hay informacin que extraer, sino el algoritmo debe detectar el error,
independientemente de la representacin concreta de la cola.
Algoritmo Desencolar
Entradas
queue: Cola de Valor
Salidas
queue: Cola, x: Valor
Inicio
{* Comprobar si se pueden eliminar elementos de la cola *}
{* esta operacin no depende de la representacin, siempre es necesaria *}
Si ( Cola_Vacia (queue) ) entonces
Error cola vacia
sino
{* Esta operacin no sera realmente necesaria *}
queue.ini queue.ini + 1
Fin_si
Fin
Si pens que esta tarea seria difcil, ahora ve que no es as solo basto con
actualizar la posicin de inicio a la posicin inicio+1 que es el prximo lugar, seria
conveniente en caso de que no se trate de una cola circular realizar un
corrimiento de posiciones con el fin de no dejar lugares vacios y con esto evitar
el desbordamiento (overflow).

4.2.2 Implementacin de una cola mediante arreglos unidimensionales.

Esta implementacin es esttica, es decir, da un tamao mximo fijo a la cola.


No se incluye comprobacin de errores dentro del encolado y el
desencolado, pero se implementan como funciones aparte.
Podra hacerse con un array secuencial como se muestra en las siguientes
figuras. 'Entrada' es la posicin de entrada a la cola, y 'Salida' por donde salen.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 61 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

En esta primera figura se observa que se han introducido tres elementos: 3, 1 y


4 (en ese orden):

se desencola, obteniendo un 3:

se encola un 7:

Enseguida se aprecia que esto tiene un grave defecto, y es que llega un


momento en el que se desbo
desborda
rda la capacidad del array. Una solucin nada
efectiva es incrementar su tamao. Esta implementacin es sencilla pero
totalmente ineficaz.
Como alternativa se usa el array circular. Esta estructura nos permite volver al
comienzo del array cuando se llegue al final, ya sea el ndice de entrada o el
ndice de salida.

4.2.3 Ejemplos de aplicacin.

Las colas son utilizadas para solucionar una amplia variedad de tareas del tipo
FIFO. Se utilizan generalmente en sistemas donde existen recursos compartidos.
Una aplicacinin interesante es la cola de impresin cuando se manda a imprimir
por ejemplo 50 pginas desde distintas impresoras.
En general las colas, al igual que las pilas, resultan de aplicacin habitual en
muchos problemas informticos. Quizs la aplicacin ms c comn
omn de las colas es
la organizacin de tareas de un ordenador. En general, los trabajos enviados a
un ordenador son "encolados" por ste, para ir procesando secuencialmente
todos los trabajos en el mismo orden en que se reciben. Cuando el ordenador
recibe el encargo de realizar una tarea, sta es almacenada al final de la cola
de trabajos. En el momento que la tarea que estaba realizando el procesador
acaba, ste selecciona la tarea situada al principio de la cola para ser
ejecutada a continuacin. Todo es esto
to suponiendo la ausencia de prioridades en
los trabajos. En caso contrario, existir una cola para cada prioridad. Del mismo
modo, es necesaria una cola, por ejemplo, a la hora de gestionar eficientemente
los trabajos que deben ser enviados a una impresor impresora
a (o a casi cualquier
dispositivo conectado a un ordenador). De esta manera, el ordenador controla

ING JUAN ALBERTO VAZQUEZ G.


Pgina 62 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

el envi de trabajos al dispositivo, no enviando un trabajo hasta que la impresora


no termine con el anterior.
Se ha implementado una cola en C++, maneja funciones que tal vez le
resulten desconocidas de momento, pero en la primera y segunda referencia(al
final de la antologa) se explica cada una de estas funciones.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define FIN 10
int x[FIN],lugar=0;
void imprime_cola()
{
int i;
if (lugar==0)
{
fprintf(stderr,"No hay elementos en la cola\n");
}
for (i=0;i<lugar;i++)
{ printf("%d\t ",x[i]); }
}

int mete_cola(int a)
{
if (lugar==FIN)
{
fprintf(stderr,"No hay lugar en la cola\n");
return 0;
}
x[lugar]=a; //AQUI YA TENGO EL VALOR DE lugar
lugar++;
return 1;
}

int saca_cola()
{
int i,ex;
if (lugar==0)
{
fprintf(stderr,"No hay elementos en la cola\n");
return -999;
}
ex=x[0];
for(i=0;i<lugar;i++)
{
x[i]=x[i+1]; //VAMOS CORRIENDO LOS VALORES
} //DE LUGAR.
lugar--;
return ex;
}

ING JUAN ALBERTO VAZQUEZ G.


Pgina 63 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

int main(){
int opt,a,ex;
char buff[64];
clrscr();
for(;;)
{
printf("\nQue deseas hacer?\n");
printf("[1] Meter un elemento a la cola\n");
printf("[2] Sacar un elemento de la cola\n");
printf("[3] Imprimir la cola\n");
printf("[0] Salir\n");
printf("Opcin: ");
opt=atoi(fgets(buff,64,stdin));
switch(opt)
{
case 0:
printf("Bye Bye\n");
return 0;
case 1:
printf("Que nmero deseas meter a la cola?\n");
a=atoi(fgets(buff,64,stdin));
mete_cola(a);
break;
case 2:
ex=saca_cola();
printf("Se elimino el nmero %d de la cola\n",ex);
break;
case 3:
imprime_cola();
break;
default:
printf("Opcin no vlida\n");
}}
return 0;
}

4.3 Otras listas y su implementacin esttica.

Una lista es una estructura de datos homognea y dinmica, que va a estar


formada por una secuencia de elementos, donde cada uno de ellos va seguido
de otro o de ninguno.
 Homognea: Todos los elementos que la forman tienen el mismo tipo
base, este tipo de listas sern vistas en este capitulo.
 Dinmica: Puede crecer o decrecer en tiempo de ejecucin segn
nuestras necesidades estas listas pertenecen a Algoritmos y Estructuras
de datos II.
Dos listas pueden ser diferentes si:
I. No tienen el mismo nmero de elementos:

ING JUAN ALBERTO VAZQUEZ G.


Pgina 64 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

a. L1: gato, perro.


b. L2: gato, canario, cerdo.
II. Cuando, aun teniendo el mismo nmero de elementos, estos son distintos:
a. L1: gato, perro.
b. L2: gato, cerdo.
III. Cuando, aun teniendo el mismo nmero de elementos y siendo estos los
mismos, no estn dispuestos en el mismo orden.
a. L1: gato, perro.
b. L2: perro, gato.
Hay varios criterios para clasificar las listas: segn su modo de acceso o segn
su informacin de acceso.
Modo De Acceso.
Atendiendo a este, se dividen en densas y enlazadas. El modo de acceso es
independiente de la implementacin realizada.
Listas densas
Se caracterizan porque los elementos siguen una secuencia fsica. Sabemos
cuales es el siguiente elemento porque para acceder a l hemos tenido que
pasar por todos los anteriores.
La localizacin de un elemento cualquiera ser:
El primero si es el primer elemento de la lista.
N-esimo si para llegar a el hemos pasado por N-1 elementos.
Siguen una estructura fsica secuencial luego se pueden implementar
utilizando ficheros, ARRAYS y punteros.
Listas enlazadas
Son aquellas en las que cada elemento que los compone contiene la
informacin necesaria para acceder al elemento siguiente. La localizacin de un
elemento cualquiera ser:
Un elemento de la lista tendr la direccin K si K es el primero y K es conocido
(direccin de inicio).
Estar en la direccin J si J est contenida en el elemento anterior.

Informacin de acceso.
Listas ordinales
Los elementos se van colocando en la lista a medida que llegan y se
identifican por el orden de llegada. El acceso a un elemento es por su orden o
posicin relativa dentro de la lista.
Listas calificadas
Los elementos se clasifican por una clave y pueden estar ordenados o no
estarlo. A un elemento se accede por la informacin contenida en un campo
clave.
Mientras que en la primera clase importa en orden de llegada, en la segunda
depende de la clave.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 65 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Esto es realmente muy metdico, pero pretender acercarle a la creacin y


manejo de listas, colas y pilas que sern vistas de un modo ms profundo en el
siguiente cuatrimestre, es aconsejable la realizacin de algoritmos y ejercicios
que involucren la practica de listas, pilas y colas con el fin de reforzar los
conocimientos.

ACTIVIDADES DE APRENDIZAJE

Realice un resumen de no ms de una cuartilla y posteriormente resuelva el


ejercicio de la evaluacin.

Evaluacin:

Realice un programa o algoritmo para poder insertar elementos por


cualquiera de los dos extremos y eliminarlos de igual forma.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 66 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

GLOSARIO DE TERMINOS:

Argumento: Variable que puede ser recibida por una subrutina o programa.
Base de datos: Conjunto de datos que pertenecen al mismo contexto
almacenados sistemticamente para su posterior uso.
Cadena de caracteres: Secuencia ordenada de longitud arbitraria (aunque
finita) de elementos que pertenecen a un cierto alfabeto. En general, una
cadena de caracteres es una sucesin de caracteres (letras, nmeros u otros
signos o smbolos).
Cdigo: forma que toma la informacin que se intercambia entre la Fuente (el
emisor) y el Destino (el receptor) de un lazo informtico.
Compilador: Es un programa que, a su vez, traduce un programa escrito en un
lenguaje de programacin a otro lenguaje de programacin.
Constante: Datos (con valores numricos o de cadena) que permanecen
invariables, sin posibilidad de cambiar el valor que tienen durante el curso del
programa.
Declarativos: Los LENGUAJES DECLARATIVOS explican al ordenador QU ha de
hacer y le proporcionan unes reglas que puede usar, pero sin determinar
exactamente COMO y CUANDO las tiene que aplicar.
Desencriptacin: Lo opuesto a encriptar
Encapsulada: Se llama as a ocultar datos miembros de un objeto de manera
que slo se puede cambiar mediante las operaciones definidas para ese
objeto.
Encriptacin: Proceso mediante el cual cierta informacin o texto sin formato es
cifrado de forma que el resultado sea ilegible
Estructura: Disposicin y orden de las partes dentro de un todo.
Firma digital: Informacin encriptada que constituye una prueba de
autentificacin para cerciorarse del autor de un documento o de una
accin, del mismo modo que la firma tradicional.
Grafo: Estructura de datos utilizada en algunos lenguajes de programacin, en la
cual cada elemento puede tener uno o varios predecesores y uno o varios
sucesores.
Heterogneo: Se dice de lo que est compuesto por cosas o partes diferentes.
Homogneo: Lo que pertenece a un mismo gnero.
Indexar: Organizar una base de datos utilizando un criterio determinado. Por
ejemplo, los buscadores de Internet indexan y organizan las pginas web por
su contenido e importancia.
ndice: Coleccin de elementos que permiten un rpido acceso a los registros
que conforman una base de datos.
Memoria: Dispositivo (hardware) capaz de almacenar datos para recuperarlos
posteriormente.
Mdulos: Conjunto de rutinas que realizan funciones a nivel de sistema, y que
pueden cargarse y descargarse.

ING JUAN ALBERTO VAZQUEZ G.


Pgina 67 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

Preprocesador: Fase que comparten algunos lenguajes de programacin,


anterior a la fase de compilacin.
Puntero: Variable manipulable que referencia una regin de memoria.
Recursivo: Proceso, funcin o rutina que se ejecuta repetidas veces hasta que
se satisface una condicin especfica.
Rutina: (termino empleado en la programacin) Procedimiento o conjunto de
cdigo que es usado cada vez que se le llame.
STL: (Standard Template Library). es una coleccin genrica de plantillas de
clases y algoritmos que permite a los programadores implementar fcilmente
estructuras estndar de datos como colas (queues), listas (lists), y pilas
(stacks).

ING JUAN ALBERTO VAZQUEZ G.


Pgina 68 de 69
CESVER Material Bibliogrfico de Apoyo Didctico
ING. SISTEMAS COMPUTACIONALES Alg. y Estruct. de Datos I 5 Semestre

BIBLIOGRAFA:
Desarrollo de Algoritmos y Tcnicas de Programacin en Pascal.
Pareja- Ojeda y otros. ED. Rama
Estructura Dinmicas de Datos Salvador Pozo Coronado
Edicin Digital.
Estructuras de datos, Especificacin, diseo e implementacin. Xavier Franch Gutirrez
Edicin UPC 1993
C++ Manual terico practico, Alan D. Osorio Rojas.
Aprenda C++ como si estuviera en Primero.
Javier Garca de Jaln, Jos Ignacio Rodrguez, Jos Mara Sarriegui, Alfonso Brazlez

REFERENCIAS:
http://www.conclase.net/c/librerias/funcion.php?fun=printf
http://www.conclase.net/c/librerias/funcion.php?fun=atoi
http://slent.iespana.es/docs/manualC++Public.pdf
http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf
http://mx.geocities.com/estructuras_informacion/
http://sistemas.itlp.edu.mx/tutoriales/estructdatos2/
http://toro.itapizaco.edu.mx/paginas/EDATOS/intro.html
www.conclase.net/c/librerias/funcion.php?fun=strcmp
http://kataix.umag.cl/~mmarin/topinf/cs23/c++/Indice.htm
http://mictlan.utm.mx/
http://www.algoritmia.net/articles.php?key=colas
www.tdea.edu.co/servicios/libros/ED-DOCU-COLAS.doc
http://www.dcc.uchile.cl/~cc30a/apuntes/TDA/#3
http://informatica.uv.es/iiguia/AED/oldwww/2002_03/Teoria/AED.Tema.12.pdf

www.cesver.edu.mx
Tel. 01-228-8182038 01-228-8182039
Serafn Olarte 43 Col. Mrtires de Chicago. Xalapa ver

ING JUAN ALBERTO VAZQUEZ G.


Pgina 69 de 69

You might also like