   Definir estructura de datos.       Identificar los arreglos dentro de la clasificación de los tipos de datos más frec...
3                       Luis Risco              9                                                                   ..... ...
Definición 1 Una estructura de datos es un modelo matemático o lógico de una organizaciónparticular de datos.Definición 2....
Definición 1: Es un conjunto ordenado y finito de elementos homogéneos.Es decir, sus características básicas son:"Finito”,...
Los arreglos se clasifican en:                                                En matemática es conocido como Vector.a) Arr...
   Diseñar el desarrollo de problemas que requiera multiplicar un arreglo unidimensional por un       escalar y multiplic...
i <- i +1b)Ordenación por BurbujaEs el método de ordenación más utilizado por su fácil comprensión y programación, pero es...
Para entender el método ordenaremos de menor a mayor la lista de 8 datos enteros, usando el métodode burbuja ( N = 8 ). Se...
Finalmente el arreglo queda así :              28        30          50       24        16      60       76       89      ...
Objetivo: Obtener el más grande al final de la lista (con 3 elementos). Para ello se compara cadaelemento A[j] con el sigu...
Algoritmo BURBUJA                                                 Programa C++ BURBUJAINICIO                              ...
pseudocodigo                          1                      2                              i                     n-1     ...
for ( i= 0 ; i < N ; i =i+1 )                                        for ( i= 0 ; i < N ; i =i+1 )    {            // suma...
pseudocodigo                            1                      2                             i                      n-1   ...
C                                1            2    3       4            5             6            7            8        9...
{                                                              { k=k+1;     k=k+1                                         ...
double PreUni[10], VentaD[10];  COM: Lectura del arreglo UVMan                                           / Lectura del arr...
     Definir un arreglo bidimensional.        Saber declarar un arreglo bidimensional de cualquier tipo.        Demostr...
01      2400              3600            5600            7200            3100                              12      1800  ...
Asignación de valores a los elementos de un vector. En algoritmos (pseudocódigo) y en C++entero A[15][30];                ...
for (i = 0 ; i< n ; i = i+1){                                             En C++: Muestra los elementos de la matriz V cuy...
m              Am-11 Am-12                 Am-1j             Am-1n            Bm-11 Bm-12              Bm-1j              ...
Am1-Bm1      Am2-Bm2                              Amj-Bmj                      Amn-BmnLa instrucción representativa para c...
La instrucción representativa para cada elemento de la matriz C, será :En Matemáticas:                         Cij = k * A...
¿Que es una función?Una función es un grupo de instrucciones con un objetivo en particular y que se ejecutaal ser llamada ...
¿Que es un procedimiento?       Porción de código dentro de un programa más grande, que realiza una tarea específica      ...
Este es el diagrama correspondiente al principal.Este es el diagrama correspondiente al procedimiento.
Código1 #include<iostream.h>2 #include<conio.h>34 //DECLARACION DE PROCEDIMIENTO5       void fSuma(float,float);67 //INICI...
28                           29//PROCESO                           30dSuma=dN1a+dN2a;                           31        ...
La dirección es la posición que ocupa en la memoria una variable, un arreglo, una cadena,una estructura, otro puntero, etc...
Variable PunteroSintaxis    : tipo *nombre_variable;Propósito : Declarar si una variable contiene una dirección de memoria...
El puntero desreferenciado también puede usarse para recibir un valor de entrada.Ejemplo: cin>>*punt;Como el signo de mult...
d)    Es posible asignar un apuntador a otro, si ambos son del mismo tipo. De otro modo, esnecesario emplear un operador d...
e)  El C++ trata a las cadenas como punteros al primer carácter de cadena y no comocadena propiamente dichastrlen(char *q)...
Las listas son una sucesión de cero o más elementos.Esta es una definición muy simple y que no aclara demasiado en término...
Operaciones básicas de las listasEn toda estructura de datos hay dos operaciones que sobresalen por encima del resto:Inser...
   Tamaño: Esta operación suele informar sobre el número de elementos que tiene en ese       instante la lista.      Bus...
OperacionesLas operaciones son:- CrearPila : Inicializa la pila en el estado vacío.- PilaVacía : Determinar si la pila est...
Logico Función PilaVacia (Cima )InicioSi ( Cima == 0 ) entoncesretorna verdaderoSinoretorna falsoFin_siFin       Operació...
Escribir “Pila llena”SinoCima = Cima + 1Pila [Cima] = NuevoElementoFin_siFin       Operación Desapilar{Objetivo: Quita el...
Retorna -1Sinoretorna Pila [Cima]Fin_siFinAplicaciones de pilasLas Pilas son una estructura de datos muy usado en la soluc...
eliminaremos del tope de la pila la dirección de retorno, lo que dejará como nuevo tope lainformación necesaria para volve...
Notación postfijaEjemploTraducir la expresión infija X + Y *W a notación prefija.                                         ...
La construcción de estos procedimientos no sigue una fórmula concreta, pero el programadorpuede utilizar la noción de indu...
Simulación de ejecución del algoritmoEjercicios ResueltosEjercicio1. Considere la operación Reemplazar (Pila, ElemAntiguo,...
Ejercicio 2. Formule un algoritmo que particione una pila P en dos pilas P1, P2, de lasiguiente manera: los valores menore...
Repetir mientras (PilaVacia (cimaP2) == falso)Desapilar (P2, cimaP2, X)Apilar (PAux, cimaAux, X, maxAux)Fin repetirRepetir...
FinEjercicio 5. Considere un arreglo lineal llamado A el cual almacena n números enteros,escriba un algoritmo recursivo qu...
Se conoce la relación C(n, m) = C(n-1, m-1) + C(n-1, m)a) Formule un algoritmo recursivo para calcular C(n, m).SoluciónEnt...
Representación de colas con arreglosUna cola se puede implementar mediante un arreglo. Además se requiere una variable Fre...
Procedimiento CrearCola(#Cola, N, #Frente, #Final)Inicio{Definir Cola de tamaño N}Frente = 0Final = 0FinCola vacía{Objetiv...
}Lógico Función ColaLlena(Final, N)InicioSi (Final == N) entoncesretorna verdaderoSinoretorna falsoFin siFinAgregar un ele...
Salida: Cola, Frente, Final, ElementoExtraido (con valor)Postcondición: Cola con elemento extraído del frente}Procedimient...
Se debe tener en cuenta que en las colas circulares se presentan dos casos los cuales semuestran en la figura.            ...
Fin siFin         Encolar en cola circular{Objetivo: Añade un elemento al final de la colaEntrada: Cola, Frente, Final, N...
Procedimiento DesencolarCircular (?Cola,?Frente, ?Final, N, ? ElemExtraido)InicioSi (ColaVacia (Frente) = verdadero) enton...
Cola con prioridadesSe aplican en sistemas operativos, en los que los programas de mayor prioridad se procesanprimero, a i...
Repetir mientras (ColaVacia (Frente) ==Falso y Sw ==1 )Desencolar (Cola, Frente, Final, X)Si (X ==Dato) entoncesSw = 0Sino...
Manual del curso estructura de informacion
Manual del curso estructura de informacion
Manual del curso estructura de informacion
Upcoming SlideShare
Loading in …5
×

Manual del curso estructura de informacion

861 views
769 views

Published on

Manual de curso

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
861
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
35
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Manual del curso estructura de informacion

  1. 1.  Definir estructura de datos.  Identificar los arreglos dentro de la clasificación de los tipos de datos más frecuentes en los diversos lenguajes de programación.  Definir un arreglo  Identificar las características basicas de un arreglo.  Enunciar y diferenciar los diferentes tipos de arreglosHasta ahora sólo habiamos visto estructuras de datos simples (como variables y constantesenteras, reales y caracter ). pero estas no son suficientes para resolver problemas máscomplejos.Por ejemplo como responderiamos a estas interrogantes.¿ Cómo almacenar y accesar a lasrespuestas a 10 preguntas de 5opciones múltiples A,B,C,D y E?¿Usaríamos las variables. rpta1,rpta2, ....... rpta10 ?¿ Cómo almacenar y localizar las indices Nombres Notasnotas y los nombres de 25 alumnosde esta clase ? 0 Julio Perez 12¿Usaríamos las variables. 1 Edgar Condori 4Nombre1, Nombre2, .......Nombre25 y 2 Erica Castro 11Nota1, Nota2, ... Nota25?
  2. 2. 3 Luis Risco 9 ..... 22 Miura Fernández 16 23 Ada Lugo 12 24 André Fernández 5 indices Nombre Sueldo 0 Ada Lugo 2400.6¿ Cómo almacenar y localizar losnombres y sueldos de los 40 1 Miura Fernández 3500.5empleados de una pequeña empresa 2 André Fernández 2800.8?¿Usaríamos las variables. i ..... ...Nombre1, Nombre2, .......Nombre10 y 37 Gladys Garcia 3200.0Sueldo1, Sueldo2, ...Sueldo39 ? 38 Jorge Barzola 2105 39 Maria Cano 3700.2 ¿ Cómo almacenar y localizar la cantidad de vehiculos ( bicicletas,triciclos, motos, autos y camiones) vendidos en cada uno de los 12 meses del año 2001, por una importadora de vehiculos de transporte y carga. ?¿Usaríamos las variables. Can1,Can2, Can3 ... Can30? Ejemplos de ArreglosEsas no serian las soluciones a los problemas planteados ¿verdad?¡ Ya no es adecuado usar los tipos de datos simples (enteros reales o caracteres) porquetendriamos que declarar muchas variables !Para resolver problemas de este tipo se requieren datos estructurados más complejas,capaces de almacenar datos relacionados entre sí.
  3. 3. Definición 1 Una estructura de datos es un modelo matemático o lógico de una organizaciónparticular de datos.Definición 2. Una estructura de datos es una colección de datos que se caracterizan por la FORMAen que estos se ORGANIZAN, y por las OPERACIONES que se pueden definir sobre dichos datos.Los tipos de datos mas frecuentes utilizados en los diferentes lenguajes de programación son: Entero Real Tipo de Datos Simples Estándar Caracter Lógico (Datos Simples) Definidos por el Subrango usuario Enumerado Característica :Un identificador de un tipo de dato simple (nombre de variable) representa a un unico elemento Array (Vectores y Matrices) Registros Estáticos Archivos Conjuntos Cadenas Tipos de Datos Complejos Pilas (Datos estructurados) Listas Colas Lineales Listas enlazadas Dinámicos Arboles Listas No Lin. Grafos Característica:- Un identificador de un tipo de dato estructurado (nombre de variable) puede representar a multiples datos individuales, pudiendo cada uno de ellos ser accesados de manera independiente. Tipos Abstractos de Datos
  4. 4. Definición 1: Es un conjunto ordenado y finito de elementos homogéneos.Es decir, sus características básicas son:"Finito”, porque se requiere definir el tamaño del array (definir el tamañ antes de ser utilizado).Ejm : el array Notas que almacena las notas de los 25 alumnos de una clase es de tamaño 25"Homogéneos”, porque todos los elementos del array son del mismo tipo.Ejm: en el array Notas, todas las notas almacenadas son de tipo entero."Ordenado”, porque se pueden identificar a cada elemento del array por la posición que ocupan: el primero, el segundo, el tercero,..., el n-esimo, etc.Ejm: en el array Notas, la nota del tercer alumno de la clase (puede ser en orden alfabetico), ocupa la posición 3.Definición 2 :Son posiciones en memoria consecutivas relacionadas entre sí por el hecho de que tienen el mismo nombre y los datos que contiene son todos Del mismo tipo.Son entidades estáticas ya que conservan el mismo tamaño durante toda la ejecución del programa.
  5. 5. Los arreglos se clasifican en: En matemática es conocido como Vector.a) Arreglo unidimensional Ejm: Cantidad de canastas anotadas por el equipo Tamaño ( array lineal o vector ) peruano en cada uno de los 5 partodps del 5 Sudamericano 2000 Dos o mas vectores de igual tamaño dondeArreglos unidimensionales sus elementos de igual indice estanparalelos relacionados. Ejm: Descripcion de productos y sus respectivos precios Tamaño (8 tipos de productos). 8 En matemática es conocido como Matriz,Arreglo bidimensional o en base de datos como tabla. Ejm: Los(array bidimensional o matriz ) sueldos de 10 empleados en cada uno de los Tamaño meses de Enero a Junio 2000. 10x6Arreglo multidimensional ( n - Ejm: Estados (libre u ocupado) de las 10 aulas endimensional) cada uno de los 4 pisos de los 5 pabellones. Tamaño 10x4x5  Definir un arreglo unidimensional.  Saber declarar un arreglo unidimensional de cualquier tipo.  Declarar arreglos unidimensionales en el contexto de un problema, diferencinadolos de los datos simples.  Conocer, citar y utilizar las reglas que definen un arreglo unidimensional. Operaciones:  Citar los diferentes tipos de operaciones que se pueden realizar sobre los arreglos unidimensonales.  Saber Inicializar arreglos unidimensionales de diversos tipos.  Saber asignar o dar valores a los elementos de un arreglo unidimensional.  Saber leer y mostrar todo un arreglo unidimensional.  Identificar los procesos para solucionar un problema que requiera de recorrido, visitado o barrido de un arreglo unidimensional.  Sumar los elementos numericos de un arreglo.  Conocer y aplicar los algoritmos para calcular el minimo y maximo valor de un arreglo unidimensional.  Diseñar el desarrollo de problemas que requieran sumar o restar arreglos.
  6. 6.  Diseñar el desarrollo de problemas que requiera multiplicar un arreglo unidimensional por un escalar y multiplicar arreglos unidimensionales.  Conocer el algoritmo para borrar o insertar un elemento en un arreglo unidimensional.  Conocer y emplear el algoritmo burbuja para clasificar arreglos unidimensionales de tipo numerico y/o cadenas.Cada Lenguaje de Programación tiene sus reglas para declarar un arreglo Pero cadadeclaración debe incluir 3 clases de información acerca del arreglo:  · El nombre del arreglo.  · El tipo de los datos del arreglo  · El conjunto de índices del arreglo(tamaño).Ejm En PASCAL: Autos[1..16] OF integerEjm: En C++ int Autos[16];Al declararse un arreglo unidimensional se reserva espacio en la memoria principal para unacantidad de elementos del tipo declarado. A este tipo de estructura se le denomina estatico, porque la longitud del arreglo no puede variarse durante la ejecución del programa. Las estructuras dinámicas pueden cambiar su tamaño (aumentar o disminuir) durante la ejecución del programa Ordenación en ArreglosLa importancia de mantener nuestros arreglos ordenados radica en que es mucho más rápidotener acceso a un dato en un arreglo ordenado que en uno desordenado.Existen muchos algoritmos para la ordenación de elementos en arreglos, enseguida veremosalgunos de ellos.a)Selección DirectaEste método consiste en seleccionar el elemento más pequeño de nuestra lista para colocarloal inicio y así excluirlo de la lista.Para ahorrar espacio, siempre que vayamos a colocar un elemento en su posición correcta lointercambiaremos por aquel que la esté ocupando en ese momento.El algoritmo de selección directa es el siguiente:i <- 1mientras i<= N haz min <-i j <- i + 1 mientras j <= N haz si arreglo[j] < [min] entonces min <-j j <- j + 1 intercambia(arreglo[min],arreglo[i])
  7. 7. i <- i +1b)Ordenación por BurbujaEs el método de ordenación más utilizado por su fácil comprensión y programación, pero esimportante señalar que es el más ineficiente de todos los métodos .Este método consiste en llevar los elementos menores a la izquierda del arreglo ó los mayoresa la derecha del mismo. La idea básica del algoritmo es comparar pares de elementosadyacentes e intercambiarlos entre sí hasta que todos se encuentren ordenados.i <- 1mientras i < N haz j <- N mientras j > i haz si arreglo[j] < arreglo[j-1] entonces intercambia(arreglo[j],arreglo[j-1]) j<j-1 i <- i +1c)Ordenación por MezclaEste algoritmo consiste en partir el arreglo por la mitad, ordenar la mitad izquierda, ordenar lamitad derecha y mezclar las dos mitades ordenadas en un array ordenado. Este último pasoconsiste en ir comparando pares sucesivos de elementos (uno de cada mitad) y poniendo elvalor más pequeño en el siguiente hueco.procedimiento mezclar(dat,izqp,izqu,derp,deru)inicio izqa <- izqp dera <- derp ind <- izqp mientras (izqa <= izqu) y (dera <= deru) haz si arreglo[izqa] < dat[dera] entonces temporal[ind] <- arreglo[izqa] izqa <- izqa + 1 en caso contrario temporal[ind] <- arreglo[dera] dera <- dera + 1 ind <- ind +1 mientras izqa <= izqu haz temporal[ind] <- arreglo[izqa] izqa <- izqa + 1 ind <- ind +1 mientras dera <= deru haz temporal[ind] <=dat[dera] dera <- dera + 1 ind <- ind + 1 para ind <- izqp hasta deru haz arreglo[ind] <- temporal[ind]fin
  8. 8. Para entender el método ordenaremos de menor a mayor la lista de 8 datos enteros, usando el métodode burbuja ( N = 8 ). Sea el arreglo A:A 30 50 28 89 76 24 16 60Paso1:Objetivo: Obtener el mas grande al final de la lista. Para ello se compara cada elemento A[j] con elsiguiente A[j+1], donde j varia de 1 a N -1 ( 7 comparaciones)Es decir : si A[j] > A[j +1] es verdad se intercambia.Finalmente el arreglo queda así : 30 28 50 76 24 16 60 89 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] El elemento más grande está en la posición 8.Paso2 :Objetivo: Obtener el mas grande al final de la lista (con 7 elementos). Para ello se compara cadaelemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -2.(6 comparaciones)Es decir : si A[j] > A[j +1] es verdad se intercambia.Finalmente el arreglo queda así : 28 30 50 24 16 60 76 89 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] El elemento más grande está en la posición 7Paso 3:Objetivo: Obtener el más grande al final de la lista (con 6 elementos). Para ello se compara cadaelemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -3.(5 comparaciones)Es decir: si A[j] > A[j +1] es verdad se intercambia.
  9. 9. Finalmente el arreglo queda así : 28 30 50 24 16 60 76 89 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] El elemento más grande está en la posición 6Paso 4:Objetivo: Obtener el más grande al final de la lista (con 5 elementos). Para ello se compara cadaelemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -4 (4 comparaciones).Es decir : si A[j] > A[j +1] es verdad se intercambia.Finalmente el arreglo queda así : 28 24 16 30 50 60 76 89 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] El elemento más grande está en la posición 5Paso 5:Objetivo: Obtener el más grande al final de la lista (con 4 elementos). Para ello se compara cadaelemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -5 (3 comparaciones).Es decir : si A[j] > A[j +1] es verdad se intercambia.Finalmente el arreglo queda así: 28 24 16 30 50 60 76 89 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] El elemento más grande está en la posición 4Paso 6:
  10. 10. Objetivo: Obtener el más grande al final de la lista (con 3 elementos). Para ello se compara cadaelemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -6 (2 comparaciones).Es decir : si A[j] > A[j +1] es verdad se intercambia.Finalmente el arreglo queda así : 16 24 28 30 50 60 76 89 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] El elemento más grande está en la posición 3Paso 7:Objetivo: Obtener el más grande al final de la lista (con 2 elementos). Para ello se compara cadaelemento A[j] con el siguiente A[j+1], donde j varia de 1 a N -7 ( 1 comparación).Es decir : si A[j] > A[j +1] es verdad se intercambia.Finalmente el arreglo queda así (ordenado de mayor a menor): 16 24 28 30 50 60 76 89 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] El elemento más grande está en la posición 2EL ARRAY YA ORDENADO DE MENOR A MAYOR 16 24 28 30 50 60 76 89 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]Observación : Si se desea ordenar de mayor a menor, lo unico que cambia es la pregunta para hacerel intercambio, con el objetivo de obtener en cada paso el más pequeño al final de la listaEs decir : si A[j] < A[j +1] es verdad se intercambia.
  11. 11. Algoritmo BURBUJA Programa C++ BURBUJAINICIO { COM: Declaracion de variables // Declaracion de variables entero A[10], k , J, Aux , N=8 int A[10], k , J, Aux , N=8; const int N=10; const int N = 10; COM: Inicialización o lectura del arreglo A // Inicialización o lectura del arreglo A para (i=1, hasta N, i = i+1) for (i=0; i < N ; i = i+1) { Leer A[i] } { cin>> A[i] ; } COM: Algoritmo de ordenamiento burbuja // Algoritmo de ordenamiento burbuja COM: k = Numero de pasos (1 a N-1) // k = Numero de pasos (1 a N-1) para ( k =1 hasta N -1; k=k+1 ) for ( k = 0 ; k < N -1 ; k = k+1 ) { { COM: Nro de compar. j depende del Nro de paso // Nro de comparac. j depende del Nro de paso para(J=1, hasta N–1-k;J =J +1) for (J = 0 ;J < N –1-k ; J =J +1) { { SI ( A [J ] > A [J+1] ) if ( A [J ] > A [J+1] ) { COM: Intercambiamos A[J] y A[J+1] { // Intercambiamos A[J] y A[J+1] Aux = A [ J ] Aux = A [ J ]; A [ J ] = A [ J+1] A [ J ] = A [ J+1] ; A [ J+1] = Aux A [ J+1] = Aux; } } } COM: fin del PARA interior } // fin del para interno } COM: fin del PARA exterior } //COM: fin del PARA exterior COM: Se muestra el arreglo ordenado // Se muestra el arreglo ordenado para (i=1, hasta N, i = i+1) for (i=0 : i < N ; i = i+1) { Mostrar A[i] } { cout<< A[i] <<" "; }FIN }G) Operaciones entre arreglos unidimensionalesG1) Sumar Sumar los elementos de dos arreglos A y B para obtener un tercer arreglo S:A En A[1] A[2] A[ i ] .... A[n-1] A[n]pseudocodigo 1 2 i nB En B[1] B[2] B[ i ] .... B[n-1] B[n]pseudocodigo 1 2 i n-1 n A[1] + B[1] A[2] + B[2] A[i]+B[i] A[n] + B[n]S En
  12. 12. pseudocodigo 1 2 i n-1 n S[i]=A[i]+B[i] // a cada elemento A[i] se le suma el respectivo elemento B[i]G2) Restar Restar los elementos de dos arreglos A y B para obtener un tercer arreglo R:A En A[1] A[2] A[ i ] .... A[n-1] A[n]pseudocodigo 1 2 i nB En B[1] B[2] B[ i ] .... B[n-1] B[n]pseudocodigo 1 2 i n-1 n A[1] - B[1] A[2] - B[2] A[i]-B[i] A[n] - B[n]R Enpseudocodigo 1 2 i n-1 n R[i]=A[i]-B[i] // a cada elemento A[i] se le resta el respectivo elemento B[i] Programas en C++ para sumar y restar arreglos unidimensionales SUMA ARREGLOS RESTA ARREGLOSvoid main() void main(){ { const int N=20; const int N=20; // Declaración de Variables // Declaración de Variables int i; int i; double A[N], B[N] S[N]; double A[N], B[N], R[N]; ........ // Leer o inicializar Arreglo A ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B ....... // Leer o inicializar Arreglo B // Recorrido del Array A // Recorrido del Array A
  13. 13. for ( i= 0 ; i < N ; i =i+1 ) for ( i= 0 ; i < N ; i =i+1 ) { // suma elemento por elemento { // Multiplica elmento por elemento S[i] = A [ i ] + B[i] R [i] = A [ i ] - B[i]; ; } } .... // Muestra arreglo S ...... // Muestra arreglo R} }G3) Multiplicar arreglo unidimensional por un escalar Multiplicar cada elemento del arreglo A por un escalar K: A En A[1] A[2] A[i] .... A[n-1] A[n] pseudocodigo 1 2 i n k*A[1] k*A[2] k *A[i] k*A[n] C En pseudocodigo 1 2 i n-1 n C[i] = k * A[i] // cada elemento de A[i] es multiplicado por el escalar kG4) Multiplicar arreglos unidimensionalesMultiplicar los elementos de dos arreglos A y B para obtener un tercero P:A En A[1] A[2] A[ i ] .... A[n-1] A[n]pseudocodigo 1 2 i nB En B[1] B[2] B[ i ] .... B[n-1] B[n]pseudocodigo 1 2 i n-1 n A[1] * B[1] A[2] * B[2] A[i]*B[i] A[n] * B[n]P En
  14. 14. pseudocodigo 1 2 i n-1 n P[i]=A[i]*B[i] // a cada elemento A[i] se le multiplica por su respectivo elemento B[i] Programas en C++ para multiplicar arreglos unidimensionales entre si y por un escalar MULTIPLICA POR ESCALAR MULTIPLICA ARREGLOSvoid main() void main(){ const int N=20; { const int N=20; // Declaración de Variables // Declaración de Variables int i; int i; double A[N],C[N], k ; double A[N], B[N], P[N]; ........ // Leer o inicializar Arreglo A ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B ....... // Leer o inicializar Arreglo B // Recorrido del Array A ....... // Leer o inicializar k // Recorrido del Array A for ( i= 0 ; i < N ; i =i+1 ) for ( i= 0 ; i < N ; i =i+1 ) { // Multiplica elmento por elemento { // suma elemento por elemento P [ i ] = A [ i ] * C[ i ] = k * A [ i ] ; B[i] ; } } .... // Muestra arreglo A ...... // Muestra arreglo M} }G5) Mezcla o intercalaciónCombinar dos listas en una sola.Vectores Originales:A 3 4 7 19 1 2 3 4B -5 0 4 13 17 19 90 95 1 2 3 4 5 6 7 8
  15. 15. C 1 2 3 4 5 6 7 8 9 10 11 12Ver proceso de mezcla_algoritmosVectores Mezclados:A 3 4 7 19 1 2 3 4 r varía desdeB -5 0 4 13 17 19 90 95 j=7 hasta 8 1 2 3 4 5 6 7 8C k = k+1=9 -5 0 3 4 7 13 17 19 90 95 k = k+1=10 1 2 3 4 5 6 7 8 9 10 11 12Ver proceso de mezcla_c++ Programas en algoritmos y en C++ para la mezcla de los vectores A y B, se obtiene el vector mezcla C ALGORITMO PROGRAMA C++INICIO INICIO constante entero M=4,N=8 const int M=4,N=8; // Declaración de Variables // Declaración de Variables entero i , j , k , r int i , j , k , r real A[M],B[N],C[M+N] ; double A[M],B[N],C[M+N] ; ........ // Leer o inicializar Arreglo A ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B ....... // Leer o inicializar Arreglo B COM: Inicializa i , j ,k // Inicializa i , j ,k i=1, j=1, k=0 i =1; j =1; k = 0; Mientras ((i<=M) y (j<=N)) while (( i < M ) && ( j< N ))
  16. 16. { { k=k+1; k=k+1 if ( A[ i ] < B[ j ] ) si (A[ i ] < B[ j ]) { C[ k ] = A[ i ]; { C[ k ] = A[ i ] i = i +1; i = i +1 } } else sino { C[ k ] = B[ j ]; { C[ k ] = B[ j ] if (A[ i ] == B[ j ]) j = j +1 { i=i+1; j=j+1;} } j = j +1; } } si (i<=M) } { if ( i < M) para(r=i hasta M, r=r+1) { { k=k+1 for(r= i ;r< M; r=r+1) C[ k ] = A[ r ] { k = k+1; } C[ k ] = A[ r ]; } } sino } { else para(r=j hasta N, r=r+1) { { k=k+1 for (r= j ;r< N; r=r+1) C[ k ] = B[ r ] { k = k +1; } C[ k ] = B[ r ]; } } COM: Muestra arreglo C intercalado o mezclado } para(i=1, hasta k, i=i+1) // Muestra arreglo C intercalado o mezclado { cout<< C[ k ]<<" "; } for (i=0; i<= k, i=i+1)FIN { cout<< C[ k ]<<" "; } cout<<endl;getch(); }Ejemplo - Aplicación: El administrador de una embotelladora utiliza los arreglos UVMan y UVTarpara almacenar las unidades vendidas (cajas) en la mañana y tarde respectivamente y en el arregloPreUni se almacena el precio de venta de cada unidad (cajas) de producto. Hacer un algoritmo y suprograma respectivo en C++ para calcular las unidades vendidas en todo el dia y a cuanto asciende laventa en soles por cada producto. Se comercializan 10 variedades de productos.ALGORITMO Ventas PROGRAMA VentasINICIO { COM: declaracion de variables // declaracion de variables entero UVMan[10], UVTar[10]; enteroo UVDia[10], VenTotD o int UVMan[10], UVTar[10]; int UVDia[10], VenTotD; real PreUni[10], VentaD[10]
  17. 17. double PreUni[10], VentaD[10]; COM: Lectura del arreglo UVMan / Lectura del arreglo UVMan para ( i= 1 hasta 120 ,i=i+1 ) for ( i= 0 ; i<10 ; i=i+1 ) { LEER UVMan [ i ] } { cin>> UVMan [ i ]; } COM: Lectura del arreglo UVTar // Lectura del arreglo UVTar para ( i= 1, hasta 120, ,i=i+1 ) for ( i= 0; i <10 ; i=i+1 ) { LEER UVTar [ i ] } { cin>> UVTar [ i ]; } COM: Lectura del arreglo PreUni // Lectura del arreglo PreUni para ( i= 1 hasta 120 ,i=i+1 ) for ( i= 0; i <10 ; i=i+1 ) { LEER PreUni [ i ] } { cin>> PreUni [ i ]; } COM: Calculo del arreglo UVDia que almacena las unidades vendidas COM: Calculo del arreglo UVDia que almacena las unidades vendidas en el dia en el dia para ( i= 1 hasta 120 ,i=i+1 ) for ( i= 0; i <10 ; i=i+1 ) { // Visita cada uno de los elemento de los arreglos { // Visita cada uno de los elemento de los arreglos UVDia[i] = UVMan[ i ]+UVTar[i]; UVDia [ i ] = UVMan [ i ] + UVTar [ i ]; } } COM: Calculo dle arreglo VentaDia que almacena la venta del dia en // Calculo dle arreglo VentaDia que almacena la venta del dia en soles soles en c/u de los productos. en c/u de los productos. para ( i= 1, hasta 10 ,i=i+1 ) for ( i= 0; i <10 ; i=i+1 ) { // Visita cada elemento i { // Visita cada elemento i VentaD[i]=UVDia[i] * PreUni[i] } VentaD[i]= UVDia[i]*PreUni[i]; } COM: Calculo de la VentaTotal del dia en soles VenTotDia // Calculo de la VentaTotal del dia en soles VenTotDia VenTotD= 0 VenTotD= 0 para ( i= 1 hasta 10 ,i=i+1 ) for ( i= 0; i <10 ; i=i+1 ) { // Visita al elemento , acumula { // Visita al elemento , acumula VenTotD =VenTotD +VentaD[ i] VenTotD =VenTotD + VentaD[ i ]; } } Mostrar VenTotD cout<< VenTotD<<endl;FIN }
  18. 18.  Definir un arreglo bidimensional.  Saber declarar un arreglo bidimensional de cualquier tipo.  Demostrar como accesar un arreglo unidimensional.  Conocer, citar y utilizar las reglas que definen un arreglo bidimensional. Operaciones:  Citar los diferentes tipos de operaciones que se pueden realizar sobre los arreglos bidimensonales.  Saber inicializar arreglos bidimensionales de diversos tipos.  Saber asignar o dar valores a los elementos de un arreglo bidimensional.  Saber leer y mostrar todo un arreglo bidimensional.  Identificar los procesos para solucionar un problema que requiera de recorrido, visitado o barrido de un arreglo bidimensional(ejm contar)  Conocer y aplicar los algoritmos para calcular el máximo y el minimo valor de un arreglo bidimensional.  Diseñar el desarrollo de problemas que requieran sumar o restar arreglos bidimensionales.  Diseñar el desarrollo de problemas que requiera multiplicar un arreglo bidimensional por un escalar y multiplicar 2 arreglos bdimensionales.  Saber sumar filas para obtener el vector vertical a partir de una matriz  Saber sumar columnas para obtener el vector horizontal a partir de una matrizSe puede considerar como un vector de vectores. Por tanto es un conjunto de elementostodos del mismo tipo en el que se utilizan dos subíndices para especificar un elemento.Ejm Una cadena de tiendas está formada por 10 sucursales y cada uno consta de 5secciones (Lacteos/Bebidas/... /carnes). En la siguiente tabla o matriz (matemático) serepresentan las ventas mensuales en soles. Secciones VENTAS 0 1 .... 3 4 1 2 ... 4 5 Sucursales
  19. 19. 01 2400 3600 5600 7200 3100 12 1800 5120 3490 5690 5670 Los indices en ... ... ... ... ...psuedocodigo y en C++ ... ... ... ... ... 45 3490 3460 5671 4567 5423 56 1780 3450 6740 4356 3210En un array bidimensional cada elemento del array se referencia a través de dos índices.En pseudocodigo : VENTAS [1] [2] =3600 VENTAS [2][4] = 5690En C++ VENTAS [0] [1] =3600 VENTAS [1][3] = 5690 EJEMPLO DE DECLARACION DE ARREGLOS BIDIMENSIONALES EN ALGORITMOS (seudocódigo) y en C++ (código) respectivamentereal nota[25][4] declara nota, las 4 notas de cada uno de los 25 alumnos. Reservadouble nota[25][4]; celdas de memoria.para 100 datos doublereal Peso[20][12] declara Peso, los pesos promedios de 30 deportistas en cada uno de los 12 meses del 2001. Reserva celdas de memoria para 240double Peso [20][12]; datos double.entero DocCasacas[3][30] declara DocCasacas, las docenas de casacas de 3 tallas (S, M,L) confeccionadas en cada uno de los 30 dias del mes deint DocCasacas[3][30]; Junio. Reserva celdas de memoria para 90 datos iint.entero unidInsumo[5][12] declara unidInsumo, las unidades de 5 variedades de insumo comprados en cada uno de los 12 meses del 2000 Reserva celdasint unidInsumo[5][12]; de memoria para 60 datos intcaracter Rpta[45][10] declara Rpta, las respuestas de 45 alumnos a 10 preguntas de opcion muiltiple (a,...e). Reserva celdas de memoria para 450char Rpta[45][10]; datos char. A) Inicialización de Matrices Al igual que con las variables simples (no estructurados) y los vectores, las matrices sepueden inicializar al momento de declararse. Ejm:B) AsignaciónPermite dar valor a uno o varios elementos de un vector.
  20. 20. Asignación de valores a los elementos de un vector. En algoritmos (pseudocódigo) y en C++entero A[15][30]; int A[15][30];caracter Rpta [50] [10]; char Rpta [50][10];A[10] [20] = 45 A[10] [20] = 45;Asigna el valor 45 al elemento de la fila 10 y columna 20 del arreglo bidimensional A.Rpta [2][5] = c Rpta [2][5] = c;Asigna c al elemento de la fila 2 y columna 5 del arreglo RptaC) Operaciones de Entrada/SalidaLectura/Escritura .- Permite dar valor (leer o ingresar por teclado) o mostrar (en pantalla) elvalor de los elementos de un arreglo bidimensional Ejm:Lectura / Escritura de elementos de un arreglo bidimensional en pseudocódigo y en C++ respectivamenteLeer V[3][5] Permite Leer el elemento de la fila 3 y columna 5 delcin>> V[3] [5] ; arreglo bidimensional VMostrar V[3][5] Permite Mostrar el elemento de la fila 3 y columna 5 delcout<< V[3] [5]; arreglo bidimensional V Lectura / Escritura de los elementos de un arreglo por grupos en pseudocódigo y en C++ respectivamenteconstante entera M = 10, N=12; const int M=10, N=12;entero V[10][12] int V[10][12];real Peso[M][N] double Peso[M][N];para (i = 1 ; hasta i <= M ; con i=i+1) Lee los elementos de la matriz V cuyo indice i varia desde{ para (j=1 hasta j <=N ; con j=j+1) 1 hasta M, y j varia desde 1 hasta N. { Leer V [ i ][ j ]; } Nota: M y N deben ser conocidos.}for (i = 0 ; i < M ; i=i+1){ for ( j = 0 ; j < N ; j=j+1) En C++: Lee los elementos de la matriz V cuyo indice i { cin>> V [ i ][ j ]; } varia desde 0 hasta M-1 y j varia desde 1 hasta N-1.} Nota M y N debe ser conocido.para (i = 1 ; hasta i<= M ; con i=i+1){ Muestra los elementos de la matriz V cuyo indice i varia para (j=1 hasta j <=N ; con j=j+1) desde 1 hasta M, y j varia desde 1 hasta N. { Mostrar Peso [ i ][ j ]; } Nota: M y N deben ser conocidos.}
  21. 21. for (i = 0 ; i< n ; i = i+1){ En C++: Muestra los elementos de la matriz V cuyo indice for (j = 0 ; j< n ; j = j+1) i varia desde 0 hasta M-1 y j varia desde 1 hasta N-1. { cout<< Peso [ i ][ j ]; } Nota M y N debe ser conocido.}Ejemplo: Ejemplo:entero V[5][3] int V[5[13];real Peso[5][3] double Peso[5][3]; Permite ingresar por teclado los valores para cadapara (i = 0 ; i< 5 ; i = i+1) elemento del arreglo V:{ para ( j = 0 ; j< 3 ; j = j+1) V[0][0], V[0][1], V[0][2], V[1][0] , V[1][1], V[1][2], V[2][0], { Leer V [ i ][ j ]; } V[2][1], V[2][2], V[3][0], V[3][1], V[3][2], V[4][1], V[4][2],} V[4][3] Permite ingresar por teclado los valores para cadafor (i = 0 ; i< 5 ; i = i+1) elemento del arreglo V:{ for ( j = 0 ; j< 3 ; j = j+1) V[0][0], V[0][1], V[0][2], V[1][0] , V[1][1], V[1][2], V[2][0], { cin>> V [ i ][ j ]; } V[2][1], V[2][2], V[3][0], V[3][1], V[3][2], V[4][1], V[4][2],} V[4][3]Ejemplo Ejemplopara (i = 1 ; Hasta i<= 5 ; con i=i+1) Muestra en pantalla los valores almacenados en cada{ para (j = 1;hasta j<= 3 ; con j=j+1) elemento del arreglo: Peso[1][1], Peso[1][2] Peso[1][3], Peso[2][1], Peso[2][2], Peso[2][3] ,Peso[3][1] Peso[3][2], { Mostrar Peso [ i ][ j ]; } Peso[3][3], Peso[4][1], Peso[4][2] Peso[4][3], Peso[5][1],} Peso[5][2], Peso[5][3] Muestra en pantalla los valores almacenados en cadafor (i = 0 ; i< 5 ; i = i+1) elemento del arreglo: Peso[0][0], Peso[0][1] Peso[0][2],{ for ( j = 0 ; j< 3 ; j = j+1) Peso[1][0], Peso[1][1], Peso[1][2] ,Peso[2][0] Peso[2][1], { cout >> Peso [ i ][ j ]; } Peso[2][2], Peso[3][0], Peso[3][1] Peso[3][2], Peso[4][0],} Peso[4][1], Peso[4][2E) Operaciones entre arreglos BidimensionalesE1) Sumar Matrices:Sean las matrices A y B, representadas en matemáticas así: :Observación: para la suma y resta de matrices, el rango de las matrices A y B deben seriguales, es decir m x n A Columnas B Columnas 1 2 j n 1 2 j n 1 A11 A12 A1j A1n B11 B12 B1j B1n 2 A21 A22 A2j A2n B21 B22 B2j B2n i + m- 1 Ai1 Ai2 Aij Ain Bi1 Bi2 Bij Bin
  22. 22. m Am-11 Am-12 Am-1j Am-1n Bm-11 Bm-12 Bm-1j Bm-1n Am1 Am2 Amj Amn Bm1 Bm2 Bmj BmnLa matriz suma será: Columnas S 1 2 j n 1 A11+ B11 A12+ B12 ... A1j+ B1j ... A1n+ B1n 2 A21+ A21 A22+ B22 ... A2j+ B2j ... A2n+ B2n i Ai1+ Bi1 Ai2+ Bi2 ... Aij+Bij .. Ain+ Bin m- Am-11+ Bm-11 Am-12+ Bm-12 ... Am-1j+ Bm-1j ... Am-1n+ Bm-1n 1 Am1+ Bm1 Am2+ Bm2 ... Amj+ Bmj ... Amn+ Bmn mLa instrucción representativa para cada elemento de la matriz suma S, será:En Matemáticas: Sij = Aij + BijEn algoritmos y en C++ S [ i ] [ j ] = A[ i ] [ j ] + B[ i ] [ j ] Se repite para cada elemento de la matriz SE2) Restar Matrices: La matriz Resta será : Columnas R 1 2 j n A11-B11 A12-B12 A1j-B1j A1n -B1n 1 A21-A21 A22-B22 A2j-B2j A2n-B2n 2 i m- Ai1-Bi1 Ai2-Bi2 Aij-Bij Ain-Bin 1 m Am-11-Bm-11 Am-12-Bm-12 Am-1j-Bm-1j Am-1n-Bm-1n
  23. 23. Am1-Bm1 Am2-Bm2 Amj-Bmj Amn-BmnLa instrucción representativa para cada elemento de la matriz resta R será:En Matemáticas: Rij = Aij + BijEn algoritmos y en R [ i ] [ j ] = A[ i ] [ j ] - B[ i ] [ j ]C++ Se repite para cada elemento de la matriz R Programas en C++ para sumar y restar arreglos Bidimensionales SUMA ARREGLOS RESTA ARREGLOSvoid main() void main(){ { const int M=4, N=5; const int M=4, N=5; // Declaración de Variables // Declaración de Variables int i; int i; int A[M][N], B[M][N], S[M][N]; int A[M][N], B[M][N], R[M][N]; ........ // Leer o inicializar Arreglo A ........ // Leer o inicializar Arreglo A ....... // Leer o inicializar Arreglo B ....... // Leer o inicializar Arreglo B // Recorrido del Array A // Recorrido del Array A for ( i= 0 ; i < M ; i =i+1 ) for ( i= 0 ; i < M ; i =i+1 ) { { for (j=0; j<N ; j=j+1) for (j=0; j<N ; j=j+1) {// suma elemento por elemento {// suma elemento por elemento S[i] = A [ i ] + B[i] R[i] = A [ i ] - B[i]; ; } } } } .... // Muestra arreglo S .... // Muestra arreglo S} }E3) Multiplicar escalar por Matriz: Columnas C 1 2 j n k*A11 k*A12 k*A1j k*A1n 1 k*A21 k*A22 k*A2j k*A2n 2 i m- k*Ai1 k*Ai2 k*Aij k*Ain 1 m k*Am-11 k*Am-12 k*Am-1 k*Am-1n k*Am1 k*Am2 k*Amj k*Amn
  24. 24. La instrucción representativa para cada elemento de la matriz C, será :En Matemáticas: Cij = k * AijEn algoritmos y en C++ C [ i ] [ j ] = k * A[ i ] [ j ] Se repite para cada elemento de la matriz CUn subprograma es una serie de instrucciones escritas independientemente del programaprincipal. Este subprograma está ligado al programa principal mediante un proceso detransferencia/retorno.Ejemplo 12• Título:– Subprograma de suma• Nombre– Ej12• Descripción– Escribir un subprograma que calcule la suma de dos números• V1: función con dos parámetros de entrada y devuelve el resultado• V2: procedimiento con dos parámetros de entrada y uno de salida• V3: procedimiento con un parámetro de entrada y otro de entrada/salida• Observaciones– Ejemplo ilustrativo con cuerpo de cálculo evidente– Paso de parámetros– Los procedimientos no “devuelven” nada (usan parámetros de salida)
  25. 25. ¿Que es una función?Una función es un grupo de instrucciones con un objetivo en particular y que se ejecutaal ser llamada desde otra función o procedimiento. Una función puede llamarsemúltiples veces e incluso llamarse a sí misma (función recurrente).Las funciones pueden recibir datos desde afuera al ser llamadas a través de losparámetros y deben entregar un resultado.Se diferencian de los procedimientos porque estos no devuelven un resultado.En general las funciones deben tener un nombre único en el ámbito para poder serllamadas, un tipo de dato de resultado, una lista de parámetros de entrada y su código.Cuando una función es invocada se le pasa el control a la misma, una vez que estafinalizó con su tarea el control es devuelto al punto desde el cual la función fue llamada.
  26. 26. ¿Que es un procedimiento? Porción de código dentro de un programa más grande, que realiza una tarea específica y es relativamente independiente del resto del código. La mayoría de los lenguajes de programación incluyen soporte para la creación de procedimientos (u otros tipos de subrutinas, como funciones o módulos). Los procedimientos suelen utilizarse para reducir la duplicación de códigos en un programa, permitir reusar los códigos, descomponer problemas complejos en piezas simples (mejorando la mantenibilidad y facilidad de extensión del código), mejora la lectura del código de un programa, oculta o regula parte de un programa, etc. Los procedimientos son ejecutados cuando son llamados desde otros procedimientos, funciones o módulos. Los procedimientos pueden recibir parámetros, pero no necesitan devolver un valor como las funciones.Ejemplo 1Programa que suma dos numeros utilizando un Procedimiento.Pseudocódigo1Inicio2dN1<-0, dN2<-03Leer "Numero 1", dN14Leer "Numero 2", dN25Llama Suma (dN1)6Fin1//Aqui empieza el procedimiento2Procedimiento Suma (dN1a, dN2a)3dSuma <- 04dSuma<-0 dN1a+dN2a5Imprimir "El total es: ", dSuma6Fin ProcedimientoDiagrama de FlujoVemos que tenemos un nuevo símbolo el cual corresponde a la llamada a un procedimiento ofuncion.
  27. 27. Este es el diagrama correspondiente al principal.Este es el diagrama correspondiente al procedimiento.
  28. 28. Código1 #include<iostream.h>2 #include<conio.h>34 //DECLARACION DE PROCEDIMIENTO5 void fSuma(float,float);67 //INICIO DEL PRINCIPAL8 main() {9 //DECLARACIÓN DE VARIABLES10 float dN1,dN2;1112 //DATOS DE ENTRADA13 cout<<"Numero 1:";14 cin>>dN1;15 cout<<"Numero 2:";16 cin>>dN2;1718 //LLAMADA A PROCEDIMIENTO19 fSuma(dN1,dN2);20getch();21}2223//INICIO DE PROCEDIMIENTO24void fSuma(float dN1a,float dN2a)25{26//DECLARACIÓN DE VARIABLES27float dSuma;
  29. 29. 28 29//PROCESO 30dSuma=dN1a+dN2a; 31 32//SALIDA 33cout<<"El total es: "<<dSuma; } 34 35Ejemplo EjecutadoUn puntero es una variable que tiene la dirección de memoria de otra variable que contieneun valor. Gráfica 1. Dirección de memoria.
  30. 30. La dirección es la posición que ocupa en la memoria una variable, un arreglo, una cadena,una estructura, otro puntero, etc.Normalmente las variables contienen valores específicos. En cambio, los punteros contienendirecciones de variables que contienen valores específicos.Si una variable contiene la dirección de otra variable entonces se dice que: “la primera variableapunta a la segunda”.Gráfica 2. Puntero de una variable a otra variable.En este sentido, los nombres de variables hacen referencia directa a un valor y lospunteros hacen referencia indirecta a un valor. La referencia a un valor a través de unpuntero se llama indirección.Gráfica 3. Referencia directa e indirecta a una variable.cont hace referencia directa a una variable cuyo valor es 23cont hace referencia indirecta a una variable cuyo valor es 23Existen tres razones para usar punteros en la creación de programas:- Los punteros proporcionan los medios mediante los cuales las funciones modifican susargumentos de llamada.- Se pueden utilizar para soportar las rutinas de asignación dinámica del C++.- Se puede sustituir por arreglos en muchas situaciones para incrementar la eficacia.
  31. 31. Variable PunteroSintaxis : tipo *nombre_variable;Propósito : Declarar si una variable contiene una dirección de memoria. Donde tipo puedeser cualquier tipo base del C++, y éste define a que tipo de variable puede apuntar el puntero.Ejemplo : int *punt, k;Esta sentencia declara que punt apunta a un valor u objeto de tipo entero. Cada variable quese declara como puntero debe ir precedida por un *.Los punteros se deben inicializar a 0, a NULL o a una dirección, al declararlos o mediante unaasignación, para evitar que apunten a áreas desconocidas de memoria.Operadores PunteroExisten dos operadores especiales de punteros:& : Operador de dirección, devuelve la dirección de memoria de su operando (variable a laque precede).Gráfica 4. Aplicación del operador de dirección.punt = &cont;Coloca la dirección de memoria 3500 de la variable cont en punt y la variable puntero puntestá ubicada en la dirección 4000. Esta dirección es una posición interna del ordenador y notiene que ver con el valor de cont.Se lee que punt “recibe la dirección del valor” cont.* : Operador de indirección, es el complemento de &, devuelve el valor de la variablesituada en la dirección que sigue (sinónimo de la variable hacia el que apunta su operando).valt = *punt;Si punt contiene la dirección de memoria de la variable cont, entonces coloca el valor de conten valt. Ejemplo, si cont al inicio tenía el valor 23, entonces, después de esta asignación, valttendrá el valor 23 ya que es el valor guardado en la posición 3500, que es la dirección dememoria que asignó a punt.Recordar al * como “en la dirección”.Se lee como que valt “recibe el valor de dirección” punt.El proceso que consiste en reportar el valor de una variable precedida por un * se conocecomo desreferenciación de un puntero.Ejemplo: cout<<*punt;Esta sentencia reporta el valor de la variable cont, es decir 23.También puede utilizarse un puntero desreferenciado del lado izquierdo de una sentencia deasignación.Ejemplo: *punt = 25;Esta sentencia asigna el valor 25 a la variable cont.
  32. 32. El puntero desreferenciado también puede usarse para recibir un valor de entrada.Ejemplo: cin>>*punt;Como el signo de multiplicación y el de “en la dirección” es el mismo, al escribir un programa,tener en cuenta que estos operadores no tienen relación.& y * tienen una precedencia más alta que el resto de operadores aritméticos.El tipo base del puntero determina el tipo de datos que el compilador asumirá que apunta elpuntero.Como punt es un puntero entero, C++ copia dos bytes en valt desde la dirección a la queapunta punt.Expresiones con Punterosa) Se puede usar un puntero en la parte derecha de una sentencia de asignación paraasignar el valor del puntero a otro puntero. Ejemplo:int t, *x, *y;t = 450; x = &t; y = x;cout<<“La dirección es : ”<< y;Este fragmento de programa visualiza la dirección de t en hexadecimal, y no el valor de t.b) En aritmética convencional el resultado de 3000+2 es 3002. Pero en aritmética depunteros esto no es así, pues si a un puntero se le suma (+) o resta (-) un entero; dichopuntero no aumenta o disminuye en la misma cantidad que el entero, sino en el entero por elnúmero de bytes de la variable hacia la que apunta. Número de bytes depende de tipo de datode variable.Ejemplo: x += 7;Si la variable x es de tipo entero; entonces, después de esta operación, x apuntará a ladirección 3014 (3000 + 7 * 2), ya que los enteros poseen dos bytes.Si el ejemplo hubiera sido: x – = 4;Entonces x apunta a la dirección 2992 (3000 – 4 * 2).c) Se pueden incrementar (++) o disminuir (- -) punteros. Por ejemplo: sea y un puntero aun número flotante con la dirección actual 3500.Después de la expresión: y++; la dirección de y será 3504 y no 3501.Cada vez que se incrementa y, la computadora apuntará al siguiente flotante, que usa cuatrobytes.Gráfica 5. Variación de un puntero.
  33. 33. d) Es posible asignar un apuntador a otro, si ambos son del mismo tipo. De otro modo, esnecesario emplear un operador de conversión mediante cast para convertir el valor delapuntador del lado derecho de la asignación al tipo de apuntador a la izquierda de laasignación.e) Es posible comparar dos punteros en una relación:if(g>h) cout<<“g apunta a dirección más alta que h”;Se usan las comparaciones de punteros, generalmente, cuando dos o más punteros apuntana un objeto común.f) No se pueden realizar otras operaciones sobre punteros; es decir, no se puede multiplicaro dividir punteros, no se puede sumar o restar dos punteros y no se puede sumar o restar lostipos float o double a punteros.Punteros y ArreglosComo la velocidad es una consideración frecuente en programación, el uso de punteros esmás común que el método de indexación de arreglos, debido a que C++ tarda más en indexarun arreglo que lo que hace el operador *.El método de los punteros requiere de las siguientes consideraciones:a) Un nombre de arreglo sin índice, es la dirección del comienzo del arreglo. Es decir, elnombre de un arreglo es un puntero al arreglo. Ejemplo:char w[50], *x; x = w;Aquí se pone en x la dirección de 1er. elemento de w.b) Debido a que los índices de arreglos comienzan en cero; para acceder a un determinadoelemento de un arreglo; por ejemplo el cuarto elemento de w, se puede escribir:w[3] ó *(w+3)c) En el caso del arreglo bidimensional g, cuyos contadores i y j se inicializan a partir decero, el acceso puede especificarse como:g[i][j] ó *(*(g + i) + j)d) Se puede indexar un puntero como si fuera un arreglo: int g[7] = {1, 2, 3, 4, 5, 6, 7}; int j,*x;x = g; for(j=0; j<7; j++) cout<<x[j];Aquí se visualiza en la pantalla los números del 1 al 7.
  34. 34. e) El C++ trata a las cadenas como punteros al primer carácter de cadena y no comocadena propiamente dichastrlen(char *q) {int j = 0;while(*q) { j++; q++; }return j; }Recordar que toda cadena termina en un nulo (o falso).while(*q)Es verdad hasta que se alcance el final de la cadena.f) Si se quiere acceder al arreglo aleatoriamente, es mejor la indexación, ya que es tanrápido como la evaluación por punteros y porque es más fácil programar.g) Se puede asignar la dirección de un elemento específico de un arreglo aplicando el & aun arreglo indexado:q = &y[7];Esta sentencia coloca la dirección del octavo elemento de y en q. Esto es útil en la localizaciónde subcadenas.char w[60],*y; int t;cout<<“Introducir una cadena: ”; gets(w);for(t=0; w[t] && w[t]==’’;t++);y = &w[t]; cout<<y;Esto imprime el resto de una cadena, que se introdujo por teclado, desde el punto en que lacomputadora encuentre el primer espacio o el final de la cadena.h) Recordar que el acceso a una cadena individual se especifica solamente con el índiceizquierdo.gets(y[i]);Esta sentencia es funcionalmente equivalente a:gets(&y[i][j]);i) Se pueden hacer arreglos de punteros. Ejemplo:int *b[10];Declara un arreglo de punteros int de tamaño 10.j) Para asignar una dirección de variable entera llamada z al quinto elemento del arreglo depunteros, se escribirá:b[4] = &z;y para encontrar el valor de z se escribirá: *b[4]
  35. 35. Las listas son una sucesión de cero o más elementos.Esta es una definición muy simple y que no aclara demasiado en términos informáticos, asíque profundizaremos un poco más.Hay varios tipos de listas, las hay enlazadas, no enlazadas, ordenadas y no ordenadas.Nosotros vamos a estudiar las listas enlazadas, tanto ordenadas como no ordenadas.La diferencia que existe entre las listas enlazadas y las no enlazadas es que las enlazadasutilizan punteros, es decir, asignación dinámica de memoria, lo que optimiza la gestión de lamisma. Una lista no enlazada es un simple array, y por lo tanto es un bloque contiguo dememoria, mientras que una lista enlazada es un conjunto de nodos que no tienen porqueocupar posiciones contiguas de memoria.La diferencia entre listas ordenadas y no ordenadas es obvia, las ordenadas mantienen ciertoorden entre sus elementos.A partir de ahora nos centraremos en las listas enlazadas no ordenadas.Una lista es una sucesión de nodos en la que a partir de un nodo se puede acceder al queocupa la siguiente posición en la lista. Esta característica nos indica que el acceso a las listases secuencial y no indexado, por lo que para acceder al último elemento de la lista hay querecorrer los n-1 elementos previos ( n es el tamaño de la lista).Para que un nodo pueda acceder al siguiente y la lista no se rompa en varias listas cada nodotiene que tener un puntero que guarde la dirección de memoria que ocupa el siguienteelemento. De esta forma un nodo se podría representar esquemáticamente así:En el campo información se almacena el objeto a guardar y el puntero mantendrá la conexióncon el nodo siguiente.De esta forma al ir añadiendo nodos se iría formando una sucesión de nodos encadenadosmediante punteros.
  36. 36. Operaciones básicas de las listasEn toda estructura de datos hay dos operaciones que sobresalen por encima del resto:Insertar y borrar. Estas dos operaciones aparecerán en toda estructura de datos, puede quecon otro nombre, o con una funcionalidad ligeramente diferente, pero su filosofía será lamisma, proporcionar unas operaciones para la construcción de la estructura de datos.InsertarLa operación insertar consiste en la introducción de un nuevo elemento en la lista.En una lista no ordenada no es necesario mantener ningún orden, por lo tanto la inserción deelementos se puede realizar en cualquier lugar de la lista, al principio, al final, en una posiciónaleatoria,...Generalmente se realiza la inserción de tal forma que la complejidad temporal sea mínima, esdecir, que sea una operación sencilla para que se realice en el menor tiempo posible. Laoperación más sencilla depende de la implementación de la estructura de datos, en unoscasos puede ser la inserción al inicio, en otros la inserción al final y en este caso la inserciónla realiza en el segundo nodo de la lista.Si tenemos la lista...... e insertamos el elemento 0, la lista quedaría de la siguiente forma:BorrarLa operación borrar consiste en la eliminación de la lista de un elemento concreto. El elementoa borrar será escogido por el programador.La eliminación en una lista no conlleva ningún trabajo adicional más que el propio de laeliminación del elemento en sí. Para borrar un elemento cualquiera habría que realizar unrecorrido secuencial de la lista hasta encontrar el nodo buscado y una vez localizadoreestructurar los punteros para saltarse el nodo a borrar y así poder eliminarlo.Vamos a verlo con un ejemplo. Borrado del elemento 76 en la lista anterior:Paso 1: Localizar el elemento a borrar.Paso 2: Reestructurar punteros y eliminar nodo.Otras operacionesA partir de estas dos operaciones básicas cada lista puede presentar muchas operacionesdiferentes, vamos a comentar algunas de ellas, dejando claro que las dos básicas quesiempre aparecerán son las anteriores.
  37. 37.  Tamaño: Esta operación suele informar sobre el número de elementos que tiene en ese instante la lista.  Buscar: Comprueba si existe un determinado elemento en la lista.  Recorrer lista: Recorre toda la lista, realizando una operación en cada nodo. Por ejemplo, mostrar el contenido por pantalla.En este capítulo se definirá el concepto de pilas implementada con arreglo de registros.Además se describen algunas de sus operaciones más importantes.DefiniciónUna PILA es una estructura ordenada y homogénea, en la que podemos apilar o desapilarelementos en una única posición llamada CIMA, siguiendo una política LIFO (Last In, FirstOut). PilasRepresentación de pilas con arreglosUtilizaremos un arreglo llamado Pila de tamaño máximo MaxElemPila y una variable llamadaCima que indicará cual es el último elemento ocupado en el arreglo (es decir la variable Cimacontiene la posición del elemento que se encuentra en la cima de la pila). Representación de pilas con arreglos
  38. 38. OperacionesLas operaciones son:- CrearPila : Inicializa la pila en el estado vacío.- PilaVacía : Determinar si la pila está vacía.- PilaLlena : Determina si la pila está llena.- Apilar : Agrega un nuevo elemento a la pila.- Desapilar : Elimina el dato que se encuentra en la cima de la pila.- CimaPila : Permite capturar el elemento que está en la cima de la pila, sin eliminarlo.Implementación:Archivo:- Pilas.vb- Pilas.cppOperación Crear Pila{Objetivo : Inicializar al estado vacío.Entrada : Pila, Cima, MaxElemPilaPrecondiciones : Cima correspondiente a una pilaSalida : CimaPostcondiciones: Pila está vacía. Cima tiene valor inicial de cero}Función CrearPila (?Pila, ?Cima, MaxElemPila)InicioPila = Memoria [MaxElemPila]Cima = 0FinOperación Pila Vacía{Objetivo: Indica si pila está vacía.Entrada: CimaPrecondiciones: Cima de una pilaSalida: Valor verdadero o falso.Postcondiciones: PilaVacia es un valor lógico verdadero si pila está vacía y falso en casocontrario}
  39. 39. Logico Función PilaVacia (Cima )InicioSi ( Cima == 0 ) entoncesretorna verdaderoSinoretorna falsoFin_siFin  Operación Pila Llena{Objetivo: Indica si pila está llena.Entrada: Cima, MaxElemPilaPrecondiciones: Parámetros de la pila a ser probadaSalida: Valor lógico de la función.Postcondiciones: valor lógico verdadero si pila está llena y falso en caso contrario}Logico Función PilaLlena (Cima, MaxElemPila )InicioSi (Cima ==MaxElemPila) entoncesretorna verdaderoSinoretorna falsoFin_siFin  Operación Apilar{Objetivo: Añade NuevoElemento a la cima de la pilaEntrada: Pila, Cima, NuevoElemento, MaxElemPilaPrecondiciones: Pila no está llenaSalida: PilaPostcondiciones: Pila original con NuevoElemento añadido a la cabeza.}Procedimiento Apilar (?Pila, ?Cima, NuevoElemento, MaxElemPila )InicioSi (PilaLlena (Cima, MaxElemPila) == verdadero) entonces
  40. 40. Escribir “Pila llena”SinoCima = Cima + 1Pila [Cima] = NuevoElementoFin_siFin  Operación Desapilar{Objetivo: Quita el elemento cima de la pila y lo devuelve en ElemSacado.Entrada: Pila, Cima, ElemSacado.Precondiciones: Pila no está vacía, ElemSacado no tiene valorSalida: Pila, Cima, ElemSacado.Postcondiciones: Pila original con elemento cima quitado. Pila y ElemSacado con valor.}Procedimiento Desapilar (?Pila, ?Cima, ?ElemSacado )InicioSi (PilaVacia (Pila,Cima) == verdadero) entoncesEscribir “Pila vacia”SinoElemSacado = Pila [Cima]Cima = Cima - 1Fin_siFin  Operación CimaPila{Objetivo : Captura el elemento que está en la cima de la pila sin eliminarlo.Entrada : Pila, CimaPrecondiciones : Pila no está vacíaSalida : Pila, Cima, valor de la funciónPostcondiciones : Pila original}Entero Funcion CimaPila (Pila,Cima)InicioSi (PilaVacia Cima) == verdadero) entoncesEscribir “Pila vacia”
  41. 41. Retorna -1Sinoretorna Pila [Cima]Fin_siFinAplicaciones de pilasLas Pilas son una estructura de datos muy usado en la solución de diversos tipos deproblemas. Estos son algunos de los casos más representativos de aplicación de pilas:- Llamadas a subprogramas.- Tratamiento de expresiones aritméticas.Llamadas a subprogramasUno de los usos más comunes de la pila es el de almacenar la información de las sucesivasllamadas a subrutinas en un programa, lo que nos permitirá volver de las mismas tras sufinalización. Fig. 5.3 Llamadas a subprogramasEn el programa P, la instrucción r-1 es una llamada al procedimiento A1; sabemos que estainstrucción implica pasar a la ejecución de A1 y cuando éste finalice, pasa a ejecutar lainstrucción siguiente, esto es la r.Por su parte, la instrucción s-1 de A1 supone la ejecución de una llamada a A2. Se pasa elcontrol a A2 y cuando finalice pasa a ejecutar la posición s. Este proceso puede repetirse unnúmero cualquiera de veces, y es necesario disponer de un mecanismo que nos permitaejecutar las instrucciones en el orden adecuado.En la memoria del ordenador, el Sistema Operativo reserva una zona que se denomina pilaque se maneja como una estructura de datos de este tipo, es decir, siguiendo una políticaLIFO. El uso de esta pila nos ayuda a almacenar la información necesaria para poder devolverel control de forma correcta después de cada llamada: cuando se realiza una llamada a unsubprograma, además de otra información relacionada con los argumentos del mismo, sealmacena en la pila la dirección de retorno. Cada vez que finalice la ejecución de unsubprograma, en la cima de la pila tendremos la información necesaria para saber en queinstrucción nos habíamos quedado cuando realizamos la llamada. Al volver del subprograma,
  42. 42. eliminaremos del tope de la pila la dirección de retorno, lo que dejará como nuevo tope lainformación necesaria para volver al finalizar el subprograma actual. Información en la pila durante el desarrollo del programaEl gráfico de la figura representa en forma simplificada, la información que tendremos en lapila del sistema durante el desarrollo del programa del ejemplo anterior:Tratamiento de expresiones aritméticasUn problema interesante en computación es poder convertir expresiones en notación infija asu equivalente en notación postfija (o prefija).Notación Infija : ejemplo A + B, operador entre operandos.Notación Postfija : ejemplo AB+, operador después de los operandos.Notación Prefija : ejemplo +AB, operador antes de los operandos.Ventaja: En las expresiones en notación prefija y postfija no son necesarios los paréntesispara indicar orden de operación ya que este queda establecido por la ubicación de losoperadores con respecto a los operandos.Prioridad de los operadores1. ( ) paréntesis2. ^ potencia3. *, / multiplicación y división4. +, - sumas y restasLos operadores con igual prioridad se procesan de izquierda a derecha.EjemploTraducir la expresión infija X + Y *W a notación postfija.
  43. 43. Notación postfijaEjemploTraducir la expresión infija X + Y *W a notación prefija. Notación prefijaRecursividadLa recursividad es una característica de los lenguajes de programación en virtud de la cual sepermite que un procedimiento haga referencia a sí mismo dentro de su definición.La definición recursiva debe estar hecha de manera que la cadena de invocaciones termine enalgún momento con una llamada que no genere nuevas invocaciones.La recursión en los subprogramas puede darse de dos maneras diferentes:a) Directa: El subprograma se llama directamente a sí mismo. Recursión directab) Indirecta: El subprograma llama a otro subprograma y éste a su vez llama al primero. Recursión indirecta
  44. 44. La construcción de estos procedimientos no sigue una fórmula concreta, pero el programadorpuede utilizar la noción de inducción de la siguiente forma:1. Solucionar el caso/s más simple. Caso base.2. Expresar el caso general en función de casos más simples que tiendan hacia el caso base.3. Desarrollar el algoritmo recursivo, que en general tendrá la siguiente estructura:Si estamos en un caso base entoncesDevolver la solución al caso baseSino- Descomposición del problema- Llamada recursiva- Obtención de la solución a partir del resultado obtenido en la llamada recursiva.- Devolver solución.Fin siEjemplo 1:Escriba una función recursiva que permite calcular el factorial de un número entero positivo.¨ Caso base:Factorial (0) =1¨ Enunciado General:Factorial(n) = n * Factorial(n-1)¨ Algoritmo recursivo:Entero Función Factorial (n)InicioSi (n = 0) entoncesFact =1SinoFact = n * Factorial(n-1)Fin siDevolver FactFin
  45. 45. Simulación de ejecución del algoritmoEjercicios ResueltosEjercicio1. Considere la operación Reemplazar (Pila, ElemAntiguo, ElemNuevo) que consisteen reemplazar todas las ocurrencias de un valor ElemAntiguo en la pila Pila por un nuevovalor ElemNuevo. Escribir el algoritmo para esta operación. Utilice las operaciones sobre pilasestudiadas en clase pero no asumir ninguna representación de pilasSolución:Algoritmo Reemplazar (?Pila, CimaPila, MaxElemPila, ElemAntiguo, ElemNuevo)InicioCrearPila (PilaAux,cimaAux, MaxElemPilaAux)Repetir mientras (PilaVacia (cimaPila)==Falso)Desapilar (Pila, CimaPila, X)Si(X== ElemAntiguo) entoncesApilar (PilaAux, cimaAux, ElemNuevo, MaxElemPilaAux)SinoApilar (PilaAux, cimaAux, X, MaxElemPilaAux)Fin siFin repetirRepetir mientras (PilaVacia (cimaAux) ==Falso)Desapilar (PilaAux, CimaAux, X)Apilar (Pila, CimaPila, X, MaxElemPila)Fin repetirFin
  46. 46. Ejercicio 2. Formule un algoritmo que particione una pila P en dos pilas P1, P2, de lasiguiente manera: los valores menores que un valor dado x son ubicados en P1, los otros seubican en P2. Emplee solo operaciones de pilas. No asuma ninguna implementación enparticular.Solución:Algoritmo Particionar (?P, CimaPila, max, X, ?P1, ?P2, ?cimaP1, ?cimaP2)InicioCrearPila (P1,cimaP1, max)CrearPila (P2, cimaP2, max)Repetir mientras (PilaVacia (CimaPila)== Falso)Desapilar (P, CimaPila, z)Si ( z < X) entoncesApilar (P1, cimaP1, z, max)SinoApilar (P2, cimaP2, z, max)Fin siFin repetirFinEjercicio 3. Considere la operación CopiaArriba (P1, cimaP1, P2, cimaP2, P3, cimaP3, tam3)que copia la primera pila P1 en la segunda pila P2 en el mismo orden. Escriba el algoritmocorrespondiente a esta operación. Use las operaciones de Pila.Solución:Algoritmo CopiaArriba (P1, cimaP1, P2, cimaP2, ?P3, ?cimaP3, tam3)InicioMaxAux=tam3CrearPila(P3,cimaP3, cimaP3)CrearPila (PAux, cimaAux, MaxAux)Repetir mientras (PilaVacia (cimaP1) == falso)Desapilar (P1, cimaP1, X)Apilar (PAux, cimaAux, X, maxAux)Fin repetir
  47. 47. Repetir mientras (PilaVacia (cimaP2) == falso)Desapilar (P2, cimaP2, X)Apilar (PAux, cimaAux, X, maxAux)Fin repetirRepetir mientras (PilaVacia (cimaAux) == falso)Desapilar (PAux, cimaAux, X)Apilar (P3, cimaP3, X, tam3)Fin repetirFinEjercicio 4. Considere la operación EliminarDato (Pila, cimaPila, Dato, MaxElemPila), queconsiste en eliminar de la pila P el elemento Dato. Escriba el algoritmo correspondiente a estaoperación. Use las operaciones de Pila.Solución:En caso hubieran más elementos Dato, solamente elimina el primero.Algoritmo EliminarDato (?Pila, ?cimaPila, Dato, MaxElemPila)IniciomaxAux= MaxElemPilaCrearPila (PAux, cimaAux, maxAux)Sw = 0Repetir mientras (PilaVacia (cimaPila) == Falso y Sw == 0)Desapilar (Pila, cimaPila, x)Si (x ¹Dato) entoncesApilar (PAux, cimaAux, x, MaxAux)SinoSw= 1Fin siFin repetirRepetir mientras (PilaVacia (cimaAux) ==Falso)Desapilar (PAux, cimaAux, Y)Apilar (Pila, cimaPila, Y, MaxElemPila)Fin repetir
  48. 48. FinEjercicio 5. Considere un arreglo lineal llamado A el cual almacena n números enteros,escriba un algoritmo recursivo que permita buscar un elemento llamado Val.Solución:Lógico Función BuscarValor (A, n, Val)InicioSi (n ==1) entoncesSi A[n]= Val entoncesBuscar = verdaderoSinoBuscar = BuscarValor(A, n-1, Val)Fin siSinoBuscar = falsoFin siDevolver BuscarFinEjercicio 6. Considere un arreglo lineal llamado A el cual almacena n números enteros,escriba un algoritmo recursivo que permita calcular el elemento más grande.Solución:Entero Función Mayor (A, n)InicioSi (n==1) entoncesMay = A[n]SinoSi (A[n]> Mayor(A, n-1)) entoncesMay = A[n]SinoMay = Mayor(A, n-1)Fin siFin siDevolver MayFinEjercicio 7. El coeficiente binomial C(n, m) indica el número de maneras de escoger mobjetos entre n objetos.
  49. 49. Se conoce la relación C(n, m) = C(n-1, m-1) + C(n-1, m)a) Formule un algoritmo recursivo para calcular C(n, m).SoluciónEntero Función C (n, m)InicioSi (m == 1) entoncesComb = n (Caso Base 1)Sino si (n == m) entoncesComb = 1 (Caso Base 2)Sino (Caso General)Comb = C (n-1, m-1) + C (n -1, m)Fin siDevolver CombFinb) Identifique el caso base.Soluciónm = 1, ? C = nm = n, ? C = 1ColasEn este capítulo se definirá el concepto y uso de la estructura y algoritmos de colas. Seráimplementado con arreglos, describiéndose las operaciones en colas simples, colas circulares,colas con prioridades y bicolas.Definición y usoEs una lista de elementos en la que las eliminaciones se realizan solo en un extremo llamadoel frente y las adiciones se realizan en el otro extremo llamado final (FIFO, First Input FirstOutput). La atención de un grifo es un ejemplo de cómo funciona una cola, ColasSe utilizan por ejemplo en los sistemas operativos en las salidas a impresora formando unacola de impresión. Los trabajos en proceso forman cola para ser atendidos.
  50. 50. Representación de colas con arreglosUna cola se puede implementar mediante un arreglo. Además se requiere una variable Frente(la posición del extremo izquierdo) por donde se extrae elementos y una variable Final (laposición del extremo derecho) por donde se añaden elementos. Además se requiere untamaño de cola N. Representación de colas con arreglosLa implementación utiliza la siguiente definición: Cola: arreglo [1..N]OperacionesLas operaciones de cola son:- Crear cola: inicializa la cola en el estado vacío.- Cola vacía: determina si la cola está vacía.- Cola llena: determina si la cola está llena.- Encolar: añadir un nuevo elemento a la cola. Implica incrementar en uno el valor de Final yluego ubicar el último elemento en la nueva posición.- Desencolar: extraer el elemento que se encuentra en el frente y avanzar Frente un lugar.ImplementaciónArchivo:- PrincipalCola.cpp- PrincipalCola.vbCrear cola{Objetivo: Crear una cola vacíaEntrada: Frente, FinalPrecondición: NingunaSalida: Frente, FinalPostcondición: Cola definida y vacía}
  51. 51. Procedimiento CrearCola(#Cola, N, #Frente, #Final)Inicio{Definir Cola de tamaño N}Frente = 0Final = 0FinCola vacía{Objetivo: Indicar si la cola tiene o no elementosEntrada: FrentePrecondición: NingunaSalida: Valor lógicoPostcondición: Indica si está vacío o no}Lógico Función ColaVacía(Frente)InicioSi (Frente == 0) entoncesretornar verdaderoSinoretornar falsoFin siFinCola Llena Cola llena{Objetivo: Indicar verdadero si la cola tiene el máximo número de elementosEntrada: Final,NPrecondición: NingunaSalida: Indicador lógicoPostcondición: Indica si está llena o no
  52. 52. }Lógico Función ColaLlena(Final, N)InicioSi (Final == N) entoncesretorna verdaderoSinoretorna falsoFin siFinAgregar un elemento a la cola – Encolar{Objetivo: Añade un elemento al final de la colaEntrada: Cola, Frente, Final, N, NuevoElementoPrecondición: NingunaSalida: Cola, Frente, FinalPostcondición: Cola original con nuevo elemento añadido al final}Procedimiento Encolar(Cola, Frente, Final, N, NuevoElemento)InicioSi (ColaLLena (Final, N) == verdadero) entoncesEscribir “Cola llena”sinoSi (ColaVacia (Frente) == verdadero) entoncesFrente = 1Final = 1SinoFinal = Final + 1Fin siCola [Final] = NuevoElementoFin siFinExtraer un elemento a la cola – Desencolar{Objetivo: Extraer un elemento del frente de la colaEntrada: Cola, Frente, Final, ElementoExtraido (sin valor)Precondición: Ninguna
  53. 53. Salida: Cola, Frente, Final, ElementoExtraido (con valor)Postcondición: Cola con elemento extraído del frente}Procedimiento Desencolar(Cola, Frente, Final, ElementoExtraido)InicioSi (ColaVacia (Frente) == verdadero) entoncesEscribir “Cola vacía”SinoElementoExtraido = Cola [Frente]Si (Frente == Final) entoncesFrente = 0Final = 0SinoFrente = Frente + 1Fin siFin siFinCola circularObservando el gráfico de la figura, aparentemente la cola está llena, Final = N, sin embargopodemos observar que existen celdas disponibles en la cual se pueden añadir más elementos.Para usar este espacio se usan las Colas Circulares. Cola con celdas disponibles Colas circulares
  54. 54. Se debe tener en cuenta que en las colas circulares se presentan dos casos los cuales semuestran en la figura. Casos circularesOperaciones de cola circularLas operaciones de cola circular que son diferentes a las de cola simple son:- Cola llena.- Encolar.- Desencolar.ImplementaciónArchivo:- PrincipalColaCircular.cpp- PrincipalColaCircular.vb  Cola llena en cola circular{Objetivo: Indica si la cola está llenaEntrada: Frente, Final, NPrecondición: NingunaSalida: Indicador lógicoPostcondición: Indica si está llena o no}Lógico Función ColaLlenaCircular (Frente, Final, N)InicioSi (Frente == 1 y Final == N o Final + 1 == Frente) entoncesretornar verdaderoSinoretornar falso
  55. 55. Fin siFin  Encolar en cola circular{Objetivo: Añade un elemento al final de la colaEntrada: Cola, Frente, Final, N, NuevoElementoPrecondición: Cola no llenaSalida: Cola, Frente, Final.Postcondición: Cola original con nuevo elemento añadido al final}Procedimiento EncolarCircular (Cola, Frente, Final, N, NuevoElemento)InicioSi (ColaLLenaCircular (Frente, Final, N) == verdadero) entoncesEscribir “Cola circular llena”SinoSi (ColaVacia (Frente) == verdadero) entoncesFrente = 1Final = 1SinoSi (Final ==N) entoncesFinal = 1SinoFinal = Final + 1Fin siFin siCola [Final] = NuevoElementoFin siFin  Desencolar cola circular{Objetivo: Extraer un elemento del frente de la colaEntrada: Cola, Frente, Final, N, ElemExtraidoPrecondición: Cola no está vacíaSalida: Cola, ElementoExtraidoPostcondición: Cola original con elemento del frente extraido}
  56. 56. Procedimiento DesencolarCircular (?Cola,?Frente, ?Final, N, ? ElemExtraido)InicioSi (ColaVacia (Frente) = verdadero) entoncesEscribir “Cola Circular vacía”SinoElemExtraido = Cola [Frente]Si (Frente = Final) entonces {la cola tiene un solo elemento}Frente = 0Final = 0SinoSi Frente = N entonces {si está en la última posición}Frente = 1SinoFrente = Frente + 1Fin siFin siFin siFinCola con prioridadesSon colas en que los elementos tienen asociada una prioridad. La implementación de colascon prioridades puede ser utilizando listas enlazadas, arreglos paralelos y mediante arreglosbidimensionales.En el caso de arreglos bidimensionales, cada fila del arreglo bidimensional es consideradauna cola circular. Dos arreglos Frente y Final almacenan las posiciones de los elementos queestán en el frente y final de cada cola. Además cada fila representa la prioridad que tienenesos elementos en ser procesados.
  57. 57. Cola con prioridadesSe aplican en sistemas operativos, en los que los programas de mayor prioridad se procesanprimero, a igualdad de prioridades se mantiene el orden de la cola.Inserción en cola con prioridades con arreglos bidimensionalesSe busca la fila correspondiente a la prioridad del elemento a ser insertado y luego se insertaal final de la cola, siempre que no esté llena.Extracción en cola con prioridades con arreglos bidimensionalesSe busca la primera cola no vacía y se procede a extraer el elemento que está al frente de lacola.BicolasEn este caso, se puede añadir o extraer elementos por cualquier extremo. Puedeimplementarse en un arreglo como cola circular. En este caso se cumpliría que Bicola[Der] vadetrás de Bicola[Izq]. BicolasEjercicios ResueltosEjercicio1. Algoritmo que elimina Dato de la Cola.Procedimiento Eliminar(?Cola, ?Frente, ?Final, N, Dato)InicioCrearCola( C1, N1, Frente1, Final1)Sw = 1
  58. 58. Repetir mientras (ColaVacia (Frente) ==Falso y Sw ==1 )Desencolar (Cola, Frente, Final, X)Si (X ==Dato) entoncesSw = 0SinoEncolar (C1, Frente1, Final1, N1, X)Fin siFin repetirRepetir mientras (ColaVacia (Frente) == Falso)Desencolar (Cola, Frente, Final, X)Encolar (C1, Frente1, Final1, N1, X)Fin repetirRepetir mientras (ColaVacia (Frente1) == Falso)Desencolar (C1, Frente1, Final1, X)Encolar (Cola, Frente, Final, N, X)Fin repetirFinEjercicio 2. Algoritmo que invierte el contenido de una Cola. (Utilizar sola las operaciones decola.)Procedimiento InvertirCola(?Cola, ?Frente, ?Final, N)InicioCrearPila (PAux, cima, maxPila)Repetir mientras (ColaVacia (Frente) == Falso)Desencolar (Cola, Frente, Final, num)Apilar (PAux, cima, maxPila, num)Fin repetirRepetir mientras (PilaVacia (cima) == Falso)Desapilar (PAux, cima, X)Encolar (Cola, Frente, Final, N, X)Fin repetirFinImplementaciónArchivo:- PrincipalEjercicioCola.cpp- PrincipalEjercicioCola.vb

×