Professional Documents
Culture Documents
MATERIAL BIBLIOGRFICO
DE APOYO DIDCTICO
Licenciatura:
INGENIERIA EN SISTEMAS
COMPUTACIONALES
Asignatura:
ALGORITMOS Y ESTRUCTURA
DE DATOS I
Semestre:
QUINTO
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.
3 DISEO MODULAR
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.
GLOSARIO
BIBLIOGRAFIA
REFERENCIAS
INTRODUCCION:
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...
Unidad 1
TIPOS DE DATOS
ESTRUCTURADOS
INTRODUCCION:
OBJETIVO:
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.
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.
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.
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.4 Registros.
En la figura puede ver como se ven los campos para un registro que
almacena datos de una persona.
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;
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;
}
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.
/* 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
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;
EJEMPLO 03
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define TAM 5
void main(){
/* 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
*/
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();
}
ACTIVIDADES DE APRENDIZAJE
Evaluacin:
Unidad 2
OPERACIONES SOBRE CADENAS DE
CARACTERES.
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").
OBJETIVO:
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();
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.
int main() {
char *cadena1 = "Cadena ejemplo 1";
char *cadena2 = "Cadena ejemplo 2";
char *cadena3 = "Cadena";
char *cadena4 = "Cadena";
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.
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();
}
ACTIVIDADES DE APRENDIZAJE
Evaluacin:
Qu es un string?
Cules son las operaciones bsicas sobre strings?
Realice un algoritmo para unir los dos apellidos de un nombre.
Unidad 3
DISEO MODULAR.
INTRODUCCION:
OBJETIVO:
Comprender las ventajas y desventajas que presenta el diseo modular y
aplicarlo en la elaboracin de sistemas.
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>
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)
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:
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.
ACTIVIDADES DE APRENDIZAJE
Evaluacin:
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.
INTRODUCCION:
OBJETIVO:
Conocer las diversas estructuras que existen para la solucin de problemas y
mostrar la diversas aplicaciones que se puede hacer de cada estructura.
4.1 Pilas.
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.
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;
}
}
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;
}
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;
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.
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.
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.
se desencola, obteniendo un 3:
se encola un 7:
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
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;
}
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;
}
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.
ACTIVIDADES DE APRENDIZAJE
Evaluacin:
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.
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