Académique Documents
Professionnel Documents
Culture Documents
ESTRUCTURA DE DATOS
Asignatura: Algoritmia y Estructura de Datos
Pg. 2
Asignatura: Algoritmia y Estructura de Datos
PRESENTACIN
Algoritmia y Estructura de Datos es una asignatura que tiene como finalidad proporcionar al
estudiante, los conocimientos necesarios en las tcnicas y estructuras de datos para la
programacin basada en el enfoque estructurado, requeridos en su formacin bsica para poder
desarrollar programas en otros niveles ms avanzados. La competencia a desarrollar es: Construye
algoritmos en un lenguaje de programacin, utilizando las sentencias bsicas de
programacin, diferenciando su uso para la propuesta de solucin de un problema, y con ello
construye programas computacionales utilizando mdulos de programa (funciones y
procedimientos), valorando la reutilizacin de los mdulo, y utilizando las diferentes
estructuras de datos: estticas y dinmicas para almacenar datos temporalmente,
diferenciando el uso de las estructuras con respecto al uso de los archivos como
almacenamiento de datos permanente, promoviendo el inters por otras tcnicas de
almacenamiento.
Agradecemos a quienes con sus aportes y sugerencias han contribuido a mejorar la presente
edicin, que slo tiene el valor de una introduccin al conocimiento de las estructuras de datos para
la programacin en un computador.
Los autores
Pg. 3
Asignatura: Algoritmia y Estructura de Datos
NDICE
Pg.
PRESENTACIN 3
NDICE 4
PRIMERA UNIDAD
Tema N 1: Algoritmo 6
1.1 Definicin del Algoritmo 6
1.2 Caractersticas de un algoritmo 7
1.3 Instrucciones Algortmicas Bsicas 7
1.4 Representacin del Algoritmo 8
Tema N 2: Programacin Estructurada 9
2.1 Programa 9
2.2 Lenguaje de Programacin 9
2.3 Programas Traductores 10
2.4 Definicin Programacin Estructurada 10
2.5 Resolucin de un Problema 11
Tema N 3: Sentencias Bsicas de Programacin 12
3.1 Estructura Bsica Simple o Secuencial 12
3.2 Estructura Bsica Selectiva 14
3.3 Estructura Bsica Repetitiva 22
SEGUNDA UNIDAD
Tema N 4: Modularizacin de Programas 30
4.1 Paso de Parmetros 30
4.2 Procedimientos 31
4.3 Funciones 31
Tema N 5: Libreras de Programacin creadas por el usuario 36
Tema N 6: Funciones Recursivas 38
TERCERA UNIDAD
Tema N 7: Estructuras de Datos 40
7.1 Definicin de Estructura de Datos 40
7.2 Clasificacin de Estructura de Datos 40
Tema N 8: Arreglos Unidimensionales 41
8.1 Actualizacin de Arreglos Unidimensionales 42
8.2 Bsqueda de Arreglos Unidimensionales 45
8.3 Ordenacin de Arreglos Unidimensionales 47
Tema N 9: Arreglos Bidimensionales 51
9.1 Actualizacin de Arreglos Bidimensionales 54
9.2 Aplicacin de Arreglos Bidimensionales 56
Tema N 10: Registro (Estructura) 60
Tema N 11: Union 64
Tema N 12: Tipos de Datos Abstractos (TDA) 64
Tema N 13: Clases y Programacin Orientada a Objetos 65
Tema N 14: Punteros a Direccin de Memoria 67
Pg. 4
Asignatura: Algoritmia y Estructura de Datos
Pg. 5
Asignatura: Algoritmia y Estructura de Datos
PRIMERA UNIDAD
Tema N 1: Algoritmo
Entrada de datos.
E PROCESO S
Proceso.
Salida de resultados.
Datos Resultado
En cada uno de ellos se necesita el uso de variables:
Variable:
Es una localizacin o casillero en la memoria principal que almacena un valor que puede cambiar
en el transcurso de la ejecucin del programa. Tiene un nombre, un tipo de dato y un valor.
Antes de poder utilizar una variable es necesario declararla especificando su nombre y su tipo de
dato.
Ejemplo 1:
Entero edad
Ejemplo 2:
Real peso, talla
Pg. 6
Asignatura: Algoritmia y Estructura de Datos
Pg. 7
Asignatura: Algoritmia y Estructura de Datos
INICIO
entero numero1, numero2, resultado
Leer numero1
Leer numero2
resultado numero1 + numero 2
Escribir El resultado de la suma es:
Escribir resultado
FIN
b. Diagrama de Flujo Estructurado: Representacin con flujos entre los procesos a realizar.
Los principales smbolos de representacin para este diagrama son.
Inicio/Fin del algoritmo
Subrutinas en el algoritmo
INICIO
Declaracin de variables
Lectura de Datos
Accin 1
Accin 2
Accin n
Reporte de Datos
FIN
Pg. 8
Asignatura: Algoritmia y Estructura de Datos
Actividades
Elaborar el algoritmo y su respectiva representacin, identificando los elementos de entrada y los
elementos de salida, para los siguientes casos:
a. El proceso de asistir a clases a un centro de estudios.
b. El proceso de solicitar un libro en la biblioteca de una universidad.
c. El proceso de un punto de ventas de un supermercado.
d. El proceso de intercambiar dos valores numricos.
e. El proceso de calcular la regla de tres simple.
f. El proceso de matrcula para elaborar una lista de contactos digital.
g. El proceso de Matrcula en una universidad.
2.1 Programa
Secuencia de instrucciones que especifican las operaciones que debe realizar la computadora, en
la cual cada paso del algoritmo est expresado por medio de una instruccin.
Conjunto de sentencias utilizadas para escribir secuencias de instrucciones que para que ejecute
un programa en una computadora.
a. Lenguaje Mquina: Lenguaje de programacin que la computadora interpreta y ejecuta
directamente, y est compuesto de instrucciones codificadas en binario (0, 1).
b. Lenguaje de Bajo Nivel: tambin llamados lenguajes ensambladores, permiten al
programador escribir instrucciones de un programa usando abreviaturas del lenguaje natural
(ingls), tambin llamadas palabras nemotcnicas (ADD, DIV, SUB, etc).
Pg. 9
Asignatura: Algoritmia y Estructura de Datos
INTERPRETE
PROGRAMA
EJECUTABLE
COMPILADOR
PROGRAMA
OBJETO
COMPILADOR
(Traductor)
PROGRAMA
FUENTE
PROGRAMA
OBJETO
PROGRAMA
ENLAZADOR
PROGRAMA
EJECUTABLE
Pg. 10
Asignatura: Algoritmia y Estructura de Datos
Que hace ?
Como hace?
c. Estructuras bsicas
Son estructuras de control para el programa:
Secuenciales
Selectivas
Repetitivas
Pg. 11
Asignatura: Algoritmia y Estructura de Datos
Las sentencias de programacin a utilizar es una las tcnicas de programacin del enfoque
estructurado: Estructuras Bsicas.
Declaracin de Variables
Lectura de Datos
Accin 1
Accin 2
Accin n
Reporte de Datos
FIN
Diagrama N-S:
INICIO
Declaracin de variables
Lectura de Datos
Accin 1
Accin 2
Accin n
Reporte de Datos
FIN
Ejemplo
Calcular el rea de un tringulo. Area = (base * altura) / 2
Solucin
Leyenda de Datos
base: valor de la base del tringulo
altura: valor de la altura del triangulo
Area: valor del resultado del clculo del rea del tringulo
Pg. 12
Asignatura: Algoritmia y Estructura de Datos
Diagrama de Flujo:
INICIO
Leer base
Leer altura
Escribir Area
FIN
Diagrama N-S:
INICIO
real base, altura, Area
Leer base
Leer altura
Area (base * altura) / 2;
Escribir El valor del rea para el tringulo es:
Escribir Area
FIN
Cdigo en C:
#include<iostream>
using namespace std;
void main( )
{ float base, altura, Area;
cout<<Ingrese valor de la base: ;
cin>>base;
cout<<\n; //Salto de lnea
cout<<Ingrese valor de la altura: ;
cin>>altura;
cout<<\n;
Pg. 13
Asignatura: Algoritmia y Estructura de Datos
Declaracin de Variables
Lectura de Datos
F V
Cond 1
Accin 1
Accin n
Reporte de Datos
FIN
Diagrama N-S:
INICIO
Declaracin de variables
Lectura de Datos
V Cond 1 F
Accin 1
Accin 2
Accin n
Reporte de Datos
FIN
Pg. 14
Asignatura: Algoritmia y Estructura de Datos
Ejemplo
Sumar dos nmeros enteros positivos c = a + b
Diagrama de Flujo:
INICIO
entero a, b, c
Leer a , b
c a+b
FIN
Diagrama N-S:
INICIO
entero a, b, c
Leer a , b
a >0 && b>0
V F
c a+b
Escribir El valor la
suma es: , c
FIN
Cdigo C:
#include<iostream>
using namespace std;
int main( )
{ float a, b, c;
cout<<Ingrese primer nmero: ;
cin>>a; cout<<\n;
cout<<Ingrese segundo nmero: ;
cin>>b; cout<<\n;
Pg. 15
Asignatura: Algoritmia y Estructura de Datos
b. Estructura Bsica Selectiva Compuesta: se tiene un punto de decisin que evala una
condicin y si es Verdadero, ejecuta un conjunto de Acciones, y si es Falsa ejecuta otro
conjunto de acciones.
Diagrama de Flujo
INICIO
Declaracin de Variables
Lectura de
Datos
F V
Cond 1
Accin 2 Accin 1
Accin m Accin n
Reporte de
Datos
FIN
Diagrama N-S
INICIO
Declaracin de variables
Lectura de Datos
Cond 1
V F
Accin 1 Accin 2
.
Accin n Accin m
Reporte de Datos
FIN
Pg. 16
Asignatura: Algoritmia y Estructura de Datos
Ejemplo:
Sumar dos nmeros enteros si son positivos, sino multiplicarlos.
Solucin:
Leyenda de Datos
a: valor del primer nmero entero positivo
b: valor del segundo nmero entero positivo
c: valor del resultado la suma o multiplicacin de dos nmeros a y b
Diagrama de Flujo
INICIO
entero a, b, c
Leer a , b
F V
a >0 && b>0
c a*b c a+b
FIN
Diagrama N-S
INICIO
entero a, b, c
Leer a , b
a >0 && b>0
V F
c a+b c a*b
Escribir El valor la suma es: , c Escribir El valor la multiplicacin es: , c
FIN
Cdigo C:
#include<iostream>
using namespace std;
void main( )
{ int a, b, c;
cout<<Ingrese primer nmero: ;
cin>>a;
cout<<\n;
cout<<Ingrese segundo nmero: ;
cin>>b;
cout<<\n;
Pg. 17
Asignatura: Algoritmia y Estructura de Datos
Declaracin de Variables
Lectura de Datos
F V
Cond 1
F V
Accin 2 Cond 2
Accin 1
Accin m
Accin n
Reporte de Datos
FIN
Diagrama N-S
INICIO
Declaracin de variables
Lectura de Datos
F Cond 1 V
Accin 2 Cond 2
V F
Accin 1
.
Accin m Accin n
Reporte de Datos
FIN
Pg. 18
Asignatura: Algoritmia y Estructura de Datos
Ejemplo:
Ingresar un nmero entero y si es positivo y diferente de cero, reportar si se encuentra entre los
diez primeros nmeros.
Solucin: Leyenda de Datos
a: valor del numero entero
Diagrama de Flujo
INICIO
Entero a
Leer a
F V
a>0
F V
a>=1 && a>10
FIN
Diagrama N-S
INICIO
entero a
Leer a
a>0
F V
a>=1 && a>10
Escribir No es un nmero mayor F V
que cero
Escribir Son mas de los primeros 10 Escribir Primeros 10
FIN
Cdigo C:
#include<iostream>
using namespace std;
void main( )
{ int a;
cout<<Ingrese nmero: ;
cin>>a;
if(a>0)
if(a>=1 && a<10)
cout<<Primeros 10;
else
cout<<Son ms de los primeros 10;
else
cout<<No es un nmero mayor que cero;
}
Pg. 19
Asignatura: Algoritmia y Estructura de Datos
Declaracin de Variables
Lectura de Datos
1
default
Cond 1
2 3
Accin 4
Reporte de Datos
FIN
Diagrama N-S
INICIO
Declaracin de variables
Lectura de Datos
Cond 1
1 2 3 default
Accin 1 Accin 2 Accin 3 Accin 4
Accin n Accin m Accin m Accin m
Reporte de Datos
FIN
Ejemplo
Ingresa cinco nmeros e imprime que vocal es.
Solucin:
Leyenda de Datos
Pg. 20
Asignatura: Algoritmia y Estructura de Datos
Diagrama de Flujo
INICIO
entero num
Leer num
1 default
num
2 4 5
3
FIN
Diagrama N-S
INICIO
entero num
Leer num
num
1 2 3 4 5 default
Escribir Escribir Escribir Escribir Escribir Escribir No
Vocal A Vocal E Vocal I Vocal O Vocal U es Vocal
FIN
Cdigo C:
#include<iostream>
using namespace std;
void main( )
{ int num;
cout<<Ingrese nmero: ;
cin>>num;
switch(num)
{ case 1: cout<<Vocal A; break;
case 2: cout<<Vocal E; break;
case 3: cout<<Vocal I; break;
case 4: cout<<Vocal O; break;
case 5: cout<<Vocal U; break;
default: cout<<No es numero para una vocal;
}
}
Pg. 21
Asignatura: Algoritmia y Estructura de Datos
Declaracin de Variables
Lectura de Datos
F
Cond 1
V
Accin 1
Accin n
Accin 2
FIN
Diagrama N-S
INICIO
Declaracin de variables
Lectura de Datos
Cond 1
Accin 1
.
Accin n
Accin 2
Reporte de Datos
FIN
Ejemplo
Imprimir la serie Fibonacci, menor a un lmite dado: 0,1,1,2,3,5,8,13,.
Pg. 22
Asignatura: Algoritmia y Estructura de Datos
Diagrama de Flujo
INICIO
Leer lim
Escribir a
F
b<=lim
V
Escribir b
c a+b
a b
b c
FIN
Diagrama N-S
INICIO
entero lim, a=0, b=1, c
Leer lim
Escribir a
b <= lim
Escribir c
c a +b
a b
b c
FIN
Cdigo C:
#include<iostream>
using nameaspace std;
void main( )
{ int lim, a=0, b=1,c;
cout<<Ingrese lmite: ;
cin>>lim;
cout<<a;
Pg. 23
Asignatura: Algoritmia y Estructura de Datos
while(b<=lim)
{
cout<<b;
c=a+b;
a=b;
b=c;
}
}
b. Estructura Bsica Repetitiva Hacer - Mientras: realiza al menos una vez un conjunto de
acciones, y luego evala una expresin condicional, si es Verdadero regresa a repetir
el conjunto de acciones, si no cumple, sale del bucle.
Diagrama de Flujo
INICIO
Declaracin
de Variables
Lectura de
Datos
Accin 1
Accin n
V
Cond 1
F
Accin 2
Reporte de
Datos
FIN
Diagrama N-S
INICIO
Declaracin de variables
Lectura de Datos
Accin 1
.
Accin n
Cond 1
Accin 2
Reporte de Datos
FIN
Pg. 24
Asignatura: Algoritmia y Estructura de Datos
Ejemplo
Leer un nmero entero mayor que cero, sino es as, volver a solicitar el nmero con esas
condiciones.
Diagrama de Flujo INICIO
entero num
Leer num
V
num <= 0
F
FIN
Diagrama N-S
INICIO
entero num
Leer num
num <= 0
FIN
Cdigo C:
#include<iostream>
using namespace std;
void main()
{ int num;
#include<iostream>
using namespace std;
int main()
{ int n,m, cs=0,ci=0, venta=0; char ops,op;
do{
do{
cout<<"Ingrese valor de stock inicial: ";
cin>>n;
}while(n<=0);
Pg. 25
Asignatura: Algoritmia y Estructura de Datos
do{
do{ cout<<"Ingrese venta: ";
cin>>m;
}while(m<=0);
Pg. 26
Asignatura: Algoritmia y Estructura de Datos
INICIO
Declaracin de
Variables
Lectura de Datos
F
Variable recorrido es
menor a lmite
Accin 1
Accin n
Incrementar Variable de
Recorrido
Accin 2
Reporte de Datos
FIN
Diagrama N-S
INICIO
Declaracin de variables
Lectura de Datos
i = 0 ; i <= limite ; i++
Accin 1
.
Accin n
Accin 2
Reporte de Datos
FIN
Pg. 27
Asignatura: Algoritmia y Estructura de Datos
Ejemplo:
Calcular el Factorial de un nmero.
Diagrama de Flujo
INICIO
entero i , num, p = 1
Leer num
i 1
F
i < = num
p p * i
i ++
Escribir El factorial es , p
FIN
Diagrama N-S
INICIO
entero num, i , p =1
Leer num
i = 1 ; i <= num ; i++
p p * i
Escribir el factorial es:
Escribir p
FIN
Cdigo C:
#include<iostream>
using namespace std;
void main( )
{ int num, i, p=1;
cout<<Ingrese numero para factorial: ;
cin>>num;
for(i=1;i<=num; i++)
{ p = p * i;
}
cout<<El factorial de <<n<<es: <<p;
}
Pg. 28
Asignatura: Algoritmia y Estructura de Datos
Actividades
Elaborar el Pseudo cdigo, Diagrama de Flujo y Diagrama N-S, y Cdigo en C respectivo para:
1. La presin, el volumen y la temperatura de una masa de aire se relacionan por la formula:
Masa = (presin * volumen)/(0.37 * (temperatura + 460))
Calcular la masa respectiva.
2. En un hospital existen tres reas: Ginecologa, Pediatra, Traumatologa. El presupuesto anual
del hospital se reparte conforme a la siguiente tabla:
rea Porcentaje del presupuesto
i. Ginecologa 40%
ii. Traumatologa 30%
iii. Pediatra 30%
Obtener la cantidad de dinero que recibir cada rea, para cualquier monto presupuestal.
3. Encuentre el menor de tres nmeros dados.
4. Una fbrica de TV necesita que le ayuden a controlar el manejo de sus inventarios y pedidos
de venta.
Cuando llega un pedido, un programa debe verificar si existe suficiente cantidad de TV en
inventario. Si es as, debe reportar un mensaje PEDIDO COMPLETO y se debe dar la
disminucin del inventario.
Adems se necesita reportar:
El nmero de TV que quedan en el inventario final.
El nmero de pedidos completos.
El nmero de pedidos incompletos.
El nmero de TV vendidos.
El nmero de TV que faltan para completar los pedidos incompletos.
5. Lea un nmero entero e indique cual es su dgito mayor.
6. Suponga que tiene la calificacin final de un grupo de 40 alumnos, calcular la calificacin
promedio y la calificacin mas baja de todo el grupo.
7. Cuantos dgitos pares y cuantos dgitos impares tiene un nmero entero.
8. En una universidad se pueden llevar hasta 22 crditos en un ciclo. Elabora el cdigo que
permita a un alumno matricularse sin pasarse del lmite.
9. Una vendedora de pan tiene n unidades de pan al comenzar el da. Si cada cliente le pide m
panes, cuantos clientes son atendidos completamente, cuantos panes quedan para el ultimo
cliente?
10. Elabore el cdigo para una tienda para leer por cada cliente el monto total de su compra; Al
final del da reportar la cantidad total de ventas y el nmero de clientes atendidos.
11. Un censador recopila datos del ltimo censo nacional, al final de un da desea conocer de las
persona encuestadas el porcentaje que tiene estudios de primaria, el porcentaje que tiene
estudios de secundaria, porcentaje de carrera tcnica, porcentaje de estudios profesionales, y
porcentaje con estudios de post grado.
Pg. 29
Asignatura: Algoritmia y Estructura de Datos
SEGUNDA UNIDAD
Pg. 30
Asignatura: Algoritmia y Estructura de Datos
4.2 Procedimientos
Se utilizan para imprimir valores a ser utilizados en el programa.
Declaracin:
void NombreProcedimiento( )
void NombreProcedimiento (argumentos)
4.3 Funciones
Se utilizan para retornar un valor a ser utilizado en el programa.
Declaracin:
Tipo_dato NombreFuncin( )
Tipo_dato NombreFuncin(argumentos)
//Programa Simple
#include<iostream>
using namespace std;
void main()
{ int a,b,c;
c=a+b;
cout<<c; cout<<"\n";
}
Pg. 31
Asignatura: Algoritmia y Estructura de Datos
Con Procedimientos:
//Procedimientos con Argumentos: Ejemplo1
#include<iostream>
using namespace std;
void sumar(int a, int b)
{ int c;
c=a+b;
cout<<c; cout<<"\n";
}
void main()
{ int a,b;
cout<<"Ingrese valor de a: \t";
cin>>a;
cout<<"Ingrese valor de b: \t";
cin>>b;
sumar(a,b);
}
//Procedimientos sin Argumentos: Ejemplo2
#include<iostream>
using namespace std;
void sumar()
{ int a,b,c;
cout<<"Ingrese valor de a: \t";
cin>>a;
cout<<"Ingrese valor de b: \t";
cin>>b;
c=a+b;
cout<<c;
}
void main()
{ sumar( );
}
Pg. 32
Asignatura: Algoritmia y Estructura de Datos
Con Funciones:
//Funciones con Argumentos: Ejemplo1
#include<iostream>
using namespace std;
int sumar(int a, int b)
{ int c;
c=a+b;
return c;
}
void main()
{ int sum,a,b;
Pg. 33
Asignatura: Algoritmia y Estructura de Datos
int main()
{ int a,b;
cout<<"Ingrese valor de a: \t"; cin>>a;
cout<<"Ingrese valor de b: \t"; cin>>b;
sumar(a,b);
return 0;
}
void sumar(int a, int b)
{ int c;
c=a+b;
cout<<c;
cout<<"\n";
}
//Funciones con Argumentos
#include<iostream>
using namespace std;
int sumar(int a, int b);
void main()
{ int sum,a,b;
cout<<"Ingrese valor de a: \t"; cin>>a;
cout<<"Ingrese valor de b: \t"; cin>>b;
sum=sumar(a,b);
cout<<"Valor de la suma de a y b: "<<sum;
cout<<"\n";
}
int sumar(int a, int b)
{ int c;
c=a+b;
return c;
}
Pg. 34
Asignatura: Algoritmia y Estructura de Datos
Ejemplos:
1. Elaborar un programa para calcular a la funcin de acuerdo a lo sgte.:
y = x2 + 5 si x <= 0
y = 3x - 1 si 0<x<2
2
y = x - 4x + 5 si x >= 2
#include<iostream>
using namespace std;
float ecuaciones()
{ float x,y;
cout<<"Ingresar valor de x para calcular funcion f(y)=x <<\t"; cin>>x;
if(x<=0)
{ cout<<"Ecuacion a usar es y=(x^2)+5\n";
y=(x*x)+5;
}
else
if(x>0&&x<2)
{ cout<<"Ecuacion a usar es y=3x+1\n";
y=(3*x)-1;
}
else
if(x>=2)
{ cout<<"Ecuacion a usar es y=(x^2)-4x+5\n";
y=(x*x)-(4*x)+5;
}
return y;
}
void main()
{ float res;
res=ecuaciones();
cout<<"Resultado de la funcion es f(y)=\t"<<res; cout<<"\n";
}
2. Para repartir una herencia se tiene en cuenta: Si la cantidad de hijos es menor a 4, se repartir
exactamente entre el nmero de hijos; si son cuatro o ms hijos, la mitad le tocar al hermano mayor
y el resto se dividir entre los dems hermanos.
#include<iostream>
using namespace std;
Actividades
Construir los programas usando funciones y procedimientos en Cdigo en C respectivo para:
1. Realizar un programa que tenga un mdulo reciba dos argumentos a, b (enteros) y que
intercambie los valores de dichas variables.
-> Elaborar un mdulo para leer a y b.
2. En un banco, a los clientes que de tipo 1, 2, 3, que aperturan cuentas de Ahorro(A), Corriente
(C), o Valores (V), todos en nuevos soles, se les otorga un bono (dlares), de acuerdo a la sgte.
Tabla:
Cuenta: A C V
Tipo cliente
1 $ 500 $ 400 $ 300
2 $ 400 $ 300 $ 200
3 $ 300 $ 200 $ 100
Promedio 0 10 11 - 16 17 -20
Alumno
A A ++ A+ A-
B B ++ B+ B-
C C ++ C+ C-
A ++ = 5 % A + = 7% A - = 10 %
B ++ = 3 % B+=5% B-=7%
C ++ = 1 % C+ = 3% C-=5%
Las libreras estndar del procesador del lenguaje C: iostream.h, math.h, conio.h, stdio.h, etc.,
existen liberas de cabecera (header, de alli la extensin .h) que pueden ser creadas por el
programador, y ser invocadas en diferentes programas fuente (el programa con extensin .cpp)
como parte de la reutilizacin de cdigo.
Pg. 36
Asignatura: Algoritmia y Estructura de Datos
Ejemplo 1:
Leer un nmero entero diferente a cero, y si es positivo, reportar El numero es positivo, caso
contrario es negativo.
Solucin:
- Crear la librera con extensin .h para la funcin de lectura de datos enteros, llamado lecturadato.h.
#include<iostream>
using namespace std;
int leedatoe()
{ int dato;
do{
cout<<Ingrese valor del dato;
cin>>dato;
}while(dato==0);
return dato;
}
- Crear el programa .cpp que invoca a la librera .h , lecturadato.h, creada por el programador.
#include<iostream>
#include c:\programas\lecturadato.h
using namespace std;
void main()
{ int num;
num=leedatoe();
if(num>0)
cout<<El numero es positivo;
else
cout<<El numero es negativo;
}
Ejemplo 2:
x=leedatoe();
a=leedatoe();
if(x>0 && a>0)
{ y=x*((2*x)-a);
cout<<El resultado es:<<y;
}
else
cout<<Con estos valores no se puede calcular;
}
Pg. 37
Asignatura: Algoritmia y Estructura de Datos
Actividades
Construir los programas usando funciones y procedimientos y libreras de programacin:
1. Una empresa categoriza a sus artculos como A, B y C, adems a sus clientes como
Excelente(E), Bueno(B), Regular(R) y Malo(M), estableciendo polticas de descuento (en %)
de acuerdo a la sgte. tabla:
Tipo Artculo
A B C
Tipo Cliente
Excelente (E) 40 30 20
Bueno (B) 30 20 10
Regular (R) 20 10 0
Malo (M) 0 0 0
El cliente Excelente y Bueno puede pagar en Efectivo, Cheque o crdito, el cliente Regular
puede pagar en Efectivo o Cheque y el cliente Malo solo paga en efectivo.
2. En un cajero se puede realizar las operaciones de depsito, saldo, y retiro. Elabore un programa
permitir a un cliente realizar estas operaciones las veces que lo requiera.
La funcin factorial:
n! 4! = 4 * 3 * 2 * 1
4! = 4 * 3 * 2 * 1 4 * 3!
4 * 3! Es decir n*(n-1)! 3! = 3 * 2 * 1
3! = 3 * 2 * 1 3 * 2!
3 * 2! Es decir n*(n-1)! 2! = 2 * 1
2! = 2 * 1 2 * 1!
2 * 1! Es decir n*(n-1)! 1! = 1 * 0!
1! = 1 * 0! 0! = 1
0! = 1
int factorial(int n) 1 * 1 * 2 * 3 * 4 = 24
{ if (n == 0)
return 1;
else
return n*factorial(n-1);
}
Pg. 38
Asignatura: Algoritmia y Estructura de Datos
La funcin multiplicacin:
a*b 3*4=3+3+3+3
3*4=3+3+3+3 3 + (3 * 3)
3 + (3 * 3) 3*3=3+3+3
3*3=3+3+3 3 + (3 * 2)
3 + (3 * 2) 3*2=3+3
3*2=3+3 3 + (3 *1)
3 + (3 *1) 3*1 =3
3*1 =3 3 + 3 + 3 + 3 = 12
int multiplica(int a, int b)
{ if (a == 0 || b == 0)
return 0;
else
if (b == 1)
return a;
else
return a+multiplica(a,b-1);
}
Actividades
Pg. 39
Asignatura: Algoritmia y Estructura de Datos
TERCERA UNIDAD
- Arreglos
Estructuras de Datos Estticos - Registros
- Archivos
- Cadenas
- Listas
Estructuras de Datos Lineales - Pilas
- Colas
Compuestos Estructuras de Datos Dinmicos
- Arboles
No Lineales - Grafos
Estructuras de Datos Estticos: Son aquellas en las que la cantidad de memoria que ocupan se
define antes de ejecutar el programa. Durante la ejecucin del mismo este tamao asignado no
puede alterarse.
Estructuras de Datos Dinmicos: Son aquellas en las que no es necesario reservar espacio de
memoria antes de ejecutar el programa, ya que este espacio se puede asignar durante su
ejecucin segn se necesite. As mismo dicho espacio puede ser liberado para poder ser utilizado
por otros datos.
Actividades
Investigar y Exponer cuales son las estructuras de datos:
1. Estndar.
2. Creadas por el Programador.
Pg. 40
Asignatura: Algoritmia y Estructura de Datos
#include<iostream>
#define N 5
using namespace std;
void main()
{ double A[N],sum,promed;
leerarre(A);
sum=suma(A);
promed=promedio(sum);
Pg. 41
Asignatura: Algoritmia y Estructura de Datos
El siguiente programa lee un arreglo de nmeros enteros y encuentra el mayor y menor elemento.
El mx de elementos es 100 pero solo ingresa n elementos.
//Programa para hallar el mayor y menor elemento de un arreglo
#include<iostream>
#define MAXIMO 100
using namespace std;
int leenumelem()
{ int n;
do{ cout<<"\n";
cout<<"Ingrese cantidad de elementos (>= a CERO y <= que 100): ";cin>>n;
}while(n<=0 || n>MAXIMO);
return n;
}
void leerarre(int N, int array[])
{ int i;
for(i=0;i<=N-1;i++)
{ cout<<"Ingrese altura alumno A"<<"["<<i<<"]"<<":\t";
cin>>array[i]; cout<<"\n"; }
}
void comparar(int N, int array[])
{ int i, mayor, menor;
mayor=array[0];
menor=array[0];
for(i=0;i<=N-1;i++)
{ if (array[i]>mayor)
mayor=array[i];
if (array[i]<menor)
menor=array[i];
}
cout<<"El mayor es :"<<mayor<<"\n";
cout<<"El menor es :"<<menor<<"\n";
}
void main()
{ int A[MAXIMO];
int n;
n=leenumelem();
leerarre(n,A);
comparar(n,A);
}
Aadir
//Aadir un valor en la ultima posicin
#include<iostream>
#define MAX 100
using namespace std;
int leenum()
{ int num;
do{ cout<<"Ingrese numero de elementos para el arreglo: ";
cin>>num; cout<<"\n";
}while(num<=0 || num>MAX);
return num;
}
Pg. 42
Asignatura: Algoritmia y Estructura de Datos
Insertar
//Insertar un valor en cualquier posicin
#include<iostream>
#define MAX 100
using namespace std;
int leenum()
{ int num;
do{cout<<"Ingrese numero de elementos para el arreglo: ";
cin>>num; cout<<"\n";
}while(num<=0 || num>MAX);
return num;
}
void ingresadatos(int V[MAX], int n)
{ int i;
cout<<"Ingrese elementos para el arreglo "; cout<<"\n";
for(i=0;i<=n-1;i++)
{ cout<<"Elemento ["<<i<<"]"<<":";
cin>>V[i];
}
}
Pg. 43
Asignatura: Algoritmia y Estructura de Datos
Eliminar
//Eliminar un valor en cualquier posicin
#include<iostream>
#define MAX 100
using namespace std;
int leenum()
{ int num;
do{ cout<<"Ingrese numero de elementos para el arreglo: ";
cin>>num; cout<<"\n";
}while(num<=0 || num>MAX);
return num;
}
void ingresadatos(int V[MAX], int n)
{ int i;
cout<<"Ingrese elementos para el arreglo "; cout<<"\n";
for(i=0;i<n;i++)
{ cout<<"Elemento ["<<i<<"]"<<":";
cin>>V[i];
}
}
Pg. 44
Asignatura: Algoritmia y Estructura de Datos
void main()
{ int A[MAX];
int num,el;
num=leenum();
ingresadatos(A,num); cout<<"\n";
mostrar(A,num); cout<<"\n";
el=elimina(A,num);
mostrar(A,el);
}
B. Secuencial
//Bsqueda Secuencial 1
#include<iostream>
#define MAX 100
using namespace std;
//Se entiende que se realizan los procedimientos de lectura de datos
void bsecuencial(int a[MAX], int n)
{ int elem,i;
cout<<"\n Ingrese elemento a buscar en el arreglo "<<":\t"; cin>>elem;
for(i=1;i<=n;i++)
if(a[i]==elem)
{ cout<<"\n Encontrado\t Posicion :\t"<<i<<"\t"; cout<<"\n\n";
}
}
void main()
{int A[MAX];
int num;
num=leenum();
Pg. 45
Asignatura: Algoritmia y Estructura de Datos
ingresadatos(A,num); cout<<"\n";
mostrar(A,num); cout<<"\n";
bsecuencial(A,num);
}
//Busqueda Secuencial 2
#include<iostream>
#define MAX 100
using namespace std;
//Se entiende que se realizan los procedimientos de lectura de datos
B. Bsqueda Binaria
#include<iostream>
#define MAX 100
using namespace std;
int leenum()
{ int num;
do{ cout<<"Ingrese numero de elementos para el arreglo: ";
cin>>num; cout<<"\n";
}while(num<=0 || num>MAX);
return num;
}
void ingresadatos(int V[MAX], int n)
{ int i;
cout<<"Ingrese elementos para el arreglo ";cout<<"\n";
for(i=1;i<=n;i++)
{ cout<<"Elemento ["<<i<<"]"<<":";cin>>V[i]; }
}
void mostrar(int V[MAX], int n)
{ int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=1;i<=n;i++)
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t";cout<<V[i]; }
}
Pg. 46
Asignatura: Algoritmia y Estructura de Datos
if(elem==a[CENTRAL])
{ cout<<"\n ENCONTRADO \n";
cout<<"\n a["<<CENTRAL<<"] = "<<a[CENTRAL]; cout<<"\n";
}
else
cout<<"\n NO ENCONTRADO \n ";
}
void main()
{int A[MAX]; int num;
num=leenum();
ingresadatos(A,num); cout<<"\n";
mostrar(A,num); cout<<"\n";
bbinaria(A,num);
}
Pg. 47
Asignatura: Algoritmia y Estructura de Datos
Ejemplos:
1. Elaborar un programa que dado dos arreglos numricos A y B de n1 y n2 elementos
respectivamente, guarde en un tercer arreglo C los elementos que estn en A pero no estn
en B. Ejemplo:
A B C
5 15 5
8 9 12
12 8 2
6 6
9 45
2 22
7
Solucin:
#include<iostream>
#define MAX 100
using namespace std;
void ingresadatos(int V[MAX], int n,char titu[20])
{ int i;
cout<<"Ingrese elementos para el arreglo "<<titu;cout<<"\n";
for(i=0;i<=n-1;i++)
{ cout<<"Elemento ["<<i<<"]"<<":";
cin>>V[i];
}
}
if(ban==0)
{ VC[k]=VA[i];
k++;
}
else
ban=0;
}
return k;
}
void mostrar(int V[MAX], int n, char titu[20])
{ int i;
cout<<"Los elementos del arreglo "<<titu;
cout<<" son:"; cout<<"\n";
Pg. 48
Asignatura: Algoritmia y Estructura de Datos
for(i=0;i<=n-1;i++)
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t";
cout<<V[i]; cout<<"\n";
}
}
void main()
{ int A[MAX],B[MAX],C[MAX];
int na,nb,elem;
na=leenum();
ingresadatos(A,na,"Arreglo A");
nb=leenum();
ingresadatos(B,nb,"Arreglo B"); cout<<"\n";
mostrar(A,na,"Arreglo A"); cout<<"\n";
mostrar(B,nb,"Arreglo B"); cout<<"\n";
elem=separacion(A,na,B,nb,C);
mostrar(C,elem,"Arreglo C");
}
2. Elaborar un programa que dado dos arreglos numricos A y B de n1 y n2 elementos
respectivamente, guarde en un tercer arreglo C los elementos que estn en A y en B.
Ejemplo:
A B C
5 15 8
8 9 6
12 8 9
6 6
9 45
2 22
7
Pg. 49
Asignatura: Algoritmia y Estructura de Datos
Actividades
1. Elaborar un programa dado las notas de 35 alumnos, se debe reportar la nota mas alta, la
nota mas baja y el promedio de notas ingresadas.
2. Elaborar un programa para que se ingresen los sgtes. valores del arreglo mostrado, sume
el valor en la posicin 0 con el valor en la posicin 3 y luego multiplicar por el valor en la
posicin 5.
Posicion 0 1 2 3 4 5
ARRAY 10.6 3.4 9 2.3 5 4.5
Pg. 50
Asignatura: Algoritmia y Estructura de Datos
10. Crear un mdulo de programa donde se eliminen los elementos repetidos en un Arreglo de
n elementos.
11. Buscar un elemento en un arreglo de n elementos, utilizando bsqueda binaria
(previamente ordenado con el mtodo de la burbuja y sin que exista elementos repetidos),
y eliminarlo.
0 1 2 3 4
filas 0
1
2
3
Pg. 51
Asignatura: Algoritmia y Estructura de Datos
void main()
{ int B[MAX][MAX]; int nf,nc;
cout<<"Ingrese numero de filas ";
nf=leenum();
cout<<"Ingrese numero de columnas ";
nc=leenum();
ingresadatos(B,nf,nc); cout<<"\n";
mostrar(B,nf,nc); cout<<"\n";
}
Pg. 52
Asignatura: Algoritmia y Estructura de Datos
void main()
{ int B[MAX][MAX]; int nf,nc;
ingresadatos(B,nf,nc); cout<<"\n";
mostrar(B,nf,nc); cout<<"\n";
Pg. 53
Asignatura: Algoritmia y Estructura de Datos
mostrar(B,nf,nc); cout<<"\n";
Pg. 54
Asignatura: Algoritmia y Estructura de Datos
for(i=pos;i<=nf-1;i++)
for(j=0;j<=nc-1;j++)
M[i][j]=M[i+1][j];
nf--;
return nf;
}
for(i=0;i<=nf-1;i++)
for(j=pos;j<=nc-1;j++)
M[i][j]=M[i][j+1];
nc--;
return nc;
}
void main()
{
int B[MAX][MAX] nf,nc,fil,col;
mostrar(B,nf,nc); cout<<"\n";
Pg. 55
Asignatura: Algoritmia y Estructura de Datos
1. Imprimir lo nmeros que rodean a un nmero X, la primera vez que se encuentra en la Matriz
incluido el nmero X:
4 3 7 9 3 7 9
M 1 4 5 8 4 5 8
2 5 4 1 5 4 1
7 -6 3 4
Solucin:
.. //Se entiende que se realizan los procedimientos de lectura de datos
cout<<"\n";
}
}
else
cout<<"El numero ingresado no existe";
}
void main()
{int B[MAX][MAX];
int nf,nc,num;
ingresadatos(B,nf,nc); cout<<"\n";
Pg. 56
Asignatura: Algoritmia y Estructura de Datos
2. Ingresa un Numero N y luego imprime fila y columna N de la matriz, si solo existe la fila N, solo
se imprime dicha fila.
0 1 2 3 0 1 2 3
0 0
3 5 2 1 1
6 -5 7 9 9
1 1
8 1 4 -3 N = 3, se -3
2 imprime la 2
columna 3
0 1 2 3 0 1 2 3
0 0
3 5 2 1 2
6 -5 7 9 7
1 1
8 1 4 -3 N = 2, se 8 1 4 -3
2 imprime la fila 2 2
y la columna 2
Solucin:
.. //Se entiende que se realizan los procedimientos de lectura de datos
cout<<"\n\n\n";
for(i=0;i<=nf-1;i++)
{ for(j=0;j<=nc-1;j++)
{
if(i==n || j==n)
cout<<M[i][j]<<"\t";
else
cout<<" ";
}
cout<<"\n";
}
}
void main()
{int B[MAX][MAX];
int nf,nc;
ingresadatos(B,nf,nc);cout<<"\n";
seleccion(B,nf,nc);cout<<"\n";
}
Pg. 57
Asignatura: Algoritmia y Estructura de Datos
6 8 1 4 8 1
M 7 2 5 M 7 2 5
1 5 4 1 5 6
6 8 4 6 7 1 9
M 7 2 5 M 8 2 5 7
1 5 3 4 5 3 -1
9 7 -1
Pg. 58
Asignatura: Algoritmia y Estructura de Datos
ingresadatos(B,nf,nc); cout<<"\n";
mostrar(B,nf,nc); cout<<"\n";
cout<<"Matriz Transpuesta";
transpuesta(B,nf,nc,T);
ft=nf;
ct=nc;
temp=ft;
ft=ct;
ct=temp;
mostrar(T,ft,ct);
cout<<"\n";
}
Actividades
Elaborar el programa en C ++ para:
1. Dada una matriz de n filas y m columnas, elaborar los mdulos de programa para: indicar
el menor elemento y la(s) posicin(es) en que se encuentra y para hacer rotar a la matriz
3 veces (intercambiar filas y columnas).
2. Realizar el ordenamiento descendente de una fila en un arreglo bidimensional.
3. Realizar el ordenamiento descendente de una columna en un arreglo bidimensional.
4. Escriba el mdulo de programa para invertir la diagonal secundaria en un arreglo
bidimensional.
Pg. 59
Asignatura: Algoritmia y Estructura de Datos
Una estructura (registro) es un tipo definido por el usuario en base a otros tipos de datos con el
objeto de reunir informacin de un mismo elemento o entidad, a diferencia de un arreglo que tiene
datos homogneos.
Ejemplo:
Juan 19 1.73 M
nombre edad Talla sexo
(cadena) (int) (float) (char)
#include<iostream>
using namespace std;
struct{
int dia;
int mes;
long int anual;
}hoy;
void main( )
{
cout<<"Ingrese dia: \t";
cin>>hoy.dia;
cout<<"Ingrese mes: \t";
cin>>hoy.mes;
cout<<"Ingrese anno: \t";
cin>>hoy.anual;
cout<<hoy.dia<<" / "<<hoy.mes<<" / "<<hoy.anual;
cout<<"\n";
}
Pg. 60
Asignatura: Algoritmia y Estructura de Datos
#include<iostream>
using namespace std;
struct direccion{
char nombre[30];
char calle[30];
int num;
char ciudad[30];
};
void main( )
{ direccion oficina, casa;
cout<<"Datos Oficina";cout<<"\n";
cout<<"Ingrese su nombre: \t";
cin>>oficina.nombre;
cout<<"Ingrese calle: \t";
cin>>oficina.calle;
cout<<"Ingrese num calle: \t";
cin>>oficina.num;
cout<<"Ingrese ciudad: \t";
cin>>oficina.ciudad;
cout<<"\n";
cout<<oficina.nombre<<"---"<<oficina.calle<<"---"<<oficina.num<<"---
"<<oficina.ciudad; cout<<"\n"; cout<<"\n";
cout<<"Datos Casa";cout<<"\n";
cout<<"Ingrese su nombre: \t";
cin>>casa.nombre;
cout<<"Ingrese calle: \t";
cin>>casa.calle;
cout<<"Ingrese num calle: \t";
cin>>casa.num;
cout<<"Ingrese ciudad: \t";
cin>>casa.ciudad;
cout<<"\n";
cout<<casa.nombre<<"---"<<casa.calle<<"---"<<casa.num<<"---"<<casa.ciudad;
}
Uso del typedef: Siempre en los programas se realiza una tarea de modelado de los datos que
consiste en convertir los datos reales en datos aplicables en un programa informtico. En C existe
una palabra reservada llamada typedef que sirve para crear tipos de datos propios. Permite dar
una mayor claridad y simplicidad al cdigo, aunque su uso es opcional. Su sintaxis es la siguiente:
typedef definicinDelTipo NombreDelTipoDeDatos
Definir estructuras con typedef
struct domicilio{ Se puede hacer todo lo anterior de esta forma (definiendo
char nombre[30]; la estructura y creando el tipo a la vez):
char calle[30]; typedef struct{
int num; char nombre[25];
char ciudad[20]; char apellidos[50];
}; char dni[10];
typedef struct domicilio; int edad;
}Persona;
void main( )
{ void main( )
domicilio Oficina, casa; { Persona individuo;
} }
Pg. 61
Asignatura: Algoritmia y Estructura de Datos
Asignacin de estructuras
#include<iostream>
#include<string>
using namespace std;
typedef struct{
char nombre[25];
char apellidos[50];
int edad;
} Persona;
void main( )
{ Persona p1,p2;
strcpy(p1.nombre,"Pepe");
strcpy(p1.apellidos,"Villegas Varas");
p1.edad=12;
p2=p1; // Asignacin de estructuras
cout<<"\n ---- Reporte de Datos de Pepe ----\n";
cout<<p1.nombre;cout<<"\n";
cout<<p1.apellidos;cout<<"\n";
cout<<p1.edad;cout<<"\n";
cout<<"\n ---- Reporte de Datos de Jaime ----\n";
cout<<p2.nombre;cout<<"\n";
cout<<p2.apellidos;cout<<"\n";
cout<<p2.edad;cout<<"\n";
}
typedef struct{
char nombre[25];
char apellidos[50];
int edad;
} Persona;
void main()
{ Persona alumno;
strcpy(alumno.nombre,"Pepe");
strcpy(alumno.apellidos,"Villegas Varas");
alumno.edad=12;
cout<<"\n ---- Reporte de Datos de Pepe ----\n";
cout<< alumno.nombre;cout<<"\n";
cout<< alumno.apellidos;cout<<"\n";
cout<< alumno.edad;cout<<"\n";
cout<<"\n ---- Reporte de Nuevos Datos de Pepe ----\n";
cout<< alumno.nombre;cout<<"\n";
cout<< alumno.apellidos;cout<<"\n";
Pg. 62
Asignatura: Algoritmia y Estructura de Datos
#include<iostream>
#include<string>
#define N 50
using namespace std;
struct fecha{
int dia;
int mes;
long int anual;
};
struct persona{
char nombres[N];
char apellidos[N];
fecha fnacimiento;
char sexo[10];
};
void main()
{ persona inscrito;
cout<<"\n\n-----Ingrese datos----- \n\n";
cout<<"Ingrese nombre \t";
cin>>inscrito.nombres;
cout<<"Ingrese apellidos \t";
cin>>inscrito.apellidos;
Actividades
1. Los alumnos de 3 secciones (A, B, C) han rendido 3 exmenes (E1, E2, E3)
Se quiere escribir un programa que lea los datos de los n alumnos: nombre, seccin y las
notas de los 3 exmenes y que imprima los sgte.:
- La lista de los n alumnos exonerados del examen final en orden de mritos.
- Los alumnos que no han sido exonerados tienen derecho a un examen sustitutorio al que
reemplaza la nota ms baja para calcular nuevamente el promedio. En este caso se aprueba
con promedio >=11.
- Imprimir la lista de alumnos que a pesar de aprobar el sustitutorio no aprueban el curso.
Pg. 63
Asignatura: Algoritmia y Estructura de Datos
Son a primera vista, entidades muy similares a las estructuras, estn formadas por un nmero
cualquiera de miembros, al igual que aquellas, pero en ste caso no existen simultneamente
todos los miembros, y slo uno de ellos tendr un valor vlido.
A diferencia de la Estructura, esta es una localidad de memoria que se utiliza para compartir datos
de diferentes tipos.
Ejemplo: Entonces
struct tabla {
char nombre[30]; Si tipo es c , se struct tabla{
char tipo; utiliza cadena, pero char nombre[30];
char cadena[5]; si es e , se utiliza char tipo;
int entero; entero. union {
char cadena[5];
}; int entero;
} dato;
};
Actividades
1. Elaborar un programa en C, para demostrar el uso y la diferencia de la unin con respecto
a los registros.
private:
string nombre;
string carrera;
nombre
carrera
public:
alumno();
~alumno(); ingresar
void ingresar();
void imprimir();
}; imprimir
Actividades
1. Investigar y exponer los tipos de datos abstractos que se pueden usar en la construccin
de un programa.
Pg. 64
Asignatura: Algoritmia y Estructura de Datos
Los datos y funciones miembro pueden ser definidos como private o public.
private: slo pueden ser accesados desde funciones miembro.
public: pueden ser accesados directamente, sin utilizar funciones miembro.
Usualmente se debe declarar los datos miembro tipo private y las funciones miembro tipo public.
Para accesar desde fuera del objeto a sus datos pblicos y funciones miembro pblicas escribe.
< nombre del objeto >.< dato miembro >
< nombre del objeto >.< funcion miembro >
Constructor: Un constructor es una funcin miembro que permite inicializar los datos miembro de
un objeto. Tiene las siguientes caractersticas:
- Su nombre es igual al de la clase.
- No devuelve valores.
- Puede haber ms de un constructor.
- Se invoca al momento de declarar al objeto.
Destructor: Un destructor es una funcin que permite liberar el rea de memoria ocupada por un
objeto cuando este ya no va ser usado .Sus caractersticas son:
- Su nombre es igual al de la clase pero precedido por el smbolo ~ .
- No devuelve valores.
- Slo puede haber un destructor.
- Se invoca al momento de salir o abandonar el mbito donde fue creado el objeto.
Pg. 65
Asignatura: Algoritmia y Estructura de Datos
#include <iostream>
#include <string>
using namespace std;
class alumno
{ private:
string nombre;
string carrera;
public:
alumno();
~alumno();
void ingresar();
void imprimir();
};
alumno::alumno()
{ nombre=" ";
carrera=" ";
}
alumno::~alumno()
{
}
void alumno::ingresar()
{ cout<<"Ingrese nombre: ";
cin>>nombre;
cout<<"Ingrese carrera: ";
cin>>carrera;
}
void alumno::imprimir()
{ cout<<"Nombre Alumno: ";
cout<<nombre<<"\n";
cout<<"Carrera: ";
cout<<carrera<<"\n";
}
void main()
{ alumno al;
cout<<"Ingrese Alumno";cout<<"\n";
al.ingresar();cout<<"\n";
cout<<"Mostrar Alumno"<<"\n";
al.imprimir();cout<<"\n\n";
cout<<"Eliminar Alumno"<<"\n";
al.~alumno();cout<<"\n";
cout<<"Mostrar Alumno"<<"\n";
al.imprimir();cout<<"\n";
system("PAUSE");
}
Pg. 66
Asignatura: Algoritmia y Estructura de Datos
Un puntero es un tipo especial de variable, que almacena el valor de una direccin de memoria,
esta direccin puede ser la de una variable individual, pero mas frecuentemente ser la de un
elemento de un array, una estructura u objeto de una clase. Los punteros, tambien pertenecen a
un tipo, se dice que un puntero 'apunta a' ese tipo al que pertenece.
MEMORIA
200
p 800
800
x 23
Ejemplos:
int *p; // p es una variable tipo puntero que apunta a una variable tipo int.
float *q; // q es una variable tipo puntero que apunta a una variable tipo float.
char *r; // r es una variable tipo puntero que apunta a una variable tipo char.
Ejemplo:
MEMORIA
200
p 800
800
x 23
*p
Pg. 67
Asignatura: Algoritmia y Estructura de Datos
Variables estticas
Son aquellas que se declaran expresamente en los programas y a las que el sistema operativo
asigna una posicin de memoria antes de la ejecucin del mismo.
Variables dinmicas
Son variables que se crean y se destruyen durante la ejecucin del programa. No son declaradas
explcitamente en los programas.
Operador &
Devuelve la direccin de memoria de una variable. Su sintaxis es:
#include <iostream>
using namespace std;
void main ()
{ int x,y; // Variables de tipo entero
int *p; // Puntero a una variable de tipo entero
// Leemos la direccin de la variable x mediante & y lo almacenamos en la variable puntero p
p = &x; // p contiene la direccin en la que se encuentra x
// Utilizando el operador *, podemos acceder a su informacin. *p representa ahora el valor de la variable x
*p = 10; // Ahora x contiene el valor 10
cout<<x;cout<<"\n"; // Visualiza si x tiene el valor que recibi su puntero p
cout<<*p;cout<<"\n"; // Visualiza el valor de x
y = 15;
// Si ahora hacemos que el puntero apunte a la variable y utilizando de nuevo el operador &
p = &y;
cout<<y<<"\n"; //visualiza el valor de y
// El valor que ahora toma *p ser el valor de y puesto que es el compartimiento al que ahora estamos apuntando
*p = 125; // Ahora y contiene el valor 125
x = *p; // Ahora x contiene tambin 125
cout<<y<<"\n"; //visualiza el nuevo valor de y
cout<<x<<"\n"; //visualiza el nuevo valor de y
cout<<*p<<"\n"; //Visualiza el valor de x
cout<<&x<<"\n"; //visulaiza la direccion de memoria
cout<<p<<"\n"; //visualiza la direccion de memoria
}
Pg. 68
Asignatura: Algoritmia y Estructura de Datos
Ejemplo:
int *p;
float *q;
p = new int; // crea una variable dinmica de tipo int y hace que p apunte a ella.
q = new float;// crea una variable dinmica de tipo float y hace que q apunte a ella.
NOTA:
No se puede asignar un valor constante a una variable tipo puntero ni ingresar un valor por teclado
para ella.
int *p;
p = 800; // ERROR
cin>>p; // ERROR
Si es posible imprimir el valor de un puntero: cout<<p;
Ejemplo:
void main()
{ int *p, *q;
p = new int;
*p = 8;
q = p;
}
Ejemplo:
void main()
{ int *p, *q;
p = new int;
q = new int;
*p = 8;
*q = *p;
}
NOTA:
No se puede asignar una variable tipo puntero a otra que no sea de su mismo tipo.
int *p, *q;
float *r;
p = new int;
*p =7;
q = p;
r = p;
delete <variable tipo puntero que apunta a la variable dinmica que ser eliminada>;
Se libera el espacio ocupado por la variable dinmica para poder ser utilizado nuevamente. La
variable tipo puntero que la apuntaba mantiene de la variable dinmica, aunque ya no tenga
significado su apuntamiento.
void main()
{ int *p;
p = new int;
*p = 17;
cout<<p;
delete p;
cout<<p;
}
Pg. 69
Asignatura: Algoritmia y Estructura de Datos
Constante NULL
Es una constante predefinida en C++ cuyo valor es cero (0) y sirve para inicializar una variable tipo
puntero que no apunta a ninguna variable.
variable tipo puntero = NULL;
void main()
{ int *p;
p = new int;
*p = 17;
cout<<p;
delete p;
cout<<p;
p = NULL;
cout<<p;
}
Actividades
Investigar y Exponer:
Punteros (I)
a. Definicin, Declaracin, Inicializacin.
b. Opciones de Inicializacin.
c. Inicializacin a travs de memoria dinmica.
Punteros (II)
a. Operador de Direccin y Operador de Indireccin.
b. Asignacin de Punteros.
c. Puntero a Puntero.
Punteros (III)
a. Puntero a void.
b. Puntero constante.
c. Puntero a constante.
Punteros (IV)
a. Puntero a funcin.
b. Paso de Parmetros en funciones.
c. Puntero a clases (objetos).
Punteros (V)
a. Puntero This.
b. Puntero NULO.
c. Aritmtica de Punteros.
Pg. 70
Asignatura: Algoritmia y Estructura de Datos
Una lista enlazada es una estructura de datos dinmica formada por un conjunto de elementos
llamados nodos.
Cada nodo consta de dos partes:
Dato Direcc
nodo sig
Los nodos son variables dinmicas que se crean y destruyen de acuerdo a los requerimientos del
proceso.
- Para acceder a la lista es necesario un puntero que contenga la direccin del primer nodo.
- Si la lista est vaca dicho puntero tendr el valor NULL.
- El ltimo elemento de la lista se reconoce porque su puntero al siguiente tiene valor NULL.
Lista
12 30 21 54
NULL
Es un conjunto de elementos en los que cada elemento contiene la posicin o direccin del sgte.
campo de la Lista.
Lista
NULL
struct nodo{
int n; //el campo puede ser string, float, estructura, etc.
nodo * sgte; // direccin al siguiente nodo
};
Pg. 71
Asignatura: Algoritmia y Estructura de Datos
ListasSE.h
#include <iostream>
#include <string>
#define MAX 100
using namespace std;
struct nodo
{ int dato;
nodo *sig;
};
class lista
{ private:
pnodo pL;
public:
lista();
~lista();
void insertar_comienzo();
void insertar_final();
void insertar_despues();
void eliminar_inicio();
void eliminar_final();
void buscar();
pnodo buscar_despues(int x);
void buscar_anterior();
void imprimir();
};
lista::lista()
{
pL = NULL;
}
lista::~lista()
{
pnodo p,q;
if ( pL != NULL )
{ p = pL;
while ( p != NULL )
{ q = (*p).sig;
delete p;
p = q;
}
pL=p;
}
}
void lista::insertar_comienzo()
{
pnodo nuevo;
int valor;
cout<<"Ingrese dato:"; cin>>valor;
nuevo = new nodo;
(*nuevo).dato = valor;
(*nuevo).sig = pL;
pL = nuevo;
}
Pg. 72
Asignatura: Algoritmia y Estructura de Datos
void lista::insertar_final()
{ pnodo nuevo,aux;
int valor;
nuevo = new nodo;
cout<<"Ingrese dato:";
cin>>valor;
(*nuevo).dato = valor;
(*nuevo).sig = NULL;
if ( pL == NULL )
pL = nuevo;
else
{ aux = pL;
while ( (*aux).sig != NULL )
aux = (*aux).sig;
(*aux).sig = nuevo;
}
}
void lista::insertar_despues()
{ pnodo nuevo,r,temp;
int num;
nuevo=new nodo;
cout<<"Ingrese dato";
cin>>(*nuevo).dato;
cout<<"Ingrese despues del nodo: ";
cin>>num;
r=lista::buscar_despues(num);
if(r==NULL)
cout<<"Lista vacia o no se encontro";
else
{ temp=(*r).sig;
if(temp!=NULL)
{ (*r).sig=nuevo;
(*nuevo).sig=temp;
}
else
{ (*nuevo).sig=NULL;
(*r).sig=nuevo;
}
}
}
void lista::buscar()
{ pnodo pos;
int valor, ban=0;
cout<<"Ingrese dato:";
cin>>valor;
if ( pL == NULL )
{ cout<<"LISTA VACIA";
pos=NULL;
}
else
{ pos = pL;
while ( pos != NULL)
{ if((*pos).dato != valor)
{ pos = (*pos).sig;
ban=1;
}
else
{ ban=0;
break;
}
}
Pg. 73
Asignatura: Algoritmia y Estructura de Datos
if(ban==0)
{cout<<"ENCONTRADO";
}
else
{cout<<"NO ENCONTRADO";
}
}
}
else
{ ban=0;
break;
}
}
if(ban==0)
{cout<<"ENCONTRADO"; }
else
{cout<<"NO ENCONTRADO"; }
}
return pos;
}
void lista::buscar_anterior()
{ pnodo pos,p;
int valor,ban=0;
cout<<"Ingrese dato:"; cin>>valor;
pos = NULL;
p = pL;
while(p!=NULL)
{ if ( (*p).dato != valor)
{ ban=1;
pos = p;
p = (*p).sig;
}
else
{ ban=0;
break;
}
}
if(ban==0)
{cout<<"ENCONTRADO: "<<(*pos).dato ;
}
else
{cout<<"NO ENCONTRADO"; }
}
Pg. 74
Asignatura: Algoritmia y Estructura de Datos
void lista::eliminar_inicio()
{ pnodo aux;
if(pL==NULL)
{ cout<<"lista vacia"; }
else
{ aux=pL;
if((*pL).sig==NULL) // un nodo
{ pL=NULL; }
else
{ pL=(*pL).sig; }
cout<<"elemento eliminado"<<(*aux).dato;
delete aux;
}
}
void lista::eliminar_final()
{ pnodo aux=pL,temp;
if(pL==NULL)
{ cout<<"lista vacia"; }
else
{ if((*pL).sig==NULL)
{ pL=NULL; }
else
{ while((*aux).sig!=NULL)
{ temp=aux;
aux=(*aux).sig;
}
(*temp).sig=NULL;
}
cout<<"elemento eliminado"<<(*aux).dato ;
delete aux;
}
}
void lista::imprimir()
{ pnodo p;
if ( pL == NULL )
cout<<"Lista vacia"<<endl;
else
{ p = pL;
while (p != NULL)
{ cout<<(*p).dato<<" -> ";
p = (*p).sig;
}
cout<<"NULO"<<endl;
}
}
ListasSE.cpp
#include <iostream.h>
#include "ListasSE.h"
using namespace std;
void main()
{ lista L; pnodo b; int valor,opc;
do
{ cout<<"\nmenu";
cout<<"\n1 insertar al inicio";
Pg. 75
Asignatura: Algoritmia y Estructura de Datos
do
{ cout<<"\n Seleccione opcin";
cin>>opc;
} while(opc>10);
switch(opc)
{ case 1:L.insertar_comienzo();break;
case 2:L.insertar_final();break;
case 3:L.insertar_despues();break;
case 4:L.eliminar_inicio();break;
case 5:L.eliminar_final();break;
case 6:L.~lista();break;
case 7:L.buscar();break;
case 8:L.buscar_anterior();break;
case 9:L.imprimir();break;
}
} while(opc!=10);
}
ListaC
12 30 21 54
Pg. 76
Asignatura: Algoritmia y Estructura de Datos
Gracias a los punteros ant y sig es que puede recorrerse la LDE en forma bidireccional, lo cual
constituye una ventaja importante frente a una lista enlazada simple que slo puede recorrerse en
un sentido.
En contraparte, el espacio ocupado en memoria es mayor debido a la inclusin de un segundo
puntero.
Para tener acceso a la lista es necesario un puntero Ld que contenga la direccin del primer nodo.
El campo ant del primer nodo tiene valor NULO, pues no existe un nodo anterior a este,
anlogamente, el ltimo nodo tiene tambin en su campo sig el valor NULO para expresar el
hecho de que no existe un siguiente nodo.
ListaDE NULL
12 30 21 54
NULL
Actividades
1. Utilizando los algoritmos de implementacin de la lista simplemente enlazada, implementar
los programas para:
a. Lista Circular.
b. Lista Doblemente Enlazada.
15.4 Colas
Una Cola es una lista ordenada de elementos en la cual las inserciones se realizan por un extremo
llamado Final y las eliminaciones por el otro extremo denominado Frente. Una Cola es una
estructura tipo FIFO ( First In - First Out ) ya que los elementos se sacan de la cola en el mismo
orden en que fueron insertados. La estructura de los nodos de una cola es la siguiente:
dato sig
Para especificar una cola son necesarios dos punteros, uno que apunte al primer elemento de la
cola y el otro al ltimo elemento de la cola.
Cola NULL
12 30 21 54
Pg. 77
Asignatura: Algoritmia y Estructura de Datos
Cola.h
#include <iostream>
using namespace std;
struct nodo
{ int dato;
nodo *sig;
};
class cola
{ private:
pnodo pL;
public:
cola();
~cola();
void encolar();
void desencolar();
void mostrar();
};
cola::cola()
{ pL = NULL; }
cola::~cola()
{ pnodo p,q;
if ( pL != NULL )
{ p = pL;
while ( p != NULL )
{ q = (*p).sig;
delete p;
p = q;
}
pL=p;
}
}
void cola::encolar()
{ pnodo nuevo,aux;
int valor;
nuevo = new nodo;
cout<<"Ingrese valor:";
cin>>valor;
(*nuevo).dato = valor;
(*nuevo).sig = NULL;
if ( pL == NULL )
pL = nuevo;
else
{ aux = pL;
while ( (*aux).sig != NULL )
aux = (*aux).sig;
(*aux).sig = nuevo;
}
}
Pg. 78
Asignatura: Algoritmia y Estructura de Datos
void cola::desencolar()
{ pnodo aux;
if(pL==NULL)
{ cout<<"cola vacia"; }
else
{ aux=pL;
if((*pL).sig==NULL) // un nodo
{ pL=NULL; }
else
{ pL=(*pL).sig; }
cout<<"elemento eliminado"<<(*aux).dato; delete aux;
}
}
void cola::mostrar()
{ pnodo p;
if ( pL == NULL )
cout<<"cola vacia"<<endl;
else
{ p = pL;
while (p != NULL)
{ cout<<(*p).dato<<" -> ";
p = (*p).sig;
}
cout<<"NULO"<<endl;
}
}
Cola.cpp
#include <iostream>
#include "Cola.h"
using namespace std;
void main()
{ cola C;
int opc;
do
{ cout<<"\nmenu";
cout<<"\n1 encolar";
cout<<"\n2 desencolar";
cout<<"\n3 mostrar";
cout<<"\n4 Salir";
do
{ cout<<"\n Seleccione opcin"; cin>>opc;
} while(opc>4);
switch(opc)
{case 1:C.encolar();break;
case 2:C.desencolar();break;
case 3:C.mostrar();break;
}
} while(opc!=4);
}
Actividades
1. Exponer la prueba de escritorio de los mdulos de programa para la estructura de dato
cola.
Pg. 79
Asignatura: Algoritmia y Estructura de Datos
15.5 Pilas
Una Pila es una lista de elementos en la cual las inserciones y las eliminaciones se realizan por un
mismo extremo llamado Cima.
Una Pila es una estructura tipo LIFO ( Last In - First Out ) ya que los elementos se sacan de la pila
en orden contrario al que fueron insertados.
La estructura de los nodos de una pila es la siguiente:
dato sig
Para especificar una pila es necesario un puntero, que apunte al primer elemento de la pila, es
decir a la cima.
Pila NULL
12 30 21 54
Pila.h
#include<iostream>
using namespace std;
struct nodo
{ int dato;
nodo *sig;
};
class stack
{ private:
pnodo pL;
public:
stack();
~stack();
void apilar();
void desapilar();
void mostrar();
};
stack::stack()
{ pL = NULL;
}
stack::~stack()
{ pnodo p,q;
if ( pL != NULL )
{ p = pL;
Pg. 80
Asignatura: Algoritmia y Estructura de Datos
while ( p != NULL )
{ q = (*p).sig;
delete p;
p = q;
}
pL=p;
}
}
void stack::apilar()
{ pnodo nuevo,aux;
int valor;
nuevo = new nodo;
cout<<"Ingrese dato:";
cin>>valor;
(*nuevo).dato = valor;
(*nuevo).sig = NULL;
if ( pL == NULL )
pL = nuevo;
else
{ aux = pL;
while ( (*aux).sig != NULL )
aux = (*aux).sig;
(*aux).sig = nuevo;
}
}
void stack::desapilar()
{pnodo aux=pL,temp;
if(pL==NULL)
{ cout<<"Pila vacia"; }
else
{ if((*pL).sig==NULL)
{ pL=NULL; }
else
{
while((*aux).sig!=NULL)
{ temp=aux;
aux=(*aux).sig;
}
(*temp).sig=NULL;
}
cout<<"elemento eliminado"<<(*aux).dato;
delete aux;
}
}
void stack::mostrar()
{ pnodo p;
if ( pL == NULL )
cout<<"Pila vacia"<<endl;
else
{ p = pL;
while (p != NULL)
{ cout<<(*p).dato<<" -> ";
p = (*p).sig;
}
cout<<"NULO"<<endl;
}
}
Pg. 81
Asignatura: Algoritmia y Estructura de Datos
Pila.cpp
#include <iostream>
#include "Pila.h"
using namespace std;
void main()
{ stack S; int opc;
do
{ cout<<"\nmenu";
cout<<"\n1 apilar";
cout<<"\n2 desapilar";
cout<<"\n3 mostrar";
cout<<"\n4 Salir";
do
{ cout<<"\n Seleccione opcin"; cin>>opc;
} while(opc>4);
switch(opc)
{case 1:S.apilar();break;
case 2:S.desapilar();break;
case 3:S.mostrar();break;
}
} while(opc!=4);
}
Actividades
1. Exponer la prueba de escritorio de los mdulos de programa para la estructura de dato
pila.
Ejemplo:
B C D E F G
H I J K L M N
P Q
Pg. 82
Asignatura: Algoritmia y Estructura de Datos
Cada nodo del rbol solo tiene dos punteros, uno para apuntar a su primer hijo y otro para apuntar
a su siguiente hermano.
B C D E F G
H I J K L M N
P Q
Pg. 83
Asignatura: Algoritmia y Estructura de Datos
#include <iostream>
#define MAX 10
using namespace std;
struct nodo
{ int dato;
nodo * hijo;
nodo * her;
};
typedef nodo *pnodo;
class arbol
{public: //cambiar a privada para recursividad de mostrar
pnodo rpri;
public:
arbol();
~arbol();
pnodo buscar(pnodo aux, pnodo pos,int d);
void mostrar(pnodo aux);
void inserta_principal();
void inserta_hijo();
void inserta_hermano();
};
arbol::arbol()
{rpri =NULL;}
arbol::~arbol()
{ }
pnodo arbol::buscar(pnodo aux, pnodo pos, int d)
{ pnodo aux2;
if (aux==NULL)
{ pos=NULL; }
else
{ if((*aux).dato ==d)
{ pos=aux;
}
else
{
aux2=(*aux).hijo;
do
{ while(aux2!=NULL && (*aux2).hijo ==NULL)
{ if((*aux2).dato==d)
{ pos=aux2;
break;
}
aux2=(*aux2).her;
}
if(aux2==NULL && pos==NULL)
return NULL;
if(aux2!=NULL)
{ pos=buscar(aux2,pos,d);
aux2=(*aux2).her;
}
else
break;
}while(aux2!=NULL);
}
}
return pos;
}
Pg. 84
Asignatura: Algoritmia y Estructura de Datos
Pg. 85
Asignatura: Algoritmia y Estructura de Datos
void arbol::inserta_hermano()
{pnodo herma,pos=NULL;
int num;
herma=new nodo;
cout<<"\t De que nodo desea que sea el hermano: "<<endl;
cin>>num;
if(num==rpri->dato)
cout<<"***--NO SE PUEDE INGRESAR UN HERMANO A LA RAIZ PRINCIPAL--
***"<<endl;
else
{ pos=buscar(rpri,pos,num);
if(pos==NULL)
{ cout<<"\t---*** Arbol vacio o no se encontro ***---"<<endl;
}
else
{cout<<"\t Ingrese nro a insertar: ";
cin>>herma->dato;
pos->her=herma;
herma->her=NULL;
herma->hijo=NULL;
}
}
}
void main()
{int opc;
arbol p;
//pnodo raiz=p.rpri;
bool band=false;
cout<<endl;
//cout<<p.rpri ;
cout<<"\t -------****** MENU ******------- "<<endl<<endl;
Pg. 86
Asignatura: Algoritmia y Estructura de Datos
Raiz
Subarbol Subarbol
Izquierdo Derecho
Ejemplo:
A
B C
D E F
rbol de Expresin
Es un rbol binario en el que las hojas contienen los operandos y los nodos internos los
operadores de una expresin matemtica.
^ /
a
* - g
b c f
*
d e
Pg. 87
Asignatura: Algoritmia y Estructura de Datos
2 8
1 4 10
3 9
Para poder tener acceso al rbol es necesario un puntero que contenga la direccin de la raz.
arbolabb.h
#include<iostream>
using namespace std;
struct nodoABB
{ nodoABB *hizq;
int dato;
nodoABB *hder;
};
class abb
{ private:
pnodoABB praiz;
public:
abb();
~abb();
pnodoABB getraiz();
pnodoABB buscar( int x );
void insertar( int x );
void imprimeenorden( pnodoABB p );
void imprimepreorden( pnodoABB p );
void imprimepostorden( pnodoABB p );
void eliminaarbol( pnodoABB p );
};
abb::abb()
{ praiz = NULL;
}
abb::~abb()
{ eliminaarbol(praiz);
praiz = NULL;
}
Pg. 88
Asignatura: Algoritmia y Estructura de Datos
pnodoABB abb::getraiz()
{ return praiz;
}
Pg. 89
Asignatura: Algoritmia y Estructura de Datos
if ( p != NULL )
{ Ai = (*p).hizq;
Ad = (*p).hder;
imprimeenorden(Ai);
cout<<(*p).dato<<" ";
imprimeenorden(Ad);
}
}
if ( p != NULL )
{ Ai = (*p).hizq;
Ad = (*p).hder;
cout<<(*p).dato<<" ";
imprimepreorden(Ai);
imprimepreorden(Ad);
}
}
if ( p != NULL )
{ Ai = (*p).hizq;
Ad = (*p).hder;
imprimepostorden(Ai);
imprimepostorden(Ad);
cout<<(*p).dato<<" ";
}
}
if ( p != NULL )
{ Ai = (*p).hizq;
Ad = (*p).hder;
eliminaarbol(Ai);
eliminaarbol(Ad);
delete p;
}
}
Pg. 90
Asignatura: Algoritmia y Estructura de Datos
ArbolBinario.cpp
#include <iostream.h>
#include "arbolabb.h"
using namespace std;
void main()
{ abb A;
pnodoABB b,r;
int i, x, sn, n, cn,opc;
do
{ cout<<"\n Menu \n";
cout<<"\n1 insertar nodo";
cout<<"\n2 mostrar in orden";
cout<<"\n3 mostrar pre orden";
cout<<"\n4 mostrar post orden";
cout<<"\n5 Salir";
do
{ cout<<"\n\n Seleccione opcion: ";
cin>>opc;
} while(opc>5);
switch(opc)
{ case 1:{ cout<<"Ingrese hoja: ";
cin>>x;
A.insertar(x);
r = A.getraiz();
}break;
case 2:A.imprimeenorden(r);break;
case 3:A.imprimepreorden(r);;break;
case 4:A.imprimepostorden(r);break;
}
} while(opc!=5);
}
Actividades
2. Completar con valores numricos adecuados el sgte. rbol binario. Imprimir los nodos del
resultado de cada recorrido.
Pg. 91
Asignatura: Algoritmia y Estructura de Datos
16.4 Grafos
Un grafo es el objeto abstracto bsico de estudio en teora de los grafos. Informalmente, un grafo
se concibe y se representa como un conjunto de objetos llamados vrtices o nodos unidos por
enlaces llamados aristas. Las aristas pueden tener direccin (grafo dirigido).
Consta de vrtices (o nodos) y aristas. Los vrtices son objetos que contienen informacin y las
aristas son conexiones entre vrtices.
Un camino entre dos vrtices es una lista de vrtices en la que dos elementos sucesivos estn
conectados por una arista del grafo.
El grafo ser conexo si existe un camino desde cualquier nodo del grafo hasta cualquier otro. Si no
es conexo constar de varias componentes conexas.
Un camino simple es un camino desde un nodo a otro en el que ningn nodo se repite (no se pasa
dos veces). Si el camino simple tiene como primer y ltimo elemento al mismo nodo se denomina
ciclo. Cuando el grafo no tiene ciclos tenemos un rbol (ver rboles). Varios rboles
independientes forman un bosque. Un rbol de expansin de un grafo es una reduccin del grafo
en el que solo entran a formar parte el nmero mnimo de aristas que forman un rbol y conectan
a todos los nodos.
Segn el nmero de aristas que contiene, un grafo es completo si cuenta con todas las aristas
posibles (es decir, todos los nodos estn conectados con todos), disperso si tiene relativamente
pocas aristas y denso si le faltan pocas para ser completo. Las aristas son la mayor parte de las
veces bidireccionales, es decir, si una arista conecta dos nodos A y B se puede recorrer tanto en
sentido hacia B como en sentido hacia A: estos son llamados grafos no dirigidos. Sin embargo, en
ocasiones tenemos que las uniones son unidireccionales. Estas uniones se suelen dibujar con una
flecha y definen un grafo dirigido. Cuando las aristas llevan un coste asociado (un entero al que se
denomina peso) el grafo es ponderado. Una red es un grafo dirigido y ponderado.
Grafo no dirigido
Grafo dirigido
Ejemplo:
La imagen es una representacin del siguiente grafo:
V:={1,2,3,4,5,6}
E:={{1,2},{1,5},{2,3},{2,5},{3,4},{4,5},{4,6}}
El hecho que el vrtice 1 sea adyacente con el vrtice 2 puede ser denotado como 1 ~ 2.
En la Teora de las categoras una categora puede ser considerada como un multigrafo
dirigido, con los objetos como vrtices y los morfismos como aristas dirigidas.
En ciencias de la computacin los grafos dirigidos son usados para representar mquinas
de estado finito y algunas otras estructuras discretas.
Una relacin binaria R en un conjunto X es un grafo dirigido simple. Dos vrtices a, b en X
estn conectados por una arista dirigida ab si aRb.
Actividades
1. Utilizando las estructuras de datos estudiadas, construir el programa que implemente la
definicin y las operaciones de un grafo.
Pg. 92
Asignatura: Algoritmia y Estructura de Datos
CUARTA UNIDAD
Existen programas que trabajan con informacin almacenada en memoria principal, pero no es
apropiado porque:
- Los datos con los que necesita trabajar el programa son demasiado grandes (ocupan mucha
memoria) para que entren en la memoria principal.
- Interesa mantener la informacin despus de cada ejecucin, por eso se necesita utilizar datos
procedentes de otros programas (editores, etc.), o generar datos para que puedan ser utilizados
por otros programas.
Para estos casos se necesitan ficheros para contener la informacin en memoria secundaria
(disco duro, cds, etc.).
Conceptos Bsicos
Pueden ser todos de longitud fija, es decir para el ejemplo anterior, los registros empleados
pueden contener el mismo nmero de campos: nombre, fecha de nacimiento, direccion, etc.
FICHERO: Es una coleccin de registros relacionados entre si, con aspectos en comun y
organizados para un propsito especifico.
Pg. 93
Asignatura: Algoritmia y Estructura de Datos
BASE DE DATOS: Es una coleccin de archivos que contienen datos relacionados y se acceden
a traves de un conjunto de programas. En C++ un fichero es simplemente un flujo externo que se
puede abrir para entrada (dando lugar a un flujo de archivo de entrada), para salida (dando lugar a
un flujo de archivo de salida) o para entrada-salida (archivo o fichero de entrada-salida o archivo
de E/S).
Una biblioteca en C++ que proporciona funciones y operadores para el manejo de ficheros es la
biblioteca fstream. #include <fstream>
Pg. 94
Asignatura: Algoritmia y Estructura de Datos
void main()
{ ofstream fichero("ejemplo.txt"); //Fichero de salida
fichero << "Hola" << endl;
fichero << "Adios" << endl;
fichero.close();
system("pause");
}
#include<iostream>
#include <fstream>
#include <iostream>
using namespace std;
void main()
{ fstream fichero; // Declaracion de la variable fichero
char texto[200];
fichero.open("ejemplo.txt", ios::in); // Abrir para lectura
fichero >> texto; // Leer una primera linea
while (!fichero.eof()) // Mientras nos sea final de fichero
{ cout << texto << endl; // Mostrar lo leido
fichero >> texto; // Volver a leer
}
fichero.close(); // Cerrar Fichero
system("pause");
}
Actividades
1. Presentar el algoritmo de Ordenacin sobre:
a. Ordenacin por Seleccin.
b. Ordenacin por Insercin Directa.
c. Ordenacin por Insercin Binaria.
d. Ordenacin Shell.
e. Ordenacin Heapsort.
f. Ordenacin Quicksort.
Pg. 95
Asignatura: Algoritmia y Estructura de Datos
REFERENCIAS BIBLIOGRFICAS
Y DIRECCIONES ELECTRNICAS
Ceballos Sierra, Francisco. C / C++ curso de programacin. 6ta ed. Mexico: AlfaOmega;
2006.
Joyanes Aguilar, Luis. Estructura de Datos. 1ra. ed. Espaa: McGraw-Hill; 2000.
Baeza Yates, Ricardo. Algorimtia. Dpto. de Cs. de la Computacin, Univ. de Chile: 2002.
Disponible en www.dcc.uchile.cl/~rbaeza/inf/algoritmia.pdf
Pg. 96