You are on page 1of 96

ALGORITMIA Y

ESTRUCTURA DE DATOS

Asignatura: Algoritmia y Estructura de Datos

Universidad Continental de Ciencias e Ingeniera


Material publicado con fines de estudio
Primera edicin
Huancayo, 2013

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.

El presente material consta de cuatro unidades: Unidad I: Algoritmos y Programacin


Estructurada presenta conceptos, representaciones y programacin del algoritmo, con sus tcnicas:
Sentencias Bsicas de Programacin: Secuenciales, Selectivas y Repetitivas. Unidad II:
Modularizacin en la Programacin Estructurada, es decir, se puede dividir a un programa complejo,
en segmentos de programa mas simples (Modularizacin), y poder ser reutilizados en otros
programas, a travs del uso de funciones y procedimientos, y en algunos casos usando el concepto
de recursividad. Unidad III: Estructuras de Datos, donde se expone las formas de almacenamiento
temporal de datos a travs estructuras tanto del tipo estticas (arreglos, registros, clases) como
dinmicas (listas, pilas, colas, rboles, grafos). Unidad IV: Ficheros (Archivos), en esta ultima
unidad, se expone una forma de almacenamiento de datos mas ventajosa que las estructuras de
datos explicadas previamente, para poder manipular y operar dichos datos, desarrollados a partir del
texto Fundamentos de Programacin (Joyanes Aguilar Luis, 2008).

Es recomendable que el estudiante desarrolle una permanente lectura de estudio junto a la


elaboracin de programas en un lenguaje de programacin, as como la investigacin en otros
textos y va internet. El contenido del material se complementar con las lecciones presenciales y a
distancia que se desarrollan en la asignatura.

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
NDICE
PRIMERA UNIDAD
Tema N 1: Algoritmo
1.1 Definicin del Algoritmo
1.2 Caractersticas de un algoritmo
1.3 Instrucciones Algortmicas Bsicas
1.4 Representacin del Algoritmo
Tema N 2: Programacin Estructurada
2.1 Programa
2.2 Lenguaje de Programacin
2.3 Programas Traductores
2.4 Definicin Programacin Estructurada
2.5 Resolucin de un Problema
Tema N 3: Sentencias Bsicas de Programacin
3.1 Estructura Bsica Simple o Secuencial
3.2 Estructura Bsica Selectiva
3.3 Estructura Bsica Repetitiva
SEGUNDA UNIDAD
Tema N 4: Modularizacin de Programas
4.1 Paso de Parmetros
4.2 Procedimientos
4.3 Funciones
Tema N 5: Libreras de Programacin creadas por el usuario
Tema N 6: Funciones Recursivas
TERCERA UNIDAD
Tema N 7: Estructuras de Datos
7.1 Definicin de Estructura de Datos
7.2 Clasificacin de Estructura de Datos
Tema N 8: Arreglos Unidimensionales
8.1 Actualizacin de Arreglos Unidimensionales
8.2 Bsqueda de Arreglos Unidimensionales
8.3 Ordenacin de Arreglos Unidimensionales
Tema N 9: Arreglos Bidimensionales
9.1 Actualizacin de Arreglos Bidimensionales
9.2 Aplicacin de Arreglos Bidimensionales
Tema N 10: Registro (Estructura)
Tema N 11: Union
Tema N 12: Tipos de Datos Abstractos (TDA)
Tema N 13: Clases y Programacin Orientada a Objetos
Tema N 14: Punteros a Direccin de Memoria

3
4
6
6
7
7
8
9
9
9
10
10
11
12
12
14
22
30
30
31
31
36
38
40
40
40
41
42
45
47
51
54
56
60
64
64
65
67
Pg. 4

Asignatura: Algoritmia y Estructura de Datos

14.1 Declaracin de variables tipo puntero


Tema N 15: Estructuras de Datos Estticas
15.1 Lista Enlazada Simple
15.2 Lista Enlazadas Circular
15.3 Lista Enlazada Doble
15.4: Colas
15.5 Pilas
Tema N 16: Estructuras de Datos Dinmicas
16.1 rbol General
16.2 rbol Binario
16.3 rboles Binarios de Bsqueda( ABB )
16.4 Grafos
CUARTA UNIDAD
Tema N 17: Archivos (Ficheros)
BIBLIOGRAFA Y DIRECCIONES ELECTRNICAS

67
71
71
76
76
77
80
82
82
87
88
92
93
96

Pg. 5

Asignatura: Algoritmia y Estructura de Datos

PRIMERA UNIDAD

Tema N 1: Algoritmo

1.1 Definicin de Algoritmo


La palabra algoritmo se dio en honor del matemtico persa del siglo IX, Khowrizm.
Un algoritmo es un conjunto ordenado y finito de instrucciones que conducen a la solucin de un
problema.
Por ejemplo:
- Al instalar un equipo de sonido ejecutamos las instrucciones (algoritmo) contenidas en el manual
del equipo.
- Algoritmo matemtico de Euclides para la obtencin del mximo comn divisor de dos nmeros.
Si un algoritmo puede ser ejecutado por una computadora, se dice que es un algoritmo
computacional; en caso contrario, se dice que es un algoritmo no computacional.
Para que un algoritmo sea computacional se debe expresar en instrucciones a travs de un
lenguaje de programacin, teniendo como resultado un programa.

Todo algoritmo puede ser descompuesto en tres partes:

Entrada de datos.
Proceso.

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


1.2 Caractersticas de un algoritmo
Ser preciso: los pasos del algoritmo deben desarrollarse en un orden estricto, ya que el
desarrollo de cada paso debe obedecer a un orden lgico.
Ser definido. en el rea de programacin, el algoritmo se desarrolla como paso fundamental
para desarrollar un programa. El computador solo desarrollar las tareas programadas y con los
datos suministrados; no puede improvisar el dato que necesite para realizar un proceso.
Ser finito: implica que el nmero de pasos de un algoritmo, por grande y complicado que sea el
problema que soluciona, debe ser limitado, es decir debe llegar a un final.
Presentacin formal: para que el algoritmo sea entendido por cualquier persona interesada es
necesario que se exprese en alguna de las formas comnmente aceptadas; si no puede no ser
muy til ya que solo lo entender quien lo dise. Las formas de presentacin de algoritmos son:
el pseudocdigo, diagrama de flujo y diagramas de Nassi/Schneiderman, entre otras.
Correccin: el algoritmo debe ser correcto, debe solucionar el problema para el cual fue
diseado. Para garantizar que el algoritmo logre el objetivo, es necesario ponerlo a prueba:
verificacin o prueba de escritorio.
Eficiencia: es evaluar los recursos que requiere para almacenar datos y para ejecutar
operaciones frente al beneficio que ofrece. En cuanto menos recursos requiere ser ms
eficiente el algoritmo.

1.3 Instrucciones Algortmicas Bsicas

a. Entrada: Consiste en obtener un dato de un dispositivo de entrada, como el teclado, y


almacenarlo en una variable. En general, la accin de ingresar un dato a una variable se expresa
en el pseudocdigo mediante la palabra LEER, de la siguiente forma:
LEER variable
Ejemplo:

LEER edad

b. Salida: Consiste en mostrar el valor de una variable en un dispositivo de salida, como la


pantalla. En general, la accin de mostrar el valor de una variable se expresa en el pseudocdigo
mediante la palabra IMPRIMIR (ESCRIBIR) de la siguiente forma:
IMPRIMIR variable
Ejemplo:

IMPRIMIR TotalCompra

c. Asignacin: Consiste en dar a una variable el valor de una expresin. La asignacin se


expresa en el pseudocdigo de la siguiente forma:
variable = expresin

variable

expresin

Donde variable y el valor de expresin deben tener el mismo tipo de dato.


Ejemplo:
resultado

numero1 + numero 2

Pg. 7

Asignatura: Algoritmia y Estructura de Datos


1.4 Representacin del Algoritmo

a. Pseudocdigo: Es la representacin del algoritmo en lenguaje natural. Ejemplo: sumar dos


nmeros enteros.
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


Procesos del algoritmo
Entada/Salida Estndar de Datos del algoritmo
Flujo de recorrido entre Procesos del algoritmo
Punto de Decisin del algoritmo
Subrutinas en el algoritmo
Conector del algoritmo en la misma hoja
Conector del algoritmo en otra hoja

c. Diagrama Nassi/Schneiderman (N-S)


Representacin en bloques, es decir cada uno de los procesos como ingreso/salida de datos,
decisiones, acciones, repeticiones; estn representados en bloques de tareas consecutivos.

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.

Tema N 2: Programacin Estructurada


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.

2.2 Lenguaje de Programacin

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).

c. Lenguaje de Alto Nivel: permite al programador escribir las instrucciones de un programa


utilizando palabras o expresiones sintcticas muy similares al lenguaje natural (ingls).

Pg. 9

Asignatura: Algoritmia y Estructura de Datos


2.3 Programas Traductores
Traducen los programas fuente de a cdigo mquina. Pueden ser:
a. Intrpretes: es un traductor que toma un programa fuente, lo traduce y a continuacin lo
ejecuta.
PROGRAMA
FUENTE
INTERPRETE

PROGRAMA
EJECUTABLE

b. Compilador: es un traductor que toma un programa fuente, y lo traduce sentencia por


sentencia.
PROGRAMA
FUENTE
COMPILADOR

PROGRAMA
OBJETO

La compilacin es el proceso de traduccin del programa fuente a programa objeto (traducido a


cdigo mquina), a travs de un programa enlazador, para conducir al programa ejecutable.
COMPILADOR
(Traductor)
PROGRAMA
FUENTE
PROGRAMA
OBJETO
PROGRAMA
ENLAZADOR
PROGRAMA
EJECUTABLE

2.4 Definicin Programacin Estructurada


Conjunto de tcnicas para escribir, verificar, depurar, y mantener los programas, es una
metodologa de desarrollo de programas llamada refinamientos sucesivos: se plantea una
operacin como un todo y se divide en segmentos ms sencillos o de menor complejidad. Una vez
terminado todos los segmentos del programa, se procede a unificar las aplicaciones, esta
integracin debe ser sencilla.

Pg. 10

Asignatura: Algoritmia y Estructura de Datos


La representacin grafica de la programacin estructurada se realiza a travs de diagramas de
flujo o flow chart, Diagramas N-S, el cual representa el programa con sus entradas, procesos y
salidas.
El conjunto de tcnicas para este enfoque son:
a. Recursos Abstractos
Descomponer una determinada accin compleja en acciones ms simples, para ser
ejecutadas y que sern instrucciones.
b. Diseo Descendente
El problema se descompone en niveles o pasos sucesivos: que hace? como lo hace?

Que hace ?
Como hace?
c. Estructuras bsicas
Son estructuras de control para el programa:

Secuenciales

Selectivas

Repetitivas

ste conjunto de tcnicas permite elaborar programas en cualquier lenguaje de programacin.


Las estructuras bsicas mencionadas sern desarrolladas mas adelante en otras sesiones de
clase.

2.5 Resolucin de un Problema


Los siguientes pasos propuestos para la resolucin de problemas estn basados en el Ciclo de
Vida Clsico en la Construccin de un Software.

1. Anlisis del Problema


2. Diseo del Algoritmo
3. Expresar el algoritmo en un programa.
4. Ejecucin y Validacin del programa.

Pg. 11

Asignatura: Algoritmia y Estructura de Datos


Tema N 3: Sentencias Bsicas de Programacin
Las sentencias de programacin a utilizar es una las tcnicas de programacin del enfoque
estructurado: Estructuras Bsicas.

3.1 Estructura Bsica Simple o Secuencial


Es una estructura paso a paso, sin bifurcaciones ni repeticiones; donde la salida de un
proceso es entrada para otro.
Diagrama de Flujo:

INICIO
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
real

base, altura, Area


Leer base
Leer altura

Area
/2

(base * altura)

Escribir El valor del rea


para el tringulo es:
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;
Area = (base * altura) / 2;
cout<<El valor del rea para el tringulo es: ;
cout<<Area;
cout<<\n;
}

Pg. 13

Asignatura: Algoritmia y Estructura de Datos

3.2 Estructura Bsica Selectiva


Es una estructura que tiene un punto de decisin para realizar un conjunto de acciones.
Pueden ser:

E. B. Selectiva Simple

E. B. Selectiva Compuesta

E. B. Selectiva Anidada

E. B. Selectiva Mltiple

a. Estructura Bsica Selectiva Simple:


Se tiene un punto de decisin que evala una condicin y si es Verdadero, ejecuta un
conjunto de Acciones.
Diagrama de Flujo:

INICIO
Declaracin de Variables
Lectura de Datos

F
Cond 1

Accin 1

Accin n

Reporte de Datos

FIN
Diagrama N-S:
INICIO
Declaracin de variables
Lectura de Datos
V

Cond 1

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

Solucin

Leyenda de Datos
a: valor del primer nmero entero positivo
b: valor del segundo nmero entero positivo
c: valor del resultado la suma de dos nmeros a y b

Diagrama de Flujo:

INICIO
entero

a, b, c
Leer a , b

a >0 && b>0

a+b

Escribir El valor de la suma es,c

FIN
Diagrama N-S:
INICIO
entero

a, b, c

Leer a , b
a >0 && b>0
V
c

F
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

if (a>0 && b>0)


{
c = a + b;
cout<<El valor la suma es: ;
cout<<c;
cout<<\n;
}
return 0;
}

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

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

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

a >0 && b>0

a*b

Escribir El valor de la
multiplicacion es , c

a+b

Escribir El valor de la
suma es , c

FIN
Diagrama N-S
INICIO
entero

a, b, c

Leer a , b
a >0 && b>0
V
c

F
a+b

Escribir El valor la suma es: , c

a*b

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


if(a>0 && b> 0)
{
c = a + b;
cout<<El valor la suma es: ;
cout<<c; cout<<\n;
}
else
{
c = a * b;
cout<<El valor la multiplicacion es: ;
cout<<c; cout<<\n;
}
}
c. Estructura Bsica Selectiva Anidada: se evala una condicin y si es Verdadero, ejecuta
un nuevo punto de decisin y as sucesivamente, y si es Falsa ejecuta otro conjunto de
acciones.
Diagrama de Flujo

INICIO
Declaracin de Variables

Lectura de Datos
F

V
Cond 1
F

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
Accin 2

Cond 1
V

Accin 1

Accin m

Accin n

V
Cond 2

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.
Leyenda de Datos
a: valor del numero entero

Solucin:

Diagrama de Flujo

INICIO
Entero

Leer a

a>0

F
Escribir No es un
nmero mayor
que cero

V
a>=1 && a>10

Escribir Son mas de


los primeros 10

Escribir Primeros 10

FIN
Diagrama N-S
INICIO
entero

Leer a

a>0

Escribir No es un nmero mayor


que cero

V
F

a>=1 && a>10

Escribir Son mas de los primeros 10

V
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


d. Estructura Bsica Selectiva Mltiple: se tiene un punto de decisin que evala ms de
dos alternativas para realizar un conjunto de acciones.
Diagrama de Flujo

INICIO
Declaracin de Variables
Lectura de Datos
1

default

Cond 1
2

Accin 1

Accin 2

Accin 3

Accin 4

Accin n

Accin m

Accin m

Accin m

Accin 4
Reporte de Datos

FIN
Diagrama N-S

INICIO
Declaracin de variables
Lectura de Datos
Cond 1

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
num: valor del numero entero positivo

Pg. 20

Asignatura: Algoritmia y Estructura de Datos


Diagrama de Flujo

INICIO
entero

num

Leer num
default

1
num
2

Escribir
Vocal E

Escribir
Vocal A

Escribir
Vocal I

Escribir
Vocal U

Escribir
Vocal O

Escribir
No es
Vocal

FIN
Diagrama N-S

INICIO
entero

num

Leer num
num
1
Escribir
Vocal A

2
Escribir
Vocal E

3
Escribir
Vocal I

4
Escribir
Vocal O

5
Escribir
Vocal U

default
Escribir No
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


3.3 Estructura Bsica Repetitiva
Es una estructura permite iterar o repetir un conjunto de acciones dada una condicin.
Pueden ser:

E. B. Repetitiva Mientras

E. B. Repetitiva Hacer-Mientras

E. B. Repetitiva Para

a. Estructura Bsica Repetitiva Mientras: primero evala una expresin condicional y si es


verdadera permite realizar el conjunto de acciones y regresa evaluar nuevamente la
expresin condicional, hasta que deje de cumplir (Falso).
Diagrama de Flujo

INICIO
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
entero

lim, a=0, b=1, c


Leer lim
Escribir a
F
b<=lim
V

Escribir b
c

a+b

FIN
Diagrama N-S
INICIO
entero

lim, a=0, b=1, c

Leer lim
Escribir a
b <= lim
Escribir c
c

a +b

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

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;
do{

cout<<" Ingrese un numero entero mayor a cero: ";


cin>>num;
}while(num <= 0);
}
Ejemplo en Cdigo C:
Se tiene un Stock inicial, del cual se realizan ventas a n clientes, si la venta supera al stock, contar
a los clientes insatisfechos. Mostrar la cantidad de clientes satisfechos, cantidad de clientes
insatisfechos, Total de ventas, y lo que queda en stock. El usuario indica si desea continuar o no.
#include<iostream>
using namespace std;
int main()
{ int n,m, cs=0,ci=0, venta=0; char ops,op;
cout<<"-----Venta de Producto------"; cout<<"\n\n";
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);

";

if(n>=m && m>0)


{
n=n-m;
venta=venta+m;
cs++;
if(n>0)
{
cout<<"\n"; cout<<"Desea Continuar?";
cin>>ops; cout<<"\n";
}
else
break;
}
else
{
ci++;
cout<<"\n"; cout<<"Es mayor q el stock actual \n";
cout<<"Clientes Satisfechos: ";
cout<<cs; cout<<"\n";
cout<<"Clientes Insatisfechos:
";
cout<<ci; cout<<"\n";
cout<<"Total de Ventas: ";
cout<<venta; cout<<"\n";
cout<<"Queda de Stock: ";
cout<<n; cout<<"\n";
cout<<"---------------------------"; cout<<"\n\n";
cout<<"Desea Continuar?";
cin>>ops; cout<<"\n\n";
}
}while(ops=='S' || ops=='s');
cout<<"------REPORTE FINAL------"; cout<<"\n";
cout<<"Clientes Satisfechos: ";
cout<<cs; cout<<"\n";
cout<<"Clientes Insatisfechos:
";
cout<<ci; cout<<"\n";
cout<<"Total de Ventas: ";
cout<<venta; cout<<"\n";
cout<<"Queda de Stock: ";
cout<<n; cout<<"\n";
cout<<"--------------------------"; cout<<"\n\n";
if(n==0)
{
cout<<"Se completo ultimo pedido, su stock actual es CERO \n";
cs=0;
ci=0;
venta=0;
cout<<"Desea Otro Stock Inicial? (s)";
cin>>op;
}
else
break;
}while(op=='S' || op=='s');
return 0;
}

Pg. 26

Asignatura: Algoritmia y Estructura de Datos


c. Estructura Bsica Repetitiva Para: permite repetir un conjunto de acciones,
secuencialmente hasta llegar a un lmite dado.
Diagrama de Flujo
INICIO
Declaracin
Variables

de

Lectura de Datos
Definir variable de recorrido y lmite

Inicializar la variable de recorrido

Variable recorrido es
menor a lmite
V

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

Escribir Ingrese numero para factorial

Leer num

F
i < = num
V

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

Tema N 4: Modularizacin de Programas


4.1 Paso de Parmetros
Para llamar un bloque de cdigo ms de una vez, es tener las instrucciones en subprogramas que
se invocan cada vez que se necesiten. Los subprogramas son partes separadas de cdigo que
ejecutan tareas pequeas de un programa principal.
Parmetros de entrada (valor)
Guarda en memoria una copia temporal de la variable, dentro del procedimiento solo se utiliza la
copia, cuando se modifica el valor del parmetro solo afecta al almacenamiento temporal, la
variable actual fuera del procedimiento nunca se toca.
Parmetros de entrada/salida (referencia)
Los cambios que se efecten sobre dicha variable dentro del procedimiento se mantienen incluso
despus de que este haya terminado, es decir los cambios afectan al programa principal.
Ejemplo:

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)

Si se tiene el siguiente programa simple para sumar dos nmeros:


//Programa Simple
#include<iostream>
using namespace std;
void main()
{

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;

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;
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";
}
//Funciones sin Argumentos: Ejemplo2
#include<iostream>
using namespace std;
int sumar()
{

int a,b,c;
cout<<"Ingrese valor de a: \t";
cin>>a;
cout<<"Ingrese valor de b: \t";
cin>>b;
c=a+b;
return c;

}
void main()
{

int sum;
sum=sumar();
cout<<"Valor de la suma de a y b:

"<<sum;

cout<<"\n";
}

Pg. 33

Asignatura: Algoritmia y Estructura de Datos

Otra Manera de definir un Procedimiento y una Funcin:


//Procedimientos con Argumentos
#include<iostream>
using namespace std;
void sumar(int a, int b);
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 = x

+ 5

y = 3x - 1
y = x

- 4x + 5

si

x <= 0

si

0<x<2

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;
//procedimientos sin argumentos
void herencia()
{ float her,may;
int num;
cout<<"Ingresar importe de herencia \n";
cin>>her;
cout<<"Ingresar cantidad de hijos \n";
cin>>num;
if(num<4)
{
her=her/num;
cout<<"Herencia a cada hijo es "<<her;
}
else
{

may=her/2;
her=may/(num-1);
cout<<"\nHerencia de hermano mayor es"<<may;
cout<<"\nHerencia de cada hijo es "<<her; }

}
void main(
{

herencia( ); }

Pg. 35

Asignatura: Algoritmia y Estructura de Datos

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:

$ 500

$ 400

$ 300

$ 400

$ 300

$ 200

$ 300

$ 200

$ 100

Tipo cliente

Reportar el Tipo de Cliente, la Cuenta que apertura, el monto total de la cuenta.


Considere el ingreso del tipo de cambio de moneda al da.
3. En un colegio, a la pensin de sus alumnos de tipo A, B, C, de acuerdo al promedio obtenido, le
asignan becas:
0 10

11 - 16

17 -20

A ++

A+

A-

B ++

B+

B-

C ++

C+

C-

Promedio
Alumno

De acuerdo a la beca obtenida, se le descuenta al pago de su pensin:


A ++ = 5 %

A + = 7%

A - = 10 %

B ++ = 3 %

B+=5%

B-=7%

C ++ = 1 %

C+ = 3%

C-=5%

Mostrar el tipo de alumno, la beca obtenida, y el monto total de pago de pensin,


4. Elaborar los mdulos de programa adecuados que permita leer las edades de n personas y
reporte el mayor, el menor y el promedio de edades.

Tema N 5: Libreras de Programacin creadas por el usuario


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:

Desarrollar la sgte. Ecuacin solo si son nmeros positivos y diferentes a cero.


y = x * (2x - a)
Solucin:
- La funcin para la lectura de datos enteros y diferentes a cero ya fue creada para el programa del
ejemplo 1.
}
- Solo se crear el programa fuente con extensin .cpp para desarrollar la ecuacin.
#include<iostream>
#include c:\programas\lecturadato.h
using namespace std;
void main()
{ int x,a,y;
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

Excelente (E)

40

30

20

Bueno (B)

30

20

10

Regular (R)

20

10

Malo (M)

Tipo Cliente

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.

Tema N 6: Funciones Recursivas


Se denominan funciones recursivas a aquellas que se invocan a s mismas en un programa.
Hay que tener algunas cosas en cuenta en las funciones recursivas:
- Toda funcin recursiva debe tener algn punto de finalizacin.
- La funcin debe tender a ese punto de finalizacin.

La funcin factorial:
4! = 4 * 3 * 2 * 1

n!

4 * 3!

4! = 4 * 3 * 2 * 1
4 * 3!

3! = 3 * 2 * 1

Es decir n*(n-1)!

3 * 2!

3! = 3 * 2 * 1
3 * 2!

Es decir n*(n-1)!

2! = 2 * 1
2 * 1!

2! = 2 * 1

1! = 1 * 0!

2 * 1! Es decir n*(n-1)!

0! = 1

1! = 1 * 0!
0! = 1
int factorial(int n)
{ if (n == 0)

1 * 1 * 2 * 3 * 4 = 24

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*1 =3

3 + (3 *1)
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
Investigar y Exponer las funciones recursivas de:
1. Serie Fibonacci
2. Mximo Comn Divisor
3. Torres de Hanoi.

Pg. 39

Asignatura: Algoritmia y Estructura de Datos

TERCERA UNIDAD

Tema N 7: Estructuras de Datos


7.1 Definicin de Estructura de Datos
Una estructura de datos es una coleccin de datos que se caracteriza por su organizacin y por el
conjunto de operaciones que se definen para su manipulacin.

7.2 Clasificacin de Estructura de Datos

Enteros
Reales
Caracter

Arreglos
Registros
Archivos
Cadenas

Estructuras de Datos Estndar


Estructura de Datos
Simples

Estructuras de Datos No Estndar


(Definidos por el programador)

Estructuras de Datos Estticos

Lineales

Estructuras de Datos
Compuestos

Estructuras de Datos Dinmicos


No Lineales

Listas
Pilas
Colas

Arboles
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

Tema N 8: Arreglos Unidimensionales


Tambin llamado vectores, es un conjunto finito y ordenado de elementos de un mismo tipo de
dato. La definicin de un arreglo es como sigue:
TipoDato
Ejm.

NombreArreglo[tamao]

Entero

M[10]

Acceso a los elementos de un arreglo unidimensional


Nombre del arreglo [posicin del elemento];

//Programa para promediar las alturas de los alumnos


#include<iostream>
#define N 5
using namespace std;
void leerarre(double array[ ])
{
int i;
for(i=0;i<=N-1;i++)
{
cout<<"Ingrese altura alumno"<<"["<<i<<"]"<<":\t";
cin>>array[i];
}
}
double suma(double array[ ])
{
int i; double suma=0;
for(i=0;i<=N-1;i++)
{
suma=suma+array[i];
}
return suma;
}
double promedio(double sum)
{
double prom;
prom=sum/N;
return prom;
}
void main()
{
double A[N],sum,promed;
leerarre(A);
sum=suma(A);
promed=promedio(sum);
cout<<"\t\tLa suma es "<<sum; cout<<"\n\n";
cout<<"\t\tEl promedio es "<<promed; cout<<"\n\n";
}

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);
}
8.1 Actualizacin de Arreglos Unidimensionales
Los Arreglos necesitan actualizarse mientras se efecta algn proceso con ellos. La actualizacin
de arreglos consiste en tres operaciones: Aadir elementos al final del arreglo (siempre y cuando
exista espacio en el arreglo), Insertar elementos en cualquier posicin del arreglo y Eliminar
elementos.

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


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];
}
}
void mostrar(int V[MAX], int n)
{
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=0;i<=n-1;i++)
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t";
cout<<V[i]; cout<<"\n";
}
}
int ultimoelemento(int a[MAX], int n)
{ int i,p = n;
if (p<MAX)
{
for(i=p;i<=n;i++) //ingresa nuevo elemento
{cout<<"\n Ingrese nuevo elemento de arreglo "<<":\t";
cin>>a[i];
}
n=n+1;
return n;
}
}
void main()
{
int A[MAX];
int num,elem;
num=leenum();
ingresadatos(A,num); cout<<"\n";
mostrar(A,num); cout<<"\n";
elem=ultimoelemento(A, num);
mostrar(A,elem);
}
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


void mostrar(int V[MAX], int n)
{
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=0;i<=n-1;i++)
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t";
cout<<V[i]; cout<<"\n";
}
}
int posicion(int a[MAX], int n)
{int i,p;
cout<<"\n Ingrese posicion a insertar un elemento"<<":\t"; cin>>p;
i=n-1;
while (i>=p)
{
a[i+1]=a[i];
i=i-1;
}
return p;
}
int nuevoelemento(int a[MAX],int p, int n)
{
int elem;
cout<<"\n Ingrese nuevo elemento de arreglo a"<<":\t";
cin>>elem;
a[p]=elem;
n=n+1;
return n;
}
void main()
{
int A[MAX];
int num,pos,elem;
num=leenum();
ingresadatos(A,num);
cout<<"\n";
mostrar(A,num);
cout<<"\n";
pos=posicion(A,num);
elem=nuevoelemento(A,pos, num);
mostrar(A,elem);
}

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 mostrar(int V[MAX], int n)


{
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=0;i<n;i++)
{
cout<<"Elemento"<<"["<<i<<"]"<<":\t";
cout<<V[i]; cout<<"\n";
}
}
int elimina(int a[MAX], int n)
{int i,p;
cout<<"\n Ingrese posicion a eliminar elemento de arreglo "<<":\t";
cin>>p;
i=p;
while (i<n)
{
a[i]=a[i+1];
i++;
}
return n-1;
}
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);
}

8.2 Bsqueda de Arreglos Unidimensionales


La bsqueda es la recuperacin de la informacin de los elementos de un arreglo. Para ello se
necesita recorrer el arreglo y hacer uso de uno de los mtodos de bsqueda de un elemento tales
como: Bsqueda Secuencial Bsqueda Binaria.

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
void bsecuencial(int a[MAX], int n)
{ int elem,i; bool Encontrado = false;
cout<<"\n Ingrese elemento a buscar en el arreglo "<<":\t"; cin>>elem;
for(i=1;i<=n;i++)
{ if(a[i]==elem)
{ Encontrado=true;
cout<<"\n Encontrado\t Posicion :\t"<<i<<"\t\n";
}
}
if(Encontrado==false)
{
cout<<"\n No Encontrado\t "; cout<<"\n\n";
}
}
void main()
{int A[MAX]; int num;
num=leenum();
ingresadatos(A,num); cout<<"\n";
mostrar(A,num); cout<<"\n";
bsecuencial(A,num);
}

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

void bbinaria(int a[MAX], int n)


{
int elem; int BAJO, ALTO, CENTRAL; BAJO=1; ALTO=n;
cout<<"\n Ingrese elemento a buscar"<<":\t"; cin>>elem;
CENTRAL=((BAJO+ALTO)/2);
while ((BAJO<=ALTO) && (a[CENTRAL]!=elem))
{
if(elem<a[CENTRAL])
{ALTO=CENTRAL-1;
CENTRAL=(BAJO+ALTO)/2;
}
else{
BAJO=CENTRAL+1;
CENTRAL=(BAJO+ALTO)/2;
}
}
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);
}
8.3 Ordenacin de Arreglos Unidimensionales
Permite comparar elementos e intercambiar posiciones, ya sea en forma ascendente o
descendente.

//Ordenacion por Burbuja


#include<iostream>
#define MAX 100
using namespace std;
//Se entiende que se realizan los procedimientos de lectura de datos
void burbuja(int a[MAX], int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=n-1;j>=i+1;j--)
if (a[j]<a[j-1])
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
void main()
{int A[MAX];
int num;
num=leenum();
ingresadatos(A,num); cout<<"\n\n";
burbuja(A,num);
mostrar(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:

15

12

12

45

22
7

n1=6

n2=7

elem=3

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];
}
}
int separacion(int VA[MAX],int na,int VB[MAX],int nb,int VC[MAX])
{
int i,j;
int k=0, ban=0;
//busqueda de arreglos
for(i=0;i<na;i++)
{for(j=0;j<nb;j++)
if(VA[i]==VB[j])
{
ban=1;
break;
}
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:

15

12

45

22

7
n1=6
Solucin:
#include<iostream>
#define MAX 100
using namespace std;

n2=7

elem=3

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]; }
}
int interseccion(int VA[MAX],int na,int VB[MAX],int nb,int VC[MAX])
{
int i,j;
int k=0;
//busqueda de arreglos
for(i=0;i<na;i++)
{
for(j=0;j<nb;j++)
if(VA[i]==VB[j])
{ VC[k]=VA[i];
k++;
}
}
return k;
}
Pg. 49

Asignatura: Algoritmia y Estructura de Datos


void mostrar(int V[MAX], int n, char titu[20])
{
int i;
cout<<"Los elementos del arreglo "<<titu;cout<<" son:"; cout<<"\n";
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=interseccion(A,na,B,nb,C);
mostrar(C,elem,"Arreglo C");
}

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
ARRAY

1
10.6

3.4

2
9

3
2.3

4
5

5
4.5

3. Leer las edades de n personas y reportar:


a. Cuantas edades son menores a 10.
b. Cuantas edades son mayores iguales a 10 y menores a 20.
c.

Cuantas edades son mayores iguales a 20 y menores a 30.

d. Cuantas edades son mayores iguales a 30 y menores a 40.


e. Cuantas edades son mayores iguales a 40 y menores a 50.
4. Ingresar n pesos (kg.) de personas a un arreglo, insertar un nuevo peso de una persona
en la posicin 4.
5. Aadir dos elementos al final del arreglo, modificando el algoritmo de aadir un elemento
al final.
6. Dado un arreglo de tamao 100, y de n= 10 elementos, eliminar el elemento de la posicin
6 e insertar el valor de 50 en una posicin cualquiera.
7. Dado un arreglo de n elementos, aadir un elemento al final y luego eliminar el segundo
elemento de todo el arreglo.
8. Dado un arreglo de n elementos, buscar un elemento y solo si se encontr, indicar la
posicin encontrada y aadir el valor encontrado al final del arreglo, y mostrar.
9. Crear un mdulo de programa donde se ingrese como algunos de sus argumentos dos
Arreglos A y B, con n y m elementos respectivamente, y sumar los valores de las
posiciones impares de A con los valores de las posiciones pares de B.
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.

Tema N 9: Arreglos Bidimensionales


Tambin llamado matrices, es un conjunto finito y ordenado de elementos de un mismo tipo de
dato. La definicin de un arreglo es como sigue:
TipoDato
Ejm.

NombreMatriz[nfilas][ncolumnas]

Entero

M[4][5]
columnas

0
filas

0
1
2
3

Para declarar un arreglo bidimensional en lenguaje C++ se sigue la siguiente sintaxis:


Tipo de Dato Nombre del arreglo [# filas] [# columnas];
Lectura y Presentacin de Datos en una Matriz:
#include<iostream>
#define MAX 100
using namespace std;
int leenum()
{int num;
do{ cin>>num; cout<<"\n";
}while(num<=0 || num>MAX);
return num;
}
void ingresadatos(int M[MAX][MAX], int nf,int nc)
{int i,j;
cout<<"Ingrese elementos para la matriz "; cout<<"\n";
for(i=0;i<=nf-1;i++)
for(j=0;j<=nc-1;j++)
{ cout<<"Elemento ["<<i<<"]"<<"["<<j<<"]"<<":";
cin>>M[i][j];
}
}
void mostrar(int M[MAX][MAX], int nf, int nc)
{int i,j;
cout<<"Los elementos de la matriz son"; cout<<"\n";
for(i=0;i<=nf-1;i++)
{for(j=0;j<=nc-1;j++)
{ cout<<M[i][j]; cout<<"\t";
}
cout<<"\n";
}
}
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";
}

//El mayor elemento de una matriz


.. //Se entiende que se realizan los procedimientos de lectura de datos
void mayor(int M[MAX][MAX], int nf, int nc)
{
int i,j,mayor;
mayor =M[0][0];
for(i=0;i<=nf-1;i++)
for(j=0;j<=nc-1;j++)
if (M[i][j]>mayor)
mayor=M[i][j];
cout<<"\n"; cout<<"El nmero mayor es: "<<mayor; cout<<"\n";
}
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";
mayor(B,nf,nc);
}
//Diagonal Principal y Diagonales de una matriz
.. //Se entiende que se realizan los procedimientos de lectura de datos
void diagonal_principal(int M[MAX][MAX], int nf, int nc)
{int i,j;
if(nf==nc)
{ for(i=0;i<=nf-1;i++)
{ for(j=0;j<=nc-1;j++)
if(i==j)
{ cout<<"\n"; cout<<M[i][j]<<"\n";
}
else
cout<<" ";
cout<<"\n";
}
}
else
{cout<<"Columnas y filas deben ser iguales"; cout<<"\n\n";
}

Pg. 52

Asignatura: Algoritmia y Estructura de Datos


void diagonalsecundaria(int M[MAX][MAX], int nf, int nc)
{ int i,j,k;
k=nc-1;
if(nf==nc)
{
for(i=0;i<nf;i++)
{for(j=0;j<nc;j++)
if(j == k)
{ cout<<M[i][j]; }
else
cout<<"\t";
k--;
cout<<"\n";
}
}
else
{ cout<<"Para la Diagonales: columnas y filas deben ser
iguales";
cout<<"\n\n";
}
}
void diagonales(int M[MAX][MAX], int nf, int nc)
{ int i,j,k;
k=nc-1;
if(nf==nc)
{for(i=0;i<=nf-1;i++)
{ for(j=0;j<=nc-1;j++)
if(i==j || j==k)
{ cout<<"\n"; cout<<M[i][j]<<"\n";
}
else
{cout<<" ";}
k--;
cout<<"\n";
}
}
else
{ cout<<"Columnas y filas deben ser iguales"; cout<<"\n\n"; }
}
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";
cout<<"Los elementos de la diagonal Principal: "<<"\n";
diagonal_principal(B,nf,nc); cout<<"\n";
cout<<"Los elementos de las diagonales : "<<"\n";
diagonales(B,nf,nc); cout<<"\n";
}

Pg. 53

Asignatura: Algoritmia y Estructura de Datos


9.1 Actualizacin de Arreglos Bidimensionales

//Insertar fila y columna de una matriz


//Se entiende que se realizan los procedimientos de lectura de datos
int insertar_fila(int M[MAX][MAX], int nf, int nc)
{ int i,j,pos;
do{ cout<<"Ingrese posicion para insertar fila: ";
cin>>pos;
}while(pos<0 || pos>nf);
for(i=nf-1;i>=pos;i--)
for(j=0;j<=nc-1;j++)
M[i+1][j]=M[i][j];
for(j=0;j<=nc-1;j++)
{
cout<<"M["<<pos<<"]"<<"["<<j<<"] : ";
cin>>M[pos][j];
}
nf++;
return nf;
}
int insertar_columna(int M[MAX][MAX], int nf, int nc)
{int i,j,pos;
do{ cout<<"Ingrese posicion para insertar columna: ";
cin>>pos;
}while(pos<0 || pos>nc);
for(i=0;i<=nf-1;i++)
for(j=nc-1;j>=pos;j--)
M[i][j+1]=M[i][j];
for(i=0;i<=nf-1;i++)
{ cout<<"M["<<i<<"]"<<"["<<pos<<"] : ";
cin>>M[i][pos];
}
nc++;
return nc;
}
void main()
{ int B[MAX][MAX];
int nf,nc,fil,col;
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";

cout<<"Inserta fila: "<<"\n";


fil=insertar_fila(B,nf,nc); cout<<"\n";
cout<<"Matriz Inicial con fila insertada";
mostrar(B,fil,nc); cout<<"\n";
cout<<"Inserta columna: "<<"\n";
col=insertar_columna(B,nf,nc); cout<<"\n";
cout<<"Matriz Inicial con columna insertada";
mostrar(B,nf,col); cout<<"\n";
}
Pg. 54

Asignatura: Algoritmia y Estructura de Datos


//Borrar fila y columna de una matriz
.. //Se entiende que se realizan los procedimientos de lectura de datos
int borrar_fila(int M[MAX][MAX], int nf, int nc)
{ int i,j,pos;
do{ cout<<"Ingrese posicion para borrar fila: ";
cin>>pos;
}while(pos<0 || pos>=nf);
for(i=pos;i<=nf-1;i++)
for(j=0;j<=nc-1;j++)
M[i][j]=M[i+1][j];
nf--;
return nf;
}
int borrar_columna(int M[MAX][MAX], int nf, int nc)
{ int i,j,pos;
do{ cout<<"Ingrese posicion para insertar columna: ";
cin>>pos;
}while(pos<0 || pos>=nc);
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;
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";
cout<<"Elimina fila: "<<"\n";
fil=borrar_fila(B,nf,nc); cout<<"\n";
cout<<"Matriz Inicial con fila eliminada";
mostrar(B,fil,nc); cout<<"\n";
cout<<"Elimina columna: "<<"\n";
col=borrar_columna(B,nf,nc); cout<<"\n";
cout<<"Matriz Inicial con columna eliminada";
mostrar(B,nf,col); cout<<"\n";
}

Pg. 55

Asignatura: Algoritmia y Estructura de Datos


9.2 Aplicacin de Arreglos Bidimensionales

1. Imprimir lo nmeros que rodean a un nmero X, la primera vez que se encuentra en la Matriz
incluido el nmero X:

-6

Solucin:
.. //Se entiende que se realizan los procedimientos de lectura de datos
void rodean(int M[MAX][MAX], int nf, int nc,int n)
{int i,j;
int f,c;
int ban=0;
for(i=0;i<=nf-1;i++)
for(j=0;j<=nc-1;j++)
if( M[i][j]==n && ban==0)
{
f=i;
c=j;
ban=1;
}
if (ban==1)
{cout<<"Los Numeros que rodean son: \n";
for(i=0;i<=nf-1;i++)
{for(j=0;j<=nc-1;j++)
if((i>=f-1 && i<=f+1) && (j>=c-1 && j<=c+1))
cout<<M[i][j]<<"\t";
else
cout<<" ";
cout<<"\n";
}
}
else
cout<<"El numero ingresado no existe";
}
void main()
{int B[MAX][MAX];
int nf,nc,num;
cout<<"Ingrese numero de filas
nf=leenum();

";

cout<<"Ingrese numero de columnas


nc=leenum();

";

ingresadatos(B,nf,nc); cout<<"\n";
cout<<"Ingrese el numero a buscar
cin>>num;
rodean(B,nf,nc,num); 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

-5

-3

0
1

-5

-3

1
9

1
N = 3, se
imprime la
columna 3

-3
2
0

2
7

1
N = 2, se
imprime la fila 2
y la columna 2

-3

Solucin:
.. //Se entiende que se realizan los procedimientos de lectura de datos
void seleccion(int M[MAX][MAX], int nf, int nc)
{
int i,j,n;
do{
cout<<"Ingrese valor de N: ";
cin>>n;
}while(n<0 || (n>=nf && n>=nc));
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;
cout<<"Ingrese N filas
nf=leenum();

";

cout<<"Ingrese N columnas
nc=leenum();

";

ingresadatos(B,nf,nc);cout<<"\n";
seleccion(B,nf,nc);cout<<"\n";
}
Pg. 57

Asignatura: Algoritmia y Estructura de Datos


3. Invertir Diagonal Principal de una Matriz:

.. //Se entiende que se realizan los procedimientos de lectura de datos


void mostrar(int M[MAX][MAX], int nf, int nc)
{
int i,j;
cout<<"Los elementos de la Matriz son";
cout<<"\n";
for(i=0;i<=nf-1;i++)
{ for(j=0;j<=nc-1;j++)
{ cout<<M[i][j];cout<<"\t";
}
cout<<"\n";
}
}
void invierte_principal(int M[MAX][MAX], int nf, int nc)
{
int i,k,temp;
if( nf==nc )
{
k=nf-1;
for(i=0;i<nf/2;i++)
{
temp=M[i][i];
M[i][i]=M[k][k];
M[k][k]=temp;
k--;
}
}
else cout<<"No es Posible";
}
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";
cout<<"Diagonal Principal Invertida";
invierte_principal(B,nf,nc);
mostrar(B,nf,nc); cout<<"\n";
}

4. Intercambiar Filas por Columnas (Matriz Transpuesta)

-1

-1

Pg. 58

Asignatura: Algoritmia y Estructura de Datos


//Se entiende que se realizan los procedimientos de lectura de datos
void mostrar(int M[MAX][MAX], int nf, int nc)
{
int i,j;
cout<<"Los elementos de la Matriz son";
cout<<"\n";
for(i=0;i<=nf-1;i++)
{ for(j=0;j<=nc-1;j++)
{ cout<<M[i][j];cout<<"\t";
}
cout<<"\n";
}
}
void transpuesta(int M[MAX][MAX], int nf, int nc,int T[MAX][MAX])
{
int i,j;
for(i=0;i<=nf-1;i++)
for(j=0;j<=nc-1;j++)
{ T[j][i]=M[i][j];
}
}
void main()
{ int B[MAX][MAX],T[MAX][MAX];
int nf,nc,ft,ct,temp;
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";
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

Tema N 10: Registro (Estructura)


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

nombre

edad

Talla

sexo

(cadena)

(int)

(float)

(char)

Cada componente de la estructura se denomina campo.


Podemos darle una variable:

Declaracin:

struct nombre{
char f[5];
char e[3];
int s;
char a;
};

Datos afines
respecto a la
estructura.

struct {
char f[5];
char e[3];
int s;
char a;
}nomb_variable;

Ejemplo:
#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{
char nombre[30];
char calle[30];
int num;
char ciudad[20];
};
typedef struct domicilio;
void main( )
{
domicilio Oficina, casa;
}

Se puede hacer todo lo anterior de esta forma (definiendo


la estructura y creando el tipo a la vez):
typedef struct{
char nombre[25];
char apellidos[50];
char dni[10];
int edad;
}Persona;
void main( )
{ 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";
}
Mdulos de Programa y Estructuras
#include<iostream>
#include<string>
using namespace std;
typedef struct{
char nombre[25];
char apellidos[50];
int edad;
} Persona;
void subirEdad(Persona pers)
{
pers.edad++;
cout<<pers.edad;cout<<"\n";
}
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";
subirEdad(alumno); // Invoca al mdulo procedimiento
}

Pg. 62

Asignatura: Algoritmia y Estructura de Datos


Ejemplo de Invocacin de una Estructura en Otra:
Utilizar estructuras anidadas: una para fecha con da, mes y ao; y otra para persona, la cual se
invocar como inscrito y tiene nombres, apellidos, nacimiento (que es del tipo fecha), y sexo.
Reportar los datos ingresados.
#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;
cout<<"\n\n-----Fecha de Nacimiento----- \n\n";
cout<<"Ingrese dia \t";
cin>>inscrito.fnacimiento.dia;
cout<<"Ingrese mes \t";
cin>>inscrito.fnacimiento.mes;
cout<<"Ingrese ao \t";
cin>>inscrito.fnacimiento.anual;
cout<<"Ingrese sexo \t";
cin>>inscrito.sexo;
cout<<"\n\n----Los Datos ingresados fueron----- \n\n";
cout<<inscrito.nombres<<"\n";
cout<<inscrito.apellidos<<"\n";
cout<<inscrito.fnacimiento.dia<<"\n";
cout<<inscrito.fnacimiento.mes<<"\n";
cout<<inscrito.fnacimiento.anual<<"\n";
cout<<inscrito.sexo<<"\n\n";
}

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

Tema N 11: Union


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.

Entonces

Ejemplo:
struct tabla {
char nombre[30];
char tipo;
char cadena[5];
int entero;

Si tipo es c , se
utiliza cadena, pero
si es e , se utiliza
entero.

};

struct tabla{
char nombre[30];
char tipo;
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.

Tema N 12: Tipos de Datos Abstractos (TDA)


Es un tipo de dato definido por el programador, que consta de datos y operaciones.
Ejm: clases, listas, pilas, colas.

TDA = Representacin (datos) + Operaciones (funciones y procedimientos)


class alumno
{
private:
string nombre;
string carrera;

alumno

nombre
carrera

public:
alumno();
~alumno();
void ingresar();
void imprimir();
};

ingresar
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

Tema N 13: Clases y Programacin Orientada a Objetos


Es una tcnica o estilo de programacin basada en elementos bsicos llamados objetos.
Objeto: Es una entidad que se caracteriza por determinados atributos llamados datos miembro y
por ciertas funciones denominados funciones miembro o mtodos que permiten su manipulacin.
Clase: Una clase es la definicin formal de los atributos y funciones miembro de un conjunto de
objetos que se realiza en un programa.
class < nombre de la clase >
{ < private:/public: >
tipodato atributo;
tipodato atributo;
tipodato atributo;
< private:/public: >
Funcion/procedimiento();
Funcion/procedimiento();
Funcion/procedimiento();
};
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


Ejemplo de Programa Orientado a Objetos
#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


Tema N 14: Punteros a Direccin de Memoria
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

p es una variable tipo puntero.


x es una variable tipo int apuntada por p.

14.1 Declaracin de variables tipo puntero

tipo de dato apuntado * variable tipo puntero:

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.

Para hacer referencia a la variable apuntada se usa la notacin:

*variable tipo puntero

Ejemplo:
MEMORIA

200
p 800
800
x 23
*p

*p es otro nombre para la variable x

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:

& nombre de variable


Ejemplo:
#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
}

Creacin de variables dinmicas


Para crear variables dinmicas se usa el objeto new cuya sintaxis es la siguiente:

variable de tipo
puntero

new

tipo de dato de la
variable creada

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;

Eliminacin de variables dinmicas

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

Tema N 15: Estructuras de Datos Dinmicas


15.1 Lista Enlazada Simple

Una lista enlazada es una estructura de datos dinmica formada por un conjunto de elementos
llamados nodos.
Cada nodo consta de dos partes:

- Una que contiene el dato.


- Otra que contiene la direccin del siguiente nodo.
Nodo

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.

Representacin Grfica de una Lista Enlazada

Lista
12

30

21

54
NULL

9.1 Listas Simplemente Enlazadas

Es un conjunto de elementos en los que cada elemento contiene la posicin o direccin del sgte.
campo de la Lista.
Lista
NULL
Donde cada elemento de la lista simplemente enlazada llamado nodo se define:
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;
};
typedef nodo *pnodo;
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 alumno con codigo";
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";
}
}
}
pnodo lista::buscar_despues(int valor)
{
pnodo pos;
int ban=0;
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;

}
}
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


cout<<"\n2 insertar al final";
cout<<"\n3 insertar despues del nmero";
cout<<"\n4 Eliminar al inicio";
cout<<"\n5 Eliminar al final";
cout<<"\n6 Eliminar Lista";
cout<<"\n7 Buscar en lista";
cout<<"\n8 Buscar Anterior en lista";
cout<<"\n9 Visualizar lista";
cout<<"\n10 Salir";
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);
}

15.2 Lista Enlazada Circular


Una Lista Enlazada Circular ( LEC ) es un conjunto de nodos. Cada nodo es un registro que tiene
dos campos: Un campo para almacenar informacin de algn tipo de dato y otro campo tipo
puntero que contiene la direccin del nodo siguiente.
La particularidad que presenta una Lista Enlazada Circular es que el ltimo nodo de la lista no
contiene NULO en su campo sig sino la direccin del primer nodo, lo que le da la caracterstica
circular a la lista.
Para tener acceso a la lista es necesario un puntero Lc que contenga la direccin del primer nodo.

ListaC
12

30

21

54

15.3 Lista Enlazada Doble


Una Lista Doblemente Enlazada ( LDE ) es un conjunto de nodos.
Cada nodo es un registro que tiene tres campos: Un campo para almacenar informacin de algn
tipo de dato y dos campos tipo puntero que contienen las direcciones de los nodos anterior y
siguiente respectivamente.

ant

dato

sig

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

En una cola se definen dos operaciones:


Encolar: insertar un nuevo elemento al final de la cola
Desencolar: eliminar el elemento del comienzo de la cola

Pg. 77

Asignatura: Algoritmia y Estructura de Datos


Cola.h
#include <iostream>
using namespace std;
struct nodo
{
int dato;
nodo *sig;
};
typedef nodo *pnodo;
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

En una pila slo estn permitidas dos operaciones:


Apilar: Insertar un elemento por el lado de la cima
Desapilar: Eliminar el elemento de la cima de la pila

Pila.h
#include<iostream>
using namespace std;
struct nodo
{
int dato;
nodo *sig;
};
typedef nodo *pnodo;
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.

Tema N 16: Estructuras de Datos Dinmicas


16.1 rbol General
Un rbol es un conjunto de nodos, en el que existe un nodo distinguido llamado Raz y cero o ms
subrboles, cada uno de los cuales tiene su raz conectada a la raz por medio de una arista.

Ejemplo:
A

Pg. 82

Asignatura: Algoritmia y Estructura de Datos


Conceptos Bsicos sobre rboles
Hoja: Todo nodo que no tiene hijos.
Ejemplo:

B, C, H, I, P, Q, K, L, M, N

Peso del rbol: Cantidad de Hojas.


Ejemplo: 10
Camino: Enlace entre dos nodos consecutivos y rama es un camino que termina en hoja.
camino ( A , Q ) = A E J Q

Ejemplo:

Longitud del camino: Es la cantidad de aristas que conforman un camino.


Ejemplo:

longitud_camino ( A , Q ) = 3

Nivel: Cada nodo tiene asociado un nivel, determinado por la logintud de camino desde la raiz
hasta el nodo especifico.
Ejemplo:
Nivel 0

Nivel 1

B,C,D,E,F,G

Nivel 2

H,I,J,K,L,M,N

Nivel 3

P,Q

Profundidad de un rbol: Es el numero mximo de nodos en una rama. Es decir nivel mas alto
de los nodos ms uno.
Ejemplo:
profundidad = nivel +1
profundidad = 3 +1 = 4
Representacin Primer Hijo Siguiente Hermano

Cada nodo del rbol solo tiene dos punteros, uno para apuntar a su primer hijo y otro para apuntar
a su siguiente hermano.

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


void arbol::mostrar(pnodo aux)
{pnodo aux2,aux3;
//usando recursion para mostrar
if(aux==rpri)
{
cout<<aux->dato;
cout<<endl<<"|";
cout<<endl<<"v"<<endl;
aux2=aux->hijo;
arbol::mostrar(aux2);
}
else
{
if(aux==NULL)
cout<<"NULL";
else
{
cout<<aux->dato;
cout<<"->";
aux2=aux->her;
if(aux2!=NULL)
arbol::mostrar(aux2);
else
arbol::mostrar(aux2);
aux3=aux->hijo;
cout<<endl<<"|";
cout<<endl<<"v"<<endl;
if(aux3!=NULL)
arbol::mostrar(aux3);
else
arbol::mostrar(aux3);
}
}
}
void arbol::inserta_principal()
{ rpri = new nodo;
cout<<"\t Ingresar la raiz: ";
cin>>rpri->dato;
cout<<endl;
rpri->hijo=NULL;
}
void arbol::inserta_hijo()
{nodo *hij,*pos=NULL;
int num;
hij=new nodo;
cout<<"-- ***De que nodo desea que sea el hijo: ";
cin>>num;
pos=buscar(rpri,pos,num);
if(pos==NULL)
cout<<"\t--** Arbol vacio o no se encontro nodo **--";
else
{ if(pos->hijo==NULL) //esto debe estar en separata
{ cout<<"\t Ingrese nro a insertar: ";
cin>>hij->dato;
pos->hijo=hij;
hij->her=NULL;
hij->hijo=NULL;
}
else //esto debe estar en separata
cout<<"***--NO SE PUEDE INGRESAR UN HIJO. DEBE INGRESAR COMO
HERMANO --***"<<endl;
}
}

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;
cout<<"\t Insertar raiz principal"<<endl;
p.inserta_principal();
band=true;
do{
if(band==true)
{
// cout<<p.rpri ;
cout<<"\t -------****** MENU ******------"<<endl<<endl;
cout<<"\t 1 -> insertar hijo"<<endl;
cout<<"\t 2 -> insertar hermano"<<endl;
cout<<"\t 3 -> Visualizar Arbol"<<endl;
cout<<"\t 4 -> Salir"<<endl;
do
{
cout<<"\t Seleccione opcion: ";
cin>>opc;
}while(opc>4);
switch(opc)
{
case 1:p.inserta_hijo();break;
case 2:p.inserta_hermano();break;
case 3:p.mostrar(p.rpri);break; //cambiar a
p.rpri para recursividad de mostrar
}
}
else
cout<<"Debe insertar la raiz";
} while(opc!=4);
}

Pg. 86

Asignatura: Algoritmia y Estructura de Datos


16.2 rbol Binario
Un rbol Binario es aquel en el que cada uno de sus nodos puede tener 0, 1 o 2 hijos.
Raiz

Subarbol
Izquierdo

Subarbol
Derecho

Ejemplo:
A

Recorrido de rboles Binarios


a) Recorrido en Orden
Recorrer el subrbol izquierdo en orden
Visitar el nodo raz
Recorrer el subrbol derecho en orden
b) Recorrido en Pre-Orden
Visitar el nodo raz
Recorrer el subrbol izquierdo en pre-orden
Recorrer el subrbol derecho en pre-orden
c) Recorrido en Post-Orden
Recorrer el subrbol izquierdo en post-orden
Recorrer el subrbol derecho en post-orden
Visitar el nodo raz

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.

Ejemplo:

(a^(b*c)) +((d*e)f )/g)


+
/

^
a

*
b

*
d

Pg. 87

Asignatura: Algoritmia y Estructura de Datos

16.3 rboles Binarios de Bsqueda ( ABB )


Un ABB es un rbol binario en el que para todos sus nodos ( excepto sus hojas ) se cumple que
el dato almacenado en l, es mayor a todos los datos de los nodos del subrbol izquierdo pero
menor a todos los datos de los nodos del subrbol derecho.
Ejemplo:
6

10

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;
};
typedef nodoABB *pnodoABB;
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;
}
pnodoABB abb::buscar( int x )
{
pnodoABB p; int ok;
if ( praiz == NULL )
return NULL;
else
{
ok = 0;
p = praiz;
while ( p != NULL && ok == 0 )
if ( (*p).dato == x )
ok = 1;
else
if ( x < (*p).dato )
p = (*p).hizq;
else
p = (*p).hder;
return p;
}
}
void abb::insertar( int x )
{
pnodoABB p,q,r,pos;
char h;
p = new nodoABB;
(*p).dato = x;
(*p).hizq = NULL;
(*p).hder = NULL;
if ( praiz == NULL )
praiz = p;
else
{
pos=buscar(x);
if(pos!=NULL)
cout<<"Elemento ya existe";
else
{
q = praiz;
while ( q != NULL )
{
r = q;
if ( x < (*q).dato )
{
q = (*q).hizq;
h = 'i';
}
else
{
q = (*q).hder;
h = 'd';
}
}
if ( h == 'i' )
(*r).hizq = p;
else
(*r).hder = p;
}
}
}

Pg. 89

Asignatura: Algoritmia y Estructura de Datos

void abb::imprimeenorden( pnodoABB p )


{
pnodoABB Ai,Ad;
if ( p != NULL )
{
Ai = (*p).hizq;
Ad = (*p).hder;
imprimeenorden(Ai);
cout<<(*p).dato<<" ";
imprimeenorden(Ad);
}
}
void abb::imprimepreorden( pnodoABB p )
{
pnodoABB Ai,Ad;
if ( p != NULL )
{
Ai = (*p).hizq;
Ad = (*p).hder;
cout<<(*p).dato<<" ";
imprimepreorden(Ai);
imprimepreorden(Ad);
}
}
void abb::imprimepostorden( pnodoABB p )
{
pnodoABB Ai,Ad;
if ( p != NULL )
{
Ai = (*p).hizq;
Ad = (*p).hder;
imprimepostorden(Ai);
imprimepostorden(Ad);
cout<<(*p).dato<<" ";
}
}
void abb::eliminaarbol( pnodoABB p )
{
pnodoABB Ai,Ad;
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

1. Exponer la prueba de escritorio de los mdulos de programa para la estructura de dato


rbol binario.

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

Tema N 17: Archivos (Ficheros)


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

CAMPO: El campo es la unidad minima de informacin de un registro. Es un item de campos


elementales como nombre, numero de empleados, ciudad, etc. Los caracteres se agrupan en
campos de datos. Se caracteriza por su tamano o longitud y su tipo de dato, por lo general se
supone como longitud fija.
Ejemplo:

Campos
Nombre

Direccion

FechaNacimiento

Los datos contenidos en un campo pueden dividirse en subcampos.


Ejemplo para el campo fecha:
0

7
Dia

4
Mes

Ano

REGISTRO: Es una coleccin de informacin por lo general relacionada a una entidad en


particular. Los registros organizados en campos se llaman registros lgicos.
Ejemplo:
Empleado

Nombre

Direccion

FechaNacimiento

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>

Declaracin de Variables de tipo "Fichero":


ifstream nombrefichero; // Para ficheros de entrada
ofstream nombrefichero; // Para ficheros de salida
Apertura de Ficheros de Texto:
(La lectura y la escritura en un archivo de texto se puede realizar directamente con los operadores
<< y >> al igual que se realiza sobre los flujos estndares cin y cout.
// Apertura para Lectura
in.open(nombrefichero);
// Apertura para Escritura(borra el contenido si lo hubiera)
out.open(nombrefichero);
// Apertura para aadir datos al final
out.open(nombrefichero,ios::app);
// Apertura para Lectura y Escritura
in.open(nombrefichero,ios::in|ios:: out);
// Apertura para Lectura y Escritura
out.open(nombrefichero,ios::in|ios:: out);
Apertura de Ficheros Binarios:
Tiene la informacin tal cual est en memoria, es decir, sin convertirla a texto, La manera de leer y
escribir en ficheros binarios consiste en utilizar las funciones read() y write().
// Apertura para Lectura
in.open(nombre,ios::binary);
// Apertura para Escritura(borra el contenido si lo hubiera)
out.open(nombre,ios::binary);
// Apertura para aadir datos al final
out.open(nombre,ios::binary| ios::app);
// Apertura para Lectura y Escritura
in.open(nombre, ios::binary |ios::in | ios:: out);
// Apertura para Lectura y Escritura
out.open(nombre, ios::binary |ios::in | ios:: out);
Cierre de ficheros.
Un fichero anteriormente abierto y con un descriptor asociado a l debe ser cerrado con el fin de
liberar los recursos asociados a l de la siguiente forma:
nombrefichero.close()

Pg. 94

Asignatura: Algoritmia y Estructura de Datos


Ejemplo 1: Crear Archivos1.cpp (para crear un fichero llamado ejemplo.txt)
#include<iostream>
#include <fstream>
using namespace std;
void main()
{
ofstream fichero("ejemplo.txt"); //Fichero de salida
fichero << "Hola" << endl;
fichero << "Adios" << endl;
fichero.close();
system("pause");
}

Deteccin de fin de fichero y otras funciones.


La funcin eof() que devuelve true si se ha alcanzado el final del fichero y falso en cualquier otro
caso.
Ejemplo2: Leer el archivo creado ejemplo.txt.
#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. Fundamentos de Programacin. 2da. ed. Espaa: McGraw-Hill;
2003.
Joyanes Aguilar, Luis. Estructura de Datos. 1ra. ed. Espaa: McGraw-Hill; 2000.
Raffo Lecca, Eduardo. Turbo C++. 1 ed. Lima: Mundigraph; 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
Cceres Gonzlez Abdiel E. Dr. Apuntes para el curso de Estructuras de datos en
C/C++ . ITESM-CCM: 2005. Disponible en http://bjcu.uca.edu.ni/LibrosIsti/estrdatos.pdf
Rodrguez Moreno, Pedro. El Lenguaje C (Programacin Avanzada). Sistemas de
Computacin I (IECI) Departamento de Sistemas de Informacin. Facultad de Ciencias
Empresariales.
Chile;
2005.
Disponible
en
http://www.face.ubiobio.cl/~prodrigu/sc1/Cap2-Lenguaje-C-(Programacion-Avanzada)part-1.pdf

Pg. 96

You might also like