Está en la página 1de 197

Algortmica para Programacin

Pg. 1

ALGORTMICA PARA PROGRAMACIN


I.

CONCEPTOS BSICOS DE ALGORTMICA


1.1 Algortmica
La algortmica consiste en el desarrollo de soluciones computacionales a los
diferentes problemas que se plantean en el desarrollo de un programa. Dichas
soluciones son independientes del lenguaje de programacin utilizado, puesto
que son resueltos en un nivel de abstraccin mayor. Muchas soluciones
algortmicas se basan en las diferentes estructuras de datos como apoyo
fundamental a la hora de resolver problemas.
1.2 Algoritmo
Un algoritmo es una secuencia de actividades para efectuar paso por paso algn
proceso. Es un mtodo que se realiza paso a paso para solucionar un problema
que termina en un nmero de finito de pasos.
Ejemplo:
Una receta de un libro de cocina
Realizar una operacin matemtica
Pasos para seguir un tramite documentario
1.3 Programacin de Computadoras
Es la ciencia que permite a una persona programar una computadora utilizando
un lenguaje para que resuelva tareas de manera rpida.
1.4 Programa de Computadora
Es una secuencia de instrucciones que indica las acciones o tareas que han de
ejecutarse en varias etapas para dar solucin a un problema determinado.
Etapa de Anlisis: entender el problema claramente
Etapa de solucin general: pseudocdigo, diagrama de flujo, diagrama de
bloques, etc.
Etapa de prueba: prueba escritorio
Etapa de implementacin especfica: codificar
Etapa de prueba: correccin
Etapa de uso.
1.5 Lenguaje de Programacin
Es un conjunto de reglas o normas smbolos y palabras especiales utilizadas
para construir un programa y con l, darle solucin a un problema determinado.
Es el intermedio entre la mquina y el usuario.
1.6 Niveles de los Lenguajes
Se clasifican en:
Lenguaje mquina: Eran diseados en cdigo binario.
Lenguaje de bajo nivel: Se utiliza el lenguaje ensamblador, utilizaba algunas
palabras claves.
Lenguaje de alto nivel: Se desarrollaron lenguajes de programacin.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 2

1.7 Niveles de los lenguajes de programacin


Depende de lenguaje de programacin:
Secuencial: Programas que se disean con instrucciones que van de unas
detrs de otras.
Estructurada: Programas que se hacen por mdulos, cada mdulo realiza
alguna tarea especfica.
Orientado a Objetos: Lenguajes que permiten la utilizacin de objetos
dentro del diseo del programa.
1.8 Pseudocdigo
El pseudocdigo describe un algoritmo utilizando una mezcla de frases en
lenguaje comn, instrucciones de programacin y palabras clave que definen las
estructuras bsicas. Su objetivo es permitir que el programador se centre en los
aspectos lgicos de la solucin a un problema.
1.9 Lenguaje de Programacin
Un Lenguaje de Programacin es aqul que es utilizado para escribir programas
de computadoras que puedan ser entendidos por ellas. Estos lenguajes se
clasifican en tres grandes categoras:
Lenguaje Mquina
Lenguaje de Bajo nivel (ensamblador)
Lenguaje de Alto nivel.
1.9.1 Lenguaje Mquina
Son aqullos que estn escritos en lenguajes directamente inteligibles por la
mquina (computadora), ya que sus instrucciones son cadenas binarias
(cadenas o series de caracteres de dgitos 0 y 1) que especifican una operacin y
las posiciones (direccin) de memoria implicadas en la operacin se denominan
instrucciones de mquina o cdigo mquina. El cdigo mquina es el conocido
cdigo binario.
Las instrucciones en lenguaje mquina dependen del hardware de la
computadora y, por tanto, diferirn de una computadora a otra.
Ventajas del Lenguaje Mquina
Posibilidad de cargar (transferir un programa a la memoria) sin necesidad de
traduccin posterior, lo que supone una velocidad de ejecucin superior a
cualquier otro lenguaje de programacin.
Desventajas del Lenguaje Mquina
Dificultad y lentitud en la codificacin.
Poca fiabilidad.
Gran dificultad para verificar y poner a punto los programas.
Los programas solo son ejecutables en el mismo procesador (CPU).
En la actualidad, las desventajas superan a las ventajas, lo que hace
prcticamente no recomendables a los lenguajes mquinas.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 3

1.9.2 Lenguajes de Bajo Nivel


Son ms fciles de utilizar que los lenguajes mquina, pero al igual que ellos,
dependen de la mquina en particular. El lenguaje de bajo nivel por excelencia
es el ensamblador. Las instrucciones en lenguaje ensamblador son
instrucciones conocidas como nemotcnicos. Por ejemplo, nemotcnicos
tpicos de operaciones aritmticas son: en ingls: ADD, SUB, DIV, etc.; en
espaol: SUM, RES, DIV, etc.
Una instruccin tpica de suma sera: ADD M, N, P
Esta instruccin significa "sumar el contenido en la posicin de memoria M al
nmero almacenado en la posicin de memoria N y situar el resultado en la
posicin de memoria P". Evidentemente es ms sencillo recordar la instruccin
anterior con un nemotcnico que su equivalente en cdigo mquina.
0110 1001 1010 1011
Un programa escrito en lenguaje ensamblador, requiere de una fase de
traduccin al lenguaje mquina para poder ser ejecutado directamente por la
computadora.
El programa original escrito en lenguaje ensamblador se denomina programa
fuente y el programa traducido en lenguaje mquina se conoce como programa
objeto, el cual ya es directamente entendible por la computadora.
Ventajas del lenguaje ensamblador frente al lenguaje mquina
Mayor facilidad de codificacin y, en general, su velocidad de clculo.
Desventajas del lenguaje ensamblador
Dependencia total de la mquina lo que impide la transportabilidad de
los programas (posibilidad de ejecutar un programa en diferentes
mquinas. El lenguaje ensamblador del PC es distinto del lenguaje
ensamblador del Apple Machintosh.
La formacin de los programadores es ms compleja que la
correspondiente a los programadores de alto nivel, ya que exige no solo
las tcnicas de programacin, sino tambin el conocimiento del interior
de la mquina.
Los lenguajes ensamblador tienen sus aplicaciones muy reducidas, se
centran bsicamente en aplicaciones de tiempo real, control de procesos
y de dispositivos electrnicos.
1.9.3 Lenguajes de Alto Nivel
Estos lenguajes son los ms utilizados por los programadores. Estn diseados
para que las personas escriban y entiendan los programas de un modo mucho
ms fcil que los lenguajes mquina y ensambladores. Un programa escrito en
lenguaje de alto nivel es independiente de la mquina (las instrucciones no
dependen del diseo del hardware o de una computadora en particular), por lo
que estos programas son portables o transportables. Los programas escritos en
lenguaje de alto nivel pueden ser ejecutados con poca o ninguna modificacin en
diferentes tipos de computadoras.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 4

Ventajas de los lenguajes de alto nivel


El tiempo de formacin de los programadores es relativamente corto
comparado con otros lenguajes.
La escritura de programas se basa en reglas sintcticas similares a los
lenguajes humanos. Nombres de las instrucciones tales como READ,
WRITE, PRINT, OPEN, etc.
Las modificaciones y puestas a punto de los programas son ms fciles.
Reduccin del coste de los programas.
Transportabilidad.
Desventajas de los lenguajes de alto nivel
Incremento del tiempo de puesta a punto al necesitarse diferentes
traducciones del programa fuente para conseguir el programa definitivo.
No se aprovechan los recursos internos de la mquina que se explotan
mucho mejor en lenguajes mquina y ensambladores.
Aumento de la ocupacin de memoria.
El tiempo de ejecucin de los programas es mucho mayor.
Para una mejor compresin de este tema se definir el concepto de
programa, por ser este un trmino muy utilizado en el diseo
estructurado de algoritmos.
1.10 Tipos de Programacin
Dependiendo del lenguaje de programacin que se elija, se puede hablar del
tipo de programacin que se va a realizar.
Secuencial: Se considera programacin secuencial a los programas que se
disean con instrucciones que van unas detrs de otras. Las lneas se
ejecutan una a una en secuencia. Ejemplos tales como Basic, Cobol.
Estructurada: Se considera programacin estructurada a la programacin
que se hace por mdulos. Cada mdulo realiza alguna tarea especfica y
cuando se necesite esa tarea simplemente se hace el llamado a ese mdulo
independiente de que se tengan que ejecutar los dems. Ejemplos tales como:
Turbo PASCAL, C, Modula, Ada.
Orientada a Objetos: Se considera programacin orientada a objetos
aquellos lenguajes que permiten la utilizacin de objetos dentro del diseo del
programa y el usuario puede pegar a cada objeto cdigo de programa.
Ejemplos de estos lenguajes se pueden mencionar el Visual Basic o Visual C de
la Microsoft, C Builder de la Borland Internacional, Java, Xml entre otros.
Lgica o de lenguaje natural: Son aquellos programas que se disean
con interfaces tal que la persona o usuario puede ordenar a la mquina tareas
en un lenguaje natural. Pueden interactu ar como una persona pero nunca
llegan a producir conocimiento. Ejemplo como Prolog (Programming
Logic).
Estos lenguajes se desarrollaron con base en las estructuras de
sus antecesores. Recorren o navegan las bases de datos obedeciendo a reglas.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 5

Inteligencia Artificial: Los programas de inteligencia artificial Son programas


que se acercan a la inteligencia humana. Estos programas son capaces de
desarrollar conocimiento. Este tipo de lenguajes trabajan similar a la mente
humana.
1.11 Historia y Aplicacin de los Lenguajes Algortmicos
Al igual que los idiomas sirven de vehculo de comunicacin entre los seres
humanos, existen lenguajes que realizan la comunicacin entre los seres
humanos y las computadoras. Estos lenguajes permiten expresar los programas
o el conjunto de instrucciones que el operador humano desea que la
computadora ejecute.
Los lenguajes de computadoras toman diferentes formas; los de las primeras
computadoras, como la ENIAC y la EDSAC, se componan en el lenguaje real de
las mquinas mismas. La dificultad de programar las mquinas de esta manera
limitaba drsticamente su utilidad y proporcionaba un fuerte incentivo para que
se desarrollaran lenguajes de programacin ms orientados hacia la expresin
de soluciones con la notacin de los problemas mismos.
Los primeros lenguajes de programacin se conocieron como Lenguajes
Ensambladores, un ejemplo es: TRANSCODE, desarrollado para la
computadora FERUT. En los lenguajes ensambladores se define un cdigo
especial llamado mnemnico para cada una de las operaciones de la mquina y
se introduce una notacin especial para especificar el dato con el cual debe
realizarse la operacin.
A mediados de los aos 60s aparecieron los primeros lenguajes de propsito
general como FORTRAN, FORTRAN IV, ALGOL, COBOL, BASIC, PL/I, ADA, C, C++,
PASCAL, etc. pero el desarrollo de nuevas tecnologas, tanto en arquitectura de
computadoras como en lenguajes de programacin, contina a paso acelerado,
cada vez con mayor velocidad, el panorama est cambiando de una etapa de
sistemas y lenguajes especialmente desarrollados para aplicaciones
individuales. Los lenguajes de programacin actuales son los conocidos como
Lenguajes visuales, como por ejemplo Visual Fox, Visual Basic, Visual C.
1.12 Definicin de Algoritmo
Un algoritmo es una lista de instrucciones para efectuar paso por paso algn
proceso. Una receta en un libro de cocina sera un excelente ejemplo de
algoritmo: la preparacin de un platillo complicado se divide en pasos simples
comprensibles para cualquier persona con experiencia en cocina.
Una computadora puede combinar en un clculo matemtico complicado,
millones de pasos elementales, tales como adiciones y substracciones. Una
computadora puede tambin, mediante el uso de algoritmos controlar un
proceso de manufactura o coordinar las reservaciones de una lnea area
conforme se reciben de las oficinas de venta de boletos de todo el pas. Los
algoritmos para tales procesos en gran escala son muy complicados por
supuesto, pero estn construidos a base de piezas.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 6

"Un algoritmo se define como un mtodo que se realiza paso a paso para
solucionar un problema que termina en un nmero finito de pasos".
1.12.1 Tipos de Algoritmos
Existen dos tipos y son llamados as por su naturaleza:
Cualitativos: Son aquellos en los que se describen los pasos utilizando
palabras.
Cuantitativos: Son aquellos en los que se utilizan clculos numricos para
definir los pasos del proceso.
1.12.2 Lenguajes Algortmicos
Un Lenguaje algortmico es una serie de smbolos y reglas que se utilizan para
describir de manera explcita un proceso.
1.12.3 Tipos de Lenguajes Algortmicos
Grficos: Es la representacin grfica de las operaciones que realiza un
algoritmo (diagrama de flujo y diagrama de bloques).

No Grficos: Representa en forma descriptiva las operaciones que debe


realizar un algoritmo (pseudocodigo).
INICIO
Edad: Entero
ESCRIBA cul es tu edad?
Lea Edad
SI Edad >=18 entonces
ESCRIBA Eres mayor de Edad
FINSI
ESCRIBA fin del algoritmo
FIN

Las caractersticas fundamentales que debe cumplir todo algoritmo son:


Debe ser preciso. e indicar el orden de realizacin de cada paso.
Debe ser definido. Si se sigue un algoritmo dos veces, se debe obtener el
mismo resultado cada vez.
Debe ser finito. Si se sigue un algoritmo, se debe terminar en algn
momento; o sea debe tener un nmero finito de pasos.
La definicin de un algoritmo debe describir tres partes: Entrada, Proceso y
Salida.
1.12.4 Algoritmos Cotidianos
Se refiere a todos aqullos algoritmos que nos ayudan a resolver problemas
diarios, y que los hacemos casi sin darnos cuenta de que estamos siguiendo una
metodologa para resolverlos.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 7

Algunos ejemplos son:


Disear un algoritmo para cambiar una llanta a un coche.
1. Inicio.
2. Traer gato.
3. Levantar el coche con el gato.
4. Aflojar tornillos de las llantas.
5. Sacar los tornillos de las llantas.
6. Quitar la llanta.
7. Poner la llanta de repuesto.
8. Poner los tornillos.
9. Apretar los tornillos.
10. Bajar el gato.
11. Fin

Un cliente ejecuta un pedido a una fbrica. La fbrica examina en su banco


de datos la ficha del cliente, si el cliente es solvente entonces la empresa
acepta el pedido, en caso contrario rechazar el pedido.
Pasos del algoritmo:
Inicio
Leer el pedido
Examinar ficha del cliente
Si el cliente es solvente aceptar pedido, en caso contrario
rechazar pedido
Fin

Determinar el mayor de tres nmeros enteros.

Pasos del algoritmo:


1.- Comparar el primero y el segundo entero, deduciendo cul es el mayor.
2.- Comparar el mayor anterior con el tercero y deducir cul es el mayor. Este
ser el resultado.
Los pasos anteriores se pueden descomponer en otros pasos ms simples en los
que se denomina refinamiento del algoritmo.
1. Obtener el primer nmero (entrada), denominado NUM1
2. Obtener el segundo nmero (entrada), denominado NUM2
3. Compara NUM1 con NUM2 y seleccionar el mayor; si los dos enteros son
iguales, seleccionar NUM1. Llamar a este nmero MAYOR.
4. Obtener el tercer nmero (entrada), y se denomina NUM3.
5. Compara MAYOR con NUM3 y seleccionar el mayor; si los dos enteros son
iguales, seleccionar el MAYOR. Denominar a este nmero MAYOR.
6. Presentar el valor MAYOR (salida).
7. Fin
La ventaja de utilizar un algoritmo es que se lo puede construir independiente
mente de un lenguaje de programacin, pues al momento de llevarlo a cdigo se
lo puede hacer en cualquier lenguaje.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 8

1.13 Representacion grfica del diagrama de flujo estndar y DFD

a) Diagrama de flujo

Los diagramas de flujo (o flujogramas) son diagramas que emplean smbolos grficos
para representar los pasos o etapas de un proceso. Tambin permiten describir la
secuencia de los distintos pasos o etapas y su interaccin.

b) DFD
DFD es un software diseado para construir y analizar algoritmos. Se pueden
crear diagramas de flujo de datos para la representacin de algoritmos de
programacin estructurada a partir de las herramientas de edicin que para
ste propsito suministra el programa. Despus de haber ingresado el algoritmo
representado por el diagrama, podr ejecutarse, analizarse y depurarse en un
entorno interactivo diseado para este fin.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

II.

Pg. 9

METODOLOGA PARA LA SOLUCIN DE PROBLEMAS


A fin de resolver un problema utilizando sistemas de cmputo, debe seguirse
una serie de pasos que permiten avanzar por etapas bien definidas hacia la
solucin.
Estas etapas son las siguientes:
Definicin del problema.
Anlisis de los datos.
Diseo de la solucin.
Codificacin.
Prueba y depuracin.
Documentacin.
Mantenimiento.
2.1 Definicin del Problema
Esta fase est dada por el enunciado del problema, el cual requiere una
definicin clara y precisa. Es importante que se conozca lo que se desea que
realice la computadora, "que se desea obtener al final del proceso"; mientras
esto no se conozca del todo no tiene mucho caso continuar con la siguiente
etapa.
2.2 Anlisis de los Datos
Una vez que se ha comprendido lo que se desea de la computadora, es necesario
definir:
Los datos de entrada.
Cul es la informacin que se desea producir (salida)
Los mtodos y frmulas que se necesitan para procesar los datos.
Una recomendacin muy prctica es el de colocarse en el lugar de la
computadora y analizar qu es lo que se necesita que se ordene y en qu
secuencia para producir los resultados esperados.
Ejemplo:
Leer el radio de un crculo y calcular e imprimir su superficie y circunferencia.
Anlisis
Las entradas de datos en este problema se concentran en el radio del crculo.
Dado que el radio puede tomar cualquier valor dentro del rango de los nmeros
reales, el tipo de datos radio debe ser real.
Las salidas sern dos variables: superficie y circunferencia que tambin sern de
tipo real.
Entradas: Radio del crculo (variable RADIO).
Salidas: Superficie del crculo (variable AREA).
Circunferencia del crculo (variable CIRCUNFERENCIA).
Variables: RADIO, AREA, CIRCUNFERENCIA tipo real.
2.3 Diseo de la Solucin
Una computadora no tiene capacidad para solucionar problemas ms que
cuando se le proporcionan los sucesivos pasos a realizar, esto se refiere a la
obtencin de un algoritmo que resuelva adecuadamente el problema. En caso de
obtenerse varios algoritmos, seleccionar uno de ellos utilizando criterios ya conocidos.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 10

Esta etapa incluye la descripcin del algoritmo resultante en un lenguaje


natural, de diagrama de flujo o natural de programacin.
Como puede verse, solo se establece la metodologa para alcanzar la solucin en
forma conceptual, es decir; sin alcanzar la implementacin en el sistema de
cmputo.
2.4 Diseo del Algoritmo
Las caractersticas de un buen algoritmo son:
Debe tener un punto particular de inicio.
Debe ser definido, no debe permitir dobles interpretaciones.
Debe ser general, es decir, soportar la mayora de las variantes que se
puedan presentar en la definicin del problema.
Debe ser finito en tamao y tiempo de ejecucin.
Diseo del Algoritmo
Prueba de escritorio o Depuracin
2.5 Prueba de Escritorio
Se denomina prueba de escritorio a la comprobacin que se hace de un
algoritmo para saber si est bien hecho. Esta prueba consiste en tomar datos
especficos como entrada y seguir la secuencia indicada en el algoritmo hasta
obtener un resultado, el anlisis de estos resultados indicar si el algoritmo est
correcto o si por el contrario hay necesidad de corregirlo o hacerle ajustes.
2.6 Codificacin
Se refiere a la obtencin de un programa definitivo que pueda ser comprensible
para la mquina. Incluye una etapa que se reconoce como compilacin.
Si la codificacin original se realiz en papel, previo a la compilacin deber
existir un paso conocido como transcripcin.
Lenguaje
Natural

Codificacin

En Papel

Lenguaje de
Programacin

Transcripcin

En Papel

Programa Ejecutable

Programa Fuente
Compilacin

Mac II

Mac II

Programa Fuente
Est escrito en un lenguaje de programacin. (pascal, C++, Visual Fox, Visual
Basic, etc.).
Es entendible por el programador.
Programa Ejecutable
Est en lenguaje mquina.
Entendible por la mquina.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 11

2.7 Prueba y Depuracin


Una vez que se ha obtenido el programa ejecutable, este es sometido a prueba a
fin de determinar si resuelve o no el problema planteado en forma satisfactoria.
Las pruebas que se le aplican son de diversa ndole y generalmente dependen
del tipo de problema que se est resolviendo. Comnmente se inicia la prueba
de un programa introduciendo datos vlidos, invlidos e incongruentes y
observando cmo reacciona en cada ocasin.
El proceso de depuracin consiste en localizar los errores y corregirlos en caso
de que estos existan. Si no existen errores, puede entenderse la depuracin
como una etapa de refinamiento en la que se ajustan detalles para optimizar el
desempeo del programa.
2.8 Documentacin
Debido a que el programa resultante en esta etapa se encuentra totalmente
depurado (sin errores), se procede a la utilizacin para resolver problemas del
tipo que dio origen a su diseo.
En vista de que esta utilizacin no podr ser supervisada en todas las ocasiones
por el programador, debe crearse un manual o gua de operacin que indique los
pasos a seguir para utilizar el programa.
2.9 Mantenimiento
Se refiere a las actualizaciones que deban aplicarse al programa cuando las
circunstancias as lo requieran. Este programa deber ser susceptible de ser
modificado para adecuarlo a nuevas condiciones de operacin.
Cualquier actualizacin o cambio en el programa deber reflejarse en su
documentacin.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

III.

Pg. 12

ENTIDADES PRIMITIVAS PARA EL DISEO DE INSTRUCCIONES


3.1 Tipos de Datos
Un dato se define como la expresin general que describe los objetos con los
cuales opera una computadora. Los datos de entrada se transforman por el
programa, despus de las etapas intermedias, en datos de salida.
Los datos se clasifican en diversas categoras, segn el tipo de mquina o del
lenguaje en uso. Generalmente podemos encontrar las siguientes categoras:
Numricos
Cadenas
Lgicos
3.1.1 Datos Numricos
Son aqullos que representan una cantidad o valor determinado. Su
representacin se lleva a cabo en los formatos ya conocidos (enteros, punto y
fracciones decimales si estas existen).
Estos pueden representarse en dos formas distintas:
Tipo Numrico Entero (integer).
Tipo Numrico Real (real).
a) Enteros
Es un conjunto finito de los nmeros enteros. Los enteros son nmeros
completos, no tienen componentes fraccionarios o decimales y pueden ser
negativos y positivos.
Algunos ejemplos son:
37
-10 9
15.25
50
b) Reales
Consiste en un subconjunto de los nmeros reales. Estos nmeros siempre
tienen un punto decimal y pueden ser positivos o negativos. Un nmero real
consiste de un nmero entero y una parte decimal. Algunos ejemplos son:
0.52 664.32
6.579 8.0
-9.3 -47.23
3.1.2 Cadenas
Son los datos que representan informacin textual (palabras, frases, smbolos,
etc.). No representan valor alguno para efectos numricos. Pueden distinguirse
porque son delimitados por apstrofes o comillas.
Se clasifica en dos categoras:
Datos tipo carcter (char)
Datos tipo Cadena (string)

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 13

a) Datos Tipo Carcter


Es un conjunto finito y ordenado de caracteres que la computadora reconoce.
Un dato de este tipo contiene solo un carcter.
Reconoce los siguientes caracteres:
Caracteres Alfabticos (A,B,C,Z,a,b,cz)
Caracteres Numricos (0,1,2,9)
Caracteres Especiales (+, -, *, /, ^, . , ;, <, >, $, .)
b) Datos Tipo Cadena (string)
Es una sucesin de caracteres que se encuentran delimitados por una comilla
(apstrofe) o dobles comillas, segn el tipo de lenguaje de programacin. La
longitud de una cadena de caracteres es el nmero de ellos comprendidos
entre los separadores o delimitadores.
Ejemplos:
Hola Mortimer
12 de octubre de 1496
Enunciado cualquiera
3.1.3 Lgicos
Tambin se le denomina Booleano, es aqul dato que solo puede tomar uno de
dos valores: Falso y verdadero.
Se utiliza para representar las alternativas (si/no) a determinadas condiciones.
Por ejemplo, cuando se pide si un valor entero sea primo, la respuesta ser
verdadera o falsa, segn sea.
Las categoras y tipos que se mencionaron anteriormente se conocen como
Tipos Simples, puesto que no poseen una estructura compleja.
En forma adicional, cada lenguaje puede proporcionar la utilizacin de Tipos
Compuestos, siendo estos, datos que tienen una estructura predeterminada.
Tipos Compuestos
Entre los principales tipos compuestos se encuentran los siguientes:
1.

SUBRANGO: Son aqullos en los que se especifica con precisin el intervalo


de valores vlidos para un dato.
Ejemplos:
0..100 (son enumerativos de tipo entero)
'A'..'Z' (son enumerativos de tipo cadena)
Los Reales no son vlidos para crear enumerativos, ya que su intervalo no est
definido.
2.

ENUMERATIVOS: Son aqullos en los que se definen individualmente los


valores para un dato.
Ejemplos:
(0,25,40,52) Siempre deben ponerse entre parntesis.
3.

DEFINIDOS POR EL USUARIO:


Son aqullos que el programador crea
para satisfacer las necesidades del programa en diseo.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 14

Constantes Variables y Expresiones


Una Constante es aqulla que no cambia de valor durante la ejecucin de un
programa. Para expresar una constante se escribe explcitamente su valor, por
ejemplo:
Numricas enteras: 12,34,-44,22234, -9837,m=12,n=44592....
Numricas reales: 12.55, -3E3, PI=3.14159.....
Lgicas: Slo existen dos constantes lgicas 0,1
Carcter: n=a, k=1,.....
Cadena: saludo=hola, s=si, n=no.....
pi = 3.1416
Una variable es un objeto cuyo valor puede cambiar. Toda variable posee dos
atributos: un nombre (invariable, denominado en ocasiones identificador) que
sirve para designarla y un tipo (invariable) que describe la posible utilizacin de
la variable.
Es un espacio en la memoria de la computadora que permite almacenar
temporalmente un dato durante la ejecucin de un proceso, su contenido puede
cambiar durante la ejecucin del programa.
Para poder reconocer una variable en la memoria de la computadora, es
necesario darle un nombre con el cual podamos identificarla dentro de un
algoritmo.
Ejemplo:
rea = pi * radio ^ 2
Las variables son: el radio, el rea y la constate es pi
El valor de las variables puede ser modificado durante la ejecucin del
programa.
Las expresiones son combinaciones de constantes, variables, smbolos de
operacin, parntesis y nombres de funciones especiales.
Las expresiones se clasifican en aritmticas y booleanas.
Su representacin se da a travs de letras y smbolos generalmente numricos a
los que se les asigna un valor.
Ejemplos:

Numricos

Cadena
Lgicos

Constantes
36
450.35
0.58
'A'
'Juan'
'La Paz'
Falso
Verdadero

Ingeniera Informtica y Sistemas - UNAMBA

Variables
A
Nom
Edad
Ciudad
Estatura

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 15

3.2 Operadores y Operandos


3.2.1 Operadores
Un operador es el smbolo que determina el tipo de operacin o relacin que
habr de establecerse entre los operandos para alcanzar un resultado.
Los operadores se clasifican en tres grupos:
Aritmticos.
Relacionales.
Lgicos.
a) Operadores Aritmticos
Son aqullos que permiten la realizacin de clculos aritmticos. Utilizan
operandos numricos y proporcionan resultados numricos.
Operador

Operacin

Suma

Resta

Multiplicacin

Divisin real

Div

Divisin entera

Mod

Residuo

Exponenciacin

Ejemplos:
7+3 = 10 10 Div 4 = 2
7-3 = 4 20 Mod 3 = 2
7*3 = 21 5 Mod 7 = 5
10/4= 2.5 4 ^ 2 = 16
En la expresin 7+3, los valores 7 y 3 se denominan operandos. El valor de la
expresin 7+3 se conoce como resultado de la expresin.
Todos los operadores aritmticos no existen en todos los lenguajes de
programacin, por ejemplo, en Fortran no existen Div y mod.
Operadores Div y Mod
El smbolo / se utiliza para la divisin real, y el operador Div representa la
divisin entera.
Expresin Resultado Expresin Resultado
10.5/3.0

3.5

10 Div 3

0.25

18 Div 2

2.0/4.0

0.5

30 Div 30

30/30

1.0

10 Mod 3

6/8

0.75

10 Mod 2

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 16

b) Operadores Relacionales
Permiten realizar comparaciones de valores de tipo numrico o carcter. Estos
operadores sirven para expresar las condiciones en los algoritmos.
Proporcionan resultados lgicos.
Operador

Significado

<

Menor que

>

Mayor que

Igual que

<=

Menor o igual que

>=

Mayor o igual que

<>

Diferente de

El formato general para las comparaciones es:


expresin1 operador de relacin expresin2
El resultado de la operacin ser Verdadero o Falso. As por ejemplo, si A=4 y
B=3, entonces:
A>B Es Verdadero
(A-2) < (B-4) Es Falso
Los operadores de relacin se pueden aplicar a cualquiera de los cuatro tipos de
datos estndar: enteros, real, lgico y carcter.
A < K = Verdadero
A > a = Falso
MARIA < JUAN = Falso (se considera la primera letra)
JAIME > JORGE = Falso
Prioridad De Operadores Aritmticos y Relacionales
Determina el orden en que habrn de realizarse las operaciones en una
expresin determinada. Para obtener la prioridad se deben conocer las
siguientes reglas:
Las operaciones que estn encerradas entre parntesis se evalan primero.
Si existen diferentes parntesis anidados (interiores unos a otros), las
expresiones ms internas se evalan primero.
Las operaciones aritmticas dentro de una expresin suelen seguir el
siguiente orden de prioridad.
Operador

Prioridad

Alta

*, /, Div
+, -, Mod
Relacionales

Ingeniera Informtica y Sistemas - UNAMBA

Baja

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 17

En caso de coincidir varios operadores de igual prioridad en una expresin o


sub expresin encerrada entre parntesis, el orden de prioridad en este caso es
de izquierda a derecha.
Cuando se desea realizar una operacin con baja prioridad por adelantado, debe
agruparse a los operandos involucrados.
4 + 12 /2 = 10 (sin agrupar)
(4 + 12) /2 = 8 (con agrupador)
Ejemplo:
Obtener los resultados de las expresiones:
-4 * 7 + 2 ^ 3 / 4 - 5
Solucin:
-4 *7 + 2 ^
Resulta:
-4 * 7+ 8/4 -5
-28 + 8/4 -5
-28 + 2 - 5
-26 - 5
-31
Los parntesis tienen prioridad sobre el resto de las operaciones.
A * (B+3)
La constante 3 se suma primero al valor de B, despus este
resultado se multiplica por el valor de A.
(A*B) +3 A y B Se multiplican primero y a continuacin se suma 3.
A + (B/C) + D

Esta expresin equivale a A+ B/C + D

c) Operadores Lgicos
Son aqullos que permiten la combinacin de condiciones para formar una sola
expresin lgica. Utilizan operandos lgicos y proporcionan resultados lgicos
tambin.
Operador

Relacin

not

Negacin (No)

and

Conjuncin (Y)

or

Disyuncin (O)

xor

Disyuncin Exclusiva
(O/SOLO)

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 18

Se obtiene Verdadero si:


NOT

El operando es falso

AND

Ambos operandos son


verdaderos

OR

Al menos un operando es
verdadero

XOR

Solo uno de los operandos son


verdadero

NOT(X) NOT(Y) X AND Y X OR Y X XOR Y

Prioridad De Los Operadores Lgicos


Los operadores aritmticos seguan un orden especfico o de prioridad cuando
existan ms de un operador en las expresiones. De modo similar los operadores
lgicos y relacionales tienen un orden de prioridad.
Ejemplos:
Not 4 > 6
Produce un error, ya que el operador not se aplica a 4.
Not (4 > 14)
Produce un valor verdadero.
(1.0<x) And (x<z +7.0) Si x vale 7 y z vale 4, se obtiene un valor falso.
Asignacin
La operacin de asignacin es el modo de darle valores a una variable. La
operacin de asignacin se representa por el smbolo u operador. La operacin
de asignacin se conoce como instruccin o sentencia de asignacin cuando se
refiere a un lenguaje de programacin.
En una asignacin se resuelve, primeramente la expresin (al lado derecho del
smbolo de asignacin) y se asigna el resultado en la variable.
Ejemplo:
A = 9
Significa que la variable A se le ha asignado el valor 9. La accin de asignar es
destructiva, ya que el valor que tuviera la variable antes de la asignacin se
pierde y se reemplaza por el nuevo valor. As en la secuencia de operaciones:
A = 30
A = 189
A=9
Cuando se ejecutan, el ltimo valor que toma A ser 9, ya que los valores
anteriores a este han desaparecido.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 19

Las acciones de asignacin se clasifican segn sea el tipo de expresiones:


Aritmticas, Lgicas y de Caracteres.
Asignacin Aritmtica
Las expresiones en las operaciones de asignacin son aritmticas:
Suma =5+10+2: Se evala la expresin 5+10+2 y se asigna a la variable Suma,
es decir, 17 ser el valor que toma Suma.
Asignacin Lgica
La expresin que se evala en la operacin de asignacin es lgica. Supngase
que M, N, y P son variables de tipo lgico.
M=8<5
N = M o (7 <= 12)
P=7>6
Tras ejecutar las operaciones anteriores, las variables M,N,P toman los valores,
falso, verdadero, verdadero respectivamente.
Asignacin de caracteres
La operacin que se evala es de tipo carcter.
x = '3 de Mayo de 1999'
La accin de asignacin anterior asigna la cadena de caracteres '3 de Mayo de
1999' a la variable de tipo carcter x.
Entrada y Salida de Informacin
Los clculos que realizan las computadoras requieren para ser tiles la Entrada
de los datos necesarios para ejecutar las operaciones que posteriormente se
convertirn en resultados, es decir, Salida.
Las operaciones de entrada permiten leer determinados valores y asignarlos a
determinadas variables. Esta entrada se conoce como operacin de Lectura
(read). Los datos de entrada se introducen al procesador mediante dispositivos
de entrada (teclado, unidades de disco, etc). La salida puede aparecer en un
dispositivo de salida (pantalla, impresora, etc). La operacin de salida se
denomina escritura (write).
En la escritura de algoritmos las acciones de lectura y escritura se representan
por los formatos siguientes
leer ( Nom_variable )
escribir (lista de variables de salida)
Ejemplo: Obtener rea de un tringulo.
Entrada
Frmula (A= B*h/2)
Datos (Base, altura)
Proceso

Multiplicar Base y altura.


Dividir resultado de la multiplicacin anterior entre dos.
Mostrar resultado de divisin anterior.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Salida

Pg. 20

Area del tringulo.

Algoritmo
Inicio
leer(B)
leer(h)
x = B*h
A = x/2
escribir(A)
Fin
3.3 Expresiones
Las expresiones son combinaciones de constantes, variables, smbolos de
operadores, parntesis y nombres de funciones especiales. Las mismas ideas
son utilizadas en notacin matemtica tradicional; por ejemplo:
a + b ( b+2)

Aqu los parntesis indican el orden de clculo.

Cada expresin toma un valor que se determina tomando los valores de las
variables y constantes implicadas y la ejecucin de las operaciones indicadas.
Una expresin consta de operadores y operandos. Segn sea el tipo de objetos
que manipulan, las expresiones se clasifican en:
Aritmticas
Relacionales
Lgicas
Carcter
El resultado de la expresin numrica es de tipo numrico; el resultado de una
expresin relacional y de una expresin lgica es de tipo lgico; el resultado de
una expresin carcter es de tipo carcter.
1. Expresiones Aritmticas
Las expresiones aritmticas son anlogas a las frmulas matemticas. Las
variables y constantes son numricas (real o entera) y las operaciones son las
aritmticas.
+
suma
resta
*
multiplicacin
/
divisin
**, ^
exponenciacin
div
divisin entera
mod
mdulo (resto)
Los clculos que implican tipos de datos reales y enteros suelen dar
normalmente resultados del mismo tipo si los operandos lo son tambin. Por
ejemplo, el producto de operandos reales produce un real.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 21

Ejemplo :
4x6
se representa por 4 * 6
39
se representa por 3 ^ 9
18 div 6 se representa por 18/6
2. Expresiones Lgicas (booleanas)
Es una expresin que solo pueden tomar los valores de: verdadero y falso. Las
expresiones lgicas se forman combinando constantes lgicas, variables lgicas
y otras expresiones y otras expresiones lgicas utilizando los operadores lgicos
not, and y or, y los operadores relacionales (de relacin o comparacin) =, >, <,
<=, >=, <>.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

IV.

Pg. 22

TCNICAS DE DISEO
Con el objeto de facilitar el diseo de algoritmos y la organizacin de los
diversos elementos de los que se componen se utilizan algunas tcnicas que
muestran una metodologa a seguir para resolver los problemas. Estas tcnicas
hacen que los programas sean ms fciles de escribir, verificar, leer y mantener.
Algunas de las tcnicas ms conocidas son:
Top Down (diseo descendente)
Botton Up
Warnier Orr

4.1 Top Down


Es una tcnica para disear que consiste en tomar el problema en forma inicial
como una cuestin global y descomponerlo sucesivamente en problemas ms
pequeos y por lo tanto, de solucin ms sencilla.
La descomposicin del problema original (y de las etapas subsecuentes), puede
detenerse cuando los problemas resultantes alcanzan un nivel de detalle que el
programador o analista pueden implementar fcilmente.
El problema se descompone en etapas o estructuras jerrquicas, de modo que se
puede considerar cada estructura como dos puntos de vista : lo que hace?, y
cmo lo hace ? Si se considera un nivel n de refinamiento, las estructuras se
consideran de la siguiente forma:
Nivel n : Vista desde el exterior.
"lo que hace ?"
Nivel n+1 : Vista desde el interior.
"cmo lo hace ?"
Ejemplo de un diseo descendente (top-down) de un control de almacn:
Control de Almacn

Compra

Conseguir
Proveedor

Conseguir
Crditos

Manejo

Transportacin

Alacenamiento

Inventario

Capturar

Introducir
Clave

Ingeniera Informtica y Sistemas - UNAMBA

Venta

Etiquetas

Facturacin

Reparto

Reportes

Introducir
Precio

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 23

4.2 Botton Up
Esta tcnica consiste en partir de los detalles ms precisos del algoritmo
completando suscesivamente mdulos de mayor complejidad, se recomienda
cuando ya se cuenta con experiencia y ya se sabe lo que se va a hacer.
Conforme se va alcanzando el desarrollo de mdulos ms grandes se plantea
como objetivo final la resolucin global del problema.
Este mtodo es el inverso del anterior y es recomendable cuando se tiene un
modelo a seguir o se cuenta con amplia experiencia en la resolucin de
problemas semejantes.
La tcnica de Botton Up es frecuentemente utilizada para la realizacin de
pruebas a sistemas ya concluidos.
4.3 Warnier Orr
Es una tcnica que utiliza una representacin semejante a la de cuadros
sinpticos para mostrar el funcionamiento y organizacin de los elementos que
conforman el algoritmo.
Bsicamente, utiliza una notacin de llaves para organizar los mdulos y se
auxilia en la siguiente simbologa para indicar operaciones de control.
Smbolo
+

Significado
OR (uno, otro o varios)
XOR (uno u otro, solo uno)

(x,y)

Puede hacerse tantas veces desde x hasta y

Nota: Los diagramas Warnier Orr se leen de izquierda a derecha y de arriba


hacia abajo.
Ejemplo de un diagrama de Warnier Orr, de un control de almacn

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 24

Conseguir Proveedor

Compras

Visitar Bancos (1,n)


Visitar casas de crdito +

Conseguir Crdito

Hipotecar propiedades
Transportacin

Control
de
Almacn

Almacenamiento
Manejo

Inventario
Etiquetacin

(1,n)
Captura
Repartos

Introducir clave
Introducir precios

Facturacin
Ventas
(0,n)
Reparto

Cliente acude almacn


+
Reparto a domicilio

(0,n) = De cero veces a n veces


(1,n) = De una vez a n veces

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

V.

Pg. 25

TCNICAS PARA LA FORMULACIN DE ALGORTMOS


Las tcnicas analizadas en la unidad anterior permiten un diseo global del
algoritmo, pero ocasionalmente pueden desatender detalles especficos de este.
Las tres tcnicas de formulacin de algoritmos ms populares son:
Diagrama de flujo
Pseudocdigo
Diagramas estructurados
5.1 Diagramas de Flujo
Se basan en la utilizacin de diversos smbolos para representar operaciones
especficas. Se les llama diagramas de flujo porque los smbolos utilizados se
conectan por medio de flechas para indicar la secuencia de operacin.
La simbologa utilizada para la elaboracin de diagramas de flujo es variable y
debe ajustarse a un patrn definido previamente.
Dichos diagramas se construyen utilizando ciertos smbolos de uso especial
como son rectngulos, diamantes, valos, y pequeos crculos, estos smbolos
estn conectados entre s por flechas, conocidas como lneas de flujo.
5.1.1 Reglas para la Construccin de Diagramas de Flujo
1. La finalidad de un diagrama de flujo es describir de modo grfico la
estructura lgica del programa y que posteriormente permita una fcil
codificacin en lenguaje especfico.
2. Todo diagrama debe tener un principio (INICIO) y un fin, con el objeto de
que pueda ser utilizado como submdulo de otro mdulo de nivel superior.
3. Las lneas de conexin o de flujo deben ser siempre rectas y, que sean slo
verticales y horizontales, no cruzarse; para conseguir lo anterior se recurrir
a conectores, numerados convenientemente y slo en los casos
estrictamente necesarios.
4. Las lneas que enlazan los smbolos entre s deben estar todas contectadas.
Cada lnea o flecha debe entrar en un bloque, en un smbolo de decisin,
terminar en <<FIN>> o unirse a otra flecha.
5. Se deben dibujar todos los smbolos de modo que se pueda seguir el proceso
visualmente de arriba abajo (diseo <<top-down>>) y de izquierda a
derecha.
6. Realizar un grfico claro y equilibrado, procurando que el flujo central del
diagrama sea la parte central de la hoja de papel.
7. Se debe dejar un bloque o dos de proceso libres al comienzo del diagrama,
para reservar posiciones de memoria para variables, acumuladores,
inicializacin, banderas.
8. Indicar con comentarios al margen, las variables utilizadas y su descripcin,
procurando no abusar de su uso. Diferenciar las variables del proceso de las
variables ficticias (contadores, banderas).
9. En las operaciones lgicas recurrir preferentemente a la lgica positiva que a
la lgica negativa (es ms claro << Si A = B >> que << Si A <> B >>.
10. A cada bloque o smbolo se accede por arriba y/o por la izquierda y se sale
por abajo y/o por la derecha.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 26

11. Las entradas a un smbolo pueden ser varias, pero la salida es nica excepto
para el smbolo de decisin.
12. Debe de indicar claramente dnde inicia y dnde termina el diagrama.
13. Organizar los smbolos de tal forma que siga visualmente el flujo de arriba
hacia abajo y de izquierda a derecha.
14. Las lneas deben ser verticales u horizontales, nunca diagonales.

15. No cruzar las lneas de flujo empleando los conectores adecuados sin hacer
uso excesivo de ellos.

16. No fraccionar el diagrama con el uso excesivo de conectores.


17. Solo debe llegar una sola lnea de flujo a un smbolo. Pero pueden llegar
muchas lneas de flujo a otras lneas.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 27

18. Las lneas de flujo deben de entrar a un smbolo pro la parte superior y/o
izquierda y salir de l por la parte inferior y/o derecha.
19. Evitar que el diagrama sobrepase una pgina; de no ser posible, enumerar y
emplear los conectores correspondientes.
5.1.2 Comprobacin de Diagramas
Terminado el diagrama de flujo, se deben tomar un conjunto de datos
significativos y comenzar la lectura del mismo en el orden arriba abajo /
izquierda derecha y seguir paso a paso todos los smbolos con sus operaciones
correspondientes, introduciendo los datos tomados inicialmente en los
momentos oportunos y ver cmo responde el diagrama de flujo y si los
resultados obtenidos son correctos y coherentes.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 28

SIMBOLOGIA UTILIZADA EN LOS DIAGRAMAS DE FLUJO


Smbolo

Funcin
Terminal (representa el inicio y el final, de un
programa, puede representar tambin una
para o interrupcin programada que sea
necesario realizar en un programa
Entrada/Salida
(cualquier
introduccin de datos)

tipo

de

Proceso (cualquier tipo de operacin que


pueda originar cambio de valor, formato o
posicin de la informacin almacenada en
memoria, operaciones aritmticas)
NO

SI

Decisin (indica operaciones lgicas o de


comparacin entre datos normalmente dos
y en funcin del resultado de la misma
determina cual de los distintos caminos
alternativos del programa se debe seguir).
Decisin mltiple (en funcin del resultado
de la comparacin se seguir uno de los
diferentes caminos de acuerdo con dicho
resultado).

Conector (Sirve para enlazar dos partes


cualesquiera de un organigrama a travs de
un conector en la entrada y otro conector en
la salida)

Indicador de direccin o lnea de flujo (indica


el sentido de ejecucin de las operaciones)

Lnea conectora (sirve de unin entre dos


smbolos).

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 29

Conector (conexin entre dos puntos del


organigrama
situado
en
pginas

Llamada a subrutina o a un proceso


predeterminado (una subrutina es un
mdulo independiente del programa).

Pantalla (se utiliza en ocasiones en lugar


del smbolo de E/S).

Impresora (se utiliza en ocasiones en


lugar del smbolo de E/S).

Teclado (se utiliza en ocasiones lugar del


smbolo de E/S).

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 30

Ejemplo:
Calcular el salario neto de un trabajador en funcin del nmero de horas trabajadas,
precio de la hora de trabajo y considerando unos descuentos fijos al salario bruto en
concepto de impuestos (20 por 100).
Inicio

Leer nombre, horas


precio

Salario_bruto
horas*precio

Impuesto
0.20*salario_neto

Salario_neto
salario_bruto impuesto

Escribir nombre,
salario_bruto,
salario_neto

Fin

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 31

Ejemplo:
Realizar un diagrama de flujo que permita mostrar en pantalla un mensaje de
mayora o minora de edad segn sea el caso para un nombre especfico.
Inicio

Nombre:

nom

Edad:

ed

falso

verdadero
Ed >= 18

Nom, eres

Nom, eres

Fin

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 32

5.2 Pseudocdigo
Otra herramienta muy til en el anlisis de programacin es el pseudocdigo.
Pseudo o seudo, significa <<falso>>, <<imitacin>> y cdigo se refiere a las
instrucciones escritas en un lenguaje de programacin: pseudocdigo no es
realmente sin cdigo sino una imitacin y una versin abreviada de
instrucciones reales para las computadoras.
Las tres herramientas que utilizan los programadores son: diagramas de flujo,
tablas de decisin y pseudocdigos. Aunque se utilizan las tres sin duda las ms
utilizadas son los diagramas de flujo y los pseudocdigos.
El pseudocdigo es una tcnica para expresar en lenguaje natural la lgica de
un programa, es decir, su flujo de control. El pseudocdigo no es un lenguaje de
programacin sino un modo de plantear un proceso de forma que su traduccin
a un lenguaje sea sencilla para un programador.
Ejemplo:
Preparar un algoritmo que represente la receta que se muestra a continuacin:
Ingredientes:
1. 1 taza de almendras picadas.
2. de libra de chocolate en bloque para hornear
3. de libra de malvaviscos cortados a la mitad
4. 3 tazas de azcar
5. taza de leche evaporada
6. taza de miel de maz
7. 1 cucharadita de vainilla
8. libra de mantequilla
9. cucharadita de sal
Virtase la leche y aada la miel de maz, el azcar, el chocolate y la sal en un
recipiente de 1 litro, y cocnese en flama alta, mezclando constantemente hasta
que hierva la mezcla. Redzcase, a flama moderada y continese hirviendo y
revolviendo hasta que una gota de la miel forme una pelota suave en un vaso de
agua fra. Qutese de la flama y djesele enfriar durante 10 minutos. Mzclese la
mantequilla y la vainilla hasta que estn completamente incorporadas.
Agrguense las almendras. Distribyanse las mitades de malvavisco en el fondo
de una charola de horneado, de 30 centmetros por lado, engrasada. Virtase la
miel sobre los malvaviscos. Djesele enfriar durante 10 minutos. Crtese en
cuadros y srvase.
La ventaja del pseudocdigo es que en su uso en la planificacin de un
programa, el programador se puede concentrar en la lgica y en las estructuras
de control y no preocuparse de las reglas de un lenguaje especfico. Es tambin
fcil modificar el pseudocdigo si se descubren errores o anomalas en la lgica
del programa, adems de todo esto es fcil su traduccin a lenguajes como
pascal, COBOL, C, FORTRAN o BASIC.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 33

El pseudocdigo utiliza para representar las acciones sucesivas palabras


reservadas en ingls (similares a sus homnimos en los lenguajes de
programacin), tales como star, begin, end, stop, if-then-else, while, repeatuntil.etc
Las principales caractersticas de los pseudocdigos son:
1. Utilizan los operadores Aritmticos, Relacionales y Lgicos.
2. Los nombres de sus identificadores (variables, constantes, nombre del
pseudocdigo, etc.), deben cumplir con las reglas para la creacin de los
mismos.
3. Se pueden incluir comentarios dentro del pseudocdigo para hacerlo ms
entendible, utilizando dos diagonales invertidas [\\].
4. Se debe dejar una indentacin (sangra o margen) en los bloques de
instrucciones.
5. Usa ciertas palabras claves (reservadas) utilizadas de modo general en los
diferentes lenguajes de programacin:
PSEUDOCDIGO, VARIABLES, INICIO, FIN, LEE, ESCRIBE, IMPRIME,
IF_THEN_ELSE, CASE OF, FOR DO, WHILE DO REPEAT UNTIL, ARRAY.
6. Deben iniciar con el nombre del pseudocdigo, seguido de la declaracin de
variables y luego el cuerpo del pseudocdigo:
Pseudocdigo nombre
Declaraciones de variables
Inicio
\\ Cuerpo del pseudocdigo
Fin
Ejemplo:
Disee un pseudocdigo que lea 3 nmeros, los sume e imprima su resultado.
Pseudocdigo sumatoria
variables
en1, en2, en3, esuma: entero
inicio
escribe ?dame tres nmeros:?
lee en1, en2, en3
esuma = en1 + en2 + en3
escribe ?el resultado de la suma es: ?, esuma
fin
Ejemplo:
Se requiere preguntar dos valores, y a continuacin ofrecer un men con las
operaciones bsicas (+, -, *, /). Despus de presentar el resultado se ofrecer la
posibilidad de una nueva operacin.
Declaracin de variables:
Real : X, Y, RESPUESTA
Entero : OPCION
Carcter : OP

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 34

Inicio
Repetir
escribir(Primer valor : )
leer(X)
escribir(Segundo valor : )
leer(Y)
escribir(1) Suma )
escribir(2) Resta )
escribir(3) Multiplicacin )
escribir(4) Divisin )
escribir(Qu operacin deseas realizar ? : )
leer(OPCION)
casos OPCION de
1 : RESULTADO = X+Y
2 : RESULTADO = X-Y
3 : RESULTADO= X*Y
4 : si Y=0 entonces
escribir( Error )
RESULTADO
0
en caso contrario
RESULTADO = X/Y
escribir (Resultado : ,RESULTADO)
escribir(Deseas otro clculo : [S/N] )
leer(OP)
Hasta que RES = N
Fin
Ejemplo:
Preguntar un nombre y repetirse en pantalla tantas veces como se desee.
(preguntar cantidad de repeticiones), indicando el nmero de repeticin.
Declaracin de variables
Cadena : nom
entero : x, n
Inicio
escribir(Nombre : )
leer(nom)
escribir(Cuntas veces quieres repetirlo ? : )
leer(n)
para x
1 hasta n hacer
escribir(x.- , nom)
Fin

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 35

5.3 Diagramas Estructurados (nassi-schneiderman)


El diagrama N-S de Nassi-Schneiderman, tambin conocido como diagrama de
Chapin, es como un diagrama de flujo en el que se omiten las flechas de unin y
las cajas son contiguas. Las acciones sucesivas se escriben en cajas sucesivas, y,
como en los diagramas de flujo, se pueden escribir diferentes acciones en una
caja.
Los Diagramas Estructurados, son una tcnica que permite formular algoritmos
mediante una representacin geomtrica y de asignacin de espacios de un
bloque especfico.
Un algoritmo se representa de la manera siguiente:
Nombre del algoritmo
<Accin 1>
<Accin 1>

Fin
Una estructura condicional en N-S se representa de la siguiente manera:
Condicin?
Si
<Acciones>

No
<Acciones>

Ejemplo: Se desea calcular el salario neto semanal de un trabajador en funcin


del nmero de horas trabajadas y la tasa de impuestos.
Leer
Nombre horas * precio
Calcular
Salario horas * precio
Calcular
Salario 0.25*salario
Calcular
Neto salario impuesto
Escribir
Nombre, Salario, impuesto, neto

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

VI.

Pg. 36

ESTRUCTURAS ALGORTMICAS
6.1 Estructura Secuencial
Es aqulla en la que una accin (instruccin) sigue a otra en secuencia. Las
tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y
as sucesivamente hasta el fin del proceso. La estructura secuencial tiene una
entrada y una salida. Su representacin grfica es la siguiente:
Estructura Secuencial
Accin 1

Accin 1

Accin 1

Diagrama N-S de una Estructura Secuencial


Accin 1
Accin 2
.
.
.
Accin n

Pseudocodigo de una Estructura Secuencial


Inicio
:
:
acciones
:
:
fin

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 37

Ejemplos:
1. Calcular el salario neto de un trabajador en funcin del nmero de horas
trabajadas, precio de la hora de trabajo y considerando unos descuentos fijos
al sueldo bruto en concepto de impuestos (20 por 100).
Pseudocdigo
Inicio
{clculo salario neto}
leer nombre, horas, precio_hora
salario_bruto = horas * precio
impuestos = 0.20 * salario_bruto
salario_neto = salario_bruto_impuestos
escribir nombre, salario_bruto, salario_neto_bruto, salario_neto
Fin
Diagrama de flujo
Inicio

Leer nombre, horas


precio

Diagrama N-S
Salario_bruto
horas*precio

Leer
Nombre, horas, precio

Impuesto
0.20*salario_neto

Clculo de salario_bruto horas * precio


Impuesto 0.20 * salario_neto
Salario_neto salario_bruto impuesto

Salario_neto
salario_bruto impuesto

Escribir
Nombre, salario_bruto, salario_neto

Escribir nombre,
salario_bruto,
salario_neto

Fin

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 38

2. identificada como C (esta operacin se representar en el smbolo de proceso) y


por ltimo, el valor de respuesta almacenado en la variable C, ser escrito en la
pantalla (esta operacin se representa en el smbolo de escritura). Vea el
diagrama siguiente.
Seudo lenguaje
Diagrama de Flujo
Inicio
Leer un valor y guardarlo en la variable A y leer
Inicio
un segundo valor y guardarlo en el identificador B
Realizar la suma de A con B y guardar su valor en
A, B
la variable C
Escribir el valor de C
Fin
C=A+B

Pseudocdigo
Inicio
Leer(A,B)
C=A+B
Escribir(C)
Fin

Fin

Cdigo Lenguaje C+ +:
#include "conio.h"
#include "stdio.h"
int A,B,C;
main()
{
clrscr();
gotoxy(10,10 );
printf("Digite un nmero entero ");
scanf("%d",&A);
gotoxy(10,11);
printf("Digite un nmero entero ");
scanf("%d",&B);
C= A+B;
gotoxy(10,12);
printf("La suma es: %d ",C);
getch()
}
En el ejercicio anterior se hubiera podido escribir directamente el valor de la
suma sin necesidad de almacenarlo previamente en la variable C utilizando
para ello la siguiente sentencia.
Write(La suma es: ,A+B);
Repeat until keypressed;

gotoxy(10,12);
printf("La suma es: %d ",A+B);

Tenga en cuenta que si lo hace de esta manera, no estar utilizando estructura


de asignacin alguna.

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 39

3. Desarrolle un algoritmo que le permita leer un valor entero, calcular su


cuadrado y escribir dicho resultado.
Anlisis:
En el ejercicio planteado, se puede identificar como tareas a realizar tres, es decir
cada una de las tres acciones solicitadas. Leer, Calcular y Escribir.
Cada uno de los procesos mencionados se describen en smbolo respectivo
quedando el diagrama deflujo de la siguiente manera.
Es necesario aclarar que cada proceso corresponde a una estructura de
Asignacin. En el caso del ejercicio el calcular el cuadrado.
Algoritmo:
Seudo lenguaje
Diagrama de flujo:
Inicio
Inicio
Leer el valor nmero entero y almacenarlo en la variable N.
Calcula el cuadrado del nmero ledo y que est almacenado en
la variable N, y su resultado almacenarlo en la variable R.
N
Escriba el valor encontrado del
Cuadrado que est almacenado en la variable R.
R =N2
Fin
Seudo cdigo:
Inicio
Leer( N);
R = N;
Escribir (R)
Fin

Fin

Codigo Pascal

Cdigo Lenguaje C++:


#include"math.h"
Program cuadrado;
#include"conio.h"
uses crt;
#include"stdio.h"
N,R:real;
int N,R;
begin
main()
crscr;
{
gtoxy(10,10);
clrscr();
wite( Digite un nmero entero N);
gotoxy(10,10);
radln(N);
printf("Digite un nmero entero
N"); R=exp(2*ln(N));
scanf("%d",&N);
gotoxy(10,12);
R=pow(N,2);
write( El cuadrado del numero es: ,R); gotoxy(10,12);
repeat until keypressed;
printf("El cuadrado es: %d ",R);
getch()
end
}

Ingeniera Informtica y Sistemas - UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 40

4. Desarrolle un algoritmo que le permita leer un valor para radio (R), calcular el
rea (A) de un crculo A =*R y escribir su valor.
Anlisis: En el ejercicio se identifican como tareas las tres acciones solicitadas. Leer,
Calcular y Escribir. Cada uno de los procesos mencionados se describen en el
smbolo respectivo quedando el diagrama de flujo de la siguiente manera.
Algoritmo:
Seudo lenguaje:
Diagrama de flujo:
Inicio
Leer el valor del radio y guardarlo en la variable R Calcular el
Inicio
valor del rea aplicando la formula *R y almacenar dicho
valor en la variable A Escribir el valor encontrado para el
A, B
rea
guardado en la variable A.
A = *R2
Fin
Seudo cdigo:
Inicio
Leer( R)
A = *R
Escribir (A)
Finalizar
Cdigo Turbo Pascal:
Program rea;
Uses crt;Const pi=3.1415926;
Var R,A:real;
Begin
clrscr;
gotoxy(10,10);
write(Digite el valor de Radio R);
readln(R);
R"); A = pi*exp(2*ln(R));
gotoxy(10,12);
write( El valor del rea es: ,A);
repeat until keypressed;
End.

Ingeniera Informtica y Sistemas - UNAMBA

A
Fin

Cdigo Lenguaje C++:


#include"math.h"
#include"conio.h"
#include"stdio.h"
float R, A;
main()
{ clrscr;
clrscr();
gotoxy(10,10);
printf("Digite el Radio
scanf("%f",&R);
A = pi*pow(R,2);
gotoxy(10,12);
printf("El rea es: %f ", A);
getch();
}

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 41

5. Desarrolle un algoritmo que le permita calcular el rea de un tringulo en


funcin de las longitudes de sus lados previamente ledos desde el teclado.
Anlisis:
Para darle solucin al problema planteado primero se leen los valores de los tres
lados del tringulo, luego se procede a calcular el valor de su rea en funcin de
los valores ledos, aplicando la frmula correspondiente y por ltimo se da orden
de escribir el valor calculado.
Pseudocdigo
Inicio
Leer(a,b,c)
Hacer p=(A+B+C)/2
Calcular el valor del rea dada por la frmula
Escribir (a)
Fin
Cdigo Lenguaje C++:
#include "conio.h"
#include "stdio.h"
float A,B,C,AREA,p;
main()
{ clrscr();
gotoxy(10,10);
printf("Digite el valor de A ");
Scanf(&A);
gotoxy(10,12)
printf("Digite el valor de B");
Scanf(&B);
gotoxy(10,14)
printf("Digite el valor de C");
Scanf(&C);
p=(A+B+C)/2
AREA= sqrt (p* (p - A)*(p -B) * (p -C ))
gotoxy(10,16);
printf("El valor del rea es: %f ", AREA);
getch();
}

Ingeniera Informtica y Sistemas - UNAMBA

Diagrama de flujo
INICIO
A,B,C
P=(A+B+C)/2

AREA=

p(p- A)(p- B)(p- C)

C
FIN

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 42

6.2 Estructura de Repeticin o Iteracin


Las estructuras que repiten una secuencia de instrucciones un nmero
determinado de veces se denominan Bucles y se denomina Iteracin al hecho
de repetir la ejecucin de una secuencia de acciones.
Un bucle es un proceso en el que se ejecutan una serie de operaciones un
nmero determinado de veces; las operaciones sern siempre las mismas, pero
con datos y resultados diferentes. En el caso de un programa de computadora, el
bucle o lazo es un conjunto de instrucciones que deben ser ejecutadas un cierto
nmero de veces, en un proceso iterativo o repetitivo; el bucle constar de una
entrada y una salida; la entrada se producir con una o varias instrucciones y la
salida del bucle -fin del proceso repetitivo- se producir cuando se cumple una
condicin.
Una iteracin es la repeticin controlada de la secuencia de acciones internas al
bucle.
En general un bucle constar de las siguientes partes:

Preparacin o arranque del bucle: una o ms instrucciones que pueden


ser: asignacin de valores a constantes, contadores a cero, dimensionando
listas, etc.
Cuerpo del bucle: grupo de instrucciones que integran realmente el bucle
para cumplir el objetivo especificado y que se repiten mientras no se cumple
la condicin.
Modificacin del bucle: conjunto de instrucciones que modifican el bucle,
haciendo progresar su ejecucin hasta su terminacin final; se suele realizar
con contadores o totalizadores.
Comprobacin de la condicin: suele constar de una instruccin para
averiguar si se ha producido la condicin que determinar la salida del bucle.

Entre las estructuras repetitivas se encuentran:


Desde (for)
Mientras (while)
Hacer mientras (do while)
6.2.1 Ciclo for
Realiza la accin un nmero finito de veces. Es una repeticin controlada por un
contador.
La sintaxis de la estructura for en C++ es la siguiente:
for (contador = lim_inf; contador < lim_sup; contador++)
{
/*Conjunto de instrucciones*/
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 43

Si el encabezado del for es for(contador = lim_inf; contador < lim_sup;


contador++) entonces el lmite superior es lim_sup-1 porque hay un operador
<.
Si el encabezado del for es for(contador = lim_inf; contador <= lim_sup;
contador++) entonces el lmite superior es lim_sup porque hay un operador <=.
Se utiliza un for cuando se sabe de antemano cuntas veces se ejecutar el
bloque de instrucciones del ciclo.
Ejemplos de encabezados for
for (j = 0; j <= 24; j = j +4)
Dom(j) = [0, 24] donde j vara de 4 en 4
for (j = 50; j > 5; j -= 5)
Dom(j) = (5, 50] donde j vara de 5 en 5
Incrementos de -5 o decrementos de 5
for (j = 2; j <= 20; j += 3)
j {2, 5, 8, 11, 14, 17, 20}, j vara de 3 en 3
Ejemplos:
1. Realizar la suma de los n primeros nmeros impares
#include <iostream.h>
main()
{
int n,r,i,s=0;
cout<<"cantidad de numeros a imprimir";
cin>>n;
for(i=1;i<=n;i++)
{
r=2*i-1;
cout<<r<<endl;
s=s+r;
}
cout<<"la suma es:"<<s<<endl;
return 0;
}
2. Realizar la suma de los n primeros nmeros pares
#include <iostream.h>
main()
{
int n,r,i,s=0;
cout<<"cantidad de numeros a pares: ";
cin>>n;
for(i=1;i<=n;i++)
{r=2*i;
cout<<r<<endl;
s=s+r;
}
cout<<"la suma es:"<<s<<endl;
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 44

3. Calcular la serie 2i, donde i vara de 1 hasta n


#include"iostream.h"
#include"math.h"
main()
{
int i,v, n;
cout<<"ingrese n";
cin>>n;
for(i=0;i<=n;i++)
{
v=pow(2,i);
cout<<"factorial de "<<i<<" es: "<<v<<endl;
}
}
4. Calcular el factorial de n nmeros enteros
#include"iostream.h"
main()
{
int i, n,f=1;
cout<<"ingrese n";
cin>>n;
for(i=1;i<=n;i++)
{
f=f*i;
cout<<"factorial de "<<i<<" es: "<<f<<endl;
}
}
5. Realizar la tabla de multiplicacin de un nmero dado
#include "iostream.h"
main()
{
int i, n=12,a;
cout<<"Ingrese un numero a multiplicar ";
cin>>a;
for(i=1;i<=n;i++)
{
cout<<a<<" X "<<i<<" = ";
cout<<a*i<<endl;
}
return 0;
}
6. Hallar la serie fibonacci
#include<iostream.h>
main()
{
int c=1,n,i;
cout<<"ingrese un nmero"; cin>>n;
for(i=1;i<=n;i++)
{
c=c+i;
cout<<"el nmero de fibonacci es: "<<c<<endl;
}
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 45

7. Juan quiere saber qu valores divisibles en 11 y en 15 existen en el rango de


0 a 1000 con el fin de ayudarle a hacer la tarea a su hermanita que est en
primaria. Juan desea adquirir un programa que calcule dichos nmeros y los
imprima en pantalla.
#include <iostream.h>
#include <stdlib.h>
int main()
{ int valor; /* variable de control del for */
cout << "Valores divisibles en 11 y 15 en un rango de 0 a 1000\n\n";
for (valor = 0; valor <= 1000; valor++)
{ if (valor % 11 == 0 && valor % 15 == 0) /* &&: operador booleano Y */
{ cout << valor << "\t"; /* imprime valor */
}
}
cout << endl; /* Coloca el cursor en la siguiente lnea */
system("PAUSE"); /* Ver resultados antes de presionar una tecla */
return 0;
}
Nota: Utilice for cuando sepa de antemano cuntas veces se ejecutar el
cuerpo del ciclo, de lo contrario utilice while o do/while.
6.2.2 Estructura Mientras (while)
La estructura repetitiva while, es aqulla en que el cuerpo del bucle se repite
mientras se cumple una determinada condicin, su representacin grfica es:

Condicin
?
si

no

Acciones

Pseudocdigo en espaol
Mientras condicin hacer
Accin S1
Accin S2 :
accin Sn
Fin_mientras

Pseudocdigo en ingls
while condicin do
<Acciones>
End_while

Diagrama N-S
Mientras condicin

Acciones
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 46

Ejemplo:
Contar los nmeros enteros positivos introducidos por teclado. Se consideran
dos variables enteras NUMERO y CONTADOR (contar el nmero de enteros
positivos). Se supone que se leen nmeros positivos y se detiene el bucle
cuando se lee un nmero negativo o cero.
Pseudocdigo
Inicio
contador
0
Leer (numero)
Mientras numero > 0 hacer
contador
contador+1
Leer (numero)
Fin_Mientras
Escribir('El nmero de enteros positivos es : ', contador)
Fin
Diagrama de Flujo
Inicio

C0

Leer

Nmero > 0

si

C C+1
Leer

no

Escribir
Nmeros

Nmero
Fin

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 47

Representacin en N-S
Inicio
C0
Leer nmero
Mientras nmero > 0
Leer nmero
C C+1

Escribir (nmero enteros, C)


Realiza una accin un nmero finito de veces mientras alguna
condicin es verdadera.
La sentencia de control while se encarga de repetir un bloque de
cdigo mientras se cumpla una condicin. El bloque de cdigo se debe
de encontrar entre llaves, excepto si es una sola lnea.
Todo for puede especificarse con un while:
for (j = 0; j <= 24; j = j +4)
{
/*Conjunto de instrucciones */
}
for (j = 50; j > 5; j -= 5)
{
/*Conjunto de instrucciones */
}
for (j = 2; j <= 20; j += 3)
{
/*Conjunto de instrucciones */
}

Ingeniera Informtica y Sistemas UNAMBA

j = 0;
while (j <= 24)
{
/*Conjunto de instrucciones */
j = j + 4;
}
j = 50;
while (j > 5)
{
/*Conjunto de instrucciones */
j -= 5; /* j = j -5 */
}
j = 2;
while (j <= 20)
{
/*Conjunto de instrucciones */
j += 3;
}

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 48

Ejemplos:
1. Calcular el promedio de n nmeros ingresados por el teclado
#include "iostream.h"
main()
{ int N, i, Num;
float Media, S;
cout<<"Digite cantidad de numeros a promediar ";
cin>>N; S=0; i=1;
while (i<=N)
{
cout<<"Digite el "<<i<<" numero: ";
cin>>Num;
S=S+ Num;
i++;
}
Media=S/N;
cout<<"el promedio es:"<<Media<<endl;
return 0;
}
Nota: Utilice while cuando el cuerpo del ciclo tenga que ejecutarse slo si una
condicin es cierta.
6.2.3 do/while
Similar al while, slo que se garantiza que el cuerpo del ciclo se ejecuta al menos
una vez. til para la validacin de datos dados por el usuario.
do { /*Conjunto de instrucciones*/
/*Una instruccin que en algn momento haga falsa la condicin que
controla el do/while */
} while (condicin);
Nota: Utilice do/while cuando desee que el cuerpo del ciclo se ejecute al menos
una vez.
Ejemplos:
1. Imprima la suma de los 7 primeros nmeros enteros y luego mostrar por
pantalla las diferentes sumas sucesivas, as como el resultado final.
#include <stdio.h>
void main() {
int digito = 0;
int suma = 0, n = 7;
printf("Suma desde 0 hasta 7.\n");
do{
suma = suma + digito;
printf("Suma parcial hasta %d es: %d\n",digito++,suma);
} while (digito <= n);
printf("El resultado final es: %d\n",suma);
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 49

2. Calcular el promedio de n notas considerando las siguientes


especificaciones:
Mayor que 10.5 aprobado
Entre 08-10.4 desaprobado
Menor que 08 reprobado
#include "iostream.h"
main()
{ int N, i, Num;
float Media, S;
cout<<"Digite cantidad de notas a promediar ";
cin>>N;
S=0;
for(i=1;i<=N;i++)
{cout<<"ingrese notas > 0: ";
cin>>Num;
S=S + Num;
}
Media=S/N;
cout<<"el promedio es:"<<Media<<endl;
if(Media>=10.5)
cout<<"Aprobado"<<endl;
else if(Media>=8 && Media < 10.5)
cout<<"Desaprobado"<<endl;
else
cout<<"Reprobado"<<endl;
return 0;
}
3. Ingresar un valor n por teclado e imprimir si es primo o no.
#include"iostream.h"
#include<math.h>
main()
{ int i,n,p=0;
cout<<"ingrese un numero n";
cin>>n;
if(n==0 || n==1)
cout<<" el numero "<<n<<" no es primo";
else
for(i=1;i<=n;i++)
{
if(n%i==0)
p=p+1;
}
if(p>2)
cout<<n<<" no es primo"<<endl;
else
cout<<n<<" es primo"<<endl;
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 50

//programa de las cuatro operaciones


#include "iostream.h"
main()
{ int opc;
double a, b, resul;
cout<<"<1> Suma"<<endl;
cout<<"<2> Resta"<<endl;
cout<<"<3> Multiplicacion"<<endl;
cout<<"<4> Division"<<endl;
cout<<"<5> Salir"<<endl;
for(;;)
{
do
{
cout<<"ingrese la opcion entre <1-5>";
cin>>opc;
}
while(opc<1||opc>5);
switch(opc)
{
case 1:cout<<"ingrese el primer valor"; cin>>a;
cout<<"ingrese el segundo valor";
cin>>b;
resul=a+b;
cout<<"el resultado es:"<<resul<<endl;
break;
case 2:cout<<"ingrese el primer valor";
cin>>a;
cout<<"ingrese el segundo valor";
cin>>b;
resul=a-b;
cout<<"el resultado es:"<<resul<<endl;
break;
case 3:cout<<"ingrese el primer valor";
cin>>a;
cout<<"ingrese el segundo valor";
cin>>b;
resul=a*b;
cout<<"el resultado es:"<<resul<<endl;
break;
case 4:cout<<"ingrese el primer valor";
cin>>a;
cout<<"ingrese el segundo valor";
cin>>b;
resul=a/b;
cout<<"el resultado es:"<<resul<<endl;
break;
case 5:;
return 0;
}
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 51

1. Desarrollar un programa que permita ingresar n notas. El programa debe


calcular: el numero de aprobados y el numero de desaprobados, el % de
aprobados y el % de desaprobados.

#include"iostream.h"
main()
{ int n,i,Aprobado=0,desaprobado=0;
float A[100],porcentaje;
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Nota"<<i<<":";
cin>>A[i];
}
for(i=1;i<=n;i++)
{
if(A[i]>=10.5)
Aprobado=Aprobado+1;
else
desaprobado=desaprobado+1;
}
cout<<"el numero de aprobados es:"<<Aprobado<<endl;
cout<<"el numero de desaprobados es:"<<desaprobado<<endl;
cout<<"el porcenaje de aprobados es:"<<Aprobado*100/n<<"%"<<endl;
cout<<"el porcentaje de desaprobados es:"<<desaprobado*100/n<<"%"<<endl;
return 0;

6.3 Estructura de Seleccin o Condicionales


Una estructura de decisin dirige el flujo de un programa en una cierta
direccin, de entre dos posibles, en funcin de un valor booleano. En
lenguajes de programacin estructurados la estructura condicional es la IF /
ELSE. La clusula ELSE en esta estructura es optativa. La forma en que trabaja
esta sentencia resulta casi evidente a partir de la lgica de la lengua inglesa: Si
(IF) la expresin booleana resulta cierta (TRUE), entonces la sentencia se
ejecuta. Si la expresin booleana resulta falsa (FALSE), el control pasa a la
siguiente (en orden descendente) instruccin del programa.
En las estructuras selectivas se evala una condicin y en funcin del resultado
la misma se realiza una opcin u otra. Las condiciones se especifican usando
expresiones lgicas. La representacin de una estructura selectiva se hace con
palabras en pseudocdigo (if, then, else o bien en espaol si, entonces, sino), con
una figura geomtrica en forma de rombo o bien con un tringulo en el interior
de una caja rectangular.
Las estructuras selectivas o alternativas pueden ser:
Simples
Mltiples

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 52

6.3.1 Alternativa Simple if (si)


La estructura alternativa simple si-entonces (en ingls if-then o bien IF-THEN)
ejecuta una determinada accin cuando se cumple una determinada condicin.
La seleccin si-entonces evala la condicin y . . .
Si la condicin es verdadera, entonces ejecuta la accin S1 (o acciones caso
de ser S1 una
accin compuesta y constar de varias acciones).
Si la condicin es falsa, entonces no hacer nada.
Realiza una accin si la condicin es verdadera, o
condicin es falsa.

evita una accin si la

La sintaxis de un if es la siguiente:
if (condicin_es_verdadera)
{ /*Bloque de instrucciones*/
}
Ejemplo:
if (n % 2 == 0)
{
cout << El nmero digitado es par;
}
A continuacin se muestra la grfica de la
estructura condicional simple.
Falso

Pseudocdigo en espaol
Si <condicin> Entonces
<accin S1>
Fin_si

Condicin?
Verdadero

Pseudocdigo en ingls
If <condicin> then
<accin S1>
end_if

Accin

Diagrama N-S
Condicin?
Verdadera

Falsa

Acciones

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 53

If anidada
#include <iostream.h>
#include <stdlib.h>
void main() /*main no retorna ningn valor (no es necesario "return 0;") */
{ int numero; /* Variable de entrada */
cout << "Digite un nmero entre 1 y 5: ";
cin >> numero;
if (numero == 1)
{
cout << "El nmero digitado es: 1..." << endl;
}
if (numero == 2)
{
cout << "El nmero digitado es: 2..." << endl;
}
if (numero == 3)
{
cout << "El nmero digitado es: 3..." << endl;
}
if (numero == 4)
{
cout << "El nmero digitado es: 4..." << endl;
}
if (numero == 5)
{
cout << "El nmero digitado es: 5..." << endl;
}
system("PAUSE"); /* Ver resultado en consola antes de pulsar una tecla */
}
Nota: Utilizar la estructura de seleccin if no implica utilizar siempre un else.
Hay ocasiones en que un else no es necesario, por tanto, no lo coloque.
6.3.2 if/else
Realiza una accin si la condicin es verdadera, o realiza una accin diferente si
la condicin es falsa.
if (condicin_es_verdadera)
{
/*Bloque de instrucciones
que se ejecutarn si la
condicin es verdadera. */
}
else
{
/*Bloque de instrucciones
que se ejecutarn si la
condicin es falsa.
*/
}

Ingeniera Informtica y Sistemas UNAMBA

if (n % 2 == 0)
{
cout << El nmero digitado es par;
}
else
{
cout << El nmero digitado es par;
}

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 54

Ejemplos:
1. Un nio de la I.E. Miguel Grau desea calcular el nmeros mayor de los
dos nmeros ingresados por el teclado.
if (a>b)
INICIO
cout<<"a es mayor que b";
else
N
cout<<"b es mayor que a";
NO

2. Cules de los dos nmeros es par o


impar
Es impar
if(x%2==0)
{ cout<<"el nmero es par";}
else
{ cout<<"el nmero es impar";}

N%2=0

SI

Es par

FIN

3. Encontrar el mayor, menor y valor medio de tres nmeros ingresados


por el teclado
#include"iostream.h"
main()
{ double a,b,c,mayor, menor, centro;
cout<<"ingrese el primer numero: ";
cin>>a;
cout<<"ingrese el segundo numero: ";
cin>>b;
cout<<"ingrese el tercer numero: ";
cin>>c;
if(a>b)
mayor=a;
else
mayor=b;
if(mayor<c)
mayor=c;
if(a<b)
menor=a;
else
menor=b;
if(menor>c)
menor=c;
centro=a+b+c-(mayor+menor);
cout<<"el numero menor es:"<<menor<<endl;
cout<<"el numero medio es: "<<centro<<endl;
cout<<"el numero mayor es: "<<mayor<<endl;
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 55

4. Una empresa comercializadora contrata vendedores a los cuales les paga un


salario que va de acuerdo al total de las ventas realizadas en el mes. La
siguiente tabla es tomada como referencia para calcular el sueldo de cada
vendedor
Venta ($)
0 500000
500001-1000000
1000001-1500000
1500001-2500000
2500001-4000000
Ms de 4000000

Sueldo ($)
80.000
160.000
320.000
450.000
550.000
20 % de las ventas

Realizar un programa en C++ que sistematice este procedimiento y al ingresar


las ventas de un empleado inmediatamente muestre el sueldo que le
corresponde.
#include <iostream.h>
#include <stdlib.h>
void main() /*main no retorna ningn valor (no es necesario "return 0;") */
{
int ventas; /* Variable de entrada */
int salario; /* Variable de salida */
cout << "\n\nDigite el total de ventas del empleado en pesos($): ";
cin >>ventas;
if (ventas <= 500000)
salario = 80000;
else if (ventas <= 1000000)
salario = 160000;
else if (ventas <= 1500000)
salario = 320000;
else if (ventas <= 2500000)
salario = 450000;
else if (ventas <= 4000000)
salario = 550000;
else
salario = int(ventas * 0.20);
cout << "El salario del empleado es: $" << salario << endl;
system("PAUSE"); /* Ver resultado en consola antes de pulsar una tecla */
} /* fin main() */
6.4 Alternativa Mltiple Switch-case (segn sea)
Cuando existen ms de dos elecciones (alternativas) posibles, es cuando se
presenta el caso de alternativas mltiples. Si el nmero de alternativas es
grande puede plantear serios problemas de escritura del algoritmo y
naturalmente de legibilidad.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 56

La estructura de decisin mltiple evaluar una expresin que podr tomar n


valores distintos 1, 2, 3, 4, .. n . Segn que elija uno de estos valores en la
condicin, se realizar una de las n acciones, o lo que es igual, el flujo del
algoritmo seguir un determinado camino entre los n posibles.
La representacin grfica se muestra a continuacin:
Diagrama de Flujo

1
Accin

Accin

S1

S2

Accin

Accin

Accin

S3

S4

Sn

Diagrama N-S
Modelo 1

Modelo 2

Pseudocdigo
En ingls la estructura de decisin mltiple se representa
Case expresin of
[e1]: accin S1
[e2]: accin S2
:
[en]: accin Sn
else
accin Sx
end_case

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 57

Ejemplo:
1. Se desea disear un algoritmo que escriba los nombres de los das de la
semana en funcin del valor de una variable DIA introducida por teclado.
Los das de la semana son 7; por consiguiente, el rango de valores de DIA ser
1..7, y caso de que DIA tome un valor fuera de este rango se deber producir un
mensaje de error advirtiendo la situacin anmala.
Inicio
Leer DIA
Segn_sea DIA hacer
1: escribir('Lunes')
2: escribir('Martes')
3: escribir('Mircoles')
4: escribir('Jueves')
5: escribir('Viernes')
6: escribir('Sabado')
7: escribir('Domingo')
else
escribir('Error')
fin_segn
fin
Estructura de seleccin mltiple. Se selecciona la accin a realizar, a partir de
muchos estados diferentes, dependiendo del valor de una expresin entera.
La sintaxis de un switch es la siguiente:
switch (expresion) {
case constante1:
/*Conjunto de instrucciones*/
break;
case constante2:
/*Conjunto de instrucciones*/
break;

case constante3:
/*Conjunto de instrucciones*/
break;
.
.
.
Default :
/*Conjunto de instrucciones*/

Ingeniera Informtica y Sistemas UNAMBA

switch (numero)
{
case 1:
cout << Digit el valor 1;
break;
case 2:
cout << Digit el valor 2;
break;
case 3:
cout << Digit el valor 3;

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 58

Ejemplo:
1. Leer un nmero entero 1 y 7 e imprime las siete maravillas del Per haciendo
uso de la sentencias switch.
#include"iostream.h"
main()
{
int op;
cout<<"ingrese el un numero de <1 - 7>:";
cin>>op;

switch(op)
{
case 1:cout<<" Las Lneas de Nazca "<<endl;
break;
case 2:cout<<" Lago Titicaca"<<endl;
break;
case 3:cout<<" Bosque de piedras de Huayllay"<<endl;
break;
case 4:cout<<" El Gran Pajaten"<<endl;
break;
case 5:cout<<" Meseta de Marcahuasi"<<endl;
break;
case 6:cout<<" Ciudadela de Markahuamachuco"<<endl;
break;
case 7:cout<<" Ciudadela de Chan Chan"<<endl;
break;
default:
cout<<"No corresponde a ninguna de las siete maravillas del
Per"<<endl;
break;
}
return 0;

2. Un almacn ofrece descuentos segn la hora de compra:


Frutas y verduras
Productos de aseo
Carnes
Ropa
Licores

7:30 a 8:30 a.m


10%
5%
5%
10%
8%

8:30 a 9:30 a.m


5%
2%
2%
8%
6%

Otra hora
0%
0%
0%
0%
0%

Realizar un programa en C++ que calcule el descuento de acuerdo a la hora de


compra.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 59

#include <iostream.h>
#include <stdlib.h>
void main()
{ system ("CLS"); //limpiar pantalla
int hora; //Guarda la hora de llegada del cliente
float legumbres, aseo, carnes, ropa, abarrotes;
float valorReal, valorNeto;
float ahorro;
cout << "Digite el valor de compra de las frutas y verduras: ";
cin >> legumbres;
cout << "Digite el valor de compra de los productos de aseo: ";
cin >> aseo;
cout << "Digite el valor de compra de carnes:
";
cin >> carnes;
cout << "Digite el valor de compra de ropa y calzado:
";
cin >> ropa;
cout << "Digite el valor de compra de licores:
";
cin >> abarrotes;
cout << "\nDigite la opcin segn la hora de compra:\n"
<< "\n 1
: La hora est entre las 7:30 a.m y 8:30 a.m"
<< "\n 2
: La hora est entre las 8:30 a.m y 9:30 a.m"
<< "\n Otro valor : Ninguna de las anteriores"
<< "\n\nOpcin: ";
cin >> hora;
//FASE DE PROCESAMIENTO: Procesamiento de los datos
valorReal = legumbres + aseo + carnes + ropa + abarrotes;
switch(hora)
{
case 1:
ahorro = legumbres*0.1 + aseo*0.05 + carnes*0.05 + ropa*0.1 +
abarrotes*0.08;
valorNeto = valorReal - ahorro;
break; //Salir del switch
case 2 :
ahorro = legumbres*0.05 + aseo*0.02 + carnes*0.02 + ropa*0.08 +
abarrotes*0.06;
valorNeto = valorReal - ahorro;
break; //Salir del switch
default :
valorNeto = valorReal;
ahorro = 0;
}
cout << "\n************************************"
<< "\n Valor total:
" << valorReal
<< "\n Valor neto a pagar: " << valorNeto
<< "\n Usted ahorr:
" << ahorro
<< "\n************************************";
system("PAUSE"); //Ver resultados antes de pulsar una tecla
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 60

VII. ARREGLO UNIDIMENSIONAL


7.1 ARREGLOS
Un arreglo es una coleccin de variables del mismo tipo que se referencian por
un nombre comn. Para acceder a un elemento especfico se utiliza un ndice
que indica la posicin del elemento.
Un arreglo es una estructura homogenia compuesta por varios componenetes,
todas del mimo tipo y almacenados consecutivamente en memoria. Cada
componente puede ser accedido directamente por el nombre de la variable
array seguido de un subndice encerrado entre corchetes.
7.1.1 Declaracin de un arreglo
Se debe especificar el tipo, el nombre y el tamao del mismo entre parntesis
cuadrados ([ ]).
Sintaxis:
Nombre_del_tipo Nombre_del_arreglo[tamao_declarado];
Valor de una
variable indizada

int A[n + 5] = 8

Nombre del tipo

Nombre del arreglo


variable del arreglo

ndice o subindice

El tamao del arreglo debe especificarse de forma explicita, es decir, su valor


debe definirse en tiempo de codificacin y no en tiempo de ejecucin.
Existen dos tipos de arrays: unidimensionales y multidimensionales.
7.1.2 Arreglos Unidimensionales
Un arreglo unidimensional es un tipo de datos estructurado que est formado
de una coleccin finita y ordenada de datos del mismo tipo. Es la estructura
natural para modelar listas de elementos iguales.
El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir,
podemos acceder a cualquier elemento del arreglo sin tener que consultar a
elementos anteriores o posteriores, esto mediante el uso de un ndice para cada
elemento del arreglo que nos da su posicin relativa.
Para implementar arreglos unidimensionales se debe reservar espacio en
memoria, y se debe proporcionar la direccin base del arreglo, la cota superior y
la inferior.
E1
Pos 0

E2
Pos 1

Arreglo[0] = E1
Arreglo[4] = E5

E3
Pos 2

E4
Pos 3

Arreglo[1] = E2
Arreglo[5] = E6

Ingeniera Informtica y Sistemas UNAMBA

E5
Pos 4

E6
Pos 5

E7
Pos 6

Arreglo[2] = E3
Arreglo[6] = E7

E8
Pos 7
Arreglo[3] = E4
Arreglo[7] = E8

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 61

El ndice de un arreglo siempre debe ser un valor entero.


El sexto elemento de un arreglo equivale al elemento ubicado en la posicin n-1
El elemento 6 del arreglo tiene indice 6 y es el sptimo elemento del arreglo.
7.1.3 Inicializacin de arreglos
Si se desea inicializar un arreglo en tiempo de codificacin se debe hacer de las
formas siguientes:
int arreglo[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arreglo[5] = { 0 };/* todos los elementos del arreglo se inicializan con 0 */
int arreglo[10] = { 5 };
/* arreglo = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 } */
int arreglo[6] = { 5, 4, 3 }; /* arreglo = { 5, 4, 3, 0, 0, 0 } */
int num[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
char cadena[5]=hola;
A continuacin se muestra dos maneras de definir arreglos:
#include <iostream.h>
#include <stdlib.h>
int main()
{
const int TAM = 10;
int tamanio;
int arreglo[TAM];
do {
cout << "Digite tamao del arreglo (entre 1 y 10): ";
cin >> tamanio;
} while (tamanio < 1 || tamanio > 10);

system("PAUSE");
return 0;

#include <iostream.h>
#include <stdlib.h>
#define TAM 10
int main()
{
int tamanio;
int arreglo[TAM];
do {
cout << "Digite tamao del arreglo (entre 1 y 10): ";
cin >> tamanio;
} while (tamanio < 1 || tamanio > 10);
system("PAUSE");
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 62

Ejemplos sobre arreglos


1. Desarrollar un algoritmo para leer datos en una Array y luego
imprimir
inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n incremento 1 en 1
leer A(i)
fin hacer
imprimiendo el array
hacer para i=0 mientras i<=n incrementado 1 en 1
imprime A(i)
fin hacer
fin

2. Desarrollar un algoritmo para sumar n


elementos del Array
inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n
incremento 1 en 1
leer A(i)
fin hacer
sumando los elementos del array
hacer para i=0 mientras i<=n incrementado 1
en 1
s=s+A(i)
fin hacer
imprimir s
fin

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 63

3. Desarrollar un algoritmo para multiplicar dos vectores numricos en un


tercer vector

inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n incremento 1 en 1
leer A(i)
fin hacer
multiplicando los elementos del array
hacer para i=0 mientras i<=n incrementado 1 en 1
C(i)=A(i)*B(i)
fin hacer
imprimir C(i)
fin

4. Desarrollar un algoritmo para


ingresar n notas en un array y
luego calcular el numero de
aprobados y desaprobados
inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n
incremento 1 en 1
leer A(i)
fin hacer
multiplicando los elementos del array
hacer para i=0 mientras i<=n
incrementado 1 en 1
C(i)=A(i)*B(i)
fin hacer
imprimir C(i)
fin

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 64

5. Inicializar e imprimir un arreglo a un valor dado por el usuario usando


for y while
/* Solucin del problema usando for */
#include <iostream.h>
#include <stdlib.h>
#define TAM 10
int main()
{
int arreglo[TAM];
int valor;
int indice;

/*Arreglo de enteros
*/
/*Valor de inicializacin del arreglo */
/*Variable de control ciclo for
*/

cout << "Digite el valor con el que desea inicializar los elementos del arreglo: ";

cin >> valor;


//INICIALIZAR EL ARREGLO
for (indice = 0; indice < TAM; indice++)
{
arreglo[indice] = valor;
}
//IMPRIMIR EL ARREGLO
for (indice = 0; indice < TAM; indice++)
{
cout << arreglo[indice] << " ";
}
system("PAUSE");
return 0;

6. Se define una constante TAM que es igual a 10, se declara un vector de


nombre arreglo y es de 10 elementos (TAM). Se declaran dos valores
enteros, valor que guarda el valor dado por el usuario para inicializar el
arreglo, indice cuyo fin es controlar el ciclo for. Se pide al usuario que digite
un valor para inicializar el arreglo, a continuacin se inicializa el arreglo
usando un ciclo for. Por ltimo se imprime el arreglo usando tambin la
estructura for y la misma variable de control.
A continuacin se muestra el mismo arreglo pero usando while. Se debe tener
en cuenta que todo ciclo for se puede especificar con una estructura while.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 65

/* Solucin del problema usando while */


#include <iostream.h>
#include <stdlib.h>
#define TAM 10
int main()
{ int arreglo[TAM];
/*Arreglo de enteros
*/
int valor;
/*Valor de inicializacin del arreglo */
int indice;
/*Variable de control ciclo for
*/
cout << "Digite el valor con el que desea inicializar los elementos del arreglo: ";

cin >> valor;


//inicializar el arreglo
indice = 0;
while (indice < TAM)
{ arreglo[indice] = valor;
indice++;
}
//IMPRIMIR EL ARREGLO
indice = 0;
while (indice < TAM)
{ cout << arreglo[indice] << " ";
indice++;
}
system("PAUSE");
return 0;
}

7. Una empresa desea procesar las ventas realizadas mes a mes anualmente con
el fin de obtener la siguiente informacin:
Mes en el que se obtuvo la mejor venta
El monto de la venta mxima obtenida
Total de las ventas
Promedio de ventas
Mostrar las ventas de menor a mayor
#include <stdlib.h>
#include <iostream.h>
void main(void)
{
float ventas[12];
//Arreglo que guarda las ventas del mes
int mes, i;
//Guarda mes(indice) de una venta en el arreglo
int mesVMax;
//Guarda el mes de la venta mxima
float ventaMax;
//Guarda el monto de la venta mxima
float totalVentas; //Guarda el monto total de ventas en el ao
float temporal;
//Se utiliza en el ordenamiento de las ventas
system("CLS");
//Limpiar pantalla
cout << "programa de procesamiento de ventas anuales: \n\n";
for(mes = 0; mes < 12 ; mes++)
{
cout << "Digite las ventas del mes nmero " << mes +1 <<": ";
cin >> ventas[mes];
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 66

system("CLS"); //Limpiar pantalla


cout << "Programa de procesamiento de ventas anuales: \nventas\n";
//Escribir ventas
for(mes = 0; mes < 12 ; mes++)
cout << "Mes " << mes +1 <<": " << ventas[mes] << "\n" ;
cout << "\n";
/*Determinar venta maxima, mes venta maxima, total ventas*/
totalVentas = ventas[0];
ventaMax = ventas[0];
mesVMax = 0;
for(mes = 1; mes < 12 ; mes++)
{
if(ventas[mes] > ventaMax)
{
ventaMax = ventas[mes];
mesVMax = mes;
}
totalVentas += ventas[mes];
}
//Ventas en orden ascendente
for (i = 0; i < 12; i++)
for(mes = 0; mes < 11 - i ; mes++)
{
if(ventas[mes] > ventas[mes+1])
{
temporal = ventas[mes];
ventas[mes] = ventas[mes+1];
ventas[mes+1] = temporal;
}
}
/*Muestra de resultados*/
cout << "La venta mxima se dio en el mes: " << mesVMax + 1 << endl
<< "La venta mxima en el ao fue:
" << ventaMax
<< endl
<< "Total de ventas en el ao:
" << totalVentas
<< endl
<< "Promedio de ventas en el ao:
" << totalVentas/12 << endl
<< "\nVentas en orden ascendente:
" << endl;
//Ventas en orden ascendente
for(mes = 0; mes < 12 ; mes++)
cout << ventas[mes] << " ";
cout << "\n\n";
system("PAUSE"); //Ver resultados en pantalla antes de pulsar una tecla
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 67

8. Desarrollar un programa que permita ingresar n notas. El programa debe


calcular: el numero de aprobados y el numero de desaprobados, el % de
aprobados y el % de desaprobados.

#include"iostream.h"
main()
{
int n,i,Aprobado=0,desaprobado=0;
float A[100],porcentaje;
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Nota"<<i<<":";
cin>>A[i];
}
for(i=1;i<=n;i++)
{
if(A[i]>=10.5)
Aprobado=Aprobado+1;
else
desaprobado=desaprobado+1;
}
cout<<"el numero de aprobados es:"<<Aprobado<<endl;
cout<<"el numero de desaprobados es:"<<desaprobado<<endl;
cout<<"el porcenaje de aprobados es:"<<Aprobado*100/n<<"%"<<endl;
cout<<"el porcentaje de desaprobados
es:"<<desaprobado*100/n<<"%"<<endl;
return 0;

7.2 Bsqueda lineal en un arreglo


A continuacin se implementa un algoritmo de bsqueda lineal que permite
determinar si un elemento est o no dentro de un arreglo. Este tipo de
bsqueda consiste en comparar el elemento buscado con cada uno de los
elementos del arreglo. Si el arreglo no est ordenado, existe la misma
probabilidad de que el elemento se encuentre, ya sea en el primer elemento
como en el ltimo.
#include"iostream.h"
main()
{int A[100], n, i, indice, nBuscar, encontrado=0;
cout<<"ingrese el tamao del vector: ";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]: ";
cin>>A[i];
}
cout<<"ingrese el nmero a buscar: ";
cin>>nBuscar;
for(i=1;i<=n;i++)
{
if(nBuscar==A[i])

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 68

encontrado=encontrado+1;
indice=i;
cout<<"el nmero "<<nBuscar<<" se encuentra en la posicin "<<indice<<endl;
}
}
if(encontrado>=1)
cout<<"el nmero "<<nBuscar<<" se repite "<<encontrado<<" veces"<<endl;
else
cout<<"no se encuentra el numero "<<nBuscar<<endl;
return 0;
}

9. Multiplicacin de dos vectores


#include "iostream.h"
int main()
{
int A[100],B[100],C[100], n,i;
cout<<"cuantos datos desea ingresar ";
cin>>n;
cout<<"ingresando datos para el vector A \n";
for(i=0;i<n;i++)
{cout<<"dato"<<i<<":";
cin>>A[i];
}
cout<<"ingresando datos para el vector B \n";
for(i=0;i<n;i++)
{cout<<"dato"<<i<<":";
cin>>B[i];
}
for(i=0;i<n;i++)
{C[i]=A[i]*B[i];
cout<<C[i]<<endl;
}
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 69

10. Desarrollar un programa que permita ingresar n nmeros en un arreglo y


luego imprimir los elementos del arreglo tal como se ingreso en forma inversa.
#include"iostream.h"
main()
{
int n,i,v=0,x=0,A[100];
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
for(i=1;i<=n;i++)
{
cout<<A[i]<<endl;
}
cout<<"vector inversa"<<endl;
for(i=n;i>0;i--)
{
cout<<A[i]<<endl;
}
return 0;
}
11. Desarrollar un programa que evalu el mayor valor de los elementos
ingresados en el vector
#include"iostream.h"
main()
{
int n,i,mayor,indice,j,A[100];
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
mayor=A[1];
for(j=1;j<=n;j++)
{
if(A[j]>mayor)
{
mayor=A[j];
indice=j;
}
}
cout<<"el mayor es:"<<mayor<<"y esta en la posicion"<<indice<<endl;
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 70

7.3 Bsqueda binaria o dicotmica


Para utilizar este algoritmo, el array debe estar ordenado. La bsqueda binaria
consiste en dividir el array por su elemento medio en dos subarrays ms
pequeos, y comparar el elemento con el del centro. Si coinciden, la bsqueda se
termina. Si el elemento es menor, debe estar (si est) en el primer subarray, y si
es mayor est en el segundo.
Ejemplo:
#include"iostream.h"
main()
{
int n,A[100],i,j,central,nbuscar,encontrado=0,primero=0,ultimo,temp;
cout<<"ingrese cantidad de elementos:"; cin>>n;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]: ";
cin>>A[i];
}
cout<<"elementos ordenados"<<endl;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
if(A[i]>A[j])
{
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]: "<<A[i]<<endl;
}
cout<<"ingrese el numero a buscar: ";
cin>>nbuscar;
ultimo=n;
while((primero<=ultimo) && (!encontrado))
{
central=(primero + ultimo)/2;
if(nbuscar==A[central])
encontrado=1;
else
if(nbuscar>A[central])
primero=central+1;
else
ultimo=central-1;
}
if(encontrado)
cout<<"el numero "<<nbuscar<<" se encuentra en la posicion
"<<central<<endl;
else
cout<<"el numero no se encuentra en el arreglo "<<endl;
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 71

7.4 Ordenamiento

Es la operacin de arreglar los registros de una tabla en algn orden secuencial de


acuerdo a un criterio de ordenamiento. El ordenamiento se efecta con base en el
valor de algn campo en un registro. El propsito principal de un ordenamiento es el
de facilitar las bsquedas de los miembros del conjunto ordenado.
El ordenar un grupo de datos significa mover los datos o sus referencias para que
queden en una secuencia tal que represente un orden, el cual puede ser numrico,

alfabtico o incluso alfanumrico, ascendente o descendente.


7.4.1 Mtodos de Ordenamiento
o Bubble Sort
o Selection sort
o Insertion Sort
o Shell Sort
o Quick Sort
o Heap Sort
Para todos los algoritmos se cuenta con la siguiente estructura de datos
Const MAX = 100
A = arreglo[1..MAX] de enteros
Variable N:entero
a) Bubble Sort (Mtodo de Burbuja)
Ordena los elementos del arreglo usando el mtodo de burbuja. Transporta en
cada pasada el elemento ms pequeo a la parte izquierda del arreglo A de N
elementos.
Algoritmo:
Burbuja1(A,N)
Inicio
Declarar i,j,aux:entero
Para i 2 hasta N haga
Para j i hasta 2 inc (1) haga
Si (A[j-1]>A[j]) entonces
Aux A[j-1]
A[j-1] A[j]
A[j] aux
Fin si
Fin para
Fin para
Fin
Codigo en C++
#include"iostream.h"
main( )
{
int n,i,j,temp,A[100];
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Nota"<<i<<":";
cin>>A[i];
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 72

for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
if(A[i]>A[j])
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
for(i=1;i<=n;i++)
cout<<A[i]<<endl;
return 0;

b) Shaker Sort (Ordenamiento por el Mtodo de la Sacudida)


Este mtodo es una optimizacin del mtodo de la burbuja. Consiste en mezclar
las dos formas como se puede realizar el mtodo de ordenamiento directo. En
cada pasada hay dos etapas, el la primera etapa se trasladan los elementos ms
pequeos hacia la izquierda almacenando en una variable el ltimo elemento
intercambiado. En la segunda etapa, se trasladan los elementos ms grandes
hacia la parte derecha del arreglo almacenando en otra variable la posicin del
ltimo elemento intercambiado.
Algoritmo:
Shakersort(A,N)
Inicio
Declarar i, izq, der, k, aux: entero
izq 2
der N
kN
Repetir
Para i der hasta izq inc (-1) haga
Si (A[i-1]>A[i]) entonces
Aux A[i-1]
A[i-1] A[i]
A[i] aux
ki
Fin si
Fin para
Izq k + 1
Para i izq hasta der haga
Si (A[i-1] > A[i]) entonces
Aux A[i-1]
A[i-1] A[i]
A[i] Aux
ki
Fin si
Fin para
Der k-1
Hasta que izq>der
Fin

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 73

Codigo en C++
#include<iostream.h>
#include<conio.h>
main( )
{
int izq,der, aux,i,N,k;
float A[20];
cout<<"ingrese dimencion de matriz"; cin>>N;
k=N;izq=2;der=N;
for(i=1;i<=N;i++)
{
cout<<i<<" : "; cin>>A[i];
}
while(izq<der)
{
for(i =der;i>=izq;i--)
if (A[i-1]>A[i])
{
aux=A[i-1];
A[i-1]=A[i];
A[i]=aux;
k=i;
}
izq=k+1;
for(i =izq ;i<=der;i++)
if (A[i-1]>A[i])
{
aux=A[i-1];
A[i-1]=A[i];
A[i]=aux;
k=i;
}
der=k-1;
}
for(i=1;i<=N;i++)
cout<<A[i]<<" ";
return 0;
}
c) Insertion Sort (Metodo de Ordenamiento por Insercin)
El objetivo de este mtodo es copiar la forma como los jugadores de cartas ordenan la
baraja en una mano. El objetivo de este mtodo es insertar un elemento en la parte
izquierda del arreglo que ya se encuentra ordenada. El proceso se repite desde el
segundo hasta el n-esimo elemento.
Algoritmo:
insercion(A,N)
Inicio
Declarar i, aux, k: entero
Para i 2 hasta N haga
Aux A[i]
k i-1
Mientras Que ((k>=1) y (aux<A[k])) haga
A[k+1] A[k]
k k -1
Fin MQ
A[k+1] aux
Fin para
Fin
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 74

Codigo en C++

#include "iostream.h"
main()
{
int A[100],N,i,k,aux;
cout<<"ingrese la dimensin del vector";
for(i=1;i<=N;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
for(i=2; i<=N;i++)
{
aux=A[i];
k=i-1;
while((k>=1)&&(aux<A[k]))
{
A[k+1]=A[k];
k=k-1;
}
A[k+1]=aux;
}
for(k=1;k<=N;k++)
cout<<A[k]<<endl;
return 0;
}

cin>>N;

d) Seleccin Sort (Ordenamiento por Seleccin)


La idea de este algoritmo es buscar el menor elemento del arreglo y colocarlo en
la primera posicin, luego se busca el segundo elemento ms pequeo del
arreglo y se coloca en la segunda posicin y as. El algoritmo se basa en:
1. Seleccionar el menor elemento del arreglo.
2. Intercambiar dicho elemento con el primero.
3. Repetir los pasos anteriores con los (n-1), (n-2)... elementos y as
sucesivamente hasta que solo quede el elemento mayor.
Algoritmo que ordena los elementos de un arreglo usando el mtodo de
seleccin directa. A arreglo de N elementos.
Algoritmo:
seleccion(A,N)
Inicio
Declarar i, menor, k, j: entero
Para i 1 hasta N-1 haga
Menor A[i]
ki
Para j i+1 hasta N haga
Si (A[j]<menor) entonces
Menor A[j]
kj
Fin si
Fin para
A[k] A[i]
A[i] menor
Fin para
Fin

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Codigo en C++
#include "iostream.h"
main()
{
int A[100],N,i,j,menor,k;
cout<<"ingrese la dimensin del vector";
for(i=1;i<=N;i++)
{
cout<<"A["<<i<<"]:"; cin>>A[i];
}
for(i=1; i<=N-1;i++)
{
menor=A[i];
k=i;
for(j=i+1; j<=N;j++)
{
if(A[j]<menor)
{
menor=A[j];
k=j;
}
}
A[k]=A[i];
A[i]=menor;
}
for(k=1;k<=N;k++)
cout<<A[k]<<endl;
return 0;
}

Pg. 75

cin>>N;

e) Shell Sort (Ordenamiento con el Mtodo de Shell)


Este algoritmo compara cada elemento del arreglo para su ubicacin correcta, con los
elementos que se encuentran en la parte izquierda del mismo. Este mtodo propone
que las comparaciones entre los elementos se efecten con saltos de mayor tamao,
pero con incrementos decrecientes.
Algoritmo:
shell(A,N)
Inicio
Declarar int, i, aux: entero
Declarar band: booleano
Int N+i
Mientras Que (int>1) haga
int parteentera(int/2)
band VERDADERO
Mientras Que (band=VERDADERO) haga
Band FALSO
i1
Mientras Que ((I+int)<=N) haga
Si (A[i]>A[i+int]) entonces
aux A[i]
A[i] A[i+int]
A[i+int] aux
Band VERDADERO
Fin si
i i+1
Fin MQ
Fin MQ
Fin MQ
Fin
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

f)

Pg. 76

Quick Sort (Mtodo Rpido de Ordenacin por Particin)

Este algoritmo es el ms eficiente y veloz de los mtodos de ordenacin interna.


La idea central del algoritmo es:
1. Se toma un elemento X de una posicin cualquiera del arreglo
2. Se trata de ubicar a X en la posicin de correcta del arreglo, de tal forma
que todos los elementos que se encuentran a su izquierda sean menores
o iguales a X y todos los elementos que se encuentran a su derecha sean
mayores o iguales a X.
3. Se repiten los pasos anteriores, pero con los conjuntos de datos que se
encuentran a la izquierda y a la derecha de la posicin correcta de X en el
arreglo.
4. El proceso termina cuando todos los elementos se encuentran en su
posicin correcta en el arreglo.
El paso 3 se puede hacer de forma iterativa o recursiva. En este ejemplo, se har
de forma iterativa, dejando el mtodo recursivo para ms adelante en el curso.
Se necesitan dos algoritmos. Quicksortitera y reduceitera.
Algoritmo que ordena los elementos de un arreglo A de N elementos, usando el
mtodo Quicksort iterativo.
Algoritmo:
Quicksortitera(A, N)
Inicio
Declarar top, ini, fin, pos: entero
Pilamayor: Arreglo[1..MAX] de entero
Pilamenor: Arreglo[1..MAX] de entero

Fin

Top 1
Pilamenor[top] 1
Pilamayor[top] N
Mientras Que (top>0) haga
Ini pilamenor[top]
Fin pilamayor[top]
Top top-1
Pos Reduceitera(ini, fin)
Si (ini<(pos-1)) entonces
Top top+1
Pilamenor[top] ini
Pilamayor[top] pos-1
Fin si
Si (fin>(pos+1)) entonces
Top top+1
Pilamenor[top] pos+1
Pilamayor[top] fin
Fin si
Fin MQ

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 77

VIII. ARREGLO BIDIMENSIONAL MATRICES


8.1 Definicion
Es un conjunto de datos homogneo, finito y ordenado, donde se hace referencia a cada
elemento por medio de dos ndices. El primero se utiliza para los renglones (filas) y el
segundo para las columnas. Tambin puede definirse como un arreglo de arreglos.
Internamente en memoria se reservan MxN posiciones consecutivas para almacenar
todos los elementos del arreglo.
Una matriz es un arreglo bidimensional, es decir, que se maneja con dos ndices. En
C++ se representan sus posiciones as:
Matriz M de 3x3
M[0][0]
M[0][1]
M[0][2]
M[1][0]
M[1][2]
M[1][2]
M[2][0]
M[2][1]
M[2][2]
El primer ndice indica las filas y el segundo las columnas.
8.1.1 Inicializar matrices
int arreglo1[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
int arreglo2[3][3] = { 0 }; /* todos los elementos del arreglo se inicializan con 0 */
int arreglo3[2][3] = { {2,4},{6,8} }; /* { {2, 4, 0}, {6, 8, 0} } */
Ejemplo:

Rellenar una matrz identidad de 4 por 4 elementos.


Una matriz identidad es aquella en la que la diagonal principal est llena de
unos y el resto de los elementos son cero. Para llenar la matriz identidad se debe
verificar que cuando los ndices i y j sean iguales, la posicin vale 1, en caso
contrario se asigna cero al elemento i,j.

Algoritmo
Inicio
Desde i = 1 hasta 4 hacer
Desde j = 1 hasta 4 hacer
Si i=j entonces
Matriz[i,j] =1
Sino
Matriz[i,j] =0
Fin_si
Fin_desde
Fin_desde
Fin

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 78

Ejemplos:
1. Inicializar e imprimir una matriz
#include <iostream.h>
#include <stdlib.h>
#define FILAS 2
#define COL 3
int main()
{
int matriz[FILAS][COL];
/*capturar datos de la matriz */
for (int fila = 0; fila < FILAS; fila++)
{
for (int col = 0; col < COL; col++)
{
cout << "Digite el elemento de la posicin [" << fila << "][" << col << "]: ";
cin >> matriz[fila][col];
}
}
cout << "\n\n***** MATRIZ GENERADA *****\n\n" ;
for (int fila = 0; fila < FILAS; fila++)
{
for (int col = 0; col < COL; col++)
{
cout << matriz[fila][col] << "\t";
}
cout << "\n";
}
system("PAUSE");
return 0;
}
2.

Suma de los elementos de una matriz


#include "iostream.h"
int main()
{
int matriz[15][15], i, j, n, su=0, m;
cout<<"ingrese nmero de filas:";
cin>>m;
cout<<"ingrese nmero de columnas:";
cin>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
cout<<"matriz"<<i<<j;
cin>>matriz[i][j];
su=su+matriz[i][j];
}
cout<<"matriz dato"<<endl;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<matriz[i][j]<<endl;
}
cout<<"la suma total es:"<<su<<endl;
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

3.

Pg. 79

Desarrollar un programa para leer los elementos de una matriz cuadrada, y


luego asignar los elementos de la diagonal principal a un vector M.
#include "iostream.h"
main()
{
int n,m,i,j,A[100][100],M[100];
cout<<"ingresando el orden de la matriz A[i][j]"<<endl;
cout<<"ingrese la fila de la matriz:";
cin>>n;

}
4.

cout<<"ingrese la columna de la matriz:";


cin>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cout<<"A["<<i<<"]"<<"["<<j<<"]:";
cin>>A[i][j];
if(i==j)
{
M[i]=A[i][j];
}
//cout<<M[i]<<endl;
}
}
cout<<"los elementos de la diagonal principal son:"<<endl;
for(i=1;i<=n;i++)
cout<<M[i]<<endl;
return 0;

Desarrollar un programa que multiplique una matriz de nxm y luego


imprima la matriz resultante.
#include "iostream.h"
main()
{
int n,m,i,a,b,k,j,A[100][100],B[100][100],C[100][100];
cout<<"ingresando el orden de la matriz A[i][j]"<<endl;
cout<<"ingrese la fila de la matriz:";
cin>>n;
cout<<"ingrese la columna de la matriz:";
cin>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cout<<"A["<<i<<"]"<<"["<<j<<"]:";
cin>>A[i][j];
}
}
cout<<"ingresando elementos de la matriz B"<<endl;
cout<<"ingrese la fila de la matriz";
cin>>a;
cout<<"ingrese la columna de la matriz";
cin>>b;
for(i=1;i<=a;i++)

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 80

for(j=1;j<=b;j++)
{
cout<<"B["<<i<<"]"<<"["<<j<<"]:";
cin>>B[i][j];
}

}
cout<<"multiplicando las dos matrices"<<endl;
if(m==a)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=b;j++)
{
C[i][j]=0;
for(k=1;k<=m;k++)
{
C[i][j]=C[i][j]+A[i][k]*B[k][j];
}
cout<<C[i][j]<<" ";
}
cout<<endl;
}
}
else
cout<<"no son compatibles las matrices"<<endl;
return 0;
}
5.

Los resultados de las elecciones de alcaldias en Per se esquematizaron en


una matriz como la que se muestra a continuacin:
Partido
Departamento
Lima
Arequipa

Tumbes

P1

P2

P3

P4

P5

P6

P0(Votos en
blanco)

La matriz almacena el nmero de votos que obtuvo cada partido en el departamento


correspondiente, as como los votos en blanco en cada departamento.
Se desea conocer:
Total de votos
Total de votos por departamento, para comparar con una tabla que indica el
nmero de personas que deben votar por departamento con el fin de detectar en
que departamentos vot menos del 60% de la poblacin electoral y tomar as
medidas de concientizacin cvica.
Nmero de personas que deben votar por estado:

Valle
Cauca
...
Caldas
Que partido obtuvo el mayor nmero de votos
Cul es el departamento con mayor nmero de abstenciones y cul es el
departamento con mayor porcentaje de abstenciones?

Algoritmo implementado en C++.


#include <iostream.h>
#include <stdlib.h>
#define DPTOS 3

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 81

void main()
{ int votos[DPTOS][7],votantes[DPTOS],abstencion[DPTOS],total,i,j;
int maximo,max_indice;
system("CLS");
for(i=0;i<DPTOS;i++) {
for(j=0;j<=6;j++) {
if(j == 0) {
cout<<"Votos en blanco en el Dpto " <<i<<": ";
cin>>votos[i][j]; // Almacena los datos leidos en la matriz
}
else {
cout<<"Votos del partido P"<<j<<" en el Dpto "<<i<<": ";
cin>>votos[i][j]; // Almacena los datos leidos en la matriz
}
}
}
cout<<endl;
for(i=0;i<DPTOS;i++){
cout<<"Personas que deben votar en el Dpto "<<i<<": ";
cin>>votantes[i];
}
cout <<endl;
for(j=1;j<=6;j++){
total=0; // Variable acumuladora, por lo cual hay que inicializarla en 0
for(i=0;i<DPTOS;i++){
total = total+votos[i][j];
}
cout<<"Votos obtenidos por el partido P"<<j<<": "<<total<<endl;
}
cout<<endl;
// Suma la matriz por filas para dar el total de votos por departamento
maximo=0;
for(i=0;i<DPTOS;i++){
total=0; // Variable acumuladora, por lo cual hay que inicializarla en 0
for(j=0;j<=6;j++){
total=total+votos[i][j];
if(i==1 && maximo<votos[i][j]){ // Busca el partido de ms votos en el segundo Dpto.
maximo=votos[i][j];
max_indice=j; // Almacena el ndice del partido con ms votos
}
}
abstencion[i]=votantes[i]-total; // Calcula la abstencin de una vez
cout<<"Votos totales en el Dpto "<<i<<": "<<total;
cout<<"; Vot el "<<total*100/votantes[i]<<"% de la poblacin."<<endl;
}
cout<<endl<<"El partido P"<<max_indice<<" obtuvo el mayor nmero de votos en el segundo
Dpto."<<endl<<endl;
maximo=0;
for(i=0;i<DPTOS;i++){
if(maximo<abstencion[i]){ // Busca el Dpto de ms abstencin
maximo=abstencion[i];
max_indice=i;
}
cout <<"Abstencin de "<<abstencion[i]<<" en el Dpto "<<i<<", para un porcentaje de"
<<abstencion[i]*100/votantes[i]<<"% "<<endl;
}
cout<<endl<<"El partido con mayor abstencin fue el Dpto "<<max_indice<<endl;
system("PAUSE");
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

6.

Pg. 82

Determinante de una matriz cuadrada


#include "iostream.h"
#include "iomanip.h"
main()
{
int i,j,k,l,m,n ;
float a[100][100];
float det;
cout<<"Ingrese el orden de la matriz";
cin>>n;
m=n-1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"A["<<i<<"]"<<"["<<j<<"]:";
cin>>a[i][j];
}
}
cout<<"imprimiendo los elementos de la matriz"<<endl ;
for(i=1;i<=n;i++)
{ cout<<"| ";
for(j=1;j<=n;j++)
{cout<<a[i][j]<<" ";
}
cout<<"|"<<endl;
}
det=a[1][1];
for(k=1;k<=m;k++)
{
l=k+1;
for(i=l;i<=n;i++)
{
for(j=l;j<=n;j++)
a[i][j] = ( a[k][k]*a[i][j]-a[k][j]*a[i][k] )/a[k][k]; }
det=det*a[k+1][k+1];
}
cout<<"la determinante de la matriz es: "<<det<<endl;
return 0;
}

7. Inversa de una matriz


#include<iostream.h>
#include<conio.h>
main(){
double A[100][100],B[100][100],C[100][100],R[100][100];

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 83

float U[100][100];
int i,j,k,l,m,n,tem,temporal,p;
cout<<"ingrese dimencion de matriz"; cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=2*n;j++)
{ A[i][j]=0 ;
if(j-i==n || i==j)
A[i][j]=1;
B[i][j]=A[i][j];
}
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=2*n;j++)
cout<<A[i][j]<<" ";
}
cout<<endl<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
cout<<i<<"-"<<j<<" : ";
cin>>A[i][j];
B[i][j]=A[i][j];
}
cout<<endl<<endl;
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=2*n;j++)
cout<<A[i][j]<<" ";
}
//hasta aqui ingreso matrizzzz
i=1;
for(j=1;j<=n;j++){
if(i==j && i<=n){
for(m=1;m<=2*n;m++){
U[i][m]=A[i][m]/B[i][i];
C[i][m]=U[i][m];}
}
if(i==j&&i<=n){
for(k=1;k<=n;k++)
if(i!=k && i<=n){
for(m=i;m<=2*n;m++)
C[k][m]=A[k][m]-U[i][m]*B[k][i];
}
}
for(l=1;l<=n;l++)
for(p=1;p<=n*2;p++)
A[l][p]=C[l][p];

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 84

for(l=1;l<=n;l++)
for(p=1;p<=n*2;p++){
B[l][p]=A[l][p];
}
i++;
}

cout<<endl<<endl;
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=n*2;j++)
cout<<U[i][j]<<" ";
}
cout<<endl<<endl;
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=n*2;j++)
cout<<A[i][j]<<" ";
}
cout<<endl;
getch();
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

IX.

Pg. 85

FUNCIONES Y PROCEDIMIENTOS
9.1

Procedimientos

9.2

Funciones

Son subprogramas, es decir, mdulos que forman parte de un programa y


realizan una tarea especfica. Un procedimiento puede tener sus propias
variables que se declaran en la seccin var del propio procedimiento. Estas se
llaman variables locales. La casilla de memoria para estas variables se crea cada
vez que el procedimiento es llamado y se borran al salir del mismo. Asi, las
variables locales para un procedimiento slo se pueden usar en el cuerpo del
procedimiento y no en el cuerpo principal del programa.
La funcin es una estructura autnoma similar a los mdulos. La diferencia
radica en que la funcin se usa para devolver un solo valor de un tipo de dato
simple a su punto de referencia. La funcin se relaciona especificando su
nombre en una expresin, como si fuera una variable ordinaria de tipo simple.
Las funciones se dividen en estndares y definidas por el usuario.
Estndar: Son funciones proporcionadas por cualquier lenguaje de
programacin de alto nivel, y se dividen en aritmticas y alfabticas.
Definidas por el usuario: son funciones que puede definirlas el
programador con el propsito de ejecutar alguna funcin especfica, y que
por lo general se usan cuando se trata de hacer algn clculo que ser
requerido en varias ocasiones en la parte principal del algoritmo.
Una funcion es un modulo de un programa separado del cuerpo principal, que realiza
una tarea especifica y que puede regresar un valor a la parte principal del programa u
otra funcion o procedimiento que la invoque.

Algoritmo:
Funcin factorial (n:entero):entero
var i,factorial:entero
inicio
si n <=1 entonces
factorial <-- 1
sino
factorial <-- 1
desde i = 1 hasta n hacer
factorial <-- factorial * 1
fin_desde
fin_si
fin
Evaluar la funcin f = x! / (y!(x-y)!)
Algoritmo hallarf
var x,y:entero
f:real
inicio
leer (x,y)
f <-- factorial (x)/(factorial (y)* factorial (x-y))
escribir ("El valor de f es:", f)
fin
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

9.3

Semejanzas entre Procedimientos y Funciones.

9.4

Pg. 86

La definicin de ambos aparece en la seccin de subprogramas de la


parte de declaraciones de un programa y en ambos casos consiste en
una cabecera, una parte de declaraciones una parte de instrucciones.
Ambos son unidades de programa independientes. Los parmetros,
constantes y variables declarados en una funcin o procedimiento son
locales a la funcin o al procedimiento, solamente son accesibles
dentro del subprograma.
Cuando se llama a una funcin o a un procedimiento, el nmero de los
parmetros reales debe ser el mismo que el nmero de los parmetros
formales y los tipos de los parmetros reales deben coincidir con los
tipos de los correspondientes parmetros formales, con una
excepcin: se puede asociar un parmetro real de tipo entero con un
parmetro formal por valor de tipo real.

Diferencias entre Procedimientos y Funciones.

Mientras que a un procedimiento se le llama mediante una instruccin


de llamada a procedimiento, a una funcin se la llama usando su
nombre en una expresin.
Puesto que se debe asociar un valor al nmero de una funcin,
tambin se le debe asociar un tipo. Por tanto, la cabecera de una
funcin debe incluir un identificador de tipo que especifique el tipo
del resultado. Sin embargo, no se asocia ningn valor con el nombre
de un procedimiento y, por tanto, tampoco ningn tipo.
Las funciones normalmente devuelven un nico valor a la unidad de
programa que la llama. Los procedimientos suelen devolver ms de un
valor, o pueden no devolver ninguno si solamente realizan alguna
tarea, como una operacin de salida.
En los procedimientos, los valores se devuelven a travs de
parmetros por variable, pero el valor de una funcin se devuelve
mediante la asignacin al nombre de la funcin de dicho valor en la
parte de instrucciones de la definicin de la funcin.

La forma general de una funcion es:


Tipodato Nomfun(parametros)
{
cuerpo de instrucciones;
return [dato,var,expresion];
}
Donde tipodato especifica el tipo de dato que regresara la funcion.
La instruccion RETURN es quien regresa un y solo un dato a la parte del
programa que la este llamando o invocando, sin embargo es de considerar
que return puede regresar un dato, una variable o una expresion
algebraica (no ecuacion o formula) como lo muestran los sigueintes
Ejemplos;
a) return 3.1416;
b) return area;
c) return x+15/2;

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

9.5

Pg. 87

Instruccion Return

Dentro del cuerpo de la funcion deber haber una instruccion return cuando
menos para regresar el valor, esta instruccion permite regresar datos.
Cuando tratamos de resolver un problema, resulta muy til utilizar la filosofa de
divide y vencers. Esta estrategia consiste en dividir nuestro problema en otros ms
sencillos
1. Funcin suma
#include "iostream.h"
double suma(double x, double y);
int main()
{
double a, b, resul;
cout<<"teclee el primer valor";
cin>>a;
cout<<"teclee el segundo valor";
cin>>b;
resul=suma(a, b);
cout<<resul<<endl;
return 0;
}
double suma(double x, double y)
{
double z;
z=x+y;
return z;
}
2. Calcular el costo total, incluido el IGV de 5%, en la compra de cantidad_par
artculos que cuestan precio_par cada uno.
#include"iostream.h"
double articulo(int n, double p, double igv);
main()
{ double precio, factura, impuesto;
int cantidad;
cout<<"ingrese el precio del articulo: ";
cin>>precio;
cout<<"ingrese la cantidad de articulos: ";
cin>>cantidad;
cout<<"ingrese el impuesta a la venta: ";
cin>>impuesto;
factura=articulo(cantidad,precio,impuesto);
cout<<cantidad<<" articulos cuestan: "<<factura<<" nuevos soles ";
return 0;
}
double articulo(int n, double p, double igv)
{ double costo;
//const double IGV=0.05;
costo=n*p;
return (costo+costo*igv);
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 88

3. Desarrollar un programa que te responda tu condicin a partir de una nota


obtenida: aprobado o desaprobado (considerar las notas de 0-20).
#include"iostream.h"
char calificacion(double nota, double notamin);
main()
{
double promedio, minimo;
char calif;
cout<<"ingrese el promedio de notas: ";
cin>>promedio;
cout<<"ingrese la nota minima para aprobar: ";
cin>>minimo;
calif=calificacion(promedio, minimo);
cout<<"Ud tiene un promedio de: "<<promedio<<" la nota minimo para aprobar
es: "<<minimo<<"por lo tanto ha ";
if(calif=='A')
cout<<"Aprobado";
else
cout<<"Desaprobado";
return 0;
}
char calificacion(double nota, double notamin)
{
if (nota>=notamin)
return 'A';
else
return 'R';
}
4. Calcular el costo total, incluido el IGV de 5%, en la compra de cantidad_par
artculos que cuestan precio_par cada uno.
#include<iostream.h>
double costo_total(int cantidad_par, double precio_par);
int main()
{
double precio, factura;
int cantidad;
cout<<"teclee el numero de articulos adquiridos: ";
cin>>cantidad;
cout<<"teclee el precio por articulo $:";
cin>>precio;
factura=costo_total(cantidad,precio);
cout<<cantidad<<" artculos a "
<<"$"<<precio<<" cada uno. \n"
<<"la factura total, con IGV, es de $"<<factura<<endl;
return 0;
}
double costo_total(int cantidad_par, double precio_par)
{
const double TASA_IGV=0.05; //5% igv
double subtotal;
subtotal=precio_par*cantidad_par;
return(subtotal+subtotal*TASA_IGV);
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 89

Cuatro operaciones aritmticas


#include "iostream.h"
main()
{
int opc;
double a, b, resul;
cout<<"<1> Suma"<<endl;
cout<<"<2> Resta"<<endl;
cout<<"<3> Multiplicacion"<<endl;
cout<<"<4> Division"<<endl;
cout<<"<5> Salir"<<endl;
for(;;)
{
do
{
cout<<"ingrese la opcion entre <1-5>";
cin>>opc;
}
while(opc<1||opc>5);
switch(opc)
{
case 1:cout<<"ingrese el primer valor"; cin>>a;
cout<<"ingrese el segundo valor"; cin>>b;
resul=a+b;
cout<<"el resultado es:"<<resul<<endl;
break;
case 2:cout<<"ingrese el primer valor"; cin>>a;
cout<<"ingrese el segundo valor"; cin>>b;
resul=a-b;
cout<<"el resultado es:"<<resul<<endl;
break;
case 3:cout<<"ingrese el primer valor"; cin>>a;
cout<<"ingrese el segundo valor"; cin>>b;
resul=a*b;
cout<<"el resultado es:"<<resul<<endl;
break;
case 4:cout<<"ingrese el primer valor"; cin>>a;
cout<<"ingrese el segundo valor"; cin>>b;
resul=a/b;
cout<<"el resultado es:"<<resul<<endl;
break;
case 5:;
return 0;
}
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 90

#include "iostream.h"
double suma(double x, double y);
double resta(double x, double y);
double multiplicacion(double x, double y);
double division(double x, double y);
double a,b,resul,z;
int main()
{
int opcion;
do{
cout<<"Operaciones Bsicas"<<endl;
cout<<"1. Suma"<<endl;
cout<<"2. Resta"<<endl;
cout<<"3. Multiplicacion"<<endl;
cout<<"4. Division"<<endl;
cout<<"5. Salir"<<endl;
cout<<"ingrese la opcion entre 1-5:";
cin>>opcion;
}
while(opcion<1||opcion>5);
cout<<"teclee el primer valor: "<<endl; cin>>a;
cout<<"teclee el segundo valor: "<<endl; cin>>b;
switch (opcion)
{
case 1:resul=suma(a,b);
cout<<"El Resultado es: "<<resul<<endl; break;
return 0;
case 2:resul=resta(a,b);
cout<<"El Resultado es: "<<resul<<endl;
return 0;
case 3:resul=multiplicacion(a,b);
cout<<"El Resultado es: "<<resul<<endl;
return 0;
case 4:resul=division(a,b);
cout<<"El Resultado es: "<<resul<<endl;
return 0;
case 5:cout<<"gracias"<<endl;
return 0;
}
}
double suma(double x, double y)
{
z=a+b;
return z;}
double resta(double x, double y)
{
z=a-b;
return z;}
double multiplicacion(double x, double y)
{
z=a*b;
return z;}
double division(double x, double y)
{
z=a/b;
return z;
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 91

El mtodo de la Burbuja haciendo uso de la Funcion

#include <iostream.h>
int leer(int A[100], int n);
int burbuja(int [100], int n);
void imprimir(int [100],int);
int n;
main ()
{ int n, A[100];
cout<<"ingresa cantidad de numeros:";
cin>>n;
leer(A,n);
burbuja(A,n);
return 0;
}
int leer(int A[100], int n)
{
int i;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
}
int burbuja(int A[100],int n)
{ int i,j,temp;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(A[i]>A[j])
{
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
}
imprimir(A,n);
}
void imprimir(int A[100],int n)
{
int i;
cout<<"el nuevo arreglo ordenado es : "<<endl;
for(i=1;i<=n;i++)
{
cout<<" "<<A[i];
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 92

Burbuja con funciones en librera


leercade.h

#include"iostream.h"
int leer(int A[ ], int n)
{
int i;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
}

void imprimir(int A[ ],int n)


{
int i;
cout<<"el nuevo arreglo ordenado es : "<<endl;
for(i=1;i<=n;i++)
{
cout<<" "<<A[i];
}
}
#include <iostream.h>
#include <leercade.h>
int leer(int A, int n);
int burbuja(int [ ], int n);
void imprimir(int [ ],int);
int n;
main ()
{ int n, A[100];
cout<<"ingresa cantidad de numeros:";
cin>>n;
leer(A,n);
burbuja(A,n);
return 0;
}
int burbuja(int A[ ],int n)
{ int i,j,temp;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(A[i]>A[j])
{
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
}
imprimir(A,n);
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

X.

Pg. 93

Recursividad
10.1 Dfinicion

Una funcin recursiva es una funcin que se llama asi misma directa o
indirectamente. La recursividad o recursin directa es el proceso por el que una
funcin se llama as misma desde el propio cuerpo de la funcin. La recursin
directa implica ms de una funcin.
Se dice que un proceso es recursivo si forma parte de s mismo, es decir, que se
define en funcin de s mismo. La recursin aparece en la vida diaria, en
problemas matemticos, en estructuras de datos y en muchos otros problemas.
Es un proceso extremadamente potente, por lo que hay que saber cundo y
cmo aplicarla.
10.2 Reglas fundamentales de la recursin

Existen 4 reglas fundamentales de la recursin, que tenemos que tener en


cuenta a la hora de realizar nuestro algoritmo.
1. Caso Base: se debe tener siempre, al menos un caso base que pueda
resolverse sin recursin.
2. Progreso: cualquiera llamada recursiva debe progresar hacia un caso
base.
3. Puede creerlo: asuma siempre que toda llamada recursiva interna
funciona correctamente.
4. Interes compuesto: nunca duplique el trabajo resolviendo la misma
instancia de un problema, en llamadas recursivas separadas.
Ejemplo:
si n 0
1
n!

n * ( n 1)! si n 0
N=3
factorial3*factorial(2)

N=2
factorial2*factorial(1)

N=1
factorial1*factorial(0)

N=0
factorial1

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 94

Ejemplos:

1. Factorial de un nmero
#include<iostream.h>
#include<conio.h>
long factorial(long);
int main()
{
int n;
cout<<"ingrese faotorial";
cin>>n;
for(int i=1; i<=n; i++)
cout << "facorial de " << i << "! = " << factorial(i) << endl;
//
getch();
return 0;
}
long factorial (long numero)
{
if (numero<=1)
return 1;
else
return(numero * factorial(numero - 1));
}
2. La serie Fibonacci
#include<iostream.h>
#include<string.h>
long fibonacci(long);
int main()
{
long numero, resultado;
cout << "\nIngrese un numero : ";
cin >> numero;
resultado = fibonacci(numero);
cout << "\nFibonacci (" << numero << ") : " << resultado<<endl;
return 0;
}
long fibonacci(long n)
{
if (n==0 || n==1)
return n;
else
return fibonacci(n-1) + fibonacci(n-2);
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 95

3. Potencia de un numero
#include<iostream.h>
long potencia(long , long);
int main()
{
long n,x, resultado;
cout << "\nIngrese la base: ";
cin >>x;
cout << "\nIngrese la potencia: ";
cin>> n;
cout << "\n la Potencia de: " << x << " es: " << potencia(x,n)<<endl;
return 0;
}
long potencia(long x, long n)
{
if (n==0)
return 1;
else
return x * potencia(x,n-1);
}
4. Numero binario
#include "iostream.h"
#include "conio.h"
int binario(int x);
main()
{int n;
cout<<"ingrese nro en base 10";
cin>>n;
cout<<"el nro en base 2 ="<<binario(n);
getch();
}
int binario(int x)
{ //int x;
if(x==1)
return 1;
else
{
return ((binario(x/2)*10)+x%2);
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

XI.

Pg. 96

Estructura de Datos
11.1 Definicion de Struct
Una estructura es una agrupacin, bajo un mismo nombre de variable, distintos
datos que pueden ser de diferente tipo. Las estructuras vienen a salvar la
limitacin de los arrays, que solo almacenan un nico tipo de dato.
Una estructura tambin es llamada registro y cabe su analoga con los registros
de una tabla, donde un registro tiene varios datos (campos) y estos pueden
diferir en su tipo:
Ejemplo:
struct usuarios_t {
int dni;
char nombres[50];
char apellido[30];
time_t nacimiento;
};
//un registro usuarios:
struct usuarios_t usuario;
usuario.dni=27651109
strcpy(usuario.nombres,"Jose Maria");
...
//un array de registros:
struct usuarios_t usuarios[10];
usuario[0].dni=27651109
strcpy(usuario[0].nombres,"Jose Maria");
usuario[1].dni=26852789
strcpy(usuario[1].nombres,"Juan Carlos");
...
Ejemplo:
struct Date {
int day;
int month;
int year;
} today;
int main() {
today.day = 4;
today.month = 7;
today.year = 1776;
}
11.2 Union
Una union se declara de la misma forma que una estructura, reemplazando
struct por union. La diferencia est en que todos los miembros de la union
comparten el mismo espacio en memoria, por lo que solo se puede tener
almacenado un miembro de ellos en cada momento. El tamao de la union
estar dado por el miembro ms largo de la misma.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 97

Ejemplo:
struct usuarios_t {
int dni;
char nombres[50];
char apellido[30];
time_t nacimiento;
};
union usuario_t usuario;

/* Declaracin de la variable */

11.3 Enum
Una enumeracin es un conjunto de constantes enteras. A la enumeracin se le
puede asignar un nombre, que se comportar como un nuevo tipo de dato que
solo podr contener los valores especificados en la enumeracin.
Ejemplo:
enum dias_semana {Lunes=1, Martes=2, Miercoles=3, Jueves=4, Viernes=5,
Sbado=6, Domingo=7 };
dias_semana dia;
dia
= Lunes;
dia
= 1; /* Ambas asignaciones son equivalentes */
Ejemplo con estructuras:
1. Datos del alumno y su promedio de notas
#include "iostream.h"
#include "iomanip.h"
struct Alumno {

int codigo;
char curso[50];
int nota1;
int nota2;
int nota3;
float promedio;

};
Alumno AlumnoSec[2];

int main()
{
int i, n;
cout<<"cuantos datos desea ingresar? ";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Ingrese el cdigo del estudiante "<<i<<" ";
cin>>AlumnoSec[i].codigo;
cout<<"Ingrese el curso del estudiante: ";
cin>>AlumnoSec[i].curso;
cout<<"Ingrese nota1: ";
cin>>AlumnoSec[i].nota1;
cout<<"Ingrese nota2: ";
cin>>AlumnoSec[i].nota2;
cout<<"Ingrese nota3: ";

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 98

cin>>AlumnoSec[i].nota3;
AlumnoSec[i].promedio =
(AlumnoSec[i].nota1+AlumnoSec[i].nota2+
AlumnoSec[i].nota3)/3.0;
cout<<"el promedio es:"<<AlumnoSec[i].promedio<<endl;

}
cout<<setw(20)<<"CODIGO";
cout<<setw(20)<<"CURSO";
cout<<setw(20)<<"PROMEDIO"<<endl;
for(int c=1;c<=n;c++)
{
cout<<setw(20)<<AlumnoSec[c].codigo;
cout<<setw(20)<<AlumnoSec[c].curso;
cout<<setw(20)<<AlumnoSec[c].promedio<<endl;

}
return 0;

2. Estructura - producto
#include "iostream.h"
#include "iomanip.h"
#include "iostream.h"
struct ventas { char cod_producto[50];
char nombre_producto[50];
double precio;
int cantidad;
double importe;
};
int main()
{
const int numero=2;
ventas mante_ventas[numero];
cout<<"ingreso de productos"<<endl;
cout<<"--------------------"<<endl;
for(int i=0;i<=numero;i++)
{
cout<<"\n datos del productos"<<i+1<<endl;
cout<<"codigo: ";cin>>mante_ventas[i].cod_producto;
cout<<"Nombre: ";cin>>mante_ventas[i].nombre_producto;
cout<<"Precio: ";cin>>mante_ventas[i].precio;
cout<<"Cantidad: ";cin>>mante_ventas[i].cantidad;
mante_ventas[i].importe=(mante_ventas[i].cantidad*mante_ventas[i].precio);
}
cout<<"\n REPORTE DE PRODUCTOS"<<endl;
cout<<"-----------------------\n";
cout<<setiosflags(ios::left);
cout<<setw(10)<<"Codigo";
cout<<setw(15)<<"Nombre";

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 99

cout<<setw(10)<<"Precio";
cout<<setw(10)<<"Cantidad";
cout<<setw(10)<<"Importe"<<endl;
for(int c=0;c<=numero;c++)
{
cout<<setw(10)<<mante_ventas[c].cod_producto;
cout<<setw(15)<<mante_ventas[c].nombre_producto;
cout<<setw(10)<<mante_ventas[c].precio;
cout<<setw(10)<<mante_ventas[c].cantidad;
cout<<setw(10)<<mante_ventas[c].importe<<endl;
}
return 0;

3. Estructuras Anidadas - libro


#include"iostream.h"
#include"iomanip.h"
struct Fecha_edicion
{
unsigned int dia;
unsigned int mes;
unsigned int anyo;
};
struct Datos_libro
{
char nombre[50];
char autor[30];
char editorial[30];
Fecha_edicion fecha;
};
struct Libro
{
Datos_libro datos_libro;
double costo;
};
main()
{ Libro lib;
cout<<"Nombre del Libro: ";cin.getline(lib.datos_libro.nombre,51);
cout<<"Nombre del Autor: ";cin.getline(lib.datos_libro.autor,31);
cout<<"Nombre del Editorial: ";cin.getline(lib.datos_libro.editorial,50);
cout<<endl<<"Fecha de edicin del libro"<<endl;
cout<<"Dia: ";cin>>lib.datos_libro.fecha.dia;
cout<<"Mes: ";cin>>lib.datos_libro.fecha.mes;
cout<<"Anyo: ";cin>>lib.datos_libro.fecha.anyo;
cout<<"Costo: ";cin>>lib.costo;
cout<<"LISTA DE DATOS"<<endl;
cout<<"LIBRO";
cout<<setw(20)<<"AUTOR";
cout<<setw(20)<<"EDITORIAL";
cout<<setw(20)<<"FECHA DE EDICION";
cout<<setw(20)<<"COSTO"<<endl;

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 100

cout<<lib.datos_libro.nombre;
cout<<setw(20)<<lib.datos_libro.autor;
cout<<setw(20)<<lib.datos_libro.editorial;
cout<<setw(20)<<lib.datos_libro.fecha.dia;
cout<<lib.datos_libro.fecha.mes;
cout<<lib.datos_libro.fecha.anyo;
cout<<setw(20)<<lib.costo<<endl;
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 101

XII. FICHEROS O ARCHIVOS EN C++


12.1 Definicin
Para empezar con el manejo de archivos es necesario recordar el concepto de flujo, el
cual se define como un dispositivo que consume o produce informacin. Para
poder usar un flujo estndar basta con incluir la biblioteca iostream.h.
12.2 Lectura/escritura
Para poder trabajar los ficheros como flujos es necesario incluir la librera fstream.h, y
segn la utilizacin que queramos dar a este fichero (lectura o escritura) deberemos
declarar el tipo de flujo.
Para crear un archivo de salida declaramos una variable de tipo ofstream, el cual ya
est declarado dentro de nuestra librera.
#include<fstream.h>
int main()
{
ofstream archivo;
archivo.open("miarchivo.txt");
archivo<<"hola desde este archivo\n";
archivo<<"ya he escrito algo\n";
archivo.close();
}
Aqu declaramos a archivo como variable tipo ofstream, y posteriormente utilizamos
su funcin miembro open para asociarla a un archivo, se pude asociar directamente
en la declaracin de la siguiente manera:
ofstream archivo(miarchivo.txt);
Tanto la primera como la segunda forma admiten un segundo argumento que
especifica el modo de apertura de un archivo. Los modos disponibles se muestran en la
siguiente tabla y pueden ser utilizados incluyendo la librera iostream.h.
ios::app
ios::out
ios::trunc
ios::in
ios::binary

Se escribe al final de archivo


El archivo se abre para escritura
Si el archivo existe se eliminar su contenido
El archivo se abre para lectura, el archivo original no ser
modificado
El archivo se abre en modo binario

Con el archivo creado en el ejemplo anterior utilizaremos el siguiente programa para


escribir al final de l.
#include<iostream.h>
#include<fstream.h>
int main()
{
ofstream archivo("miarchivo.txt", ios::app);
archivo<<"hola desde este archivo de nuevo\n";
archivo<<"ya he escrito algo de nuevo\n";
archivo.close();
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 102

El mtodo para abrir un archivo en modo lectura es muy similar, pero en este caso
utilizaremos ifstream. Para tener el control del fichero, aparte de conocer los
modos de apertura de un archivo, debemos de conocer el delimitador, as como en
las cadenas existe el carcter de fin de cadena('\0'), en los archivos est el fin de
archivo (EOF).
El siguiente programa lee caracteres de un archivo y los imprime en pantalla hasta
llegar al fin de ste.
#include<iostream.h>
#include<fstream.h>
int main(){
char caracter;
ifstream archivo("miarchivo.txt", ios::in);
while(!archivo.eof()){
archivo.get(caracter);
cout<<caracter;
}
archivo.close();
}
El programa abre el archivo en modo de lectura, inmediatamente el indicador de
posicin se coloca en el primer caracter del flujo (el archivo), la funcin
eof() devuelve verdadero en caso de que en la posicin en la que est el indicador
est el fin de archivo, nosotros hacemos una comprobacin de sto, y mientras
(bucle while) no se llegue al final de archivo se leer un caracter de ste flujo, al
hacer esto el indicador de posicin avanzar, posteriormente se imprime el caracter
ledo en pantalla y continua el ciclo.
Que pasara si el archivo no existiese?, el programa entrara en un ciclo infinito, por
eso debemos de asegurarnos de que el flujo se ha creado bien.
#include<iostream.h>
#include<fstream.h>
int main()
{
char caracter;
ifstream archivo("miarchivo2.txt", ios::in);
if(archivo){
while(!archivo.eof()){
archivo.get(caracter);
cout<<caracter;
}
archivo.close();
}else{
cerr<<"el archivo no existe"<<endl;;
return 1;
}
return 0;
}
Para el manejo de caracteres desde un archivo podemos utilizar las funciones
miembro get, getline, read, write, ignore, gcount con las que ya tenemos un poco de
experiencia.
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 103

Adems de stas, existen otras funciones que nos sern muy tiles para que no sea
tan secuencial la forma en la que leemos o escribimos el archivo.
tellg()
seekg()

Devuelve la posicin de lectura


Se coloca dentro del flujo en la posicin pasada como argumento para
poder leer.
tellp()
Devuelve la posicin de escritura
seekp() Se coloca dentro del flujo en la posicin pasada como argumento para
poder escribir.
Ya sabr de la importancia de los archivos, pero quiz piensa en cosas demasiado
grandes, pensar en una base de datos aveces puede causar que nuestro inters se
deteriore con el avance del proyecto, esto claro, si no se tiene claramente definido el
objetivo de sta. Para practicar con el manejo de archivos piense en algo pequeo,
algo que le llame la atencin, vuelva a recordar que con cosas pequeas se
construyen cosas ms grandes.
#include<iostream.h>
#include<fstream.h>
#include<string.h>
int main(){
char texto_preg[300],texto_resp[300],*compara=NULL;
ifstream archivo("arch.txt", ios::in);
if(!archivo){
cerr<<"error al abrir el archivo";
return 1;
}
cout<<"* hola"<<endl;
cout<<"> ";
cin.getline(texto_resp,290);
while(texto_resp[0]!='\0'){
archivo.seekg(0);
do{
archivo.getline(texto_preg,290);
compara=strstr(texto_resp,texto_preg);
if(archivo.eof()){
cout<<"* no se contestar, dimelo por favor"<<endl;
cin.getline(texto_preg,290);
archivo.close();
ofstream archivoS("arch.txt",ios::app);
archivoS<<texto_resp<<endl;
archivoS<<texto_preg<<endl;
archivoS.close();
archivo.open("arch.txt", ios::in);
}
}while(compara==NULL);
cout<<"> ";
archivo.getline(texto_preg,290);
cout<<"* "<<texto_preg<<endl;
cout<<"> ";
cin.getline(texto_resp,290);
}
archivo.close();
return 0;
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 104

Se trata de un simple programa de conversacin, donde el elemento principal es el


archivo arch.txt, el cual contiene una conversacin en l.
El programa inicia abriendo el archivo en modo lectura, si existe un error el programa
termina. Empieza su conversacin diciendo hola, y espera a que el usuario
responda, atrapa su respuesta y la guarda en una cadena, si tecle algo que no fuera
simplemente un enter entonces continua dentro del bucle.
Se posiciona al inicio del archivo, y, dentro de otro bucle, lee la cadena de caracteres
del archivo con un mximo de 290 caracteres y la almacena en texto_preg.
Utilizando la funcin strstr() de la biblioteca string.h, compara la cadena
introducida por el usuario con la cadena que acaba de leer del archivo, la funcin
strstr() devuelve un apuntador a la primera localizacin de la cadena texto_preg en
texto_resp, si no se encuentra devuelve NULL.
Si se ha llegado al final del archivo, es decir, no se encontr que contestar, pide a la
persona que le diga que debe de contestar, entonces cierra el archivo y lo vuelve a
abrir pero esta vez en modo de escritura para aadir la pregunta del usuario con su
respectiva respuesta, luego cierra el archivo de salida y lo abre en modo de lectura
de nuevo.
Estos pasos de buscar y, si no encuentra entonces preguntar, continuarn mientras
no se encuentren coincidencias entre lo escrito y lo que est dentro del archivo.
Despus, continuando con el bucle de mayor nivel, vuelve a leer del archivo una
cadena de caracteres, y empieza la conversacin de nuevo. Para terminar el
programa simplemente el usuario debe teclear enter sin ningn otro caracter.
12.3 Implementacion bsicas de archivos
Borland c++ utiliza flujos (streams) para gestionar flujos de datos, incluyendo el flujo
de entrada y salida. Un archivo es una secuencia de bits almacenados en algn
dispositivo externo tal como un disco o una cinta magntica. Los bits se interpretan de
acuerdo al protocolo de algn sistema software. Si estos bits se agrupan en bytes de 8
bits interpretados por el codigo ASCII, entonces el archivo se denomina archivo de
texto y puede ser procesados por editores estndares.
La biblioteca de flujo contiene tres clases, ifstream, ofstream y fstream, y mtodos
asociados para crear archivos y manejo de entrada y salida de archivos.
La apertura de un flujo de entrada se debe declarar en la clase ifstream.
La apertura de un flujo de salida se debe declarar en la clase ofstream.
Los flujos que realicen operaciones de entrada y salida deben declarar en la clase
fstream.
// escritura
#include <fstream.h>
void main()
{
ofstream fichero("d:/ejemplo.txt");
fichero<<"Hola como estan deben irse a la casa "<<endl;
fichero << "Adios" << endl;
fichero.close();
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 105

//lectura
#include <fstream.h>
#include <iostream.h>
main()
{
fstream fichero;
char texto[200];
// Abro para lectura
fichero.open("d:/ejemplo.txt", ios::in); //io::in=modo entrada
fichero >> texto;
// Leo una primera linea
while (!fichero.eof()) // Mientras se haya podido leer algo // eof:devuelve un
valor distinto a cero
{
cout << texto << endl; // Muestro lo que lei
fichero >> texto;
// Y vuelvo a intentar leer
}
fichero.close();
// Finalmente, cierro
}
12.4 Modos de abrir un archivo
Un archivo puede ser abierto de dos formas distintas, en modo texto o en modo binario.
Modo texto

w ---- crea un fichero de escritura. Si ya existe lo crea de nuevo.


w+ --- crea un fichero de escritura y lectura. Si ya existe lo crea de nuevo.
a ---- abre o crea un fichero para escribir al final del mismo.
a+ --- abre o crea un fichero para leer y aadir datos al final del mismo.
r ---- abre un fichero de lectura.
r+ --- abre un fichero de lectura y escritura.
Modo binario

wb ---- crea un fichero de escritura. Si ya existe lo crea de nuevo.


w+b --- crea un fichero de escritura y lectura. Si ya existe lo crea de nuevo.
ab ---- abre o crea un fichero para escribir al final del mismo.
a+b --- abre o crea un fichero para leer y aadir datos al final del mismo.
rb ---- abre un fichero de lectura.
r+b --- abre un fichero de lectura y escritura.
Escribir en un archivo de texto
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
void main(void){
char d,cade[17]="Hola Como estas?";
int c;
FILE *arch;
//clrscr();
if(!(arch=fopen("archivo.txt","w"))){
printf("Error");
exit(0);
}
else{

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 106

for(c=0;c<=17;c++){
d=cade[c];
fputc(d,arch);
}
}
fclose(arch);
if(!(arch=fopen("archivo.txt","r"))){
printf("Error");
exit(0);
}
else{
fgets(cade,18,arch);
printf("%s",cade);
}
fclose(arch);
getch();
}
Muestra un Fichero
#include <stdio.h>
void main()
{
FILE *archdisco;
archdisco = fopen("c:/alumnos3.txt", "r");
fclose(archdisco);
getchar();
}
Crear un archivo *.txt con el codigo y nombre del alumno
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
struct {
char codigo[10];
char nombre[30];
} alumno;
void main() {
//clrscr();
// captura de campos
cout<<"Digite su codigo :";
gets(alumno.codigo);
cout<<"Digite su nombre :";
gets(alumno.nombre);
// grabando a disco
FILE *archdisco;
archdisco = fopen("c:alumnos3.txt","a");
fwrite(&alumno,sizeof(alumno),1,archdisco);
fclose(archdisco);
//avisando usuario
cout<<"alumno insertado";
getchar();
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 107

Implementacin bsica de archive en c++


#include"fstream.h"
#include"iostream.h"
#include"stdlib.h"
#include"iomanip.h"
void grabar();
void recuperar();
void main()
{ int opc;
for(;;)
{
cout<<setw(35)<<"Grabar 1"<<endl;
cout<<setw(35)<<"Recuperar 2"<<endl;
cout<<setw(35)<<"Salir 3"<<endl;
cout<<"ingrese la opcion: ";
cin>>opc;
switch(opc)
{
case 1:grabar();break;
case 2:recuperar();break;
case 3:exit(0);break;
default:cout<<"ingrese la opcion correcta"<<endl;break;
}
}
}
void grabar()
{ char ruta[20];
char texto[200];
cout<<"ingrese el texto: ";
cin>>texto;
//cin.getline(texto,201);
cout<<"ingrese la unidad a grabar: ";
cin>>ruta;
ofstream fichero(ruta);
fichero<<texto<<endl;
fichero<<"Adios"<<endl;
fichero.close();
}
void recuperar()
{ char ruta[20];
fstream fichero;
char texto[200];
cout<<"ingrese la ruta";cin>>ruta;
fichero.open(ruta,ios::in);
if(fichero.bad())
{
cout<<"Error no se encuentra el archivo";
}
else
{
fichero>>texto;
while(!fichero.eof())
{
cout<<texto<<endl;
fichero>>texto;
}
}
fichero.close();
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 108

XIII. PUNTEROS O APUNTADORES


13.1 Definicin de un apuntador

Un apuntador es una variable que contiene la direccin en memoria de otra


variable, Se pueden tener apuntadores a cualquier tipo de variable.
El operador unario o mondico & devuelve la direccin de memoria de una
variable.
El operador de indireccin o dereferencia * devuelve el contenido de un objeto
apuntado por un apuntador''.
Para declarar un apuntador para una variable entera hacer:
int *apuntador;
Se debe asociar a cada apuntador un tipo particular. Por ejemplo, no se puede
asignar la direccin de un short int a un long int.
Para tener una mejor idea, considerar el siguiente cdigo:
main()
{
int x = 1, y = 2;
int *ap;
ap = &x;
y = *ap;
x = ap;
*ap = 3;
}
Cuando se compile el cdigo se mostrar el siguiente
warning: assignment makes integer from pointer without a cast.

mensaje:

Con el objetivo de entender el comportamiento del cdigo supongamos que la


variable x esta en la localidad de la memoria 100, y en 200 y ap en 1000.
Nota: un apuntador es una variable, por lo tanto, sus valores necesitan ser
guardados en algn lado.
int x = 1, y = 2;
int *ap;
ap = &x;
100
x 1

200
y 2

1000
ap 100

Las variables x e y son declaradas e inicializadas con 1 y 2 respectivamente, ap


es declarado como un apuntador a entero y se le asigna la direccin de x (&x).
Por lo que ap se carga con el valor 100.
y = *ap;
100
x 1

Ingeniera Informtica y Sistemas UNAMBA

200
y 1

1000
ap 100

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 109

Despus y obtiene el contenido de ap. En el ejemplo ap apunta a la localidad de


memoria 100 -- la localidad de x. Por lo tanto, y obtiene el valor de x -- el cual es
1.
x = ap;
100

200

x 100 y 1

1000
ap 100

Como se ha visto C no es muy estricto en la asignacin de valores de diferente


tipo (apuntador a entero). As que es perfectamente legal (aunque el compilador
genera un aviso de cuidado) asigna el valor actual de ap a la variable x. El valor
de ap en ese momento es 100.
*ap = 3;
100
x 3

200
y 1

1000
ap 100

Finalmente se asigna un valor al contenido de un apuntador (*ap).


Importante: Cuando un apuntador es declarado apunta a algn lado. Se debe
inicializar el apuntador antes de usarlo. Por lo que:
main()
{
int *ap;
*ap = 100;
}
Puede generar un error en tiempo de ejecucin o presentar un comportamiento
errtico.
El uso correcto ser:
main()
{
int *ap;
int x;
ap = &x;
*ap = 100;
}
Con los apuntadores se puede realizar tambin aritmtica entera, por ejemplo:
main()
{
float *flp, *flq;
*flp = *flp + 10;
++*flp;
(*flp)++;
flq = flp;
}
NOTA: Un apuntador a cualquier tipo de variables es una direccin en memoria
-- la cual es una direccin entera, pero un apuntador NO es un entero.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 110

La razn por la cual se asocia un apuntador a un tipo de dato, es por que se debe
conocer en cuantos bytes esta guardado el dato. De tal forma, que cuando se
incrementa un apuntador, se incrementa el apuntador por un ``bloque'' de
memoria, en donde el bloque esta en funcin del tamao del dato.
Por lo tanto para un apuntador a un char, se agrega un byte a la direccin y para
un apuntador a entero o a flotante se agregan 4 bytes. De esta forma si a un
apuntador a flotante se le suman 2, el apuntador entonces se mueve dos
posiciones float que equivalen a 8 bytes.
13.2 Apuntadores y Funciones

Cuando C++ pasa argumentos a funciones, los pasa por valor, es decir, si el
parmetro es modificado dentro de la funcin, una vez que termina la funcin el
valor pasado de la variable permanece inalterado.
Hay muchos casos que se quiere alterar el argumento pasado a la funcin y
recibir el nuevo valor una vez que la funcin ha terminado. Para hacer lo
anterior se debe usar una llamada por referencia, en C se puede simular
pasando un puntero al argumento. Con esto se provoca que la computadora
pase la direccin del argumento a la funcin.
Para entender mejor lo anterior consideremos la funcin swap() que
intercambia el valor de dos argumentos enteros:
void swap(int *px, int *py);
main()
{ int x, y;
x = 10;
y = 20;
printf("x=%d\ty=%d\n",x,y);
swap(&x, &y);
printf("x=%d\ty=%d\n",x,y);
}
void swap(int *px, int *py)
{ int temp;
temp = *px; /* guarda el valor de la direccion x */
*px = *py; /* pone y en x */
*py = temp; /* pone x en y */
}
13.3 Apuntadores y arreglos

Existe una relacin estrecha entre los punteros y los arreglos. En C, un nombre
de un arreglo es un ndice a la direccin de comienzo del arreglo. En esencia, el
nombre de un arreglo es un puntero al arreglo. Considerar lo siguiente:
int a[10], x;
int *ap;
ap = &a[0]; /* ap apunta a la direccion de a[0] */
x = *ap;
/* A x se le asigna el contenido de ap (a[0] en este caso) */
*(ap + 1) = 100; /* Se asigna al segundo elemento de 'a' el valor 100 usando
ap*/

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 111

Como se puede observar en el ejemplo la sentencia a[t] es idntica a ap+t. Se


debe tener cuidado ya que C no hace una revisin de los lmites del arreglo, por
lo que se puede ir fcilmente ms alla del arreglo en memoria y sobreescribir
otras cosas.
C sin embargo es mucho ms stil en su relacin entre arreglos y apuntadores.
Por ejemplo se puede teclear solamente:
ap = a; en vez de ap = &a[0]; y tambin *(a + i) en vez de a[i], esto es, &a[i] es
equivalente con a+i.
Y como se ve en el ejemplo, el direccionamiento de apuntadores se puede
expresar como:
a[i] que es equivalente a *(ap + i)
Sin embargo los apuntadores y los arreglos son diferentes:
Un apuntador es una variable. Se puede hacer ap = a y ap++.
Un arreglo NO ES una variable. Hacer a = ap y a++ ES ILEGAL.
Este parte es muy importante, asegrese haberla entendido.
Con lo comentado se puede entender como los arreglos son pasados a las
funciones. Cuando un arreglo es pasado a una funcin lo que en realidad se le
esta pasando es la localidad de su elemento inicial en memoria.
Por lo tanto:
strlen(s) es equivalente a strlen(&s[0])
Esta es la razn por la cual se declara la funcin como:
int strlen(char s[]); y una declaracin equivalente es int strlen(char *s);
ya que char s[] es igual que char *s.
La funcin strlen() es una funcin de la biblioteca estndar que regresa la
longitud de una cadena. Se muestra enseguida la versin de esta funcin que
podra escribirse:
int strlen(char *s)
{
char *p = s;
while ( *p != '\0' )
p++;
return p - s;
}
Se muestra enseguida una funcin para copiar una cadena en otra. Al igual que
en el ejercicio anterior existe en la biblioteca estndar una funcin que hace lo
mismo.
void strcpy(char *s, char *t)
{
while ( (*s++ = *t++) != '\0' );
}
En los dos ltimos ejemplos se emplean apuntadores y asignacin por valor.
Nota: Se emplea el uso del caracter nulo con la sentencia while para encontrar
el fin de la cadena.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 112

13.4 Arreglos de apuntadores

En C ++ se pueden tener arreglos de apuntadores ya que los apuntadores son


variables.
A continuacin se muestra un ejemplo de su uso: ordenar las lneas de un texto
de diferente longitud.
Los arreglos de apuntadores son una representacin de datos que manejan de
una forma eficiente y conveniente lneas de texto de longitud variable.
Cmo se puede hacer lo anterior?
1.
2.
3.
4.

Guardar todas las lneas en un arreglo de tipo char grande. Observando que \n
marca el fin de cada lnea.
Guardar los apuntadores en un arreglo diferente donde cada apuntador apunta al
primer caracter de cada lnea.
Comparar dos lneas usando la funcin de la biblioteca estndar strcmp().
Si dos lneas estn desacomodadas -- intercambiar (swap) los apuntadores (no el
texto).

5.
Arreglos de apuntadores (Ejemplo de ordenamiento de cadenas).

Con lo anterior se elimina:

el manejo complicado del almacenamiento.


alta sobrecarga por el movimiento de lneas.

13.5 Arreglos multidimensionales y apuntadores

Un arreglo multidimensional puede ser visto en varias formas en C, por ejemplo:


Un arreglo de dos dimensiones es un arreglo de una dimensin, donde cada uno
de los elementos es en s mismo un arreglo.
Por lo tanto, la notacin
a[n][m]
nos indica que los elementos del arreglo estn guardados rengln por rengln.
Cuando se pasa una arreglo bidimensional a una funcin se debe especificar el
nmero de columnas -- el nmero de renglones es irrelevante.
La razn de lo anterior, es nuevamente los apuntadores. C requiere conocer
cuantas son las columnas para que pueda brincar de rengln en rengln en la
memoria.
Considerando que una funcin deba recibir int a[5][35], se puede declarar el
argumento de la funcin como:
f( int a[][35] ) { ..... }
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 113

o an
f( int (*a)[35] ) { ..... }
En el ltimo ejemplo se requieren los parnteis (*a) ya que [ ] tiene una
precedencia ms alta que *.
Por lo tanto:
int (*a)[35]; declara un apuntador a un arreglo de 35 enteros, y por ejemplo si
hacemos la siguiente referencia a+2, nos estaremos refiriendo a la direccin del primer
elemento que se encuentran en el tercer rengln de la matriz supuesta, mientras que
int *a[35]; declara un arreglo de 35 apuntadores a enteros.

Ahora veamos la diferencia (sutil) entre apuntadores y arreglos. El manejo de


cadenas es una aplicacin comn de esto.
Considera:
char *nomb[10];

char anomb[10][20];
En donde es vlido hacer nomb[3][4] y anomb[3][4] en C.
Sin embargo:
anomb es un arreglo verdadero de 200 elementos de dos dimensiones tipo char.
El acceso de los elementos anomb en memoria se hace bajo la siguiente frmula

20*renglon + columna + direccin_base


En cambio nomb tiene 10 apuntadores a elementos.

Se puede indicar que se hace un manejo ms eficiente del espacio haciendo uso
de un arreglo de apuntadores y usando un arreglo bidimensional.

Arreglo de 2 dimensiones VS. arreglo de apuntadores.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 114

13.6 Inicializacin esttica de arreglos de apuntadores

La inicializacin de arreglos de apuntadores es una aplicacin ideal para un


arreglo esttico interno, por ejemplo:
func_cualquiera( )
{ static char *nomb[ ] = { "No mes", "Ene", "Feb", "Mar", .... };
}
Recordando que con el especificador de almacenamiento de clase static se
reserva en forma permanente memoria el arreglo, mientras el cdigo se esta
ejecutando.
13.7 Apuntadores y estructuras

Los apuntadores a estructuras se definen fcilmente y en una forma directa.


Considerar lo siguiente:
main()
{
struct COORD { float x,y,z; } punto;
struct COORD *ap_punto;
punto.x = punto.y = punto.z = 1;
ap_punto = &punto; /* Se asigna punto al apuntador */
ap_punto->x++; /* Con el operador -> se accesan los miembros */
ap_punto->y+=2; /* de la estructura apuntados por ap_punto */
ap_punto->z=3;
}
Otro ejemplo son las listas ligadas:
typedef struct {
int valor;
struct ELEMENTO *sig;
} ELEMENTO;
ELEMENTO n1, n2;
n1.sig = &n2;
La asignacin que se hace corresponde a la figura 8.3

Esquema de una lista ligada con 2 elementos.


13.8 Fallas comunes con apuntadores

A continuacin se muestran dos errores comunes que se hacen con los


apuntadores.

No asignar un apuntador a una direccin de memoria antes de usarlo

int *x
*x = 100;
lo adecuado ser, tener primeramente una localidad fsica de
memoria, digamos int y;
int *x, y;
x = &y;
*x = 100;

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 115

Indireccin no vlida

Supongamos que se tiene una funcin llamada malloc() la cual trata de


asignar memoria dinmicamente (en tiempo de ejecucin), la cual regresa
un apuntador al bloque de memoria requerida si se pudo o un apuntador a
nulo en otro caso.
char *malloc() -- una funcin de la biblioteca estndar que se ver ms adelante.
Supongamos que se tiene un apuntador char *p
Considerar:
*p = (char *) malloc(100): /* pide 100 bytes de la memoria */
*p = 'y';
Existe un error en el cdigo anterior. Cul es?
El * en la primera lnea ya que malloc regresa un apuntador y *p no apunta
a ninguna direccin.
El cdigo correcto deber ser:
p = (char *) malloc(100);
Ahora si malloc no puede regresar un bloque de memoria, entonces p es
nulo, y por lo tanto no se podr hacer:
*p = 'y';
Un buen programa en C debe revisar lo anterior, por lo que el cdigo
anterior puede ser reescrito como:
p = (char *) malloc(100): /* pide 100 bytes de la memoria */
if ( p == NULL )
{
printf("Error: fuera de memoria\n");
exit(1);
}
*p = 'y';
Ejemplos:
1. Imprime posicin de memoria del numero ingresado
#include"iostream.h"
#include"stdio.h"
#include"conio.h"
int main()
{
int a, *p, *q;
cout<<"ingrese un valor ";
cin>>a;
p=&a;
q=p;
cout <<"en la direccion "<<q <<" esta el valor "<<*q <<"y p apunta a" <<*p
<<endl;
return 0;
//
printf("en la direccion %X esta el valor %d y p apunta a %X", q, *q, *p);
//
getch();
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 116

2. Array con punteros que imprime la posicin del elemento, memoria y el valor
que corresponde a cada elemento.
#include "iostream.h"
main( )
{
int A[10];
int n,i, suma=0;
int *p;
p=&A[0];
cout<<"ingrese cantidad de elementos del vector"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
for(i=0;i<n;i++)
{
cout<<"A["<<i<<"]:"<<p<<" "<<*p<<endl;
suma=suma+*p;
p++;
}
cout<<"la suma de los elementos es:"<<suma<<endl;
return 0;
}
3. mtodo de burbuja utilizando punteros
#include "iostream.h"
main()
{
int A[10];
int n,i,j,temp;
int *p;
p=&A[0];
cout<<"ingrese cantidad de elementos del vector"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];}
cout<<"elementos desordenados"<<endl;
for(i=0;i<n;i++)
cout<<*(p+i)<<endl;
cout<<"el arreglo ordenado es:"<<endl;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(*(p+i)>*(p+j))
{
temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
for(i=0;i<n;i++)
cout<<*(p+i)<<endl;
return 0;
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 117

XIV. Arreglos Dinmicos


14.1 Concepto
Un array dinmico es aquel cuyo tamao se define dentro de la ejecucin del
programa, de esta manera se crearan tantos espacios de memoria como el
usuario necesite y no sufriremos de falta o derroche de memoria
14.2 Una dimensin
Int n=0;//siempre es aconsejable inicializr las variables
Cin>>n;
Int *A=new int [ n] //donde N ser espicificado por el usuario
Sin embargo estos punteros deben ser eliminados puesto que luego de la
ejecucin aun mantiene esos espacios de memoria reservados, para eliminar
usamos delete.
14.3 Dos dimensiones
int n=0, m=0;
cin>>m;
cin>>n;
int **A=new int * [m];
for(int i=0; i<m; i++)
{ A[i]=new int[n];
}
Aqu estamos creando un puntero a punteros, es decir creamos un puntero a un
vector de punteros, los cuales apuntan a un espacio de memoria.

Para emplear esta matriz lo hacemos igual que con una matriz esttica es decir
Lo que si es engorroso es tener que liberar la memoria al emplear este tipo de
arreglos o matrices para este caso(2 dimensiones), bien lo haremos de la
siguiente manera:
for(int i=0; i<n; i++)
{delete[] A[i];
}
Delete A[i];

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 118

El tipo de dato que pueden tener las matrices y array dinamicos son los mismos
que para las matrices y arrays estaticos: int, char, float, etc. Y asi podemos crear
matrices multidimensionales, aqui les dejo un ejemplo de una matriz
tridimensional:
3 dimensiones
Char ***M;
M=new char** [n];
for(int i=0; i<n; i++)
{ M[i]=new char*[n];
for(int j=0; j<10; j++)
{M[i][j]=new char[10];
}
}
Ejemplos:

1. Programa para demostrar apuntadores y variables dinmicas


#include"iostream.h"
int main()
{
int *p1, *p2;
p1=new int;
*p1=42;
p2=p1;
cout<<"*p1=="<<*p1<<endl;
cout<<"*p2=="<<*p2<<endl;
*p2=53;
cout<<"*p1=="<<*p1<<endl;
cout<<"*p2=="<<*p2<<endl;
p1=new int;
*p1=88;
cout<<"*p1=="<<*p1<<endl;
cout<<"*p2=="<<*p2<<endl;
cout<<"Ojala haya entendido este ejemplo\n";
return 0;
}

2. EN C
#include<stdio.h>
#include<malloc.h>
int main()
{
int *arrayDinamico,tamano,i;
printf("ingresa el tamao del arreglo: ");
scanf("%d",&tamano);
arrayDinamico = (int *)malloc(tamano*sizeof(int));
for(i=0;i<tamano;i++)
{
printf("Valor para la posicion [%d]: ",i+1);
scanf("%d",arrayDinamico+i);
}
for(i=0;i<tamano;i++)
{
printf("Valor [%d]: %d\n",i,*(arrayDinamico+i));
}
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 119

3. EN C++
#include<conio.h>
#include<iostream.h>
main()
{
int *arrayDinamico,tamano,i;
cout<<"ingresa el tamano del arreglo: "; cin>>tamano;
arrayDinamico = new int;
for(i=0;i<tamano;i++)
{
cout<<"Valor para la posicion "<<"["<<i<<"]:";
cin>>arrayDinamico[i];
}
for(i=0;i<tamano;i++)
{ cout<<"["<<i<<"]:"<<*(arrayDinamico+i)<<endl;
}
return 0;
}
4. Arreglo dinmico con tipo definido
#include "iostream.h"
typedef int* ApuntInt;
int main()
{
ApuntInt p;
int n,i;
cout<<"cuantos desea ingresar";
cin>>n;
p=new int ;
for(i=0;i<=n;i++)
{
cout<<"["<<i<<"]: ";
cin>>p[i];
}

for(i=0;i<=n;i++)
{
cout<<*(p+i)<<endl;
}
return 0;

5. Mtodo de ordenamiento insertion sort


#include "iostream.h"
typedef int* ApuntInt;
main()
{
int n,i,j,k,aux;
ApuntInt p;
cout<<"ingrese cantidad de elementos: "<<endl;
cin>>n;
p=new int;
for(i=1;i<=n;i++)

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 120

cout<<"P["<<i<<"]:";
cin>>p[i];}
//metodo de insertion sort
for(i=2; i<=n;i++)
{
aux=*(p+i);
k=i-1;
while((k>=1)&&(aux<*(p+k)))
{
*(p+k+1)=*(p+k);
k=k-1;
}
*(p+k+1)=aux;
}
for(k=1;k<=n;k++)
cout<<*(p+k)<<endl;
return 0;

6. Mtodo de ordenamiento insertion sort con Array Dinmico


#include "iostream.h"
typedef int* ApuntInt;
int main()
{
ApuntInt p;
int n,i,k,aux;
cout<<"cuantos desea ingresar: ";
cin>>n;
p=new int ;
for(i=1;i<=n;i++)
{
cout<<"["<<i<<"]: ";
cin>>p[i];
}
for(i=2; i<=n;i++)
{
aux=p[i];
k=i-1;
while((k>=1)&&(aux<p[k]))
{
p[k+1]=p[k];
k=k-1;
}
p[k+1]=aux;
}
for(k=1;k<=n;k++)
cout<<p[k]<<endl;
return 0;

for(i=1;i<=n;i++)
{
cout<<*(p+i)<<endl;
}
return 0;

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 121

XV. ESTRUCTURAS DINMICAS DE DATOS LINEALES


15.1 Listas Enlazadas

Una lista enlazada o encadenada es una coleccin de elementos nodos, en


donde cada uno contiene datos y un enlace o liga.
Un nodo es una secuencia de caracteres en memoria dividida en campos (de
cualquier tipo). Un nodo siempre contiene la direccin de memoria del siguiente
nodo de informacin si este existe.
Un apuntador es la direccin de memoria de un nodo
La figura siguiente muestra la estructura de un nodo:
DATO

LINK

El campo liga, que es de tipo puntero, es el que se usa para establecer la liga con
el siguiente nodo de la lista. Si el nodo fuera el ltimo, este campo recibe como
valor NIL (vaco).
A continuacin se muestra el esquema de una lista:
Juan

Luis

Mara

Sofa

NULL

15.1.1 Forma de declarar una lista enlazada


struct nodo {
char dato[10];
struct nodo *link;
};
struct nodo *lista; /* lista es un puntero a nodo*/
Ejemplo:
Referenciar un miembro de nodo:
lista->dato =hola;
lista->link = NULL; */ lista est apuntando a vaco*/
15.1.2 Inicializacin y Borrado de variables de tipo Puntero
Cuando se quiere usar una variable tipo puntero no basta slo con declararla, es
necesario asignarle un espacio en memoria. La funcion new, asigna almacenamiento
para una variable de un tipo determinado y guarda la direccin de la celda de memoria
en la variable.
Ej. Asignacin de memoria para un nodo: lista = new nodo;
Por otro lado, cuando la variable se deja de usar, se debe liberar la posicin de memoria
ocupada por la variable, para ello se utiliza el procedimiento delete.
Ej. Libera la posicin de memoria ocupada por un nodo: delete lista;
15.1.3 Operaciones en Listas Encadenadas

Las operaciones que podemos realizar sobre listas encadenadas son las
siguientes:

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 122

Recorrido. Esta operacin consiste en visitar cada uno de los nodos que forman la
lista. Para recorrer todos los nodos de la lista, se comienza con el primero, se toma
el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo
nos dar la direccin del tercer nodo, y as sucesivamente.
Insercin. Esta operacin consiste en agregar un nuevo nodo a la lista. Para esta
operacin se pueden considerar tres casos:
o Insertar un nodo al inicio.
o Insertar un nodo antes o despus de cierto nodo.
o Insertar un nodo al final.
Borrado. La operacin de borrado consiste en quitar un nodo de la lista,
redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos:
o Eliminar el primer nodo.
o Eliminar el ltimo nodo.
o Eliminar un nodo con cierta informacin.
o Eliminar el nodo anterior o posterior al nodo cierta con informacin.
Bsqueda. Esta operacin consiste en visitar cada uno de los nodos, tomando al
campo liga como puntero al siguiente nodo a visitar.

15.1.4 Algoritmos sobre listas lineales

Las listas lineales encadenadas siempre deben mantener un puntero al inicio el


cual se llama raiz o tope. Se usar la variable TOP para referenciar al primer
nodo de la lista y TOP->dato y TOP->link para hacer referencia al dato
almacenado y al link al siguiente nodo respectivamente.
struct nodo {
char dato;
struct nodo *link;
};
a)

Algoritmo de Creacin

struct nodo *Crea_lista_final()/*donde p es de tipo puntero a nodo}*/


{ struct nodo *p, *top, *q; /*top es un puntero al inicio de la lista de nodos*/
int respuesta;
/*q es de tipo puntero a nodo*/
TOP = NULL;
respuesta = 1;
while (respuesta)
{ p = new nodo;
cout << Dato;
cin >> p->dato;
if (top == NULL)
{ top = p;
q = p;}
else
{ q->link = p;
p->link = NULL;
q = p; }
cout << Otro nodo? (si=1; no=0);
cin >> respuesta;
}
return(top);
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 123

struct nodo *Crea_lista_inicio()/*donde p es de tipo puntero a nodo}*/


{ struct nodo *top;
/*top es un puntero al inicio de la lista de nodos*/
int respuesta;
top = NULL;
respuesta = 1;
while (respuesta)
{ p = new nodo;
cout << Dato;
cin >> p->dato;
if (top == NULL)
top = p;
else
{ p->link = top;
top = p;}
cout << Otro nodo? (si=1; no=0);
cin >> respuesta;
}
return(top);
}
b)

Algoritmo para Recorrido

c)

Algoritmo para insertar un nodo a una lista que ya existe y que est
apuntada por top

Recorre_lista(struct nodo *top) /*top es un puntero al inicio de una lista*/


{ struct nodo *p;
p = top;
while (p <> NULL)
{ cout << p->dato;
p = p->link;}
}

inserta_final_lista(struct nodo *top)


{ struct nodo *p, *q;
p = top;
while (p->link <> NULL)
p = p->link;
q = new nodo;
cout << Dato;
cin >> q->dato;
p->link = q;
q->link = NULL;
}
inserta_inicio_lista(top)
{ struct nodo *p;
p = new nodo;
cout << Dato;
cin >> p->dato;
p->link = top;
top = p;
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

d)

Pg. 124

Algoritmo para insertar un nodo antes/despus de 'X' informacin

Inserta_antes_despues(struct nodo *top, char x)


{ struct nodo *p, *q;
int respuesta;
p = top;
cout << antes(1)/despus(0))
cin >> respuesta;
if (respuesta)
{ while (p <> NULL)
{ if (p->dato == x)
{ q = new nodo;
cout << Dato;
cin >> q->dato;
q->link = p;
if (p == top)
top = q;
else
r->link = q;
}else
{ r = p;
p = p->link;}
}
}else
{ while (p <> NULL)
{ if (p->dato == x)
{ q = new nodo;
cout << Dato;
cin >> q->dato;
if (p == top || p->link==NULL)
{ p->link = q;
q->link = NULL;}
else
{ q->link = p->link;
p->link = q;}
}else
p = p->link;
}
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

e)

Pg. 125

Algoritmo para borrar un nodo que tiene el dato X

elimina_nodo (struct nodo *top, char x)


{ struct nodo *p, *q;
p = top;
while (p <> NULL)
{ if(p->dato == x)
if (p == top)
if (p->link == NULL) top = NULL;
else top = top->link;
else
q->link = p->link;
delete p;
else
{ q = p;
p = p->link;}
}
}

15.1.5 Listas Circulares

Las listas circulares tienen la caracterstica de que el ltimo elemento de la lista


apunta al primero. La siguiente figura es una representacin grfica de una lista
circular.
Juan

Luis

Mara

Sofa

Algunos algoritmos sobre listas circulares son:


a)

Algoritmo de creacin

struct nodo *Crea_lista_circular_final()/*donde p es de tipo puntero a nodo}*/


{ struct nodo *p, *top, *q; /*top es un puntero al inicio de la lista de nodos*/
int respuesta;
/*q es de tipo puntero a nodo*/
top = NULL;
respuesta = 1;
while (respuesta)
{ p = new nodo;
cout << Dato;
cin >> p->dato;
if (top == NULL)
{ top = p;
q = p;}
else
{ q->link = p;
q = p; }
p->link = top;
cout << Otro nodo? (si=1; no=0);
cin >> respuesta;
}
return(top);
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

b)

Pg. 126

Algoritmo para recorrer la lista

Recorre_circular(struct nodo *top)


{ struct nodo *p;
p = top;
if (p <> NULL)
{ cout << p->dato;
p = p->link;}
while (p <> top && p <> NULL)
{ cout << p->dato;
p = p->link;}
}
c)

Algoritmo para borrar un nodo que contiene la informacin X

Elimina_circular(struct nodo *top, char x)


{ struct nodo *p, *q, *r;
q = top; r = top; p = top;
while (q->link <> top) /*posiciona el puntero q al final de la lista*/
q = q->link;
do {
if (p->dato == x)
{ if (p == top)
if (top->link=top)
top = NULL;
else
{ top = top->link;
q->link = top;}
else
r->link = p->link;
delete p;
p = top;
}
else
{ r = p;
p = p->link;}
}
while (p <> top);
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 127

15.1.6 Listas doblemente encadenadas

Una lista doble, o doblemente ligada es una coleccin de nodos en la cual cada
nodo tiene dos punteros, uno de ellos apuntando a su predecesor (Ant) y otro a
su sucesor (Sig). Por medio de estos punteros se podr avanzar o retroceder a
travs de la lista, segn se tomen las direcciones de uno u otro puntero.
En estas listas cada nodo conoce quien es el siguiente nodo y quien es el
anterior.
Ant Dato Sig

NODO
Donde Ant y Sig son punteros a NODO.
TOP

NULL

NULL
FIN
Dado que las listas doblemente encadenadas se pueden recorrer de izquierda a
derecha y vise versa
Es necesario mantener dos punteros indicando los extremos de la lista, el
puntero TOP al inicio y el puntero FIN al trmino.
Existen dos tipos de listas doblemente ligadas:
Listas dobles lineales. En este tipo de lista doble, tanto el puntero
izquierdo del primer nodo como el derecho del ltimo nodo apuntan a NULL.
Listas dobles circulares. En este tipo de lista doble, el puntero izquierdo del
primer nodo apunta al ltimo nodo de la lista, y el puntero derecho del ltimo nodo
apunta al primer nodo de la lista.

a)

b)

Procedimiento de crear el primer nodo de una lista doblemente


enlazada
p1 TOP5
NULL3
1. p =new nodo
2. p->dato= INFO
INFO2
3. p->sig = NULL
4. p->ant = NULL
5. TOP = p
6. FIN = p
NIL4
FIN6
Procedimiento para insertar un nodo al comienzo
1. p = new nodo
2. p->dato= INFO
3. p->sig = TOP
4. p->ant = NULL
5. TOP->ant = p
6. TOP = p

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 128

c) Procedimiento para insertar despus de un nodo de referencia


Se recorre la lista hasta encontrar el nodo de referencia, que queda apuntado
por q
1. p = new nodo;
2. p->dato = INFO
3. p->sig = q->sig
4. p->ant = q
5. q->sig->ant = p
6. q->sig = p
d) Procedimiento para insertar antes de un nodo de referencia
Se recorre la lista hasta encontrar el nodo de referencia, que queda apuntado
por q
1. p = new nodo
2. p->dato = INFO
3. p->sig = q
4. p->ant = q->ant
5. q->ant->sig = p
6. q->ant = p
e) Algoritmo de creacin de lista dobles circulares
top = NULL
repite
p= new nodo
lee(p->dato)
si top=NULL entonces
p->sig = p
p->ant = p
top = p
en caso contrario
p->sig = top
p->ant = top->ant
top->ant = p
p->ant->sig = p
top = p
mensaje(otro nodo?)
lee (respuesta)
hasta respuesta=no
f)

Algoritmo para recorrer la lista

Recorrido a la Derecha
P = top
repite
escribe(p->dato)
p = p->sig
hasta p = top->ant

Recorrido a la Izquierda
P = top
repite
escribe(p->dato)
p = p->ant
hasta p = top->sig

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

g)

Pg. 129

Algoritmo para insertar

Antes de x

Despus de x

p = top
lee(x)
repite
si p->dato = x entonces
q = new nodo
leer(q->dato)
si p = top entonces
top = q
q->sig = p
q->ant = p->ant
p->sig->ant = q
p->ant = q
p = top
en caso contrario
p = p->sig
hasta p = top

p = top
lee(x)
repite
si p->dato = x entonces
q = new nodo
leer(q->dato)
q->sig = p->sig
q->ant = p
p->sig->ant = q
p->sig = q
p = top
en caso contrario
p = p->sig
hasta p=top

Algoritmo para borrar un nodo


p = top
lee(valor_a_borrar)
repite
si p->dato = valor_a_borrar entonces
p->sig->ant = p->ant
p->ant->sig = p->sig
si p = top entonces
si p->sig = p->ant entonces
top = NULL
en caso contrario
top = top->sig
dispose(p)
p = top
en caso contrario
p = p->sig
hasta p = top
Ejemplo:

1.

Ejemplo de una lista simple

#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
struct elemento
{
char apellido[30];
char nombre[20];
float nota;
struct elemento *siguiente;
};

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 130

main( )
{
struct elemento *p;
struct elemento *q;
int n;
cout<<"numero de elemento";
cin>>n;
p=NULL;
for(n;n>0;n--)
{
q=new elemento;
q->siguiente = p;
p=q;
cout<<"apellidos: "; gets(q->apellido);
cout<<"nombres: "; gets(q->nombre);
cout<<"nota: "; cin>>q->nota;
}
q=p;
while(q!=NULL)
{
cout<<q->apellido<<" "<<q->nombre<<" "<<q->nota<<endl ;
q=q->siguiente;
}
getch( );
}

2.

Lista que almacena un nodo

#include "iostream.h"
#include "stdlib.h"
struct Nodo
{
int dato;
Nodo *enlace;
};
typedef Nodo* ApuntNodo;
main( )
{
ApuntNodo cabeza;
int el_numero;
ApuntNodo apunt_temp;
apunt_temp=new Nodo;
if(apunt_temp==NULL)
{
cout<<"Error: No hay suficiente memoria";
exit(0);
}
cout<<"ingrese un elemento";
cin>>el_numero;
apunt_temp->dato=el_numero;
apunt_temp->enlace=cabeza;
cabeza=apunt_temp;
cout<<"el elemento ingresado es:"<<cabeza->dato<<endl;
return 0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

3.

Pg. 131

Implementacion de una lista con funciones

#include "iostream.h"
#include "stdlib.h"
struct Nodo
{
int dato;
Nodo *enlace;
};
typedef Nodo* ApuntNodo;
void insertar_cabeza(ApuntNodo& cabeza, int el_numero)
{
ApuntNodo apunt_temp;
apunt_temp=new Nodo;
if(apunt_temp==NULL)
{
cout<<"Error";
exit(1);
}
apunt_temp->dato=el_numero;
apunt_temp->enlace=cabeza;
cabeza=apunt_temp;
}
void imprimir(ApuntNodo cabeza)
{
cout<<"la lista es:";
//while( !=NULL)
//{
cout<<cabeza->dato<<endl;
cabeza=cabeza->enlace;
//}
}
void main( )
{
ApuntNodo cabeza;
int el_numero;
cout<<"ingrese el numero";
cin>>el_numero;
insertar_cabeza(cabeza,el_numero);
imprimir(cabeza);
}

4.

Implementacion de una lista para almacenar varios nodos

#include "iostream.h"
#include "stdlib.h"
#include "conio.h"
struct Nodo
{
int dato;
Nodo *enlace;
};
typedef Nodo* ApuntNodo;

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 132

void insertar_cabeza(ApuntNodo &cabeza, int el_numero)


{
ApuntNodo apunt_temp;
apunt_temp=new Nodo;
if(apunt_temp==NULL)
{
cout<<"Error";
exit(1);
}
apunt_temp->dato=el_numero;
apunt_temp->enlace=cabeza;
cabeza=apunt_temp;
}
void imprimir(ApuntNodo cabeza)
{
cout<<"la lista es:";
while(cabeza!=NULL)
{
cout<<cabeza->dato<<"->";
cabeza=cabeza->enlace;
}
cout<<endl;
}
void main( )
{
ApuntNodo cabeza=NULL;
int el_numero;
char opc;
for(;;)
{
cout<<"Seleccione las opciones:"<<endl;
cout<<"<1> Insertar"<<endl;
cout<<"<2> Imprimir"<<endl;
cout<<"<3> Salir"<<endl;
opc=getche( );
cout<<endl;
switch(opc)
{
case '1': cout<<"ingrese el numero: ";
cin>>el_numero;
insertar_cabeza(cabeza,el_numero);
break;
case '2': imprimir(cabeza);
break;
case '3': exit(1);
}
}
}

5.

Lista que almacena numeros enteros

#include "iostream.h"
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
struct Nodo
{
int dato;
Nodo *enlace;
};
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 133

typedef Nodo *ApuntNodo;


void insertar_cabeza(ApuntNodo &cabeza, int el_numero)
{
ApuntNodo apunt_temp;
apunt_temp=new(struct Nodo);
if(apunt_temp==NULL)
{
cout<<"Error";
exit(1);
}
apunt_temp->dato=el_numero;
apunt_temp->enlace=cabeza;
cabeza=apunt_temp;
}
void imprimir(ApuntNodo cabeza)
{
cout<<"la lista es:"<<endl;
while(cabeza!=NULL)
{
cout<<cabeza->dato;
cabeza=cabeza->enlace;
}
getch( );
}
void eliminarelemento(ApuntNodo &cabeza, int el_numero)
{
ApuntNodo apunt_temp,anterior;
apunt_temp=cabeza;
while(apunt_temp!=NULL)
{
if(apunt_temp->dato==el_numero)
{
if(apunt_temp==cabeza)
cabeza=cabeza->enlace;
else
anterior->enlace=apunt_temp->enlace;
delete(apunt_temp);
return ;
}
anterior=apunt_temp;
apunt_temp=apunt_temp->enlace;
}
}
void main( )
{
ApuntNodo cabeza=NULL;
int el_numero;
char opcion;
for(;;)
{
cout<<"Seleccione las Opciones"<<endl;
cout<<"(1) Insertar"<<endl<<"(2) Mostrar"<<endl
<<"(3) Eliminar "<<endl<<"(4) Salir"<<endl;
opcion=getche( );
cout<<endl;
switch(opcion)
{
case '1':
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

}
}

Pg. 134

cout<<"Ingrese elemento: ";


cin>>el_numero;
insertar_cabeza(cabeza,el_numero);
break;
case '2':
imprimir(cabeza);
break;
case '3':
cout<<"Ingrese elemento: ";
cin>>el_numero;
eliminarelemento(cabeza, el_numero);
break;
if(opcion=='4') break;

}
6.

Lista que almacena caracteres

#include<iostream.h>
#include<conio.h>
struct nodo
{

char dato;
nodo *sgt;

};
typedef nodo *puntero;
void inserta_inicio(puntero &lista,char valor);
void eliminarelemento(puntero &lista,char valor);
void ver_lista(puntero );
main( )
{ int op,pos,i=0;
char valor;
puntero lista=NULL;
do
{
clrscr( );
cout<<"===MENU==="<<endl;
cout<<"1: inserte al inicio"<<endl;
cout<<"2: eliminar un elemento"<<endl;
cout<<"3: ver lista"<<endl;
cout<<"4: salir"<<endl;
cout<<"ingrese su opcion..";
cin>>op;
switch(op)
{
case 1:cout<<"ingrese el valor : ";
cin>>valor;
inserta_inicio(lista,valor);
break;
case 2:cout<<"ingrese valor a eliminar: ";
cin>>valor;
eliminarelemento(lista, valor);
break;
case 3:ver_lista(lista);
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 135

getch( );
break;
}
}while(op!=4);
}
void inserta_inicio(puntero &lista, char valor)
{ puntero nuevo;
nuevo=new(struct nodo);
nuevo->dato=valor;
nuevo->sgt=lista;
lista=nuevo;
}
void eliminarelemento(puntero &lista,char valor)
{ puntero nuevo,anterior;
nuevo=lista;
while(nuevo!=NULL)
{
if(nuevo->dato==valor)
{
if(nuevo==lista)
lista=lista->sgt;
else
anterior->sgt=nuevo->sgt;
delete(nuevo);
return ;
}
anterior=nuevo;
nuevo=nuevo->sgt;
}
}
void ver_lista(puntero lista)
{
while(lista!=NULL)
{
cout<<"|"<<lista->dato<<"|->";
lista=lista->sgt;
}
getch( );

7.

Lista que inserta nodos en forma ordenada

#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
typedef struct nodo
{

int dato;
struct nodo *sig;
} NODO;
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 136

typedef NODO * PTRNODO;


void insertar(PTRNODO *inicio, int elemento)
{
PTRNODO anterior, actual, nuevo;
nuevo=new NODO;
if(nuevo!=NULL)
{
nuevo->dato=elemento;
nuevo->sig=NULL;
anterior=NULL;
actual=*inicio;
while(actual!=NULL &&elemento > actual->dato)
{ anterior=actual;
actual=actual->sig;
}
if(anterior==NULL)
{ // si es el inicio
nuevo->sig=*inicio;
*inicio=nuevo;
}
else
{
anterior->sig=nuevo;
nuevo->sig=actual;
}

}
else cout<<"Memoria insuficiente";
}

int eliminar (PTRNODO *inicio, int elemento)


{
PTRNODO anterior, actual, temp;
if(elemento==(*inicio)->dato)
{
// si es el primero
temp=*inicio;
*inicio=(*inicio)->sig;
free(temp);
return elemento;
}
else
{
anterior=*inicio;
actual=(*inicio)->sig;
while(actual!=NULL && actual->dato != elemento)
{
anterior=actual;
actual=actual->sig;
}
if(actual!=NULL)
{
temp=actual;
anterior->sig=actual->sig;
free(temp);
return (elemento);
}
else return (-1);
}
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 137

void imprimir(PTRNODO inicio)


{
cout<<"La lista es: ";
while(inicio!=NULL)
{
cout<<inicio->dato<<" ";
inicio=inicio->sig;
}
cout<<endl;
}
void main(void)
{
PTRNODO inicio=NULL;
char opcion;
int elemento;
for(;;)
{
cout<<"Seleccione las Opciones"<<endl;
cout<<"(1) Insertar"<<endl<<"(2) Eliminar"<<endl<<"(3)
Mostrar"<<endl<<"(4) Salir"<<endl;
//cout<<"Seleccion: ";
opcion=getche( );
cout<<endl;
switch(opcion)
{
case '1':
cout<<"Ingrese elemento: ";
cin>>elemento;
insertar(&inicio,elemento);
break;
case '2':
if(inicio==NULL) cout<<"No hay elementos<<endl";
else
{
cout<<"Ingrese elemento: ";
cin>>elemento;
elemento=eliminar(&inicio, elemento);
if(elemento==-1) cout<<"No existe el elemento"<<endl;
}
break;
case '3':
if(inicio==NULL) cout<<"No hay elementos"<<endl;
else
{
imprimir(inicio);
}
break;
}
if(opcion=='4') break;
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 138

15.2 PILAS

Una pila es una lista de elementos en la que se pueden insertar y eliminar


elementos slo por uno de los extremos. Como consecuencia, los elementos de
una pila sern eliminados en orden inverso al que se insertaron. Es decir, el
ltimo elemento que se meti a la pila ser el primero en salir de ella.
15.2.1 Definicin
Una pila es un tipo especial de lista abierta en la que slo se pueden insertar y
eliminar nodos en uno de los extremos de la lista. Estas operaciones se conocen
como "push" y "pop", respectivamente "empujar" y "tirar". Adems, las
escrituras de datos siempre son inserciones de nodos, y las lecturas siempre
eliminan el nodo ledo.
Estas caractersticas implican un comportamiento de lista LIFO (Last In First
Out), el ltimo en entrar es el primero en salir.
Ejemplo: una pila de platos, monedas, cubos, etc.

El smil del que deriva el nombre de la estructura es una pila de platos. Slo es
posible aadir platos en la parte superior de la pila, y slo pueden tomarse del
mismo extremo.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 139

El nodo tpico para construir pilas es el mismo que vimos en el captulo anterior
para la construccin de listas:
struct nodo {
int dato;
struct nodo *siguiente;
};
15.2.2 Aplicaciones de las pilas:
En compiladores
Sistemas operativos
Programas de aplicacin

Tenemos tres sobprogramas llamadas A, B y C, supongamos tambin que A invoca a B y


B invoca a C. entonces B no terminar su trabajo hasta que C haya terminado y devuelto
su control a B. de modo similar, A es el primero que arranca su ejecucin, pero es el
ltimo que la termina, tras la terminacin y retorno de B.

Programa
Principal
I
Subprograma
A
Subprograma
B
Subprograma
C
15.2.3 Representacin en Memoria
Las pilas no son estructuras de datos fundamentales, es decir, no estn definidas
como tales en los lenguajes de programacin. Las pilas pueden representarse
mediante el uso de:
Arreglos.
Listas enlazadas.
Nosotros ahora usaremos los arreglos. Por lo tanto debemos definir el tamao
mximo de la pila, adems de un apuntador al ltimo elemento insertado en la
pila el cual denominaremos SP. La representacin grfica de una pila es la
siguiente:

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 140

Como utilizamos arreglos para implementar pilas, tenemos la limitante de


espacio de memoria reservada. Una vez establecido un mximo de capacidad
para la pila, ya no es posible insertar ms elementos.
Una posible solucin a este problema es el uso de espacios compartidos de
memoria. Supongase que se necesitan dos pilas , cada una con un tamao
mximo de n elementos. En este caso se definir un solo arreglo de 2*n
elementos, en lugar que dos arreglos de n elementos.
En este caso utilizaremos dos apuntadores: SP1 para apuntar al ltimo elemento
insertado en la pila 1 y SP2 para apuntar al ltimo elemento insertado en la pila
2. Cada una de las pilas insertar sus elementos por los extremos opuestos, es
decir, la pila 1 iniciar a partir de la localidad 1 del arreglo y la pila 2 iniciar en
la localidad 2n. De este modo si la pila 1 necesita ms de n espacios (hay que
recordar que a cada pila se le asignaron n localidades) y la pila 2 no tiene
ocupados sus n lugares, entonces se podrn seguir insertando elementos en la
pila 1 sin caer en un error de desbordamiento.
15.2.4 Notacin Infija, Postfija y Prefija
Las pilas son estructuras de datos muy usadas para la solucin de diversos tipos
de problemas. Pero tal vez el principal uso de estas estructuras es el tratamiento
de expresiones matemticas.
15.2.5 Algoritmo para convertir expresiones infijas en postfijas (rpn)
1. Incrementar la pila
2. Inicializar el conjunto de operaciones
3. Mientras no ocurra error y no sea fin de la expresin infija haz
o
Si el carcter es:
i. Parentesis izquierdo. Colocarlo en la pila
ii. Parentesis derecho. Extraer y desplegar los valores hasta encontrar
parntesis izquierdo. Pero no desplegarlo.
iii. Un operador.

Si la pila esta vaca o el carcter tiene ms alta prioridad que el elemento


del tope de la pila insertar el carcter en la pila.

En caso contrario extraer y desplegar el elemento del tope de la pila y


repetir la comparacin con el nuevo tope.
iv. Operando. Desplegarlo.
4. Al final de la expresin extraer y desplegar los elementos de la pila hasta que se
vace.

15.2.6 algoritmo para evaluar una expresion rpn

1. Incrementar la pila
2. Repetir
o Tomar un caracter.
o Si el caracter es un operando colocarlo en la pila.
o Si el caracter es un operador entonces tomar los dos valores del tope de la
pila, aplicar el operador y colocar el resultado en el nuevo tope de la pila.
(Se produce un error en caso de no tener los 2 valores)
3. Hasta encontrar el fin de la expresin RPN.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 141

15.2.7 Recursin
Podemos definir la recursividad como un proceso que se define en trminos de
s mismo.
El concepto de recursin es difcil de precisar, pero existen ejemplos de la vida
cotidiana que nos pueden servir para darnos una mejor idea acerca de lo que es
recursividad. Un ejemplo de esto es cuando se toma una fotografa de una
fotografa, o cuando en un programa de televisin un periodista transfiere el
control a otro periodista que se encuentra en otra ciudad, y este a su vez le
transfiere el control a otro.
Casos tpicos de estructuras de datos definidas de manera recursiva son los
rboles binarios y las listas enlazadas.
La recursin se puede dar de dos formas:

Directa: Este tipo de recursin se da cuando un subprograma se llama


directamente a s mismo.
Indirecta: Sucede cuando un subprograma llama a un segundo subprograma, y este
a su vez llama al primero, es decir el subproceso a llama al b, y el b invoca al
subproceso a.

15.2.8 Operaciones en Pilas


Las principales operaciones que podemos realizar en una pila son:

Insertar un elemento (push).


Eliminar un elemento (pop).

Los algoritmos para realizar cada una de estas operaciones se muestran a


continuacin. La variable mximo para hacer referencia al mximo nmero de
elementos en la pila.
Insercin (Push)
si sp=mximo entonces
mensaje (overflow)
en caso contrario
sp<-- sp+1
pila[sp]<-- valor
Eliminacin (Pop)
si sp=0 entonces
mensaje (underflow)
en caso contrario
x<--pila[sp]
sp<--sp-1

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 142

Algoritmo de implementacin de una pila


#include "iostream.h"
#include "conio.h"
typedef struct pila
{
int calve;
pila *sig;
}pila;
void apilar (pila **, int);
void desapilar (pila **);
main()
{
int elem;
char opc;
pila *CAB=NULL;
do{
cout<<"1. Insertar"<<endl;
cout<<"2. Borrar"<<endl;
cout<<"3. Salir"<<endl;
cin>>opc;
switch (opc)
{case '1': cout<<"ingrese un numero:"; cin>>elem;
apilar(&CAB, elem);
break;
case '2': desapilar(&CAB);
getch();
break;
case '3': cout<<"nada";
break;
}
}
while(opc!='3');
return 0;
}
void apilar(pila **cab, int elem)
{
pila *aux=new(pila);
if(!aux)
{
cout<<"no hay memoria suficiente"; }
else
{
aux->calve=elem;
aux->sig=(*cab);
(*cab)=aux; }
return ;
}
void desapilar( pila **cab)
{
pila *aux=(*cab);
if((*cab))
{
cout<<"dato:" <<aux->calve<<endl;
(*cab)=aux->sig;
delete(aux);
}
else
cout<<"pila vacia";
return;
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 143

15.3 Colas

15.3.1 Definicin
Una cola es un tipo especial de lista abierta en la que slo se puede insertar
nodos en uno de los extremos de la lista y slo se pueden eliminar nodos en el
otro. Adems, como sucede con las pilas, las escrituras de datos siempre son
inserciones de nodos, y las lecturas siempre eliminan el nodo ledo.
Este tipo de lista es conocido como lista FIFO (First In First Out), el primero en
entrar es el primero en salir.
El smil cotidiano es una cola para comprar, por ejemplo, las entradas del cine.
Los nuevos compradores slo pueden colocarse al final de la cola, y slo el
primero de la cola puede comprar la entrada.
Ejemplo: una cola de un autobuses en la calle, una cola para ingresar al estudio.
Aplicaciones: un sistema de tiempo compartido suele haber un procesador
central y una serie de perifricos compartidos: disco, impresoras, etc.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 144

El nodo tpico para construir pilas es el mismo que vimos en los captulos
anteriores para la construccin de listas y pilas:
struct nodo {
int dato;
struct nodo *siguiente;
};
15.3.2 Declaraciones de tipos
Los tipos que definiremos normalmente para manejar colas sern casi los
mismos que para manejar listas y pilas, tan slo cambiaremos algunos nombres:
typedef struct _nodo {
int dato;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Cola;
tipoNodo es el tipo para declarar nodos, evidentemente.
pNodo es el tipo para declarar punteros a un nodo.
Cola es el tipo para declarar colas.
DATO

DATO

DATO

DATO

Primero

NULL

ltimo

Es evidente, a la vista del grfico, que una cola es una lista abierta. As que sigue
siendo muy importante que nuestro programa nunca pierda el valor del puntero
al primer elemento, igual que pasa con las listas abiertas. Adems, debido al
funcionamiento de las colas, tambin deberemos mantener un puntero para el
ltimo elemento de la cola, que ser el punto donde insertemos nuevos nodos.
Teniendo en cuenta que las lecturas y escrituras en una cola se hacen siempre
en extremos distintos, lo ms fcil ser insertar nodos por el final, a
continuacin del nodo que no tiene nodo siguiente, y leerlos desde el principio,
hay que recordar que leer un nodo implica eliminarlo de la cola.
15.3.3 Operaciones bsicas con colas
De nuevo nos encontramos ante una estructura con muy pocas operaciones
disponibles. Las colas slo permiten aadir y leer elementos:

Aadir: Inserta un elemento al final de la cola.


Leer: Lee y elimina un elemento del principio de la cola.

Aadir un elemento:
Las operaciones con colas son muy sencillas, prcticamente no hay casos
especiales, salvo que la cola est vaca.
Aadir elemento en una cola vaca:
Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que
apunte a l, adems los punteros que definen la cola, primero y ultimo que
valdrn NULL:
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 145

NULL ltimo

ltimo
nodo

NULL NULL

DATO

El proceso es muy simple, bastar con que:


1. nodo->siguiente apunte a NULL.
2. Y que los punteros primero y ultimo apunten a nodo.
nodo
NULL
DATO
Primero

ltimo

Aadir elemento en una cola no vaca:


De nuevo partiremos de un nodo a insertar, con un puntero que apunte a l, y de
una cola, en este caso, al no estar vaca, los punteros primero y ultimo no sern
nulos:
DATO
Primero

NULL

DATO
ltimo

nodo

DATO

El proceso sigue siendo muy sencillo:

1. Hacemos que nodo->siguiente apunte a NULL.


2. Despus que ultimo->siguiente apunte a nodo.
3. Y actualizamos ultimo, haciendo que apunte a nodo.
DATO
DATO
Primero

nodo
ltimo

NULL

DATO

Aadir elemento en una cola, caso general:


Para generalizar el caso anterior, slo necesitamos aadir una operacin:
1.
2.
3.
4.

Hacemos que nodo->siguiente apunte a NULL.


Si ultimo no es NULL, hacemos que ultimo->siguiente apunte a nodo.
Y actualizamos ultimo, haciendo que apunte a nodo.
Si primero es NULL, significa que la cola estaba vaca, as que haremos que primero
apunte tambin a nodo.

Leer un elemento de una cola, implica eliminarlo:


Ahora tambin existen dos casos, que la cola tenga un solo elemento o que tenga
ms de uno.
Leer un elemento en una cola con ms de un elemento:
Usaremos un puntero a un nodo auxiliar:
DATO

DATO

Primero
nodo

Ingeniera Informtica y Sistemas UNAMBA

DATO

NULL

ltimo

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 146

1. Hacemos que nodo apunte al primer elemento de la cola, es decir a primero.


2. Asignamos a primero la direccin del segundo nodo de la pila: primero->siguiente.
3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la
operacin de lectura en colas implican tambin borrar.
4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
DATO

DATO

DATO

Primero
nodo

NULL

ltimo

Leer un elemento en una cola con un solo elemento:


Tambin necesitamos un puntero a un nodo auxiliar:
NULL

DATO
Primero
nodo

ltimo

1. Hacemos que nodo apunte al primer elemento de la pila, es decir a primero.


2. Asignamos NULL a primero, que es la direccin del segundo nodo terico de la
cola: primero->siguiente.
3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la
operacin de lectura en colas implican tambin borrar.
4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
5. Hacemos que ultimo apunte a NULL, ya que la lectura ha dejado la cola vaca.
DATO
Primero
nodo

DATO

NULL
ltimo

Leer un elemento en una cola caso general:

1. Hacemos que nodo apunte al primer elemento de la pila, es decir a primero.


2. Asignamos a primero la direccin del segundo nodo de la pila: primero->siguiente.
3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la
operacin de lectura en colas implican tambin borrar.
4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
5. Si primero es NULL, hacemos que ultimo tambin apunte a NULL, ya que la lectura
ha dejado la cola vaca.

Ejemplo de cola en C:
Construiremos una cola para almacenar nmeros enteros. Haremos pruebas
insertando varios valores y leyndolos alternativamente para comprobar el
resultado.
Algoritmo de la funcin "Anadir":
1.
2.
3.
4.
5.

Creamos un nodo para el valor que colocaremos en la cola.


Hacemos que nodo->siguiente apunte a NULL.
Si "ultimo" no es NULL, hacemos que ultimo->>siguiente apunte a nodo.
Actualizamos "ultimo" haciendo que apunte a nodo.
Si "primero" es NULL, hacemos que apunte a nodo.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 147

void Anadir(pNodo *primero, pNodo *ultimo, int v) {


pNodo nuevo;
/* Crear un nodo nuevo */
nuevo = (pNodo)malloc(sizeof(tipoNodo));
nuevo->valor = v;
/* Este ser el ltimo nodo, no debe tener siguiente */
nuevo->siguiente = NULL;
/* Si la cola no estaba vaca, aadimos el nuevo a continuacin de ultimo */
if(*ultimo) (*ultimo)->siguiente = nuevo;
/* Ahora, el ltimo elemento de la cola es el nuevo nodo */
*ultimo = nuevo;
/* Si primero es NULL, la cola estaba vaca, ahora primero apuntar tambin al
nuevo nodo */
if(!*primero) *primero = nuevo;
}
Algoritmo de la funcin "leer":

1. Hacemos que nodo apunte al primer elemento de la cola, es decir a primero.


2. Asignamos a primero la direccin del segundo nodo de la cola: primero->siguiente.
3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la
operacin de lectura equivale a leer y borrar.
4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
5. Si primero es NULL, haremos que ltimo tambin apunte a NULL, ya que la cola
habr quedado vaca.

int Leer(pNodo *primero, pNodo *ultimo) {


pNodo nodo; /* variable auxiliar para manipular nodo */
int v; /* variable auxiliar para retorno */
/* Nodo apunta al primer elemento de la pila */
nodo = *primero;
if(!nodo) return 0; /* Si no hay nodos en la pila retornamos 0 */
/* Asignamos a primero la direccin del segundo nodo */
*primero = nodo->siguiente;
/* Guardamos el valor de retorno */
v = nodo->valor;
/* Borrar el nodo */
free(nodo);
/* Si la cola qued vaca, ultimo debe ser NULL tambin*/
if(!*primero) *ultimo = NULL;
return v;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 148

Implementacin de una cola en c++


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
void insertar(void);
void extraer(void);
void visualizar(void);
struct cola
{ char nombre[20];
struct cola *sig;
}*CAB=NULL,*AUX=NULL,*FIN=NULL;
main()
{ char opc;
do
{
cout<<"1.- Insertar"<<endl;
cout<<"2.- Extraer"<<endl;
cout<<"3.- Visualizar la cola"<<endl;
cout<<"4.- Salir"<<endl;
opc=getch( );
switch(opc)
{
case '1':
insertar( );
break;
case '2':
extraer( );
break;
case '3':
visualizar( );
}
}while (opc!='4');
return 0;
}
void insertar(void)
{ AUX=new cola;
printf("Nombre: ");
gets(AUX->nombre);
AUX->sig=NULL;
if (FIN==NULL)
FIN=CAB=AUX;
else
{
FIN->sig=AUX;
FIN=AUX;
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 149

void extraer(void)
{
if (CAB==NULL) return;
AUX=CAB;
CAB=CAB->sig;
free(AUX);
if (CAB==NULL)
{
FIN=AUX=NULL;
}
}
void visualizar(void)
{
if (CAB==NULL) return;
AUX=CAB;
while (AUX!=NULL)
{
cout<<"nombre:"<<AUX->nombre<<endl;
AUX=AUX->sig;
}
getch();
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 150

XVI. ESTRUCTURA DINMICAS DE DATOS NO LINEALES


16.1 RBOL
La representacin y terminologa de los rboles se realiza con las tpicas notaciones de
las relaciones familiares en los rboles genealgicos: padre, hijo, hermano, ascendiente,
descendiente. Junto a estos conceptos se definen ms especficamente conceptos
relacionados a los nodos
16.1.1 Definicin
Un rbol es una estructura de datos no lineal y homognea en el que cada elemento
puede tener varios elementos posteriores, pero tan slo puede tener un elemento
anterior.
Un rbol es una estructura de datos no lineal que organiza sus nodos formando
jerarquas, estas jerarquas representan relaciones padre-hijo entre los nodos del
rbol.
En un rbol los hermanos se enlazan en forma horizontal (lineal). Mientras el padre con
el hijo se enlazan en forma vertical. Existen diferentes formas de representacin de un
rbol, entre las ms comunes se tienen las siguientes: Mediante crculos y flechas y
mediante parntesis anidados.
En todo el rbol existe un nodo especial que no tiene padre y del cual parte toda la
estructura jerrquica, a este nodo se le denomina raz del rbol.
Los nodos restantes se subdividen en n conjuntos disjuntos, cada uno de los cuales
es a su vez un rbol o tambin llamados subrboles de la raz.
Ntese que esta definicin es recursiva, se define un rbol en funcin de otros rboles.
16.1.2 Terminologa bsica
Asociados al concepto de rbol,
existen toda una serie de
trminos que es necesario
conocer para manejar esta
clase de estructura de datos.
Supongamos los siguientes
ejemplos de rboles:

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 151

16.1.3 algunas definiciones bsicas:


Nodo Padre de un nodo N es aquel que apunta al mismo. En un rbol cada nodo slo
puede tener un padre. En el ejemplo 1, A es el padre de B y C, y a su vez, B es el
padre de D.
Nodo Hijo de otro nodo A es cualquier nodo apuntado por el nodo A. Un nodo puede
tener varios hijos. En el ejemplo 1, B y C son los nodos hijos de A y todos los nodos
tienen uno o dos hijos.
Nodo Raz es el nico del rbol que no tiene padre. En la representacin que hemos
utilizado, el nodo raz es el que se encuentra en la parte superior del rbol: A.
Hojas son todos los nodos que no tienen hijos. En la representacin del ejemplo 1
son Hojas los nodos situados en la parte inferior: D, G, H y F.
Nodos Interiores son los nodos que no son ni el nodo raz, ni nodos hoja. En El
ejemplo 1, son nodos interiores B, C y E.
Camino es una secuencia de nodos, en el que dos nodos consecutivos cualesquiera
son padre e hijo. En el ejemplo 1 A-B-D es un camino, al igual que E-G y C-E-H.
Rama es un camino desde el nodo raz a una hoja. En el ejemplo 1, A-C-E-G y AC- F
son ramas.
Altura es el mximo nmero de nodos de las ramas del rbol. Dicho en otros
trminos, el mximo nmero de nodos que hay que recorrer para llegar de la raz a
una de las hojas. La altura del rbol del ejemplo 1 es 4, ya que esa es la longitud de la
rama A-C-E-H, que junto a A-C-E-G son las dos ms largas.
Grado es el nmero mximo de hijos que tienen los nodos del rbol. As, en el
ejemplo anterior el rbol es de grado dos. Dmonos cuenta de que una lista no es
ms que un rbol de grado uno, tal y como podemos ver en los ejemplos 2 y 3.
Nivel de un nodo, es el nmero de nodos del camino desde la raz hasta dicho nodo.
En el rbol del ejemplo 1, A tiene nivel 1; B y C tienen nivel 2; D, E y F tienen nivel 3
y G y H tienen nivel 4.
Bosque coleccin de dos o ms rboles. Un ejemplo de bosque sera el siguiente:

16.1.4 Partes del rbol


A

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 152

Usaremos el grfico anterior para conocer la terminologa que se usa en la estructura


de dato rbol.
La Raz
Es el nodo que da origen al rbol en este caso sera el nodo A, este nodo a su vez es
padre de B y C.
Hermanos
Los nodos que tienen un mismo son conocidos como hermanos, entonces en la Fig. 1
F, G, H son hermanos ya que su padre es el nodo C.
Las Hojas
Son aquellos nodos que no tienen hijos en la Fig. 1 las hojas vienen a ser D, I, F,
G, H.
Subrbol
Es aquel rbol que es extrado de otro rbol de mayor jerarqua de la Fig. 1 tenemos.
Subrbol izquierdo
Subrbol derecho

E
Fig. 3

Fig. 2
I

Nivel de un Nodo
El nivel de un nodo es el nmero de nodos contados en forma ascendente hacia la raz.
A

Nodo A esta en el nivel 1

Nodo C esta en el nivel 2

Ingeniera Informtica y Sistemas UNAMBA

Nodo E esta en el nivel 3

Nodo G esta en el nivel 4

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 153

16.1.5 Caractersticas y propiedades de los rboles


Cada nodo excepto el nodo raz tiene un nico padre.
El nmero de nodos hijos de un nodo dado es el grado del nodo. Y el grado del
rbol ser el mximo grado de sus nodos.
Si un nodo X es apuntado por el nodo Y. Se dice que X es hijo de Y.
X es antecesor de Y si el nodo X apunta al nodo Y. X es padre de Y.
Todos los nodos que son descendientes directos (hijos) de un mismo nodo
(padre), son hermanos.
Si un nodo no tiene ramificaciones (hijos), se conoce con el nombre de
Terminal u hoja.
Grado es el nmero de descendientes directos de un nodo, grado de un rbol
es el mximo grado de todos los nodos del rbol.
Nivel es el nmero de arcos que deben recorrerse para llegar a un nodo.
16.1.6 Recorridos en amplitud (o por niveles)

En este caso el recorrido se realiza en orden por los distintos niveles del rbol.
As, se comenzara tratando el nivel 1, que slo contiene el nodo raz,
seguidamente el nivel 2, el 3 y as sucesivamente. En el rbol de la figura el
recorrido en amplitud sera: 2, 7, 5, 2, 6, 9, 5, 11 y 4.
Al contrario que en los mtodos de recorrido en profundidad, el recorrido por
niveles no es de naturaleza recursiva. Por ello, se debe utilizar una cola para
recordar los subrboles izquierdos y derecho de cada nodo.
void amplitud(tArbol *a)
{
tCola cola;
tArbol *aux;
if (a != NULL) {
crearCola(cola);
encolar(cola, a);
while (!colavacia(cola)) {
desencolar(cola, aux);
visitar(aux);
//Realiza una operacin en nodo
if (aux->hIzquierdo != NULL) encolar(cola, aux->hIzquierdo );
if (aux->hDerecho!= NULL) encolar(cola, aux->hDerecho);
}
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 154

16.1.7 Altura de un rbol


Conocido tambin como profundidad de un rbol es el nmero de nodos que se
encuentra entre la raz y el nodo ms alejado de dicha raz.
Si existe un rbol vaci entonces su profundidad es cero.
Ejemplos:
C

Profundidad 1
A
B

Fig. 5

Profundidad 4
E
Fig. 6
F
16.1.8 rboles Binarios
Un rbol binario es aquel en el que todos sus nodos tienen como mximo dos nodos
hijos; est formado por un nodo raz desde donde parten dos subrboles: subrbol
izquierdo y subrbol derecho, donde cada subrbol es un rbol binario.
rbol binario equilibrado: En este rbol binario la diferencia del nmero de niveles
entre los subrboles de cualquier nodo es la unidad.
rbol binario perfectamente equilibrado: Los subrboles de todos los nodos tienen el
mismo, nmero de niveles.
rbol binario completo: Todos los nodos del rbol a excepcin de los nodos terminales
tienen 2 hijos.
Un rbol es binario cuando cualquier nodo del rbol puede tener como mximo dos
nodos hijos.
A

Fig. 7

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 155

16.1.8.1 rbol Binario Lleno


Es cuando un rbol de altura h tiene todas sus hojas al mismo nivel h y todos los
nodos que tienen menor nivel a h tienen dos hijos.
La definicin recursiva de un rbol binario es:

Cuando el rbol (A) esta vaci, entonces (A) es un rbol binario lleno de altura
cero.

Cuando el rbol (A) no est vaci, entonces (A) es un rbol binario lleno si los
subrboles de la raz son ambos rboles binarios llenos de altura h menos 1.
Ejemplo:
rbol de altura 3
A

16.1.9 Recorrido de un rbol


Este proceso permite visitar a todos los nodos de un rbol, se puede hacer dos tipos de
recorrido, un tipo de recorrido puede ser de anchura, donde visitamos los nodos por
niveles, la otra forma de recorrer el rbol es en profundidad, en este caso se puede
visitar o acceder de tres formas, estos recorridos se caracterizan de acuerdo al
momento en que se accede a la raz en relacin o con la visita a los subrboles.
Los recorridos en profundidad son:

16.1.9.1 Recorrido en Pre-orden

En este tipo de recorrido se realiza cierta accin (quizs simplemente imprimir


por pantalla el valor de la clave de ese nodo) sobre el nodo actual y
posteriormente se trata nodo raz, el subrbol izquierdo y cuando se haya
concluido, el subrbol derecho. En el rbol de la figura el recorrido en preorden
sera: 2, 7, 2, 6, 5, 11, 5, 9 y 4.
2, 7, 5, 6, 11, 2, 5, 4 y 9.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 156

O en conclusin seria primero se visita la raz luego se visita el subrbol izquierdo y


finalmente se visita el subrbol derecho.
Pseudocdigo:

void preorden(tArbol *a)


{
if (a != NULL) {
tratar(a);
//Realiza una operacin en nodo
preorden(a->hIzquierdo);
preorden(a->hDerecho);
}
}
A
B

E
H

F
I

16.1.9.2 Recorrido en In-orden

En este caso se trata primero el subrbol izquierdo, despus el nodo actual y por
ltimo el subrbol derecho. En un ABB este recorrido dara los valores de clave
ordenados de menor a mayor. En el rbol de la figura el recorrido en inorden
sera: 2, 7, 5, 6, 11, 2, 5, 4 y 9.
En conclusin consiste en visitar primero el subrbol izquierdo, luego visitar la raz y
finalmente visitar el subrbol derecho.
Pseudocdigo:

void inorden(tArbol *a)


{
if (a != NULL)
{
inorden(a->hIzquierdo);
tratar(a);
//Realiza una operacin en nodo
inorden(a->hDerecho);
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 157

A
B

16.1.9.3 Recorrido en Pos-orden

En este caso se trata primero el subrbol izquierdo, despus el derecho y por


ltimo el nodo actual. En el rbol de la figura el recorrido en postorden sera: 2,
5, 11, 6, 7, 4, 9, 5 y 2.
En conclusin consiste en visitar primero el subrbol izquierdo seguidamente visitar el
subrbol derecho y finalmente visitar la raz.

A
C

J
Pseudocdigo:

void postorden(tArbol *a)


{
if (a != NULL) {
postorden(a->hIzquiedo);
postorden(a->hDerecho);
tratar(a);
//Realiza una operacin en nodo
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 158

Ejemplo:
14,15,4,9,7,18,3,5,16,20,17
14

15

18

16

20

Fig. 9
5

17

Recorrido en pre-orden.Recorrido en In-orden.Recorrido en pos-orden.-

14,4,3,9,7,5,15,18,16,17,20
3,4,9,7,5,14,15,18,16,17,20
3,5,7,9,4,17,16,20,18,15,14

rboles Binarios de Expresin


Las expresiones estn formadas por valores sobre los que pueden ejecutarse
operaciones binarias como por ejemplo: la suma, resta, multiplicacin y divisin.
En este tipo de rboles binarios la raz contiene el operador y los hijos contienen los
operndos.
+

Fig. 10
Subrbol izquierdo: 3+2=5/5=1

Subrbol derecho: 8/4=2*3=6

Subrbol izquierdo + Subrbol derecho = 7


Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 159

La Notacin Infija
La notacin infijo es habitual, el orden es primer operando, operador y segundo
operando.
La Notacin Prefija
El orden es operador primer operando y segundo operando.
La Notacin Posfija
El orden es primer operando, segundo operando y operador.
La Notacin Funcional
Se escribe primero el operador funcin y despus (los operadores separados por
comas).
La Notacin Infija
Tiene problema con expresiones con ms de un operador existe ambigedad sobre
cul es el orden de evaluacin.
Ejemplo
8/4/2
Se puede interpretar de dos formas:
(8/4)/2 v
8/(4/2)
Las otras notaciones no sufren este problema.
Para resolver esta ambigedad se aaden unas reglas denominadas orden de
precedencia de operadores, cuando dos operadores compiten con el mismo operando
entonces en este caso gana el operador con mayor precedencia que se encuentra
situado ms a la izquierda.
Las reglas de precedencia habituales son que los operadores divisin y producto tienen
igual precedencia y gana el resto de operadores, la resta tiene igual precedencia y gana
el operador igualdad.
Ejemplos:
Notacin Infija
Notacin Prefija
Notacin Posfija
Notacin Funcional

2+(3*4)=x
2+3*4=x
=+ 2 * 3 4 x
234*+x=
= (+(2,*(3,4)),4)

((2+3)*4)
(2+3)*4=x
=* + 2 3 4 x
23+4*x=
=(*(+(2,3),4),x)

((2*4)-(8/2))=x
2*4-8/2=x
=-*24/82x
2 4 * 8 2 / - x=
=(-(*(2,4),/(8,2),x)

Recorrido de un rbol en C++


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
struct nodoarbol
{
struct nodoarbol *izqnodo;
int info;
struct nodoarbol *dernodo;
};
typedef struct nodoarbol NODO;
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 160

typedef NODO *ARBOL;


void insertanodonuevo(ARBOL *,int);
void inorden(ARBOL);
void preorden(ARBOL);
void postorden(ARBOL);
void treefree(ARBOL);
main()

{
int i;
char newnod,chain[100],elementos;
clrscr();
ARBOL raiz=NULL;
cout<<"Introduzca una cadena de caracteres (max. 100 elementos)\n";
gets(chain);
elementos=strlen(chain);
for(i=1;i<=elementos;i++)
{
newnod=chain[i-1];
insertanodonuevo(&raiz,newnod);
}
cout<<"\n\n preorden \t";
preorden(raiz);
cout<<"\n\n inorden \t";
inorden(raiz);
cout<<"\n\n postorden \t";
postorden(raiz);
getch();
treefree(raiz);
raiz=NULL;
return 0;
}

void insertanodonuevo(ARBOL *rarbol,int nuevo)


{
if(*rarbol==NULL)
{
*rarbol=new NODO;
if(*rarbol!=NULL)
{
(*rarbol)->info=nuevo;
(*rarbol)->izqnodo =NULL;
(*rarbol)->dernodo=NULL;
}
}
if(nuevo<(*rarbol)->info)
insertanodonuevo(&((*rarbol)->izqnodo),nuevo);
if(nuevo>(*rarbol)->info)
insertanodonuevo(&((*rarbol)->dernodo),nuevo);
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 161

void preorden(ARBOL rarbol)


{
if(rarbol!=NULL)
{
printf(" %c ",rarbol->info);
preorden(rarbol->izqnodo);
preorden(rarbol->dernodo);
}
}
void inorden(ARBOL rarbol)
{
if(rarbol!=NULL)
{
inorden(rarbol->izqnodo);
printf(" %c ",rarbol->info);
inorden(rarbol->dernodo);
}
}
void postorden(ARBOL rarbol)
{
if(rarbol!=NULL)
{
postorden(rarbol->izqnodo);
postorden(rarbol->dernodo);
printf(" %c ",rarbol->info);
}
}
void treefree(ARBOL rarbol)
{
if(rarbol!=NULL)
{
treefree(rarbol->izqnodo);
treefree(rarbol->dernodo);
free(rarbol);
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 162

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
struct nodoarbol{ //estructura del arbol
struct nodoarbol *izqnodo;
int info;
struct nodoarbol *dernodo;
};
typedef struct nodoarbol nodo; //definicion de tipo nodo
typedef nodo *arbol; //declaracion de variable puntero a nodo
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void insertanodonuevo(arbol *,int); //declaracion de funciones
void inorden(arbol);
void preorden(arbol);
void postorden(arbol);
void treefree(arbol);
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
main(){
int i; //contador
char newnod,chain[200],elementos; //declaracion de cadena,bandera y variable que
contiene el nuevo valor a insertar en el arbol
clrscr();
arbol raiz=null; //declaracion de variable de tipo arbol
printf("\n\n\tintroduzca una cadena de caracteres (max. 200 elementos):\n");
gets(chain);
elementos=strlen(chain); //checa el tamao de la cadena y establece el numero de
nodos del arbol
for(i=1;i<=elementos;i++) {
newnod=chain[i-1];
insertanodonuevo(&raiz,newnod);
}
printf("\n\n preorden \t");
preorden(raiz); //llamado a funcion de recorrido en preorden
printf("\n\n inorden \t");
inorden(raiz); //llamado a funcion de recorrido en inorden
printf("\n\n postorden \t");
postorden(raiz); //llamado a funcion de recorrido en postorden
getch();
treefree(raiz); //liberacion de memoria del arbol.
raiz=null; //asignacion de un valor nulo a la raiz.
return 0;
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
/*-crea un nuevo nodo y coloca los valores del nuevo elemento en la posicion
correspondiente */
void insertanodonuevo(arbol *rarbol,int nuevo){
if(*rarbol==null){ //creacion de un nuevo nodo
*rarbol=(nodo *)malloc(sizeof(nodo));
if(*rarbol!=null){
//asignacion de valores nuevos en el nodo nuevo
(*rarbol)->info=nuevo;
(*rarbol)->izqnodo =null;
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 163

(*rarbol)->dernodo=null;
}
else{printf("\n memoria no disponible !!!!\n");}
}
else
if(nuevo<(*rarbol)->info) //checa si el elemento nuevo es mayor que el elemento
padre
insertanodonuevo(&((*rarbol)->izqnodo),nuevo); //coloca el elemento a la izquierda
del padre o raiz
else
if(nuevo>(*rarbol)->info) //checa si el elemento nuevo es menor que el elemento
padre
insertanodonuevo(&((*rarbol)->dernodo),nuevo); //coloca el elemento a la derecha
del padre o raiz
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//funcion iterativa la cual recorre el arbol imprimiendo siempre el valor
//que contiene la raiz,despues la rama izquierda,luego la rama derecha,siempre
//y cuando la raiz sea diferente de un valor nulo, si es nulo salta a la siguiente
instruccion.
void preorden(arbol rarbol){
if(rarbol!=null){
printf(" %c ",rarbol->info);
preorden(rarbol->izqnodo);
preorden(rarbol->dernodo);
}
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//funcion iterativa la cual recorre el arbol buscando el nodo mas izquierdo
//que contiene el arbol o sea hasta que la rama del ultimo nodo sea nulo,luego la
imprime,despues
//despues la raiz del sub-arbol,y luego el nodo de la derecha.
void inorden(arbol rarbol){
if(rarbol!=null){
inorden(rarbol->izqnodo);
printf(" %c ",rarbol->info);
inorden(rarbol->dernodo);
}
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//funcion iterativa la cual recorre el arbol buscando el nodo que esta mas a la izquierda
//luego el nodo de la derecha y luego la raiz de ese sub-arbol
void postorden(arbol rarbol){
if(rarbol!=null){
postorden(rarbol->izqnodo);
postorden(rarbol->dernodo);
printf(" %c ",rarbol->info);
}
}
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//funcion iterativa identica al recorrido en postorden la unica diferencia
//es que en vez de imprimir en pantalla el valor de un nodo este es
//eliminado del arbol liberando la memoria con la funcion free(), elegi esta
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 164

//forma ya que se elimina primero los nodos hijo de el sub-arbol y luego la raiz
//ya que si se elimina la raiz primero, los datos de los hijos se desconectan
//del arbol pero la memoria que ocupaban sigue siendo utilizada y de esta forma
//se elimina el arbol de abajo hacia arriba (o sea de los hijos a la raiz).
void treefree(arbol rarbol){
if(rarbol!=null){
treefree(rarbol->izqnodo);
treefree(rarbol->dernodo);
free(rarbol);
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 165

//Algoritmo de Arboles
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<graphics.h>
typedef struct nodo{
int dato;
struct nodo *izquierda;
struct nodo *derecha;
}NODOARBOL;
typedef NODOARBOL tarbolb;
void insertar(tarbolb **,int);
void inorden(tarbolb *);
void preorden(tarbolb *);
void postorden(tarbolb *);
void buscar(tarbolb *,int);
void eliminar(tarbolb **,int);
void reemplazar(tarbolb **);
int numeronodos(tarbolb *);
void mostarmenor(tarbolb *,int);
int hojas(tarbolb *);
int alturanodo(tarbolb cabeza,int);
void crear(struct nodo **);
void insertar(struct nodo **,int);
void recorrer_InOrden(struct nodo **);
void recorrer_PostOrden(struct nodo **);
void recorrer_PreOrden(struct nodo* *);
int buscar(struct nodo **,int);
void eliminar(struct nodo **,int);
void unir(struct nodo **,struct nodo **);
void cambiar(struct nodo **,int,int);
void mostrar();
void dibujar(struct nodo *,int ,int ,int ,int );
int menu(void);
void poner_recuadro(void);
int acerca_de(void);
void cuadro();
main(){
int elemento;
tarbolb *raiz=NULL;
int opcion;
int gdriver = DETECT, gmode;
clrscr();
for(;;){
clrscr();
opcion=menu();
switch(opcion){
case 6:{
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

case 8:{

case 10:{

Pg. 166

clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"ingrese : ";
cin>>elemento;
insertar(&raiz,elemento);
getch();
}
break;
clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"El arbol en preorden es :"<<endl;
preorden(raiz);
getch();
}
break;
clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"El arbol en inorden es :"<<endl;
inorden(raiz);
getch();
}
break;

case 12:{

case 14:{

case 16:{

clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"El arbol postoreden es :"<<endl;
postorden(raiz);
getch();
}
break;
clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"Elemento a buscar : ";
cin>>elemento;
buscar(raiz,elemento);
getch();
}
break;
clrscr();
cuadro();
window(1,1,80,25);

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 167

gotoxy(4,3);
cout<<"Elemento a eliminar : ";
cin>>elemento;
eliminar(&raiz,elemento);
getch();
}
break;
case 18: {

clrscr();
initgraph(&gdriver,&gmode,"e:\\BC45\\BGI");
dibujar(raiz,15,3,7,0);
getch();
cleardevice();
closegraph();
}

}
int menu(){
int pos=6;
char aux;
poner_recuadro();
for( ; ; ){
switch(pos){
case 6 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" INSERTAR ELEMENTO ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" INSERTAR ELEMENTO ");
break;
case 8 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" RECORRIDO PRE-ORDEN ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" RECORRIDO PRE-ORDEN ");
break;
case 10 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" RECORRIDO IN-ORDEN ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" RECORRIDO IN-ORDEN ");
break;
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 168

case 12 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" RECORRIDO POST-ORDEN ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" RECORRIDO POST-ORDEN ");
break;
case 14 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" BUSCAR ELEMENTO ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" BUSCAR ELEMENTO ");
break;
case 16 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" ELIMINAR ELELEMENTO ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" ELIMINAR ELELEMENTO ");
break;
case 18 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf("
GRAFICAR
");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf("
GRAFICAR
");
break;
}
switch(aux){
case 0x48 : pos=pos-2;
if(pos==4) pos=18;
break;
case 0x50 : pos=pos+2;
if(pos==17) pos=3;
break;
case 0x0d : return pos;
case 0x44 : exit(0);
case 0x3b : break;
case 0x3c : acerca_de();
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 169

void poner_recuadro(void){
int i;
textbackground(18);
clrscr();
clrscr();
cuadro();
textcolor(BLUE);
textbackground(CYAN);
gotoxy(23,4);
cprintf("[Menu Principal]");
for(i=0;i<16;i++){
gotoxy(23,i+5);
textbackground(CYAN);
cprintf("
");
}
gotoxy(23,20);
cprintf("[ UNAMBA ]");
textcolor(WHITE);
textbackground(RED);
gotoxy(26,6);
cprintf(" INSERTAR ELEMENTO ");
gotoxy(26,8);
cprintf(" RECORRIDO PRE-ORDEN ");
gotoxy(26,10);
cprintf(" RECORRIDO IN-ORDEN ");
gotoxy(26,12);
cprintf(" RECORRIDO POST-ORDEN ");
gotoxy(26,14);
cprintf(" BUSCAR ELEMENTO ");
gotoxy(26,16);
cprintf(" ELIMINAR ELELEMENTO ");
gotoxy(26,18);
cprintf("
GRAFICAR
");
}
void cuadro()
{
int i;
gotoxy(2,2);
cprintf("");
for(i=3;i<24;i++){
gotoxy(2,i);
cprintf("
");
}
gotoxy(2,24);
cprintf("[F2 Acerca de][F10 Salir]");
}
int acerca_de(void){
window(10,6,70,18);
textcolor(WHITE);
textbackground(BLUE);
clrscr();
cprintf("\n\r
UNIVERSIDAD NACIONAL DE APURIMAC");
cprintf("\n\n\r
carrera de ingenieria informatica y sistemas\n\r\n\r");
cprintf("
ALGORITMICA II\n\r\n\r");
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 170

cprintf("
Autor: Pool Nichel Aguilar Baez\n\r");
cprintf("
Curso: Algoritmica II\n\r\n\r");
cprintf("
Semestre: 2008-II - diciembre/2008\n\r");
window(1,1,80,25);
getch();
poner_recuadro();
return(0);

void crear(struct nodo **arbol){


(*arbol)=NULL;
}
int buscar(struct nodo **arbol,int x){
struct nodo *p;
p=*arbol;
while(p!=NULL && p->dato!=x){
if(x>p->dato)
p=p->derecha;
else
p=p->izquierda;
}
if(p!=NULL)
return 1;
else
return 0;
}
void unir(struct nodo **arbol,struct nodo **hijo){
struct nodo *p,*ant;
ant=NULL;
p=*arbol;
while(p!=NULL){
ant=p;
if((*hijo)->dato>p->dato)
p=p->derecha;
else
p=p->izquierda;
}
if(ant==NULL)
*arbol=*hijo;
else{ if((*hijo)->dato>ant->dato)
ant->derecha=*hijo;
else
ant->izquierda=*hijo;
}
}
void cambiar(struct nodo **arbol,int x,int y){
if(buscar(arbol,x)!=1)
cout<<"\nno se puede cambiar\n";
else{ eliminar(&(*arbol),x);
insertar(&(*arbol),y);
}
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 171

void recorrer_PreOrden(struct nodo **arbol){


cout<<" "<<(*arbol)->dato;
if((*arbol)->izquierda!=NULL)
recorrer_PreOrden(&(*arbol)->izquierda);
if((*arbol)->derecha!=NULL)
recorrer_PreOrden(&(*arbol)->derecha);
}
void recorrer_InOrden(struct nodo **arbol){
if((*arbol)->izquierda!=NULL){
recorrer_InOrden(&(*arbol)->izquierda);
cout<<" "<<(*arbol)->dato;
}
if((*arbol)->derecha!=NULL)
recorrer_InOrden(&(*arbol)->derecha);
}
void recorrer_PostOrden(struct nodo **arbol){
if((*arbol)->izquierda!=NULL)
recorrer_PostOrden(&(*arbol)->izquierda);
if((*arbol)->derecha!=NULL){
recorrer_PostOrden(&(*arbol)->derecha);
cout<<" "<<(*arbol)->dato;
}
}
void dibujar(tarbolb *cabeza, int a, int b, int c, int d){
char value[3];
if(cabeza!=NULL){
itoa(cabeza->dato,value,10);
circle(300+a,75+b,14);
setcolor(YELLOW); outtextxy(295+a,75+b,value); setcolor(WHITE);
if(d==1){
line(300+a+pow(2,c+1),b+14,300+a,61+b);
}
else if(d==2){
line(300+a-pow(2,c+1),b+14,300+a,61+b);
dibujar(cabeza->izquierda,a-pow(2,c)-pow(2,d-4),b+75,c-1,1);
dibujar(cabeza->derecha,a+pow(2,c)+pow(2,d-4),b+75,c-1,2);
}
}
else
cout<<"@RBOL VACIO";
circle(300+a,75+b,14);
}
int alturanodo(tarbolb *cabeza,int elemento){
int cont=0;
if(cabeza->dato!=elemento){
cont=100;
}
if(cabeza->dato>elemento && cabeza->izquierda!=NULL){
cont=alturanodo(cabeza->izquierda,elemento);
}
Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 172

if(cabeza->dato<elemento && cabeza->derecha!=NULL){


cont=alturanodo(cabeza->derecha,elemento)+1;
}
return cont;
}
void reemplazar(tarbolb **cabeza){
tarbolb *aux,*temp;
temp=*cabeza;
aux=(*cabeza)->izquierda;
while(aux->derecha){
temp=aux;
aux=aux->derecha;
}
(*cabeza)->dato=aux->dato;
if(temp==*cabeza){
temp->izquierda=aux->izquierda;
}
else
temp->derecha=aux->izquierda;
*cabeza=aux;
}
void eliminar(tarbolb **cabeza, int elemento){
tarbolb *temp;
if(*cabeza==NULL){
cout<<"elemento no encontrado";
}
else
{
if(elemento<(*cabeza)->dato)
eliminar(&(*cabeza)->izquierda,elemento);
else
if(elemento>(*cabeza)->dato)
eliminar(&(*cabeza)->derecha,elemento);
else
{
temp=*cabeza;
if(temp->izquierda==NULL)
*cabeza=temp->derecha;
else
if(temp->derecha==NULL)
*cabeza=temp->izquierda;
else
reemplazar(&temp);
delete temp;
}
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 173

int hojas(tarbolb *cabeza){


int contador=0;
if(cabeza->izquierda==NULL){
contador=contador+hojas(cabeza->izquierda);
}
if(cabeza->derecha!=NULL){
contador=contador+hojas(cabeza->derecha);
}
if(cabeza->izquierda==NULL && cabeza->derecha==NULL){
return contador+1;
}
else{
return contador;
}
}
void mostrarmenor(tarbolb *cabeza,int elemento){
if(cabeza==NULL){
return;
}
if(cabeza->dato==elemento){
inorden(cabeza->izquierda);
inorden(cabeza->derecha);
}
else{
mostrarmenor(cabeza->izquierda,elemento);
mostrarmenor(cabeza->derecha,elemento);
}
}
int contador=0;
int numeronodos(tarbolb *cabeza){
if(cabeza==NULL)
{
return(contador);
}
else
{
contador=contador+1;
numeronodos((cabeza)->derecha);
numeronodos((cabeza)->izquierda);
}
return (contador);
}
void buscar(tarbolb *cabeza,int elemento){
if(cabeza==NULL){
cout<<"El elemento "<<elemento<<" no existe"<<endl;
return;
}
if((cabeza)->dato==elemento){
cout<<"El elemento "<<elemento<<" existe"<<endl;}
else{
if((cabeza)->dato<elemento)

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 174

buscar((cabeza)->derecha,elemento);
else
buscar((cabeza)->izquierda,elemento);
}
}
void insertar(tarbolb **cabeza,int elemento){
if(*cabeza==NULL){
*cabeza=(tarbolb *)malloc(sizeof(tarbolb));
if(*cabeza==NULL){
cout<<"no hay memoria"<<endl;
return;
}
(*cabeza)->dato=elemento;
(*cabeza)->izquierda=NULL;
(*cabeza)->derecha=NULL;
}
else if(elemento<(*cabeza)->dato)
insertar(&(*cabeza)->izquierda,elemento);
else if(elemento>(*cabeza)->dato)
insertar(&(*cabeza)->derecha,elemento);
else{
cout<<"No puede insertar valor duplicado"<<endl;
getch();
return;
}
}
void inorden(tarbolb *cabeza){
if(cabeza!=NULL){
inorden(cabeza->izquierda);
cout<<" "<<cabeza->dato;
inorden(cabeza->derecha);
}
}
void preorden(tarbolb *cabeza){
if(cabeza!=NULL){
cout<<" "<<cabeza->dato;
preorden(cabeza->izquierda);
preorden(cabeza->derecha);
}
}
void postorden(tarbolb *cabeza){
if(cabeza!=NULL){
postorden(cabeza->izquierda);
postorden(cabeza->derecha);
cout<<" "<<cabeza->dato;
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 175

16.2 GRAFOS

En matemticas y ciencias de la computacin, un grafo (del griego grafos:


dibujo, imagen) o grfica es el principal objeto de estudio de la teora de grafos.
16.2.1 Definicin
Informalmente, un grafo es un conjunto de objetos llamados vrtices o nodos
unidos por enlaces llamados aristas o arcos, que permiten representar
relaciones binarias entre elementos de un conjunto.
Tpicamente, un grafo se representa grficamente como un conjunto de puntos
(vrtices o nodos) unidos por lneas (aristas).
Desde un punto de vista prctico, los grafos permiten estudiar las
interrelaciones entre unidades que interactan unas con otras. Por ejemplo, una
red de computadoras puede representarse y estudiarse mediante un grafo, en el
cual los vrtices representan terminales y las aristas representan conexiones
(las cuales, a su vez, pueden ser cables o conexiones inalmbricas).

16.2.2 Terminologa de Grafos


a) Adyacencia
Para no dirigidos se dice que dos vrtices son adyacentes si forman un lado. En
dirigidos se extiende el concepto: sea el lado <Vi, Vj>: se dice Vj es adyacente desde Vi y
Vi es adyacente hacia Vj.
b) Incidencia
Se dice que un lado es incidente sobre el par de vrtices que lo conforman.
c) Grado De Un Vrtice (Nodo)
Es el nmero de lados incidentes sobre l.
Para grafos dirigidos el grado se diferencia as: grado entrante que es el nmero de
lados que llegan al nodo y el grado saliente que es l numero de lados que salen del
nodo. La suma de ambos es el grado total.
d) Trayectoria
Es una secuencia de lados para ir desde Vi a Vj, en la cual cada pareja consecutiva de
vrtices debe ser un lado definido para el grafo. Si alguna pareja de vrtices
consecutivos no est definida en el conjunto de lados del grafo se dice que la trayectoria
es invlida.
Si en un grafo es posible viajar de cada nodo hacia todos los dems se dice que es un
grafo conectado, si el grafo es no dirigido. Si el grafo es dirigido se dice que es
fuertemente conectado.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 176

e) Tipos De Trayectoria
Existen dos tipos de trayectoria: La simple y el ciclo.
S una trayectoria o camino de vi a vj no tiene vrtices repetidos, se llama:
Trayectoria simple. Un circuito o ciclo es una trayectoria o camino que empieza y
termina en el mismo vrtice y no tiene aristas repetidas. El circuito se llamar
simple si no tiene aristas ni vrtices repetidos, excepto el primero y el ltimo.
Ciclo: Es una trayectoria simple donde el primero y el ltimo nodo son iguales. En
no dirigidos su longitud mnima es de 3 y en dirigidos es de 2.

16.2.3 Representaciones de los Grafos.

Sea G = (V, E) un grafo con V vrtices y E aristas, entonces le corresponde una matriz
VE denominada la matriz de incidencia de G. Si denotamos los vrtices de G por v 1, v 2,
. . . , vV y las aristas por e1, e2, . . . , e E". Entonces la matriz de incidencia de G es la matriz
M (G) = [mij] donde mij es el nmero de veces que la arista ej incide en el vrtice vi; los
valores son 0,1 2 (2 en el caso que la arista sea un lazo).
Otra matriz asociada a G es la matriz de adyacencia, esta es una matriz v v A(G)[a ij],
en donde a ij es el nmero de aristas que van de vi hasta vj. A continuacin damos un
ejemplo de un grafo con su correspondiente matriz de incidencia y matriz de
adyacencia.

16.2.4 Matriz de adyacencia.

La matriz de adyacencia de un grafo G con conjunto de vrtices V={ v1,v2.vn} es la


matriz cuadrada A = A(G), n x n, definida por:
1 v v E(G)
(A) =
0 de otro modo
La matriz A es simtrica con elementos nulos en la diagonal. Por otra parte, el nmero
de elementos iguales a 1 en la fila (o columna) i de A(G) es d(vi), el grado del vrtice vi
o, lo que es equivalente, el nmero de caminos de longitud 1 que comienzan en el
vrtice vi. De forma ms general, las potencias de A dan informacin sobre los caminos
en G.

16.2.5 Matriz incidencia

La matriz de incidencia de un grafo V(G)={ v1,v2.vm} con conjunto de vrtices


V(E) = { e1,e2.en}es la matriz cuadrada A = A(G), n x m, definida por:
1 v es incidente con e
(B) =
0 de otro modo

16.2.6 Caminos

Se llama caminos a una secuencia de aristas (V1, V2, V3Vn) de la manera que el vrtice
final de cada uno sirve de vrtice inicial al siguiente.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 177

Camino en un grafo es una sucesin de vrtices y arcos.

Al nmero de arcos que atraviesa el camino se le denomina Longitud del


camino.
Camino de longitud 0 es aquel constituido nicamente por un vrtice.
Extremos del camino son los vrtices inicial y final.
Vrtices interiores son aquellos situados entre los extremos del camino.

16.2.6.1 Tipos de Caminos.


a) El camino elemental o trayectoria. es un camino que pasa por una serie
de vrtices una sola vez. Es decir, es aquel que no pasa 2 veces por un
mismo vrtice, salvo, excepcionalmente, que el vrtice que se repite sea el
inicial y el final.

Ej. El camino (A, C, D, B, A)


b)

Camino simple o sendero.-es un camino que pasa por una serie de


aristas una sola vez. Todo camino elemental es un camino simple, pero la
inversa puede no cumplirse.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 178

Por ejemplo:
Para ir de A a D, podra ser:
(A,B,D),(A,C,D),(A,B,C,D) (A,C,B,D)
c)

Circuito.- es un camino cerrado, el vrtice final coincide con el vrtice


inicial. Un camino o un circuito se llama hamiltoniano si pasa una sola vez
por todos los vrtices del grafo, y se denomina euleriano si pasa una sola
vez por todas las aristas del grafo.

d)

Camino cerrado.- es aquel cuyo vrtice final coincide con el vrtice inicial.

Ej. Un ciclo(A, B, C, D, A)

e)

Ciclo.- Es un camino simple, elemental y cerrado, de longitud positiva (n


> 0) El ciclo ms elemental es un bucle (tambin reciben el nombre de lazo
o rizo).

f)

Caminos Hamiltonianos
Un ciclo es un camino, es decir una sucesin de aristas adyacentes, donde no se
recorre dos veces la misma arista, y donde se regresa al punto inicial. Un ciclo
hamiltoniano tiene adems que recorrer todos los vrtices exactamente una vez
(excepto el vrtice del que parte y al cual llega). Por ejemplo, en un museo
grande, lo idneo sera recorrer todas las salas una sola vez, esto es buscar un
ciclo hamiltoniano en el grafo que representa el museo (los vrtices son las salas,
y las aristas los corredores o puertas entre ellas).
Un circuito o ciclo hamiltoniano es un ciclo simple que contiene todos los vrtices
de G. Lo anterior quiere decir que un circuito hamiltoniano es una trayectoria que
empieza y termina en el mismo vrtice, no tiene aristas repetidas y pasa por
cada vrtice una sola vez.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 179

Ejemplo:

Teorema. Sea G un grafo conexo con n vrtices, donde n3. Si la suma de los
grados de cada par de vrtices no adyacentes es mayor o igual a n, entonces G
tiene un circuito hamiltoniano.

16.2.7 Recorrido de un Grafo

Recorrer un grafo significa tratar de alcanzar todos los nodos que estn relacionados
con uno que llamaremos nodo de salida. Existen bsicamente dos tcnicas para
recorrer un grafo: el recorrido en anchura; y el recorrido en profundidad.

16.2.7.1 Recorrido en anchura


El recorrido en anchura supone recorrer el grafo, a partir de un nodo dado, en
niveles, es decir, primero los que estn a una distancia de un arco del nodo de
salida, despus los que estn a dos arcos de distancia, y as sucesivamente hasta
alcanzar todos los nodos a los que se pudiese llegar desde el nodo salida.
16.2.7.2 Recorrido en profundidad
el recorrido en profundidad trata de buscar los caminos que parten desde el
nodo de salida hasta que ya no es posible avanzar ms. Cuando ya no puede
avanzarse ms sobre el camino elegido, se vuelve atrs en busca de caminos
alternativos, que no se estudiaron previamente.
16.2.8 Clasificacin de Grafos.
16.2.8.1 Grafo dirigido (dgrafo)
Sea G un grafo. Si cada arista en G tiene una direccin, entonces G se llama grafo
dirigido o dgrafo y sus aristas se llaman arcos. El vrtice donde empieza un arco
se llama punto inicial y el vrtice donde termina se llama punto Terminal.
Cuando no se consideran las direcciones de las aristas en G, el grafo que se
obtiene se llama grafo subyacente de G.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 180

Ejemplo:

A(D)=

1
0
1
0
0
0

0
0
1
1
0
0

0
0
0
1
0
0

0
0
0
0
0
0

0
0
1
0
0
0

0
0
0
0
1
1

G3 = (V3, A3) V3 = {1, 2, 3,4,5,6} A3 = { (1,1),(3,1),(3,2),(3,5),(4,2),(4,3),(5,6),(6,5)} .


La matriz de adyacencia de un dgrafo no es simtrica. Es una matriz binaria. El nmero
de unos que aparecen en una fila es igual al grado de salida del correspondiente
vrtice y el nmero de unos que aparecen en una determinada columna es igual al
grado de entrada del correspondiente vrtice.

Ejemplo: En el digrafo siguiente:

Sea v un vrtice de un dgrafo G. el grado de entrada de v, denotado por gradent


(v) es el numero de arcos en G cuyo punto terminal es v. El grado de salida de v,
denotado por gradsal (v) es el nmero de arcos en G cuyo punto inicial es v.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 181

Ejemplo:
En el ejemplo anterior, los grados de entrada y de salida de cada vrtice se
detallan en la siguiente tabla.
Vrtice

Grado entrada

Grado salida

v1

v2

v3

Una trayectoria dirigida en un dgrafo G es una sucesin de vrtices y aristas de modo


que el punto Terminal de un arco es el punto inicial del siguiente. Si en G existe una
trayectoria orientada que va del vrtice vi al vrtice vk entonces se dice que vk es
asequible a partir de vi .
Ejemplo
Considrese el dgrafo siguiente:

Una trayectoria dirigida de v2 a v5 es: v2 e2 v3 e3 v4 e4 v5.


v1 no es asequible desde ningn vrtice porque gradent (v1) =0
v3 es asequible desde cualquier otro vrtice.
Sea G un dgrafo. Si cada vrtice en G es asequible a partir de cualquier otro vrtice en
G, entonces el dgrafo se denomina fuertemente conexo. Si el grafo subyacente de G es
conexo, entonces se dice que G es dbilmente conexo.
Ejemplo
El siguiente digrafo es fuertemente conexo.

En este dgrafo cada vrtice es asequible desde cualquier otro vrtice.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 182

16.2.8.2 Grafo no dirigido

Definicin.- En un grafo no dirigido el par de vrtices que representa un arco no est


ordenado. Por lo tanto, los pares (v1, v2) y (v2, v1) representan el mismo arco. su
matriz de adyacencia es la matriz de orden nn, A(G)=(a ij) donde a ij es el nmero de
aristas que unen los vrtices vi y vj.
Ejemplo:

La matriz de adyacencia de un grafo es simtrica. Si un vrtice es aislado entonces la


correspondiente fila (columna) est compuesta slo por ceros. Si el grafo es simple
entonces la matriz de adyacencia contiene solo ceros y unos (matriz binaria) y la
diagonal est compuesta slo por ceros.

16.2.9 Grafo simple


Los grafos (dirigidos o no) que no tienen lazos ni ms de una arista adyacente al
mismo par de vrtices se llaman grafos simples.

Los grafos (dirigidos o no) que no tienen lazos ni ms de una arista adyacente al
mismo par de vrtices se llaman grafos simples.
16.2.10 Grafos Etiquetados y Ponderados
Aunque ya hemos usado los grafos etiquetados, damos una definicin en esta seccin.
Un grafo G es un grafo etiquetado si sus aristas y/o vrtices tienen asignado alguna
identificacin. En particular, G es un grafo ponderado si a cada arista e de G se le asigna
un nmero no negativo w(e) denominado peso o longitud de l. El peso (o longitud de
un camino en un grafo ponderado G se define como la suma de los pesos de las aristas
del camino. Un importante problema en teora de grafos es encontrar el camino ms
corto (liviano), esto es, el camino con el peso (longitud) mnimo entre dos vrtices
dados.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 183

Ejemplo:

16.2.11 Tipos de Grafos


16.2.11.1 Grafo regular de grado n
Si todos sus vrtices tienen grado n.

Grafos regulares de grado 2.

Grafos regulares de grado 3.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 184

16.2.11.2 El grafo completo de orden n.


Que se denota por Kn, es el grafo que tiene n vrtices y cada vrtice est unido a
los dems por exactamente una arista. Un grafo completo de n vrtices tiene
(
)
exactamente aristas.

16.2.11.3 Grafo bipartido.


Es aquel con cuyos vrtices pueden formarse dos conjuntos disjuntos de modo
que no haya adyacencias entre vrtices pertenecientes al mismo conjunto es
decir un grafo G = (V,E) diremos que es un grafo bipartido si se puede dividir el
conjunto de vrtices en dos subconjuntos V = V1 U V2, tales que son disjuntos,
V1 V2 = conjunto vaco y cada arista de E une un vrtice de V1 y otro de V2.

16.2.11.4 Grafo nulo.


Se dice que un grafo es nulo cuando los vrtices que lo componen no estn
conectados, esto es, que son vrtices aislados.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 185

16.2.11.5 Grafos Isomorfos


Dos grafos son isomorfos cuando existe una correspondencia biunvoca (uno a
uno), entre sus vrtices de tal forma que dos de estos quedan unidos por una
arista en comn.

16.2.11.6 Grafo conexo.


Un grafo se puede definir como conexo si cualquier vrtice V pertenece al
conjunto de vrtices y es alcanzable por algn otro. Otra definicin que dejara
esto ms claro sera: un grafo conexo es un grafo no dirigido de modo que para
cualquier par de nodos existe al menos un camino que los une.

16.2.11.7 Grafo Disconexo.


Se puede definir como un grafo no dirigido de modo que no necesariamente un
vrtice debe estar conectado con otro vrtice por una arista.
Las partes disconexas de un grafo se llaman componentes.

16.2.11.8 Grafos Planos

Un grafo G=(V,A) es plano. Si G se puede dibujar un plano con sus aristas


intersecndose solo en los vrtices.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 186

Ejemplo:

G es Plano

16.2.11.9 Grafos Eulerianos

Un camino euleriano se define de la manera ms sencilla como un camino que contiene


todos los arcos del grafo, sea G=(V,E) un grafo no dirigido, un recorrido que recorra las
aristas de E se llama recorrido euleriano, Un circuito que contiene todas las aristas de
G recibe el nombre de circuito euleriano. Lo anterior quiere decir que un circuito
euleriano es una trayectoria que empieza y termina en el mismo vrtice, pasa por cada
vrtice al menos una vez y slo una vez por cada arista.
Existe un criterio preciso para saber cuando un grafo admite un circuito euleriano. Este
criterio lo proporciona el siguiente teorema.
Teorema. Sea G un grafo. G contiene un circuito euleriano s y slo s:

G es conexo.

Cada vrtice de G es de grado par.


Si G tiene un ciclo de euler, para todo vi, vj V existe una trayectoria que hace parte del
ciclo. Entonces G es conexo. Sea vi el vrtice donde comienza el circuito de euler. Para
cualquier otro vrtice vk de G, cada vez que el ciclo llegue all, partir de ese vrtice. As,
el circuito ha pasado por dos aristas nuevas con l o por un lazo de l. En cada caso se
aade 2 al grado de ese vrtice. Como este vrtice vk no es punto inicial se aade 2 cada
vez que el ciclo pasa por vk, de modo que el grado de vk es par. En el vrtice inicial vi, la
primera arista del ciclo debe ser distinta de la ltima, y de cualquier otra que pase por
vi, por tanto se tiene que el grado de vi tambin es par.
Ejemplos:

16.2.12 Algoritmos de grafos

a) Algoritmo de Prim
El algoritmo de Prim es un algoritmo de la teora de los grafos para encontrar un rbol
recubridor mnimo en un grafo conexo, no dirigido y cuyas aristas estn etiquetadas.
En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un
rbol con todos los vrtices, donde el peso total de todas las aristas en el rbol es el
mnimo posible. Si el grafo no es conexo, entonces el algoritmo encontrar el rbol
recubridor mnimo para uno de los componentes conexos que forman dicho grafo no
conexo.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 187

/*algoritmo de prim*/
#include<conio.h>
#include<stdio.h>
void prim(int[10][10]);
int n;
void main()
{
int i,j,A[10][10];
printf("\n ingrese la dimencion o cantidad de nodos de la matriz");
scanf("%d",&n);
printf("\n ingrese los elementos de la matriz");
printf("\n las aristas inexistentes se llena con 1000");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("\n posicion[%d][%d]",i,j);
scanf("%d",&A[i][j]);
}
}
prim(A);
getch();
}
void prim(int grafo[10][10])
{ int mas_proximo[10];
int distmin[10],t;
int i,j,k,min;
printf("\n Arbol de extension obtenido mediante el algoritmo de Prim:\n");
printf(" (Se indican las aristas y sus costos correspondientes)\n");
printf(" ----------------------------------------------------------\n\n");
t=0;
for(i=2;i<=n;i++){
mas_proximo[i]=1;
distmin[i]=grafo[i][1];
}
for(i=1;i<=n-1;i++)
{
min=1000;
for(j=2;j<=n;j++)
{
if((0<=distmin[j])&&(distmin[j]< min))
{
min=distmin[j];
k=j;
}
}
/*se imprime la arista seleccionada*/
printf("\t* Nodo %d - Nodo %d, costo %d\n", mas_proximo[k],k,grafo[k][
mas_proximo[k]]);
t=t+ grafo[k][ mas_proximo[k]];
distmin[k]=-1;
for(j=2;j<=n;j++)
if(grafo[j][k]<distmin[j]){
distmin[j]=grafo[j][k];
mas_proximo[j]=k;
}
}
printf("\n la suma de costos minimos es: %d ",t);
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 188

b) Algoritmo de Kruskal
El algoritmo de Kruskal es un algoritmo de la teora de grafos para encontrar un rbol
recubridor mnimo en un grafo conexo y ponderado. Es decir, busca un subconjunto de
aristas que, formando un rbol, incluyen todos los vrtices y donde el valor total de
todas las aristas del rbol es el mnimo. Si el grafo no es conexo, entonces busca un
bosque expandido mnimo (un rbol expandido mnimo para cada componente
conexa). El algoritmo de Kruskal es un ejemplo de algoritmo voraz.
// Codigo de A.E.M. (Kushkal)
#include<iostream.h>
#include<math.h>
#define MAX 10

void I_MAtriz(int [MAX][MAX],short);


void completar(int [MAX][MAX],short);
int krushkal(int [MAX][MAX],short);
int busca_menor(int [MAX][MAX],short,short *,short *);
short busca_padre(short [MAX],short);
void unir(short [MAX],short,short);
int infinito=0;
void main(){
int M_Costos[MAX][MAX],costo_total;
short a;
cout<<" Ingrese el numero de vertices que tiene el arbol "<<endl;
cin>>a;
I_MAtriz(M_Costos,a);
cout<<endl<<endl<<"Las aristas del A.E.M son "<<endl<<endl;
costo_total=krushkal(M_Costos,a);
cout<<endl<<endl<<"El costo del arbol de expansion minimo es "<<costo_total<<endl;
}
void I_MAtriz(int M_Costos[MAX][MAX],short a){
short num_vertices,vertice;
for(short m=0;m<=a-1;m++){
cout<<endl<<"# de vertices con los que esta conectado "<<m+1<<" ";
cin>>num_vertices;
for(short n=0;n<=num_vertices-1;n++){
cout<<m+1<<" -> "<<" ";
cin>>vertice;
cout<<"Costo S/. ";
cin>>M_Costos[m][vertice-1];
infinito+=abs(M_Costos[m][vertice-1]);
}
}
infinito=infinito*infinito;
completar(M_Costos,a);
}
void completar(int M_Costos[MAX][MAX],short a){
for(short m=0;m<=a-1;m++){
for(short n=0;n<=a-1;n++){
if(M_Costos[m][n]==-858993460)
M_Costos[m][n]=infinito;
}
}
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 189

int krushkal(int M_Costos[MAX][MAX],short a){


short aristas=1,vi,vf,conjunto_a,conjunto_b,conjunto[MAX];
int costo,costo_total=0;
for(short m=0;m<=a-1;m++){
// Cada vertice es un conjunto de si mismo
conjunto[m]=m;
}
while(aristas<=a-1){
costo=busca_menor(M_Costos,a,&vi,&vf);
conjunto_a=busca_padre(conjunto,vi);
conjunto_b=busca_padre(conjunto,vf);
if(conjunto_a!=conjunto_b){
unir(conjunto,conjunto_a,conjunto_b);
aristas++;
cout<<vi+1<<" -> "<<vf+1<<endl;
costo_total+=costo;
}
M_Costos[vi][vf]=infinito;
}
return (costo_total);
}
int busca_menor(int M_Costos[MAX][MAX],short a,short *vi,short *vf){
int menor=infinito;
for(short m=0;m<=a-1;m++){
for(short n=m;n<=a-1;n++){
if(menor>M_Costos[m][n]){
menor=M_Costos[m][n];
(*vi)=m;
(*vf)=n;
}
}
}
return (menor);
}
short busca_padre(short conjunto[MAX],short x){
short r;
r=x;
while(conjunto[r]!=r){
r=conjunto[r];
}
return (r);
}
void unir(short conjunto[MAX],short conjunto_a,short conjunto_b){
if(conjunto_a<conjunto_b)
conjunto[conjunto_b]=conjunto_a;
else
conjunto[conjunto_a]=conjunto_b;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

c)

Pg. 190

Algoritmo de Floy Warshall

El problema que intenta resolver este algoritmo es el de encontrar el camino ms corto


entre todos los pares de nodos o vrtices de un grafo. Esto es semejante a construir una
tabla con todas las distancias mnimas entre pares de ciudades de un mapa, indicando
adems la ruta a seguir para ir de la primera ciudad a la segunda. Este es uno de los
problemas ms interesan antes que se pueden resolver con algoritmos de grafos.
Algoritmo de floy Warshall en C++
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
main()
{ int war[99][99];
int i,k,n,j;
float dist;
cout<<"ingrese dimension del arreglo ";
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"["<<i<<"]["<<j<<"] :";
cin>>war[i][j];
}
for(k=0;k<=n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(war[i][j]>war[i][k]+war[k][j])
{
war[i][j]=war[i][k]+war[k][j];
}
}
cout<<endl;
cout<<" camino mas corto :";
cout<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"\t"<<war[i][j];
}
cout<<"\n";
}
getch();
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 191

//Algoritmo de grafos con operaciones bsicas

#include<iostream.h>
#include<conio.h>
#define m 10
int g[m][m];
void menu();
void iniciar(int,int,int);
void escribe(int);
void verticemenos(int);
void verticemas(int);
void aristamenos(int);
void aristamas(int);
void taristas(int);
void saristas(int,int);
void earistas(int,int);
int numvertice(int[m][m]);
int buscavertice(int,int);
void camino(int);
void menu(){
clrscr();
cout<<"1 = inicia grafo"<<endl;
cout<<"2 = agrega vertice"<<endl;
cout<<"3 = agrega arista"<<endl;
cout<<"4 = eliminar vertice"<<endl;
cout<<"5 = elimina arista"<<endl;
cout<<"6 = mostrar camino vertice"<<endl;
cout<<"7 = mostrar grafo"<<endl;
cout<<"8 = total de aristas"<<endl;
cout<<"9 = total de vertices"<<endl;
cout<<"10 = total de aristas de salida para un vertice"<<endl;
cout<<"11 = total de aristas de entrada para un vertice"<<endl;
cout<<"12 = salir"<<endl;
cout<<"Elija opcion :"<<endl;
}
void taristas(int grafo[m][m]){
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
int contador=0;
for(int i=1;i<=numvertice(g);i++){
for(int j=1;j<=numvertice(g);j++){
if(grafo[i-1][j]==1)
contador=contador+1;
}
}
cout<<"El numero total de aristas es : "<<contador;
}
}
void saristas(int grafo[m][m],int vertice){
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
int contador=0;
for(int i=1;i<=numvertice(g);i++){
if(grafo[vertice-1][i]==1)
contador=contador+1;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 192

cout<<"El numero de aristas que salen del vertice "<<vertice<<" son "<<contador;
}

}
void earistas(int grafo[m][m],int vertice){
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
int contador=0;
for(int i=1;i<=numvertice(g);i++){
if(grafo[i-1][vertice]==1)
contador=contador+1;
}
cout<<"El numero de aristas que entran en el vertice "<<vertice<<" son "<<contador;
}
}
int buscavertice(int vertice,int grafo[m][m]){
int i,existe,num;
i=0;
existe=0;
num=numvertice(g);
while(existe==0&&i<num){
if(grafo[i][0]==vertice)
existe=1;
else
i=i+1;
}
return existe;
}
int numvertice(int grafo[m][m]){
int contador;
contador=0;
while(grafo[contador][0]!=0){
contador=contador+1;
}
return contador;
}
void aristamas(int grafo[m][m]){
int origen,destino;
cout<<"ingrese vertice de origen :";cin>>origen;
cout<<"ingrese vertice de destino :";cin>>destino;
if(buscavertice(origen,g)==1){
if(buscavertice(destino,g)==1){
grafo[origen-1][destino]=1;
cout<<"arco agregado"<<endl;
}
else{cout<<"vertice de destino no existe"<<endl;}
}
else{cout<<"vertice de origen no existe"<<endl;}
}
void verticemas(int grafo [m][m]){
int i;
i=0;
while(grafo[i][0]!=0){
i=i+1;
}
grafo[i][0]=i+1;
cout<<"vertice agregado"<<endl;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 193

void escribe(int grafo[m][m]){


int i,j,contador;
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
contador=0;
while(grafo[contador][0]!=0){
contador=contador+1;}
for(i=0;i<contador;i=i+1){
cout<<"\t"<<i+1;}
cout<<"\n"<<endl;
for(i=0;i<contador;i=i+1){
cout<<i+1<<"\t";
for(j=1;j<contador+1;j++){
cout<<grafo[i][j]<<"\t";}
cout<<endl;
}
}
}
void iniciar(int n,int h,int grafo[m][m]) {
int i,j;
for(i=0;i<n;i++){
for(j=0;j<h;j++){
grafo[i][j]=0;
}
}
}
void aristamenos(int grafo[m][m]){
int origen,destino;
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
cout<<"ingrese vertice de origen : ";cin>>origen;
cout<<"ingrese vertice de destino : ";cin>>destino;
if(buscavertice(origen,g)==1){
if(buscavertice(destino,g)==1){
grafo[origen-1][destino]=0;
cout<<"arco eliminado"<<endl;
}
else{cout<<"vertice de destino no existe"<<endl;}
}
else{cout<<"vertice de origen no existe"<<endl;}
}
}
void verticemenos(int grafo[m][m]){
int j,contador,origen;
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
cout<<"ingrese vertice a eliminar : ";cin>>origen;
if(buscavertice(origen,g)==1){
contador=numvertice(g);
for(j=1;j<contador;j++){
grafo[origen-1][j]=0;
grafo[j-1][origen]=0;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 194

cout<<"vertice eliminado"; }
else{cout<<"vertice no existe";}
}
}
void camino(int grafo[m][m]){
int j,contador,origen,destino;
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
cout<<"ingrese vertice de origen : ";cin>>origen;
cout<<"ingrese vertice de destino : ";cin>>destino;
if(buscavertice(origen,g)==1){
if(buscavertice(destino,g)==1){
if(grafo[origen-1][destino]==1)
cout<<origen<<"->"<<destino;
else cout<<"no hay camino";
}
else{cout<<"vertice de destino no existe"<<endl;}
}
else{cout<<"vertice de origen no existe"<<endl;}
}
}
void main(){
int op;
op=-1;
while(op!=12){
menu();
cin>>op;
switch(op){
case 1:clrscr();
iniciar(10,10,g);
cout<<"grafo iniciado"<<endl;
getch();
break;
case 2:clrscr();
verticemas(g);
getch();
break;
case 3:clrscr();
aristamas(g);
getch();
break;
case 4:clrscr();
verticemenos(g);
getch();
break;
case 5:clrscr();
aristamenos(g);
getch();
break;
case 6:clrscr();
camino(g);
getch();
break;
case 7:clrscr();
escribe(g);
getch();
break;

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 195

case 8:clrscr();
taristas(g);
getch();
break;
case 9:clrscr();
cout<<"El numero de vertices del grafo son : "<<numvertice(g);
getch();
break;
case 10:clrscr();
int a;
cout<<"Ingrese el vertice :";cin>>a;
saristas(g,a);
getch();
break;
case 11:clrscr();
int b;
cout<<"Ingrese el vertice :";cin>>b;
earistas(g,b);
getch();
break;
case 12:clrscr();
cout<<"termino el programa"<<endl;
getch();
break;
}

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 196

BIBLIOGRAFA
BAASE, Sara y VAN GELDES, Allen (2002): Algoritmos computacionales:
Introduccin al Anlisis y Diseo, 3ra edic. Mxico.
FLORES RUEDA, Roberto (2005): Algoritmos, Estructura de Datos y
Programacin Orientado a Objetos, 1ra edicin, Ecoe ediciones, Bogot.
Hedetmienic, Goodman (1991): "Introduction to the Design and Analysis of
Algorithms", Editorial Mc Graw Hill, U.S.A.
James Martn & Carma Mc Clure (1992): "Diagraming Techniques for
Analysis and Programmers", Editorial Prentice Hall.
JOYANES AGUILAR, Lus (2003): Fundamentos de Programacin,
Algoritmos y Estructura de Datos, 3ra edicin, editorial Mcgrau-Hill,
Madrid.
JOYANES AGUILAR, Lus; ZAHONERO MARTINCA, Ignacio
Algoritmos y Estructura de Datos, Mcgrau-Hill, Madrid.

(2004):

LEVINE, Guillermo (1991): "Introduccin a la Computacin y la


Programacin Estructurada", Editorial Mc Graw Hill, Mxico.
MATSUKAWA MAEDA, Sergio (2004): Anlisis y Diseo Orientada a Objetos
con UML y Nacional Rose, editorial macro, Lima.
PRESSMAN Roger S. (2002): Ingeniera de Software, 5ta edicin, McGrawHill/INTERAMERICANA de Espaa, S.A.U. Madrid.
PAPPAS H. Chris; MURRIA H. William (1999): Microsoft Visual C++ 6.0,
Manual de Referencia, editorial McGraw-Hill, primera edicin, Mdrid.
PAUL TREMBLAY Jean, Richard B. Bunt (1990): "Introduccin a la Ciencia de
las Computadoras, Enfoque Algortmico", Editorial Mc Graw Hill, Mxico.
Wirth, Niklaus (1989): "Algoritmos y Estructura de Datos", Editorial Mc
Graw Hill, Mxico.
MATSUKAWA MAEDA, Sergio (2004): Anlisis y Diseo Orientada a Objetos
con UML y Nacional Rose, editorial macro, Lima.
FLORES RUEDA, Roberto (2005): Algoritmos, Estructura de Datos y
Programacin Orientado a Objetos, 1ra edicin, Ecoe ediciones, Bogot.
JOYANES AGUILAR, Lus (2003): Fundamentos de Programacin,
Algoritmos y Estructura de Datos, 3ra edicin, editorial Mcgrau-Hill,
Madrid.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.

Algortmica para Programacin

Pg. 197

BAASE, Sara y VAN GELDES, Allen (2002): Algoritmos computacionales:


Introduccin al Anlisis y Diseo, 3ra edic. Mxico.
JOYANES AGUILAR, Lus; ZAHONERO MARTINCA, Ignacio
Algoritmos y Estructura de Datos, Mcgrau-Hill, Madrid.

(2004):

PRESSMAN Roger S. (2002): Ingeniera de Software, 5ta edicin, McGrawHill/INTERAMERICANA de Espaa, S.A.U. Madrid.
Chris H. Pappas; William H. Murria (1999): Microsoft Visual C++ 6.0, Manual
de Referencia, editorial McGraw-Hill, primera edicin, Mdrid.
Wirth, Niklaus (1989): "Algoritmos y Estructura de Datos", Editorial Mc
Graw Hill, Mxico.
Jean Paul Tremblay, Richard B. Bunt (1990): "Introduccin a la Ciencia de
las Computadoras, Enfoque Algortmico", Editorial Mc Graw Hill, Mxico.
Luis Joyanes Aguilar (1994): "Fundamentos de Programacin, Algoritmos y
Estructura de Datos", Editorial Mc Graw Hilll, Mxico.
Guillermo Levine (1991): "Introduccin a la Computacin
Programacin Estructurada", Editorial Mc Graw Hill, Mxico.

la

Goodman, Hedetmienic (1991): "Introduction to the Design and Analysis of


Algorithms", Editorial Mc Graw Hill, U.S.A.
James Martn & Carma Mc Clure (1992): "Diagraming Techniques for
Analysis and Programmers", Editorial Prentice Hall.

Ingeniera Informtica y Sistemas UNAMBA

Ing. Francisco Cari I.