Disenio Algoritmos

425

description

libro de algoritmos completo

Transcript of Disenio Algoritmos

Page 1: Disenio Algoritmos
Page 2: Disenio Algoritmos

Diseño de Algoritmos

Anívar Chaves TorresEscuela de Ciencias Básicas,

Tecnología e IngenieríaUniversidad Nacional Abierta y a Distancia

UNAD

Page 3: Disenio Algoritmos

© Anívar Chaves Torres, 2012DERECHOS RESERVADOS

Se permite copiar y utilizar la información de este librocon fines académicos e investigativos siempre que sereconozca el crédito al autor.

Se prohíbe la reproducción total o parcialpor cualquier medio con fines comercialessin autorización escrita del autor.

Edición y diagramación: Anívar Chaves Torres

Diseño de portada: Anívar Chaves Torres

ISBN:

Impreso por ____________

CHAVES TORRES, Anívar Néstor. Diseño dealgoritmos. Ciudad: editorial, 2012.

ISBN:

Formato: 16,5 x 23 Páginas: 419

Datos de catalogación bibliográfica

Page 4: Disenio Algoritmos

A la sagrada familia,por su comprensión,

su apoyo ysu confianza.

Page 5: Disenio Algoritmos
Page 6: Disenio Algoritmos

Agradecimientos

A Jackeline Riascos, Mirian Benavides y Alejandra Zuleta, quienes,pese a sus múltiples ocupaciones, asumieron la tarea de leer elmanuscrito y con sus acertadas observaciones hicieron posiblecorregir muchos errores y mejorar el libro. De igual manera, a WilliamRecalde, quien como estudiante y cómo colega siempre ha estadodisponible para revisar mis escritos y ayudarme a mejorarlos.

Al ingeniero Gustavo Velásquez Quintana, decano de la Escuela deCiencias Básicas, Tecnología e Ingeniería de la Universidad NacionalAbierta y a Distancia - UNAD, por apoyar la publicación de estetrabajo.

Page 7: Disenio Algoritmos

7

Page 8: Disenio Algoritmos

CONTENIDO

1. INTRODUCCIÓN ............................................................................... 161.1 EL COMPUTADOR........................................................................... 171.1.1 Componente Físico ..............................................................191.1.2 Componente Lógico .............................................................241.2 CONSTRUCCION DE PROGRAMAS ................................................ 271.2.1 Análisis del Problema...........................................................281.2.2 Diseño de la Solución ..........................................................301.2.3 Codificación del Programa ...................................................311.2.4 Prueba y Depuración............................................................321.2.5 Documentación ...................................................................331.2.6 Mantenimiento ....................................................................34

2. ELEMENTOS DE PROGRAMACIÓN.................................................. 362.1 TIPOS DE DATOS ............................................................................ 362.1.1 Datos Numéricos .................................................................382.1.2 Datos Alfanuméricos............................................................392.1.3 Datos Lógicos o Booleanos ..................................................402.2 VARIABLES Y CONSTANTES........................................................... 402.2.1 Variables..............................................................................402.2.2 Tipos de Variables................................................................422.2.3 Declaración de Variables .....................................................462.2.4 Asignación de Valores ..........................................................472.2.5 Constantes ..........................................................................482.3 OPERADORES Y EXPRESIONES..................................................... 482.3.1 Operadores y Expresiones Aritméticos..................................492.3.2 Operadores y Expresiones Relacionales ...............................512.3.3 Operadores y Expresiones Lógicos .......................................532.3.4 Jerarquía general de los operadores ....................................54

Page 9: Disenio Algoritmos

9

3. ALGORITMOS....................................................................................563.1 CONCEPTO DE ALGORITMO ...........................................................563.2 CARACTERÍSTICAS DE UN ALGORITMO .........................................583.3 NOTACIONES PARA ALGORITMOS .................................................613.3.1 Descripción textual.............................................................. 613.3.2 Pseudocódigo...................................................................... 623.3.3 Diagrama de Flujo ............................................................... 643.3.4 Diagrama de Nassi-Shneiderman ........................................ 683.3.5 Notación Funcional.............................................................. 733.4 ESTRATEGIA PARA DISEÑAR ALGORITMOS ..................................743.5 VERIFICACIÓN DE ALGORITMOS....................................................79

4. ESTRUCTURAS DE PROGRAMACIÓN...............................................824.1 ESTRUCTURAS SECUENCIALES .....................................................824.1.1 Asignación........................................................................... 824.1.2 Entrada de Datos ................................................................ 834.1.3 Salida de Datos ................................................................... 844.1.4 Ejemplos con estructuras secuenciales ............................... 864.1.5 Ejercicios propuestos ........................................................ 1014.2 ESTRUCTURAS DE DECISIÓN...................................................... 1044.2.1 Condición .......................................................................... 1054.2.2 Tipos de decisiones ........................................................... 1064.2.3 Estructura SI ..................................................................... 1074.2.4 Estructura SEGÚN SEA ..................................................... 1154.2.5 Decisiones anidadas ......................................................... 1244.2.6 Más ejemplos de decisiones.............................................. 1344.2.7 Ejercicios propuestos ........................................................ 1664.3 ESTRUCTURAS DE ITERACIÓN .................................................... 1714.3.1 Control de iteraciones ....................................................... 1714.3.2 Estructura MIENTRAS ........................................................ 1724.3.3 Estructura HACER MIENTRAS ............................................ 1824.3.4 Estructura PARA ................................................................ 1914.3.5 Estructuras Iterativas anidadas ......................................... 1994.3.6 Más ejemplos de iteraciones ............................................. 2054.3.7 Ejercicios Propuestos ........................................................ 230

Page 10: Disenio Algoritmos

10

5. ARREGLOS.....................................................................................2345.1 CONCEPTO DE ARREGLO.............................................................2355.2 CLASES DE ARREGLOS................................................................2375.3 MANEJO DE VECTORES ...............................................................2385.3.1 Declaración .......................................................................2395.3.2 Acceso a elementos ...........................................................2405.3.3 Recorrido de un vector .......................................................2415.4 MANEJO DE MATRICES................................................................2475.4.1 Declaración .......................................................................2475.4.2 Acceso a elementos ...........................................................2485.4.3 Recorrido de una matriz.....................................................2495.5 MÁS EJEMPLOS CON ARREGLOS................................................2535.6. EJERCICIOS PROPUESTOS..................................................267

6. SUBPROGRAMAS ..........................................................................2706.1. FUNCIONES ..................................................................................2716.1.1. Diseño de una Función ......................................................2736.1.2. Invocación de una Función ................................................2776.1.3. Más ejemplos de funciones ...............................................2806.1.4 Ejercicios propuestos .........................................................2926.2. PROCEDIMIENTOS .......................................................................293

7. BÚSQUEDA Y ORDENAMIENTO.....................................................3007.1 ALGORITMOS DE BÚSQUEDA ......................................................3007.1.1. Búsqueda Lineal ................................................................3017.1.2. Ejemplos de búsqueda lineal .............................................3027.1.3. Búsqueda Binaria ..............................................................3057.1.4. Ejemplos de búsqueda binaria ...........................................3097.1.5. Ejercicios propuestos .........................................................3127.2 ALGORITMOS DE ORDENAMIENTO.............................................3147.2.1 Algoritmo de intercambio ...................................................3147.2.2 Algoritmo de Selección.......................................................3177.2.3 Algoritmo de la burbuja ......................................................3207.2.4 Algoritmo de Inserción .......................................................3227.2.5 Algoritmo de Donald Shell ..................................................326

Page 11: Disenio Algoritmos

11

7.2.6 Algoritmo de Ordenamiento Rápido ................................... 3317.2.7 Fusión de vectores ordenados ........................................... 3337.2.8 Otros algoritmos de Ordenamiento .................................... 3357.2.9 Un ejemplo completo......................................................... 3367.2.10 Ejercicios propuestos ........................................................ 351

8. RECURSIVIDAD.............................................................................. 3528.1 LA RECURSIVIDAD Y EL DISEÑO DE ALGORITMOS.................... 3538.2 ESTRUCTURA DE UNA FUNCIÓN RECURSIVA............................. 3558.3 EJECUCIÓN DE FUNCIONES RECURSIVAS.................................. 3578.4 ENVOLTURAS PARA FUNCIONES RECURSIVAS.......................... 3618.5 TIPOS DE RECURSIVIDAD............................................................ 3628.6 EFICIENCIA DE LA RECURSIVIDAD.............................................. 3638.7 EJEMPLOS DE SOLUCIONES RECURSIVAS................................. 3648.8 EJERCICIOS PROPUESTOS .......................................................... 375

9. EL CUBO DE RUBIK....................................................................... 3769.1 DESCRIPCIÓN DEL CUBO ............................................................ 3779.2 SOLUCION ALGORÍTMICA ............................................................ 3799.3.1 Consideraciones preliminares ........................................... 3799.3.2 Algoritmo principal para armar el cubo de Rubik................ 3819.3.3 Seleccionar y posicionar un centro de referencia ............... 3829.3.4 Armar el Módulo Superior .................................................. 3839.3.5 Armar el Módulo Central .................................................... 3909.3.6 Armar el Módulo Inferior .................................................... 394

REFERENCIAS...................................................................................... 406

LISTA DE FIGURAS............................................................................... 410LISTA DE CUADROS............................................................................. 416LISTA DE EJEMPLOS............................................................................ 422

Page 12: Disenio Algoritmos

12

PROLOGO

Este es un libro concebido y elaborado por un profesor deprogramación, quien a la vez se reconoce como un estudiantepermanente del tema; y por tanto, conoce muy bien las dificultadesque experimentan los estudiantes para aprender fundamentos deprogramación y diseño de algoritmos, de igual manera que lasnecesidades de los profesores de contar material de referencia queincluya conceptos, ejemplos y ejercicios.

Aunque los temas que se desarrollan son comunes en los libros defundamentos de programación, aquí se presentan con un enfoquedidáctico, con un lenguaje sencillo y con un nivel de detalle quecualquier persona lo pueda comprender, pues éste no pretende serúnicamente un documento de consulta, sino un material didácticopara el aprendizaje autónomo.

Como estrategia para facilitar el aprendizaje del diseño de algoritmosse propone proceder de forma inductiva, pues un algoritmo es unasolución general para problemas de un mismo tipo y sus pasos seidentifican en la medida que se soluciona varios casos particularesdel problema. En los ejemplos que se presenta en los capítulos seaplicará esta metodología, primero se propone valores hipotéticospara los datos del problema y se realizan los cálculos para llegar auna solución, luego se pasa a definir variables y establecerexpresiones que solucionen el problema para cualquier conjunto devalores.

El libro está organizado en nueve capítulos. El primero es unaintroducción al tema en el que se estudia las generalidades delcomputador, tanto en lo físico como en lo lógico, y también el proceso

Page 13: Disenio Algoritmos

13

de construcción de software. Éste tiene como propósito proporcionaral estudiante una perspectiva para el estudio de los siguientes sietecapítulos.

En el capítulo dos se desarrollan algunos conceptos fundamentalesen programación, como son: tipos de datos, variables y constantes,operadores y expresiones. Es necesario que el estudiante tengaclaridad sobre éstos conceptos antes de adentrarse en el diseño dealgoritmos, pues serán aplicados en cada uno de los temassiguientes.

El capítulo tres aborda directamente el tema de los algoritmos:conceptos, características, notaciones, estrategia para el diseño yverificación. Éste tiene como propósito ofrecer soporte conceptual,pues el estudiante y el docente deben estar de acuerdo sobre lo quees y lo que no es un algoritmo, sobre cómo debe representarse paraevitar ambigüedad en la solución de un problema y cómo verificar laeficacia de la misma.

En el cuarto se abordan los tres tipos de estructuras deprogramación: secuenciales, selectivas e iterativas. En este capítulocomienza realmente el diseño de algoritmo, pues los anterioresdesarrollan el marco de referencia para la comprensión y aplicaciónde las estructuras. Se muestra cómo llevar a cabo la lectura de datos,el procesamiento y la presentación de los resultados, así como latoma de decisiones y la ejecución repetida de ciertas operaciones oprocesos.

En el quinto se estudia uno de los temas más relevantes de laprogramación: el manejo y la organización de datos en memoriaprincipal a través de arreglos. Estas estructuras de almacenamientoson fáciles de utilizar y muy útiles para el diseño de algoritmos que seaplican sobre conjuntos de datos. En este capítulo se explicandetalladamente todas las operaciones que se llevan a cabo en eltrabajo con vectores, excepto la búsqueda y ordenación quedesarrollan en un capítulo aparte.

Page 14: Disenio Algoritmos

14

En el sexto se explica la estrategia dividir para vencer aplicada aldiseño de algoritmos. Ésta estrategia consiste en descomponer unproblema en subproblemas más fáciles de resolver, para los que sediseña funciones o procedimientos que se invocan desde unalgoritmo principal.

En el séptimo se estudia la búsqueda y el ordenamiento, temas devital importancia cuando se trabaja con grandes volúmenes de datos;se explican detalladamente algoritmos como: búsqueda lineal ybinaria, ordenamiento por intercambio, inserción, selección, burbujeoy partición.

En el octavo se trata la recursividad o recursión. Este tema se incluyeconsiderando que muchos problemas de programación son másfáciles de resolver utilizando recursividad y muchos de los algoritmosque los estudiantes deben aprender a utilizar son recursivos, como esel caso del algoritmo de ordenamiento rápido y los algoritmos paramanejo estructuras de datos dinámicas. Desde esta perspectiva esimportante que los estudiantes conozcan la recursividad desde losprimeros cursos.

En el último capítulo, el noveno, se presenta en forma algorítmica lasolución al cubo de Rubik o cubo mágico. Este juego se incluye conbase en dos hipótesis: primera, es muy difícil armar el cubo si no seconoce las secuencias de movimientos, pues cada vez que se intentaponer en orden una pieza se desordena alguna otra; segunda, es másfácil comprender y asimilar un tema o un concepto cuando seencuentra algo divertido en que aplicarlo. En el algoritmo para armarel cubo se ponen en práctica los temas presentados entre el segundoy octavo capítulo. Adicionalmente, mientras se intenta armar el cubose ejercitan dos cualidades indispensables para aprender cualquiermateria, en especial algoritmos, como son: voluntad y perseverancia.

Page 15: Disenio Algoritmos
Page 16: Disenio Algoritmos

16

1. INTRODUCCIÓN

“Sal de la infancia,amigo y despierta”.

Rousseau

Escribir un programa de computador es una actividad compleja queexige conocimientos, habilidades, creatividad y dominio de lastécnicas y herramientas de programación. Antes de escribir unprograma es necesario pensar detenidamente sobre la naturaleza ylas características del problema que se pretende resolver, encontrarla forma de realizar cada operación requerida para solucionar elproblema y organizar las actividades a realizar para obtener losresultados esperados. Sólo cuando se cuenta con el diseño de lasolución se hace uso de un computador y un lenguaje de progra-mación para escribir el código del programa.

Este libro está orientado a favorecer el aprendizaje de los conceptos yla técnica para analizar los problemas y diseñar soluciones comopaso previo a la escritura de programas. Aunque no se aborda laprogramación bajo ningún lenguaje, se presenta una descripcióngeneral de la arquitectura del computador y del proceso deconstrucción de programas con el fin de proporcionarle al lector unaperspectiva que facilite la comprensión de los temas desarrollados enlos capítulos siguientes.

Page 17: Disenio Algoritmos

17

1. Introducción

1.1 EL COMPUTADOR

El computador es una máquina electrónica diseñada para laadministración y procesamiento de datos, capaz de desarrollarcomplejas operaciones a gran velocidad, siguiendo un conjunto deinstrucciones previamente establecido.

Deitel y Deitel (2004: 4) lo definen como “dispositivo capaz derealizar cálculos y tomar decisiones lógicas a velocidades hasta milesde millones de veces más altas que las alcanzables por los sereshumanos” el cual procesa datos bajo el control de series deinstrucciones llamadas programas de computador.

Lopezcano (1998: 83) lo define como una “máquina capaz deseguir instrucciones para alterar información de una maneradeseable” y para realizar algunas tareas sin la intervención delusuario.

Con base en Martínez y Olvera (2000) se considera que uncomputador se caracteriza por cumplir las siguientes funciones: Realizar operaciones aritméticas y lógicas a gran velocidad y de

manera confiable. Efectuar comparaciones de datos y ejecutar diferentes acciones

dependiendo del resultado de la comparación, con gran rapidez. Almacenar en memoria tanto datos como instrucciones y procesar

los datos siguiendo las instrucciones Ejecutar secuencialmente un conjunto de instrucciones

almacenadas en memoria (programa) para llevar a cabo elprocesamiento de los datos.

Transferir los resultados de las operaciones a los dispositivos desalida como la pantalla y la impresora o hacia dispositivos dealmacenamiento secundario, para que el usuario puedautilizarlos.

Recibir programas y datos desde dispositivos periféricos como elteclado, el ratón o algunos sensores.

Page 18: Disenio Algoritmos

18

Diseño de algoritmos

Es una herramienta de propósito general que puede ser utilizadaen diferentes áreas, como: sistemas administrativos, control deprocesos, control de dispositivos específicos, diseño asistido porcomputador, simulación, cálculos científicos, comunicaciones ysistemas de seguridad (Martínez y Olvera, 2000). Es capaz demanejar datos de diferentes formatos, a saber: números, texto,imágenes, sonido y video.

Inicialmente los computadores se utilizaban en actividades querequerían cálculos complejos o manejo de grandes volúmenes deinformación, como oficinas gubernamentales y universidades. Con elcorrer de los años se generalizó su utilización en la medida en queaumentó el número de computadores fabricados y bajó su costo.Cada vez es mayor el uso de esta herramienta, por cuanto nadiedesea renunciar a sus beneficios en términos de comodidad, rapidezy precisión en la realización de cualquier tipo de tareas; además, cadavez hay en el mercado mayor número de accesorios tanto físicoscomo lógicos que se aplican a una gama más amplia de actividades.

Desde el enfoque de sistemas, el computador es más que unconjunto de dispositivos, pues, lo que hace de éste una herramientade gran utilidad es la relación y la interacción que se presenta entresus componentes, regulada por un conjunto de instrucciones y datosque constituyen sus directrices.

Visto de forma superficial, un sistema requiere una entrada omateria prima, sobre la cual ejecutar un proceso o transformación,para generar un producto diferente que constituye la salida. Elcomputador puede ser considerado sistema en cuanto que los datosingresados sufren algún tipo de transformación (procesamiento) paragenerar nuevos datos que ofrecen mejor utilidad al usuario, dondedicha utilidad constituye el objetivo del sistema.

A diferencia de cualquier otro tipo de sistema, el computadorcuenta con capacidad de almacenamiento, lo que le permite realizarmúltiples procesos sobre un mismo conjunto de datos y, también,ofrecer los resultados del proceso en una diversidad de formatos ytantas veces como sea necesario.

Page 19: Disenio Algoritmos

19

1. Introducción

El computador cuenta con dos tipos de componentes: unos de tipofísico como las tarjetas, los discos, los circuitos integrados; y otros detipo lógico: los programas y los datos (Figura 1). La parte física sedenomina hardware, mientras que la parte lógica se denominasoftware.

Figura 1. Composición del computador

1.1.1 Componente Físico

Este componente, comúnmente conocido por su nombre en inglés:hardware, está conformado por todos los dispositivos y accesoriostangibles que pueden ser apreciados a simple vista, como: tarjetas,circuitos integrados, unidad de disco, unidad de CD-ROM, pantalla,impresora, teclado, ratón y parlantes (Plasencia, 2008).

Computador

Componente FísicoHardware

Componente LógicoSoftware

Dispositivos de Entrada Unidad de Procesamiento Central Dispositivos de Salida Dispositivos de almacenamiento

secundario

Software del Sistema Programas de Aplicación Software de Desarrollo Archivos del usuario

Page 20: Disenio Algoritmos

20

Diseño de algoritmos

Los elementos del hardware se clasifican según la función quecumplen, esta puede ser: entrada de datos, procesamiento, salida oalmacenamiento (Figura 2).

Figura 2. Organización física del computador

Dispositivos de entrada. Los dispositivos de entrada reciben lasinstrucciones y datos ingresados por el usuario y los transmiten a lamemoria principal desde donde serán tomados por el procesador.

Los dispositivos de entrada más utilizados son: el teclado y elratón, seguidos por otros menos comunes como el escáner,micrófono, cámara, entre otros.

La información ingresada a través de estos medios es transfor-mada en señales eléctricas que se almacén en la memoria principal,donde permanece disponible para ser procesada o almacenada enmedios de almacenamiento permanente.

Unidad de Procesamiento Central. Comúnmente se la conocecomo CPU, sigla de su nombre en inglés (Central Processing Unit -unidad de procesamiento central). Esta es la parte más importante

Dispositivosde

entrada

Dispositivosde

salida

Memoria secundaria

Unidad Central deProcesamiento

Unidad de control

Memoria principal

Unidad aritmético-lógica

Page 21: Disenio Algoritmos

21

1. Introducción

del computador, por cuanto es la encargada de realizar los cálculos ycomparaciones. En palabras de Becerra (1998: 1), “el procesador esel que realiza la secuencia de operaciones especificadas por elprograma”.

Este componente efectúa la búsqueda de las instrucciones decontrol almacenadas en la memoria, las decodifica, interpreta yejecuta; manipula el almacenamiento provisional y la recuperación delos datos, al tiempo que regula el intercambio de información con elexterior a través de los puertos de entrada y salida. (Lopezcano,1998).

La unidad de procesamiento central cuenta con tres partesimportantes que son: unidad de control, unidad aritmético-lógica yregistros de memoria. Además de los registros (pequeños espacios dememoria) el procesador requiere interactuar constantemente con lamemoria principal.

La unidad de control se encarga de administrar todo el trabajorealizado por el procesador; en otras palabras, podría decirse quecontrola todo el funcionamiento del computador. Entre las funcionesde esta unidad se encuentran: Leer de la memoria las instrucciones del programa Interpretar cada instrucción leída Leer desde la memoria los datos referenciados por cada

instrucción Ejecutar cada instrucción Almacenar el resultado de cada instrucción

La unidad aritmético-lógica realiza una serie de operacionesaritméticas y lógicas sobre uno o dos operandos. Los datos, sobre losque opera esta unidad, están almacenados en un conjunto deregistros o bien provienen directamente de la memoria principal. Losresultados de cada operación también se almacenan en registros oen memoria principal (Carretero et al, 2001).

Page 22: Disenio Algoritmos

22

Diseño de algoritmos

Los registros son pequeños espacios de memoria para almacenarlos datos que están siendo procesados. La característica principal delos registros es la velocidad con que puede acceder el procesador.

Las operaciones realizadas por la ALU y los datos sobre los cualesactúan son supervisados por la unidad de control.

Memoria principal. Físicamente, es un conjunto de circuitosintegrados pegados a una pequeña tarjeta que se coloca en la ranurade la tarjeta principal del computador. Funcionalmente, la memoriaes el espacio donde el procesador guarda las instrucciones delprograma a ejecutar y los datos que serán procesados.

La memoria cumple un papel muy importante junto al procesador,ya que permite minimizar el tiempo requerido para cualquier tarea;por lo tanto, entre más memoria tenga el equipo mejor será surendimiento.

Cuando se utiliza el término memoria se hace referencia a lamemoria RAM o memoria de acceso aleatorio; sin embargo, existenotros tipos de memoria, como la memoria caché y la memoria virtual,entre otras clasificaciones.

RAM significa memoria de acceso aleatorio, del inglés RandomAccess Memory. Esta memoria tiene como ventaja la velocidad deacceso y como desventaja que los datos se guardan sólo tempo-ralmente; en el momento en que, por alguna razón, se corte laalimentación eléctrica, los datos de la memoria desaparecerán. Porla velocidad de acceso, que es mucho más alta que la velocidad deacceso a disco, entre más datos y programas se puedan cargar en lamemoria mucho más rápido será el funcionamiento del computador.

Los diferentes componentes de la unidad computacional secomunican mediante bits. Un bit es un dígito del sistema binario quepuede tomar uno de dos valores: 0 o 1. Los bits constituyen la mínimaunidad de información para el computador; sin embargo, el términomás común para referirse a la capacidad de memoria de un equipo esel Byte que es la reunión de 8 bits y permite representar hasta 256

Page 23: Disenio Algoritmos

23

1. Introducción

caracteres, ya sean letras, dígitos, símbolos o los códigos conocidoscomo caracteres no imprimibles, cualquier caracter del el sistemaASCII (American Standard Code for Information Interchange - códigoestándar americano para intercambio de información).

Dado que un byte (un caracter) es una unidad muy pequeña paraexpresar la cantidad de información que se maneja en uncomputador o en cualquiera de sus dispositivos de almacenamiento,se utilizan múltiplos del mismo, como se aprecia en el cuadro 1.

Cuadro 1. Magnitudes de almacenamiento

Unidad Nombre corto Capacidadalmacenamiento

Bit B 0 o 1Byte B 8 bitsKilobyte Kb 1024 BytesMegabyte Mb 1024 KbGigabyte Gb 1024 MbTerabyte Tb 1024 Gb

Dispositivos de almacenamiento o memoria secundaria.También se la conoce como memoria auxiliar. Ésta es la encargadade brindar seguridad a la información almacenada, por cuanto guardalos datos de manera permanente e independiente de que elcomputador esté en funcionamiento, a diferencia de la memoriainterna que sólo mantiene la información mientras el equipo estéencendido. Los dispositivos de almacenamiento secundario sondiscos, discos compactos (CD), discos de video digital (DVD) y chipsde memoria.

Dispositivos de salida. Permiten presentar los resultados delprocesamiento de datos. Son el medio por el cual el computadorpresenta información al usuario. Los más comunes son la pantalla, laimpresora y los parlantes.

Page 24: Disenio Algoritmos

24

Diseño de algoritmos

Pantalla o monitor: exhibe las imágenes que elabora de acuerdocon el programa o proceso que se esté ejecutando. Pueden servideos, gráficos, fotografías o texto. Es la salida por defecto, dondese presentan los mensajes generados por el computador, como:solicitud de datos, resultados de procesos y mensajes de error.

Impresora: este dispositivo fija sobre el papel la información quese le envía desde un programa. La impresión puede ser en negro o encolores según el tipo de impresora que se tenga.

Parlantes: estos dispositivos se encargan de amplificar la señal deaudio generada por el computador. Actualmente son de uso comúndebido a la capacidad de procesamiento multimedia de los equiposde cómputo.

1.1.2 Componente Lógico

Este componente, también conocido comúnmente como software,está conformado por toda la información, ya sean instrucciones odatos, que hace que el computador funcione. Sin el concurso delsoftware el hardware no realiza ninguna función.

El software está clasificado en cuatro grupos, según la tarea querealiza: software del sistema, programas de aplicación, software dedesarrollo y archivos de usuario, como se muestra en la figura 3.

Software del Sistema. También conocido como sistema operativo,es un conjunto de programas indispensables para que el computadorfuncione. Estos se encargan de administrar todos los recursos de launidad computacional y facilitan la comunicación con el usuario.

Carretero et al (2001) sugieren que se imagine el computadordesnudo e incapaz de llevar a cabo tarea alguna. Aunque elcomputador esté equipado con el mejor hardware disponible, sinocuenta con las instrucciones de un programa en la memoria, que leindiquen qué hacer, no hace nada.

Page 25: Disenio Algoritmos

25

1. Introducción

Figura 3. Clasificación del software

El objetivo del sistema operativo es simplificar el uso delcomputador y la administración de sus recursos, tanto físicos comológicos, de forma segura y eficiente. Entre sus funciones se destacantres:

Gestión de los recursos de la unidad computacional Ejecutar servicios solicitados por los programas Ejecutar los comandos invocados por el usuario

Para cumplir estas funciones, el sistema operativo cuenta conprogramas especializados para diversas tareas, como son: la puesta

Software

Software delSistema

Programas deAplicación

Software deDesarrollo

Archivos deUsuario

Windows Linux Solaris Otros

Procesador de texto Hoja de Cálculo Gestor Base de Datos Graficadores Otros

Compilador Intérprete Entornos de Desarrollo APIs

Documentos Imágenes Videos Otros

Page 26: Disenio Algoritmos

26

Diseño de algoritmos

en marcha del equipo, la interpretación de comandos, el manejo deentrada y salida de información a través de los periféricos, acceso adiscos, procesamiento de interrupciones, administración de memoriay procesador.

Algunos sistemas operativos conocidos son: Windows, con susdiferentes versiones; Linux, y sus muchas distribuciones; Netware;Unix, Solaris, entre otros.

Programas de aplicación. Conjunto de programas diferentes alsoftware del sistema. Estos se encargan de manipular la informaciónque el usuario necesita procesar; desarrollan una tarea específica ysu finalidad es permitirle al interesado realizar su trabajo confacilidad, rapidez, agilidad y precisión. En esta categoría se tienevarios grupos, como son: procesadores de texto, hoja de cálculo,graficadores, bases de datos, agendas, programas de contabilidad,aplicaciones matemáticas, editores y reproductores de audio, editoresy reproductores de video, entre otros. Algunos ejemplos son: Word,Excel, Access, Corel Draw, programas para estadística como SPSS ycontabilidad como GC 1.

Software de desarrollo. Esta categoría está conformada por elextenso conjunto de herramientas para la construcción de software,entre ellos se destacan los compiladores, los intérpretes, los entornosintegrados de desarrollo, los marcos de trabajo y las Interfaces paraprogramación de aplicaciones (API).

La mayoría de estas herramientas están diseñadas para trabajarcon un determinado lenguaje de programación; no obstante, existenalgunas aplicaciones que permiten utilizar código de más de unlenguaje, ejemplo de ellos son: la plataforma Java, con su paquete JNIy la plataforma .Net.

Archivos del usuario. Esta categoría está conformada por todoslos archivos que el usuario crea utilizando los programas deaplicación; por lo general, no son programas que se puedan ejecutar,sino archivos que contienen los datos introducidos o los resultadosdel procesamiento de éstos. Ejemplos de archivos de usuario son las

Page 27: Disenio Algoritmos

27

1. Introducción

imágenes como fotografías o dibujos, textos como cartas o trabajos,archivos de base de datos, archivos de hoja de cálculo como unanómina o un inventario.

1.2 CONSTRUCCION DE PROGRAMAS

Hace algunas décadas se consideraba que el proceso de prepararprogramas para computadores era especialmente atractivo porqueera gratificante no solo desde lo económico y lo científico, sinotambién, una experiencia estética como la composición de poesía omúsica (Knuth, 1969). La programación era considerada un arte,llevarla a cabo era cuestión de talento más que de conocimiento. Hoyen día se cuenta con metodologías y técnicas para hacerlo, demanera que cualquiera persona puede aprender a programar, si se lopropone.

Aunque el tema central de este libro es el diseño de algoritmos yno la programación, se considera importante que el lector tenga unconocimiento general sobre todo el proceso de construcción de unprograma, de manera que pueda comprender el papel que juega elalgoritmo en la metodología de la programación. En especial, porquelos programas se construyen para solucionar un problema y losalgoritmos especifican la solución.

En este sentido, cabe anotar que, construir un programa es unatarea compleja que exige no solo conocimiento, sino tambiéncreatividad y el ejercicio de ciertas habilidades por parte deldesarrollador. Los programas pueden ser tan grandes y complejoscomo el problema que pretenden solucionar y aunque puede habercierta similitud entre ellos, así como cada problema tienen susparticularidades, los programas tienen las suyas.

A propósito de la solución de problemas Galve et al (1993)mencionan que no existe un método universal que permita resolvercualquier problema, ya que se trata de un proceso creativo donde elconocimiento, la habilidad y la experiencia tienen un papel

Page 28: Disenio Algoritmos

28

Diseño de algoritmos

importante, cuando se trata de problemas complejos lo importante esproceder de manera sistemática.

La disciplina que se ocupa de estudiar todos los aspectosrelacionados con la producción de software, desde la identificación derequisitos hasta su mantenimiento después de la utilización, es laIngeniería del Software (Sommerville, 2005). Desde esta disciplina sehan propuesto diversas metodologías para la construcción desoftware, algunas de ellas son: proceso unificado, Programaciónextrema, Desarrollo rápido de aplicaciones, Desarrollo en espiral.

Cada una propone diferentes momentos y actividades para laconstrucción del software, no obstante hay algunas fases que soncomunes a todas, aunque se les dé diferentes nombres. Pormencionar solo tres ejemplos, Joyanes (2000) propone ocho fases:análisis del problema, diseño del algoritmo, codificación, compilacióny ejecución, prueba, depuración, mantenimiento y documentación;Bruegge y Dutoit (2002), por su parte, plantean: identificación derequisitos, elaboración de un modelo de análisis, diseño general,diseño detallado, implementación y prueba; y Sommerville (2005) lasresume en cuatro: especificación, desarrollo, validación y evolucióndel software.

Considerando las propuestas anteriores, se organiza el proceso deconstrucción de programas en seis actividades, como se detallan acontinuación.

1.2.1 Análisis del problema

Dado que los problemas no siempre tienen una especificaciónsimple y sencilla, la mitad del trabajo es saber qué problema se va aresolver (Aho et al, 1988).

El primer paso es asegurarse de que se entiende el problema quese pretende solucionar y la magnitud del mismo. Muchas veces, elenunciado del ejercicio o la descripción de necesidades expuesta porun cliente no son lo suficientemente claros como para determinar los

Page 29: Disenio Algoritmos

29

1. Introducción

requerimientos que debe cumplir el programa; por ello, el progra-mador debe detenerse y preguntarse si comprende bien el problemaque debe solucionar.

En el mundo real los problemas no están aislados, sinointerrelacionados; por ello, para intentar solucionar uno en particulares necesario plantearlo con claridad y precisión, estableciendo losalcances y las restricciones. Es importante que se conozca lo que sedesea que realice el programa de computador; es decir, identificar elproblema y el propósito de la solución.

Al respecto, Joyanes (1996) menciona que la finalidad del análisises que el programador comprenda el problema que intenta solucionary pueda especificar con detalle las entradas y las salidas que tendráel programa, para ello recomienda formularse dos preguntas:

¿Qué información debe proporcionar el programa?¿Qué información se necesita para solucionar el problema?

Establecer cada una de las funciones que el programa deberealizar y las características que debe tener se conoce comoidentificación de requisitos o requerimientos. Estos son como lascláusulas de un contrato, definen con cierta precisión el qué hacer,aunque no el cómo. En programas de alta complejidad el listado derequisitos puede ser muy extenso, en pequeños programas, como losque se realizan en los primeros cursos de programación suelenlimitarse a unos cuántos; no obstante, establecer los requisitos esuna tarea fundamental del análisis.

Una vez identificados los requisitos, ya sea a través de un procesoinvestigativo o mediante la interpretación del enunciado delproblema, Bruegge y Dutoit (2002) recomiendan elaborar un modelode análisis; esto es, elaborar un documento en el que se consignetoda la información obtenida y generada hasta el momento,preferiblemente utilizando modelos y lenguaje propios del ámbito dela programación. En pequeños ejercicios de programación bastarácon especificar la información de entrada, las fórmulas de loscálculos a realizar y la información de salida.

Page 30: Disenio Algoritmos

30

Diseño de algoritmos

En resumen, el análisis del problema, como mínimo, debeidentificar la información relevante relacionada con el problema, lasoperaciones que deben realizar sobre dicha información y la nuevainformación que se debe producir; es decir, saber sobre qué datosopera el programa, qué operaciones, cálculos o transformaciones hade realizar y qué resultados se espera obtener.

1.2.2 Diseño de la solución

Una vez que se ha analizado y comprendido el problema ya sepuede pensar en la solución. El diseño consiste en aplicar elconocimiento disponible para responder a la pregunta: ¿cómosolucionar el problema?

Diseñar una solución equivale a generar, organizar y representarlas ideas sobre la solución del problema. Para ello se cuenta contécnicas y herramientas de diseño propias de cada modelo deprogramación, que permiten registrar y comunicar las operaciones yprocesos a desarrollar. Bajo el modelo de programación proceduralse utiliza, como diseño de solución, los algoritmos; en el modelofuncional, las funciones y en el modelo orientado a objetos, losmodelos conceptuales o diagramas.

Las ideas acerca de la solución de un problema, es decir el diseñode la solución, deben representarse utilizando un lenguaje conocidopor la comunidad de programadores, de manera que el diseño seacomunicable. En los grandes proyectos de desarrollo de software, laspersonas que diseñan no son las mismas que escriben el código delprograma; por ello, es necesario que la solución en la fase de diseñose documente de tal manera que otras personas puedan compren-derla completamente para llevar a cabo las fases siguientes.

En términos generales, en la fase de diseño se debe pensar encuatro aspectos de la solución:

La interacción con el usuario: o diseño de la interfaz de usuario;esto es, pensar en cómo se hará el intercambio de datos entre elprograma y la persona que lo utiliza, cómo se capturará los datos que

Page 31: Disenio Algoritmos

31

1. Introducción

el programa requiere, cómo se presentará los resultados al usuario,cómo el usuario le indicará al programa lo que desea hacer.

El procesamiento de los datos: esto es conocer las operacionesque se realizan sobre los datos según el dominio del problema. Porejemplo, si se trata de un programa para calcular la nómina de unaempresa, se debe conocer los procesos que se llevan a cabo paraobtener dicha nómina. Conviene tener presente que no se puedeprogramar un proceso que se desconoce, primero es necesario que elprogramador conozca muy bien los cálculos que se desarrollan paraobtener los resultados deseados; el computador automatizará elproceso, pero el programador debe especificar cómo realizarlo.

La arquitectura del sistema: para solucionar un problema con másfacilidad es necesario descomponerlo en subproblemas de maneraque cada uno sea más sencillo de resolver (este tema se desarrollaen el capítulo 6), pero todos las partes deben integrarse para ofrecerla solución al problema completo. La forma como se organizan einteractúan las partes de la solución se conoce como arquitectura delsistema. En la fase de diseño se lleva a cabo la descomposición delsistema en diferentes módulos o subsistemas y al mismo tiempo eldiseño de la arquitectura que muestra cómo se relacionan losmismos.

La persistencia de datos: todos los programas actúan sobre datosy éstos deben guardarse de forma organizada de manera que elprograma pueda almacenarlos y recuperarlos de forma segura. En lafase de diseño se debe decidir cómo se almacenarán los datos en losmedios de almacenamiento secundario.

1.2.3 Codificación del programa

Es la traducción de la solución del problema expresada enmodelos de diseño, a una serie de instrucciones detalladas en unlenguaje reconocido por el computador, al que se conoce comolenguaje de programación. La serie de instrucciones detalladas sedenomina código fuente y debe ser compilada para convertirse en unprograma ejecutable.

Page 32: Disenio Algoritmos

32

Diseño de algoritmos

A diferencia del diseño, la codificación puede ser un trabajosencillo, siempre que se cuente con el diseño detallado y se conozcalas palabras reservadas del lenguaje, con su sintaxis y su semántica.

Es preciso anotar que las etapas en las que se debe concentrar elmayor esfuerzo e interés por desarrollar la destrezas necesarias son:el análisis y el diseño, pues, sin pretender restar importancia alconocimiento del lenguaje, en la etapa de codificación puede ayudarun buen libro de referencia, mientras que no existe un libro que leayude a analizar el problema y diseñar la solución.

La etapa de codificación incluye la revisión de los resultadosgenerados por el código fuente, línea a línea, y esto no debeconfundirse con la prueba del programa que se trata en la secciónsiguiente.

1.2.4 Prueba y depuración

En el momento de codificar un programa se desarrollan pruebasparciales que permiten verificar que las instrucciones están escritascorrectamente y que realizan la función que se espera de ellas; sinembargo, el hecho de que un programa funcione o se ejecute nosignifica que satisfaga plenamente la necesidad para la cual sedesarrolló.

Los errores humanos dentro de la programación de computadoresson muchos y aumentan considerablemente con la complejidad delproblema. El proceso de identificar y eliminar errores, para dar paso auna solución eficaz se llama depuración.

La depuración o prueba resulta una tarea tan importante como elmismo desarrollo de la solución, por ello se debe considerar con elmismo interés y entusiasmo. La prueba debe realizarse considerandotodas las posibilidades de error que se pueden presentar en laejecución y utilización del programa.

La prueba tiene como fin identificar las debilidades del programaantes de que sea puesto en marcha, para corregir los errores, sin que

Page 33: Disenio Algoritmos

33

1. Introducción

esto implique pérdida de información, tiempo y dinero. Una pruebaexitosa es aquella que detecta errores, pues todos los programas lostienen; de manera que las pruebas se diseñan pensando en depurarel programa, no en confirmar que está bien construido.

1.2.5 Documentación

A menudo un programa escrito por una persona, es usado por otra.Por ello la documentación sirve para ayudar a comprender o usar elprograma o para facilitar futuras modificaciones (mantenimiento).

La documentación de un programa es la guía o comunicaciónescrita en sus variadas formas, ya sea en enunciados, dibujos,diagramas o procedimientos.

Existen tres clases de documentación:

Documentación InternaDocumentación técnicaManual del Usuario

Documentación Interna: son los comentarios o mensajes que seañaden al código fuente para hacerlo más claro y entendible.

En un programa extenso, el mismo programador necesitará de loscomentarios en el código para ubicarse y hacer las correcciones ocambios que sean necesarios después de un tiempo. Mucha másimportancia tiene esta documentación, si los cambios seránefectuados por personal diferente a quien escribió el código fuenteoriginal.

Documentación técnica: es un documento en el que se consignainformación relevante respecto al problema planteado y la formacómo se implementó la solución, algunos datos que se deben incluirson:

Descripción del ProblemaModelos de Análisis

Page 34: Disenio Algoritmos

34

Diseño de algoritmos

Diseño de la soluciónDiccionario de DatosCódigo fuente (programa)Pruebas realizadas

Esta documentación está dirigida a personal con conocimientos deprogramación; por ende, contiene información técnica sobre elprograma y no debe confundirse con el manual del usuario.

La construcción de programas grandes y complejos requiere quese elabore la documentación en la medida en que se avanza en elanálisis, diseño y codificación del software, esto debido a dos razo-nes: en primer lugar, a que la construcción de grandes programasrequiere el trabajo de varias personas y por ello se debe mantenertodas las especificaciones por escrito; en segundo, porque no esposible mantener toda la información del proyecto en la memoria delos responsables, es necesario darle soporte físico.

Manual del Usuario: es un documento destinado al usuario final enel que se describe paso a paso el funcionamiento del programa.Debe incluir información detallada sobre el proceso de instalación,introducción de datos, procesamiento y obtención de resultados,recomendaciones e información sobre posibles errores.

1.2.6 Mantenimiento

Son los cambios que se le deben hacer al programa después dehaberse puesto en funcionamiento. Estos cambios pueden tenercomo fin incluir nuevos procesos o adaptarlo a circunstancias quehan cambiado después de que fue desarrollado.

El mantenimiento será más fácil de llevar a cabo si se cuenta conla documentación adecuada del programa.

Las fases que aquí se presentan no necesariamente sedesarrollan en el orden en que se describen, pues muchos modelosde desarrollo son iterativos; no obstante, siempre estarán presentes.

Page 35: Disenio Algoritmos
Page 36: Disenio Algoritmos

36

2. ELEMENTOS DE PROGRAMACIÓN

La Programaciónes el arte y la técnica

de construir y formular algoritmosde una forma sistemática.

Wirth

Los algoritmos y los programas están conformados por series deoperaciones que se desarrollan con datos. A su vez los datos seagrupan en categorías según los valores que pueden contener y lasoperaciones que se puede realizar sobre ellos. Las operaciones seespecifican mediante expresiones conformadas por operadores yvariables, éstas últimas hacen referencia a los datos con los que serealiza la operación.

Este capítulo está dedicado al estudio de aquellos elementos quesiendo básicos son insustituibles en el diseño de algoritmos y laimplementación de programas.

2.1 TIPOS DE DATOS

Los tipos de datos son clasificaciones para organizar lainformación que se almacena en la memoria del computador. Estasabstracciones permiten definir valores mínimos y máximos paracada tipo, de modo que se puede establecer el espacio que cadauno de ellos requiere y de esta manera facilitar la administración dela memoria.

Page 37: Disenio Algoritmos

37

2. Elementos programación

Los tipos de datos se utilizan en la declaración de las variables yen la validación de las operaciones permitidas sobre cada tipo. Porejemplo, los datos numéricos admiten operaciones aritméticas,mientras que las cadenas pueden ser concatenadas.

Los lenguajes de programación que manejan tipos de datoscuentan con la definición de tres elementos: los tipos primitivos osimples (números, caracteres y booleanos), el conjunto de valoresque pueden manejar y las operaciones permitidas. A partir de losdatos primitivos se pueden implementar tipos compuestos, comocadenas, vectores y listas (Appleby y Vandekppple, 1998).

Entre los datos primitivos se cuenta con tres tipos: numéricos,alfanuméricos y lógicos o booleanos. A su vez, los datos numéricospueden ser enteros o reales, mientras que los alfanuméricospueden ser caracteres o cadenas, como se muestra en la figura 4.

Figura 4. Tipos de datos

Numéricos

Tiposde

datosAlfanuméricos

Lógicos

Enteros

Reales

Caracteres

Cadenas

Verdadero

Falso

Page 38: Disenio Algoritmos

Diseño de algoritmos

38

2.1.1 Datos numéricos

Los datos de tipo numérico son aquellos que representancantidades o información cuantificable, como: el número deestudiantes de un curso, el sueldo de un empleado, la edad de unapersona, el valor de un electrodoméstico, la extensión en kilómetroscuadrados que tiene un país o la nota de un estudiante.

Datos de tipo número entero. Son datos que se expresanmediante un número exacto; es decir, sin componente fraccionarioy pueden ser positivos o negativos. Este tipo se utiliza pararepresentar elementos que no pueden encontrarse de formafraccionada en el dominio del problema, por ejemplo:

Dato ValorLa cantidad de empleados de una empresa 150Las asignaturas que cursa un estudiante 5El número de goles anotados en un partido de fútbol 3La cantidad de votos que obtiene un candidato 5678

Es importante anotar que el rango de valores enteros compren-dido entre el infinito negativo y el infinito positivo no puede sermanejado en los lenguajes de programación, por razones de alma-cenamiento, los valores mínimos y máximos a manejar varíandependiendo del lenguaje.

Algunos lenguajes de programación reservan dos bytes para losdatos de tipo entero, por lo tanto, el rango de valores admitidos estáentre -32.768 y 32.767.

Datos de tipo número real. Son datos que se expresan medianteun número que incluye una fracción y pueden ser positivos onegativos. Este tipo de datos se utiliza para representar elementosque en el dominio del problema tienen valores formados por unaparte entera y una parte decimal, por ejemplo:

Page 39: Disenio Algoritmos

39

2. Elementos programación

Dato ValorLa estatura de una persona (expresada en metros) 1.7La temperatura ambiente (en grados centígrados) 18.5La nota de un estudiante (con base 5.0) 3.5La tasa de interés mensual 2.6

Los lenguajes de programación reservan un número fijo de bytespara los datos de tipo real, por ello el tamaño de estos númerostambién es limitado.

2.1.2 Datos alfanuméricos

Se entiende como datos alfanuméricos aquellos que norepresentan una cantidad o valor numérico y por ende no se utilizanpara cuantificar, sino para describir o cualificar un elemento al quehacen referencia. Por ejemplo, el color de una fruta, la dirección deuna casa, el nombre de una persona, el cargo de un empleado, elgénero.

Los datos alfanuméricos pueden estar formados por caracteresdel alfabeto, por números y por otros símbolos; sin embargo,aunque incluyan dígitos no pueden ser operados matemáticamente.

Caracteres. Los caracteres son cada uno de los símbolos incluidosen un sistema de codificación, pueden ser dígitos, letras delalfabeto y símbolos. El sistema más conocido actualmente es ASCII(American Standard Code for Information Interchange). Esterequiere un byte de memoria para almacenar cada carácter eincluye un total de 256 caracteres. Son ejemplos de caracteres: 1,a, %, +, B, 3.

Cadenas. Son conjuntos de caracteres encerrados entre comillas (““) que son manipulados como un solo dato, por ejemplo:

El nombre de una persona: “José”La ubicación de una universidad: “Calle 19 con 22”El título de un libro: “Diseño de algoritmos”

Page 40: Disenio Algoritmos

Diseño de algoritmos

40

2.1.3 Datos lógicos o booleanos

Los datos de este tipo solo pueden tomar dos valores: verdaderoo falso. En programación se utilizan sobremanera para hacerreferencia al cumplimiento de determinadas condiciones, porejemplo: la existencia de un archivo, la validez de un dato, larelación existente entre dos datos.

2.2 VARIABLES Y CONSTANTES

Todos los programas de computador, indiferente de la funciónque cumplan, operan sobre un conjunto de datos. Durante laejecución de un programa los datos que éste utiliza o generareposan en la memoria. La información sobre el lugar dealmacenamiento de un dato, el tipo y el valor se maneja medianteel concepto de variable. Si el valor se mantiene inalterable durantetoda la ejecución del programa se le da el nombre de constante.

2.2.1 Variables

Para manipular un dato en un programa de computador esnecesario identificarlo con un nombre y conocer: la posición dememoria donde se encuentra, el tipo al que pertenece y el valor.Para hacer más sencillo el manejo de esta información se cuentacon una abstracción a la que se denomina variable.

En términos de Appleby y Vandekppple (1998) una variable estáasociada a una tupla conformada por los atributos:

Identificador (nombre de la variable)Dirección (posición de memoria donde se almacena el dato)Tipo de dato (especifica: conjunto de valores y operaciones)Valor (dato almacenado en memoria)

Page 41: Disenio Algoritmos

41

2. Elementos programación

Identificador. Un identificador es una palabra o secuencia decaracteres que hace referencia a una posición de memoria en laque se almacena un dato.

La longitud de un identificador y la forma de construirse puedevariar de un lenguaje de programación a otro; no obstante, hayalgunas recomendaciones que se deben tener presente:

Debe comenzar por una letra comprendida entre A y Z(mayúscula o minúscula)

No debe contener espacios en blanco Debe tener relación con el dato que se almacenará en la

posición de memoria (nemotécnico) No debe contener caracteres especiales y operadores Después de la primera letra se puede utilizar dígitos y el

caracter de subrayado ( _ ).

Ejemplo, para almacenar el nombre de una persona, el identifi-cador puede ser:

NombreNbreNom

Es frecuente que el identificador represente más de una palabra,ya que se pueden tener datos similares pero que corresponden adiferentes elementos de información, por ejemplo:

Nombre de estudianteNombre de profesorCódigo estudianteCódigo profesorTeléfono estudianteTeléfono profesor

En estos casos es recomendable utilizar un número fijo decaracteres de la primera palabra combinado con algunos de la

Page 42: Disenio Algoritmos

Diseño de algoritmos

42

segunda, teniendo en cuenta de aplicar la misma técnica para laformación de todos los identificadores, de manera que sea fácilrecordar el identificador para cada dato.

Los identificadores de los datos anteriores podrían formarse dela siguiente forma:

Dato Identificador O tambiénNombre de estudiante Nom_est Nbre_eNombre de profesor Nom_pro Nbre_pCódigo estudiante Cod_est Cdgo_eCódigo profesor Cod_pro Cdgo_pTeléfono estudiante Tel_est Tfno_eTeléfono profesor Tel_pro Tfno_p

En la segunda columna, los identificadores se han formadoutilizando los tres primeros caracteres de cada palabra, mientrasque en la tercera, tomando el primero y los últimos caracteres de laprimera palabra y solo el primero de la segunda.

Cada programador tiene su propia estrategia para formaridentificadores para: variables, constantes, funciones y tipos dedatos definidos por el usuario. Lo importante es tener en cuenta lasrecomendaciones presentadas anteriormente y utilizar siempre lamisma estrategia para facilitarle el trabajo a la memoria (delprogramador naturalmente).

2.2.2 Tipos de variables

Las variables pueden ser clasificadas con base a tres criterios: eltipo de dato que guardan, la función que cumplen y el ámbito.

De acuerdo al tipo de dato que almacenan, las variables puedenser de tipo entero, real, caracter, cadena, lógico y de cualquier otrotipo que el lenguaje de programación defina.

En cuanto a la funcionalidad, las variables pueden ser: variablesde trabajo, contadores, acumuladores y conmutadores.

Page 43: Disenio Algoritmos

43

2. Elementos programación

El ámbito determina el espacio en el que las variables existen,pueden ser globales o locales.

Variables de trabajo. Son las variables que se declaran con elfin de guardar los valores leídos o calculados durante la ejecucióndel programa.

Ejemplo:

Real: áreaEntero: base, alturaAltura = 10Base = 20Área = base * altura / 2

Contadores. Son variables que se utilizan para registrar el númerode veces que se ejecuta una operación o un grupo de ellas. El usomás frecuente es como variable de control de un ciclo finito, encuyo caso guardan el número de iteraciones, pero también puedenregistrar el número de registros de un archivo o la cantidad dedatos que cumplen una condición.

Los contadores se incrementan o decrementan con un valorconstante, por lo regular es de uno en uno.

Ejemplo: se desea ingresar las notas definitivas de losestudiantes de un grupo para calcular el promedio del mismo.Dado que el tamaño del grupo puede variar, se requiere unavariable (contador) para registrar el número de notas ingresadas,para luego poder calcular el promedio.

Acumuladores. También se llaman totalizadores. Son variables quese utilizan para almacenar valores que se leen o se calculanrepetidas veces. Por ejemplo, si se quisiera calcular el promedio denotas de un grupo de estudiantes, lo primero que se hace es leerlas notas y cada una se suma en una variable (acumulador) demodo que después de leer todas las notas se divide la sumatoria de

Page 44: Disenio Algoritmos

Diseño de algoritmos

44

las mismas sobre el número de estudiantes para obtener elpromedio.

En este ejemplo se ha hecho referencia a un contador paraconocer el número de estudiantes y a un acumulador para sumarlas notas.

El acumulador se diferencia del contador en que éste no tieneincrementos regulares, sino que se incrementa de acuerdo al valorleído o al resultado de una operación.

Conmutadores. También se les llama interruptores, switchs,banderas, centinelas o flags. Son variables que pueden tomardiferentes valores en la ejecución de un programa y dependiendode dichos valores el programa puede variar la secuencia deinstrucciones a ejecutar, es decir, tomar decisiones.

Ejemplo 1: un conmutador puede utilizarse para informarle acualquier módulo del programa si un determinado archivo ha sidoabierto. Para ello se declara la variable de tipo lógico y se le asignael valor falso y en el momento en que se abre el archivo se cambiaa verdadero. Así en cualquier momento que se desee averiguar siel archivo ha sido abierto basta con verificar el estado delconmutador.

Ejemplo 2: si se busca un registro en un archivo se declara unavariable de tipo lógico y se inicializa en falso, para indicar que elregistro no ha sido encontrado. Se procede a hacer la búsqueda,en el momento en que el registro es localizado se cambia el valorde la variable a verdadero. Al finalizar la búsqueda, la variable(conmutador) informará si el registro fue encontrado o no,dependiendo si su valor es verdadero o falso, y según éste elprograma sabrá que instrucciones ejecutar.

Ejemplo 3: es común que un programa esté protegido con unsistema de seguridad. En algunos casos se tienen diferentesniveles de usuarios, donde dependiendo del nivel tiene acceso adeterminados módulos. El programa habilitará o deshabilitará

Page 45: Disenio Algoritmos

45

2. Elementos programación

ciertas opciones dependiendo del nivel de acceso, el cual estaráalmacenado en una variable (conmutador).

Locales. Una variable es de tipo local cuando solo existe dentrodel módulo o función en el que fue declarada. Este tipo de variablees útil cuando se aplica el concepto de programación modular, yaque permite que en cada procedimiento o función se tengan suspropias variables sin que entren en conflicto con las declaradas enotros módulos.

Por defecto todas las variables son locales al ámbito donde sedeclaran, si se desea declararlas como globales es necesarioespecificarlas como tales.

Globales. Son variables que se declaran para ser utilizadas encualquier módulo* del programa. Existen desde que se declaranhasta que se termina la ejecución de la aplicación.

El concepto de variables locales y globales es poco útil en lasolución de problemas mediante un solo algoritmo, pero cuando elalgoritmo se divide en subrutinas es importante diferenciar entrelas variables que desaparecen al terminar un procedimiento o unafunción y aquellas que trascienden los módulos, y su actualizaciónen un lugar puede afectar otras subrutinas.

Por lo general, los lenguajes de programación definen lasvariables como locales a menos que se indique lo contrario; porello, siguiendo esa lógica, en este documento se propone utilizar elmodificador global antes de la declaración de la variable paraespecificar que es de ámbito global.

Global entero: x

* Los conceptos de módulo, subrutina, procedimiento y función están relacionadoscon la estrategia “dividir para vencer” aplicada para enfrentar la complejidad deldesarrollo de software. Ésta consiste en partir un problema grande en problemasde menor tamaño, más fáciles de solucionar, y al hacer interactuar las solucionesparciales se resuelve el problema general. Este tema se trata en el capítulo 6.

Page 46: Disenio Algoritmos

Diseño de algoritmos

46

Se debe tener cuidado de no utilizar el mismo identificador deuna variable global para declarar una variable local, pues alactualizarla dentro de la subrutina no se sabría a qué posición dememoria se está accediendo.

2.2.3 Declaración de variables

Esta operación consiste en reservar en memoria el espaciosuficiente para almacenar un dato del tipo especificado y a la vezincluir el identificador en la lista de variables del programa.

Para declarar una variable se escribe el tipo de dato seguido delidentificador de la variable, de la forma:

TipoDato identificador

Si se desea declarar varias variables de un mismo tipo, seescribe el tipo de dato y la lista de identificadores separados porcomas (,) de la forma:

TipoDato identificador1, identificador2, identificador3

Ejemplo:

Entero: edadReal: estatura, peso, sueldoCadena: nombre, apellido, dirección

Aunque hay algunos lenguajes de programación que permitendeclarar las variables en el momento en que se las necesita, esaconsejable, en favor de los buenos hábitos de programación,siempre declarar las variables antes de utilizarlas y el sitio másadecuado es el inicio del programa o de la función.

Page 47: Disenio Algoritmos

47

2. Elementos programación

2.2.4 Asignación de valores

Esta operación consiste en almacenar un dato en una posiciónde memoria haciendo uso de una variable previamente declarada.Es necesario que el dato asignado corresponda al tipo para el cualse declaró la variable.

Una expresión de asignación tiene la forma:

variable = dato

Ejemplo:

Declaración de variables

Cadena: nombre, direcciónReal: sueldo

Asignación de valores

nombre = “José”dirección = “Carrera 24 15 40”sueldo = 1000000

También se puede asignar a una variable el resultado de unaexpresión, de la forma:

variable = expresión

Ejemplo:

Declaración de variables:Entero: base, alturaReal: área

Asignación:

base = 10

Page 48: Disenio Algoritmos

Diseño de algoritmos

48

altura = 5área = base * altura

Una expresión de asignación tiene tres partes, una variable, elsigno igual y el valor o la expresión cuyo resultado se asigna a lavariable. La variable siempre va a la izquierda del signo igual,mientras que el valor o la expresión siempre estará a la derecha.

2.2.5 Constantes

Una constate hace referencia a una posición de memoria y seforma de igual manera que una variable, con la diferencia de que eldato almacenado no cambia durante la ejecución del programa.

Las constantes se utilizan para no tener que escribir los mismosvalores en diversas partes del programa, en vez de ello se utilizauna referencia al mismo. De manera que cuando se requieracambiar dicho valor basta con hacer el cambio en una sola línea decódigo, en la que se definió la constante.

Otro motivo para definir una constante es que resulta más fácilrecordar y escribir un identificador que un valor. Por ejemplo, esmás fácil escribir pi que 3.1416, en especial si este valor hay queutilizarlo repetidas veces en el programa.

2.3 OPERADORES Y EXPRESIONES

Los operadores son símbolos que representan operacionessobre datos. Las expresiones son combinaciones de operadores yoperandos (datos) que generan un resultado.

En programación se utilizan tres tipos de operaciones:aritméticas, relacionales y lógicas, y para cada una existe unconjunto de operadores que permite construir las expresiones.

Page 49: Disenio Algoritmos

49

2. Elementos programación

2.3.1 Operadores y expresiones aritméticos

Los operadores aritméticos se aplican sobre datos de tiponumérico y permiten realizar las operaciones aritméticas, éstos sepresentan en el cuadro 2.

Cuadro 2. Operadores aritméticos

Operador Operación

+ Suma- Resta* Multiplicación/ División

Mod Módulo

Las expresiones aritméticas combinan los operadores del cuadro2 con datos numéricos y generan un nuevo número como resultado.Por ejemplo, si se tiene la base y la altura de un triángulo, medianteuna expresión aritmética se puede obtener su área.

Ejemplo:

Declaración de variables

Real: base, altura, área

Asignación de valores

base = 10altura = 15

Expresión aritmética para calcular el área:

base * altura / 2;

Asignación del resultado de una expresión aritmética a unavariable:

Page 50: Disenio Algoritmos

Diseño de algoritmos

50

área = base * altura / 2

En resultado de esta expresión es 75 y se guarda a la variableárea.

Los operadores aritméticos se utilizan para operar tanto datosde tipo enteros como reales, excepto el operador Mod que se aplicaúnicamente a números enteros.

Algunos autores, como Becerra (1998) y Cairó (2005), hacendiferencia entre la operación división (/) y división entera, y utilizanla palabra reservada div para la segunda. En este libro se utiliza elsímbolo / para toda operación de división. Si los operandos son detipo entero el resultado será otro entero, en cuyo caso se dirá quese desarrolla una división entera, mientras que si los operandos sonreales, o alguno de ellos lo es, el resultado será de tipo real.

El operador Mod (módulo) devuelve el residuo de una divisiónentera. Ejemplo:

10 Mod 2 = 0 ya que 10 / 2 = 5 y el residuo es 010 Mod 4 = 2 ya que 10 / 4 = 2 y el residuo es 2

La combinación de diferentes operadores aritméticos en unamisma expresión puede hacer que ésta resulte ambigua; es decir,que sea posible más de una interpretación y por ende más de unresultado. Para evitar dicha ambigüedad los operadores tienen unorden jerárquico que determina cuál se ejecuta primero cuando hayvarios en la misma expresión. Para alterar el orden de ejecucióndeterminado por la jerarquía es necesario utilizar paréntesis.

Como se aprecia en el cuadro 3, en la jerarquía de losoperadores, en primer lugar se tiene los paréntesis, que permitenconstruir subexpresiones, que son las primeras en desarrollarse.Luego se tiene la multiplicación, la división y el módulo, quepresentan un nivel de jerarquía mayor que la suma y la resta. Estosignifica que si en una expresión se encuentran multiplicaciones ysumas, primero se ejecutan las multiplicaciones y después las

Page 51: Disenio Algoritmos

51

2. Elementos programación

sumas. Cuando se presentan varios operadores del mismo nivel,como suma y resta, la ejecución se hace de izquierda a derecha.

Cuadro 3. Jerarquía de los operadores aritméticos

Nivel deprioridad

Operador Operación

1 () Agrupación2 *, /, Mod Multiplicación, división y módulo3 +, - Suma, resta, incremento y decremento

Ejemplos:

3 * 2 + 5 = 6 + 5 = 113 * (2 +5) = 3 * 7 = 21

6 + 4 / 2 = 6 + 2 = 8(6 + 4) / 2 = 10 / 2 = 5

5 * 3 + 8 / 2 – 1 = 15 + 4 - 1 = 185 * (3 + 8) / (2 - 1) = 5 * 11 / 1 = 55

10 + 12 Mod 5 = 10 + 2 = 12(10 + 12) Mod 5 = 22 % 5 = 2

2.3.2 Operadores y Expresiones Relacionales

Los operadores relacionales permiten hacer comparacionesentre datos del mismo tipo. Las expresiones relacionales dan comoresultado un dato de tipo lógico: verdadero o falso. Estasexpresiones se utilizan principalmente para tomar decisiones o paracontrolar ciclos. Los operadores se presentan en el cuadro 4.

Page 52: Disenio Algoritmos

Diseño de algoritmos

52

Cuadro 4. Operadores relacionales

Operador Comparación

< Menor que<= Menor o igual que> Mayor

>= Mayor o igual que= Igual a

<> Diferente de

Algunos ejemplos de expresiones relacionales son:

Declaración e inicialización de la variable

Entero x = 5;

Expresiones relacionales:

x < 10 = verdaderox > 10 = falsox = 10 = falso

Declaración e inicialización de variables

Real a = 3, b = 1

Expresiones relacionales:

a = b = falsoa > b = verdadero;a < b = falsoa <> b = verdadero

Page 53: Disenio Algoritmos

53

2. Elementos programación

2.3.3 Operadores y expresiones lógicos

Estos operadores se utilizan únicamente para operar datos detipo lógico o booleano (verdadero o falso). Las expresiones lógicasdan como resultado otro dato de tipo lógico. Los operadores semuestran en el cuadro 5.

Cuadro 5. Operadores lógicos

Operador Operación

Y ConjunciónO Disyunción

NO Negación

En el cuadro 6 se muestra los resultados de operar datos lógicoscon los operadores Y, O, NO.

Cuadro 6. Resultado de operaciones lógicas

Operando 1 Operador Operando 2 = Resultado

Verdadero

Y

Verdadero

=

VerdaderoVerdadero Falso Falso

Falso Verdadero FalsoFalso Falso Falso

Verdadero

O

Verdadero

=

VerdaderoVerdadero Falso Verdadero

Falso Verdadero VerdaderoFalso Falso Falso

NoVerdadero

=Falso

False Verdadero

Ahora bien, como los datos lógicos no son comunes en el mundoreal, la mayoría de las expresiones lógicas se construyen a partir deexpresiones relacionales. Algunos ejemplos son:

Page 54: Disenio Algoritmos

Diseño de algoritmos

54

Real nota = 3.5;

(nota >= 0) Y (nota <= 5.0) = Verdadero

Entero a = 15, b = 8;

(a > 10) O (b > 10) = VerdaderoNO (b > 5) = falso

2.3.4 Jerarquía general de los operadores

Los operadores aritméticos, relacionales y lógicos puedenaparecer mezclados en una misma expresión. En estos casos esnecesario tener especial atención a la jerarquía de los mismos paraasegurarse que cada uno opera sobre tipos válidos y no se generenerrores en tiempo de ejecución. Para ello conviene tener en cuentael orden jerárquico que le corresponde a cada uno, a fin deestablecer el orden de ejecución y forzar la prioridad para que lasexpresiones se desarrollen correctamente. En el cuadro 7 sepresenta la jerarquía de todos los operadores estudiados en estecapítulo.

Cuadro 7. Jerarquía de los operadores

Prioridad Operadores

1 ()2 *, /, Mod, NO3 +, -, , Y4 >, <, >=, <=, <>, =, O

Tener en cuenta que los operadores del mismo nivel se ejecutande izquierda a derecha.

Page 55: Disenio Algoritmos
Page 56: Disenio Algoritmos

56

3. ALGORITMOS

El tiempo es un maestro de ceremoniasque siempre acaba poniéndonos

en el lugar que nos compete,vamos avanzando,

parando y retrocediendosegún sus órdenes.

Saramago

La palabra algoritmo proviene de la traducción al latín deltérmino árabe Al-Khowarizmi, que significa originario de Khwarizm,nombre antiguo del mar de Aral (Galve et al, 1993). De otra parte,Al-Khowarizmi es el nombre con que se conoció a un matemático yastrónomo persa que escribió un tratado sobre manipulación denúmeros y ecuaciones en el Siglo IX. (Brassard y Bratley, 1997),(Joyanes et al, 1998).

3.1 CONCEPTO DE ALGORITMO

Se han propuesto diferentes conceptos de algoritmos, algunosde ellos son: “conjunto finito, y no ambiguo de etapas expresadasen un cierto orden que, para unas condiciones iniciales, permitenresolver el problema en un tiempo finito” (Galve et al, 1993: 3); otambién, “conjunto de reglas para efectuar un cálculo, bien sea amano, o más frecuentemente, en una máquina” (Brassard y Bratley,1997: 2).

Page 57: Disenio Algoritmos

57

3. Algoritmos

De igual manera se ha considerado que es un procedimientocomputacional bien definido que toma un valor o un conjunto devalores como entradas y produce algún valor o conjunto de valorescomo salida. Así, un algoritmo es una secuencia de pasoscomputacionales para transformar la entrada en salida. (Comer etal, 2001).

Para Becerra (1998), un algoritmo es el camino para solucionarun problema en un computador, es un grupo de instrucciones quese escriben de acuerdo a reglas sintácticas suministradas por unlenguaje de programación.

Mientras que para Hermes (1984:19) “un algoritmo es unprocedimiento general con el que se obtiene la respuesta a todoproblema apropiado mediante un simple cálculo de acuerdo con unmétodo especificado” y posteriormente menciona que esteprocedimiento debe estar claramente especificado de manera queno haya lugar a que intervenga la imaginación y la creatividad dequien lo ejecuta.

También puede definirse como “una serie de operacionesdetalladas y no ambiguas, a ejecutar paso a paso, y que conducen ala solución de un problema” (Joyanes, 1992: 2).

Cuando se dice que un problema tiene una solución algorítmicasignifica que es posible escribir un programa de computadora queobtendrá la respuesta correcta para cualquier conjunto de datos deentrada (Baase y Gelder, 2002).

Para que la solución de un problema sea llevada hasta unlenguaje de programación, los pasos expresados en el algoritmodeben ser detallados, de manera que cada uno de ellos impliqueuna operación trivial; es decir, que los pasos no impliquen procesosque requieran de una solución algorítmica. En caso de presentarseesta situación, el algoritmo debe ser refinado, lo que equivale adesarrollar nuevamente el algoritmo para la tarea concreta a la quese hace mención.

Page 58: Disenio Algoritmos

58

Diseño de algoritmos

Si el problema que se desea solucionar es muy grande ocomplejo, es recomendable dividirlo en tareas que se puedanabordar independientemente y que resulten más sencillas desolucionar. A esto se le llama diseño modular.

Como ejemplo considérese el algoritmo de Euclides para calcularel Máximo Común Divisor (MCD). El MCD de dos números enteroses el número más grande que los divida a los dos, incluso puede seruno de ellos, dado que todo número es divisible por sí mismo.

Este algoritmo establece unos pasos concretos que al ejecutarseun número determinado de veces, independiente de los númerospropuestos, siempre encuentra el mayor divisor común. La soluciónse presenta más adelante en las cuatro notaciones explicadas eneste capítulo.

3.2 CARACTERÍSTICAS DE UN ALGORITMO

Un algoritmo debe tener al menos las siguientes características:

Ser preciso: esto significa que las operaciones o pasos delalgoritmo deben desarrollarse en un orden estricto, ya que eldesarrollo de cada paso debe obedecer a un orden lógico.

Ser definido: el resultado de la ejecución de un algoritmodepende exclusivamente de los datos de entrada; es decir,siempre que se ejecute el algoritmo con el mismo conjunto dedatos el resultado será el mismo.

Ser finito: esta característica implica que el número de pasosde un algoritmo, por grande y complicado que sea elproblema que soluciona, debe ser limitado. Todo algoritmo,sin importar el número de pasos que incluya, debe llegar a unfinal. Para hacer evidente esta característica, en la represen-tación de un algoritmo siempre se incluyen los pasos inicio yfin.

Page 59: Disenio Algoritmos

59

3. Algoritmos

Notación: Para que el algoritmo sea entendido por cualquierpersona interesada es necesario que se exprese en alguna delas formas comúnmente aceptadas, esto con el propósito dereducir la ambigüedad propia del lenguaje natural. Entre lasnotaciones más conocidas están: pseudocódigo, diagrama deflujo, diagramas de Nassi/Shneiderman y funcional.

Corrección: el algoritmo debe ser correcto, es decir debesatisfacer la necesidad o solucionar el problema para el cualfue diseñado. Para garantizar que el algoritmo logre elobjetivo, es necesario ponerlo a prueba; a esto se le llamaverificación, una forma sencilla de verificarlo es mediante laprueba de escritorio.

Eficiencia: hablar de eficiencia o complejidad de un algoritmoes evaluar los recursos de cómputo que requiere paraalmacenar datos y para ejecutar operaciones frente albeneficio que ofrece. En cuanto menos recursos requieraserá más eficiente el algoritmo.

Si la descripción de un procedimiento o el enunciado de unasolución para un problema no cuentan con estas características, nopuede considerarse técnicamente un algoritmo. Por ejemplo, lasrecetas de cocina se parecen mucho a un algoritmo, en el sentidode que describen el procedimiento para preparar algún tipo dealimento, incluso algunos autores, como López, Jeder y Vega (2009)han tomado las recetas de cocina como ejemplo de algoritmos; noobstante, pocas veces están definidas lo suficiente para ser unalgoritmo, pues siempre dejan un espacio para la subjetividad dequien ejecuta las acciones.

La diferencia fundamental entre una receta y un algoritmo estáen que la primera no está definida, como se muestra en el ejemplodel cuadro 8, tomado de López, Jeder y Vega(2009).

Page 60: Disenio Algoritmos

60

Diseño de algoritmos

Cuadro 8. Primer algoritmo para preparar una taza de café

1. Encender una hornilla2. Colocar una jarra con leche sobre la hornilla3. Esperar a que la leche hierva4. Colocar café en una taza5. Verter un poco de leche en la taza y batir6. Verter más leche en la taza hasta colmarla7. Agregar azúcar al gusto

Este tipo de acciones no pueden ser desarrolladas por elcomputador, de forma automática, porque requieren la intervencióndel criterio humano. Para que sea un algoritmo, en el sentido que sesustenta en este libro, sería necesario escribirlo como se muestraen el cuadro 9.

Cuadro 9. Segundo algoritmo para preparar una taza de café

1. Inicio2. Encender una hornilla3. Colocar una jarra con 200 ml. De leche sobre la hornilla4. Colocar 10 gr. de café instantáneo en una taza5. Colocar 10 gr. de azúcar en la taza6. Mezclar el azúcar y el café7. Esperar hasta que la leche hierva8. Apagar la hornilla9. Verter la leche en la taza10. Mezclar hasta que el café y el azúcar se disuelvan11. Fin

La primera versión corresponde a una receta, la segunda a unalgoritmo. En la segunda versión se indica el principio y el fin, lospasos tienen un orden lógico, las actividades están definidas(cantidades explícitas) de manera que si se aplica varias veces conlos mismos insumos se obtendrá el mismo resultado. Es decir que

Page 61: Disenio Algoritmos

61

3. Algoritmos

el producto final depende del algoritmo y no de la persona que loejecuta.

3.3 NOTACIONES PARA ALGORITMOS

Se ha definido un algoritmo como el conjunto de pasos paraencontrar la solución a un problema o para resolver un cálculo.Estos pasos pueden expresarse de diferentes formas, como:descripción, pseudocódigo, diagramas y funciones matemáticas. Lamás sencilla, sin duda, es la descripción en forma de prosa; sinembargo, el lenguaje natural es muy amplio y ambiguo, lo que hacemuy difícil lograr una descripción precisa del algoritmo, y siendo laclaridad una característica fundamental del diseño de algoritmos espreferible utilizar el pseudocódigo. La representación gráfica sehace mediante diagramas que son fáciles de comprender y deverificar, los principales son: diagrama de flujo y diagrama N-S. Larepresentación matemática es propia del modelo de programaciónfuncional y consiste en expresar la solución mediante funcionesmatemáticas, preferiblemente utilizando Calculo Lambda*.

3.3.1 Descripción textual

Esta es, sin duda, la forma más sencilla de escribir un algoritmo,se trata de elaborar una lista de actividades o pasos en forma deprosa, sin aplicar ninguna notación.

Esta forma de presentar un algoritmo tiene la desventaja de queda lugar a cometer imprecisiones y ambigüedades, dada laamplitud del lenguaje. Es apropiada cuando se escribe la versiónpreliminar de un algoritmo y se desea centrar la atención en lalógica más que en la forma de comunicar las ideas. Una vezterminado el algoritmo, es recomendable pasarlo a alguna de lasnotaciones que se explican a continuación.

* El Cálculo Lambda es un sistema formal que define una notación para funcionescomputables, facilita la definición y evaluación de expresiones y por ello es elfundamento teórico del modelo de programación funcional. Fue desarrollado porAlonso Church en 1936.

Page 62: Disenio Algoritmos

62

Diseño de algoritmos

Ejemplo 1. Máximo Común Divisor

Uno de los algoritmos más antiguos de que se tienen noticia esel diseñado por Euclides* para calcular el Máximo Común Divisor(MCD) entre dos números. El MCD(a,b) – léase: el máximo comúndivisor de los números a y b - consiste en identificar un número cque sea el número más grande que divide exactamente a los dosanteriores.

Este algoritmo expresado en forma descriptiva sería:

Se leen los dos números, luego se divide el primero sobre elsegundo y se toma el residuo. Si el residuo es igual a cero, entoncesel MCD es el segundo número. Si el residuo es mayor a cero sevuelve a efectuar la división del segundo número sobre el residuode la última división y se continúa dividiendo hasta que el residuoobtenido sea cero. La solución será el número que se utilizó comodivisor en la última división.

3.3.2 Pseudocódigo

Es la mezcla de un lenguaje de programación y el lenguajenatural (español, inglés o cualquier otro idioma) en la presentaciónde una solución algorítmica. Esta notación permite diseñar elalgoritmo de forma estructurada pero utilizando el lenguaje y elvocabulario conocido por el diseñador.

Un pseudocódigo es un acercamiento a la estructura y sintaxisde un lenguaje de programación determinado, lo cual facilita lacomprensión del algoritmo y su codificación, debido a que sepresenta una estrecha correspondencia entre la organización delalgoritmo y la sintaxis y semántica del lenguaje.

* Euclides (Tiro, 330 – Alejandría, 300 a.C.), matemático griego. Por encargo delfaraón Tolomeo I Sóter (el salvador), escribió la obra Elementos, compuesta por 13tomos en los que sistematiza en conocimiento matemático de su época; Tambiénse le atribuyen otras obras, como: Óptica, Datos, Sobre las divisiones, Fenómenos yelementos de la música (Gran Enciclopedia Espasa, 2005: 4648).

Page 63: Disenio Algoritmos

63

3. Algoritmos

Considerando que el lenguaje natural es muy amplio, mientrasque los lenguajes de programación son limitados, es necesarioutilizar un conjunto de instrucciones que representen las principalesestructuras de los lenguajes de programación. A estas instruccionesse las denomina palabras reservadas y no podrán ser utilizadascomo identificadores de variables.

Algunas palabras reservadas son:

Cadena Función Lógico RepitaCaracter Hacer Mientras RetornarDecrementar Hasta Para Según seaEntero Incrementar Procedimiento SiEscribir Inicio Real Si noFin Leer

Identación

Una de las dificultades que presenta el pseudocódigo es que noes fácil apreciar las estructuras de programación como lasbifurcaciones y los ciclos, esto debido a que las instruccionesaparecen una después de otra, aunque no sea esa la secuencia enque se ejecutan.

La identación consiste en dejar una sangría o tabulación para lasinstrucciones que están dentro de una estructura de programación,para indicar su dependencia y para evidenciar dónde comienza ytermina una estructura.

Ventajas de utilizar un Pseudocódigo

Algunas ventajas de esta notación son:

Ocupa menos espacio Permite representar en forma fácil operaciones repetitivas Es muy fácil pasar del pseudocódigo al código del programa

en un lenguaje de programación.

Page 64: Disenio Algoritmos

64

Diseño de algoritmos

Si se aplica identación se puede observar claramente ladependencia de las acciones a las estructuras deprogramación.

En el cuadro 10, se presenta el algoritmo de Euclides ennotación de pseudocódigo. En este ejemplo se observa la aplicacióndel concepto de identación para resaltar la dependencia de lasinstrucciones con respecto a la estructura “mientras” y al inicio - findel algoritmo.

Cuadro 10. Algoritmo para obtener el MCD

1. Inicio2. Entero: a, b, c=13. Leer a, b4. Mientras c>0 hacer5. c = a Mod b6. a = b7. b = c8. Fin mientras9. Escribir “MCD = ”, a10. Fin algoritmo

En este algoritmo se lee los dos números a y b, se inicializa en 1 lavariable c para asegurarse que el ciclo se ejecute. Se realizandivisiones sucesivas, la primera con los números ingresados y lassiguientes tomando el divisor como dividendo y el residuo comodivisor, hasta obtener un división entera, cuando esto ocurra elnúmero que haya actuado como divisor será la solución o MCD.

3.3.3 Diagrama de Flujo

Es la representación gráfica de un algoritmo mediante unconjunto de símbolos que representan las operaciones y estruc-turas básicas de programación. El conjunto de símbolos utilizadospara diseñar diagramas de flujo se presentan en la figura 5.

Page 65: Disenio Algoritmos

65

3. Algoritmos

Figura 5. Símbolos utilizados para diseñar diagramas de flujo

Símbolo utilizado para representar el inicio y el fin de unalgoritmo.

Proceso de entrada y salida de datos. Se debe escribir laoperación a realizar: Leer o Escribir y la lista de datos.

Teclado, se utiliza para representar la instrucción Leer datospor teclado.

Proceso, representa asignación o cálculo. Se utiliza tambiénpara declarar variables.

Proceso predefinido, se utiliza para llamar a una subrutinao subprograma.

Si

No

Decisión, representa operaciones lógicas o de comparación.Tiene dos salidas. El programa seguirá una de ellasdependiendo de si se cumple o no la condición.

Si

No

Decisión múltiple, tiene varias salidas.La variable evaluada puede tomar uno de diferentesvalores posibles y dependiendo de éste el programaseguirá un curso de acción. Si el valor es diferente atodos los considerados se seguirá el camino marcadocomo No.

Pantalla, se utiliza para representar la instrucción Escribiren pantalla o salida de datos por pantalla.

Page 66: Disenio Algoritmos

66

Diseño de algoritmos

Figura 5. (Continuación)

Impresora, se utiliza para representar la instrucciónEscribir por impresora o salida de datos por impresora.

Conector en la misma página, se utiliza para unir dospartes del diagrama que no pueden unirse mediante unaflecha, pero que están en la misma página.

Conector en diferente página, se utiliza para unir dospartes del diagrama que no pueden unirse mediante unaflecha por estar en páginas diferentes.

Bucle, se utiliza para representar estructuras derepetición. Tiene dos salidas y dos entradas, porarriba recibe el flujo proveniente de un procesoanterior, mientras que por la derecha recibe el flujoproveniente del interior del ciclo, por abajo estánlos procesos que se repiten y por la izquierda sesale del ciclo.

Líneas dirigidas, se utilizan para unir los símbolos deldiagrama e indican la dirección del flujo del algoritmo.En lo posible solo se deben utilizar hacia abajo y haciala derecha.

Comentario, símbolo utilizado para introducircomentarios en el diagrama de flujo.

Documentaciónde procesos

Page 67: Disenio Algoritmos

67

3. Algoritmos

La representación mediante diagrama de flujo hace que elalgoritmo se comprenda fácilmente, por cuanto es visible suestructura y el flujo de operaciones. No obstante, cuando elalgoritmo es extenso es difícil de construir el diagrama. Aunque sepuede hacer uso de conectores dentro y fuera de la página, el usode estos afecta la comprensión de la lógica del algoritmo.

Recomendaciones para construir diagramas de flujo

Tomando como referencia a Cairó (2005) se hace algunasrecomendaciones para la construcción apropiada de diagramas deflujo:

El primer símbolo en todo diagrama de flujo debe ser el deinicio y al hacer el recorrido, indiferente de los caminos quetenga, siempre debe llegar al símbolo de fin.

Todos los símbolos deben estar unidos con líneas dirigidas,que representan el flujo de entrada y el flujo de salida, aexcepción del inicio que no tiene entrada y el fin que no tienesalida.

Las líneas deben ser rectas, horizontales o verticales y nodeben cruzarse. En lo posible hay que procurar utilizar sololíneas hacia abajo y hacia la derecha, con el fin de facilitar lalectura del algoritmo. Excepción a ésta regla son los ciclos.

Toda línea debe partir de un símbolo y terminar en unsímbolo.

Los conectores deben estar numerados consecutivamente yse deben utilizar solo cuando es necesario.

Algunos símbolos pueden ser utilizados para representar másde una instrucción y por ello es necesario escribir unaetiqueta utilizando expresiones del lenguaje natural. No sedebe utilizar sentencias propias de un lenguaje deprogramación.

Page 68: Disenio Algoritmos

68

Diseño de algoritmos

Si se utilizan variables cuyos indicadores son abreviaturas esnecesario utilizar el símbolo de comentario para describirlasdetalladamente.

Procurar utilizar solo una página para el diagrama, si esto noes posible es conveniente utilizar conectores numerados ynumerar también las páginas.

Ventajas de utilizar diagrama de flujo

Joyanes(1992) señala algunas ventajas de utilizar diagramas deflujo para el diseño de algoritmos:

Facilita la comprensión del algoritmo

Facilita la documentación

Por utilizar símbolos estándares es más fácil encontrarsentencias equivalentes en lenguaje de programación

Facilita la revisión, prueba y depuración del algoritmo

En la figura 6 se presenta el algoritmo de Euclides en notaciónde diagrama de flujo.

3.3.4 Diagrama de Nassi-Shneiderman

Es una notación propuesta por Isaac Nassi y Ben Shneiderman*,en 1973, como una alternativa a los diagramas de flujo para la

* Isaac Nassi es un experto informático estadounidense. Ha sido director dedesarrollo sistemas de Cisco y director de investigaciones de SAP América.También ha trabajado para Apple Computer.

Page 69: Disenio Algoritmos

69

3. Algoritmos

aplicación de la programación estructurada. También se conocecomo diagrama de Chapín o simplemente diagrama N-S.

Figura 6. Diagrama de flujo para el algoritmo de Euclides

Ben Shneiderman es matemático/físico e informático estadounidense, catedráticode informática en el Human-Computer interaction Laboratory en la Universidad deMaryland. Su investigación se desarrolla sobre la interacción hombre-máquina.Definió la Usabilidad Universal pensando en las diferentes características de losusuarios y de la tecnología que utilizan.

Inicio

Entero: a, b, c = 1

a, b

c = a Mod b

a = b

b = c

c = 0 “MCD =”, a

Fin1

1

Si

No

Page 70: Disenio Algoritmos

70

Diseño de algoritmos

Un diagrama N-S se construye utilizando instrucciones depseudocódigo y un conjunto reducido de figuras básicas quecorresponden a las estructuras de programación: secuenciales,selectivas e iterativas. No utiliza flechas para establecer el flujo delas operaciones, sino que coloca las cajas que corresponden a lasinstrucciones unas después o dentro de otras, de manera que esevidente la secuencia, la bifurcación o la repetición en la ejecucióndel algoritmo.

Nassi y Shneiderman (1973) sostienen que los diagramas porellos diseñados ofrecen las siguientes ventajas:

Las estructuras de decisión son fácilmente visibles ycomprensibles

Las iteraciones son visibles y bien definidas El alcance de las variables locales y globales es evidente en el

diagrama Es imposible que el control se transfiera arbitrariamente La recursividad se representa de forma trivial Los diagramas se pueden adaptar a las peculiaridades del

lenguaje de programación a utilizar

A diferencia del pseudocódigo y el diagrama de flujo, el diagramaN-S permite tener una visión más estructurada de los pasos delalgoritmo y por ende facilita no solo el paso siguiente que es lacodificación, sino también la comprensión y el aprendizaje.

Un programa se representa por un solo diagrama en el que seincluye todas las operaciones a realizar para la solución delproblema, comienza con un rectángulo con la etiqueta inicio ytermina con otra con la etiqueta fin. Para conectar un diagrama conotro se utiliza la palabra proceso y el nombre o número delsubprograma a conectar. Fuera del diagrama se coloca el nombredel programa o algoritmo. En estos diagramas se representadetalladamente los datos de entrada y salida y los procesos queforman parte del algoritmo (Alcalde y García, 1992).

Page 71: Disenio Algoritmos

71

3. Algoritmos

En N-S, las estructuras secuencias, como: declaración devariables, asignación, lectura y escritura de datos e invocación desubrutinas se escriben en un rectángulo, como se muestra en lafigura 7.

La estructura selectiva si – entonces – si no – fin si, serepresenta colocando la condición en un triángulo invertido y éste asu vez en un rectángulo. El flujo de ejecución correspondiente a lasalternativas de la decisión se coloca por izquierda y derecharespectivamente. La estructura selectiva se muestra en la figura 8.

Figura 7. Estructura secuencia en notación N-S

Figura 8. Estructura selectiva en notación N-S

La estructura de decisión múltiple según sea se representamediante un triángulo invertido dentro de un rectángulo y por cadaposible valor de la variable se coloca un rectángulo hacia abajo. Enla figura 9 se muestra la relación entre el valor de la variable y laacción que se ejecuta.

Condición

Acción_Si_Verdadero Acción_Si_falso

Instrucción

Page 72: Disenio Algoritmos

72

Diseño de algoritmos

Figura 9. Estructura de selección múltiple en notación N-S

Las estructuras iterativas se representan escribiendo laespecificación del ciclo en un rectángulo y las acciones que serepiten en un segundo rectángulo que se coloca dentro del primero.En el documento original los autores proponen tres formas derepresentar las estructuras iterativas: en el ciclo mientras elrectángulo interno se ubica en la parte inferior, el ciclo para seubica al centro y para el ciclo repita hasta, en la parte superior,dejando espacio abajo para escribir la especificación del ciclo. Eneste libro, con la intensión de facilitar el diseño y la interpretaciónde los algoritmos mediante esta notación, se propone una solarepresentación, con el rectángulo interno al centro dejando espacioarriba y abajo para la especificación del ciclo, como se muestra enla figura 10.

Variable =

1 2 3 4 ... Otro

A1 A2 A3 A4 . . . An

Page 73: Disenio Algoritmos

73

3. Algoritmos

Figura 10. Estructura iterativa en notación N-S

Como ejemplo de la notación Nassi - Shneiderman, en la figura11 se presenta el algoritmo de Euclides, para obtener el MCD.

Figura 11. Algoritmo de Euclides en notación N-S

Inicio

Entero a, b, c = 1

Leer a, b

Mientras c > 0 hacerc = a mod ba = bb = c

Fin mientras

Escribir “MCD =”, a

Fin algoritmo

3.3.5 Notación Funcional

En este caso, el término función indica una regla decorrespondencia que asociación un elemento del conjunto dominiocon otro del conjunto destino, como se entiende en matemáticas; y

Especificación del ciclo

Fin del ciclo

Acciones a repetir

Page 74: Disenio Algoritmos

74

Diseño de algoritmos

no hace referencia a un subprograma como se entiende desde elenfoque de la programación imperativa.

Una función se especifica mediante un nombre, su dominio,rango y regla de correspondencia. Sea f una función y x un valor desu dominio, la notación f(x) representa el elemento y del rango que fasocia a x. Es decir, f(x) = y. La expresión f(x) se conoce comoaplicación de la función (Galve et al, 1993).

Siendo f(x,y) la función Máximo Común Divisor de dos númerosenteros. En el cuadro 11 se muestra la solución al MCD de dosnúmeros aplicando el algoritmo de Euclides y representado ennotación funcional.

Cuadro 11. Algoritmo de Euclides en notación funcional

Las notaciones presentadas: pseudocódigo, diagrama de flujo,diagrama de Nassi – Shneiderman y funcional son las másimportantes, pero hay muchas más. Sobre este tema Santos, Patiñoy Carrasco(2006: 15) presentan, bajo el concepto de “Técnicas parael diseño de algoritmos”, otras como: organigramas, ordinogramas,tablas de decisión, diagramas de transición de estados y diagramasde Jackson.

3.4 ESTRATEGIA PARA DISEÑAR ALGORITMOS

Para diseñar un algoritmo es primordial conocer el dominio delproblema y tener claridad sobre lo que se espera que el algoritmo

f(x,y) =y si (x Mod y) = 0

f(y, x Mod y) si (x Mod y) > 0

Page 75: Disenio Algoritmos

75

3. Algoritmos

haga. La fase de análisis debe proporcionar una descripción precisade los datos con los que trabaja el algoritmo, las operaciones quedebe desarrollar y los resultados esperados.

Un programa de computador desarrolla de forma automática unaserie de operaciones que toman un conjunto de datos de entrada,realiza los procesos previamente definidos y genera uno o másresultados. Un algoritmo es la especificación de dicha serie deoperaciones; es decir, la definición de las operaciones queposteriormente se realizarán de forma automática. En consecuen-cia, para diseñar un algoritmo es necesario conocer las operacionesque se requieren para obtener el resultado esperado.

En este orden de ideas, antes de intentar expresar la solucióndel problema en forma de algoritmo es conveniente tomar unconjunto de datos de entrada, realizar las operaciones y obtener losresultados de forma manual. Este ejercicio permitirá laidentificación de todos los datos, separar los de entrada y los desalida y establecer las fórmulas para el desarrollo de los cálculosque permitirán obtener los resultados esperados.

Ejemplo 2. Número par o impar

Este ejemplo trata sobre aplicar la estrategia para diseñar unalgoritmo para determinar si un número es par o impar.

Cómo se ha explicado, antes de intentar escribir un algoritmo esnecesario pensar en cómo se logra solucionar éste problema paraun caso particular, sin pensar en algoritmos ni programas.

Lo primero es establecer el concepto de número par: un númeropar es aquel que al dividirse para dos el resultado es un númeroentero y el residuo es cero.

Ahora, supóngase que el número en cuestión es el 10. ¿Cómoconfirmar que es un número par?

Page 76: Disenio Algoritmos

76

Diseño de algoritmos

Si se piensa un poco se encuentra que hay dos formas dehacerlo, las dos implican realizar una división entera sobre dos.

La primera consiste en tomar el cociente y multiplicarlo por dos,si el resultado es igual al número, al 10 en este caso, se compruebaque el número es par, en caso contrario es impar.

10 / 2 = 5

5 * 2 = 10 => confirmado, 10 es número par

La segunda alternativa es tomar el residuo, si éste es igual acero, significa que la división entera es exacta, lo que compruebaque el número es par; por el contrario, si el residuo es igual a uno,el número es impar. Para obtener el residuo se utiliza el operadorMod presentado en el apartado 2.3.1.

10 Mod 2 = 0 => confirmado, 10 es número par

De igual manera se prueba con otro número, por ejemplo el 15.

Aplicando la primera alternativa se tiene que:

15 / 2 = 7

7 * 2 = 14 => 15 es número imparAplicando la segunda opción se tiene que:

15 Mod 2 = 1 => 15 es número impar

15 2

71

10 2

50

Page 77: Disenio Algoritmos

77

3. Algoritmos

De estos dos ejemplos se deduce que para solucionar esteproblema se utiliza un dato de entrada, correspondiente al númeroque se desea evaluar, el proceso consiste en una división entera dela cual se toma el cociente o el residuo según preferencia delprogramador, y el resultado esperado es un mensaje: “número par”o “número impar”.

Ahora, después de haber solucionado dos casos particulares deeste problema, ya se puede proceder a expresar la solución enforma algorítmica, utilizando cualquiera de las notacionesexplicadas en la sección 3.3. En el cuadro 12 se presenta lasolución en pseudocódigo.

Cuadro 12. Pseudocódigo algoritmo número par/impar

1. Inicio2. Entero: n, r3. Leer n4. r = n Mod 25. Si r = 0 entonces6. Escribir n, “es número par”7. Si no8. Escribir n, “es número impar”9. Fin si10. Fin algoritmo

En este algoritmo se declara dos variables, la primera paraalmacenar el número que se desea evaluar, la segunda paraalmacenar el residuo de la división entera (línea 4). Para evaluar elcontenido de la variable r se utiliza la estructura selectiva si que seexplica en la sección 4.2.2.

En las figuras 12 y 13 se presenta este mismo algoritmo mediantediagramas de flujo y N-S respectivamente.

Page 78: Disenio Algoritmos

78

Diseño de algoritmos

Figura 12. Diagrama de flujo del algoritmo número par/impar

Figura 13. Diagrama de Nassi-Shneiderman del algoritmo número par/impar.

Inicio

Entero: x, y

r = 0SI No

Leer x

r = x Mod 2

Escribir x, “ es número par”

Fin algoritmo

Escribir x, “ es número impar”

Inicio

Entero: n, r

n

r = n Mod 2

r = 0 n, “es par”

Fin

Si

No

n, “es impar”

Page 79: Disenio Algoritmos

79

3. Algoritmos

3.5 VERIFICACIÓN DE ALGORITMOS

Después de haber diseñado la solución de un problemamediante cualquiera de las formas vistas anteriormente, esnecesario verificar que el algoritmo funciona adecuadamente; esdecir, que tenga las características indispensables para serconsiderado un buen algoritmo, como son: ser finito, definido,preciso, correcto y eficiente. La verificación del algoritmo tambiénse conoce como prueba de escritorio.

Para verificar la corrección de un algoritmo se crea una tabla conuna columna para cada variable o constante utilizada y algunasotras para registrar las ejecuciones, las iteraciones y las salidas,luego se ejecuta paso a paso y se registran en la tabla los valoresque toman las variables. Al llegar al final del algoritmo se observarácomo se transforman los datos entrados o los valores iniciales paragenerar los datos de salida. Si el proceso es correcto y las salidastambién, el algoritmo es correcto. Si alguno de los datos no es elesperado se revisa el diseño y se hacen los cambios necesarioshasta que funcione correctamente.

Aplicando lo explicado, se toma el algoritmo del ejemplo 2 y severifica tres veces con diferentes números. En la primera ejecuciónse ingresa el número 6, la división sobre 2 da como residuo 0 y seobtiene como resultado el mensaje: “6 es número par”, lo cual escorrecto; en la segunda, se ingresa el número 3, al hacer la divisiónse obtiene como residuo 1 y como resultado el mensaje: “3 esnúmero impar”; en la tercera ejecución se ingresa el número 10, elresiduo de la división entera es 0 y el resultado: “10 es númeropar”.

En el cuadro 13 se presenta la prueba realizada al algoritmo delejemplo 2, el cual lee un número y muestra un mensaje indicando sies par o impar.

Page 80: Disenio Algoritmos

80

Diseño de algoritmos

Cuadro 13. Verificación del algoritmo número par/imparEjecución n R Salida

1 6 0 6 es número par2 3 1 3 es número impar3 10 0 10 es número par

Page 81: Disenio Algoritmos
Page 82: Disenio Algoritmos

82

4. ESTRUCTURAS DE PROGRAMACIÓN

El saber que en teoríaun problema se puede resolver

con una computadorano basta para decirnos

si resulta práctico hacerlo o no.Baase y Van Gerder

En programación estructurada se utilizan tres tipos deestructuras: secuenciales, aquellas que se ejecutan una despuésde otra siguiendo el orden en que se han escrito; de decisión, quepermiten omitir parte del código o seleccionar el flujo de ejecuciónde entre dos o más alternativas; y las iterativas, que se utilizan pararepetir la ejecución de cierta parte del programa.

4.1 ESTRUCTURAS SECUENCIALES

Estas estructuras se caracterizan por ejecutarse una después deotra en el orden en que aparecen en el algoritmo o el programa,como la asignación de un dato a una variable, la lectura o laimpresión de un dato.

4.1.1 Asignación

Esta operación consiste en guardar un dato en una posicióndeterminada de la memoria reservada mediante la declaración deuna variable.

Page 83: Disenio Algoritmos

83

3. Algoritmos

La asignación es una operación relevante en el paradigma deprogramación imperativo, donde todos los datos, los leídos y losobtenidos como resultado de un cálculo, se guardan en memoria enespera de posteriores instrucciones.

Ejemplo:

entero a, b, ccadena: operacióna = 10b = 15c = a + boperación = “suma”

La asignación de variables se trata con mayor detalle en lasección 2.2.4.

4.1.2 Entrada de datos

Un programa actúa sobre un conjunto de datos suministradospor el usuario o tomados desde un dispositivo de almacenamiento;de igual manera, el algoritmo requiere que se le proporcione losdatos a partir de los cuales obtendrá los resultados esperados.

La lectura de datos consiste en tomar datos desde un medioexterno o desde un archivo y llevarlos a la memoria donde puedenser procesados por el programa (Joyanes, 1988). El dispositivopredeterminado es el teclado.

Para la lectura de datos se cuenta con la instrucción leer enpseudocódigo y sus equivalentes en las diferentes notaciones.

En pseudocódigo, la instrucción leer tiene la siguiente sintaxis

Leer <lista de identificadores de variables>

Page 84: Disenio Algoritmos

84

Diseño de algoritmos

Ejemplo:

Leer a, b

Donde a y b son las variables que recibirán los valores y, portanto, deben estar declaradas previamente.

En diagrama de flujo, la instrucción leer puede representarse dedos maneras: utilizando el símbolo de lectura por teclado omediante un proceso de entrada y salida. En diagrama N-S, todaslas estructuras secuenciales se escriben dentro de una caja, demanera que la lectura de datos se representa mediante la palabraleer dentro de una caja, como se muestran en la figura 14.

Figura 14. Símbolos de entrada de datos

Cualquiera de los dos símbolos de la figura 14a es válido paradesignar una lectura de datos en un diagrama de flujo. La figura14b es exclusiva para diagramas N-S.

4.1.3 Salida de datos

Todo programa desarrolla una o más tareas y genera uno o másdatos como resultado. Para presentar los resultados al usuario sehace uso de las instrucciones y los dispositivos de salida de datos,como la pantalla o la impresora.

a, b Leer a, b

Leer a, b

14a. Lectura de datos en diagrama de flujo

14b. Lectura de datos en diagrama N-S

Page 85: Disenio Algoritmos

85

3. Algoritmos

Para enviar la información desde la memoria del computadorhasta un dispositivo de salida se utiliza la instrucción definida enpseudocódigo como: escribir y sus equivalentes en las demásnotaciones.

En pseudocódigo la lectura de datos se escribe de la forma:

Escribir <lista de constantes y variables>

Ejemplo:

Escribir a, b

Donde a y b son variables previamente definidas

Escribir "Este es un mensaje"

Cuando se escriben más de una variable es necesario separarlascon comas (,) y los mensajes se escriben entre comillas dobles " ".Si una variable es escrita entre comillas se mostrará el identificadory no el contenido.

Ejemplo:

Cadena: nombreEntero: edadNombre = “Juan”Edad = 25

La forma correcta de mostrar los datos es:

Escribir “Nombre: “, nombreEscribir “Edad: “, edad

Para que la salida será:

Nombre: JuanEdad: 25

Page 86: Disenio Algoritmos

86

Diseño de algoritmos

Escribir de la forma:Escribir “nombre”Escribir “edad”

Solo mostrará las etiquetas: “nombre” y “edad”

En diagrama de flujo la salida de datos puede representarsemediante tres símbolos: salida por pantalla, salida por impresora yproceso de entrada y salida (figura 15a), mientras que en diagramaN-S la instrucción escribir se coloca dentro de una caja, como semuestra en la figura 15b.

Figura 15. Símbolos de salida de datos

4.1.4 Ejemplos con estructuras secuenciales

Ejemplo 3. Sumar dos números

Este algoritmo lee dos números, los almacena en variables,luego los suma y muestra el resultado. Se trata de representaralgorítmicamente el desarrollo de la operación sumar utilizando dosvalores. Por ejemplo:

3 + 2 = 5

Escribir a, b

15a. Salida de datos en diagrama de flujo

15b. Salida de datos en diagrama N-S

a, b a, b Escribira, b

Page 87: Disenio Algoritmos

87

3. Algoritmos

Si esta operación se la convierte en una expresión aritméticacon variables se tiene:

r = x + y

Si se asigna o lee valores para las variables x e y se puedecalcular el resultado. Ejemplo:

x = 6y = 7

r = x + yr = 6 + 7r = 13

De este ejemplo se deduce que el algoritmo requiere que se lesuministren dos datos, estos son los datos de entrada, que sealmacenarán en las variables x e y. Con éstos se desarrolla laexpresión (proceso) y el resultado es el dato que interesa al usuario,por tanto éste es el dato de salida.

Entrada: x, yProceso: r = x + ySalida: r

Ahora que se comprende la solución general del problema, éstase puede expresar de forma algorítmica. En el cuadro 14 sepresenta el algoritmo en notación de pseudocódigo, en las figuras16 y 17 los diagramas de flujo y N-S, respectivamente.

Cuadro 14. Pseudocódigo del algoritmo sumar dos números

1. Inicio2. Entero: x, y, r3. Leer x, y4. r = x + y5. Fin algoritmo

Page 88: Disenio Algoritmos

88

Diseño de algoritmos

Figura 16. Diagrama de flujo para sumar dos números

Figura 17. Diagrama N-S para sumar dos números

Inicio

Entero: x, y, r

Leer x, y

r = x + y

Escribir x, “ + “, y, “ = “, r

Fin algoritmo

En este algoritmo se declaran tres variables: las dos primeras (x,y) corresponden a los dos datos de entrada, la tercera (r) guarda elresultado del proceso. La salida para este ejercicio es, sin duda, elresultado de la operación; no obstante, en muchos programas esnecesario mostrar también algunos de los datos entrados para quela salida sea más entendible, en este ejemplo se muestra losoperandos y el resultado de la operación.

Inicio

Entero: x, y, r

x, y

r = x + y

x, “+”, y, “=”, r

Fin

Page 89: Disenio Algoritmos

89

3. Algoritmos

Para verificar si este algoritmo es correcto se crea una tablacomo la que se presenta en el cuadro 15, se ejecuta el algoritmolínea por línea, proporcionando los datos de entrada y realizandolas operaciones. Los datos se escriben en las columnas de la tablaetiquetadas con las variables y luego se verifica si la salida escorrecta. (La verificación de algoritmos se explica en la sección 3.5).

Cuadro 15. Verificación del algoritmo para sumar dos números

Ejecución X y r Salida

1 3 4 7 3 + 4 = 72 5 8 13 5 + 8 = 133 2 3 5 2 + 3 = 5

Es importante tener presente que al verificar el algoritmo sedebe ejecutar estrictamente los pasos de éste y no proceder dememoria, ya que muchas veces lo que se tiene en mente y lo que seescribe no es lo mismo y lo que se quiere verificar es lo que estáescrito.

Ejemplo 4. El cuadrado de un número.

El cuadrado de un número es igual a multiplicar el número por símismo, de la forma:

32 = 3 * 3 = 952 = 5 * 5 = 25

Ahora, para generalizar la operación se utiliza una variable parael número que se desea elevar al cuadrado y se tiene una expresiónde la forma:

num2 = num * num = ?

Si llevamos este proceso a un algoritmo y luego a un programa,el computador podrá proporcionar el resultado para cualquiernúmero. Ahora bien, antes de proceder a diseñar el algoritmo se

Page 90: Disenio Algoritmos

90

Diseño de algoritmos

organiza la información que se tiene en forma de: entrada, salida yproceso.

Entrada: númeroSalida: el cuadrado del númeroProceso: cuadrado = número * número

Con esta información se procede a diseñar la solución delproblema. En el cuadro 16 se presenta el pseudocódigo, y en lasfiguras 18 y 19 los diagramas de flujo y N-S.

Cuadro 16. Pseudocódigo para calcular el cuadrado de un número

1. Inicio2. Entero: num, cuad3. Leer num4. cuad = num * num5. Escribir cuad6. Fin algoritmo

En este algoritmo se declaran dos variables: num para almacenarel número ingresado por el usuario y cuad para almacenar elresultado del proceso, es decir, el cuadrado del número. En elcuadro 17 se presenta tres ejecuciones de prueba para verificar lacorrección del algoritmo: en la primera se ingresa el número 3 y seobtiene como resultado el 9, en la segunda se ingresa el número 2y se obtiene el cuatro y en la tercera se ingresa el 7 y el resultado es49, estos resultados confirman que el algoritmo es correcto.

Cuadro 17. Verificación del algoritmo el cuadrado de un número

Ejecución num cuad Salida

1 3 9 92 2 4 43 7 49 49

Page 91: Disenio Algoritmos

91

3. Algoritmos

Figura 18. Diagrama de flujo para calcular el cuadrado de un número

Figura 19. Diagrama N-S para calcular el cuadrado de un número

Inicio

Entero: num, cuad

Leer num

cuad = num * num

Escribir cuad

Fin algoritmo

Ejemplo 5. Precio de venta de un producto

Considérese el siguiente caso: una tienda de licores adquieresus productos por cajas y los vende por unidades. Dado que unacaja de cualquier producto tiene un costo c y contiene n unidades,

Inicio

Entero: num, cuad

num

cuad = num * num

cuad

Fin

Page 92: Disenio Algoritmos

92

Diseño de algoritmos

se desea calcular el precio p para cada unidad, de manera que seobtenga el 30% de utilidad.

Lo primero que hay que hacer es comprender bien el dominio delproblema, esto es, poder obtener los resultados y solucionar elproblema de forma manual.

Ejemplo 1: se compra una caja de ron en $ 240.000.oo (c), éstacontiene 24 unidades (n) y se desea obtener el 30% de utilidad. ¿Aqué precio (p) se debe vender cada unidad?

Para solucionar este problema es necesario realizar trescálculos, primero, aplicar el porcentaje de utilidad sobre el costo dela caja; segundo, sumar el costo más la utilidad para obtener elprecio total de la caja; y tercero, dividir el valor total sobre elnúmero de unidades (n) para obtener el precio unitario (p).

Primero:

utilidad = 240.000.oo * 30/100utilidad = $ 72.000.oo

Segundo:

total = $ 240.000.oo + $ 72.000.oototal = $ 312.000.oo

Tercero:

p = $ 312.000.oo / 24p = $ 13.000.oo

Finalmente tenemos el precio de venta de cada unidad: $13.000.oo

Ejemplo 2: supóngase que se compra otro producto, cuyo costopor caja es de $ 600.000.oo y contiene 12 unidades. Entonces setiene que:

Page 93: Disenio Algoritmos

93

3. Algoritmos

Primero:

utilidad = $ 600.000.oo * 30/100utilidad = $ 180.000.oo

Segundo:

total = $ 600.000.oo + $ 180.000.oototal = $ 780.000.oo

Tercero:

p = $ 780.000.oo / 12p = $ 65.000.oo

El precio de venta de cada unidad es de $ 65.000.oo

Con estos dos ejemplos se logra comprender cómo se solucionael problema, ahora es necesario generalizar el proceso de soluciónde manera que se pueda especificar un algoritmo; para ello hay querepresentar los valores mediante variables y los cálculos confórmulas que se aplican sobre dichas variables, así:

Sea:

c = costo de la cajan = número de unidadesp = precio de venta por unidad

De estos datos: los dos primeros son entradas, el último es lasalida. Los cálculos a realizar son:

utilidad = c * 30/100total = c + utilidadp = total / n

Habiendo llegado a este punto ya se puede proceder a diseñarun algoritmo para solucionar cualquier caso de este problema. En el

Page 94: Disenio Algoritmos

94

Diseño de algoritmos

cuadro 18 se muestra el pseudocódigo, en la figura 20 el diagramade flujo y en la 21 el diagrama N-S.

Cuadro 18. Pseudocódigo para calcular el precio unitario de un producto

1. Inicio

2. Entero: nReal: c, utilidad, total, p

3. Leer c, n4. utilidad = c * 30/1005. total = c + utilidad6. p = total / n7. Escribir “Precio = ”, p8. Fin algoritmo

Figura 20. Diagrama de flujo para calcular el precio unitario de un producto

Inicio

Entero: nReal: c, utilidad, total, p

c, np = total/n

“Precio =”, p

Fin

utilidad = c * 30/100

1

1

total = c + utilidad

Page 95: Disenio Algoritmos

95

3. Algoritmos

Figura 21. Diagrama N-S para calcular el precio unitario de un producto

InicioEntero: nReal: c, utilidad, total, pLeer c, n

utilidad = c * 30/100

total = c + utilidad

p = total / n

Escribir “Precio = ”, p

Fin algoritmo

En el cuadro 19 se presentan los datos de tres pruebasefectuadas para verificar la corrección de este algoritmo, las dosprimeras columnas corresponden a los datos de entrada y la últimaa la salida que genera el algoritmo.

Cuadro 19. Verificación del algoritmo para calcular el precio unitario de unproducto

C n Utilidad total P Salida

240.000 24 72.000 312.000 13.000 Precio = 13.000600.000 12 180.000 780.000 65.000 Precio = 65.000300.000 10 90.000 390.000 39.000 Precio = 39.000

Ejemplo 6. Área y perímetro de un rectángulo

Se requiere un algoritmo para calcular el área y el perímetro de unrectángulo de cualquier dimensión.

h

b

Page 96: Disenio Algoritmos

96

Diseño de algoritmos

Para solucionar este problema es necesario conocer lasfórmulas para obtener tanto el área como el perímetro de unrectángulo.

Siendo:

b = baseh = altura

Las fórmulas a utilizar son:

Área = b * hPerímetro = 2 * (b + h)

Si el rectángulo tiene una base de 10 cm y una altura de 5 cm,se obtiene:

Área = 10 * 5Área = 50

Perímetro = 2 * (10 + 5)Perímetro = 30

Cómo se aprecia en el ejemplo, para hacer los cálculos esnecesario contar con la base y la altura, de manera que éstoscorresponden a los datos que el usuario debe suministrar y que elalgoritmo ha de leer, mientras que el área y el perímetro son losdatos que el algoritmo debe calcular y presentar al usuario; por lotanto:

Datos de entrada: base (b) y altura (h)Datos de salidas: área (a) y perímetro (p)Procesos:

a = b * hp = 2 * (b + h)

Page 97: Disenio Algoritmos

97

3. Algoritmos

El diseño de la solución en notación de pseudocódigo sepresenta en el cuadro 20.

Cuadro 20. Pseudocódigo para calcular el área y perímetro de un rectángulo

1. Inicio2. Entero: b, h, a, p3. Leer b, h4. a = b * h5. p = 2 (b + h)6. Escribir “área:”, a7. Escribir “perímetro:”, p8. Fin algoritmo

Para verificar que el algoritmo es correcto se realiza la prueba deescritorio, paso a paso, así:

Paso 2. Se declaran variables: b, h, a, p correspondientes a:base, altura, área y perímetro respectivamente.

Paso 3. Se lee desde teclado base y altura y se almacena en lasvariables b y h, supóngase los valores 5 y 8

Paso 4. Se calcula el área, 5 * 8 = 40 (a = b * h) y se almacenaen la variable a

Paso 5. Se calcula el perímetro, 2 * (5 + 8) = 26 y se guarda enla variable p

Pasos 6 y 7. Se muestra el contenido de las variables a y p consu respectivo mensaje.

En el cuadro 21 se presentan los resultados de la verificacióncon tres conjuntos de datos.

Page 98: Disenio Algoritmos

98

Diseño de algoritmos

Cuadro 21. Verificación del algoritmo área y perímetro de un rectángulo

Ejecución b h a p Salida1 5 8 40 26 área: 40

perímetro: 26

2 3 4 12 14 área: 12perímetro: 14

3 8 4 32 24 área: 32perímetro: 24

Ejemplo 7. Tiempo dedicado a una asignatura

Se sabe que un profesor universitario contratado como horacátedra dedica una hora a preparar una clase de dos horas y porcada cuatro horas de clase desarrolladas hace una evaluación, lacual le toma dos horas calificar. Si al docente se le asigna un cursode n horas al semestre, ¿cuántas horas trabajará en total?

La mejor forma de comprender un problema es tomar un casoparticular y desarrollarlo. Supóngase que el profesor ha sidocontratado para el curso de matemáticas cuyo número de horas(nh) es de 64 al semestre.

Si para cada par de horas de clase dedica una hora a supreparación se tiene que el tiempo de preparación (tp) es:

tp = 64 / 2tp = 32 horas

En general: tp = nh/2

Se sabe también que hace una evaluación por cada cuatro horas declase, de manera que se puede calcular el número de evaluaciones(ne) que realizará durante el semestre:

ne = 64 / 4

Page 99: Disenio Algoritmos

99

3. Algoritmos

ne = 16

Para cualquier caso: ne = nh / 4

Ahora, si para calificar cada evaluación requiere dos horas, eltiempo dedicado en el semestre a calificar (tc) es:

tc = 16 * 2tc = 32

Utilizando variables: tc = ne * 2

Finalmente, para obtener el tiempo total (tt) que el docentededica al curso de matemáticas sólo hay que sumar el tiempo depreparación, el tiempo de desarrollo de las clases y el tiempo decalificación de exámenes, así:

tt = 32 + 64 + 32tt = 128

Esto es: tt = tp + nh + tc

De esta manera se obtiene que para un curso de 64 horas declase, el docente dedica 128 horas de trabajo. Como se quierecalcular este valor para cualquier curso es necesario diseñar unalgoritmo, al cual se le proporciona el número de horas de clasesemestral y el devolverá el total de horas dedicadas.

De lo anterior se deduce que:

Entrada: número de horas de clase (nh)Salida: tiempo total dedicado (tt)Cálculos a realizar:tp = nh/2ne = nh / 4tc = ne * 2tt = tp + nh + tc

Page 100: Disenio Algoritmos

100

Diseño de algoritmos

El algoritmo, en notación de diagrama de flujo se presenta en lafigura 22.

Para tener la seguridad de que el algoritmo realiza los cálculoscorrectamente se realiza la prueba con tres casos diferentes, losresultados se presentan en el cuadro 22.

Figura 22. Diagrama de flujo para calcular el tiempo dedicada a una asignatura

Cuadro 22. Verificación del algoritmo tiempo dedicado a una asignatura

Ejec. nh tp ne tc tt Salida

1 64 32 16 32 128 Tiempo total = 1282 80 40 20 40 160 Tiempo total = 1603 96 48 24 48 192 Tiempo total = 192

Inicio

Entero: nh, tp, ne, tc, tt

nhtt = np +nh + tc

“Tiempo total = ”, tt

Fin

tp = nh / 2ne = nh / 4

1

1

tc = ne * 2

Page 101: Disenio Algoritmos

101

3. Algoritmos

4.1.5 Ejercicios propuestos

Diseñar los algoritmos para solucionar los siguientes problemasy representarlos mediante pseudocódigo, diagrama de flujo odiagrama N-S.

1. Leer tres notas y calcular el promedio

2. Calcular el área de un triángulo

3. Calcular el área y el perímetro de un círculo

4. Calcular el volumen y la superficie de un cilindro

5. Dado el ancho, largo y alto de una caja, calcular el volumeny la cantidad de papel (en cm2) necesario para cubrirla.

6. Leer un número entero y separar sus dígitos en: miles,centenas, decenas y unidades.

7. Calcular el interés y el valor futuro de una inversión coninterés simple.

8. Calcular el interés y valor futuro de una inversión con interéscompuesto.

9. Si la universidad financia las matrículas de los estudiantes acuatro cuotas mensuales iguales con un interés del 2%sobre el saldo. Dado el valor de matrícula y el número decuotas, un estudiante desea saber ¿Cuál será el valor decada cuota? ¿Cuánto pagará en total?

10. Un vendedor recibe un sueldo base más el 10% de comisiónsobre sus ventas. Si en un mes cualquiera hace tres ventaspor valores: v1, v2 y v3, ¿cuánto recibirá por comisión? y¿cuánto en total?

Page 102: Disenio Algoritmos

102

Diseño de algoritmos

11. Un cliente de un supermercado adquiere n productos aprecio unitario p. Si por temporada el producto tiene undescuento del 10% que se hace efectivo en caja ¿cuál es elvalor del descuento? ¿cuánto deberá pagar?

12. Un estudiante desea saber cuál será su calificación final enProgramación. Dicha calificación se compone del promediode tres notas parciales. Cada nota parcial se obtiene apartir de un taller, una evaluación teórica y una evaluaciónpráctica. Los talleres equivalen al 25% de la nota del parcial,las evaluaciones teóricas al 35% y las evaluacionesprácticas al 40%.

13. Un viajero desea conocer cuántos dólares obtendrá por sucapital en pesos.

14. Facturar el servicio de electricidad. El consumo mensual sedetermina por diferencia de lecturas.

15. Las utilidades de una empresa se distribuyen entre tressocios así: socio A = 40%, socio B = 25% y socio C = 35%.Dada una cantidad de dinero ¿cuánto corresponderá a cadauno?

16. El dueño de una tienda compra un artículo por x pesos ydesea obtener el 30% de utilidad. ¿Cuál es el precio deventa del artículo?

17. Un almacén tiene como política obtener el 30% de utilidadsobre cada artículo y por temporada ofrece un descuentodel 15% sobre el precio de venta en todos sus productos.Dado el costo de un producto calcular el precio de venta, demanera que pueda efectuar el descuento sobre el precio deventa y obtener el 30% de utilidad sobre el costo.

18. Tres personas deciden invertir su dinero para fundar unaempresa. Cada una de ellas invierte una cantidad distinta.

Page 103: Disenio Algoritmos

103

3. Algoritmos

Obtener el porcentaje que cada cual invierte con respecto ala cantidad total invertida.

19. Calcular el sueldo de un empleado que ha trabajado n horasextras diurnas y m horas extras nocturnas, siendo que cadahora extra diurna tiene un incremento del 25% sobre el valorde una hora corriente y cada hora extra nocturna unincremento del 35%.

20. Un estudiante desea saber la nota mínima que deberáobtener en la evaluación final de cálculo después deconocer las notas de los dos parciales, sabiendo que lamateria se aprueba con 3.0 y la nota definitiva se obtienede la siguiente manera: 30% para cada uno de los parcialesy 40% para el final.

21. Dado el valor del capital de un préstamo, el tiempo y el valorpagado por concepto de interés, calcular la tasa de interésque se aplicó.

22. Conociendo el tiempo que un atleta tarda en dar una vueltaal estadio (400 m) se requiere estimar el tiempo que tardaráen recorrer los 12 km. establecido para una competencia.

23. Resolver una ecuación cuadrática (aX2 + bX + c = 0)teniendo en cuenta que a, b y c son valores enteros ypueden ser positivos o negativos.

24. Dado el valor que un cliente paga por un producto, calcularqué valor corresponde al costo del producto y cuánto al IVA.Considerando que el porcentaje del IVA puede variar en eltiempo y de un producto a otro, este dato se lee por teclado.

25. Un profesor diseña un cuestionario con n preguntas, estimaque para calificar cada pregunta requiere m minutos. Si elcuestionario se aplica a x estudiantes, cuánto tiempo (horasy minutos) necesita para calificar todos los exámenes.

Page 104: Disenio Algoritmos

104

Diseño de algoritmos

4.2 ESTRUCTURAS DE DECISIÓN

En la programación, como en la vida real, es necesario evaluarlas circunstancias y actuar en consecuencia, pues no siempre sepuede establecer por anticipado el curso de las acciones. En laejecución de un programa, muchas expresiones estarán supedita-das al cumplimiento de determinadas condiciones; por ello, elprogramador ha de identificar estas situaciones y especificar, en elprograma, qué hacer en cada caso (Timarán et al, 2009).

Todo problema, tanto en programación como en otros ámbitos,incluye un conjunto de variables que pueden tomar diferentesvalores. La presencia o ausencia de determinadas variables, asícomo su comportamiento, requieren acciones diferentes en lasolución. Esto hace que los programas no sean secuencias simplesde instrucciones, sino estructuras complejas que implementansaltos y bifurcaciones según el valor de las variables y lascondiciones definidas sobre éstas

Por ejemplo, para realizar una división se requieren dosvariables: dividendo y divisor, que pueden contener cualquiernúmero entero o real. No obstante, la división sobre cero no estádeterminada y por tanto se tiene como condición que el divisor seadiferente de cero. Al implementar esta operación en un programa sedebe verificar el cumplimiento de esta restricción y decidir si serealiza el cálculo o se muestra un mensaje de error. Si no seimplementa esta decisión y al ejecutarse el programa la variabletoma el valor cero se presentará un error de cálculo y la ejecuciónse interrumpirá.

Implementar una decisión implica evaluar una o más variablespara determinar si cumple una o más condiciones y establecer unflujo de acciones para cada resultado posible. Las acciones puedenconsistir en ejecutar una o más expresiones o en omitirlas, o enseleccionar una secuencia de instrucciones de entre dos o másalternativas disponibles.

Page 105: Disenio Algoritmos

105

3. Algoritmos

4.2.1 Condición

En esta sección se menciona repetidas veces el términocondición, de manera que parece oportuno hacer mayor claridadsobre el mismo. Una condición es una expresión relacional o lógicaque puede o no cumplirse dependiendo de los valores de lasvariables involucradas en la expresión. Cuando se utiliza unaexpresión relacional, la condición es una comparación entre dosvariables del mismo tipo o una variable y una constante, mientrasque cuando se utiliza una expresión lógica se tiene una o másexpresiones relacionales combinadas con operadores lógicos: y, o,no; cuyo resultado depende de la tabla de verdad delcorrespondiente operador.

Los siguientes son ejemplos de condiciones que contienenexpresiones relacionales:

a. x = 5b. y <= 10c. x > y

Al escribir el programa se especifica la condición medianteexpresiones como estas, pero al ejecutarlo se evalúan y el resultadopuede ser verdadero o falso dependiendo del valor de las variables.Supóngase que:

x = 8y = 9

En tal caso se tendría que la condición a no se cumple por endegenera un resultado falso, la b si se cumple generando así unresultado verdadero y la c también devuelve falso.

Obsérvese algunos ejemplos de condiciones formadas porexpresiones lógicas:

a. x > 0 Y x < 10

Page 106: Disenio Algoritmos

106

Diseño de algoritmos

b. x == 5 O y == 9c. NO(x>y)

La condición a devuelve verdadero si las dos expresionesrelacionales son verdaderas; la condición b devuelve verdadero si almenos una de las expresiones relacionales que la conforman esverdadera y la c niega el resultado de la expresión relacional queestá entre paréntesis. Si las variables tiene los valores indicadosanteriormente (x = 8, y = 9) la condición a es verdadera, la b esverdadera y la c es verdadera.

4.2.2 Tipos de decisiones

Las decisiones pueden ser de tres clases: simples, dobles ymúltiples.

Decisión simple: consiste en decidir si ejecutar u omitir unainstrucción o un conjunto de instrucciones. En este caso sedetermina qué debe hacer el programa si la condición es verdadera,pero si no lo es, simplemente se pasa el control a la instrucción queestá después de la estructura de decisión.

Un ejemplo de decisión simple se presenta cuando se calcula elvalor absoluto de un número. El valor absoluto de un número es elmismo número, pero si éste es negativo es necesario multiplicarlopor -1 para cambiar de signo. Nótese que esta operación sólo esnecesaria en el caso de los números negativos. Para incluirdecisiones simples en un algoritmo se utiliza la sentencia Si.

Decisión doble: se presenta cuando se tienen dos alternativasde ejecución y dependiendo del resultado de la evaluación de lacondición se ejecuta la una o la otra. Si la condición es verdaderase ejecuta la primera instrucción o bloque de instrucciones y si esfalsa, la segunda.

Como ejemplo de este tipo de decisión se puede tomar el casoen que se evalúa una nota para decidir si un estudiante aprueba o

Page 107: Disenio Algoritmos

107

3. Algoritmos

reprueba una asignatura, dependiendo si la nota es mayor o igual a3.0.

Decisión múltiple: consiste en evaluar el contenido de unavariable y dependiendo del valor de ésta ejecutar una secuencia deacciones. En este caso, el conjunto de valores para la variable debeser mayor a dos y solo se evalúa la condición de igualdad. Cadaposible valor está asociado a una secuencia de ejecución y éstasson mutuamente excluyentes. Este tipo de decisiones seimplementan haciendo uso de la sentencia Según sea.

Como ejemplo de decisión múltiple considérese el caso de unalgoritmo que permite ejecutar cualquiera de las operacionesaritméticas básicas: suma, resta, multiplicación y división, sobre unconjunto de números. Al ejecutarse, el usuario escoge la operacióny el algoritmo realiza la operación correspondiente.

4.2.3 Estructura SI

Esta instrucción evalúa un valor lógico, una expresión relacionalo una expresión lógica y retorna un valor lógico, con base en éste setoma una decisión simple o doble.

Decisión simple

Como decisión simple su sintaxis en pseudocódigo es:

SI <condición> ENTONCESInstrucciones

FIN SI

En las figuras 23 y 24 se presenta su representación endiagrama de flujo y N-S, respectivamente.

Page 108: Disenio Algoritmos

108

Diseño de algoritmos

Figura 23. Decisión simple en notación diagrama de flujo

Figura 24. Decisión simple en notación diagrama N-S

Ejemplo 8. Calcular el valor absoluto de un número

El valor absoluto de un número es el mismo número para el casode los positivos y el número cambiado de signo para los negativos;es decir, el valor absoluto es la distancia que hay desde el 0 alnúmero y como las distancias no pueden ser negativas, éstesiempre será positivo.

|5| = 5|-3| = 3

Condición

Si No

Instrucciones

Condición Instrucciones a ejecutar si lacondición es verdadera

Si

No

Page 109: Disenio Algoritmos

109

3. Algoritmos

En el cuadro 23 se presenta el pseudocódigo de este ejercicio.

Cuadro 23. Pseudocódigo para calcular el valor absoluto de un número

1. Inicio2. Entero: num3. Leer num4. Si num < 0 entonces5. num = num * -16. Fin si7. Escribir “Valor absoluto = ”, num8. Fin algoritmo

La estructura de decisión se aplica en la línea 4 para determinarsi el número es negativo, si la evaluación de la condición da unresultado verdadero se ejecuta la línea 5, si da un resultado falsotermina la estructura Si y se ejecuta la instrucción que está despuésde Fin si, en la línea 7.

Si al ejecutar este algoritmo se introduce el número 5 se obtieneque, al llegar a la decisión, la condición no se cumple y por tanto seprocede a escribir el mismo número. Si en una segunda ejecuciónse introduce el número -3, al evaluar la condición ésta genera comoresultado verdadero, por tanto se ejecuta la operación que estádentro de la decisión: multiplicar el número por -1 y finalmente semuestra el número 3. Estos resultados se aprecian en el cuadro 24.

Cuadro 24. Verificación del algoritmo para calcular valor absoluto

Ejecución num Salida

1 5 Valor absoluto = 52 -3 Valor absoluto = 3

En la figura 25 se presenta el diagramas de flujo y en la 26 eldiagrama N-S.

Page 110: Disenio Algoritmos

110

Diseño de algoritmos

Figura 25. Diagrama de flujo de valor absoluto de un número

Figura 26. Diagrama N-S para calcular el valor absoluto de un número

Inicio

Entero: num

Leer num

num = num * -1

Escribir “Valor absoluto = ”, num

Fin algoritmo

num 0Si No

Inicio

Entero: num

num

num < 0 num = num * -1

Fin

Si

No

“Valor absoluto:“,num

Page 111: Disenio Algoritmos

111

3. Algoritmos

Decisión doble

Se implementa una decisión doble cuando se cuenta con dosopciones para continuar la ejecución del algoritmo y éstasdependen de una condición; es decir, que se cuenta con una o másinstrucciones para el caso que la condición sea verdadera y conotra u otro conjunto de instrucciones para el caso de que sea falsa.

Las decisiones simples se utilizan para incluir saltos en laejecución del algoritmo o del programa, las decisiones doblespermiten hacer bifurcaciones. Su sintaxis en pseudocódigo es:

SI <condición> ENTONCESInstrucciones_si_verdadero

SI NOInstrucciones_si_falso

FIN SI

En las figuras 27 y 28 se presenta su representación endiagrama de flujo y N-S, respectivamente.

Figura 27. Decisión doble en notación diagrama de flujo

Observe que en pseudocódigo se escribe la instrucción Fin Sipara indicar hasta donde se extiende la estructura condicional. Endiagrama de flujo, el fin del condicional está determinado por la

Condición Instrucciones_si_verdaderoSi

No

Instrucciones_si_falso

Page 112: Disenio Algoritmos

112

Diseño de algoritmos

unión de los dos caminos, marcados como Si y No. En el diagramaN-S la estructura condicional tiene dos bloques, en el de laizquierda se escriben las instrucciones que deben ejecutarsecuando la condición se cumple y en el de la derecha se colocan lasque deben ejecutarse cuando la condición no se cumple, el fin delcondicional estará marcado por la terminación de los dos bloques yla continuación en una sola caja.

Figura 28. Decisión simple en notación diagrama N-S

Ejemplo 9. División

Como se mencionó, antes de ejecutar una división es necesarioverificar que el divisor sea diferente de cero, ya que en casocontrario se generará un error de cómputo y el programa secancelará. En consecuencia, es necesario utilizar la sentencia Sipara decidir si se ejecuta la división o se muestra un mensaje deerror.

El algoritmo para realizar una división, representado mediantepseudocódigo, se presenta en el cuadro 25. En la línea 4 seespecifica la condición que debe cumplirse para proceder aefectuar la división, en caso de que la condición no se cumpla laejecución salta a la cláusula Si no, en la línea 7 y se ejecuta la línea8, mostrándose un mensaje de error.

Para probar si el algoritmo funciona correctamente se ejecutapaso a paso, se introduce un par de números, se verifica el

CondiciónSi No

Instrucciones_si_verdadero Instrucciones_si_verdadero

Page 113: Disenio Algoritmos

113

3. Algoritmos

cumplimiento de la condición y la ruta que toma dependiendo deésta. En el cuadro 26 se presentan tres pruebas.

Cuadro 25. Pseudocódigo para realizar una división

1. Inicio2. Entero: dividendo, divisor, cociente3. Leer dividendo, divisor4. Si divisor != 0 entonces5. cociente = dividendo / divisor6. Escribir cociente7. Si no8. Escribir “Error, divisor = 0”9. Fin si10. Fin algoritmo

Cuadro 26. Verificación del algoritmo para hacer una división

Ejec. Dividendo divisor cociente Salida

1 15 3 5 52 8 0 Error, divisor = 03 12 3 4 4

La solución de este ejercicio en notación de diagrama de flujo sepresenta en la figura 29 y en diagrama N-S en la figura 30.

Ejemplo 10. Número mayor y número menor

Este ejercicio consiste en leer dos números enteros diferentes ydecidir cuál de ellos es el mayor y cuál es el menor.

Para solucionar este ejercicio es necesario declarar dosvariables (x, y), introducir los números y guardarlos en ellas, luegodecidir si x es mayor que y o lo contrario.

Page 114: Disenio Algoritmos

114

Diseño de algoritmos

Figura 29. Diagrama de flujo para hacer una división

Figura 30. Diagrama N-S para hacer una división

divisor != 0Si No

Inicio

Entero: dividendo, divisor, cociente

Leer dividendo, divisor

cociente = dividendo / divisorEscribir “Error, divisor = 0”

Escribir cociente

Fin algoritmo

Inicio

Entero: dividendo, divisor, cociente

dividendo, divisor

divisor != 0 cociente = dividendo / divisor

Fin

Si

Nocociente

“Error, divisor = 0“

Page 115: Disenio Algoritmos

115

3. Algoritmos

El algoritmo del ejemplo 10, en notación de pseudocódigo, sepresenta en el cuadro 27.

Cuadro 27. Pseudocódigo para identificar número mayor y menor

1. Inicio2. Entero: x, y3. Leer x, y4. Si x > y entonces5. Escribir “Número mayor: ”, x6. Escribir “Número menor”, y7. Si no8. Escribir “Número mayor: ”, y9. Escribir “Número menor”, x10. Fin si11. Fin algoritmo

En el cuadro 28 se muestra el comportamiento del algoritmo alser probado con dos conjuntos de datos.

Cuadro 28. Verificación del algoritmo número mayor y menor

x y x > y Salida

23 12 Verdadero Número mayor: 23Número menor: 12

5 11 Falso Número mayor: 11Número menor: 5

Encontrará más ejemplos desarrollados en la sección 4.2.6.

4.2.4 Estructura SEGÚN SEA

Muchas decisiones deben tomarse no solo entre dos alternativassino de un conjunto mayor. Estos casos bien pueden solucionarseutilizando decisiones dobles anidadas; sin embargo, en favor de la

Page 116: Disenio Algoritmos

116

Diseño de algoritmos

claridad del algoritmo y la facilidad para el programador, es mejorutilizar una estructura de decisión múltiple, la cual es fácil de pasara un lenguaje de programación, ya que éstos incluyen algunainstrucción con este fin.

La instrucción Según sea determina el valor de una variable ydependiendo de éste sigue un curso de acción. Es importante teneren cuenta que solo se verifica la condición de igualdad entre lavariable y la constante. Con base en Joyanes (1996) se propone lasiguiente sintaxis:

Según sea <variable > hacerValor_1:

Acción 1Valor_2:

Acción 2Valor_3:

Acción 3Valor_n

Acción nSi no

Acción mFin según sea

Dado que se evalúa la igualdad entre la variable y la constante,todas las alternativas son mutuamente excluyentes; eso significaque sólo se podrá ejecutar un conjunto de acciones. Si ninguna delas alternativas se cumple, por no presentarse ninguna igualdad, seejecutará el grupo de acciones asociadas con la cláusula si no. Estaúltima es opcional, en caso de no aparecer y no cumplirse ningunode los casos, simplemente la ejecución del algoritmo continuará enla línea siguiente a fin según sea.

En diagrama de flujo la decisión múltiple se representa medianteun rombo en el que se coloca la variable y dos salidas, una de ellasse marca con la palabra Si y se subdivide según los posibles valoresde la variable, los mismos que se colocan junto al flujo que lescorresponde; en la otra salida se escribe la palabra No y las

Page 117: Disenio Algoritmos

117

3. Algoritmos

acciones a realizar en caso de que el valor de la variable nocoincida con ninguno de los valores establecidos, como se muestraen la figura 31.

Figura 31. Decisión múltiple en notación diagrama de flujo

En diagrama N-S se representa mediante una caja con untriángulo invertido en el que se coloca la variable y el signo igual, yse divide la caja en tantas sub-cajas como alternativas tenga ladecisión, incluyendo una caja para el caso en que la variable tomeun valor diferente a los contemplados en las opciones, esta secoloca bajo el rótulo Otro, como se muestra en la figura 32.

Figura 32. Decisión múltiple en notación N-S

Variable =

1 2 3 4 ... Otro

A1 A2 A3 A4 . . . An

Vble =

Acción 1

Acción 2

Acción 3

Acción n

Acción m

Si

1

2

3

nNo

Page 118: Disenio Algoritmos

118

Diseño de algoritmos

Ejemplo 11. Número romano

Este algoritmo lee un número arábigo y muestra su equivalenteen romano, pero sólo contempla los 10 primeros números, demanera que si el número digitado es superior a 10 se mostrará elmensaje: número no válido.

La solución de ejercicios de este tipo se facilita utilizando laestructura de decisión múltiple, ya que para cada valor hay unequivalente.

El pseudocódigo se muestra en el cuadro 29, en el que seobserva la estructura de decisión múltiple implementada entre laslíneas 4 y 17.

Cuadro 29. Pseudocódigo para números romanos

1. Inicio2. Entero: num3. Leer num4. Según sea num hacer5. 1: Escribir “I”6. 2: Escribir “II”7. 3: Escribir “III”8. 4: Escribir “IV”9. 5: Escribir “V”10. 6: Escribir “VI”11. 7: Escribir “VII”12. 8: Escribir “VIII”13. 9: Escribir “IX”14. 10: Escribir “X”15. Si no16. Escribir “Número no valido”17. Fin según sea18. Fin algoritmo

Page 119: Disenio Algoritmos

119

3. Algoritmos

Los diagrama de flujo y N-S se presentan en la figuras 33 y 34respectivamente. En los diagramas se aprecia las diferentes rutasde ejecución que se generan a partir de la estructura de decisiónmúltiple.

Figura 33. Diagrama de flujo para número romano

num = Si

1

2

3

4No

Inicio

Entero: num

numI

5

6

7

8

9

10

II

III

IV

V

VI

VII

VIII

IX

X

Fin

Númerono válido

Page 120: Disenio Algoritmos

120

Diseño de algoritmos

Figura 34. Diagrama N-S para número romano

En el pseudocódigo de este ejercicio se programa 10 posiblesvalores para la variable num, éstos se escriben después de lainstrucción según sea, seguidos de dos puntos, y para cada uno deellos se especifica las instrucciones que se deben realizar si elcontenido de la variable coincide con dicho valor. Finalmente setiene la cláusula si no para cualquier otro valor mayor a 10 o menora 1.

En el cuadro 30 se muestra los resultados de tres ejecucionescon diferentes números.

Cuadro 30. Verificación del algoritmo número romano

Ejecución num Salida

1 3 III2 9 IX3 12 Número no valido

Escr

ibir

“I”

Escr

ibir

“II”

Escr

ibir

“III”

Escr

ibir

“IV”

Escr

ibir

“V”

Escr

ibir

“VI”

Escr

ibir

“VII”

Escr

ibir

“VIII

Escr

ibir

“IX”

Escr

ibir

“X”

Escr

ibir

“Núm

ero

nová

lido”

Inicio

Entero: num

Leer num

num =

101 2 3 4 5 6 7 8 9 Otro

Fin algoritmo

Page 121: Disenio Algoritmos

121

3. Algoritmos

Ejemplo 12. Nombre del día de la semana

Este algoritmo lee un número entre uno y siete correspondienteal día de la semana y muestra el nombre del día, haciendocorresponder el uno (1) con lunes, dos con martes y asísucesivamente, para lo cual utiliza la sentencia según sea. Si elnúmero digitado es menor a uno o mayor a siete, muestra unmensaje de error. El pseudocódigo se muestra en el cuadro 31, eldiagrama de flujo en la figura 35 y el diagrama N-S en la 36.

Cuadro 31. Pseudocódigo del algoritmo día de la semana

1. Inicio

2. Entero: díaCadena: nomdía

3. Leer día4. Según sea día hacer5. 1: nomdía = “Lunes”6. 2: nomdía = “Martes”7. 3: nomdía = “Miércoles”8. 4: nomdía = “Jueves”9. 5: nomdía = “Viernes”10. 6: nomdía = “Sábado”11. 7: nomdía = “Domingo12. Si no13. nomdía = “Número no válido”14. Fin según sea15. Escribir nomdía16. Fin algoritmo

En este ejercicio no se escribe el nombre del día en cada caso dela decisión, se declara una variable y se le asigna el nombre quecorresponda (líneas 5 a 11). Al final, después de haber cerrado laestructura de decisión, se muestra el nombre del día (línea 15).

Page 122: Disenio Algoritmos

122

Diseño de algoritmos

Figura 35. Diagrama de flujo del algoritmo nombre del día de la semana

día = Si

1

2

3

4

No

Inicio

Entero: díaCadena: nomdía

día

5

6

7

Fin

nomdía = “Lunes”

nomdía = “Martes”

nomdía = “Miércoles”

nomdía = “Jueves”

nomdía = “Viernes”

nomdía = “Sábado”

nomdía = “Domingo”nomdía =

“Número no Válido”

nomdía

Page 123: Disenio Algoritmos

123

3. Algoritmos

Figura 36. Diagrama N-S del algoritmo día de la semana

En el cuadro 32 se muestran tres casos utilizados para verificarel funcionamiento del algoritmo.

Cuadro 32. Verificación del algoritmo día de la semanaEjecución Día nomdía Salida

1 6 Sábado Sábado2 4 Jueves Jueves3 9 Número no válido Número no válido

nom

día

= “L

unes

nom

día

=”n

úmer

o no

vál

ido”

nom

día

= “M

arte

s”

nom

día

= “J

ueve

s”

nom

día

= “M

iérc

oles

nom

día

= “V

iern

es”

nom

día

= “S

ábad

o”

nom

día

= “D

omin

go”

Inicio

Entero: díaCadena: nomdía

Leer día

Otro1 2 3 4 5 6 7

Escribir nomdia

Fin algoritmo

día =

Page 124: Disenio Algoritmos

124

Diseño de algoritmos

4.2.5 Decisiones anidadas

Se denominan anidadas a las decisiones que se escriben unadentro de otra; lo que significa que después de haber tomado unadecisión es necesario tomar otra. En pseudocódigo el anidamientotiene la forma de la estructura que se muestra en el cuadro 33.

Cuadro 33. Decisiones anidadas

Si <condición 1> entoncesSi <condición 2> entonces

Instrucciones 1Si no

Si <condición 3> entoncesInstrucciones 2

Si noInstrucciones 3

Fin siFin si

Si noSi <condición 4> entonces

Instrucciones 4Si no

Instrucciones 5Fin si

Fin si

Si condición-1 es verdadera se evalúa condición-2 y si estatambién es verdadera se ejecuta instrucciones-1. De forma queinstrucciones-1 se ejecuta únicamente si condición-1 y condición-2son verdaderas; instrucciones-2, si condición-1 es verdadera ycondición-2 es falsa.

Cuando la segunda decisión se escribe para el caso de que laprimera sea verdadera se dice que se anida por verdadero, comoocurre con la condición-2. Si la segunda decisión se evalúa cuandola primera no se cumple, se dice que se anida por falso. Tanto porverdadero como por falso se pueden anidar todas las decisionesque sean necesarias.

Page 125: Disenio Algoritmos

125

3. Algoritmos

El anidamiento se puede hacer con la estructura Si de igualmanera con Según sea y se pueden combinar las dos: un Si dentrode un Según sea o lo contrario, tantos niveles como la solución delproblema lo requiera.

La representación en diagrama de flujo se muestra en la figura37. En este tipo diagrama es muy fácil de apreciar el anidamientode las decisiones y de comprender la dependencia de lasoperaciones con respecto a las decisiones, basta con evaluar lacondición y seguir la flecha que corresponda.

Figura 37. Diagrama de flujo de decisiones anidadas

Condición 1

Condición 2

Condición 4

Condición 3

Acción 1

Acción 2

Acción 3

Acción 4

Acción 5

Si

No

No

No

No

Si

Si

Si

Page 126: Disenio Algoritmos

126

Diseño de algoritmos

El Diagrama N-S puede parecer complicado, pero no lo es, bastacon leer una caja a la vez, de arriba hacia abajo y de izquierda aderecha (ver figura 38). Condición 1 establece dos caminos,siguiendo por el de la izquierda encuentra la Condición 2, éstatambién proporciona dos rutas. Si la Condición 1 es falsa se tomael camino de la derecha y se encuentra con la Condición 3, la cualproporciona también dos caminos a seguir, dependiendo delresultado de la condición.

Figura 38. Diagrama N-S de decisiones anidadas

Ejemplo 13. Comparación de dos números

Dados dos números enteros, estos pueden ser iguales odiferentes, si son diferentes ¿cuál de ellos es mayor? y ¿cuál esmenor?

En este caso se leen dos números desde el teclado y sealmacenan en dos variables: n1 y n2.

El algoritmo requiere dos decisiones, la primera está dada por lacondición:

n1 = n2 ?

Si esta condición es verdadera muestra un mensaje, si no lo esdebe tomar otra decisión con base en la condición:

Si NoCondición 1

Si NoCondición 2

Si NoCondición 3

Acción_1 Acción_2 Acción_3 Acción_1

Page 127: Disenio Algoritmos

127

3. Algoritmos

n1 > n2 ?

Si esta condición es verdadera mostrará un resultado, si es falsaotro.

En el cuadro 34 se presenta la solución en notación depseudocódigo, los diagramas de flujo y N-S se presentan en lasfiguras 39 y 40.

Cuadro 34. Pseudocódigo del algoritmo comparar números

1. Inicio2. Entero: n1, n23. Leer n1, n24. Si n1 = n2 entonces5. Escribir “números iguales”6. Si no7. Si n1 > n2 entonces8. Escribir n1, “Mayor”9. Escribir n2, “Menor”10. Si no11. Escribir n2, “Mayor”12. Escribir n1, “Menor”13. Fin si14. Fin si15. Fin algoritmo

Para verificar la corrección del algoritmo se hacen tres pruebas.En la primera ejecución se introduce el número 3 para cada una delas variables, en consecuencia al evaluar la primera condición (línea4) se obtiene el valor verdadero y se muestra el mensaje “númerosiguales” (línea 5). En la segunda ejecución se ingresan los números5 y 2, esta vez la primera condición no se cumple y la ejecucióncontinúa en la línea 7 donde se encuentra con otra condición, ésta

Page 128: Disenio Algoritmos

128

Diseño de algoritmos

sí se cumple y por ende se ejecutan las líneas 8 y 9. En la terceraejecución se introducen los números 6 y 8, al evaluar la primeracondición ésta no se cumple, salta a la línea 7 y evalúa la segundacondición, dado que ésta también es falsa, se ejecutan las líneas11 y 12.

Figura 39. Diagrama de flujo del algoritmo comparar números

Inicio

Entero: n1, n2

n1, n2

n1 = n2 Si

No

“Númerosiguales”

n1 > n2 Si

No

n2, “Mayor”n1, “Menor”

N1, “Mayor”n2, “Menor”

Fin

Page 129: Disenio Algoritmos

129

3. Algoritmos

Figura 40. Diagrama N-S del algoritmo comparar números

Los resultados obtenidos en las pruebas del algoritmo se muestranen el cuadro 35.

Cuadro 35. Pseudocódigo del algoritmo comparar números

Ejecución n1 n2 Salida

1 3 3 Números iguales

2 5 2 5 Mayor2 Menor

3 6 8 8 Mayor6 Menor

Ejemplo 14. Calcular aumento de sueldo

La empresa La Generosa S.A desea aumentar el sueldo a susempleados, para ello ha establecido las siguientes condiciones:quienes ganan hasta $ 800.000 tendrán un incremento del 10%,quienes devengan más de $ 800.000 y hasta 1’200.000 recibirán

Si Non1 = n2

Si Non1 > n2

Inicio

Entero n1, n2

Leer n1, n2

Escribir“Números iguales”

Escribir n1, “mayor” Escribir n2, “mayor”

Escribir n2, “menor” Escribir n1, “menor”

Fin algoritmo

Page 130: Disenio Algoritmos

130

Diseño de algoritmos

un aumento del 8% y los demás del 5%. Se requiere un algoritmoque calcule el valor del aumento y el nuevo salario para cadaempleado.

Para comprender el problema considérese los siguientes casos:

Un empleado devenga $ 700.000; dado que este valor esinferior a $ 800.000.oo tendrá un incremento del 10%, por tanto:

Aumento = 700.000 * 10 / 100 = 70.000Nuevo sueldo = 700.000 + aumentoNuevo sueldo = 770.000

Otro empleado devenga $ 1’000.000; este valor es superior a800.000 e inferior a 1’200.000, por tanto tendrá un incremento del8%, en consecuencia:

Aumento = 1’000.000 * 8 / 100 = 80.000Nuevo sueldo = 1’000.000 + aumentoNuevo sueldo = 1’080.000

Un tercer empleado tiene un sueldo de 1’500.000, como estevalor es superior a 1’200.000 el porcentaje de aumento es del 5%,se tiene que:

Aumento = 1’500.000 * 5 / 100 = 75.000Nuevo sueldo = 1’500.000 + aumentoNuevo sueldo = 1’575.000

De esto se desprende que:

Entradas: sueldo (sue)Salida: valor aumento (aum) y nuevo sueldo (nsue)Cálculos: aumento = sueldo * porcentaje (por)

nuevo sueldo = sueldo + aumento

El diseño de la solución en notación pseudocódigo se presentaen el cuadro 36.

Page 131: Disenio Algoritmos

131

3. Algoritmos

Cuadro 36. Pseudocódigo del algoritmo nuevo sueldo

1. Inicio2. Real: sue, por, aum, nsue3. Leer sue4. Si sue <= 800000 entonces5. por = 106. Si no7. Si sue <= 1200000 entonces8. por = 89. Si no10. por = 511. Fin si12. Fin si13. aum = sue * por /10014. nsue = sue + aum15. Escribir “Aumento:”, aum16. Escribir “Nuevo sueldo:”, nsue17. Fin algoritmo

El diagrama de flujo se presenta en la figura 41 y en diagrama N-S en la figura 42.

Page 132: Disenio Algoritmos

132

Diseño de algoritmos

Figura 41. Diagrama de flujo del algoritmo nuevo sueldo

Inicio

Real: sue, por, aum, nsue

sue

sue <=800000

Si

No

Si

No

“Aumento:”, aum,“Nuevo sueldo:”, nsue

Fin

por = 10

sue <=1200000 por = 8

por = 5

aum = sue * por /100

nsue = sue + aum

Page 133: Disenio Algoritmos

133

3. Algoritmos

Figura 42. Diagrama N-S del algoritmo nuevo sueldo

Para verificar que el algoritmo funciona correctamente se pruebacon los datos que se analizó anteriormente. Los resultados de estaprueba se muestran en el cuadro 37.

Cuadro 37. Verificación del algoritmo nuevo sueldo

Ejec. sue por aum nsue Salida

1 700.000 10 70.000 770.000Aumento: 70.000

Nuevo sueldo:770.000

2 1’000.000 8 80.000 1’080.000Aumento: 80.000

Nuevo sueldo:1’080.000

3 1’500.000 5 75.000 1’575.000Aumento: 75.000

Nuevo sueldo:1’575.000

Si Nosue <= 800000

Si Nosue <= 12000000

Inicio

Real: sue, por, aum, nsue

Leer sue

por = 10

por = 8 por = 5

aum = sue * por / 100

nsue = sue + aum

Escribir “Aumento: “, aum

Escribir “Nuevo sueldo:”, nsue

Fin algoritmo

Page 134: Disenio Algoritmos

134

Diseño de algoritmos

4.2.6 Más ejemplos de decisiones

Ejemplo 15. Selección de personal

Una empresa desea contratar un profesional para cubrir unavacante, los requisitos para ser considerado elegible son: serprofesional y tener entre 25 y 35 años inclusive, o contar conformación académica de especialista o superior en cuyo caso no setiene en cuenta la edad. Se requiere un algoritmo que evalúe losdatos de cada candidato e informe si es apto o no apto.

Siguiendo la estrategia propuesta en este documento, seanalizan casos particulares, se identifican los datos y lasoperaciones, para luego proceder a diseñar una solución genérica.

A la convocatoria se presenta Pedro, quien tiene formación depregrado en administración de empresas y 28 años de edad. Alconfrontar sus datos con las condiciones del problema se encuentraque su edad está en el rango establecido como válido y cuenta conformación de pregrado, por lo tanto es considerado apto.

Luego se presenta Lucía, quien es contador público y tienen unaespecialización en alta gerencia y 38 años. Al revisar lascondiciones que debe cumplir se encuentra que la edad está fuerade rango, pero al contar con especialización es catalogada comoapta.

Finalmente, se presenta Carlos, de 45 años y con formación depregrado en economía. Al examinar el cumplimiento de la primeracondición se encuentra que su edad está por encima del límiteestablecido, esta situación podría ser ignorada si contara conformación especializada, pero se verifica que su nivel de estudioses de pregrado; por tanto es declarado no apto.

Ahora, se trata de diseñar un algoritmo que tome esta decisiónde forma automática para cualquier persona que desee saber sicumple los requisitos.

Page 135: Disenio Algoritmos

135

3. Algoritmos

En este caso se requiere tres datos de entrada: el nombre, laedad y la formación académica. Para minimizar la posibilidad deerror al ingresar el tercer dato, se presenta al usuario un menú delcual seleccione la opción que corresponda:

Formación académica1. Tecnológico2. Profesional3. Especialista4. Magister5. Doctor

De esta manera la condición se establece sobre datosnuméricos. El algoritmo para solucionar este problema se presentecomo diagrama de flujo en la figura 43.

Los resultados de la verificación del algoritmo se presentan en elcuadro 38.

Cuadro 38. Verificación del algoritmo selección de personal

Ejec. Nombre Edad estudio Salida

1 Pedro 28 2 Pedro es apto2 Lucía 38 3 Lucía es apta3 Carlos 45 2 Carlos no es apto

Page 136: Disenio Algoritmos

136

Diseño de algoritmos

Figura 43. Diagrama de flujo para seleccionar un empleado

Inicio

Entero: edad, estudioCadena: nombre

nombre, edad

edad >= 25 Yedad <= 35 Yestudio = 2 Oestudio >= 3

Fin

Si

No

nombre, “es apto(a)”

nombre “no es apto(a)”

“Formación académica:”1. Tecnólogo2. Profesional3. Especialista4. Magister5. Doctor

estudio

Page 137: Disenio Algoritmos

137

3. Algoritmos

Ejemplo 16. Auxilio de transporte

Se requiere un algoritmo que decida si un empleado tienederecho al auxilio de transporte. Se conoce que todos losempleados que devengan un salario menor o igual a dos salariosmínimos legales tienen derecho a este rubro.

Para identificar los datos del problema y la forma de solucionarlose proponen dos ejemplos:

Supóngase un salario mínimo legal de $ 600.000.oo y Josédevenga un salario mensual de $750.000.oo. El planteamiento delproblema estipula que tiene derecho al auxilio si su salario esmenor o igual a dos veces el salario mínimo legal; entonces:

750.000.oo <= 2 * 600.000.oo750.000.oo <= 1’200.000.oo

Esta expresión relacional es verdades; por tanto, José tienederecho al auxilio de transporte.

Luis devenga mensualmente $ 1’300.000.oo ¿tiene derecho alauxilio?

1’300.000.oo <= 2 * 600.000.oo1’300.000.oo <= 1’200.000.oo

La condición no se cumple; en consecuencia, Luis no recibeauxilio de transporte.

El diseño de la solución a este problema se propone mediante eldiagrama N-S de la figura 44.

Page 138: Disenio Algoritmos

138

Diseño de algoritmos

Figura 44. Diagrama N-S del algoritmo auxilio de transporte

Los resultados de la verificación de este algoritmo, con losejemplos propuestos se muestran en el cuadro 39.

Cuadro 39. Verificación del algoritmo auxilio de transporte

Ejec. Sml nombre sueldosueldo <=

2 * sml Salida

1 515.000 José 750.000 Verdadero José recibe auxilio detransporte

2 515.000 Luis 1’200.000 Falso Luis NO recibe auxiliode transporte

Ejemplo 17. Nota definitiva

En la universidad Buena Nota se requiere un algoritmo paracalcular la nota definitiva y decidir si el estudiante aprueba oreprueba la asignatura. La nota final se obtiene a partir de dosnotas parciales y un examen final, donde el primer parcial equivaleal 30%, el segundo parcial al 30% y el examen final al 40%, y la notamínima aprobatoria es 3.0.

sueldo <= 2 * smlSi No

Inicio

Cadena: nombreReal: sml, sueldo

Leer sml, nombre, sueldo

Escribir nombre, “recibeauxilio de transporte”

Escribir nombre, “NO recibeauxilio de transporte”

Fin algoritmo

Page 139: Disenio Algoritmos

139

3. Algoritmos

Si el promedio de los dos parciales es menor a 2.0, el estudianteno puede presentar examen final y pierde la materia por bajopromedio, en este caso la nota definitiva es el promedio de losparciales, si el promedio es igual o superior a 2.0 puede presentarel examen final.

Si la nota del examen final es inferior a 2.0, se desconoce lasnotas parciales y la nota definitiva es la obtenida en el examenfinal. Si la nota es igual o superior a 2.0 se calcula la nota definitivaaplicando los porcentajes mencionados a los parciales y al final.

Si la nota definitiva es igual o superior a 3.0 el estudianteaprueba la asignatura; si es inferior a 3.0 pierde la materia; sinembargo, puede habilitarla, siempre y cuando en el examen finalobtenga nota mayor o igual a 2.0, en este caso la nota definitivaserá la que obtenga en la habilitación.

Para comprender mejor esta situación considérese estos casos:

Raúl obtuvo las siguientes notas:

Parcial 1 = 2.2Parcial 2 = 1.6Promedio = 1.9Nota definitiva = 1.9

Siguiendo la información del problema Raúl no puede presentarexamen final dado que el promedio de los dos parciales en menor a2.0; en consecuencia la nota final es el promedio de los parciales yno puede presentar ni examen final ni habilitación. Pierde laasignatura.

Karol obtuvo las siguientes notas:

Parcial 1 = 3.4Parcial 2 = 2.0Promedio = 2.7

Page 140: Disenio Algoritmos

140

Diseño de algoritmos

Puede presentar examen final

Examen final = 1.5

Dado que su nota de examen final es menor a 2.0, ésta pasa aser la nota definitiva y no puede habilitar.

Las notas de Carlos fueron:

Parcial 1 = 3.5Parcial 2 = 2.5Promedio = 3.0

Puede presentar examen final

Examen final = 2.2

Nota definitiva = 3.5 * 30% + 2.5 * 30% + 2.2 * 40% = 2.7

Carlos no aprueba la materia, pero como tiene nota mayor a 2.0en el examen final puede habilitar

Habilitación = 3.5Nota definitiva = 3.5. Aprueba la materia

Ana, por su parte, obtuvo las siguientes notas:

Parcial 1 = 3.7Parcial 2 = 4.3

Promedio = 4.0

Presenta examen final

Examen final = 3.5

Nota definitiva = 3.8

Page 141: Disenio Algoritmos

141

3. Algoritmos

Por lo tanto, Ana aprueba la materia.

Ahora, que se comprende bien el problema ya se puede diseñarun algoritmo para solucionar cualquier caso. Este algoritmo sepresenta en el cuadro 40.

Cuadro 40. Pseudocódigo algoritmo Nota Definitiva

1. Inicio2. Real: p1, p2, ef, nd, prom, nh3. Leer p1, p24. prom = (p1 + p2)/25. Si prom < 2.0 entonces6. nd = prom7. Escribir “pierde materia por bajo promedio”8. si no9. Leer ef10. Si ef < 2.0 entonces11. nd = ef12. Escribir “Pierde materia y no puede habilitar”13. si no14. nd = p1 * 0.3 + p2 * 0.3 + ef * 0.415. Si nd >= 3.0 entonces16. Escribir “Ganó la materia”17. si no18. Escribir “Perdió la materia pero puede habilitar”19. Leer nh20. nd = nh21. Si nh >= 3.0 entonces22. Escribir “Ganó la habilitación”23. si no24. Escribir “Perdió la habilitación”25. Fin si

Page 142: Disenio Algoritmos

142

Diseño de algoritmos

Cuadro 39. (Continuación)

26. Fin si27. Fin si28. Fin si29. Escribir “Nota definitiva:”, nd30. Fin algoritmo

En este algoritmo se declaran variables para almacenar las dosnotas parciales, el promedio, el examen final, la nota definitiva y lanota de habilitación. Para comenzar se leen los dos parciales, secalcula el promedio y se evalúa (línea 5), si éste es menor a 2.0, seasigna a la nota definitiva, se muestra un mensaje, la nota y elalgoritmo termina.

Si el promedio es superior a 2.0 se lee el examen final y seevalúa (línea 10) si es menor a 2.0 se asigna como definitiva, semuestra un mensaje y salta al final del algoritmo. Si el examen finales superior a 2.0 se hace el cálculo de la nota definitiva y se decidesi aprueba o pierde, si pierde puede presentar habilitación, esta esla última oportunidad de aprobar la asignatura.

En el cuadro 41 se muestra tres conjuntos de datos con los quese prueba el algoritmo y los resultados obtenidos.

Cuadro 41. Verificación del algoritmo Nota Definitiva

Ejec P1 P2 prom ef nd nh Salida

1 2.2 1.6 1.9 - 1.9Perdió la materia por bajo

promedioNota definitiva: 1.9

2 3.4 2.0 2.7 1.5 1.5 Pierde materiaNota definitiva: 1.5

3 3.5 2.5 3.0 2.2 2.7 3.5

Perdió la materia pero puedehabilitar

Ganó la habilitaciónNota definitiva: 3.5

4 3.7 4.3 4.0 3.5 3.8 Ganó la materiaNota definitiva: 3.8

Page 143: Disenio Algoritmos

143

3. Algoritmos

Ejemplo 18. El hermano mayor

Este algoritmo lee los nombres y las edades de tres hermanos ydecide cuál es el nombre del hermano mayor.

Supóngase los siguientes casos:

José, Luis y María son hermanos, el primero tiene 19 años, elsegundo 15 y la tercera 23. ¿Cuál de ellos es el mayor?Evidentemente, María.

Carlos tiene 32, rocío tiene 28 y Jesús tiene 25. En este caso, elmayor es Carlos.

Martha tiene 8 años, Ana 10 y Camilo 4. De los tres, Ana esmayor.

Ahora se trata de diseñar un algoritmo para que ésta decisión latome un programa de computador. Es necesario declarar tresvariables de tipo cadena y relacionarlas con tres de tipo numérico,así se comparan las edades y se muestra el nombre comoresultado. El diagrama de flujo de este algoritmo se presenta en lafigura 45.

Para verificar que el algoritmo es correcto se revisa paso a pasoregistrando los valores correspondientes a las variables y la salidapor pantalla. En el cuadro 42 se muestran los datos de prueba y losresultados obtenidos.

Page 144: Disenio Algoritmos

144

Diseño de algoritmos

Figura 45. Diagrama de flujo del algoritmo hermano mayor

Inicio

Entero: edad1, edad2, edad3Cadena: nom1, nom2, nom3

nom1, nom2, nom3edad1, edad2, edad3

edad1 > edad2Y

edad1 > edad3

Si

No

“El mayor es:”,nom1

Fin

edad2 > edad1Y

edad2 > edad3

Si

No

“El mayor es:”,nom2

“El mayor es:”,nom3

Page 145: Disenio Algoritmos

145

3. Algoritmos

Cuadro 42. Verificación algoritmo del hermano mayor

Ejec. nom1 edad1 nom2 edad2 nom3 edad3 Salida

1 José 19 Luis 15 María 23 María2 Carlos 32 Rocío 28 Jesús 25 Carlos3 Martha 8 Ana 10 Camilo 4 Ana

Ejemplo 19. Descuento a mayoristas

El almacén Gran Distribuidor vende camisas al por mayor y hacedescuentos según la cantidad facturada: en cantidades superioreso iguales a 1000 unidades hace el 10% de descuento; entre 500 y999, el 8%; entre 200 y 499, el 5%; y en menos de 200 no haydescuento. Dada la cantidad facturada y el precio unitario, serequiere calcular el descuento que se le hace a un cliente y el valora pagar.

Antes de proceder con el diseño del algoritmo es convenientecomprender bien el problema a partir de un caso particular pararealizar los cálculos.

Si una camisa tiene un costo de $ 80.000 y un cliente hace unpedido de 350 unidades, entonces tiene derecho a un descuentodel 5%:

Unidades: 350Valor unitario: 80.000Valor total = 350 * 80.000 = 28.000.000Porcentaje descuento: 5%Valor descuento = 28.000.000 * 5 / 100 = 1.400.000Valor a pagar = 28.000.000 – 1.400.000 = 26.600.000

En este caso el cliente tendrá un descuento por valor de $1.400.000 y pagará en total $ 26.600.000.

Ahora se puede identificar los datos de entrada, de salida y losprocesos a realizar:

Page 146: Disenio Algoritmos

146

Diseño de algoritmos

Entrada: cantidad, valor unitarioSalida: valor descuento, valor a pagarProcesos:

Total = cantidad * valor unitarioValor descuento = total * porcentaje descuento / 100Valor a pagar = total - descuento

La solución se presenta mediante diagrama N-S en la figura 46.

Figura 46. Diagrama N-S algoritmo descuento a mayoristas

can >= 1000Si No

Inicio

Entero: canReal: vunit, pdes, vtot, vdes, vpag

Leer can, vunit

vtot = can * vunit

pdes = 10 can >= 500Si No

pdes = 8

pdes = 5 pdes = 0

can >= 200Si No

vdes = vtot * pdes / 100

vpag = vtot - vdes

Escribir “Descuento: ”, vdes

Escribir “Valor a pagar: ”, vpag

Fin algoritmo

Page 147: Disenio Algoritmos

147

3. Algoritmos

En el cuadro 43 se muestra los datos de prueba de estealgoritmo.

Cuadro 43. Verificación algoritmo descuento a mayoristaEjec. can vunit Vtot pdes vdes Vpag Salida

1 350 80000 28000000 5 1400000 26600000

Descuento1400000

Pagar26600000

2 600 20000 12000000 8 960000 11040000

Descuento960000

Pagar11040000

3 1100 30000 33000000 10 3300000 29700000

Descuento3300000

Pagar29700000

Ejemplo 20. Depósito a término

El banco Buena Paga ofrece diferentes tasas de interés anualpara depósitos a término dependiendo del tiempo por el que sehagan. Si el depósito es por un periodo menor o igual a seis mesesla tasa es del 8% anual; entre siete y 12 meses, 10%; entre 13 y 18,12%; entre 19 y 24, 15%; y para periodos superiores a 24 meses el18%. Se requiere un algoritmo para determinar cuánto recibirá uncliente por un depósito, tanto por concepto de interés como entotal.

Considérese algunos casos particulares:

Caso 1: Pedro Pérez hace un depósito de un millón de pesos ($1’000.000.oo) durante cinco meses. Según la información que seda en el planteamiento del problema, el bando le pagará una tasade interés del 8% anual.

Dado que la tasa de interés está expresada en años y el depósitoen meses, lo primero que hay que hacer es pasarla a meses, paraello se divide sobre 12.

Page 148: Disenio Algoritmos

148

Diseño de algoritmos

Tasa interés mensual = 8 / 12Tasa interés mensual = 0.667

Ahora, se tienen los siguientes datos:

Capital = 1000000.ooTiempo = 5Tasa interés mensual = 0.667 %

Para conocer cuánto recibirá por concepto de interés se aplica alvalor del capital el porcentaje que se acaba de obtener y semultiplica por el número de periodos, en este caso cinco meses, dela forma:

Interés = 1000000.oo * (0.667 / 100) * 5Interés = 33350

Y para obtener el valor futuro de la inversión, se suma el interésal capital:

Valor futuro = 1000000 + 33350Valor futuro = 1033350

Caso 2: José López desea depositar cinco millones por unperiodo de un año y medio (18 meses). En este caso, el banco leofrece un interés de 12% anual.

La tasa de interés convertida a meses es de:

Tasa interés mensual = 12 / 12 = 1

Entonces, los datos son:

Capital = 5000000Tasa interés mensual = 1 %Tiempo = 18

De dónde se obtiene:

Page 149: Disenio Algoritmos

149

3. Algoritmos

Interés = 5000000 * (1 / 100) * 18Interés = 900000

Valor futuro = capital + interésValor futuro = 5000000 + 900000Valor futuro = 5900000

Con base en los dos ejemplos se concluye que:

Datos de entrada: capital, tiempoDatos de salida: interés, valor futuroProcesos:

Determinar la tasa de interés anual (es una decisión)Interés mensual = tasa interés anual / 12Interés = capital * tasa interés mensual / 100 * tiempoValor futuro = capital + interés

El algoritmo de solución a este ejercicio se presenta, en notaciónde pseudocódigo, en el cuadro 44.

En este algoritmo se utiliza las estructuras de decisión sianidadas para determinar el porcentaje correspondiente a la tasa deinterés anual, dependiendo del tiempo. Se aplica decisionesanidadas y no la estructura según sea, ya que ésta sólo puedeutilizarse para evaluar la condición de igualdad entre el contenidode la variable y un valor constante, pero no para relaciones demayor o menor.

En el cuadro 45 se muestra los resultados de verificar elalgoritmo con los datos utilizados en los dos ejemplos desarrolladosal comienzo de este ejercicio, más un tercero por valor de 8000000a 36 meses.

Page 150: Disenio Algoritmos

150

Diseño de algoritmos

Cuadro 44. Pseudocódigo algoritmo depósito a término

1. Inicio2. Real: capital, tasaintanual, tasaintmes, interés, valfuturo3. Entero: tiempo4. Leer capital, tiempo5. Si tiempo < 1 entonces6. Escribir “Tiempo no valido”7. tasaintanual = 08. Si no9. Si tiempo <= 6 entonces10. tasaintanual = 811. Si no12. Si tiempo <= 12 entonces13. tasaintanual = 1014. Si no15. Si tiempo <= 18 entonces16. tasaintanual = 1217. Si no18. Si tiempo <= 24 entonces19. tasaintanual = 1520. Si no21. tasaintanual = 1822. Fin si23. Fin si24. Fin si25. Fin si26. Fin si27. tasaintmes = tasaintanual / 1228. interés = capital * tasaintmes / 100 * tiempo29. valfuturo = capital + interés30. Escribir “Interes = ”, interés31. Escribir “Valor futuro = ”, valfuturo32. Fin algoritmo

Page 151: Disenio Algoritmos

151

3. Algoritmos

Cuadro 45. Verificación del algoritmo depósito a término

Capital Tiempo tasaintanual tasaintmes interés Valfuturo

1000000 5 8 0.667 33350 10333505000000 18 12 1 900000 59000008000000 36 18 1.5 4320000 12320000

Ejemplo 21. Empresa editorial

Una empresa editorial tiene tres grupos de empleados:vendedores, diseñadores y administrativos. Se requiere calcular elnuevo sueldo para los empleados teniendo en cuenta que seincrementarán así: administrativos 5%, diagramadores 10% yvendedores 12%.

Como un caso particular se calcula el nuevo sueldo de lasecretaria, quien devenga actualmente un sueldo de $ 600.000.oo.Su cargo es de tipo administrativo, por tanto le corresponde unincremento del 5%.

Cargo: secretariaTipo de cargo: administrativoSueldo actual: 600.000.ooPorcentaje incremento: 5%

Por lo tanto

Valor incremento: 30.000.ooNuevo sueldo: 630.000.oo

En este ejercicio se tiene como dato de entrada el sueldo actualy el tipo de cargo que desempeña (administrativo, diseñador,vendedor), ya que el porcentaje de incremento depende del cargo yse aplica sobre el valor del sueldo vigente. El algoritmo parasolucionar este problema se presenta en notación de diagrama deflujo en la figura 47.

Page 152: Disenio Algoritmos

152

Diseño de algoritmos

Figura 47. Diagrama de flujo del algoritmo Empresa editorial

Inicio

Real: sdoactual, nuevosdo, ptjeEntero: tipocargo

Tipocargo,sdoactual

Fin

“Tipo de cargo:1. Administrativo2. Diagramador3. Vendedor”

tipocargo =

1

2

3No

ptje = 5/100

ptje = 10/100

ptje = 12/100

“Nuevo sueldo =“,nuevosdo

Nuevosdo = sdoactual+ ( sdoactual * ptje)

Si

“Cargo no valido”

Page 153: Disenio Algoritmos

153

3. Algoritmos

En este algoritmo se declaran tres variables de tipo real parasueldo actual, nuevo sueldo y porcentaje de incremento, y unavariable entera para capturar la opción correspondiente al tipo decargo que tiene el empleado. Se toma una decisión (múltiple) sobreel tipo de cargo y se establece el porcentaje a aplicar, se realiza elcálculo y se muestra el nuevo sueldo. Si la opción seleccionadacomo cargo no está entre 1 y 3 se muestra un mensaje de error.

Se proponen tres conjuntos de datos para verificar si el algoritmo escorrecto. Los resultados de las ejecuciones se presentan en elcuadro 46.

Cuadro 46. Verificación del algoritmo Empresa editorial

Ejec. tipocargo sdoactual Ptje nuevosdo Salida

1 1 600.000 0.05 630.000 Nuevo sueldo = 630.000

2 2 800.000 0.1 880.000 Nuevo sueldo = 880.000

3 3 700.000 0.12 784.000 Nuevo sueldo = 784.000

4 4 500.000 Cargo no válido

Ejemplo 22. Descuento en motocicleta

La distribuidora de motocicletas Rueda Floja ofrece unapromoción que consiste en lo siguiente: las motos marca Hondatienen un descuento del 5%, las de marca Yamaha del 8% y lasSuzuki el 10%, las de otras marcas el 2%. Se requiere calcular elvalor a pagar por una motocicleta.

Considérense algunos ejemplos particulares de este problema.

Pedro desea comprar una motocicleta Honda cuyo precio es deseis millones de pesos. ¿Cuánto debe pagar en realidad por aquellamoto?

En la descripción del problema se dice que este tipo de motostienen un descuento del 5%, entonces hay que calcular el valor del

Page 154: Disenio Algoritmos

154

Diseño de algoritmos

descuento que se le hará a la moto que desea Pedro; se tienen lossiguientes datos:

Valor moto = 6’000.000.ooPorcentaje descuento = 5/100 (5%)Valor descuento = 6’000.000.oo * 5 / 100 = 300.000.ooValor neto = 6’000.000.oo – 300.000.oo = 5’700.000.oo

Dado que la motocicleta que Pedro desea tiene un descuento del5% el valor neto a pagar es de $ 5’700.000.oo.

Juan quiere comprar una motocicleta Yamaha que tiene unprecio de lista de $ 8’500.000.oo. Dado que esta marca tiene undescuento de 8%, se tiene que:

Valor moto = 8’500.000.ooPorcentaje descuento = 8/100 (8%)Valor descuento = 8’500.000.oo * 8 / 100 = 680.000.ooValor neto = 8’500.000.oo – 680.000.oo = 7’820.000.oo

Por lo tanto, Juan debe pagar la suma de $ 7’820.000.oo por lamotocicleta Yamaha.

Con base en los ejemplos anteriores se puede generalizar elprocedimiento, así:

Porcentaje de descuento = depende de la marca (5%, 8%, 10% o2%)

Valor descuento = valor moto * porcentaje descuentoValor neto = valor moto – valor descuento

En consecuencia los datos a introducir corresponden a: precio delista y la marca de la motocicleta. El algoritmo que soluciona esteproblema se presenta en notación N-S en la figura 48.

Page 155: Disenio Algoritmos

155

3. Algoritmos

Figura 48. Descuento en motocicleta

Para verificar que el algoritmo es correcto se realiza la prueba deescritorio considerando cada una de las alternativas de decisión,como se muestra en el cuadro 47.

Marca =

Inicio

Cadena: marcaReal: precio, pordesc, valdesc, valneto

Leer marca, precio

valdesc = precio * pordesc / 100

valneto = precio - valdesc

Escribir “Motocicleta: ”, marca

Escribir “Precio: ”, precio

Fin algoritmo

Escribir “Valor del descuento: ”, valdesc

Escribir “Valor a pagar: ”, valneto

“Honda” “Yamaha” “Suzuki” Otro

pordesc = 5 pordesc = 8 pordesc = 10 pordesc = 2

Page 156: Disenio Algoritmos

156

Diseño de algoritmos

Cuadro 47. Verificación del algoritmo descuento en motocicleta

Ejec. Marca precio pordesc Valdesc valneto Salida

1 Honda 6’000.000 5 300.000 5’700.000

Motocicleta: HondaPrecio: 6’000.000Valor deldescuento: 300.000Valor a pagar:5’700.000

2 Yamaha 8’500.000 8 680.000 7’820.000

Motocicleta:YamahaPrecio: 8’500.000Valor deldescuento: 680.000Valor a pagar:7’820.000

3 Suzuki 3’800.000 10 380.000 3’420.000

Motocicleta: SuzukiPrecio: 3’800.000Valor deldescuento: 380.000Valor a pagar:3’420.000

4 Kawasaki 5’000.000 2 100.000 4’900.000

Motocicleta:KawasakiPrecio: 5’000.000Valor deldescuento: 100.000Valor a pagar:4’900.000

Ejemplo 23. Comisión de ventas

La empresa V&V paga a sus vendedores un salario básico másuna comisión sobre las ventas efectuadas en el mes, siempre queéstas sean mayores a $ 1.000.000. Los porcentajes debonificación son:

Ventas mayores a $ 1.000.000 y hasta $ 2.000.000 = 3%Ventas mayores a $ 2.000.000 y hasta $ 5.000.000 = 5%Ventas mayores a $ 5.000.000 = 8%

Page 157: Disenio Algoritmos

157

3. Algoritmos

Se desea conocer cuánto corresponde al vendedor por comisióny cuánto recibirá en total en el mes.

Siguiendo el enfoque que se ha propuesto para este libro, loprimero es considerar algunos ejemplos que permitan comprenderel problema y la forma de solucionarlo. En este orden de ideas seplantean cuatro ejemplos:

Jaime fue contratado con un salario básico de $ 600.000.oo ydurante el último mes vendió la suma de $ 1’200.000.oo. Dado quevendió más de un millón tiene derecho a comisión; entonces, elsiguiente paso es decidir qué porcentaje le corresponde. En ladescripción del ejercicio se establece que si las ventas están entreuno y dos millones el vendedor recibirá una comisión del 3% sobreel valor de las ventas. Esto es:

Vendedor(a): JaimeSalario básico: 600.000.ooValor ventas: 1’200.000.ooPorcentaje comisión: 3%Valor comisión = 1’200.000 * 3 / 100 = 36.000Sueldo del mes = 600.000 + 36.000 = 636.000

Jaime recibirá $ 36.000 por concepto de comisión y el sueldototal será de $ 636.000.oo

Susana tiene un salario básico de $ 700.000.oo y en el últimomes sus ventas fueron por valor de $ 3’500.000.oo. Este caso,confrontando los requerimientos del problema, ella tiene derecho auna comisión del 5%. Los resultados del ejercicio para Susana son:

Vendedor(a): SusanaSalario básico: 700.000.ooValor ventas: 3’500.000.ooPorcentaje comisión: 5%Valor comisión = 3’500.000 * 5 / 100 = 175.000Sueldo del mes = 700.000 + 175.000 = 875.000

Page 158: Disenio Algoritmos

158

Diseño de algoritmos

Susana ha conseguido una comisión de ventas por valor de $175.000 para un sueldo total de $ 875.000.oo.

Carlos tiene un sueldo básico de $ 600.000.oo y en el últimomes sus ventas fueron de $ 950.000.oo. Como no alcanzó a venderel millón no recibirá comisión.

Vendedor(a): CarlosSalario básico: 600.000.ooValor ventas: 950.000.ooPorcentaje comisión: NingunoValor comisión = NingunaSueldo del mes = 600.000

Carlos recibe únicamente el salario básico.

Rocío es conocida como la mejor vendedora de la empresa, tieneasignado un salario básico de $ 800.000.oo. En el último mes logróvender siete millones de pesos.

Vendedor(a): RocíoSalario básico: 800.000.ooValor ventas: 7’000.000.ooPorcentaje comisión: 8%Valor comisión = 7’000.000 * 8 / 100 = 560.000Sueldo del mes = 800.000 + 560.000 = 1’360.000

Rocío obtiene una comisión de $ 560.000.oo y un sueldo totalde $ 1’360.000.oo

De los anteriores ejemplos se identifica los datos de entrada ylos cálculos a realizar, los datos de salida los especifica elplanteamiento del ejercicio: vendedor, comisión y sueldo total. Lasolución algorítmica se presenta en el cuadro 48 en la notación depseudocódigo.

Los datos a ingresar son:

Nombre del vendedorSueldo básicoValor de ventas

Page 159: Disenio Algoritmos

159

3. Algoritmos

Los cálculos a realizar son:Valor comisión = valor ventas * porcentaje comisión (3, 5, 8) /

100Sueldo mes = sueldo básico + valor comisión

Cuadro 48. Algoritmo comisión de ventas

1. Inicio2. Cadena: nom3. Real: sbasico, venta, pcomi, vcomi, smes4. Leer nom,sbasico,venta5. Si venta > 1000000 entonces6. Si venta <= 2000000 entonces7. pcomi = 38. Si no9. Si venta <= 5000000 entonces10. pcomi = 511. Si no12. pcomi = 813. Fin si14. Fin si15. Si no16. pcomi = 017. Fin si18. vcomi = venta * pcomi / 10019. smes = sbasico + vcomi20. Escribir “Vendedor(a):”, nom21. Escribir “Comisión:”, vcomi22. Escribir “Sueldo total:”, smes23. Fin algoritmo

Para verificar si el algoritmo funciona correctamente se ejecutael pseudocódigo, paso a paso, con los datos de los ejemplosexplicados previamente para los cuales ya se hicieron los cálculos y

Page 160: Disenio Algoritmos

160

Diseño de algoritmos

se conoce los resultados. Los resultados se presentan en el cuadro49.

Cuadro 49. Verificación del algoritmo comisión de ventas

Nom sbasico Venta pcomi vcomi smes Salida

Jaime 600000 1200000 3 36000 636000Vendedor(a): JaimeComisión: 36000Sueldo total: 636000

Susana 700000 3500000 5 175000 875000Vendedor(a): SusanaComisión: 175000Sueldo total: 875000

Carlos 600000 950000 0 0 600000Vendedor(a): CarlosComisión: 0Sueldo total: 600000

Rocío 800000 7000000 8 560000 1360000Vendedor(a): RocíoComisión: 560000Sueldo total: 1360000

Ejemplo 24. Factura del servicio de energía

Se requiere un algoritmo para facturar el servicio de energíaeléctrica. El consumo del mes se determina por diferencia delecturas. El valor del kilovatio (kW*) es el mismo para todos losusuarios, pero se hace un descuento para algunos estratos, así:

Estrato 1: 10%Estrato 2: 6%Estrato 3: 5%

Para todos los estratos se aplica un descuento del 2% si elconsumo es superior a 200 kW. Se desea que el programa muestreel consumo y el valor a pagar por éste servicio. (El planteamiento de

* kW es el símbolo de kilovatio. Un kilovatio es una unidad de medida deelectricidad equivalente a 1000 vatios. Equivale, también, a la energía producida oconsumida por una potencia de un kW durante una hora. (Círculo EnciclopediaUniversal)

Page 161: Disenio Algoritmos

161

3. Algoritmos

este ejercicio es meramente didáctico y no tiene relación algunacon la facturación de este servicio en el mundo real).

En una empresa real se mantiene los registros de las lecturas ypor ende sólo es necesario hacer una lectura y se hace la diferenciacon la última que se tenga almacenada, pero en este ejercicio esnecesario leer los dos datos para calcular la diferencia. Paracomprender mejor este planteamiento obsérvese los siguientesejemplos:

José es un usuario del servicio de energía que reside en estrato1, el mes anterior su medidor registró 12345 y en este mes, 12480.Dado que está en estrato 1 recibirá un descuento del 10%, y si elvalor del kW es de $ 500 el consumo y el valor a pagar se obtienende la siguiente forma:

Usuario: JoséLectura 1: 12345Lectura 2: 12480Consumo: 12480 – 12345 = 135Valor kW: 500Valor consumo: 67500Estrato: 1Porcentaje de descuento: 10%Valor del descuento = 67500 * 10 / 100 = 6750Valor a pagar = 67500 – 6750 = 60750

De este ejemplo se puede identificar los datos y los procesosnecesarios para solucionar el ejercicio. Los datos de entrada son:

Usuario,Estrato socioeconómico,Lectura 1,Lectura 2 yvalor del kW.

Page 162: Disenio Algoritmos

162

Diseño de algoritmos

El porcentaje a aplicar como descuento es una decisión basadaen el estrato socio-económico del usuario. Los valores a calcularson:

Consumo = lectura 2 – lectura 1Valor consumo = consumo * valor kWValor descuento = valor consumo * porcentaje descuento / 100Valor a pagar = valor consumo – valor descuento

El paso siguiente es organizar las acciones en forma algorítmica.El diagrama de flujo de la solución a este ejercicio se presenta en lafigura 49.

Para verificar que la solución es correcta se ejecuta paso a paso,se introduce los datos que se utilizaron para analizar el problema yse confrontan los resultados generados por el algoritmo con losobtenidos manualmente.

Ejemplo 25. Calculadora

Este algoritmo lee dos números y un operador aritmético, aplicala operación correspondiente y muestra el nombre de la operación yel resultado.

En este caso se trata de identificar el operador que el usuario haintroducido y realizar la operación correspondiente. Los operadoresaritméticos a tener en cuenta son:

+ suma- resta* multiplicación/ división

Por ejemplo:

Primer número: 3Segundo número: 4Operador: +

Page 163: Disenio Algoritmos

163

3. Algoritmos

Figura 49. Facturación servicio de energía

Inicio

Real: vlrkw, pdes, vcons, vdes, vpagEntero: lec1, lec2, cons, estrCadena: usu

usu, estr, lec1,lec2, vlrkwsdoactual

Fin

estr =

1

2

3No

pdes = 10/100

pdes = 6/100

pdes = 5/100

“Usuario: “, usu,“Consumo:”, cons,“Pagar:”, vpag

Si

pdes = 0

cons = lec2 – lec1

vcons = cons * vlrkw

vdes = vcons * pdes

vpag = vcons - vdes

Page 164: Disenio Algoritmos

164

Diseño de algoritmos

El algoritmo debe realizar la operación suma y mostrar elresultado, así:

Suma: 3 + 4 = 7

Otro ejemplo:

Primer número: 6Segundo número: 2Operador: -

El resultado será:

Resta: 6 – 2 = 4

El algoritmo para solucionar este ejercicio requiere una decisiónmúltiple aplicada al operador y en cada alternativa de decisión serealiza la operación correspondiente y se muestra el resultado. Eldiagrama N-S de este algoritmo se presente en la figura 50.

Se declaran las variables: a, b, y r para primer número, segundonúmero y resultado, y ope para el operador. Al hacer la verificacióndel algoritmo, probando todos los operadores, se obtiene losresultados que se muestran en el cuadro 50.

Page 165: Disenio Algoritmos

165

3. Algoritmos

Figura 50. Diagrama N-S del algoritmo Calculadora

Cuadro 50. Verificación del algoritmo calculadora

Ejec a b ope r Salida1 3 4 + 7 Suma: 3 + 4 = 72 6 2 - 4 Resta: 6 – 2 = 43 2 5 * 10 Multiplic: 2 * 5 = 104 27 9 / 3 División: 27 / 9 = 35 8 7 X Operador no válido

ope =

Inicio

Entero: a, b, rCaracter: ope

Leer a, b, ope

r = a + b

Fin algoritmo

‘+’ ‘-‘ ‘*’ Otro

Escribir“Operadorno válido”

r = a - b r = a * b r = a / b

‘/‘

Escribir“Suma:”,a, “+”, b,“=”, r

Escribir“Resta:”,a, “-”, b, “=”,r

Escribir“Multiplic:”,a, “*”, b,“=”, r

Escribir“División:”,a, “/”, b, “=”,r

Page 166: Disenio Algoritmos

166

Diseño de algoritmos

4.2.7 Ejercicios propuestos

Diseñar algoritmos para solucionar los siguientes problemas yrepresentarlos mediante pseudocódigo, diagramas de flujo ydiagramas N-S.

1. Para integrar la selección de baloncesto, además de ser unbuen jugador, es necesario una estatura de 1.70 m comomínimo. Dada la estatura de un aspirante decidir si es apto.

2. Dados dos enteros, se desea saber si alguno de ellos es múltiplodel otro.

3. Dado dos números racionales a/b y d/e se desea saber si sonequivalentes y si no los son, cuál es el mayor y cuál el menor.

4. Una empresa está pagando una bonificación a sus empleadosdependiendo del tiempo de servicio y del estado civil, así: paraempleados solteros: si llevan hasta cinco años, el 2% del sueldo;entre 6 y 10 años el 5%; más de 10 años el 10%. Paraempleados casados: si llevan hasta 5 años, el 5% del sueldo;entre 6 y 10 años el 10%, más de 10 años el 15%.

5. En un almacén se hace un descuento del 8% a los clientes cuyacompra sea superior a un millón y del 5% si es superior$500.000 y menor o igual a un millón ¿Cuánto pagará unapersona por su compra?

6. Se sabe que un año es bisiesto cuando es divisible para cuatro yno para 100 o cuando es divisible para cuatrocientos. Se deseadeterminar si un año n es bisiesto.

7. Se requiere un algoritmo que lea tres números y los ordene deforma ascendente.

8. Se tiene un recipiente cilíndrico de radio r y altura h y una cajade ancho a, largo b y altura c. Se desea saber cuál de ellos tienemayor capacidad de almacenamiento.

Page 167: Disenio Algoritmos

167

3. Algoritmos

9. Un supermercado hace un descuento del 10% por la compra de10 unidades o más del mismo artículo ¿Cuánto deberá pagar uncliente por su compra?

10. Una compañía de seguros abrió una nueva agencia y establecióun programa para captar clientes, que consiste en lo siguiente:si el monto por el que se contrata el seguro es menor que$5.000. 000 pagará el 3%, si el monto es mayor o igual a$5.000 000 y menor de 20.000.000 pagará el 2% y si el montoes mayor o igual a 20.000.000 el valor a pagar será el 1.5 %¿Cuál será el valor de la póliza?

11. La universidad ABC tiene un programa de estímulo aestudiantes con buen rendimiento académico. Si el promedioen las cuatro materias que se cursan en cada semestre esmayor o igual a 4.8, el estudiante no debe pagar matrícula parael siguiente semestre; si el promedio es superior o igual a 4.5 ymenor de 4.8, el estudiante tendrá un descuento del 50%; parapromedios mayores o iguales a 4.0 y menores a 4.5 semantiene el valor; mientras que para promedios menores seincrementa en un 10% respecto al semestre anterior. Dadaslas notas definitivas de las materias determinar el valor de lamatrícula para el siguiente semestre.

12. Una distribuidora de computadores hace un descuentodependiendo de la cantidad comprada. En compras de menosde cinco equipos no hay descuento, en compras de cinco yhasta nueve equipos hará un descuento del 5% y en comprasde 10 o más el descuento será del 10%. ¿Cuál será el valor deldescuento? ¿Cuánto pagará el cliente?

13. Un restaurante ofrece servicio a domicilio con las siguientescondiciones. Si el pedido es superior a $ 20.000 el servicio adomicilio no tiene ningún costo adicional, si es mayor a $10.000 y hasta $20.000 se cobrará un incremento de $2.000,y si es menor a 10.000 tendrá un incremento de $4.000. ¿Quévalor deberá cancelar el cliente?

Page 168: Disenio Algoritmos

168

Diseño de algoritmos

14. Una distribuidora tiene tres vendedores a los que paga unsueldo básico más una comisión del 5% sobre las ventas,siempre que éstas sean mayor o iguales a $ 1.000.000.Además, el vendedor que haya vendido más durante el mesrecibirá un 2% adicional sobre el valor de las ventas,indiferente del monto de éstas. ¿Cuál será el sueldo de cadavendedor?

15. En una entrevista para contratar personal se tienen en cuentalos siguientes criterios: educación formal, edad y estado civil.Los puntajes son: para edades entre 18-24 años, 10 puntos;entre 25 - 30, 20 puntos; 31 - 40 años, 15 puntos; mayores de40, 8 puntos. Para estudios de bachillerato 5 puntos,tecnológicos 8 puntos, profesionales 10 puntos, postgrado 15puntos. Estado civil soltero 20 puntos, casado 15 puntos, uniónlibre 12 puntos, separado 18 puntos. Se requiere calcular elpuntaje total para un entrevistado.

16. Dado un año y un mes, se desea saber cuántos días tiene dichomes, teniendo en cuenta que febrero cambia dependiendo si elaño es bisiesto.

17. Dado un número entero entre 1 y 9999 expresarlo en palabras

18. Una joyería establece el valor de sus productos según el peso yel material. Se requiere un algoritmo que lea un valor dereferencia x y a partir de éste calcule el valor del gramo dematerial utilizado y el valor del producto. El gramo de plataprocesado tiene un costo de 3x, el platino 5x y el oro 8x.

19. Una empresa otorga una prima especial de maternidad /paternidad a sus empleados, dependiendo del número de hijos:para empleados que no tienen hijos, no hay prima, para un hijola prima será del 5% del sueldo, para dos hijos será del 8%,para tres hijos el 10%, para cuatro el 12%, para un númeromayor el 15%.

Page 169: Disenio Algoritmos

169

3. Algoritmos

20. Un almacén de electrodomésticos tiene la siguiente política deventa: en ventas de contado se hace un descuento del 10%,mientras que en ventas a crédito se carga un porcentaje delvalor del producto, dependiendo del número de cuotasmensuales, y se divide para el número de cuotas. Para 2 mesesno hay interés de financiación, para 3 meses se incrementa elvalor en 5%, para 4 meses el 10%, para 5 meses el 15% y para6 meses el 20%. Se requiere conocer el valor del producto, elvalor a pagar por el cliente, el valor del descuento o incrementoy el valor de cada cuota en caso de que las haya.

21. Se requiere un algoritmo para calcular el área de una de lasprincipales figuras geométricas: triangulo, rectángulo, círculo,rombo y trapecio. Se sabe que las áreas se obtienen con lassiguientes fórmulas: área triángulo = b*h/2, área rectángulo =b*h, área círculo = Pi * radio2, área rombo = D*d/2, áreatrapecio = ½h(a+b)

22. Se requiere un algoritmo para facturar llamadas telefónicas. Elvalor del minuto depende del tipo de llamada, así: local = $ 50,regional = 100, larga distancia nacional = 500, larga distanciainternacional = 700, a celular = 200. Las llamadas de tiporegional y larga distancia nacional tienen un descuento del 5%si su duración es de 5 minutos o más.

23. Una empresa dedicada a alquilar vehículos requiere unprograma para calcular el valor de cada uno de los préstamos.El valor se determina teniendo en cuenta el tipo de vehículo y elnúmero de días que el usuario lo utiliza. El valor diario porcategoría es: automóvil = $ 20000, campero = $ 30000,microbús = $ 50000 y camioneta = $ 40000.

24. La universidad José Martí otorga una beca por el 100% del valorde la matrícula al estudiante con mayor promedio en cadagrupo y por el 50% al segundo mejor promedio. Conociendo losnombres y promedios de los cuatro mejores estudiantes de ungrupo se desea conocer los nombres de quienes recibirán labeca.

Page 170: Disenio Algoritmos

170

Diseño de algoritmos

25. Una empresa patrocinadora de atletas apoya a los deportistasque en las marcas de entrenamiento del último mes cumplenestas condiciones: el tiempo mayor no supera los 40 minutos, eltiempo menor sea inferior a 30 minutos y el tiempo promedio esmenor a 35. Se requiere un algoritmo para decidir si undeportista cumple las condiciones para ser patrocinado.

26. Un estudiante de ingeniería necesita tres libros: Cálculo, Físicay Programación, cuyos precios son: v1, v2, v3 respectivamente.El estudiante cuenta con una cantidad x de dinero que harecibido como apoyo económico para este fin. Se requiere unalgoritmo que le ayude a decidir si puede comprar los tres, doso un libros. El estudiante desea dar prioridad a los libros demayor valor, ya que el dinero sobrante deberá devolverlo y loslibros de menor valor serán más fácil de adquirir con recursospropios.

Page 171: Disenio Algoritmos

171

3. Algoritmos

4.3 ESTRUCTURAS DE ITERACIÓN

Este tipo de estructuras también se conocen como ciclos, bucleso estructuras de repetición y son las que se utilizan para programarque una o más acciones se ejecuten repetidas veces. Son muyimportantes en programación ya que hay muchas actividades quedeben ejecutarse más de una vez.

Considere el caso de una aplicación para elaborar una factura. Elcliente puede comprar un producto, pero también puede comprardos, tres o más. Las mismas operaciones ejecutadas para facturarel primer producto deben ejecutarse para el segundo, el tercero, …,y el enésimo producto. Las estructuras iterativas permiten que seescriba las instrucciones una vez y se utilicen todas las que seanecesario.

Todas las estructuras de repetición tienen como mínimo dospartes: definición y cuerpo. La definición incluye una condición queindica cuántas veces ha de repetirse el cuerpo del ciclo; y, si no seconoce con anticipación el número de repeticiones, la condiciónindicará las circunstancias en que el cuerpo del ciclo se repite, porejemplo utilizando una variable de tipo conmutador. El cuerpo delciclo está conformado por la instrucción o el conjunto deinstrucciones que incluye la estructura de repetición y que seránejecutadas repetidas veces

4.3.1 Control de iteraciones

Para establecer la condición de iteración y tener control sobre lamisma, casi siempre, es necesario utilizar una variable, ya se tratede un contador o un conmutador. A esta variable se la denominavariable de control de ciclo [Joyanes y Zahonero, 2002].

Una variable de control de iteraciones tiene tres momentos:

Page 172: Disenio Algoritmos

172

Diseño de algoritmos

Inicialización. Para que una variable sea utilizada en ladefinición de una estructura iterativa es necesario conocer su valorinicial. Ya que se trata siempre de contadores o conmutadores, suvalor no será leído en la ejecución del programa y es necesario queel programador lo asigne antes de incluir la variable en unacondición. Si la variable no se inicializa puede ocurrir que el ciclono se ejecute ninguna vez o que se ejecute infinitamente.

Evaluación. La evaluación de la variable puede realizarse anteso después de cada iteración, esto depende de la estructurautilizada, para decidir si ejecuta una vez más el cuerpo de ciclo o sisale y continúa con la ejecución de las demás instrucciones.

Actualización. Si la variable se inicializa en un valor que permitela ejecución del ciclo es necesario que, en cada iteración, seactualice de manera que en algún momento de la ejecución seproduzca la salida del ciclo. Si el bucle está controlado por unavariable y esta no se actualiza se genera un ciclo infinito.

Al especificar iteraciones controladas por una variable esimportante formularse las preguntas: ¿Cuál es el valor inicial de lavariable? ¿Qué valor debe tener la variable para que el cuerpo delciclo se repita? ¿Cómo cambia la variable? Las respuestas a estaspreguntas obligarán a definir los tres momentos referidos y evitarerrores de lógica.

4.3.2 Estructura MIENTRAS

Este ciclo consiste en un conjunto de instrucciones que serepiten mientras se cumpla una condición. De igual manera que enlas decisiones, la condición es evaluada y retorna un valor lógicoque puede ser verdadero o falso. En el caso del ciclo mientras lasinstrucciones contenidas en la estructura de repetición seejecutarán solamente si al evaluar la condición se genera un valorverdadero; es decir, si la condición se cumple; en caso contrario, seejecutará la instrucción que aparece después de Fin mientras.

Page 173: Disenio Algoritmos

173

3. Algoritmos

A diferencia de otros ciclos, la estructura mientras comienzaevaluando la expresión condicional, si el resultado es verdadero seejecutan las instrucciones del cuerpo del ciclo; al encontrarse lalínea fin mientras se vuelve a evaluar la condición, si ésta se cumplese ejecutan nuevamente las instrucciones y así sucesivamentehasta que la condición deje de cumplirse, en cuyo caso, el controldel programa pasa a la línea que aparece después de fin mientras.Si en la primera pasada por el ciclo la condición no se cumple lasinstrucciones que están dentro del ciclo no se ejecutarán ni unasola vez.

En pseudocódigo, el ciclo mientras se escribe de la siguienteforma:

Mientras <condición> hacerInstrucciones que se repiten . . .

Fin mientras

En diagrama de flujo el ciclo mientras puede representarsemediante una decisión y un conector como se aprecia en la figura51 o mediante un hexágono con dos entradas y dos salidas comose muestra en la figura 52. La primera forma es cómo se hautilizado tradicionalmente, en este caso el ciclo no es explícito en eldiagrama y sólo se identifica cuando se ejecuta paso a paso elalgoritmo; en la segunda forma, utilizando un símbolo que denotaiteración, el ciclo es evidente. El programa DFD que se utilizacomúnmente para elaborar diagramas de flujo utiliza la segundaforma, quizá por ello cada día es más común la utilización delsímbolo de iteración.

En diagrama de Nassi – Shneiderman se representa medianteuna caja para la definición del ciclo y cajas internas para lasinstrucciones que se repiten, como se muestra en la figura 53.

Una vez conocida la representación de esta estructura iterativaes necesario aprender cómo se utiliza en el diseño de algoritmos,para ello se presentan algunos ejemplos.

Page 174: Disenio Algoritmos

174

Diseño de algoritmos

Figura 51. Representación ciclo mientras en diagrama de flujo (versión 1)

Figura 52. Representación ciclo mientras en diagrama de flujo (versión 2)

Figura 53. Representación ciclo mientras en diagrama N-S

Mientras condición hacer

Fin mientras

Instrucciones que se repiten

Mientras condición

Procesos que se repiten

Procesos fuera del ciclo

Si

No

condición

Procesos que serepiten

Procesos queno se repiten

1

1

Page 175: Disenio Algoritmos

175

3. Algoritmos

Ejemplo 26. Generar números

Este algoritmo utiliza iteraciones para generar y mostrar losnúmeros del 1 al 10.

Lo primero por hacer es declarar una variable de tipo entero parael control del ciclo y la misma se utilizará para mostrar los números.La variable se inicializa en 1, luego se define el ciclo, dentro de éstese muestra el número y se incrementa la variables (contador), deesta manera se llevan a cabo las tres operaciones fundamentalespara controlar un ciclo mediante una variable de tipo contador: seinicializa, se evalúa en la definición del ciclo y se actualizaaproximándose progresivamente a 10, para dar fin al ciclo. Elpseudocódigo se presenta en el cuadro 51, el diagrama de flujo enla figura 54 y el diagrama N-S en la figura 55.

Cuadro 51. Pseudocódigo del algoritmo para generar números

1. Inicio2. Entero: num = 13. Mientras num <= 10 hacer4. Escribir num5. num = num + 16. Fin mientras7. Fin algoritmo

En el pseudocódigo, el ciclo se encuentra entre las líneas 3 y 6,en la 3 se define el ciclo y en la 6 termina, las líneas 4 y 5corresponden al cuerpo del ciclo; es decir, las instrucciones que serepiten. Como el ciclo mientras necesita que la variable estéinicializada, esta operación se lleva a cabo en la línea 2. En estecaso particular, cada vez que la ejecución llegue a la línea 6 seproducirá un retorno a la línea 3 para evaluar la condición del ciclo,si la condición es verdadera se ejecutan las líneas 4 y 5, pero si esfalsa la ejecución salta a la línea 7.

Page 176: Disenio Algoritmos

176

Diseño de algoritmos

Figura 54. Diagrama de flujo del algoritmo para generar números

Figura 55. Diagrama N-S del algoritmo para generar números

Inicio

Entero: num = 1

Mientras num <= 0 hacer

Escribir num

Num = num + 1

Fin mientras

Fin algoritmo

En el diagrama de flujo se aprecia con más claridad elcomportamiento de la estructura iterativa. Al declarar la variable sele asigna un valor inicial (1), en la definición del ciclo se establece lacondición (num <= 10), si ésta se cumple la ejecución continúa por elflujo que sale hacia abajo, se muestra la variable y se incrementaen uno, luego vuelve a la definición del ciclo para evaluar la

Inicio

Entero: num = 1

Mientras num <= 10

num

num = num + 1

Inicio

Page 177: Disenio Algoritmos

177

3. Algoritmos

condición, si es verdades se ejecutan nuevamente las instruc-ciones, si es falsa sale por la izquierda y va al fin del algoritmo. Elciclo termina cuando num =11.

En el diagrama N-S también es fácilmente identificable el ciclo yaque toda la estructura se encuentra en una misma caja y el cuerpodel ciclo aparece internamente. Sólo cuando el ciclo ha terminadose pasa a la siguiente caja.

Para verificar el funcionamiento de este algoritmo se realiza laprueba de escritorio cuyos resultados se muestran en el cuadro 52.

Cuadro 52. Verificación algoritmo para generar números

Iteración Num Salida

11 2 12 3 23 4 34 5 45 6 56 7 67 8 78 9 89 10 9

10 11 10

Ejemplo 27. Divisores de un número

Se requiere un algoritmo para mostrar los divisores de unnúmero en orden descendente.

Antes de comenzar a solucionar el ejercicio es necesario tenerclaridad sobre lo que se entiende por divisor de un número.

Page 178: Disenio Algoritmos

178

Diseño de algoritmos

Dados dos números enteros a y b, se dice que b es divisor de a sise cumple que al efectuar una división entera a/b el residuo es 0.Por ejemplo, si se toman los números 27 y 3, se puede comprobarque 3 es divisor de 27 dado que al hacer la división 27/3 = 9 y elresiduo es 0. Ahora bien, para mayor facilidad, el residuo de unadivisión entera se puede obtener directamente utilizando eloperador Mod.(Los operadores aritméticos se tratan en la sección2.3.1)

Volviendo al ejercicio, en éste se pide que se muestren todos losdivisores de un número comenzando por el más alto; por tanto, lasolución consiste en tomar los números comprendidos entre elnúmero ingresado y el número uno, y para cada valor examinar sicumple con la condición de ser divisor del número. Para ello esnecesario utilizar una variable de control que comience en elnúmero y disminuya de uno en uno hasta 1.

Si se toma, por ejemplo, el número 6, se deben examinar todoslos números entre 6 y 1 y seleccionar aquellos que sean divisoresde seis, así:

Número contador Número Mod contador Divisor6 6 0 Si

5 1 No4 2 No3 0 Si2 0 Si1 0 Si

En la última columna se puede constatar que los divisores deseis, en orden descendente son: 6, 3, 2, 1.

Un segundo ejemplo: si se toma el número 8, se genera la listade números desde ocho hasta uno y se verifica para cada uno si eso no divisor de ocho.

Page 179: Disenio Algoritmos

179

3. Algoritmos

Número Contador Número Mod contador Divisor8 8 0 Si

7 1 No6 2 No5 3 No4 0 Si3 2 No2 0 Si1 0 Si

De esto se obtiene que los divisores de 8, en ordendescendente, son: 8, 4, 2, 1.

Como se observa en los ejemplos anteriores la clave paraencontrar los divisores está en generar la lista de números, y paraello es apropiado utilizar una estructura iterativa y una variable detipo contador, como se aprecia en el pseudocódigo del cuadro 53.

Cuadro 53. Pseudocódigo algoritmo divisores de un número

1. Inicio2. Entero: num, cont3. Leer num4. cont = num5. Mientras cont >= 1 Hacer6. Si num Mod cont = 0 entonces7. Escribir cont8. Fin si9. cont = cont – 110. Fin mientras11. Fin algoritmo

Page 180: Disenio Algoritmos

180

Diseño de algoritmos

Ya se mencionó la importancia de utilizar un ciclo para generaruna lista de números, pero no se muestran todos los números yaque sólo se requieren los que cumplen la condición de ser divisoresdel número leído. La variable de control del ciclo se inicializa en elnúmero ingresado, el ciclo se ejecuta mientras esta variable seamayor a 1 (línea 5) y la variable se decrementa de uno en uno (línea9). En el cuadro 54 se muestra los resultados de la verificación conlos números 6 y 8.

Cuadro 54. Verificación algoritmo divisores de un número

Ejecución num cont Salida

1 6 6 6543 32 21 10

2 8 8 87654 432 21 10

Las representaciones mediante diagrama de flujo y diagrama N-S se presentan en las figuras 56 y 57.

Page 181: Disenio Algoritmos

181

3. Algoritmos

Figura 56. Diagrama de flujo algoritmo divisores de un número

Inicio

Entero: num, cont

num

cont = num

Mientras con >= 1

num Mod cont= 0

contSi

No

cont = cont - 1

Fin

Page 182: Disenio Algoritmos

182

Diseño de algoritmos

Figura 57. Diagrama N-S del algoritmo divisores de un número

4.3.3 Estructura HACER MIENTRAS

Esta estructura se propone como alternativa al ciclo Repita –Hasta que, por cuanto éste ya no figura en los nuevos lenguajes deprogramación. El ciclo Hacer - Mientras, permite ejecutar repetidasveces una instrucción o un grupo de instrucciones, con laparticularidad de que evalúa la condición que controla el ciclodespués de cada iteración; es decir que, la primera evaluación de lacondición se hace después de haber ejecutado las instrucciones delciclo, lo que garantiza que el cuerpo del bucle se ejecutará al menosuna vez.

Cuando en un programa se encuentra la palabra Hacer, sesiguen ejecutando las líneas que están a continuación, en elmomento en que se encuentra la instrucción Mientras, se evalúa lacondición asociada, la cual debe retornar un valor lógico (verdaderoo falso). Si el valor es verdadero el control regresa a la instrucción

Inicio

Entero: num, cont

Leer num

cont = num

Mientras cont >= 1 hacer

Fin mientras

num Mod cont = 0Si No

Fin algoritmo

Escribir cont

cont = cont - 1

Page 183: Disenio Algoritmos

183

3. Algoritmos

Hacer y ejecuta nuevamente las instrucciones que le siguen. Si lacondición es falsa la ejecución continúa en la instrucción que estádespués de Mientras. En pseudocódigo se escribe de así:

HacerInstrucción 1Instrucción 2. . .Instrucción n

Mientras <condición>

En diagrama de flujo no se conoce un símbolo para representareste tipo de estructura; por ello, se lo implementa mediante unsímbolo de decisión y un conector para regresar a un procesoanterior y repetir la secuencia mientras la condición sea verdadera,como se muestra en la figura 58.

Figura 58. Ciclo Hacer - mientras en Diagrama de Flujo

Si

No

condición

Procesos que serepiten

Procesos queno se repiten

1

1

Page 184: Disenio Algoritmos

184

Diseño de algoritmos

En diagrama N-S se utiliza una caja para representar el ciclo ycajas internas para las acciones que conforman el cuerpo del ciclo,como se presenta en la figura 59.

Figura 59. Ciclo Hacer – Mientras en Diagrama N-S

Ejemplo 28. Sumar enteros positivos

Este algoritmo lee números enteros y los suma mientras seanpositivos. Cuando se introduce un número negativo o el cero el ciclotermina, se muestra la sumatoria y termina el algoritmo. Elpseudocódigo se muestra en el cuadro 55.

Cuadro 55. Pseudocódigo del algoritmo sumar enteros1. Inicio2. Entero: num = 0, suma = 03. Hacer4. suma = suma + num5. Leer num6. Mientras num > 07. Escribir suma8. Fin algoritmo

En este algoritmo se declara dos variables y se inicializan, estodebido a que la primera instrucción a ejecutar es la suma y esnecesario tener control sobre el contenido de las variables. En lalínea 5 se lee un número, pero para efectuar la suma es precisovolver atrás, lo cual está sujeto a la condición de ser entero positivo.Si se cumple la condición la ejecución regresa a la línea 3, en la 4

Hacer

Mientras <condición>

Acciones a repetir

Page 185: Disenio Algoritmos

185

3. Algoritmos

efectúa la suma y vuelve a leer un número, y así sucesivamentehasta que se ingrese el cero o un número negativo. Sólo al terminarel ciclo muestra el resultado de la sumatoria y termina la ejecución.En la Figura 60 se presenta el diagrama de flujo y en la 61 eldiagrama N-S.

Figura 60. Diagrama de Flujo del algoritmo sumar enteros

Si

No

num > 0

suma = suma + num

1

1

Inicio

Entero: num = 0, suma = 0

num

suma

Fin

Page 186: Disenio Algoritmos

186

Diseño de algoritmos

Figura 61. Diagrama N-S del algoritmo sumar enteros

En el cuadro 56 se muestra los resultados de la verificación delalgoritmo.

Cuadro 56. Verificación del algoritmo sumar enterosIteración Num Suma num > 0 Salida

0 01 4 4 V2 8 12 V3 1 13 V4 5 18 V5 0 F

18

Ejemplo 29. Número binario

Dado un número en base 10, este algoritmo calcula su equiva-lente en base 2; es decir, convierte un decimal a binario.

Una forma de pasar un valor en base 10 (decimal) a base 2(binario) consiste en dividir el valor sobre 2 y tomar el residuo, quepuede ser 0 o 1, retomar el cociente y dividir nuevamente para 2.

Inicio

Entero: num = 0, suma = 0

Fin algoritmo

Hacer

Mientras num > 0

suma = suma + num

Leer num

Page 187: Disenio Algoritmos

187

3. Algoritmos

Esta operación se efectúa repetidas veces hasta que el resultadosea 0. No obstante, esta solución tiene una breve dificultad quehay que resolver y es que los residuos forman el número en binario,pero deben leerse en sentido contrario; es decir, el primer númeroque se obtuvo ocupa la posición menos significativa mientras que elúltimo debe ocupar la primera posición en el número binario.

Considérese el número 20

20 / 2 = 10 Residuo = 010 / 2 = 5 Residuo = 05 / 2 = 2 Residuo = 12 / 2 = 1 Residuo = 01 / 2 = 0 Residuo = 1

Si los números se toman en el orden que se generan se obtiene:00101, este número equivale a 5 en decimal, el cual está muylejos del valor original 20.

Los números que se generan se toman en orden inverso, elúltimo residuo es el primer dígito del binario; por lo tanto, el númerobinario generado en esta conversión es: 10100. Este sí esequivalente a 20.

Ahora, la pregunta es ¿cómo hacer que cada nuevo dígito que seobtiene se ubique a la izquierda de los anteriores?

Para solucionar este asunto, se utiliza una variable para llevarcontrol de la posición que debe ocupar el dígito dentro del nuevonúmero. La variable inicia en 1 y en cada iteración se la multiplicapor 10 para que indique una posición cada vez más significativa.Entonces se tiene que:

Entrada: número en base 10 (decimal)Salida: número en base 2Proceso:

dígito = decimal Mod 2binario = binario + digito * posición

Page 188: Disenio Algoritmos

188

Diseño de algoritmos

decimal = decimal / 2posición = posición * 10

La solución a este problema se presenta en el cuadro 57.

Cuadro 57. Pseudocódigo del algoritmo número binario

1. Inicio2. Entero: dec, bin = 0, pos = 1, dig3. Leer dec4. Hacer5. dig = dec Mod 26. bin = bin + dig * pos7. dec = dec / 28. pos = pos * 109. Mientras dec > 010. Escribir “Binario:”, bin11. Fin algoritmo

En el algoritmo se aprecia que las operaciones de las líneas 5 a8 se repiten mientras haya un número para dividir (dec > 0). En lalínea 5 se obtiene un digito (0 o 1) que corresponde al residuo dedividir el número decimal sobre dos, ese dígito se multiplica por lapotencia de 10 para convertirlo en 10, 100, 1000 o cualquiera otrapotencia si se trata de un uno, para luego sumarlo con los dígitosque se hayan obtenido anteriormente (línea 6). El número decimalse reduce cada vez a la mitad, de esta manera tiende a cero (línea7), al tiempo que la potencia que indica la posición del siguienteuno se multiplica por 10 en cada iteración (línea 8).

Los diagramas de flujo y N-S de este algoritmo se presentan enlas figuras 62 y 63 respectivamente.

Page 189: Disenio Algoritmos

189

3. Algoritmos

Figura 62. Diagrama de flujo del algoritmo número binario

Para probar este algoritmo se calcula el equivalente binario paralos números 20 y 66 obteniendo como resultados 10100 y1000010 respectivamente, los cuales son correctos. Los datosgenerados en las pruebas se presentan en el cuadro 58.

Si

No

num > 0

dig = dec Mod 2

1

1

Inicio

Entero: dec, bin = 0, pos = 1, dig

dec

“Binario”, bin

Fin

bin = bin + dig * posdec = dec / 2

pos = pos * 10

Page 190: Disenio Algoritmos

190

Diseño de algoritmos

Figura 63. Diagrama N-S del algoritmo número binario

Cuadro 58. Verificación del algoritmo número binario

Iteración dig dec Bin pos Salida0 1

20 01 0 10 0 102 0 5 0 1003 1 2 100 10004 0 1 100 100005 1 0 10100 100000 Binario: 10100

66 0 11 0 33 0 102 1 16 10 1003 0 8 10 10004 0 4 10 100005 0 2 10 1000006 0 1 10 10000007 1 0 1000010 Binario: 1000010

Inicio

Entero: dec, bin = 0, por = 1, dig

Fin algoritmo

Hacer

Mientras num > 0

dig = dec Mod 2

bin = bin + dig * pos

Leer dec

dec = dec / 2

pos = pos * 10

Escribir “Binario:”, bin

Page 191: Disenio Algoritmos

191

3. Algoritmos

4.3.4 Estructura PARA

Esta estructura, al igual que las anteriores, permite ejecutarrepetidas veces una instrucción o un grupo de ellas, pero adiferencia de otras instrucciones de repetición, ésta maneja el valorinicial, el valor de incremento o decremento y el valor final de lavariable de control como parte de la definición del ciclo.

Cuando al ejecutarse un algoritmo se encuentra una instrucciónpara la variable de control (contador) toma el valor inicial, se verificaque el valor inicial no sobrepase el valor final y luego se ejecutan lasinstrucciones del ciclo. Al encontrar la instrucción fin para, seproduce el incremento y se vuelve a verificar que la variable decontrol no haya superado el límite admitido, y se vuelven a ejecutarlas instrucciones que están dentro del ciclo, y así sucesivamentetantas veces como sea necesario hasta que se supere el valor finalestablecido.

El ciclo para termina en el momento en que la variable de control(contador) sobrepasa el valor final; es decir, que la igualdad estápermitida y las instrucciones se ejecutan cuando el contador esigual al valor final.

Algunos lenguajes de programación definen la sintaxis de esteciclo incluyendo una condición que se debe cumplir, de formasimilar al ciclo mientras, y no un valor final para la variable, como sepropone en pseudocódigo.

Este ciclo puede presentarse de tres maneras: la primera es lamás común, cuando se produce un incremento de 1 en cadaiteración, en cuyo caso no es necesario escribir explícitamente estevalor. En pseudocódigo se expresa de la siguiente forma:

Para variable = valor_inicial hasta valor_final hacerInstrucciones

Fin para

Page 192: Disenio Algoritmos

192

Diseño de algoritmos

En diagrama de flujo se representa como se muestra en la figura64 y en diagrama N-S, como la figura 65.

Figura 64. Ciclo para en Diagrama de Flujo (Versión 1)

En el diagrama de flujo no es necesario escribir todas laspalabras, éstas se reemplazan por comas (,) excepto la primera.

Figura 65. Ciclo para en DiagramaN-S (Versión 1)

El segundo caso de utilización del ciclo para se presenta cuando elincremento es diferente de 1, en cuyo caso se escribirá la palabraincrementar seguida del valor a sumar en cada iteración.

En pseudocódigo se escribe:

Para vble = vlr_inicial hasta vlr_final incrementar valor hacerInstrucciones que se repiten

Fin para

Para vble = vlr_inicial hasta vlr_final hacer

Fin mientras

Instrucciones que se repiten

Para vble = vlr_inicial, vlr_final

Procesos que se repiten

Procesos fuera del ciclo

Page 193: Disenio Algoritmos

193

3. Algoritmos

Diagrama de flujo y en diagrama N-S se representa como en lafiguras 66 y 67.

Figura 66. Ciclo Para en Diagrama de Flujo (Versión 2)

Figura 67. Ciclo Para en N-S (Versión 2)

El tercer caso se presenta cuando el ciclo para no se incrementadesde un valor inicial hasta un valor mayor, sino que disminuyedesde un valor inicial alto hasta un valor menor. Para ello essuficiente con escribir decrementar en vez de incrementar.

En pseudocódigo se tiene:

Para contador = valor_inicial hasta valor_final decrementar valorhacerInstrucciones

Fin para

En este caso para que se ejecute la primera iteración seránecesario que el valor inicial sea mayor que el valor final, en caso

Para vble = vlr_inicial hasta vlr_final incrementar valor hacer

Fin mientras

Instrucciones que se repiten

Para vble = vlr_inicial, vlr_final, vlr_incremento

Procesos que se repiten

Procesos fuera del ciclo

Page 194: Disenio Algoritmos

194

Diseño de algoritmos

contrario, simplemente pasará a ejecutarse la instrucción que sigueal fin para.

Es importante tener en cuenta que cuando la variable de controldebe disminuir en cada iteración, siempre hay que escribirdecrementar y el valor, aunque sea -1.

En diagrama de flujo será suficiente con anteponer el signomenos (-) al valor a decrementar.

Ejemplo 30. Sumatoria iterativa

Dado un número n, entero positivo, se calcula y se muestra lasumatoria de los números desde 1 hasta n.

En este caso se requiere una estructura iterativa para generarlos números desde el uno hasta n y cada valor comprendido en esteintervalo se almacena en una variable de tipo acumulador.

Ejemplo: si se introduce el número 3, la sumatoria será:

1 + 2 + 3 = 6

Si se introduce el número 6, la sumatoria será:

1 + 2 + 3 + 4 + 5 + 6 = 21

El ejercicio se puede sistematizar de la siguiente forma:

Entrada: númeroSalida: sumatoriaProceso:

sumatoria =

La solución de este ejercicio se presenta en el cuadro 59 ennotación de pseudocódigo y en las figuras 68 y 69 los diagramas deflujo y N-S.

i = n

∑ ii = 1

Page 195: Disenio Algoritmos

195

3. Algoritmos

Cuadro 59. Pseudocódigo algoritmo sumatoria

1. Inicio2. Entero: num, i, suma = 03. Leer num4. Para i = 1 hasta num hacer5. suma = suma + i6. Fin para7. Escribir “Sumatoria:”, suma8. Fin algoritmo

Figura 68. Diagrama de flujo de algoritmo sumatoria

suma = suma + num

Inicio

Entero: num, i, suma = 0

num

“Sumatoria”, suma

Fin

Para i = 1, num

Page 196: Disenio Algoritmos

196

Diseño de algoritmos

Figura 69. Diagrama N-S del algoritmo sumatoria

Dado que el ciclo para incrementa automáticamente la variable,dentro del ciclo solo aparece la instrucción para sumar los númerosgenerados.

En el cuadro 60 se muestra el comportamiento de las variablesal ejecutar el algoritmo para calcular la sumatoria de los númerosdel 1 al 6.

Cuadro 60. Verificación de algoritmo sumatoria

Iteración Num i suma Salida

06 0

1 1 12 2 33 3 64 4 105 5 156 6 21 Sumatoria: 21

Inicio

Entero: num, i, suma = 0

Fin algoritmo

Para i = 1 hasta num hacer

Fin para

suma = suma + num

Leer num

Escribir “Sumatoria:”, suma

Page 197: Disenio Algoritmos

197

3. Algoritmos

Ejemplo 31. Tabla de multiplicar

Comúnmente se conoce como tabla de multiplicar de un númeroa la lista de los primeros 10 múltiplos. Por ejemplo, la tabla del 2:

2 * 1 = 22 * 2 = 42 * 3 = 62 * 4 = 82 * 5 = 102 * 6 = 122 * 7 = 142 * 8 = 162 * 9 = 182 * 10 = 20

Para mostrarla de esta forma se puede utilizar la estructuraiterativa para, la que hace variar el multiplicador desde 1 hasta 10 yen cada iteración se calcula el producto y muestra los datos. Elpseudocódigo se muestra en el cuadro 61, los diagramas de flujo yN-S en las figuras 70 y 71.

Cuadro 61. Pseudocódigo del algoritmo tabla de multiplicar

1. Inicio2. Entero: m, n, r3. Leer m4. Para n = 1 hasta 10 hacer5. r = m * n6. Escribir m, ‘*’, n, ‘=’, r7. Fin para8. Fin algoritmo

Page 198: Disenio Algoritmos

198

Diseño de algoritmos

Figura 70. Diagrama de flujo del algoritmo tabla de multiplicar

Figura 71. Diagrama N-S del algoritmo tabla de multiplicar

Inicio

Entero: m, n, r

Fin algoritmo

Para n = 1 hasta 10 hacer

Fin para

r = m * n

Leer m

Escribir m, “*”, n “=”, r

r = m * n

Inicio

Entero: m, n, r

m

m, “*”, n, “=”, r

Fin

Para n = 1, 10

Page 199: Disenio Algoritmos

199

3. Algoritmos

Para verificar el funcionamiento del algoritmo se genera la tabladel 4, los resultados se presentan en el cuadro 62.

Cuadro 62. Verificación del algoritmo tabla de multiplicar

Iteración m n r Salida

41 1 4 4 * 1 = 42 2 8 4 * 2 = 83 3 12 4 * 3 = 124 4 16 4 * 4 = 165 5 20 4 * 5 = 206 6 26 4 * 6 = 247 7 28 4 * 7 = 288 8 32 4 * 8 = 329 9 36 4 * 9 = 36

10 10 40 4 * 10 = 40

4.3.5 Estructuras Iterativas anidadas

Las estructuras iterativas, al igual que las selectivas, se puedenanidar; es decir, se pueden colocar una dentro de otra.

El anidamiento de ciclos se conforma por un ciclo externo y unoo más ciclos internos, donde cada vez que se repite el ciclo externo,los internos se reinician y ejecutan todas las iteraciones definidas(Joyanes, 2000).

Un ejemplo que permite ilustrar fácilmente el concepto de ciclosanidados es el reloj digital. El tiempo se mide en horas, minutos ysegundos, las horas están conformadas por minutos y los minutospor segundos, de manera que si se escribe un ciclo para las horas,otro para los minutos y otro para los segundos, el ciclo de losminutos en cada iteración deberá esperar a que se ejecuten las 60

Page 200: Disenio Algoritmos

200

Diseño de algoritmos

iteraciones del ciclo de los segundos (0..59) y el de las horasdeberá esperar que se ejecute el de los minutos (0..59).

Ejemplo 32. Reloj digital

Para implementar un reloj digital es necesario declarar tresvariables, para controlar: horas, minutos y segundos. Cada una deestas variables controla un ciclo, así: los segundos se incrementandesde 0 a 59, los minutos también desde 0 a 59 y las horas desde1 a 12 o de 1 a 24.

La variable que controla las horas se incrementa en uno cada vezque la variable que controla los minutos ha hecho el recorridocompleto desde 0 a 59, a su vez, la variable de los minutos seincrementa en uno cada vez que la variable de los segundos hacompletado su recorrido desde 0 a 59. Para que esto ocurra esnecesario que el ciclo de las horas contenga al de los minutos yéste, al de los segundos, como se aprecia en el cuadro 63.

Cuadro 63. Pseudocódigo algoritmo Reloj digital

1. Inicio2. Entero: h, m, s3. Para h = 1 hasta 12 hacer4. Para m = 0 hasta 59 hacer5. Para s = 0 hasta 59 hacer6. Escribir h,”:”, m, “:”, s7. Fin para8. Fin para9. Fin para10. Fin algoritmo

Este mismo algoritmo expresado en diagrama de flujo se presentaen la figura 72 y en diagrama N-S en la 73.

Page 201: Disenio Algoritmos

201

3. Algoritmos

Figura 72. Diagrama de flujo del algoritmo Reloj digital

Al ejecutar este algoritmo se tendría una salida de la forma:

1:0:01:0:11:0:2…1:0:581:0:591:1:01:1:11:1:2…

Inicio

Entero: h, m, s

h, m, s

Fin

Para m = 0, 59

Para h = 1, 12

Para s = 0, 59

Page 202: Disenio Algoritmos

202

Diseño de algoritmos

Figura 73. Diagrama N-S del algoritmo Reloj digital

1:59:581:59:592:0:02:0:12:0:2…

Este algoritmo está diseñado para terminar la ejecución al llegara 12:59:59. Para hacer que el reloj se ejecute indefinidamentesería necesario colocar los tres ciclos dentro de otro, para que alllegar a 12:59:59 se reinicie la variable h y vuelva a comenzar elconteo. El ciclo externo tendría que ser un ciclo infinito de la forma:mientras verdadero hacer.

Ejemplo 33. Nueve tablas de multiplicar

En un ejemplo anterior se utilizó un ciclo para generar la tabla demultiplicar de un número, en éste se utiliza ciclos anidados para

Para h = 1 hasta 12 hacer

Fin para

Inicio

Entero: h, m, s

Para m = 0 hasta 59 hacer

Fin para

Fin algoritmo

Para s = 0 hasta 59 hacer

Fin para

Escribir h, “:”, m, “:”, s

Page 203: Disenio Algoritmos

203

3. Algoritmos

generar las tablas desde dos hasta 10. El primer ciclo está asociadocon el multiplicando y hace referencia a cada una de las tablas agenerar, por tanto toma valores entre 2 y 10; el ciclo interno estárelacionado con el multiplicador, se encarga de generar losmúltiplos en cada una de las tablas, en consecuencia toma valoresentre 1 y 10. El pseudocódigo se presenta en el cuadro 64.

Cuadro 64. Pseudocódigo para Nueve tablas de multiplicar1. Inicio2. Entero: m, n, r3. Para m = 2 hasta 10 hacer4. Escribir “Tabla de multiplicar del ”, m5. Para n = 1 hasta 10 hacer6. r = m * n7. Escribir m, “*”, n, “=”, r8. Fin para9. Fin para10. Fin algoritmo

Al ejecutar este algoritmo se tendrá una salida de la forma:

Tabla de multiplicar del 22 * 1 = 22 * 2 = 42 * 3 = 6…Tabla de multiplicar del 33 * 1 = 33 * 2 = 63 * 3 = 9…Y así sucesivamente hasta

10 * 10 = 100

Page 204: Disenio Algoritmos

204

Diseño de algoritmos

Los diagramas de flujo y N-S para este algoritmo se presentan enlas figuras 74 y 75.

Figura 74. Diagrama de flujo para 9 tablas de multiplicar

Inicio

Entero: m, n, r

m, “*”, n, “=”, r

Fin

Para n = 1, 10

Para m = 2, 10

r = m * n

“Tabla del”, m

Page 205: Disenio Algoritmos

205

3. Algoritmos

Figura 75. Diagrama N-S para Nueve tablas de multiplicar

4.3.6 Más ejemplos de iteraciones

Ejemplo 34. Mayor, menor y promedio de n números

Este ejercicio consiste en leer n números y luego reportar elnúmero menor y el número mayor de la lista y calcular el valorpromedio.

Supóngase que el usuario ingresa la siguiente lista de datos:214556123417

Para m = 2 hasta 10 hacer

Fin para

Inicio

Entero: m, n, r

Para n = 1 hasta 10 hacer

Fin para

Fin algoritmo

r = m * n

Escribir “Tabla de multiplicar del ”, m

Escribir m, “*”, n, “=”, r

Page 206: Disenio Algoritmos

206

Diseño de algoritmos

Se tiene que:Cantidad de números ingresados: 7Número mayor: 55Número menor: 2Sumatoria: 140Promedio = 140 / 7 = 20

Para solucionar este problema, lo primero que hay que planteares cómo se sabrá cuando terminar la lectura de datos, ya que no seespecifica la cantidad de números que serán ingresados y en elplanteamiento del problema no se da ninguna condición quepermita saber cuándo terminar el ciclo. Este tipo de problemas esmuy común, no se conoce con antelación la cantidad de datos aprocesar.

Para implementar ciclos cuando no se conoce el número deiteraciones a ejecutar hay al menos tres formas muy sencillas dehacerlo: la primera consiste en definir una variable para almacenareste dato (n) y se pide al usuario que la ingrese, de la forma“cuántos números desea ingresar?” y el dato ingresado se utilizacomo valor final para implementar una variable de control; lasegunda, utilizar un conmutador o bandera, se trata de definir unavariable con dos posibles valores: si y no o 0 y 1, por ejemplo,preguntar al usuario “Otro número (S/N) ?”, si ingresa “S” secontinúa leyendo datos, en caso contrario el ciclo termina; y latercera, hacer uso de un centinela que termine el ciclo cuando secumpla una condición, por ejemplo, el ciclo termina cuando seingresa el número 0, y se presenta al usuario un mensaje de laforma: “Ingrese un número (0 para terminar): ”.

Para solucionar este ejercicio se opta por la primera propuesta.Se cuenta con la siguiente información:

Datos de entrada: cantidad de números, númerosDatos de salida: promedio, mayor y menor

Procesos:suma = suma + número

Page 207: Disenio Algoritmos

207

3. Algoritmos

promedio = suma / cantidad de números

Para identificar los números menor y mayor se puede optar poruna de estas dos alternativas: primera: inicializar la variable delnúmero menor en un número muy grande y la variable del númeromayor en 0, de manera que en la primera iteración se actualicen;segunda: no inicializar las variables y asignarles el primera dato quese ingrese tanto a la variable del mayor como del menor. En estecaso se optó por la segunda, el algoritmo se presenta en el cuadro65.

Cuadro 65. Pseudocódigo para número menor, mayor y promedio

1. Inicio2. Entero: can, num, suma=0, menor, mayor, cont = 03. Real: prom4. Leer can5. Mientras cont < can hacer6. Leer num7. suma = suma + num8. Si cont = 0 entonces9. menor = num10. mayor = num11. Si no12. Si num < menor entonces13. menor = num14. Fin si15. Si num > mayor entonces16. mayor = num17. Fin si18. Fin si19. cont = cont + 120. Fin mientras21. prom = suma / can

Page 208: Disenio Algoritmos

208

Diseño de algoritmos

Cuadro 65. (Continuación)

22. Escribir “Número menor:”, menor23. Escribir “Promedio:”, prom24. Escribir “Número mayor:”, mayor25. Fin algoritmo

En este algoritmo se utilizan las variables: can, num, mayor,menor y prom que son variables de trabajo; cont es el contador quepermite controlar el ciclo, suma es el acumulador que totaliza losnúmeros ingresados para luego poder obtener el promedio.

Es importante comprender qué instrucciones deben ir dentro delciclo y cuales fuera, ya sea antes o después. No hay una regla deoro que se pueda aplicar a todos los casos, pero puede ayudar elrecordar que todo lo que está dentro del ciclo se repite; es decir,hay que preguntarse cuántas veces tendrá que ejecutarse lainstrucción, si la respuesta es solo una vez, no hay razón para queesté dentro del bucle. En este ejemplo, leer la cantidad de númerosa trabajar sólo debe ejecutarse una vez ya que esta cantidadpermitirá establecer el límite de las repeticiones y calcular elpromedio también debe hacerse solo una vez, por lo tanto seubican fuera del ciclo, pero sumar el número entrado deberealizarse tantas veces como números se ingresen, por ende estainstrucción aparece dentro del bucle.

El ciclo se ejecutará siempre que cont sea menor que elcontenido de la variable can, como cont inicia en 0, el ciclo seejecuta para cualquier valor de can que sea mayor o igual a 1, perosi el valor ingresado para can fuera 0, el ciclo no se ejecutaría y segeneraría un error de división sobre 0 al calcular el promedio. Laúltima instrucción del ciclo es cont = cont + 1, ésta esindispensable, ya que el contador debe incrementarse en cadaiteración para que alcance el valor de la variable can. No se debeolvidar que todo ciclo debe tener un número limitado de iteraciones,

Page 209: Disenio Algoritmos

209

3. Algoritmos

por ello al diseñar el algoritmo se debe prever la forma en que elciclo terminará.

En el cuadro 66 se presenta el comportamiento de las variablesy los resultados de una ejecución.

Cuadro 66. Verificación del algoritmo Número menor, mayor y promedio

Iteración Can num menor Mayor Cont suma Prom Salida0 0

71 2 2 1 22 14 2 14 2 163 55 2 55 3 714 6 2 55 4 775 12 2 55 5 896 34 2 55 6 1237 17 2 55 7 140

20Número menor: 2

Promedio = 20Número mayor: 55

Ejemplo 35. Procesamiento de notas

En un grupo de n estudiantes se realizaron tres evaluacionesparciales. Se requiere calcular la nota definitiva de cada estudiantey conocer la cantidad de estudiantes que aprobaron, la cantidad deestudiantes que reprobaron y la nota promedio del grupo,considerando que el valor porcentual de cada parcial lo acordaronentre el docente y el grupo, y la nota mínima aprobatoria es 3,0.

Aplicando la estrategia que se ha propuesto para comprender elproblema supóngase un caso particular, como éste:

Grupo de segundo semestre: 20 estudiantesMateria: programación

Page 210: Disenio Algoritmos

210

Diseño de algoritmos

Porcentaje para primera evaluación: 30%Porcentaje para segunda evaluación: 30%Porcentaje para tercera evaluación: 40%

Ahora la solución para un estudiante:

El estudiante Pedro Pérez obtiene las siguientes notas:Evaluación 1: 3,5Evaluación 2: 4,0Evaluación 3: 2,8Cuál es la nota definitiva de Pedro?

Aplicando los porcentajes previamente mencionados se tieneque:

Nota definitiva = 3,5 * 30% + 4,0 * 30% + 2,8 * 40%Nota definitiva = 1,05 + 1,2 + 1,12Nota definitiva = 3,4

El siguiente paso es decidir si el estudiante aprueba o repruebala materia:

Nota definitiva >= 3,0? (3,4 >= 3.0?) Si

Pedro Pérez aprobó el curso; en consecuencia se lo cuenta comouno de los que aprobaron, y para poder obtener el promedio delcurso es necesario sumar su nota a una variable de tipoacumulador que al final se dividirá sobre el contador de estudiantes(20).

Este mismo procedimiento se tiene que llevar a cabo para cadauno de los estudiantes del grupo.

A continuación se identifican y clasifican los datos del problema:

Datos de entrada: nombre del estudiante, nota1, nota2, nota3,porcentaje1, porcentaje2, porcentaje3.

Page 211: Disenio Algoritmos

211

3. Algoritmos

Datos de salida: nota definitiva, promedio, número pierden,número ganan

Proceso:nota definitiva = nota1 * porcentaje1 + nota2 * porcentaje2

+ nota3 * porcentaje3suma = suma + nota definitivapromedio = suma / numero estudiantes

En el análisis del ejercicio anterior se mencionó que hay tresformas de programar un ciclo cuando no se conoce por anticipadoel número de iteraciones y se implementó la primera; en esteejemplo, se utilizará la segunda, que consiste en preguntar alusuario si desea continuar entrando datos. En el momento en queresponda negativamente el ciclo termina.

En este algoritmo se utiliza tres contadores y un acumuladorademás de las variables de trabajo. Las variables utilizadas pararegistrar el número de estudiantes, el número de estudiantes queganan y el número que pierden la materia son contadores, mientrasque la variable utilizada para totalizar las notas definitivas es unacumulador. El ciclo no está controlado por la cantidad predefinidade estudiantes, sino por el contenido de la variable rta de tipocaracter que debe tomar como valores ‘S’ o ‘N’.

El diseño de la solución se presenta en la figura 76 en notaciónde diagrama de flujo y los resultados de una ejecución de pruebacon cuatro estudiantes se muestran en el cuadro 67.

Page 212: Disenio Algoritmos

212

Diseño de algoritmos

Figura 76. Diagrama de flujo para procesamiento de notas

Inicio

Entero: est=0, ganan=0, pierden=0Real: nota1, nota2, nota3, por1, por2, por3,nd, suma=0, promCaracter: rtaCadena: nom

nom,“nota def. =”, nd,“Reprueba”

Fin

Mientras rta = ‘S’ o rta = ‘s’

nd = nota1*por1/100 +nota1*por1/100 +nota1*por1/100

por1, por2, por3

nom, nota1, nota2, nota3

nd >= 3,0

est = est + 1suma = suma + nd

nom,“nota def. =”, nd,“Aprueba”

pierden = pierden + 1

ganan = ganan + 1

“Mas estudiantes?”

rta

“Promedio: “, prom,“Aprueban:”, ganan,“Reprueban:”, pierden

prom = suma / est

Si

No

Page 213: Disenio Algoritmos

213

3. Algoritmos

Cuadro 67. Verificación del algoritmo procesamiento de notas

por1 por2 Por3 nom Nota1

Nota2

Nota3 Nd ganan pierden est suma rta prom

0 0 0 0 S

30 30 40

A 3.0 3.5 4.0 3.5 1 1 3.5 S

B 2.0 2.5 2.0 2.5 1 2 6 S

C 4.0 3.2 2.0 3.0 2 3 9 S

D 2.2 3.5 2.5 2.7 2 4 11.7 n 2.9

La salida en pantalla es la siguiente:

Nombre: ANota def: 3,5Aprueba

Nombre: BNota def: 2,5Reprueba

Nombre: CNota def: 3,0Aprueba

Nombre: DNota def: 2,7Reprueba

Promedio: 2,9Aprueban: 2Reprueban: 2

Ejemplo 36. Serie Fibonacci

Esta conocida serie propuesta por el matemático italiano delmismo nombre corresponde a un modelo matemático que explica la

Page 214: Disenio Algoritmos

214

Diseño de algoritmos

reproducción de los conejos y fue publicada por primera vez en1202 en una obra titulada Liberabaci.

Fibonacci planteó el problema de la siguiente manera:supóngase que una pareja de conejos da lugar a dos descendientescada mes y cada nuevo ejemplar comienza su reproduccióndespués de dos meses. De manera que al comprar una pareja deconejos, en los meses uno y dos se tendrá una pareja, pero al tercermes se habrán reproducido y se contará con dos parejas, en el mescuatro solo se reproduce la primera pareja, así que el númeroaumentará a tres parejas; en el mes cinco, comienza lareproducción de la segunda pareja, con lo cual se obtendrán cincoparejas, y así sucesivamente. Si ningún ejemplar muere, el númerode conejos que se tendrán cada mes está dado por la sucesión: 0,1, 1, 2, 3, 5, 8, 13, 21, 34, …,

Si se asume que los dos primeros números son constantes; esdecir, si se establece que los dos primeros números de la sucesiónson 0 y 1, los siguientes se pueden obtener sumando los dosanteriores, así:

Término Valor Obtenido de1 0 Constante2 1 Constante3 1 0 + 14 2 1 + 15 3 2 + 16 5 3 + 27 8 5 + 38 13 8 + 59 21 13 + 8

10 34 21 + 13

Este tema se desarrolla con mayor detalle en la sección 8.7donde se propone una solución recursiva.

En este ejemplo se desea diseñar un algoritmo que genere nprimeros términos de esta serie.

Page 215: Disenio Algoritmos

215

3. Algoritmos

Para solucionar este ejercicio haciendo uso de una estructuraiterativa es necesario, en primera instancia, determinar la cantidadde números a generar o sea conocer el valor de n; en segunda, ydado que cada número se obtiene por la suma de los dos términosanteriores, se utiliza tres variables: una para el valor generado y dosmás para mantener en memoria los dos últimos datos,adicionalmente se define una variable para controlar el ciclo. Lasolución se presenta mediante un diagrama N-S en la figura 77.

Figura 77. Diagrama N-S para Serie Fibonacci

Para mirar el comportamiento de las variables en el cuadro 68se presenta los resultados de la verificación del algoritmo,obsérvese como cambian los valores de una variable a otra.

Para con = 1 hasta n hacer

Fin para

Inicio

Entero: n, a = 0, b = 1, f=0, con

Fin algoritmo

Escribir f

Leer n

a = b

b = f

f = a + b

Page 216: Disenio Algoritmos

216

Diseño de algoritmos

Cuadro 68. Verificación del algoritmo serie Fibonacci

Iteración n Con A B f Salida10 0 0 1 0

1 1 1 0 1 02 2 0 1 1 13 3 1 1 2 14 4 1 2 3 25 5 2 3 5 36 6 3 5 8 57 7 5 8 13 88 8 8 13 21 139 9 13 21 34 2110 10 21 34 55 34

Ejemplo 37. Máximo común divisor

Dados dos números enteros, se requiere encontrar el máximocomún divisor de los mismos.

El máximo común divisor (MCD) entre dos números es el númeromás grande que los divide a ambos, incluso puede ser uno de ellosdado que todo número es divisor de sí mismo. El MCD se puedeobtener de forma iterativa o recursiva, en esta sección se solucionaaplicando la primera y en la sección 8.7 se presenta la soluciónrecursiva aplicando el algoritmo de Euclides.

Al abordar este problema, seguramente, la primera idea que sele ocurre al lector es descomponer los números en sus divisores ytomar los comunes, tal como se lo enseñaron en el colegio. Esa esuna solución válida; sin embargo, es difícil de implementar de formaalgorítmica.

Aplicando el algoritmo de Euclides, el MCD se obtiene de lasiguiente manera: se divide el primer número sobre el segundo, si ladivisión es exacta (residuo = 0) el MCD es el segundo número, si la

Page 217: Disenio Algoritmos

217

3. Algoritmos

división no es exacta se divide el divisor sobre el residuo y si elmódulo es cero el MCD es el número que se colocó como divisor; encaso contrario, se repite esta operación hasta obtener una divisiónentera.

Por ejemplo, se busca el MCD de los números 12 y 8

Como la división es inexacta se efectúa una segunda divisióntomando como dividendo el anterior divisor y como divisor elresiduo.

Esta segunda operación es una división exacta (residuo = 0) portanto el divisor es la solución del ejercicio; es decir, el MCD entre 12y 8 es 4.

Con base en el ejemplo anterior se puede organizar los datos delejercicio así:

Datos de entrada: a, b (dos números enteros)Datos de salida: MCDProceso: c = a Mod b

La solución se presenta mediante pseudocódigo en el cuadro 69

8 4

20

12 8

14

Page 218: Disenio Algoritmos

218

Diseño de algoritmos

Cuadro 69. Pseudocódigo del algoritmo Máximo Común Divisor

1. Inicio2. Entero: num1, num2, a, b, c3. Leer num1, num24. a = num15. b = num26. Hacer7. c = a Mod b8. a = b9. b = c10. Mientras c != 011. Escribir “MCD:”, a12. Fin algoritmo

La verificación de este algoritmo con los números 12 y 8, 6 y 20genera los datos que se presentan en el cuadro 70.

Cuadro 70. Verificación del algoritmo Máximo Común Divisor

Ejecución Iteración a b c Salida1 12 81 1 12 8 41 2 8 4 01 4 0 MCD: 42 6 202 1 6 20 62 2 20 6 22 3 6 2 0

2 0 MCD: 2

Page 219: Disenio Algoritmos

219

3. Algoritmos

Ejemplo 38. Invertir dígitos

Dado un número entero, se desea invertir el orden de susdígitos. Supóngase que se toma el número 123 al invertirlo seobtiene el número 321.

Para cambiar el orden de los dígitos es necesario separarloscomenzando por el último, para ello se divide sobre 10 y se toma elresiduo utilizando el operador módulo.

Esta operación es equivalente a la expresión: 123 Mod 10 = 3

De esta manera se obtiene el dígito de la última posición delnúmero original, el 3, que será el primero en el número invertido;luego se obtiene el siguiente dígito, el 2, dividiendo el cocientesobre 10, y así sucesivamente.

En la medida en que se extraen los dígitos del número original sevan organizando de izquierda a derecha para conformar el nuevonúmero, para ello es necesario multiplicar por 10 el número que vagenerando y sumarle el último dígito obtenido, así:

3 * 10 + 2 = 32

Luego se obtiene el tercero y últimonúmero, el 1, y se realiza la operación:

32 * 10 + 1 = 321

12 10

12

123 10

123

1 10

01

Page 220: Disenio Algoritmos

220

Diseño de algoritmos

Las operaciones se repiten hasta que el cociente de la divisiónsea 0, en cuyo caso se habrán invertido todos los dígitos. En esteorden de ideas, se tienen los siguientes datos

Datos de entrada: númeroDatos de salida: número invertidoProcesos:

Dígito = número Mod 10Número = número / 10Número invertido = número invertido * 10 + digito

El diagrama de flujo se presenta en la figura 78.

Figura 78. Diagrama de flujo para invertir los dígitos de un número

Inicio

Entero: num, dig, inv = 0

inv

Fin

num

num > 0 Si

No

dig = num Mod 10

inv = inv * 10 + dig

num = num / 10

1

1

Page 221: Disenio Algoritmos

221

3. Algoritmos

En este algoritmo se utiliza la estructura iterativa hacer –mientras, como en la notación de diagrama de flujo no se cuentacon un símbolo para esta estructura se modela mediante unadecisión y un conector que lleva el control de la ejecución hasta elprimer proceso que se repite.

Los datos obtenidos en la verificación paso a paso del algoritmose muestran en el cuadro 71.

Cuadro 71. Verificación del algoritmo invertir dígitos de un número

Iteración num dig inv Salida123

1 123 3 32 12 2 323 1 1 321

0 321

Ejemplo 39. Número perfecto

Un número es perfecto si se cumple que la sumatoria de losdivisores menores al número da como resultado el mismo número.Se desea un algoritmo para determinar si un número n es perfecto.

Para comprender mejor el concepto de número perfectoconsidérese dos casos: 6 y 8. Los divisores de 6 son: 1, 2, 3 y 6; ylos divisores de 8 son: 1, 2, 4 y 8 (todo número es divisor de símismo). Si se suman únicamente los divisores menores a cadanúmero se tiene:

Léase Dn como divisor de n. Por tanto, se tiene que: la sumatoriade los divisores de 6, menores a 6, es igual a 6, de lo que se

∑D8 = 1

D8 < 8

D8 = 1 + 2 + 4 = 7∑D6 = 1

D6 < 6

D6 = 1 + 2 + 3 = 6

Page 222: Disenio Algoritmos

222

Diseño de algoritmos

concluye que 6 es número perfecto; con respecto al segundonúmero, se lee: la sumatoria de los divisores de 8, menores a 8, esigual a 7, en consecuencia 8 no es número perfecto.

Ahora, para saber si un número es perfecto se requieren tresprocesos básicos: identificar los divisores, sumarlos y verificar si lasumatoria es igual al número. Para identificar los divisores menoresa n es preciso hacer un recorrido entre 1 y n/2 y verificar para cadanúmero si es o no es divisor de n, para esto se utiliza una estructuraiterativa; para sumarlos se utiliza una variable de tipo acumuladorque se actualiza dentro del ciclo; y finalmente, una estructura dedecisión ubicada fuera del ciclo determinará si el número es o no esperfecto. La solución a este ejercicio se presenta en la figura 79.

Figura 79. Diagrama N-S para número perfecto

En el cuadro 72 se presenta los resultados de la verificación deeste algoritmo con los números 6 y 8.

Para i = 1 hasta n/2 hacer

Fin para

Inicio

Entero: n, i, suma = 0

Fin algoritmo

n Mod i = 0Si No

Leer n

suma = suma + i

suma = nSi No

Escribir n, “es numero perfecto” Escribir n, “no es num. perfecto”

Page 223: Disenio Algoritmos

223

3. Algoritmos

Cuadro 72. Verificación del algoritmo Número perfecto

Ejecución n i suma Salida1 6 01 1 11 2 31 3 6 6 es número perfecto2 8 02 1 12 2 32 3 3

4 7 8 no es número perfecto

Ejemplo 40. Potenciación iterativa

Dados dos números enteros: b que es la base y e que es elexponente, se requiere calcular el resultado de la potenciación.

La potenciación es una operación matemática cuyo resultado esel producto de multiplicar la base por sí misma tantas veces comoindique el exponente. Entre sus propiedades se tienen: si elexponente es 0, el resultado es 1 y si el exponente es 1, elresultado es el mismo valor de la base. En este ejercicio, parafacilitar la solución, se limita el exponente a los números enterospositivos. Por ejemplo:

23 = 2 * 2 * 2 = 835 = 3 * 3 * 3 * 3 * 3 = 243

De manera que para desarrollar una potenciación se debeimplementar una estructura iterativa y dentro de ella realizarmultiplicaciones sucesivas de la base. El exponente indica elnúmero de iteraciones a realizar. Los datos son:

Datos de entrada: base, exponenteDatos de salida: resultado

Page 224: Disenio Algoritmos

224

Diseño de algoritmos

Proceso: producto = producto * base

En el cuadro 73 se presenta el pseudocódigo de este ejercicio.

Cuadro 73. Pseudocódigo Potencia iterativa

1. Inicio2. Entero: b, e, p = 1, con3. Leer b, e4. Para con = 1 hasta e hacer5. p = p * b6. Fin para7. Escribir p8. Fin algoritmo

Cualquier número multiplicado por 0 da como resultado 0; poresto, la variable p (producto), que es un acumulador de resultadosde multiplicación, se inicializa en 1, pues si se inicializara en 0 alfinal se tendría como resultado el 0. Los resultados de laverificación de este algoritmo se presentan en el cuadro 74.

Cuadro 74. Verificación del algoritmo potencia iterativa

Ejecución Iteración b e Con P Salida1 11 1 2 4 1 21 2 2 41 3 3 81 4 4 16 162 3 5 12 1 1 32 2 2 92 3 3 272 4 4 81

5 5 243 243

Page 225: Disenio Algoritmos

225

3. Algoritmos

Ejemplo 41. Número primo

Se denomina primo al número entero que solo cuenta con dosdivisores: el uno y el mismo número. Se solicita un algoritmo quedado un número n decida si es o no es primo.

Para determinar si un número cumple con esta propiedad seprocede a verificar si tiene algún divisor diferente de uno y el mismonúmero, en cuyo caso se demuestra que no es primo, en casocontrario se dice que si es primo; pero no es necesario examinartodos los números, para saber si es o no primo un número bastacon buscar divisores entre dos y la raíz cuadrada del número*.

Como ejemplos se examinan los números 9 y 19. La raízcuadrada de 9 es 3, por tanto se busca divisores entre 2 y 3 y seencuentra que el 3 es divisor, por tanto 9 no es número primo. Para19 se tiene que la raíz cuadrada entera es 4, por tanto se buscadivisores entre 2 y 4, obteniéndose que los números 2, 3 y 4ninguno es divisor de 19, por tanto se concluye que 19 es númeroprimo. Podría verificarse para los números que siguen hasta 18,pero el resultado será el mismo.

Para determinar si un número es primo se tienen los siguientesdatos y operaciones:

Datos de entrada: númeroDatos de salida: mensaje “número primo” ó “número no primo”Proceso: número Mod i donde i: 2 ... raíz(número)

La solución algorítmica se presenta en la figura 80 en notaciónde diagrama de flujo.

* El propósito de este ejercicio es aplicar una estructura iterativa en la solución, porello se procede a buscar divisores entre todos los números comprendidos entre 2 yla raíz entera del número. Existe otro método más rápido para comprobar si unnúmero es primo, se trata de la solución propuesta por Eratóstenes (matemáticogriego del siglo III a. C) quien propone que para verificar si un número es primo solohay que dividir para: 2, 3, 5 y 7. (Gran Enciclopedia Espasa, 2005).

Page 226: Disenio Algoritmos

226

Diseño de algoritmos

Figura 80. Diagrama de flujo para número primo

En este algoritmo se han declarado cuatro variables: n, r, i, sw; npara el número, r para calcular la raíz cuadrada de n, i para hacer elrecorrido entre 2 y r y sw. Esta última es una variable tipo conmu-tador o bandera, su propósito es informar si al hacer las iteracionespara la variable i se encontró algún divisor de n, la variable se

Inicio

Entero: n, i = 2, sw = 0

n, “es primo”

Fin

num

n Mod i = 0 Si

No

r = raíz(n)

sw = 1

i = i + 1

1

1

i <= r Si

No

sw = 0 Si

No

n, “no es primo”

Page 227: Disenio Algoritmos

227

3. Algoritmos

inicializa en 0, si al finalizar el ciclo se mantiene en 0 significa queno se encontró ningún divisor y por tanto el número es primo, perosi la variable ha tomado el valor 1 significa que hay al menos undivisor y por tanto el número no es primo.

En el cuadro 75 se muestra los resultados de la ejecución paso apaso para los números 9 y 19.

Cuadro 75. Verificación del algoritmo Número primo

Ejecución Iteración n r i sw Salida1 9 3 0

1 22 3 1 9 no es primo

2 19 4 01 22 33 4 19 es primo

Ejemplo 42. Puntos de una línea

Dada la ecuación lineal y = 2x – 1 se desea un algoritmo paracalcular n puntos por los que pasa la línea a partir de x = 1.

Si se toma n = 4, los puntos serían:

X = 1 y = 2(1) – 1 = 1 (1,1)X = 2 y = 2(2) – 1 = 3 (2,3)X = 3 y = 2(3) – 1 = 5 (3,5)X = 4 y = 2(4) – 1 = 7 (4,7)

En este caso los datos de entrada corresponde a n, los datos desalida a los puntos (x,y), tantos como indique n y el proceso selimita al desarrollo de la ecuación reemplazando x por el valor quecorresponda. Para ello se utiliza una estructura iterativa, como seaprecia en el diagrama N-S de la figura 81.

Page 228: Disenio Algoritmos

228

Diseño de algoritmos

Figura 81. Diagrama N-S para Puntos de una línea

Los datos generados al verificar la corrección de este algoritmose presentan en el cuadro 76.

Cuadro 76. Verificación del algoritmo Número primo

Ejecución N x y Salida1 4 1 1 (1,1)1 2 3 (2,3)1 3 5 (3,5)

4 7 (4,7)

Ejemplo 43. Raíz cuadrada

Calcular la raíz cuadrada entera de un número.

Se sabe que la raíz cuadrada de un número es otro número queal elevarse al cuadrado es igual al primero.

Mientras x <= n hacer

Fin mientras

Inicio

Entero: n, x=1, y

Fin algoritmo

y = 2 * x - 1

Leer n

Escribir “(“,x,”,”,y,”)”

x = x + 1

Page 229: Disenio Algoritmos

229

3. Algoritmos

Algunos números, como los anteriores, tienen una raíz cuadradaexacta, entera; mientras que para otros es un número real, como laraíz de 10 y para los números negativos la raíz es un númerocomplejo o imaginario.

La raíz entera de un número, en el caso de los números que notienen una raíz exacta, se obtiene truncando la parte decimal, porejemplo, la raíz entera de 10 es 3.

En este ejercicio se tiene: dato de entrada es el número, dato desalida es la raíz y el proceso es calcular el cuadrado de losnúmeros, desde 1 hasta la raíz cuadrada del número. Se sabe quese ha encontrado la raíz entera cuando el siguiente número alelevarse al cuadrado da un valor superior al número ingresado. Lasolución a este ejercicio se presenta en notación de pseudocódigoen el cuadro 77.

Cuadro 77. Pseudocódigo del algoritmo raíz cuadrada

1 Inicio2 Entero: n, i = 0, c3 Leer n4 Hacer5 i = i + 16 c = (i+1) * (i+1)7 Mientras (c <= n)8 Escribir “La raíz de”, n, “es”, i9 Fin algoritmo

√10 = 3,16227766

√25 = 5 25 = 52

√4 = 2 4 = 22

Page 230: Disenio Algoritmos

230

Diseño de algoritmos

En el cuadro 78 se presenta los resultados de la ejecución pasoa paso de este algoritmo.

Cuadro 78. Verificación del algoritmo raíz cuadrada

Ejecución N I C Salida1 25 01 1 41 2 91 3 161 4 251 5 36 La raíz de 25 es 52 10 02 1 42 2 62 3 16 La raíz de 10 es 3

4.3.7 Ejercicios propuestos

Diseñar los algoritmos para solucionar los problemas que seplantean a continuación. Se sugiere intercalar notación depseudocódigo, diagrama de flujo y diagrama N-S; y de igual manera,las tres estructuras iterativas estudiadas en este capítulo.

1. Un estudiante cuenta con siete notas parciales en el curso deIntroducción a la programación, se requiere un algoritmo paracalcular el promedio de dichas notas.

2. Diseñar un algoritmo para leer números enteros hasta que seintroduzca el 0. Calcular el cuadrado de los números negativos yel cubo de los positivos.

3. Diseñar un algoritmo para ingresar números, tantos como elusuario desee. Al finalizar el ciclo reportar cuántos númerospares y cuántos impares se registraron, cuánto suman los paresy cuánto los impares.

Page 231: Disenio Algoritmos

231

3. Algoritmos

4. El director de la escuela Buena Nota desea conocer el promediode edad de sus estudiantes en cada grado. La escuela ofreceeducación desde transición a quinto de primaria y cuenta conun grupo de estudiantes en cada grado. Diseñar un algoritmoque lea la edad y el grado de cada estudiante de la escuela ygenere el correspondiente informe.

5. Un entrenador le ha propuesto a un atleta recorrer una ruta decinco kilómetros durante 10 días, para determinar si es aptopara la prueba de 5 kilómetros. Para considerarlo apto debecumplir las siguientes condiciones:

Que en ninguna de las pruebas haga un tiempo mayor a 20minutos.

Que al menos en una de las pruebas realice un tiempo menorde 15 minutos.

Que su promedio sea menor o igual a 18 minutos.

Diseñar un algoritmo para registrar los datos y decidir si esapto para la competencia.

6. Una compañía de seguros tiene contratados a n vendedores.Cada vendedor recibe un sueldo base y un 10% extra porcomisiones de sus ventas. Se requiere un algoritmo paracalcular el valor a pagar a cada empleado y los totales a pagarpor concepto de sueldos y comisiones.

7. Elaborar un algoritmo para procesar las notas definitivas deBiología para un grupo de n estudiantes. Se desea conocer elpromedio del grupo, clasificar a los estudiantes en: excelentes,buenos, regulares y descuidados, según la nota obtenida ycontar cuántos pertenecen a cada categoría. La escala es:

Nota >= 4.8: excelente4.0 <= nota <= 4.7: bueno3.0 <= nota <= 3.9: regularnota <= 2.9: descuidado

Page 232: Disenio Algoritmos

232

Diseño de algoritmos

8. Diseñar un algoritmo que genere el n-ésimo número de la serieFibonacci.

9. Se aplicó una encuesta a n personas solicitando su opiniónsobre el tema del servicio militar obligatorio para las mujeres.Las opciones de respuesta fueron: a favor, en contra y noresponde. Se solicita un algoritmo que calcule qué porcentajede los encuestados marcó cada una de las respuestas.

10. Se requiere un algoritmo que mediante un menú cumpla lasfunciones de una calculadora: suma, resta, multiplicación,división, potenciación y porcentaje. El menú contará con laopción apagar para terminar la ejecución del algoritmo.

11. Se requiere un algoritmo para facturar una venta con nartículos. En cantidades mayores a 10 unidades de un mismoartículo se aplicará un descuento del 5%.

12. Diseñar un algoritmo que lea un número entero y sume losdígitos que lo componen.

13. En el programa Ingeniería de Sistemas se necesita un algoritmopara conocer los porcentajes de estudiantes que trabajan y delos que se dedican únicamente a sus estudios, discriminadospor género.

14. El almacén Buena Ropa cuenta con los registros mensuales deventas y desea un algoritmo para determinar: en qué més setuvo las ventas más altas, en cuál las más bajas y el promediomensual de ventas.

15. Diseñar un algoritmo para calcular el factorial de un número n.

16. Se requiere un algoritmo para encontrar los números primosexistentes entre 1 y n

17. Dado un grupo de 20 estudiantes que cursaron la materiaAlgoritmos, se desea saber cuál es el promedio del grupo, cuál

Page 233: Disenio Algoritmos

233

3. Algoritmos

fue la nota más alta y cuál la más baja, cuántos aprobaron elcurso y cuántos reprobaron.

18. Dada la ecuación y = 2x2+3x – 4 calcular los puntos por los quepasa la parábola en el intervalo -5, 5.

19. Diseñar un algoritmo para encontrar los primeros n númerosperfectos.

20. Diseñar un algoritmo para validar una nota. La nota debe ser unvalor real entre 0 y 5.0. Si se ingresa un valor fuera de esteintervalo se vuelve a leer, hasta que se ingrese una nota válida.

21. Diseñar un algoritmo para validar una fecha en el formatodd/mm/aaaa. Se considera que una fecha es válida si estáentre 01/01/1900 y 31/12/2100, el mes entre 1 y 12 y el díaentre 1 y 31, teniendo en cuenta que algunos meses tienen 28(o 29), 30 o 31 días. Si la fecha no es válida se muestra unmensaje de error y se vuelve a leer los datos. El algoritmotermina cuando la fecha ingresada es válida.

Page 234: Disenio Algoritmos

234

5. ARREGLOS

Es menesterconocerse a sí mismo;

si esto no bastapara hacernos hallar la verdad,

por lo menos sirvepara que arreglemos nuestra vida;

y nada hay más justo que eso.Pascal.

Cuando se piensa en un algoritmo como el diseño de unasolución a un problema haciendo uso de un programa decomputador, es preciso considerar, al menos, cuatro aspectos:

El procesamiento de los datos: las operaciones paratransformar la información de entrada en información desalida.

El almacenamiento de los datos: cómo se guardan y cómose accede a ellos, debe tenerse en cuenta elalmacenamiento en memoria primaria y en memoriasecundaria. Los arreglos son una forma de manejar datosen memoria principal.

La arquitectura del sistema: tiene que ver con la formacómo se organizan y cómo interactúan los diferentescomponentes del sistema. Parte de este tema se aborda enel siguiente capítulo.

Page 235: Disenio Algoritmos

235

3. Algoritmos

Interfaz de usuario: cómo interactúa el usuario con elsistema, de qué elementos dispone y cómo se atiende susrequerimientos. Este tema no se aborda directamente eneste libro.

Los arreglos son estructuras que permiten agrupar datos parafacilitar su manejo en la memoria del computador y realizaroperaciones que requieren tener acceso a conjuntos de datos altiempo, como: buscar y ordenar. Para comprender mejor esteconcepto considérese los siguientes casos:

Primer caso: se requiere un algoritmo para calcular la notadefinitiva de un estudiante a partir de tres notas parciales. En estasituación, como en todos los ejemplos que se han presentado enlos capítulos anteriores, basta con declarar tres variables, una paracada nota.

Segundo caso: se necesita un algoritmo para calcular la notadefinitiva de un grupo de 40 estudiantes, a partir de tres notasparciales, y presentar el listado en orden alfabético. Podría decirseque se declaran 160 variables para las notas y 40 para losnombres; sin embargo, esto es prácticamente inmanejable. Paracasos como este es necesario agrupar los datos del mismo tipo bajoun mismo identificador, de manera que se maneje un arreglo denombres y un arreglo de notas.

5.1 CONCEPTO DE ARREGLO

Se entiende como arreglo una colección de elementos del mismotipo*, almacenados en direcciones seguidas de memoria a loscuales se hace referencia con un mismo identificador o nombre,

* La definición de arreglo como colección de datos del mismo tipo (homogéneos)está generalizada por el uso de lenguajes de programación con definición de tipos,en los que es necesario declarar las variables y los arreglos antes de utilizarlos. Noobstante, en los lenguajes no tipados los arreglos pueden agrupar elementos dediferente clase.

Page 236: Disenio Algoritmos

236

Diseño de algoritmos

pero se distinguen entre sí mediante un índice que representa laposición de cada elemento dentro de la estructura.

En este mismo sentido Brassard y Bratley (1997: 167)consideran el término arreglo como sinónimo de matriz, a la queconceptualizan como una estructura de datos con un número fijo deelementos del mismo tipo, los cuales se almacenan en posicionescontiguas en la memoria del computador, siendo así que al conocerel tamaño de los elementos y la dirección del primero se puedecalcular con facilidad la posición de cualquier ítem, cuando seanecesario, considerando que se organizan de izquierda a derecha.

También se define un arreglo como un tipo de dato compuesto,conformado por una colección de datos simples o compuestos. Deesto se desprende que un elemento de un arreglo puede ser: unnúmero, un carácter, una cadena, un arreglo o un registro.

El uso de arreglos es fundamental cuando se requiere manteneren memoria y operar muchos datos. Por ejemplo: un grupo deestudiantes, una nómina, una factura (incluye varios productos), uninventario, una biblioteca; todos estos conceptos hacen referencia aconjuntos de datos del mismo tipo, en los que se puede realizaroperaciones como: buscar, ordenar, sumar.

Entre las características de los arreglos se tiene: Son estructuras estáticas; es decir, que una vez definidas

no se puede cambiar su tamaño. Almacenan datos homogéneos, excepto en lenguajes no

tipados Los datos se almacenan en memoria ocupando posiciones

seguidas, de manera que solo es necesario la referencia alprimer elemento

Tienen un mismo identificador (nombre de variable) querepresenta a todos los elementos.

Los elementos individuales se reconocen por el índice oposición que ocupan en el arreglo.

Page 237: Disenio Algoritmos

237

3. Algoritmos

5.2 CLASES DE ARREGLOS

Los arreglos se clasifican de acuerdo con su contenido; enconsecuencia, se tienen arreglos numéricos, arreglos de caracteres,arreglos de cadenas, arreglos de registros y arreglos de arreglos.

Cuando un arreglo está conformado por datos simples, comonúmeros o caracteres, se dice que es lineal o que tiene una soladimensión (unidimensional) y se les da el nombre de vectores; éstostienen sólo un índice. Cuando los elementos del arreglo sontambién arreglos se dice que es multidimensional, tienen un índicepor cada dimensión y se les denomina matrices. En las figuras 82,83 y 84 se muestran las representaciones gráficas de arreglos deuna, dos y tres dimensiones.

Figura 82. Representación gráfica de un vector

Datos del arreglo

Posición o índice 1 2 3 4 5 6 7

Figura 83. Representación gráfica de una matriz de dos dimensiones

Índice de columnas: j

Índice defilas: i

1 2 3 4 5 6

1 1,1

2 2,3

3

4 4,6

Page 238: Disenio Algoritmos

238

Diseño de algoritmos

Figura 84. Representación gráfica de una matriz de tres dimensiones

Como se puede apreciar en las gráficas, un vector es una listacuyos elementos se identifican con un solo índice, mientras que unamatriz de dos dimensiones requiere dos índices: uno para filas yotro para columnas; y una matriz de tres dimensiones requiere tresíndices ya que la estructura es análoga a un artefacto tridimen-sional, como si fuera una caja con largo, ancho y alto, dividida encompartimentos igualmente tridimensionales. Teóricamente sepueden definir matrices de dos, tres, cuatro o más dimensiones; noobstante, en la práctica es común utilizar vectores y matrices dedos dimensiones, pero no de tres o más. En lo que sigue de estecapítulo se estudia el manejo de vectores y matrices de dosdimensiones.

5.3 MANEJO DE VECTORES

Un vector es una estructura de datos estática correspondiente auna colección de datos del mismo tipo que se agrupan bajo unmismo nombre y se diferencias unos de otros por la posición queocupan en la estructura.

1

2

1

3

4

5

1 2 3 4 5

23

4

1,1,1

5,5,1

1,5,1

5,5,4

1,2,3

Page 239: Disenio Algoritmos

239

3. Algoritmos

Según Timarán et al (2009) un vector es una colección finita yordenada de elementos. Finita, porque todo vector tiene un númerolimitado de elementos y ordenada porque se puede determinar cuáles el primero, el segundo y el n-ésimo elemento.

Por ejemplo, si se tienen las edades de siete estudiantes sepueden almacenar en una estructura de tipo vector llamado v_edadde siete elementos. Gráficamente este vector se vería como lafigura 85.

Figura 85. Representación gráfica de un vector de edades

Datos del vector 15 16 18 19 20 21 16 = v_edadPosición o índice 1 2 3 4 5 6 7

5.3.1 Declaración

Declarar un vector debe entenderse como el proceso de reservarun espacio en memoria para almacenar un número determinado dedatos, los cuales se distinguirán mediante un identificador y uníndice, tal como se ha descrito en páginas anteriores.

La forma más sencilla y a la vez más funcional de declarar unvector es la siguiente:

Tipo_dato: identificador[tamaño]

Ejemplos:

Entero: v_edad[7]

Se está declarando un vector de siete elementos de tipo entero,como el que se mostró en la figura 85, lo que equivale a decir quese reserva espacio en memoria para almacenar siete datos enterosen posiciones consecutivas y que se reconocerán con elidentificador v_edad.

Page 240: Disenio Algoritmos

240

Diseño de algoritmos

Cadena: v_nombre[30]

Esta declaración reserva memoria para almacenar 30 nombres alos que se reconocerá con el identificador: v_nombre.

5.3.2 Acceso a elementos

Para acceder a un elemento de un vector y llevar a cabooperaciones como: asignación, lectura, impresión y conformaciónde expresiones, es necesario escribir el identificador (nombre) delarreglo y entre corchetes la posición a la que se hace referencia, dela forma:

vector[pos]

Ejemplo de declaración y acceso a los elementos de un vector:

Entero: v_edad[7]v_edad[1] = 15v_edad[3] = 18v_edad[6] = 21

Se declara un vector de siete posiciones y se asigna datos en lasposiciones 1, 3 y 6. La representación gráfica se muestra en lafigura 86.

Figura 86. Vector con datos

Datos del arreglo 15 18 21

Posición o índice 1 2 3 4 5 6 7

Para leer un número y guardarlo en la cuarta posición se escribe:

Leer v_edad[4]

Page 241: Disenio Algoritmos

241

3. Algoritmos

Para imprimir el dato almacenado en la sexta posición seescribe:

Escribir v_edad[6]

De forma similar se puede construir expresiones utilizando loselementos del vector, por ejemplo, si se quiere conocer la diferenciaentre las edades almacenadas en las posiciones 1 y 3 se escribe:

Entero: difdif = v_edad[1] – v_edad[3]

En síntesis, cuando se escribe el identificador del vector juntocon la posición de un elemento éstos se comportan como si setratara de una variable sobre la que se puede realizar diferentesoperaciones.

5.3.3 Recorrido de un vector

Muchas operaciones que se aplican sobre vectores incluyen atodos los elementos, en estos casos es necesario accederconsecutivamente desde la primera hasta la última posición, a estose le llama recorrido de un vector.

Para recorrer un vector se utiliza una estructura iterativacontrolada por una variable que comienza en 1, para hacerreferencia a la primera posición, y se incrementa de uno en unohasta alcanzar el tamaño del arreglo, de la forma:

Tipo_Dato: vector[n]*

int: ipara i = 1 hasta n hacer

operación sobre vector[i]fin para

* n es el tamaño del vector

Page 242: Disenio Algoritmos

242

Diseño de algoritmos

La variable i representa la posición de cada uno de loselementos; de este modo, cualquier operación que se defina sobrevector[i] al interior del ciclo se llevará a cabo sobre cada uno de loselementos del vector.

Ejemplo 44. Guardar números en vector

Diseñar un algoritmo que lea 10 números y los guarde en unvector.

Para solucionar este ejercicio es necesario utilizar lasoperaciones que se han explicado en las páginas anteriores:declaración, recorrido y acceso a los elementos de un vector. Eldiagrama N-S de este algoritmo se presenta en la figura 87.

Figura 87. Diagrama N-S para guardar números en un vector

Inicio

Entero: numero[10], i

Para i = 1 hasta 10 hacer

Leer numero[i]

Fin para

Fin algoritmo

En este algoritmo se aprecia el uso de una estructura iterativapara recorrer el vector y leer un dato para cada posición, se utiliza lavariable de control del ciclo (i) como índice para identificar loselementos del arreglo.

Ejemplo 45: Entrada y salida de datos de un vector

Diseñar un algoritmo para leer 10 números, guardarlos en unvector y luego mostrarlos en orden inverso a como se introdujeron.

Una de las ventajas de manejar arreglos es que permitenalmacenar conjuntos de datos en memoria y acceder fácilmente aellos. Los datos que están en memoria pueden ser listados en

Page 243: Disenio Algoritmos

243

3. Algoritmos

cualquier orden, según el extremo por el cual se aborde el recorridodel vector.

El recorrido se hace utilizando la variable de control del ciclocomo índice del vector. Si la variable comienza en 1 y seincrementa, se hará un recorrido hacia adelante; mientras que sicomienza en 10 y se decrementa se hará un recorrido hacia atrás.

En este algoritmo se declara un vector y se utilizan dos ciclos: elprimero hace un recorrido desde la posición 1 hasta la 10ingresando el dato para cada posición y el segundo hace unrecorrido desde la última posición hasta la primera imprimiendo eldato de cada posición. El diagrama N-S de este algoritmo sepresenta en la figura 88.

Figura 88. Diagrama N-S para entrada y salida de datos de un vector

Inicio

Entero: v[10], i

Para i = 1 hasta 10 hacer

Leer v[i]

Fin para

Para i = 10 hasta 1 decrementar 1 hacer

Escribir v[i]

Fin para

Fin algoritmo

Si al verificar el algoritmo se ingresan los datos: 2, 4, 6, 8, 10,12, 14, 16, 18, 20, el vector se vería como en la figura 89:

Figura 89. Representación gráfica de un vector

2 4 6 8 10 12 14 16 18 20

1 2 3 4 5 6 7 8 9 10

Page 244: Disenio Algoritmos

244

Diseño de algoritmos

Al recorrer el vector y mostrar los datos comenzando por ladécima posición se tendría los datos en este orden: 20, 18, 16, 14,12, 10, 8, 6, 4, 2.

Ejemplo 46: Calcular promedio de números en un vector

Leer 10 números enteros y almacenarlos en un vector. Calculary mostrar el promedio, en seguida generar un listado con losnúmeros menores al promedio y otro con los números mayores aéste.

Leer números y calcular el promedio se puede hacer únicamenteutilizando ciclos, pero cuando se solicita que se muestre losnúmeros menores y mayores al promedio, por separado, esevidente que se tiene que haber guardado los números para poderacceder a ellos y compararlos con el promedio de los mismos. Aquíes evidente la necesidad de utilizar un vector, en caso contrariosería necesario declarar 10 variables y luego implementar 20decisiones para comparar los números, esto realmente sería unamala práctica de programación, especialmente si se considera queasí como son 10 números podrían ser 100.

Para comprender mejor el ejercicio, supóngase el vector que semuestra en la figura 90.

Figura 90. Representación gráfica del vector numérico

2 44 16 8 10 32 24 160 13 20

1 2 3 4 5 6 7 8 9 10

Una vez que se tienen los datos en el vector es necesariocalcular el promedio y para ello es preciso calcular la sumatoria,para este caso se tiene:

Suma = 329Promedio = 32,9

Page 245: Disenio Algoritmos

245

3. Algoritmos

Para generar la lista de los números mayores al promedio sedebe comparar cada elemento del vector con el valor obtenidocomo promedio:

Números mayores al promedio: 44, 160

De la misma forma se obtienen el segundo listado:

Números menores al promedio: 2, 16, 8, 10, 32, 24, 13, 20

Ahora se procede al diseño del algoritmo teniendo en cuentaesta información:

Datos de entrada: número (10 números leídos al interior de unciclo y guardados en un vector)

Estructura de almacenamiento: vector de 10 elementos

Datos de salida: promedio, números menores al promedio ynúmeros mayores al promedio

Proceso: suma = suma + número (en cada posición del vector)promedio = suma / 10

En este algoritmo se implementan tres ciclos, uno para leer losdatos y guardarlos en cada posición del vector y dos más paragenerar los dos listados de forma independiente.

El algoritmo se presenta en el cuadro 79 en notación depseudocódigo.

Page 246: Disenio Algoritmos

246

Diseño de algoritmos

Cuadro 79. Verificación del algoritmo raíz cuadrada

1. Inicio2. Entero: v[10], i, suma = 03. Real: prom4. Para i = 1 hasta 10 hacer5. Leer v[i]6. suma = suma + v[i]7. Fin para8. prom = suma / 109. Escribir “Promedio:”, prom10. Escribir “Mayores al promedio”11. Para i = 1 hasta 10 hacer12. Si v[i] > prom entonces13. Escribir v[i]14. Fin si15. Fin para16. Escribir “Menores al promedio”17. Para i = 1 hasta 10 hacer18. Si v[i] < prom entonces19. Escribir v[i]20. Fin si21. Fin para22. Fin algoritmo

Page 247: Disenio Algoritmos

247

3. Algoritmos

5.4 MANEJO DE MATRICES

Una matriz es un conjunto de elementos dispuestos a lo largo dem filas y n columnas, conocidas también como diagrama de dobleentrada o tabla completa (Gran Enciclopedia Espasa, 2005: 7594).

En programación se define una matriz como una estructura dedatos estática que bajo un identificador almacena una colección dedatos del mismo tipo, es un arreglo de dos dimensiones, organizadoen forma de filas y columnas; y por lo tanto utiliza dos índices paraidentificar los elementos. Gráficamente una matriz tiene la forma deuna tabla de doble entrada como la mostrada en la figura 91.

Figura 91. Representación gráfica de una matriz

Índice de columnas: j

Índice defilas: i

1 2 3 4 5 6

1 1,1 1,2 1,3 1,4 1,5 1,6

2 2,1 2,2 2,3 2,4 2,5 2,6

3 3,1 3,2 3,3 3,4 3,5 3,6

4 4,1 4,2 4,3 4,4 4,5 4,6

5.4.1 Declaración

Para declara una matriz se utiliza la misma sintaxis que para losvectores, con la variación de que se utiliza dos tamaños para indicarla cantidad de filas y la cantidad de columnas. La forma general dedeclarar una matriz es:

TipoDato: identificador[m][n]

Page 248: Disenio Algoritmos

248

Diseño de algoritmos

Donde m es el número de filas y n el número de columnas. Eltotal de posiciones disponibles en la matriz es el producto de lacantidad de filas por la cantidad de columnas: m * n.

Ejemplos:

Entero: mat[4][6]Carácter: letras[10][12]

En la primera instrucción se declara la matriz mat de cuatro filasy seis columnas, como la mostrada en la figura 89, con capacidadpara contener 24 números enteros. En la segunda, la matriz letrasde 10 filas y 12 columnas, lo que reserva un espacio para guardar120 caracteres.

5.4.2 Acceso a elementos

Para hacer referencia a un elemento de una matriz es necesarioespecificar el identificador o nombre de la matriz y entre corchetesel índice de filas y el índice de columnas, de la forma:

Identificador [i][j]

Donde i hace referencia a la fila y j a la columna. Al escribir elidentificador y los dos índices se hace referencia a un elemento enparticular; por tanto, puede utilizarse como una variable sencilla ala que se le asigna datos y desde la que se toman para conformarexpresiones o para enviar a un dispositivo de salida.

Ejemplo:

Entero: m[3][4]m[1][1] = 2m[2][2] = 5m[3][4] = 15

Page 249: Disenio Algoritmos

249

3. Algoritmos

La primera instrucción declara la matriz m, la segunda asigna elnúmero 2 a la primera posición de m, la tercera asigna el número 5al elemento ubicado en la intersección entre la fila 2 y la columna 2y de forma similar, la cuarta almacena el número 15 en la posición3,4. Gráficamente, el resultado de estas expresiones sería como lafigura 92.

Figura 92. Representación gráfica de una matriz con datos

1 2 3 41 2

2 5

3 15

5.4.3 Recorrido de una matriz

Algunas operaciones se aplican sobre todos y cada uno de loselementos de la matriz, como: leer y guardar datos, imprimir todoslos datos, buscar un elemento o sumar una matriz numérica, enestos casos, al acto de visitar consecutivamente todos loselementos de la estructura se le denomina recorrido. Para recorreruna matriz se precisan dos ciclos anidados: uno para desplazarsepor las filas y otro por las columnas.

En términos generales, para recorrer una matriz de tamaño m * nse define los ciclos de la forma:

Para i = 1 hasta m hacerPara un j = 1 hasta n hacer

Operación sobre el datoFin para

Fin para

Page 250: Disenio Algoritmos

250

Diseño de algoritmos

Ejemplo 47. Llenar una matriz

Para poner en práctica cuanto se ha estudiado respecto adeclaración, acceso y recorrido de una matriz, en este ejemplo sedeclara una matriz de 5 * 10, se recorre posición a posición, se leey guarda un número en cada una de ellas. El diagrama de flujo deeste algoritmo se presenta en la figura 93.

Figura 93. Diagrama de flujo para llenar matriz

En el ejemplo se declara una matriz de 5 filas por 10 columnaspara un total de 50 posiciones. Se utiliza un ciclo con la variable ipara recorrer todas las filas, y estando en cada una de ellas, seutiliza un ciclo con la variable j para recorrer cada una de lascolumnas; es decir, cada una de las posiciones en la fila i-ésima yen cada posición se almacena un valor leído desde el teclado.

Inicio

Entero: i, j, mat[5][10]

Fin

Para j = 1, 10

Para i = 1, 5

mat[i][j]

Page 251: Disenio Algoritmos

251

3. Algoritmos

Ejemplo 48. Imprimir el contenido de una matriz

Declarar una matriz de 4*6, llenar cada posición con la suma desus índices y luego mostrar su contenido. Para esto es necesarioimplementar dos recorridos independientes, uno para cada opera-ción, el primero para llenar la matriz y el segundo para mostrar sucontenido. Una vez efectuado el primer recorrido la matriz estarácomo la que se muestra en la figura 94. El diagrama de N-S de estealgoritmo se presenta en la figura 95.

Figura 94. Matriz de 4 * 6

m[i][j] 1 2 3 4 5 61 2 3 4 5 6 7

2 3 4 5 6 7 8

3 4 5 6 7 8 9

4 5 6 7 8 9 10

Este algoritmo implementa dos recorridos de matriz utilizandocuatro ciclos anidados de dos en dos. En el primer recorrido sesuman las variables i + j y se guarda el resultado en la posicióncorrespondiente de la matriz; en el segundo recorrido, en cadacambio de fila se imprime “\n”, este es un código común enprogramación que significa salto de línea, es decir: pasar a la líneaque sigue, y en cada cambio de columna se imprime código “\t”,igualmente común en programación, éste significa introducir unatabulación y se utiliza en este caso para separar los números entresi, seguidamente se imprime el contenido de la celda. De estaforma, al ejecutar este algoritmo se obtiene una salida como ésta:

2 3 4 5 6 7

3 4 5 6 7 8

4 5 6 7 8 9

5 6 7 8 9 10

Page 252: Disenio Algoritmos

252

Diseño de algoritmos

Figura 95. Diagrama N-S para imprimir el contenido de una matriz

Inicio

Entero: m[4][6], i, j

Para i = 1 hasta 4 hacer

Para j = 1 hasta 6 hacer

m[i][j] = i + j

Fin para

Fin para

Para i = 1 hasta 4 hacer

Escribir “\n”

Para j = 1 hasta 6 hacer

Escribir “\t”, m[i][j]

Fin para

Fin para

Fin algoritmo

Page 253: Disenio Algoritmos

253

3. Algoritmos

5.5 MÁS EJEMPLOS CON ARREGLOS

Ejemplo 49. Buscar los datos mayor y menor en un vector

Diseñar un algoritmo para guardar 12 números en un vector yluego identificar el número menor, el número mayor y la posición enque se encuentra cada uno de éstos.

La primera parte de este ejercicio, concerniente a declarar elvector y guardar los números se realiza de igual forma que en losejercicios anteriores: usando una estructura iterativa. La segundaparte: identificar el número mayor y el número menor, requiere unaestrategia de solución.

La estrategia consiste en declarar dos variables: una paramantener la posición del número mayor identificado y otra para laposición del menor. Las dos variables se inicializan en uno paracomenzar las comparaciones desde el primer elemento del vector.

Para el diseño de la solución se tiene en cuenta los siguientesdatos:

Datos de entrada: número (se lee 12 veces)

Datos de salida: mayor valor, posición del mayor, menor valor yposición del menor

Estructura de almacenamiento: vector de 12 posiciones

Proceso: comparación y asignación

El pseudocódigo de este algoritmo se presenta en el cuadro 80.

Al hacer la verificación del algoritmo e introducir los datos: 3, 54,1, 32, 9, 58, 31, 90, 23, 67, 72 y 112; se tiene el vector que semuestra en la figura 96.

Page 254: Disenio Algoritmos

254

Diseño de algoritmos

Cuadro 80. Pseudocódigo para buscar los datos mayor y menor en un vector

1. Inicio2. Entero: v[12], i, pmay = 1, pmen = 13. Para i = 1 hasta 12 hacer4. Leer v[i]5. Fin para6. Para i = 1 hasta 12 hacer7. Si v[i] > v[pmay] entonces8. pmay = i9. Si no10. Si v[i] < v[pmen] entonces11. pmen = i12. fin si13. Fin si14. Fin para15. Escribir “Número mayor:”, v[pmay], “en la posición:”,pmay16. Escribir “Número menor:”, v[pmen], “en la posición:”,pmen17. Fin algoritmo

Figura 96. Vector con datos del ejemplo 49

3 54 1 32 9 58 31 90 23 67 72 112

1 2 3 4 5 6 7 8 9 10 11 12

La salida obtenida al ejecutar el algoritmo con los datosmencionados es:

Número mayor: 112 en posición: 12Número menor: 1 en posición: 3

Valor menor Valor mayor

Page 255: Disenio Algoritmos

255

3. Algoritmos

Ejemplo 50. Recurrencia de un dato en un arreglo

Se tiene una lista de 25 estudiantes y el municipio de origen. Serequiere un algoritmo para guardar la lista en una matriz y consultarlos estudiantes que provienen de un municipio determinado.

Este algoritmo se estructura en dos operaciones básicas: laprimera consiste en almacenar los datos en una matriz de 25 filas ydos columnas, para lo cual se hace un recorrido leyendo los datospara cada posición; y ubicar los estudiantes del municipiosolicitado, esto implica leer el dato a buscar y luego hacer unrecorrido en el que se compara el dato de referencia con los datosalmacenados en la segunda columna de la matriz, si coinciden seincrementa un contador y se muestra el contenido de la primeracolumna. Sistematizando la información del ejercicio se tiene:

Datos de entrada: nombres de estudiantes, municipio deprocedencia y municipio consultado

Estructura de almacenamiento: matriz de 25 filas y 2 columnasDatos de salida: nombres de estudiantes y contadorProceso: comparar y contar

La solución de este ejercicio se presenta en la figura 97.

Ejemplo 51. Diferencia de vectores

Diseñar un algoritmo que almacene datos en dos vectores yluego identifique y muestre los elementos que están en el primero yno están en el segundo.

En este caso, lo primero que se debe hacer es declarar dosvectores y llenarlos con datos, luego se hace un recorrido en elprimer vector y por cada elemento de éste se hace un recorrido enel segundo vector buscando las coincidencias del elemento, de estaforma se averigua si el dato se encuentra en los dos arreglos, encuyo caso se levanta una bandera. Al comenzar cada ciclo internose inicializa la bandera y si al finalizar el recorrido del segundovector la bandera se mantiene abajo se muestra el elemento del

Page 256: Disenio Algoritmos

256

Diseño de algoritmos

primer vector. En la figura 98 se observa gráficamente lascomparaciones efectuadas para el primer elemento.

Figura 97. Diagrama N-S recurrencia de datos en una matriz

Inicio

Cadena: lista[25][2], i, muni,Entero con = 0

Para i = 1 hasta 25 hacer

Escribir “Nombre del estudiante:”

Leer lista[i][1]

Escribir “Municipio de procedencia:”

Leer lista[i][2]

Fin para

Leer muni

Para i = 1 hasta 25 hacer

lista[i][2] = muniSi No

Escribir lista[i][2]

con = con + 1

Fin para

Escribir “Se encontraron ”, con, “estudiantes de ”, muni

Fin algoritmo

Page 257: Disenio Algoritmos

257

3. Algoritmos

Figura 98. Diferencia de vectores

En este ejemplo el primer vector contiene los primeros 10múltiplos de 3 y el segundo los primeros 10 múltiplos de 6. Laslíneas muestran las comparaciones que se hacen desde el primerelemento del vector 1 con todos los elementos del vector 2, luegose hará lo propio con el segundo elemento y con el tercero, hastacompletar el recorrido del primer vector. Los círculos muestras loselementos que durante los recorridos se identifican como comunesa los dos vectores, de esta manera los elementos del primer arregloque no están encerrados con círculo corresponden a la diferencia:3, 9, 15, 21, 27. Es decir, los múltiplos de 3 que no son múltiplosde 6. El diagrama de flujo de la solución a este ejercicio se presentaen la figura 99.

1 2 3 4 5 6 7 8 9 103 6 9 12 15 18 21 24 27 30a

1 2 3 4 5 6 7 8 9 10

6 12 18 24 30 36 42 48 54 60b

Page 258: Disenio Algoritmos

258

Diseño de algoritmos

Figura 99. Diagrama de flujo del algoritmo diferencia de vectores

Inicio

Entero: a[10], b[10], i, j, bdra

Fin

Para j = 1, 10

Para i = 1, 10

Para j = 1, 10

a[i], b[i]

bdra = 0

a[i]=b[j] bdra = 1Si

No

bdra = 0Si

No

A[i]

Page 259: Disenio Algoritmos

259

3. Algoritmos

Ejemplo 52. Intercalar vectores

Dados dos vectores a y b de n elementos se requiere unalgoritmo para generar un tercer vector (c) con los datos de los dosprimeros intercalados. El nuevo vector tiene un tamaño de 2nposiciones.

Como ejemplo tómese dos vectores (a y b) de cinco elementos eintercálense sus elementos para crear el vector c de 10 elementoscomo se muestra en la figura 100.

Figura 100. Intercalación de vectores

En la solución de este ejercicio se declaran los tres arreglos, losdos primeros se llenan con datos registrados por el usuario y eltercero es el resultado de intercalar los dos primeros. La lectura yalmacenamiento de datos se hace para los dos vectores dentro deun mismo ciclo, el intercalado se hace con un segundo ciclo. Elalgoritmo se muestra en el cuadro 81.

1 2 3 4 511 13 15 17 19a

1 2 3 4 5

12 14 16 18 20b

11 12 13 14 15 16 17 18 19 20c

Page 260: Disenio Algoritmos

260

Diseño de algoritmos

Cuadro 81. Pseudocódigo para intercalar vectores

1. Inicio2. Entero a[5], b[5], c[10], i=1, x=13. Mientras i <= 5 hacer4. Leer a[i], b[i]5. i = i + 16. Fin mientras7. Mientras i <= 5 hacer8. c[x] = a[i]9. x = x + 110. c[x] = b[i]11. x = x + 112. i = i + 113. Fin mientras14. Fin algoritmo

Ejemplo 53. Sumatoria de filas y columnas de una matriz

Dada una matriz de m*n diseñar un algoritmo para sumar cadauna de las filas y guardar los resultados en un vector llamadosumafila, sumar cada una de las columnas y guardar los resultadosen el vector sumacol, finalmente mostrar los dos vectores.

Considérese una matriz de cuatro filas por seis columnas, estoimplica que el vector sumafila deberá tener cuatro posiciones y elvector sumacol seis posiciones, como se muestra en la figura 101.

En este ejemplo se supone que la matriz se llena con losnúmeros consecutivos del 1 al 24. En el algoritmo que se presentaen la figura 102 los datos los digita el usuario.

Page 261: Disenio Algoritmos

261

3. Algoritmos

Figura 101. Sumatoria de filas y columnas de una matriz

1 2 3 4 5 61 1 2 3 4 5 6 21

2 7 8 9 10 11 12 57

3 13 14 15 16 17 18 93

4 19 20 21 22 23 24 129

40 44 48 52 56 60

Figura 102. Diagrama N-S para sumatoria de filas y columnas de una matriz

Inicio

Entero: m[4][6], sumafila[4], sumacol[6], i, j, suma

Para i = 1 hasta 4 hacer

Para j = 1 hasta 6 hacer

Leer m[i][j]

Fin para

Fin para

Para i = 1 hasta 4 hacer

suma = 0

Para j = 1 hasta 6 hacer

suma = suma + m[i][j]

Fin para

sumafila[i] = suma

Fin para

Page 262: Disenio Algoritmos

262

Diseño de algoritmos

Figura 100. (Continuación)

Para j = 1 hasta 6 hacer

suma = 0

Para i = 1 hasta 4 hacer

suma = suma + m[i][j]

Fin para

sumacol[j] = suma

Fin para

Escribir “sumatoria de filas: “

Para i = 1 hasta 4 hacer

Escribir sumafila[i]

Fin para

Escribir “Sumatoria de columnas:”

Para j = 1 hasta 6 hacer

Escribir sumacol[j]

Fin para

Fin algoritmo

Para sumar las filas se precisa hacer un recorrido con dos ciclosanidados, el externo controla el índice de filas y el interno el decolumnas, el acumulador se inicializa antes de comenzar laejecución del ciclo interno y se guarda su valor al terminar esteciclo. Para sumar las columnas se procede de forma similar, peroteniendo en cuenta que el ciclo externo corresponde al índice decolumnas y el interno a filas.

Page 263: Disenio Algoritmos

263

3. Algoritmos

Al ejecutar el algoritmo e introducir los números del 1 al 24 losresultados serían:

Sumatoria de filas: 21 57 93 129Sumatoria de columnas: 40 44 48 52 56 60

Ejemplo 54. Diagonal principal de una matriz

Diseñar un algoritmo para mostrar y sumar la diagonal principalde una matriz cuadrada.

Antes de diseñar el algoritmo, en la figura 103 se identificagráficamente la diagonal principal en una matriz de 5 * 5.

Figura 103. Diagonal principal de una matriz

1 2 3 4 51 1 2 3 4 5

2 6 7 8 9 10

3 11 12 13 14 15

4 16 17 18 19 20

5 21 22 23 24 25

Observando la gráfica se encuentra que los elementos de ladiagonal principal tienen el mismo índice en filas y columnas:m[1][1], m[2][2], m[3][3], m[4][4] y m[5][5]. De esto se concluyeque para recorrer la diagonal no se requieren dos ciclos, basta conuno, y la variable de control del ciclo se la utiliza como índice defilas y de columnas.

En el diagrama de flujo de la figura 104 se implementan dosciclos anidados para leer números y guardarlos en la matriz, luegose implementa un ciclo para recorrer la diagonal, en cada iteraciónse muestra el elemento y se lo adicional al acumulador suma.

Page 264: Disenio Algoritmos

264

Diseño de algoritmos

Figura 104. Diagrama de flujo del algoritmo diferencia de vectores

Inicio

Entero: m[5][5], i, j, suma = 0

Fin

Para j = 1, 5

Para i = 1, 5

m[i][i]

m[i][j]

Para i = 1, 5

suma = suma + m[i][i]

“Sumatoria: “,suma

“Diagonal:”

Page 265: Disenio Algoritmos

265

3. Algoritmos

Ejemplo 55. Procesar notas utilizando arreglos

Se requiere un algoritmo para procesar las notas de un grupo de40 estudiantes, se cuenta con tres notas parciales para cadaestudiante y se desea conocer la nota definitiva, la que se obtienepor promedio. Después de procesar las notas de todos losestudiantes se desea conocer el promedio del grupo.

Para solucionar este ejercicio se requiere utilizar un vector y unamatriz. En el vector se almacenan los nombres de los estudiantes yen la matriz las notas parciales y la definitiva. En consecuencia, elvector será de 40 posiciones y la matriz de 40 filas por cuatrocolumnas. En la figura 105 se muestra el modelo de la estructurade datos para 6 estudiantes.

Figura 105. Arreglos para procesar notas

Vector para nombres Matriz para notas

1 2 3 41 Carlos Salazar 1 3,5 2,5 4,0 3,3

2 Carmen Bolaños 2 4,2 3,8 4,5 4,2

3 Margarita Bermúdez 3 2,0 4,5 4,8 3,8

4 Sebastián Paz 4 2,5 3,5 4,4 3,5

5 Juan Carlos Díaz 5 3,4 3,5 3,8 3,6

6 Verónica Marroquín 6 4,0 4,6 3,3 4,0

Parcial1

Parcial2

Parcial3 Definitiva

Aunque se manejan dos estructuras de datos: un vector y unamatriz, los datos pueden mantener su integridad a través del índicedel vector y el índice de filas. En la matriz las columnascorresponden a las notas, las tres primeras a las notas parciales yla última a la nota definitiva. En este orden de ideas, los datos seleen así: Carlos Salazar tiene 3,5, 2,5 y 4,0 en las calificaciones

Page 266: Disenio Algoritmos

266

Diseño de algoritmos

parciales y su nota definitiva es 3,3. De igual manera en las demásfilas.

Como cada fila en el vector y en la matriz hace referencia a unmismo estudiante, las iteraciones se hacen estudiante porestudiante, por lo tanto sólo se utiliza un ciclo y dentro de éste selee el nombre y las notas parciales, se calcula la nota definitiva, semuestra y se acumula para posteriormente calcular el promedio delcurso. El algoritmo se presenta en notación de pseudocódigo en elcuadro 82.

Cuadro 82. Pseudocódigo para procesar notas utilizando arreglos

1. Inicio2. Cadena: nombres[40]

Real: notas[40][4], suma = 0, promEntero: con

3. Para con = 1 hasta 40 hacer4. Escribir “Nombre: \t “5. Leer nombres[con]6. Escribir “Nota parcial 1: \t “7. Leer notas[con][1]8. Escribir “Nota parcial 2: \t “9. Leer notas[con][2]10. Escribir “Nota parcial 3: \t “11. Leer notas[con][3]12. notas[con][4] = (notas[con][1] + notas[con][2] + notas[con][3])/313. Escribir “Definitiva: \t”, notas[con][4]14. suma = suma + notas[con][4]15. Fin para16. prom = suma / 4017. Escribir “Promedio del curso: \t“, prom18. Fin algoritmo

Verificando el algoritmo y procesando las notas que se utilizaronen el modelo de la figura 105 se tiene como salida:

Page 267: Disenio Algoritmos

267

3. Algoritmos

Nombre: Carlos SalazarNota parcial 1: 3,5Nota parcial 2: 2,5Nota parcial 3: 4,0Definitiva: 3,3

Nombre: Carmen BolañosNota parcial 1: 4,2Nota parcial 2: 3,8Nota parcial 3: 4,5Definitiva: 4,2

… …

Promedio del grupo: 3,7

5.6. EJERCICIOS PROPUESTOS

Solucionar los siguientes ejercicios

1. Dados dos vectores numéricos diseñar un algoritmo queidentifique y muestre los números que tienen en común.

2. Diseñar un algoritmo para sumar dos vectores numéricos

3. Diseñar un algoritmo para trasponer una matriz cuadrada

4. Dadas dos matrices: A[m][n] y B[n][m], diseñar un algoritmopara comprobar si la matriz B es la traspuesta de A.

5. Diseñar un algoritmo para calcular el producto de un númeropor un vector numérico de 10 elementos.

6. Diseñar un algoritmo para multiplicar dos vectores

Page 268: Disenio Algoritmos

268

Diseño de algoritmos

7. Diseñar un algoritmo para insertar un dato en un vector en unaposición escogida por el usuario, si la posición está ocupadalos datos se desplazan a la derecha para dar espacio al nuevodato. Si el vector está lleno no se inserta el dato y se muestraun mensaje.

8. Se tiene un vector de caracteres en el que se ha almacenadouna frase. Se requiere un algoritmo que determine si la frasees un palíndromo*.

9. Diseñar un algoritmo para hacer circular los datos de un vector:todos los elementos se desplazan una posición y el últimoelemento pasa a ocupar la primera posición.

10. Diseñar un algoritmo para determinar si dos matrices soniguales; es decir, verificar si para todos los elementos secumple que A[i][j] = B[i][j]

11. Diseñar un algoritmo para determinar si dos matricescontienen los mismos elementos aunque estos no sepresenten en el mismo orden.

12. Diseñar un algoritmo para sumar dos matrices

13. Diseñar un algoritmo para determinar si una matriz essimétrica

14. Diseñar un algoritmo para calcular el producto de un númeropor una matriz

15. Diseñar un algoritmo para calcular el producto de dos matrices

16. Dada la matriz Letras[20][20] que está completamente llena decaracteres del alfabeto calcular la frecuencia absoluta y lafrecuencia relativa para cada una de las vocales.

* Palindromo: palabra o frase que se lee igual de izquierda a derecha, que dederecha a izquierda. (Circulo Enciclopedia Universal, 2006:1670)

Page 269: Disenio Algoritmos

269

3. Algoritmos

17. Para facturar el servicio de energía la empresa Energía ParaTodos cuenta con una lista de usuarios almacenada en unvector y la lista de lecturas del mes anterior en un segundovector. Se requiere un algoritmo que lea el valor del kW, tomela lectura actual de cada usuario y la registre en un tercervector, calcule el consumo del mes por diferencia de lecturas ymuestre para cada usuario: nombre, consumo y valor a pagar.

Page 270: Disenio Algoritmos

270

6. SUBPROGRAMAS

Un ordenador digitales como el cálculo.

Puede dividir un problemaen partes tan pequeñas

como desee.Van Doren

A lo largo de este documento se han propuesto y explicadonumerosos ejemplos; no obstante, estos han sido pensados parailustrar un tema en particular y no tienen la complejidad de losproblemas reales, en los que la solución puede incluir miles, cientosde miles o millones de líneas de código fuente.

Los programas diseñados para solucionar problemas reales deprocesamiento de datos, que atienden conjuntos grades derequisitos y responden a múltiples restricciones, aquellos queBooch(1994: 4) denomina software de dimensión industrial nopueden emprenderse como una sola pieza, pues su construcción,corrección y mantenimiento resultaría una tarea demasiado difícil ycostosa.

La estrategia más difundida para reducir la complejidad seconoce como divide y vencerás. Ésta consiste en descomponer elproblema que se quiere resolver en un determinado número desubproblemas más pequeños, resolver sucesiva e independien-temente todos los subproblemas, luego combinar las soluciones

Page 271: Disenio Algoritmos

6. Subprogramas

271

obtenidas para, de esta manera, solucionar el problema original(Brassard y Bratley, 1997: 247), (Aho, Hopcroft y Ullman, 1988:307). De ésta forma, un programa está conformado por variossubprogramas.

Un subprograma o subrutina implementa un algoritmo diseñadopara una tarea particular, por tanto no puede constituirse en unasolución a un problema por sí mismo, sino que es llamado desdeotro programa o subprograma.

En Oviedo (2002) se puede identificar algunas ventajas de lautilización de subprogramas, como son: la fragmentación delprograma en módulos proporciona mayor claridad y facilidad paradistribuir el trabajo entre los miembros del equipo de desarrollo,facilidad para escribir, probar y corregir el código, estructura lógicadel programa más comprensible y la posibilidad de ejecutarrepetidas veces el subprograma.

Considerando la naturaleza de la tarea que el subprogramarealiza y si devuelve o no datos al programa que lo llama, lossubprogramas se catalogan como funciones o procedimientos(Oviedo, 2002).

6.1. FUNCIONES

El concepto de función en el campo de la programación fuetomado de las matemáticas y consiste en establecer una relaciónentre dos conjuntos: origen y espejo, donde a cada elemento delprimero le corresponde uno del segundo (Gran Enciclopedia Espasa,2005: 5140). En términos de Joyanes (1996: 166), una función esuna operación que toma uno o más valores y genera un nuevo valorcomo resultado. A los valores que entran a la función se lesdenomina argumentos. En este mismo sentido, Timarán et al(2009: 57) define una función como: un subprograma que recibeuno o más parámetros, ejecuta una tarea específica y devuelve unúnico valor como resultado, al programa o función que la invocó.

Page 272: Disenio Algoritmos

Diseño de algoritmos

272

Una función se representa de la forma:

y = f(x)f(x) = 3x - 2

Y se lee y depende de x o y es una función de x y significa quepara obtener el valor de y es necesario reemplazar x por un valor(argumento) y realizar la operación que indica la función. Porejemplo, si se resuelve la función con x = 2, se obtiene y= 4.

Una característica importante de las funciones es que suresultado depende exclusivamente del valor o los valores que recibecomo argumentos. Si se toma la función del Máximo Común Divisor,ésta requiere dos argumentos y el resultado que genere serádiferente para cada par de argumentos.

Sea f(x,z) el Máximo Común Divisor de x y z. Entonces:

f(12,18) = 6f(40,60) = 20

Las funciones se clasifican en dos tipos: internas y externas.

Funciones internas. Son aquellas que están definidas en ellenguaje de programación, se distribuyen en forma de librerías* ode APIs† y se utilizan como base para el desarrollo de losprogramas. Estas atienden necesidades generales y suelenagruparse dependiendo del dominio en que pueden ser utilizadas,por ejemplo: matemáticas, cadenas, fechas, archivos.

Funciones externas. También se conocen como funcionesdefinidas por el usuario y son todas aquellas escritas por el

* Es una colección de programas y subprogramas normilizados y probados con losque se puede resolver problemas específicos (Lopezcano, 1998: 322).† API es una sigla de las palabras en Inglés Application Programming Interface, enEspañol: Interfaz para programación de aplicaciones o conjunto de herramientaspara desarrollar un programa.

Page 273: Disenio Algoritmos

6. Subprogramas

273

programador para atender necesidades particulares en susaplicaciones.

6.1.1.Diseño de una Función

Una función tiene dos partes: la definición y la implementación,algunos autores, como Joyanes (1996: 167) y Galve et al (1993:30), las denominan cabecera y cuerpo respectivamente. En unprograma, por ejemplo en lenguaje C, la definición de la función leproporciona al compilador información sobre las características quetiene la función cuya implementación aparecerá más adelante. Estoayuda a verificar la corrección del programa.

Definición de la función. Ésta incluye tres elementos que sonexplícitos en las notaciones pseudocódigo y diagramas de Nassi-Shneiderman, más no en los diagramas de flujo, estos son:

a. El tipo de retornob. El identificador o nombre de la funciónc. La lista de parámetros

Hasta hace algunos años era común definir una función de laforma:

Función identificador(parámetros): tipo_retorno

Ejemplo:

Función factorial(entero n): entero

Esta instrucción define la función llamada factorial la que recibeun número entero como parámetro y lo almacena en la variable n ydevuelve como resultado un número entero.

Actualmente y para mantener la similitud con los lenguajes deprogramación actuales se definen de la forma:

Tipo_retorno identificador(parámetros)

Page 274: Disenio Algoritmos

Diseño de algoritmos

274

Ejemplos:

Entero factorial(entero n)Real potencia(entero base, entero exponente)Boobleano esprimo(entero n)

Se ha suprimido la palabra reservada función y se coloca el tipode retorno al comenzar la definición. Esta es la forma como sedefinirán las funciones en lo que sigue del libro.

Parámetros. Dado que una función se especializa en desarrollaruna tarea, que por lo general es un cálculo, no se puede esperarque también se encargue de la lectura e impresión de datos; poreso, es necesario suministrarle los datos que ésta requiere paradesarrollar el cálculo, a estos datos que se le entregan se lesdenomina parámetros.

En este orden de ideas, los parámetros son los datos que se leenvían a la función para que desarrolle la tarea para la que fuediseñada. Por ejemplo, si se diseña una función para calcular elfactorial, es necesario pasarle como parámetro el número para elcual se desea encontrar el factorial; si se diseña una función paracalcular una potencia, es preciso que se le proporcione la base y elexponente.

La declaración de parámetros forma parte de la definición de lafunción, se trata de colocar entre paréntesis los tipos y losidentificadores de los datos que se entregarán a la función. Estasdeclaraciones se constituyen en variables locales de la función. Enla definición:

Real potencia(entero base, entero exponente)

Se está expresando que la función potencia recibirá dos datosde tipo entero y los almacenará en las variables: base y exponente.

En diagrama de flujo, una función no tiene una definiciónexplícita. No obstante, en este documento, se la diferencia de un

Page 275: Disenio Algoritmos

6. Subprogramas

275

programa en cuanto incluye un símbolo de entrada/salida pararecibir los parámetros y otro para devolver el resultado, como seaprecia en la figura 106.

Figura 106. Diagrama de flujo de una función

Si bien la definición es fundamental por cuando le da existenciae identidad a la función, la implementación es lo que permite que lafunción desarrolle una operación.

Implementación. Es el conjunto de líneas de código oinstrucciones que procesan los datos recibidos como parámetros yproducen el resultado esperado por el programa que invoca lafunción. El cuerpo de la función comienza después de la definición ytermina con la palabra reservada fin seguido del nombre de lafunción, pero en la penúltima línea debe aparecer la instrucciónRetornar o Devolver seguida de un valor o una expresión, como sepuede apreciar en los ejemplos 54 y 55.

Inicio

Fin

Parámetros: p1, p2, …, pn

Cuerpo de la función

Retornar fac

Page 276: Disenio Algoritmos

Diseño de algoritmos

276

Ejemplo 54. Función sumar

Diseñar una función para sumar dos números enteros

Este ejemplo tiene como propósito mostrar la estructura de unafunción, haciendo evidente su definición, parámetros, implemen-tación y retorno.

La función sumar recibe dos parámetros enteros, los suma ydevuelve el resultado, como se muestra en el cuadro 83.

Cuadro 83. Pseudocódigo de la función sumar

1 Entero sumar(entero a, entero b)2 Entero resultado3 resultado = a + b4 Retornar resultado5 Fin sumar

Obsérvese que la función se define de tipo entero, lo quesignifica que el dato que devolverá será de este tipo; enconsecuencia, la variable local que se declara para almacenar elresultado es de tipo entero. En cuanto a los parámetros, aunqueson del mismo tipo es necesario especificar para cada uno que sonde tipo entero, ya que no siempre ocurre así.

Las variables que se declaran en el cuerpo de una función sonde ámbito local y por tanto sólo se puede acceder a ellas dentro dela función. En cuanto la ejecución termina, las variables dejan deexistir.

Ejemplo 55. Función factorial

Diseñar una función para calcular en factorial de un númeroentero positivo. Se sabe que el factorial de 0 es 1 y el factorial decualquier número n mayor 0 es el producto de los números entre 1y n.

Page 277: Disenio Algoritmos

6. Subprogramas

277

La función factorial requiere un parámetro: el número, ydevuelve otro número: el factorial, en su implementación incluye unciclo en el que se calcula el producto desde 1 hasta n, como semuestra en el pseudocódigo del cuadro 84.

Cuadro 84. Pseudocódigo de la función factorial

1 Entero factorial(entero n)2 Entero fac = 1, con3 Para con = 1 hasta n hacer4 fac = fac * con5 Fin para6 Devolver fac7 Fin factorial

6.1.2. Invocación de una Función

La invocación o llamada a una función se hace escribiendo sunombre y la lista de parámetros que ésta requiere, de la forma:

Nombre_función(parámetros)

Ejemplo:

Sumar(123, 432)Factorial(5)

Al ejecutarse un algoritmo o un programa, en el momento en quese encuentra la invocación de una función, el control de ejecuciónpasa a la función. En la ejecución de la función, la primera tareaque se realiza es la declaración de las variables locales y suinicialización con los datos proporcionados como parámetros. Poreso, es muy importante tener en cuenta que los argumentosescritos al invocar la función y la lista de parámetros definidos en eldiseño de la función deben coincidir en tipo y en cantidad, en caso

Page 278: Disenio Algoritmos

Diseño de algoritmos

278

contrario se presentará un error y la ejecución de la función secancelará.

En el momento en que la ejecución de la función encuentra lapalabra retornar el control vuelve exactamente a la línea donde seinvocó la función con el resultado del cálculo efectuado.

El resultado devuelto por una función puede almacenarse enuna variable, puede ser enviado directamente a un dispositivo desalida o puede utilizarse como argumento para otra función, comose muestra en las expresiones a, b y c, respectivamente.

a. x = factorial(8)b. Escribir “Factorial de 8:”, factorial(8)c. sumar(factorial(3), factorial(4))

Ejemplo 56. Operaciones aritméticas

Diseñar el algoritmo principal y las funciones necesarias pararealizar las operaciones aritméticas: suma, resta, multiplicación ydivisión de dos números.

Para solucionar este ejercicio es necesario diseñar cuatrofunciones, una para cada operación, y un programa principal queinvoque la función que corresponda según el requerimiento delusuario. Como cada función se encarga exclusivamente de hacer elcálculo, el programa principal debe encargarse de leer los números,la operación a realizar y mostrar el resultado.

En la implementación de los programas en algunos lenguajes esnecesario definir las funciones antes de invocarlas. Para desarrollarbuenas prácticas de programación, en este ejercicio y en los quesiguen, se diseña primero las funciones o procedimientos y al finalel programa principal.

Las funciones y el programa para este ejercicio se presentan enlos cuadros 85, 86, 87 y 88. La función sumar ya se diseño yaparece en el cuadro 83 por ello no se incluye.

Page 279: Disenio Algoritmos

6. Subprogramas

279

Cuadro 85. Pseudocódigo de la función restar

1 Entero restar(entero a, entero b)2 Entero diferencia3 resultado = a – b4 Retornar diferencia5 Fin restar

Cuadro 86. Pseudocódigo de la función multiplicar

1 Entero multiplicar(entero a, entero b)2 Entero producto3 resultado = a * b4 Retornar producto5 Fin multiplicar

Cuadro 87. Pseudocódigo de la función dividir

1 Entero dividir(entero a, entero b)2 Real cociente = 03 Si b != 0 entonces4 cociente = a / b5 Fin si6 Retornar cociente7 Fin dividir

Page 280: Disenio Algoritmos

Diseño de algoritmos

280

Cuadro 88. Pseudocódigo del algoritmo operaciones aritméticas

1 Inicio2 Entero x, y, opc3 Leer x, y4 Escribir “1. Sumar 2. Restar 3. Multiplicar 4. Dividir”5 Leer opc6 Según sea opc hacer7 1: Escribir “sumatoria = “, sumar(x,y)8 2: Escribir “Diferencia = “, restar(x,y)9 3: Escribir “Producto = “, multiplicar(x,y)10 4: Si y = 0 entonces11 Escribir “Error, divisor = 0”12 Si no13 Escribir “Cociente = “, dividir(x,y)14 Fin si15 Fin según sea16 Fin suma

En las líneas 7, 8, 9 y 13 se realiza el llamado a las funcionespreviamente definidas. Aunque en la función dividir incluye uncondicional para evitar el error de dividir sobre 0, la validación delos datos se hace en el algoritmo principal (línea 10) ya que lafunción sólo puede retornar un valor: el cociente, no un mensaje deerror.

6.1.3.Más ejemplos de funciones

Ejemplo 57. Función potencia

La potenciación es una función matemática que consta de unabase y un exponente: an. El resultado es el producto de multiplicar labase por sí misma tantas veces como indique el exponente, comose explicó en el ejemplo 40.

Page 281: Disenio Algoritmos

6. Subprogramas

281

Esta función requiere dos parámetros: la base y el exponente. Ensu implementación se incluye un ciclo para calcular el productodesde uno hasta el valor absoluto de n y una decisión paradeterminar si el exponente es negativo, en cuyo caso el resultado esuno sobre el producto obtenido.

En el cuadro 89 se diseña la función para obtener el valorabsoluto de un número, en el cuadro 90 la función potencia y en el91 el algoritmo principal que invoca a potencia.

Cuadro 89. Pseudocódigo de la función valor absoluto

1 Entero valorabsoluto (entero n)2 Si n < 0 entonces3 n = n * -14 Fin si5 Retornar n6 Fin valorabsoluto

Cuadro 90. Pseudocódigo de la función potencia

1 Real potencia(entero a, entero n)2 Entero p= 1, x3 Para x = 1 hasta valorabsoluto(n) hacer4 p = p * a5 Fin para6 Si n < 0 entonces7 p = 1 / p8 Fin si9 Retornar p10 Fin potencia

a-n =1an

Page 282: Disenio Algoritmos

Diseño de algoritmos

282

Cuadro 91. Pseudocódigo del algoritmo principal para potenciación

1Inicio

2 Entero b, e3 Leer b, e4 Escribir “Potencia = “, potencia(b,e)5 Fin algoritmo

En este ejemplo se puede apreciar cómo el uso de funcionesfacilita la solución del problema. En este caso, el algoritmo principalse encarga de leer los datos y mostrar el resultado, la funciónpotencia() se encarga de calcular el resultado y la funciónvalorabsoluto() facilita que se pueda calcular tanto con exponentepositivo como con negativo.

Para verificar que una función produce el resultado esperado seprocede de igual manera que para los demás algoritmos: se ejecutapaso a paso y se registra los datos que se guardan en las variables.Para verificar la corrección de la solución general se coloca cadavariable y cada función como una columna para registrar elresultado que devuelve, como se aprecia los cuadros 92 y 93.

Cuadro 92. Verificación función potencia

Ejecución a n x Valorabsoluto(n) p

1

4 3 11 3 42 163 64

2

3 -4 11 4 32 93 274 81

1/81

Page 283: Disenio Algoritmos

6. Subprogramas

283

Cuadro 93. Verificación del algoritmo para calcular una potencia

Ejecuciónb e Potencia(b,e) Salida

1 4 3 64 Potencia = 64

2 3 -4 1/81 Potencia = 1/81

Ejemplo 58. Función Interés simple

Diseñar una función para calcular el interés simple de unainversión.

El interés simple es el beneficio que se obtiene por invertir undeterminado capital. En esta operación intervienen tres elementos:el capital invertido, la tasa de interés o razón por unidad de tiempoy los periodos de tiempo pactados en la inversión.

Por ejemplo: Juan presta 10 millones de pesos a Carlos por unperiodo de seis meses, Carlos se compromete a pagar una tasa deinterés del 2% mensual al final de los seis meses. Cuánto recibiráJuan por concepto de interés?

La fórmula para calcular el interés simple es:

I = C * R * T

Donde:I: interés simpleC: capital invertidoR: tasa de interés o razón, es un porcentajeT: tiempo

Retomando los datos del ejemplo se tiene:

C = 10.000.000R = 2%T = 6

Page 284: Disenio Algoritmos

Diseño de algoritmos

284

En consecuencia:

I = 10.000.000 * 2 * 6 / 100 = 1.200.000

Ahora hay que expresar la fórmula del interés simple como unasubrutina o función, como se presenta en notación de diagrama deflujo en la figura 107.

Figura 107. Diagrama de flujo de la función interés simple

En la figura 108 se presenta el diagrama de flujo del algoritmoprincipal para calcular el interés simple de una inversión. Este seencarga de leer los datos, invocar la función, recibir el resultado yfinalmente presentarlo al usuario.

En este ejemplo se utiliza una variable i tanto en el algoritmo delprograma principal como en la función. Cabe resaltar que se tratade dos variables independiente, debido a que se declaran comovariables locales en cada algoritmo y por tanto no existe la una en elámbito de la otra.

Inicio

Fin

Parámetros: c, r, t

Real: i

Retornar i

i = c * r * t / 100

Page 285: Disenio Algoritmos

6. Subprogramas

285

Figura 108. Diagrama de flujo de algoritmo interés simple

Los resultados de la verificación paso a paso de éste algoritmose presentan en el cuadro 94.

Cuadro 94. Verificación solución para calcular interés simple

Ejecución C r T i Salida

1 10000000 2% 6 1200000 Interés: 1200000

2 20000000 1,5% 12 3600000 Interés: 3600000

Ejemplo 59. Función nota definitiva

En la universidad Buena Nota las notas definitivas de cadaasignatura se obtienen promediando tres notas parciales, donde laprimera y la segunda equivalen al 30% cada una y la tercera al 40%de la nota final. Se requiere una función para hacer dicho cálculo.

Inicio

Fin

Real: i,c,r,t

c, r, t

i = interés_simple(c, r, t)

“Interés:”, i

Page 286: Disenio Algoritmos

Diseño de algoritmos

286

Según el planteamiento anterior, si un estudiante obtiene lasnotas:

Nota 1 = 3,5Nota 2 = 4,3Nota 3 = 2,5

Su nota definitiva será:Nota definitiva = 3,5 * 30/100 + 4,3 * 30/100 + 2,5 * 40/100Nota definitiva = 3,3

En general, la nota se obtiene mediante la aplicación de lafórmula:

Nota definitiva = nota 1 * 30/100 + nota 2 * 30/100 + nota 3 *40/100

La función para realizar esta tarea se presenta en el cuadro 95.

Cuadro 95. Pseudocódigo de la función nota definitiva

1 Real notadefinitiva(real n1, real n2, real n3)2 Real nd3 nd = n1 * 30/100 + n2 * 30/100 + n3 * 40/1004 Retornar nd5 Fin notadefinitiva

Ejemplo 60. Función área de un triángulo

El área de un triángulo es equivalente a la mitad del producto desu base por su altura.

Área = base * altura / 2

Page 287: Disenio Algoritmos

6. Subprogramas

287

Por tanto, la función para calcular el área del triángulo requiereque se le proporcione la base y la altura. El pseudocódigo de estafunción se presenta en el cuadro 96.

Cuadro 96. Pseudocódigo de la función área de un triángulo

1 Real areatriangulo(real base, real altura)2 Real area3 area = base * altura / 24 Retornar area5 Fin areatriangulo

Ejemplo 61. Función año bisiesto

En el calendario gregoriano se cuenta con un año bisiesto* cadacuatro años, excepto el último de los centenarios que no sondivisibles para 400. Diseñar una función para determinar si un añoes bisiesto.

Tómese, por ejemplo, el año 1700. Es divisible para 4 y tambiénpara 100, pero no es divisible de forma exacta para 400, por tantono es bisiesto. Mientras que 1904 es divisible para 4, pero no esdivisible para 100, por tanto si es bisiesto; 2000 es divisible para 4,para 100 y también para 400, en consecuencia es bisiesto.

La condición para que un año sea bisiesto es: que sea divisiblepara 4 y no para cien ó que sea divisible para 400. Es decir,cualquier año divisible para cuatro que no sea el último delcentenario es bisiesto, pero si es el último del centenario debe serdivisible para 400. La función se presenta en la figura 109.

* Un año bisiesto es aquel que cuenta con 366 días a diferencia de los otros quetienen 365, éste día adicional se incluye en el mes de febrero que en dicho casoregistra 29 días.

Page 288: Disenio Algoritmos

Diseño de algoritmos

288

Figura 109. Diagrama de flujo de la función año bisiesto

Ejemplo 62. Función contar caracteres

Diseñar una función que reciba como parámetros un arreglo decaracteres y un carácter. La función debe contar la cantidad deveces que aparece el carácter en el arreglo y devolver dichocontador.

Por ejemplo, si el arreglo está conformado por los caracteres: a,b, c, d, e, d, c, b, a y el carácter a buscar es b, éste aparece dosveces en el arreglo.

La función debe hacer un recorrido del vector y en cada posicióncomparar su contenido con el carácter de referencia, si estos

Inicio

Fin

Parámetro: anio

(anio Mod 4 == 0 yanio Mod 100 != 0)o anio Mod 400 = 0

Booleano: bto

bto = verdadero

bto = falso

Si

No

Retornar bto

Page 289: Disenio Algoritmos

6. Subprogramas

289

coinciden incrementa el contador. El problema es que para elrecorrido parece necesario conocer el tamaño del vector y no secuenta con dicho dato.

Algunos lenguajes de programación cuentan con una funcióninterna que devuelve el tamaño de un vector, algunos otrosreportan un valor falso o nulo cuando se intenta acceder a unaposición que no existe en el vector. En este caso para evitarcualquier posibilidad de error, se incluye un tercer parámetro quecorresponde al tamaño del vector, de esta manera se puede hacerel recorrido sin dificultad. Esta función se presenta en el cuadro 97.

Cuadro 97. Pseudocódigo de la función contar caracteres

1 Real contarcaracteres(caracter v[], caracter car, entero n)2 Entero i, con = 03 Para i = 1 hasta n hacer4 Si car = v[i] entonces5 con = con + 16 Fin si7 Fin para8 Retornar con9 Fin contarcaracteres

Ejemplo 63. Sumar días a una fecha

Se requiere una función para sumar a una fecha (año, mes, día)un número determinado de días.

Supóngase que se tiene la fecha: 2000/07/01 y se le suman 5días, la fecha obtenida será: 2000/07/06, en este caso sólo sesuma los días, pero si se tiene la fecha 2005/12/28 y se le suman87 días, ¿cuál será la nueva fecha? ¿Qué operaciones realizar?

Para realizar esta suma, lo primero por hacer es extraer los añosy los meses que hay en el número de días, con lo que se obtiene un

Page 290: Disenio Algoritmos

Diseño de algoritmos

290

dato en formato de fecha, con el propósito de sumar días con días,meses con meses y años con años.

Años = 87 / 365 = 0Meses = 87 – (años * 365) / 30 = 2Días = 87 - (años * 365) – (meses * 30) = 27

De esto se desprende que la operación a realizar es:2005/12/28 +0000/02/27

Ahora se suman los días: 28 + 27 = 55, como se obtiene unnúmero mayor a 30 se lo separa en meses y días: 1 mes y 25, seregistran los días y se acarrea 1 para sumarlo con meses.

Se suman los meses: 12 + 2 + 1 = 15, al obtener un númeromayor a 12 se lo discrimina en años y meses: 1 año y 3 meses, seregistra los 3 meses y se acarrea 1 para sumarlo con años.

Se suman los años: 2005 + 0 + 1 = 2006.

Entonces la solución es:

Estas operaciones se deben expresar en forma algorítmica ycolocarse en una función que puede ser invocada cuantas vecessea necesario. Algo muy importante a tener en cuenta es que pordefinición una función devuelve un valor y en este caso se requieredevolver tres (año, meses y días). La solución consiste en agruparlos datos mediante un vector, donde la primera posicióncorresponderá al año, las segunda a los meses y la tercera a losdías, luego se establece el vector como parámetro y de igual

2005/12/28 +0000/02/27

2006/03/25

Page 291: Disenio Algoritmos

6. Subprogramas

291

manera la función devolverá un vector como resultado. Elpseudocódigo de esta función se presenta en el cuadro 98.

Cuadro 98. Pseudocódigo de la función sumar días a fecha

1 Entero[] sumardiasafecha(Entero f[], Entero días)2 Entero aux[3], nf[3]3 aux[1] = días / 3654 días = días Mod 3655 aux[2] = días / 306 aux[3] = días Mod 307 nf[3] = f[3]+aux[3]8 nf[2] = f[2]+aux[2]9 nf[1] = f[1]+aux[1]10 Si nf[3] > 30 entonces11 nf[3] = nf[3]-3012 nf[2] = nf[2] + 113 Fin si14 Si nf[2] > 12 entonces15 nf[2] = nf[2]-1216 nf[1] = nf[1] + 117 Fin si18 Retornar nf[]19 Fin sumardiasafecha

Esta función recibe un vector de tres número enteros y unavariable como parámetros, internamente declara dos vectores, unauxiliar para discriminar en años, meses y días el contenido de lavariable recibida y el segundo para guardar la fecha que se generacomo resultado. Inicialmente se suman directamente las posicionesde los vectores, luego se verifica la validez de los días y meses, y siéstos no son válidos se hace el ajuste correspondiente.

En el cuadro 99 se evidencia el comportamiento de los vectoresal ejecutar la función.

Page 292: Disenio Algoritmos

Diseño de algoritmos

292

Cuadro 99. Verificación de la función sumar días a fecha

Vector f[] dias Vector aux[] Vector nf[]

f[1] f[2] f[3] aux[1] aux[2] aux[3] nf[1] nf[2] nf[3]

2005 12 28 87 0 2 27 2005 14 5515 25

2006 3 25

6.1.4 Ejercicios propuestos

Diseñar funciones para los siguientes planteamientos

1. Conocer la nota mínima que un estudiante debe obtener en elexamen final de una materia para aprobarla con nota mínima(3.0), a partir de las notas obtenidas en dos pruebas parciales.Se sabe que cada parcial equivale al 30% y el examen final al40% de la nota definitiva.

2. Calcular el perímetro de un rectángulo

3. Calcular el área de un círculo

4. Calcula la longitud de una circunferencia

5. Calcular el volumen de un cilindro

6. Determinar la cantidad de papel que se requiere para forrarcompletamente una caja

7. Establecer la velocidad de un atleta en k/h sabiendo que tardóx minutos en dar una vuelta al estadio cuyo recorrido tiene nmetros.

8. Restar una cantidad de días a una fecha en formatoaño/mes/día

Page 293: Disenio Algoritmos

6. Subprogramas

293

9. Sumar una cantidad de años, meses y días a una fecha

10. Obtener la diferencia entre dos fechas, expresada en años,meses y días.

11. Calcular el valor futuro de una inversión con interés compuesto

12. Determinar si un número es primo

13. Averiguar si un número n forma parte de la serie Fibonacci

14. Evaluar una fecha e informar si es válida o no. Se debe tener encuenta los meses que tienen 28, 30 y 31 días y los añosbisiestos.

15. Calcular el precio de venta de un producto, aplicando el 30% deutilidad sobre el costo y el 16% de impuesto al valor agregado(IVA).

16. Calcular el mínimo común múltiplo de dos números

17. Calcular la sumatoria de los primeros n números

18. Invertir el orden de los elementos de un vector

6.2. PROCEDIMIENTOS

Un procedimiento es un conjunto de líneas de código que seescriben por separado del algoritmo principal con el propósito desolicitar su ejecución desde diversas partes del algoritmo oprograma, esto hace más organizado y entendible el código, másfácil de escribir, de corregir y de mantener.

Los procedimientos al igual que las funciones cumplen una tareaespecífica, pero a diferencia de éstas, no están diseñados pararealizar cálculos y por tanto no devuelven ningún valor

Page 294: Disenio Algoritmos

Diseño de algoritmos

294

El diseño de un procedimiento incluye su definición y suimplementación, en la definición se le asigna un nombre y seespecifican los parámetros que recibirá, en la implementación seescriben las instrucciones detalladas que le permitirán cumplir sutarea.

La forma general de diseñar un procedimiento es:

Nombre_procedimiento(parámetros)Instrucciones

Fin nombre_procedimiento

Ejemplos:

Imprimir(entero a, entero b, entero c)Escribir aEscribir bEscribir c

Fin imprimir

Si en el cuerpo del procedimiento se declaran variables, éstastienen ámbito local.

Para invocar un procedimiento se escribe su nombre y la lista deparámetros, teniendo en cuenta que éstos deben corresponder ennúmero y tipo con la lista de parámetros de la definición delprocedimiento. En el momento en que la ejecución de un algoritmoencuentra la invocación de un procedimiento pasa a ejecutar lasinstrucciones de éste y cuando termina vuelve a la línea que sigue ala invocación.

Ejemplo 64. Procedimiento tabla de multiplicar

Se requiere un algoritmo para generar tablas de multiplicar parael número que el usuario ingrese, la ejecución termina cuando seingresa el 0.

Page 295: Disenio Algoritmos

6. Subprogramas

295

En este ejercicio se pueden observar dos tareas: por una parte,administrar las entradas, esto es, leer el número y decidir si segenera la tabla o se termina la ejecución del algoritmo, y repetiresta operación hasta que se ingrese el 0; por otra, generar la tablade multiplicar para el número ingresado. La segunda tarea puedeser delegada a un procedimiento

Este procedimiento recibe como parámetro el número para elque se requiere la tabla y se encarga de llevar a cabo lasiteraciones y mostrar el producto en cada una de ellas. Elpseudocódigo de este procedimiento se muestra en el cuadro 100.

Cuadro 100. Procedimiento tabla de multiplicar

1 Tablamultiplicar(Entero n)2 Entero i3 Para i = 1 hasta 10 hacer4 Escribir n, “*”, i, “ =”, n*i5 Fin para6 Fin tablamultiplicar

El algoritmo principal, desde dónde se invoca esteprocedimiento, se presenta en el cuadro 101. El llamado alprocedimiento se hace desde la línea 5.

Cuadro 101. Pseudocódigo del algoritmopara generar tablas de multiplicar

1 Inicio2 Entero n3 Hacer4 Leer n5 Tablamultiplicar(n)6 Mientras n != 0 hacer7 Fin algoritmo

Page 296: Disenio Algoritmos

Diseño de algoritmos

296

Ejemplo 65. Procedimiento imprimir vector

Diseñar un procedimiento que se pueda invocar cada vez que sedesee listar los datos de un vector.

Este procedimiento debe recibir como parámetros el vector y elnúmero de elementos que contiene, hacer un recorrido y mostrarcada elemento. El diagrama N-S de este procedimiento se muestraen la figura 110.

Figura 110. Diagrama N-S para el procedimiento imprimir vector

Imprimirverctor(Entero v[], entero n)

Entero: i

Para i = 1 hasta n hacer

Escribir v[i]

Fin para

Fin Imprimirverctor

Ejemplo 66. Procedimiento escribir fecha

Diseñar un procedimiento que reciba tres números enteroscorrespondientes a día, mes y año y muestre la fecha en forma detexto.

Este procedimiento debe averiguar el nombre del mes y luegoanteponer y adicionar la proposición “de”. Por ejemplo, si recibe losdatos: día = 11, mes = 2 y año = 2012 debe escribir: “11 de febrerode 2012”. El pseudocódigo de este procedimiento se presenta en elcuadro 102.

Page 297: Disenio Algoritmos

6. Subprogramas

297

Cuadro 102. Pseudocódigo del procedimiento escribir fecha

1 Escribirfecha(entero d, entero m, entero a)2 Cadena nmes3 Según sea m hacer4 1: nmes = “enero”5 2: nmes = “febrero”6 3: nmes = “marzo”7 4: nmes = “abril”8 5: nmes = “mayo”9 6: nmes = “junio”10 7: nmes = “julio”11 8: nmes = “agosto”12 9: nmes = “septiembre”13 10: nmes = “octubre”14 11: nmes = “noviembre”15 12: nmes = “diciembre”16 Fin según sea17 Escribir d, “ de “, nmes, “ de “, a18 Fin Escribirfecha

Ejemplo 67. Procedimiento mostrar una sucesión

Diseñar una procedimiento para generar los primeros n términosde la secuencia generada por la expresión: x2 – x.

El procedimiento consiste en hacer un ciclo desde 1 hasta n yaplicar la expresión. Los resultados forman la secuencia:

0, 2, 6, 12, 20, 30, …

El pseudocódigo se muestra en el cuadro 103.

Page 298: Disenio Algoritmos

Diseño de algoritmos

298

Cuadro 103. Pseudocódigo del procedimiento mostrar sucesión

1 mostrarsecuencia(entero n)2 Entero x, t3 Para x = 1 hasta n hacer4 t = x * x – x5 Escribir x6 Fin para7 Fin mostrarsecuencia

Page 299: Disenio Algoritmos
Page 300: Disenio Algoritmos

300

7. BÚSQUEDA Y ORDENAMIENTO

El que no sabepor qué camino llegar al mar

debe buscarel río por compañero.

Plauto

Búsqueda y ordenamiento constituyen dos tareas fundamentalesen la administración de datos, especialmente si se trata de grandesvolúmenes. Las dos operaciones se desarrollan con base en undato de referencia al que comúnmente se llama clave. La búsquedapermite encontrar un elemento particular en el conjunto, mientrasque el ordenamiento consiste en ubicar los datos atendiendo a uncriterio de manera que sea más fácil encontrar el elemento que serequiere o identificar las relaciones entre los datos.

En este capítulo se estudian y explican detalladamente losalgoritmos de búsqueda y ordenamiento, apoyados con ejemplos ygráficas que facilitan su comprensión.

7.1 ALGORITMOS DE BÚSQUEDA

La búsqueda es una operación de vital importancia cuando semanipulan grandes conjuntos de datos donde localizar un elementono es tarea fácil, como afirman Lopez, Jeder y Vega (2009: 129).

Para buscar un dato en un vector existen dos métodos:búsqueda secuencial o lineal y búsqueda binaria. El primero es más

Page 301: Disenio Algoritmos

301

7. Búsqueda y ordenamiento

fácil de implementar pero puede tomar más tiempo, el segundo esmás eficiente, pero requiere que el vector esté ordenado.

7.1.1. Búsqueda Lineal

Este método consiste en tomar un dato clave que identifica alelemento que se busca y hacer un recorrido a través de todo elarreglo comparando el dato de referencia con el dato de cadaposición.

Supóngase que se tienen una lista de estudiantes y se deseaubicar al que se identifica con el número 27844562. La búsquedaconsiste en comparar, dicho número con la identificación de cadaestudiante de la lista. La búsqueda terminará en el evento deencontrar una coincidencia en los números o si al llegar al final dela lista no se encontró identificación igual al número buscado, encuyo caso se concluye que el dato no existe en el vector.

En la figura 111 se presenta el diagrama del flujo de una funcióncon los pasos generales para hacer una búsqueda secuencial en unvector.

La función recibe como parámetros el vector y la clave delelemento a buscar, recorre el vector hasta que se encuentre elelemento, en cuyo caso la posición se registra en la variable pos, ohasta que se llegue al final del vector. Al finalizar el algoritmodevuelve la variable pos, si el dato fue encontrado ésta contiene laposición que ocupa en el vector, en caso contrario, reporta el valormenos uno (-1) indicando que el dato no está en el vector.

Page 302: Disenio Algoritmos

Diseño de algoritmos

302

Figura 111. Diagrama de flujo del algoritmo de búsqueda lineal

7.1.2. Ejemplos de búsqueda lineal

Ejemplo 68. Buscar un estudiante

Un profesor guarda los datos de sus estudiantes en tresvectores: código, nombre y nota, como se muestra en la figura 112.Se requiere un algoritmo para consultar la nota de un estudiante apartir de su código.

Inicio

Entero: i=1, pos = -1

Fin

Mientras i<= n y pos < 0

pos = iclave = v[i]

i = i + 1

Parámetros: v[], n, clave

No

Si

Retornar p

Page 303: Disenio Algoritmos

303

7. Búsqueda y ordenamiento

Figura 112. Datos de estudiantes almacenados en vectores

1 001 1 Luis Domínguez 1 4,5

2 002 2 Daniela Flórez 2 3,8

3 003 3 Jesús Bastidas 3 2,5

4 004 4 Camilo Chaves 4 4,8

5 005 5 Diana Chaves 5 4,6

6 006 6 Jackeline Riascos 6 4,2

… … … … … …

Código[] Nombre[] Nota[]

Haciendo uso de la función búsquedalineal() y pasándole comoparámetros el vector código, el tamaño del mismo y el código delestudiante, se puede conocer en qué posición de los vectores seencuentran los datos del estudiante. El algoritmo se presenta en lafigura 113, en éste se supone la existencia de un procedimientopara llenar los datos en los vectores.

Ejemplo 69. Consultar saldo

En un hipotético cajero electrónico, cuando un cliente solicita elsaldo de su cuenta desliza la tarjeta, el lector toma el número decuenta y el sistema busca dicho número en la base de datos. Si loencuentra reporta el saldo, si no muestra un mensaje de error.Suponiendo que la base de datos consiste en tres vectores: númerode cuenta, titular y saldo. Diseñar un algoritmo para consultar elsaldo de una cuenta.

En este algoritmo se lee el número de la cuenta y se invoca lafunción busquedalineal() proporcionándole el vector con losnúmeros de cuenta y el dato leído, esta función hace la búsqueda yretorna la posición dónde se encuentran los datos correspondientesa dicha cuenta. Si el dato devuelto por la función es un enteropositivo se muestran los datos de todos los vectores, si es -1significa que la cuenta no existe y se muestra un mensaje

Page 304: Disenio Algoritmos

Diseño de algoritmos

304

informando de esta situación. El pseudocódigo de este algoritmo sepresenta en el cuadro 104

Figura 113. Diagrama de flujo del algoritmo de buscar estudiante

Inicio

Fin

pos > 0Si

Entero: código[40], cod, posCadena: nombre

Real: nota

cod

Llenardatos()

pos = busquedalineal(código[], 40, cod)

No “Código:”,Codigo[pos],“Nombre:”, Nombre[pos],“Nota:”, Nota[pos]

“Código noencontrado”

Page 305: Disenio Algoritmos

305

7. Búsqueda y ordenamiento

Cuadro 104. Pseudocódigo del algoritmo consultar saldo

1 Inicio

2Entero num, pos, cuenta[1000]Cadena: titular[1000]Real: saldo[1000]

3 Llenardatos()4 Leer num5 pos = busquedalineal(cuenta[], 10000, num)6 Si pos > 0 entonces7 Escribir “Cuenta:”, cuenta[pos]8 Escribir “Titular: “,titular[pos],9 Escribir “Saldo: “,saldo[pos]10 Si no11 Escribir “Número de cuenta no encontrado”12 Fin si13 Fin algoritmo

7.1.3. Búsqueda Binaria

Este método es más eficiente que la búsqueda secuencial perosólo se puede aplicar sobre vectores o listas de datos ordenados,como lo confirman López, Jeder y Vega (2009: 130)

En la búsqueda binaria no se hace un recorrido de principio a fin,sino que se delimita progresivamente el espacio de búsqueda hastallegar al elemento buscado. La primera comparación se hace con elelemento de la mitad del arreglo, si aquel no es el dato buscado, sedecide si buscar en la mitad inferior o en la mitad superior según laclave sea menor o mayor del elemento de la mitad. Se toma comoespacio de búsqueda la mitad del vector que corresponda y seprocede de igual forma, se compara con el elemento del centro, siese no es el que se busca, se toma un nuevo espacio de búsquedacorrespondiente a la mitad inferior o superior del espacio anterior,se compara nuevamente con el elemento del centro, y así

Page 306: Disenio Algoritmos

Diseño de algoritmos

306

sucesivamente hasta que se encuentre el elemento o el espacio debúsqueda se haya reducido un elemento.

En la búsqueda binaria el número de elementos que conformanel campo de búsqueda se reduce a la mitad en cada iteración,siendo:

n para la primera iteración (n = tamaño del vector),n/2 para la segunda,n/22 en la tercera yn/23 para la cuarta.

En general, el espacio de búsqueda en la i-ésima iteración estáconformado por n/2i-1 elementos.

Supóngase un vector v de 20 elementos ordenado de formaascendente, como se muestra en la figura 114, en el que se buscael número 10. (clave = 10).

La primera iteración toma como espacio de búsqueda el vectorcompleto y se ubica en el elemento de la mitad. Para determinarcuál es elemento de la mitad se suma el índice del extremo inferiorcon el índice del extremo superior del espacio de búsqueda y sedivide para dos.

(1 + 13) / 2 = 7

Se averigua si la clave está en el elemento del centro:

clave = v[7]?10 = 14?

Page 307: Disenio Algoritmos

307

7. Búsqueda y ordenamiento

Figura 114. Diagrama de flujo del algoritmo de búsqueda lineal

Espacio 1ra iteraciónEspacio 2da iteración

Espacio 3raiteración

2 4 6 8 10 12 14 16 18 20 22 24 261 2 3 4 5 6 7 8 9 10 11 12 13

Segu

nda

comp

arac

ión

Terce

raco

mpar

ación

Prim

era

comp

arac

iónComo el dato no está en posición 7 se define un nuevo espacio

de búsqueda correspondiente a la mitad inferior del vector, dadoque la clave (calve = 10) es menor que el elemento del centro (v[7]= 14). El espacio para la segunda comparación está entre lasposiciones 1 y 6.

Se calcula nuevamente el centro:

(1 + 6) / 2 = 3

Ahora el elemento central es el de la posición 3, se averigua siese es el dato que se busca:

clave = v[3]?10 = 6?

Como en esta posición tampoco está el dato buscado se haceuna nueva búsqueda, esta vez se toma la mitad superior delespacio, ya que la clave es mayor que el dato del centro: 10 > 6.

El nuevo espacio de búsqueda comprende los elementos entrelas posiciones 4 y 6. Se calcula nuevamente el elemento del centro:

(4 + 6) / 2 = 5

Page 308: Disenio Algoritmos

Diseño de algoritmos

308

Se compara la clave con el elemento de la posición central

clave = v[5]?10 = 10?

Los valores son iguales, en esta iteración el dato fue encontrado.La búsqueda termina. Fueron necesarias 3 comparaciones paraencontrar el elemento.

La función para realizar la búsqueda binaria recibe comoparámetros el vector con los datos, el tamaño del vector y el datoque se busca o clave de búsqueda. El pseudocódigo de ésta semuestra en el cuadro 105.

Cuadro 105. Pseudocódigo de la función búsqueda binaria

1 Entero busquedabinaria(entero v[], entero n, entero clave)2 Entero inf = 1, sup = n, centro, pos = -13 Mientras inf <= sup y pos < 0 hacer4 centro = (inf + sup) / 25 Si v[centro] = clave entonces6 pos = centro7 Si no8 Si clave > v[centro] entonces9 inf = centro + 110 Si no11 sup = centro – 112 Fin si13 Fin si14 Fin mientras15 Retornar pos16 Fin busquedabinaria

La función declara cuatro variables locales, dos para mantenerlos límites del espacio de búsqueda: inf y sup, estas comienzan en 1

Page 309: Disenio Algoritmos

309

7. Búsqueda y ordenamiento

y n respectivamente, lo que permite que la primera iteración seaplique sobre todo el vector, la variable centro se actualiza en cadaiteración y su propósito es identificar el dato ubicado en el centrodel espacio de búsqueda para compararlo con la clave; finalmente,la variable pos se destina a almacenar la posición del elemento encaso de hallarlo, se inicializa en -1 lo que indica que el dato no hasido encontrado. El ciclo tiene dos condiciones: que el límite inferiorsea menor que el superior, es decir que haya un espacio dóndehacer la búsqueda y que el dato no haya sido encontrado. En elmomento en que el dato se localiza la variable pos toma un valorpositivo y el ciclo deja de ejecutarse.

Al terminar el ciclo se devuelve la variable pos, si tiene un valorpositivo, éste corresponde a la posición dónde se encuentra el datobuscado, pero si contiene -1 significa que el dato no está en elvector.

7.1.4. Ejemplos de búsqueda binaria

Ejemplo 70. Número ganador

La lotería de Mundo Rico registra los números de los billetesvendidos y el lugar dónde se vendió, en orden ascendente. En elmomento de jugar la lotería, al conocer el número ganador serequiere conocer inmediatamente en qué lugar fue vendido. Diseñarun algoritmo para realizar esta consulta.

Los datos se guardan en una estructura conformada por dosvectores como se muestra en la figura 115. Dado que los númerosestán ordenados se puede aplicar el algoritmo de búsqueda binaria,éste encontrará el número mucho más rápido que si se utilizara labúsqueda lineal.

Page 310: Disenio Algoritmos

Diseño de algoritmos

310

Figura 115. Número de billetes de lotería y lugar de venta

1 001 1 Pasto

2 002 2 Medellín

3 003 3 Manizales

4 004 4 Cali

5 005 5 Santa Marta

6 006 6 Bogotá

… … … …

Número[] Lugar[]

Las operaciones a realizar en este ejercicio son: leer el númeroganador, pasarlo a la función de búsqueda y mostrar los resultados.La función proporciona la posición dónde se encuentra el dato o ensu defecto informará que éste no se encuentra, lo que se interpretacomo número no vendido. La lectura de datos y la impresión deresultados son acciones que debe realizar el algoritmo principal. Vercuadro 106.

Cuadro 106. Pseudocódigo del algoritmo número ganador

1 Inicio2 Entero numero[1000], lugar[1000], ganador, pos3 Llenardatos()4 Leer ganador5 pos = busquedabinaria(numero[], 1000, ganador)6 Si pos> 0 entonces7 Escribir “El numero: “, ganador, “ fue vendido en: “, lugar[pos]8 Si no9 Escribir “El número no fue vendido”10 Fin si11 Fin algoritmo

Page 311: Disenio Algoritmos

311

7. Búsqueda y ordenamiento

En la línea 3 del algoritmo se invoca un procedimiento parallenar los datos, lo que garantiza que los vectores contienen datos,no obstante la implementación de éste no se incluye. En la línea 5se invoca a la función busquedabinaria() enviando como pará-metros el vector que contiene los número, el tamaño del vector y elnúmero ganador.

Ejemplo 71. Historia clínica

En la clínica Curatodo se cuenta con un índice de historiasclínicas mediante dos vectores, en el primero se registra el númerode historia, en el segundo la identificación del paciente. Se requiereun algoritmo que lea la identificación del paciente y reporte elnúmero de la historia.

Como se ha visto en los ejemplos anteriores, tanto de búsquedasecuencial como binaria, una vez que cuenta con la función ésta sepuede utilizar para cualquier vector. En este caso, el algoritmoconsiste básicamente en leer el número de identificación delpaciente, invocar la función y mostrar los datos del vector en laposición reportada por la función o en su defecto un mensaje de“identificación no encontrada”. El algoritmo se presenta en elcuadro 107

Cuadro 107. Pseudocódigo del algoritmo historia clínica

1 Inicio2 Entero identificación[1000], historia[1000], numcc, pos3 Llenardatos()4 Leer numcc5 pos = busquedabinaria(identificación[], 1000, numcc)6 Si pos> 0 entonces7 Escribir “La historia del paciente es: “, historia[pos]8 Si no9 Escribir “No se encontró historia para el paciente”10 Fin si11 Fin algoritmo

Page 312: Disenio Algoritmos

Diseño de algoritmos

312

7.1.5. Ejercicios propuestos

1. Se cuenta con la información del directorio telefónicoalmacenada en una matriz de 3 columnas, en la primeraestá el apellido, en la segunda el nombre y en la tercera elnúmero telefónico. Se requiere un algoritmo para buscar elnúmero de teléfono de una persona tomando como clave suapellido y nombre.

2. La lista de libros existentes en una biblioteca se encuentraalmacenada en una matriz de 5 columnas, en la primeraestá el autor, en la segunda el título, en la tercera laeditorial, en la cuarta el año y en la última, la signatura. Sesolicita diseñar el algoritmo y la función de búsqueda portítulo.

3. El día de elecciones, en cada mesa se cuenta con un listadode las personas que votarán en dicha mesa. Los datosestán guardados en dos vectores, en el primero la cédula yen el segundo el nombre. Se requiere un algoritmo queingrese la cédula de una persona e informe si puedesufragar en ese puesto de votación.

4. La nomina de la empresa BuenSalario está registrada endos vectores y una matriz. En el primer vector se guarda elnúmero de cédula y en el segundo el nombre, en la matrizse guardan los siguientes datos: sueldo básico, deduc-ciones, neto a pagar. Se requiere un algoritmo que lea lacédula de un empleado y muestre los datos de su nómina.

5. En el almacén Todocaro se cuenta con los datos: número defactura, nombre del cliente, fecha de facturación y valor dela factura, almacenados en vectores. Se desea un algoritmoque lea el número de factura y muestre los demás datos.

6. La empresa de comunicaciones Línea Segura registra elorigen, el destino, la fecha, la hora y la duración de todas lasllamadas que hacen sus usuarios, para esto hace uso de

Page 313: Disenio Algoritmos

313

7. Búsqueda y ordenamiento

cinco vectores. Se requiere un algoritmo para saber si desdeun teléfono determinado se ha efectuado alguna llamada aun destino y en caso afirmativo conocer la fecha, la hora y laduración de la llamada.

7. La compañía de aviación Vuelo Alto mantiene la informaciónde todas sus rutas de vuelo en una base de datos coninformación como: lugares de origen y destino, horario,valor; para ello utiliza una matriz en la que cada columnaestá destinada a uno de los datos mencionados. Diseñar unalgoritmo para averiguar si existe un vuelo entre un origen yun destino introducidos por el usuario y en caso de existirobtener información sobre el mismo.

Page 314: Disenio Algoritmos

Diseño de algoritmos

314

7.2 ALGORITMOS DE ORDENAMIENTO

Los datos de un vector, una lista o un archivo están ordenadoscuando cada elemento ocupa el lugar que le corresponde según suvalor, un dato clave o un criterio (en este documento sólo se abordael ordenamiento de vectores). Si cada elemento del vector diferentedel primero es mayor que los anteriores, se dice que está ordenadoascendentemente, mientras que si cada elemento diferente delprimero es menor que los anteriores, está ordenado de formadescendente.

En un pequeño conjunto de datos el orden en que estos sepresenten puede ser irrelevante, pero cuando la cantidad aumentael orden toma importancia. Qué tan útil podría ser un diccionario sino estuviera ordenado? O el directorio telefónico?

Baase y Van Gelder (2002: 150) mencionan que el ordena-miento de datos fue una de las principales preocupaciones de lasciencias de la computación, prueba de ello es la cantidad demétodos de ordenamiento que se han diseñado. En este capítulo seexplican los algoritmos más utilizados para este propósito.

7.2.1 Algoritmo de intercambio

Este algoritmo no es el más eficiente, pero es muy didáctico ypor ende es común su utilización en los primeros cursos programa-ción. Consiste en tomar cada elemento y compararlo con los queestán a su derecha, cada vez que se identifica un par de elementosque no cumplen el criterio de ordenamiento que se está aplicandose intercambian. En cada iteración se encuentra el elemento quecorresponde a una posición.

Considérese el vector v de la figura 116, para ordenar losnúmeros de forma ascendente se toma el primer elemento v[1] y secompara con v[2]. Si v[1] menor que v[2] éstos están en orden,

Page 315: Disenio Algoritmos

315

7. Búsqueda y ordenamiento

pero si v[1] > v[2] están desordenados y es necesario inter-cambiarlos.

Figura 116. Algoritmo de intercambiocomparaciones del primer elemento

Como se aprecia en la figura, para intercambiar dos elementosde un vector es necesario utilizar una variable auxiliar y realizar tresasignaciones:

aux = v[1]v[1] = v[2]v[2] = aux

Después de este intercambio se compara v[1] con v[3], si noestán ordenados se procede a hacer el intercambio, luego v[1] conv[4] y así sucesivamente hasta v[1] con v[n]. Explicaciones másdetalladas de este proceso se encuentran en Joyanes (2000: 248) yen Chaves (2004: 235).

Para comparar el primer elemento del vector con todos los que lesiguen y ubicar en la primera posición el valor que corresponde enel vector ordenado se ejecuta las instrucciones del cuadro 108.

Después de ejecutar el ciclo y encontrar el valor que correspondea la primera posición del vector ordenado se procede a hacer lomismo para la segunda posición, luego la tercera y así

1 2 3 4 5

17

aux

17 12 13 8 15 3 7 22 11 20v6 7 8 9 10

Comparaciones

Page 316: Disenio Algoritmos

Diseño de algoritmos

316

sucesivamente hasta la penúltima. Dado que para cada posición esnecesario un recorrido por los elementos de la derecha, esnecesario utilizar dos ciclos anidados.

Cuadro 108. Ordenamiento por intercambioubicación del primer elemento

1 Para j = 1 hasta n hacer2 Si v[1] > v[j] entonces3 aux = v[1]4 v[1] = v[j]5 v[j] = aux6 Fin si7 Fin para

En síntesis, el método de intercambio cosiste en implementar unrecorrido para el vector donde para cada elemento se hace unsegundo ciclo en el que se compara éste con todos los elementosque le siguen y cuando no estén ordenados se hace un intercambio.Cada iteración del ciclo externo ordena una posición del vector. Enel cuadro 109 se presenta una función para ordenar un vector deenteros aplicando éste método. La función recibe como parámetroun vector de tipo entero no ordenado y el tamaño del mismo, aplicael algoritmo de ordenamiento y devuelve el vector ordenado.

El primer ciclo comienza en el primer elemento y termina en elpenúltimo, el segundo ciclo comienza en el elemento que sigue alelemento a ordenar (determinado por la variable del primer ciclo) ytermina en la última posición

Page 317: Disenio Algoritmos

317

7. Búsqueda y ordenamiento

Cuadro 109. Función ordenar vectorpor el método de intercambio

1 Entero[] intercambio(entero v[], Entero n)2 Entero i, j, aux3 Para i = 1 hasta n-1 hacer4 Para j = i+1 hasta n hacer5 Si v[i] > v[j] entonces6 aux = v[i]7 v[i] = v[j]8 v[j] = aux9 Fin si10 Fin para11 Fin para12 Retornar v[]13 Fin intercambio

7.2.2 Algoritmo de Selección

Este método es similar al anterior en cuanto a los recorridos delvector y las comparaciones, pero con un número menor deintercambios. En el método de intercambio cada vez que secomparan dos posiciones y éstas no están ordenadas se hace elintercambio de los datos, de manera que en un mismo recorridopuede haber varios intercambios antes de que el número ocupe ellugar que le corresponde en el arreglo ordenado. En el método deselección, en cada recorrido se identifica el elemento que pertenecea una posición y se hace un solo intercambio.

Considérese el vector de la figura 117, donde se muestra elintercambio efectuado para la primera posición.

Page 318: Disenio Algoritmos

Diseño de algoritmos

318

Figura 117. Algoritmo de selección – intercambio del primer elemento

Se declara una variable para guardar la posición del menor y seinicializa en 1 para comenzar las comparaciones en la primeraposición, se hace un recorrido desde la segunda posición hasta laúltima y cada vez que se encuentra un elemento menor al queindica la variable se la actualiza.

Estando en la posición i del vector v, el recorrido para identificarel elemento que corresponde a dicha posición en el vectorordenado ascendentemente se lleva a cabo con las instruccionesque se presentan en el cuadro 110.

Cuadro 110. Recorrido para seleccionar el i-ésimo elemento

1 posmenor = i2 Para j = i+1 hasta n hacer3 Si v[posmenor] > v[j] entonces4 posmenor = j5 Fin si6 Fin para7 Aux = v[i]8 v[i] = v[posmenor]9 v[posmenor] = aux

1 2 3 4 5

6

Índice del menor

17 12 13 8 15 3 7 22 11 20v6 7 8 9 10

17

aux

Page 319: Disenio Algoritmos

319

7. Búsqueda y ordenamiento

Como se aprecia en el pseudocódigo del cuadro 110, el recorridocoloca el índice del menor elemento encontrado en la variableposmenor y al finalizar el recorrido se hace el intercambio entre laposición i y la posición que indica posmenor.

Ahora bien, para ordenar todo el vector solo hay que hacer que lavariable i se mueva desde el primer elemento hasta el penúltimo,como se muestra en el cuadro 111, donde se presenta la funciónpara ordenar un vector aplicando el algoritmo de selección. Estafunción recibe un vector no ordenado como parámetro y lo devuelveordenado.

Cuadro 111. Función ordenar vector por el método de selección

1 Entero[] seleccion(entero v[], entero n)2 Entero: i, j, posmenor, aux3 Para i = 1 hasta n-1 hacer4 posmenor = i5 Para j = i+1 hasta n hacer6 Si v[posmenor] > v[j] entonces7 posmenor = j8 Fin si9 Fin para10 aux = v[i]11 v[i] = v[posmenor]12 v[posmenor] = aux13 Fin para14 Retornar v[]15 Fin selección

Page 320: Disenio Algoritmos

Diseño de algoritmos

320

7.2.3 Algoritmo de la burbuja

Por la forma como se hacen los recorridos y las comparacioneséste es uno de los algoritmos de ordenamiento más fáciles decomprender y de programar, pero como explica Joyanes(2000: 252)no es recomendable su utilización en el desarrollo de software, porser el de menor eficiencia.

La técnica de ordenamiento conocida como burbuja o burbujeoconsiste en comparar el primer elemento con el segundo y si nocumplen el criterio de orden que se está aplicando se intercambian,acto seguido se pasa a comparar el segundo elemento con eltercero y si no están ordenados se intercambian también, luego secompara el tercero con el cuarto y después el cuarto con el quinto yasí sucesivamente hasta comparar los elementos v[n-1] con v[n].Como se ilustra en el vector de la figura 118, en un recorrido sehacen n-1 comparaciones y todos los intercambios necesarios a quehaya lugar.

Figura 118. Algoritmo de la burbuja – comparaciones del primer recorrido

En el primer recorrido del vector, dado que se comparan cadaelemento con el adyacente, si se aplica un orden ascendente elvalor más alto se desplazará paso a paso hacia la derecha llegandohasta la última posición, pero los demás valores quedarán endesorden en las demás posiciones. En el cuadro 112 se presentanlas instrucciones para un recorrido.

1 2 3 4 5

17

17 12 13 8 15 3 7 22 11 20v6 7 8 9 10

aux

Page 321: Disenio Algoritmos

321

7. Búsqueda y ordenamiento

Cuadro 112. Recorrido para burbujear un elemento

1 Para j = 1 hasta n-1 hacer2 Si v[j] > v[j+1] entonces3 aux = v[j]4 v[j] = v[j+1]5 v[j+1] = aux6 Fin si7 Fin para

Para ordenar completamente el vector, considerando que en unacomparación se ordenan dos elementos y en un recorrido se llevaun elemento hasta su posición ordenada, es necesario realizar n-1recorridos.

Para mejorar el desempeño de este algoritmo se pueden reducirel número de comparaciones y en algunos casos la cantidad derecorridos.

Si se tienen en cuenta que cada recorrido toma el dato másgrande y lo desplaza hacia la derecha ocurre que el primer recorridolleva el dato más grande a la posición n, el segundo recorrido llevael segundo dato más grande a la posición n-1, el tercero el quesigue a la posición n-1. De esto se desprende que en el segundorecorrido la comparación v[n-1] > v[n] es inútil pues ya se sabe queen la última posición está el elemento más grande. También ocurreque en el tercer recorrido, la comparación v[n-2] > v[n-1] y v[n-1] >v[n] no aportan nada, pues las últimas posiciones se vanordenando en cada recorrido. En conclusión, todos los recorridos nonecesitan llegar hasta n-1, el segundo va hasta n-2, el tercero hastan-3 y así sucesivamente. En un vector con muchos elementos elnúmero de comparaciones que se reduce es importante. En elcuadro 113 se muestra el recorrido mejorado para la i-ésimaiteración.

Page 322: Disenio Algoritmos

Diseño de algoritmos

322

Cuadro 113. Recorrido mejorado para burbujearel i-ésimo elemento

1 Para j = i hasta n-i hacer2 Si v[j] > v[j+1] entonces3 aux = v[j]4 v[j] = v[j+1]5 v[j+1] = aux6 Fin si7 Fin para

Por otra parte puede ocurrir que un vector quede completamenteordenado en una cantidad de recorridos menor a n-1 y por ende losúltimos recorridos sean innecesarios. Para evitar esta pérdida detiempo se vigila que en cada recorrido hayan intercambios, si en eli-ésimo recorrido no tuvo lugar ninguno significa que el vector yaestá ordenado y no es conveniente hacer los recorridos faltantes.Para ello se puede utilizar un contador de intercambios o unconmutador (bandera) que cambia de estado al efectuar unintercambio. En el cuadro 114 se presenta la función para ordenarun vector aplicando el algoritmo de la burbuja con las dos mejorasanalizadas.

7.2.4 Algoritmo de Inserción

Este método consiste en ordenar los elementos del arregloprogresivamente, comenzando por los primeros y avanzando hastaordenarlos todos. Dado el elemento de una posición i (i comienzaen 2 y va hasta el fin del arreglo) se guarda en una variable auxiliary ésta se compara con el elemento que está a la izquierda; si noestán ordenados, el elemento de la izquierda se desplaza hacia laderecha. Se vuelve a comparar la variable auxiliar con el elementoque sigue por la izquierda. Todo elemento que no esté ordenado sedesplaza una posición a la derecha, hasta que se encuentre unoque si esté en orden o se llegue al inicio del vector. Al terminar este

Page 323: Disenio Algoritmos

323

7. Búsqueda y ordenamiento

recorrido se deposita, en el espacio que quedó libre, el elementocontenido en la variable auxiliar.

Cuadro 114. Función ordenar vector por el método de la burbuja

1. Entero[] burbuja(entero v[], entero n)

2. Entero i = 1, j, auxLógico: cambio = verdadero

3. Mientras i < n-1 y cambio = verdadero hacer4. cambio = falso5. Para j = 1 hasta n-i hacer6. Si v[j] > v[j+1] entonces7. aux = v[j]8. v[j] = v[j+1]9. v[j+1] = aux10. cambio = verdadero11. Fin si12. Fin para13. i = i + 114. Fin mientras15. Retornar v[]16. Fin burbuja

Considérese el vector de la figura 119, para ordenarlo ascenden-temente se copia a la variable auxiliar el contenido de la segundaposición, luego se compara con el primer elemento, como no estánordenados, el valor de la posición 1 se desplaza a la posición 2 ycomo no hay más elementos por la izquierda se coloca en laposición 1 el contenido de la variable auxiliar, de esta manera lasdos primeras posiciones del vector ya están en orden: v[1] = 13 yv[2] = 17 .

Page 324: Disenio Algoritmos

Diseño de algoritmos

324

Figura 119. Algoritmo de inserción – intercambio para el segundo elemento

Ahora se toma el elemento de la tercera posición, se lo copia a lavariable auxiliar y se compara con el elemento de la izquierda, comono están ordenados se desplaza el contenido de la posición dos a laposición tres. Se compara con el dato de la posición uno y seencuentra que este no está ordenado, se desplaza hacia laderecha. Como no hay más elementos por la izquierda se depositaen la posición uno el contenido de la variable auxiliar.

En resumen, se trata de tomar el i-ésimo elemento y ubicarlo enel lugar que le corresponde en el vector ordenado, para ello selibera el espacio que éste ocupa copiándolo a una variable auxiliar yse desplaza hacia la derecha los elementos mayores a éste, demanera que se abre un espacio justo en la posición que debequedar. Las instrucciones del cuadro 115 mueven el i-ésimoelemento a la posición que le corresponde en el vector ordenado.

Para ordenar todo el vector solo hay que repetir las instruccionesdel cuadro 115 para cada elemento desde la segunda hasta laúltima posición, como se muestra en el cuadro 116.

1 2 3 4 517 13 12 8 15 3 7 22 11 20v

6 7 8 9 10

13

aux

Page 325: Disenio Algoritmos

325

7. Búsqueda y ordenamiento

Cuadro 115. Instrucciones para insertar el i-ésimo elementoen la posición que le corresponde

1 j = i – 12 aux = v[i]3 Mientras v[j] > aux y j > = 1 hacer4 v[j+1] = v[j]5 j = j -16 Fin mientras7 v[j+1] = aux

Cuadro 116. Función ordenar vector por el método de inserción

1 Entero[] insercion(entero v[], entero n)2 Entero: aux, i , j3 Para i = 2 hasta n hacer4 j = i – 15 aux = v[i]6 Mientras v[j] > aux y j >= 1 hacer7 v[j+1] = v[j]8 j = j -19 Fin mientras10 v[j+1] = aux11 Fin para12 Retornar v[]13 Fin inserción

Este algoritmo puede mejorar su eficiencia cambiando el métodode búsqueda que se aplican en la parte izquierda del vector.Teniendo en cuenta que el subvector de la izquierda de cadaelemento está ordenado, se puede utilizar búsqueda binaria en vezde búsqueda secuencial, de esta forma se reduce el tiempo que elalgoritmo tarda en encontrar el lugar que le corresponde alelemento. Esta reducción en el tiempo de búsqueda puede ser

Page 326: Disenio Algoritmos

Diseño de algoritmos

326

significativa en vectores con muchos elementos. Hernández et al(2001: 53) expresan este cambio en los siguientes pasos:

a. Tomar un elemento en la posición ib. Buscar de forma binaria su lugar en las posiciones

anterioresc. Mover los elementos restantes hacia la derechad. Insertar el elemento

7.2.5 Algoritmo de Donald Shell

Es un algoritmo de inserción con saltos decrecientes diseñadopor Donald Shell* y reconocido generalmente por el nombre de sucreador. Funciona de forma similar al algoritmo de inserción, pero adiferencia de éste no mueve los elementos una posición, sino variasposiciones a la vez, de manera que los elementos llegan más rápidoa su destino. Este método es muy adecuado para vectores con grancantidad de datos.

En este algoritmo, se toma un elemento y se lo compara con losque están a su izquierda, si se busca un orden ascendente, loselementos mayores al de referencia se mueven a la derecha y éstese ubica en el lugar que le corresponde, pero no se compara con elelemento que está inmediatamente a la izquierda, sino con el quese encuentra x posiciones atrás. A x se le llama salto, en la primeraiteración se dan saltos de la mitad del tamaño del vector, demanera que se comparan los elementos de la mitad izquierda conlos elementos de la derecha y cada intercambio implica pasar de unlado al otro.

* Donald Shell trabajó en la división de ingeniería de General electric, se doctoró enmatemáticas en la Universidad de Cincinnati en 1959 y en ese mismo año publicóel algoritmo que hoy lleva su nombre con el título A high-speed sorting procedureen Communications of the ACM.

Page 327: Disenio Algoritmos

327

7. Búsqueda y ordenamiento

Para la segunda iteración el salto se reduce a la mitad y para latercera nuevamente a la mitad y así sucesivamente hasta llegar ahacer comparaciones de uno en uno.

Para analizar el funcionamiento de este algoritmo considéreseun vector de 10 elementos. Entonces:

Salto = 10/2 = 5

En este caso, en la primera iteración las comparaciones sehacen con una diferencia de 5 posiciones, v[1] con v[6], v[2] conv[7] y así sucesivamente, como se muestra en la figura 120.

Figura 120. Algoritmo de Shell – primera iteración

En la primera iteración cada elemento del lado izquierdo sólo secompara con uno del lado derecho ya que el salto divide el vectoren dos partes.

Comparación Resultado Intercambio

V[1] > v[6] Verdadero SiV[2] > v[7] Verdadero SiV[3] > v[8] Falso NoV[4] > v[9] Falso NoV[5] > v[10] Falso No

Para la segunda iteración se actualiza el salto tomando comovalor la cuarta parte del tamaño del vector, lo que implica quedesde algunos elementos se pueden dar varios saltos a laizquierda.

1 2 3 4 517 13 12 8 15 3 7 22 11 20v

6 7 8 9 10

salto = 5

Page 328: Disenio Algoritmos

Diseño de algoritmos

328

salto = salto/2salto = 5/2 = 2

En la figura 121 se muestra el vector después de la primeraiteración y las comparaciones que se harán en la segunda iteración.

Figura 121. Algoritmo de Shell – primera iteración

En la segunda iteración, en el ejemplo que se está analizando,salto = 2, en consecuencia el ciclo se ejecuta desde el tercerelemento hasta el último. La variable i se inicializa en 1 y la variableaux toma el tercer elemento (12). La primera comparación es entrev[1] y v[3] (12 < 3 = falso), si los elementos están en orden lavariable seguir toma el valor falso, el ciclo mientras terminar y seprocede a realizar las iteraciones para el elemento siguiente (v[4]) yasí sucesivamente.

En el cuadro 117 se muestra el pseudocódigo para una iteracióncualquiera. En este algoritmo, cada elemento se compara con losque están a su izquierda, el ciclo mientras se encarga del recorridohacia la izquierda, siempre que hayan elementos y el dato que sepretende insertar sea menor que el indicado por el índice i. Si seencuentra que el elemento de la posición i es menor que el de j noes necesario seguir hacia la izquierda, pues éstos ya están enorden.

1 2 3 4 53 7 12 8 15 17 13 22 11 20v

6 7 8 9 10

salto = 2

Page 329: Disenio Algoritmos

329

7. Búsqueda y ordenamiento

Cuadro 117. Algoritmo de Shell – una iteración

1 Para j = (1 + salto) hasta n hacer2 i = j – salto3 aux = v[j]4 seguir = verdadero5 Mientras i > 0 y seguir = verdadero hacer6 Si aux < v[i] entonces7 v[i + salto] = v[i]8 i = i – salto9 Si no10 seguir = falso11 Fin si12 Fin mientras13 v[i + salto] = aux14 Fin para

En la figura 122 se muestra el orden de los elementos despuésde la segunda iteración con saltos de dos en dos.

Figura 122. Algoritmo de Shell – primera iteración

En este ejemplo, debido a que se utilizó un vector pequeño (10elementos), para la tercera iteración los saltos son de uno en uno ydespués de ésta el vector está completamente ordenado. Arregloscon mayor cantidad de elementos requieren más iteraciones.

En el cuadro 118 se presenta una función para ordenar unvector aplicando el algoritmo de Shell.

1 2 3 4 53 7 11 8 12 17 13 20 15 22v

6 7 8 9 10

Page 330: Disenio Algoritmos

Diseño de algoritmos

330

Cuadro 118. Función ordenar vector por el método de Shell

1 Entero[] shell(entero v[], entero n)

2 Entero: aux, salto, i , jLógico: seguir

3 salto = n/24 Mientras salto >= 1 hacer5 Para j = (1 + salto) hasta n hacer6 i = j – salto7 aux = v[j]8 seguir = verdadero9 Mientras i > 0 y seguir = verdadero hacer10 Si aux < v[i] entonces11 v[i + salto] = v[i]12 i = i – salto13 Si no14 seguir = falso15 Fin si16 Fin mientras17 v[i + salto] = aux18 Fin para19 Salto = salto/220 Fin mientras21 Retornar v[]22 Fin Shell

Page 331: Disenio Algoritmos

331

7. Búsqueda y ordenamiento

7.2.6 Algoritmo de Ordenamiento Rápido

Este algoritmo es considerado el más rápido de los estudiadosen este capítulo. Fue diseñado por Tony Hoare* y se basa en latécnica dividir para vencer de donde se desprende que ordenar doslistas pequeñas es más rápido y más fácil que ordenar una grande(Joyanes, 2000: 405).

El fundamento del algoritmo quicksort es la partición del vector ola lista en tres de menor tamaño distribuidas a la izquierda, alcentro y a la derecha. La del centro contiene el valor utilizado comoreferencia para particionar el vector y por tanto un solo elemento.

En términos generales el algoritmo de ordenamiento rápidoconsta de las siguientes operaciones:

1. Seleccionar un elemento de referencia al que se denominapivote

2. Recorrer el arreglo de izquierda a derecha buscandoelementos mayores al pivote

3. Recorrer el arreglo de derecha a izquierda buscandoelementos menores al pivote

4. Intercambiar cada elemento menor al pivote por uno mayoral pivote, de manera que los valores menores queden a laizquierda, los mayores a la derecha y el pivote al centro.

5. Realizar las mismas operaciones con cada una de lassublistas hasta que se tengan sublistas de un elemento.

6. Reconstruir la lista concatenando la sublista de la izquierda,el pivote y la sublista de la derecha.

Aunque este algoritmo puede desarrollarse de manera iterativaes mucho más fácil de comprender e implementar utilizando

* Su nombre completo es Charles Antony Richard Hoare, estudio en la Universidadde Oxford y en la Universidad Estatal de Moscú. Desarrolló el lenguaje algol 60 ydiseño el algoritmo de ordenamiento rápido (Quicksort), trabajó en la Universidadde Queen y en el Laboratorio de Computación de la Universidad de Oxford.

Page 332: Disenio Algoritmos

Diseño de algoritmos

332

recursividad, tema que se explica en el capítulo siguiente. En elcuadro 119 se presenta el pseudocódigo para particionar el vector.

Cuadro 119. Función para particionar un vector

1 Entero[] particionar(entero v[], entero inf, entero sup)2 Entero: aux, pivote = v[inf], m = inf, n = sup+13 Mientras m <= n hacer4 Hacer5 m = m + 16 Mientras v[m] < pivote7 Hacer8 n = n – 19 Mientras v[n] > pivote10 Si m < n entonces11 Aux = v[m]12 v[m] = v[n]13 v[n] = aux14 Fin si15 Fin mientras16 v[inf] = v[n]17 v[n] = pivote18 Invocación recursiva19 Retornar v[]20 Fin particionar

La versión recursiva de este algoritmo se explica detalladamenteen la sección 8.7

Page 333: Disenio Algoritmos

333

7. Búsqueda y ordenamiento

7.2.7 Fusión de vectores ordenados

Esta operación recibe otros nombres como intercalación(Joyanes, 1996: 343) y mezcla (López et al, 2009: 135). Se trata deunir los elementos de dos vectores o listas ordenadas y formar untercer vector o lista también ordenados, en donde se aprovecha elorden previo de las entradas para conseguir un conjunto ordenadoen menor tiempo.

En la figura 123 se muestra dos vectores de diferente tamaño ysu fusión en un tercer vector ordenado.

Figura 123. Fusión de vectores ordenados

El algoritmo para fusionar los dos vectores ordenados consisteen un ciclo para recorrer los dos vectores de entrada al tiempo y encada iteración seleccionar el menor elemento para pasarlo al nuevovector. En el arreglo que se toma el elemento se incrementa elíndice mientras que en el otro permanece constante hasta que unelemento sea pasado al nuevo vector. El ciclo termina cuandoalguno de los vectores haya sido copiado en su totalidad y loselementos restantes del otro vector se adicionan en el orden en que

1 2 3 4 511 13 14 17 20a

1 2 3 4 5

12 15 16 18 19b

11 12 13 14 15 16 17 18 19 20c

21 22

6 7

21 22

Page 334: Disenio Algoritmos

Diseño de algoritmos

334

están. En el cuadro 120 se presenta la función para realizar estatarea.

Cuadro 120. Función para fusionar vectores ordenados

1 Entero[] fusionar(entero a[], entero b[], entero m, entero n)2 Entero: c[m+n], i= 1, j = 1, k = 1, x3 Mientras i <= m y j <= n hacer4 Si a[i] <= b[j] entonces5 c[k] = a[i]6 i = i + 17 Si no8 c[k] = b[j]9 j = j + 110 Fin si11 k = k + 112 Fin mientras13 Si i <= m entonces14 Para x = i hasta m hacer15 c[k] = a[x]16 k = k + 117 Fin para18 Fin si19 Si j <= n entonces20 Para x = j hasta n hacer21 c[k] = b[x]22 k = k + 123 Fin para24 Fin si25 Retornar c[]26 Fin fusionar

Page 335: Disenio Algoritmos

335

7. Búsqueda y ordenamiento

7.2.8 Otros algoritmos de Ordenamiento

Además de los seis algoritmos de ordenamiento presentados enesta sección existen muchos más, algunos más eficientes que losaquí estudiados y por tanto más complejos, por lo que exigenconocimientos más avanzados en ciencias de la computación. Acontinuación se mencionan algunos pensando en los lectores quedesean profundizar en este tema.

Mergesort: es un algoritmo recursivo que aplica el principiodivide y vencerás de forma similar a Quicksort. Consiste enparticionar el vector o la lista en dos partes iguales, se ordenarecursivamente cada una de ellas y luego se unen mediante elproceso conocido como fusión de sucesiones ordenadas o mezclade vectores ordenados.

Heapsort: este algoritmo combina las ventajas de Quicksort yMergesort. Utiliza una estructura de datos denominada heap(montón) que es un árbol binario completo del que se eliminanalgunas hojas de extrema derecha.

Ordenamiento por base: este método consiste en distribuir loselementos del conjunto a ordenar en varios subconjuntosatendiendo algún criterio, se ordena cada subconjunto aplicandocualquier método de ordenamiento y luego se vuelven a unirconservando el orden. Por ejemplo, supóngase que se tiene unconjunto grande de tarjetas de invitación y se desea organizarlasalfabéticamente por el nombre de su destinatario. Se puede formar26 subconjuntos según la letra con que comienza el nombre, luegose ordena cada montón utilizando, por ejemplo, el método deinserción y finalmente se unen los grupos comenzando por el de laletra A.

Page 336: Disenio Algoritmos

Diseño de algoritmos

336

7.2.9 Un ejemplo completo

Ejemplo 72. Lista de calificaciones

Un profesor maneja la lista de estudiantes y calificacionesmediante arreglos: en un vector de tipo entero guarda los códigos,en uno de tipo cadena, los nombres; y en una matriz de cuatrocolumnas mantiene las notas: tres parciales y la definitiva.

Entre las operaciones que el profesor realiza se tienen: ingresarlos nombres de los estudiantes, ingresar las notas en el momentoen que estas se generan, calcular la definitiva y listar lascalificaciones; en ocasiones consulta las notas de un estudiante, enotras debe corregir alguna nota. El listado se presenta ordenadosegún alguno de estos criterios: orden alfabético por apellido uorden descendente por nota definitiva. Diseñar el algoritmo pararealizar las tareas mencionadas.

Según la descripción del problema, la estructura de datosutilizada es la que se muestra en la figura 124.

Figura 124. Arreglos para guardas planilla de calificaciones

Vector códigos Vector nombres Matriz notas

1 2 3 41 101 1 Salazar Carlos 1 3,5 2,5 4,0 3,3

2 102 2 Bolaños Carmen 2 4,2 3,8 4,5 4,2

3 102 3 Bermúdez Margarita 3 2,0 4,5 4,8 3,8

4 104 4 Paz Sebastián 4 2,5 3,5 4,4 3,5

5 105 5 Díaz Juan Carlos 5 3,4 3,5 3,8 3,6

6 106 6 Marroquín Verónica 6 4,0 4,6 3,3 4,0

… … … … … … … … …

33 133 33 Hernández María 33 3,2 4,0 4,6 3,9

34 134 34 Ordóñez Miguel 34 4,5 3,8 3,0 3,8

35 -1 35 35

… -1 … …Parcial

1Parcial

2Parcial

3 Definitiva

Page 337: Disenio Algoritmos

337

7. Búsqueda y ordenamiento

En este ejercicio se hace una breve descripción de los requisitosque debe satisfacer la aplicación que se pretende diseñar. Hasta elmomento ya se sabe el qué hacer, ahora se debe pensar en elcómo. De eso se ocupan los párrafos siguientes.

Este problema es muy complejo para intentar solucionarlo conun solo algoritmo, es necesario dividirlo en módulos o subrutinasque se puedan diseñar más fácilmente. ¿Cómo separar las tareas?

Una forma de hacerlo es a partir de las tareas que el usuarionecesita que el programa realice, lo que técnicamente se conocecomo requisitos, estos son: ingresar los estudiantes, por tanto serequiere un procedimiento o una función para ingresar estos datos;después de calificar los exámenes, el profesor debe registrar lasnotas, en consecuencia se requiere un procedimiento para ingresarcalificaciones; otro procedimiento para consultar las calificacionesde un estudiante y otro para modificarlas en caso de ser necesario yfinalmente; para generar los listados se requiere también unprocedimiento y dado que los listados se presentan ordenados,también un procedimiento para ordenar los datos en los arreglos.

Una cuestión importante a tener en cuenta es que los algoritmosque se han estudiado operan sobre un número determinado dedatos. En este ejercicio no se conoce el número de estudiantes queconforman el curso. La estrategia para solucionar casos en los queno se conoce la cantidad de espacio requerido es: analizar eldominio del problema y declarar los arreglos considerando el casoen que más espacio se requiera. Tratándose de una planilla decalificaciones, es probable que no sean más de 40 estudiantes,pero podría ocurrir que excepcionalmente hubiera más de 50, asíque para evitar que alguno se quede sin registrar es mejorconsiderar el mayor espacio requerido y declarar los arreglos condicho tamaño. Entonces, en este ejemplo, se reserva espacio para65 estudiantes.

En la figura 125 se presenta un diagrama con los procedimien-tos y funciones a diseñar para resolver este ejercicio.

Page 338: Disenio Algoritmos

Diseño de algoritmos

338

Figura 125. Diagrama de procedimientos y funciones

Ahora bien, dado que se reserva espacio suficiente para ungrupo muy grande, en la mayoría de los casos el curso será máspequeño y parte de los arreglos quedará vacía. Esto implica que, enprocura de la eficiencia de los algoritmos, se debe hacer losrecorridos de los arreglos únicamente hasta donde hay datos. Laestrategia aplicada en este caso es inicializar el vector de códigoscon -1 en cada posición, de manera que al ingresar estudianteseste valor cambia por el código del estudiante y para saber cuántosregistros se tienen basta con diseñar una función para contar loselementos con valor diferente de -1. En el cuadro 121 se presentael procedimiento para inicializar el vector de códigos y en el cuadro122 la función para conocer el número de estudiantes registrados.

Algoritmoprincipal

Inicializar

Menú

Registrarestudiante

s

Registrarnotas

Calcularnota

definitiva

Consultarnota

Actualizarnotas

Listar

Ordenarpor código

Buscar

Ordenar porapellido

Ordenar pornota

Contarestudiantes

Page 339: Disenio Algoritmos

339

7. Búsqueda y ordenamiento

Cuadro 121. Función para inicializar vector

1 inicializar()2 Entero: i3 Para i = 1 hasta 65 hacer4 codigo[i] = -15 Fin para6 Fin inicializar

En este procedimiento, al igual que la función que sigue, no sedefinen parámetros, esto indica que el vector al que acceden sedefine como global en el algoritmo principal.

Cuadro 122. Función para contar estudiantes

1 Entero contarestudiantes()2 Entero: i=03 Mientras código[i+1] != -1 hacer4 i = i + 15 Fin mientras6 Retornar i7 Fin contarestudiantes

Ahora se diseñan los procedimientos y funciones paraimplementar los requisitos de la aplicación. En el cuadro 123 sepresenta el procedimiento para registrar los nombres de losestudiantes.

Page 340: Disenio Algoritmos

Diseño de algoritmos

340

Cuadro 123. Función para registrar estudiantes

1 registrarestudiantes()2 Entero: i3 Caracter: rta4 i = contarestudiantes()5 Hacer6 i = i + 17 Escribir “Código: “8 Leer codigo[i]9 Escribir “Nombre: “10 Leer nombre[i]11 Escribir “Mas estudiantes s/n? “12 Leer rta13 Mientras rta = ‘S’ o rta = ‘s’14 Fin registrarestudiantes

En el procedimiento registrar estudiantes se hace uso de lafunción contarestudiantes(), esto permite que se registren los nuevosestudiantes al final de la lista. En el cuadro 124 se presenta elprocedimiento para registrar las notas. Éste recibe como parámetroel parcial al que pertenece la calificación (primero, segundo otercero), presenta el nombre del estudiante, lee la nota y la guardaen la columna que corresponde.

Una vez se hayan registrado las tres notas se calcula la notadefinitiva. El procedimiento para calcular la nota definitiva sepresenta en el cuadro 125.

Page 341: Disenio Algoritmos

341

7. Búsqueda y ordenamiento

Cuadro 124. procedimiento para registrar calificaciones

1 registrarnotas (Entero: j)2 Entero: i,n3 n = contarestudiantes()4 Para i = 1 hasta n hacer5 Escribir “Código: “, código[i]6 Escribir “Nombre: “, nombre[i]7 Escribir “Nota “, j, “:”8 Leer notas[i][j]9 Fin para10 Fin registrarnotas

Cuadro 125. Procedimiento para calcular nota definitiva

1 Calcularnotadefinitiva ()2 Entero: i,n3 n = contarestudiantes()4 Para i = 1 hasta n hacer5 Notas[i][4] = (notas[i][1] + notas[i][2] + notas[i][3])/36 Fin para7 Fin calcularnotadefinitiva

Cuando ya se han ingresado los datos, hay tres operaciones quese pueden realizar: consultar, modificar y reportar. Para las tresoperaciones es conveniente que los datos estén ordenados. Antesde proceder a escribir el procedimiento para consultar una nota sediseña uno para ordenar los vectores tomando como referencia elcódigo del estudiante y aplicando el método de selección. Estopermitirá aplicar búsqueda binaria en las operaciones de consulta ymodificación. Este se presenta en el cuadro 126.

Page 342: Disenio Algoritmos

Diseño de algoritmos

342

Cuadro 126. Procedimiento ordenar vectorpor el método de selección

1 ordenarporcodigo()

2Entero i, j, posmenor, aux, nReal: v[4]Cadena: nom

3 n = contarestudiantes()4 Para i = 1 hasta n-1 hacer5 posmenor = i6 Para j = i+1 hasta n hacer7 Si codigo[posmenor] > codigo[j] entonces8 posmenor = j9 Fin si10 Fin para11 aux = codigo[i]12 codigo[i] = codigo[posmenor]13 codigo[posmenor] = aux14 nom = nombre[i]15 nombre[i] = nombre[posmenor]16 nombre[posmenor] = nom17 V[1] = notas[i][1]18 V[2] = notas[i][2]19 V[3] = notas[i][3]20 V[4] = notas[i][4]21 notas[i][1] = notas[posmenor][1]22 notas[i][2] = notas[posmenor][2]23 notas[i][3] = notas[posmenor][3]24 notas[i][4] = notas[posmenor][4]25 notas[posmenor][1] = v[1]26 notas[posmenor][2] = v[2]27 notas[posmenor][3] = v[3]28 notas[posmenor][4] = v[4]29 Fin para30 Fin ordenarporcodigo

Page 343: Disenio Algoritmos

343

7. Búsqueda y ordenamiento

En este algoritmo, entre las líneas 11 y 28 se hace elintercambio de datos, en los dos vectores y en la matriz. Para moverla fila de la matriz se utiliza un vector de 4 elementos.

Para consultar las notas de un estudiante es necesario realizaruna búsqueda con base en su código. Considerando que ya sedesarrolló el procedimiento para ordenar los datos, se puede aplicarla búsqueda binaria sobre el vector de códigos. En el cuadro 127 sepresenta el algoritmo de la función búsqueda binaria adaptado a lalógica que se está aplicando en este ejercicio, éste devuelve laposición que le corresponde al estudiante y con el índice se accedea los demás arreglos.

Cuadro 127. Función búsqueda binaria para código de estudiante

1 busquedabinaria(Entero cod)2 Entero inf, sup, centro, pos = -13 Inf = 14 sup = contarestudiantes()5 Ordenarporcodigo()6 Mientras inf <= sup y pos < 0 hacer7 centro = (inf + sup) / 28 Si v[centro] = cod entonces9 pos = centro10 Si no11 Si cod > v[centro] entonces12 inf = centro + 113 Si no14 sup = centro – 115 Fin si16 Fin si17 Fin mientras18 Retornar pos19 Fin busquedabinaria

Page 344: Disenio Algoritmos

Diseño de algoritmos

344

El algoritmos de la búsqueda binaria se explica detalladamente enla sección 7.1.2.

De esta manera, el procedimiento para consultar las notas de unestudiantes solo tiene que realizar tres tareas: leer el código,buscarlo y acceder a los datos. Este procedimiento se muestra en elcuadro 128.

Cuadro 128. Procedimiento consultar notas

1 consultar()2 Entero: cod, pos3 Escribir “Codigo del estudiante: “4 Leer cod5 pos = búsquedabinaria(cod)6 Si pos > 0 entonces7 Escribir “Codigo:”, código[pos]8 Escribir “Nombre:”, nombre[pos]9 Escribir “Nota 1:”, notas[pos][1]10 Escribir “Nota 2:”, notas[pos][2]11 Escribir “Nota 3:”, notas[pos][3]12 Escribir “Nota definitiva:”, notas[pos][4]13 Si no14 Escribir “Codigo “, cod, “no encontrado”15 Fin si16 Fin consultar

En algunas ocasiones el docente necesitará cambiar algunacalificación, para ello se ofrece el procedimiento modificar, ésterealiza las siguientes operaciones: lee el código del estudiante, lobusca, si lo encuentra muestra los datos, lee el nuevo dato y loguarda en la columna que corresponda. El pseudocódigo de esteprocedimiento se muestra en el cuadro 129.

Page 345: Disenio Algoritmos

345

7. Búsqueda y ordenamiento

Cuadro 129. Procedimiento modificar notas

1 modificar()2 Entero: cod, pos, opc3 Escribir “Codigo del estudiante: “4 Leer cod5 pos = búsquedabinaria(cod)6 Si pos > 0 entonces7 Escribir “Codigo:”, código[pos]8 Escribir “Nombre:”, nombre[pos]9 Escribir “Nota 1:”, notas[pos][1]10 Escribir “Nota 2:”, notas[pos][2]11 Escribir “Nota 3:”, notas[pos][3]12 Escribir “Nota definitiva:”, notas[pos][4]13 Escribir “Ingrese la nota a modificar (1, 2 o 3): ”14 Leer opc15 Según sea opc hacer16 1: leer notas[pos][1]17 2: leer notas[pos][2]18 3: leer notas[pos][1]19 Fin según sea20 Notas[pos][4] = (Notas[pos][1]+ Notas[pos][2]+ Notas[pos][3])/321 Si no22 Escribir “Código “, cod, “no encontrado”23 Fin si24 Fin modificar

Ahora se procede a diseñar los subalgoritmos para generar elreporte de calificaciones, éste puede estar ordenado alfabética-mente por nombre o descendentemente por la nota definitiva conel propósito de que aparezcan primero las notas más altas. Alordenar los datos es preciso tener en cuenta que los intercambiosse deben hacer en los tres arreglos. En el cuadro 130 se presentael pseudocódigo para organizar los datos alfabéticamente aplicandoel algoritmo de intercambio directo.

Page 346: Disenio Algoritmos

Diseño de algoritmos

346

Cuadro 130. Procedimiento para ordenar los datos alfabéticamentepor intercambio directo

1 ordenarporapellido()

2Entero i, j, aux,n, codCadena: nomReal v[4]

3 n = contarestudiantes()4 Para i = 1 hasta n-1 hacer5 Para j = i+1 hasta n hacer6 Si nombre[i] > nombre[j] entonces7 cod = codigo[i]8 codigo[i] = codigo[j]9 codigo[j] = cod10 nom = nombre[i]11 nombre[i] = nombre[j]12 nombre[j] = nom13 V[1] = notas[i][1]14 V[2] = notas[i][2]15 V[3] = notas[i][3]16 V[4] = notas[i][4]17 notas[i][1] = notas[j][1]18 notas[i][2] = notas[j][2]19 notas[i][3] = notas[j][3]20 notas[i][4] = notas[j][4]21 notas[j][1] = v[1]22 notas[j][2] = v[2]23 notas[j][3] = v[3]24 notas[j][4] = v[4]25 Fin si26 Fin para27 Fin para28 Fin ordenarporapellido

Page 347: Disenio Algoritmos

347

7. Búsqueda y ordenamiento

Para ordenar la planilla según la nota definitiva se adapta elalgoritmo de Shell, como se aprecia en el cuadro 131.

Cuadro 131. Procedimiento para ordenar datos descendentementeaplicando algoritmo de Shell

1 Ordenarpornota()2 Entero: aux, salto, i , j, cod, n

Logito: seguirCadena: nomReal: v[4]

3 n = contarestudiantes()

4 salto = n/2

5 Mientras salto >= 1 hacer

6 Para j = (1 + salto) hasta n hacer

7 i = j – salto

8 cod = codigo[j]9 nom = nombre[j]10 V[1] = notas[j][1]11 V[2] = notas[j][2]12 V[3] = notas[j][3]13 V[4] = notas[j][4]14 seguir = verdadero

15 Mientras i > 0 y seguir = verdadero hacer

16 Si V[4] < notas[i][4] entonces

17 codigo[i + salto] = codigo[i]18 nombre[i + salto] = nombre[i]19 notas[i + salto][1] = notas[i][1]20 notas[i + salto][2] = notas[i][2]21 notas[i + salto][3] = notas[i][3]22 notas[i + salto][4] = notas[i][4]23 i = i – salto

24 Si no

25 seguir = falso

26 Fin si

Page 348: Disenio Algoritmos

Diseño de algoritmos

348

Cuadro 131. (continuación)

27 Fin mientras

28 codigo[i + salto] = cod29 nombre[i + salto] = nom30 notas[i + salto][1] = v[1]31 notas[i + salto][2] = v[2]32 notas[i + salto][3] = v[3]33 notas[i + salto][4] = v[4]34 Fin para

35 Salto = salto/2

36 Fin mientras

37 Fin ordenarpornota

Si se quisiera imponer un orden ascendente bastaría concambiar el signo menor que por mayor que en la línea 16.

En el procedimiento listar() que se presenta en el cuadro 132, sesolicita al usuario que seleccione en qué orden desea la lista, luegose invoca uno de los dos procedimientos de ordenamiento yadiseñados y posteriormente se genera el listado.

Cuadro 132. Procedimiento para listar estudiantes y calificaciones

1 Listar ()2 Entero: orden, i, n

3 n = contarestudiantes()

4 Escribir “Generar listado ordenado por:”

5 Escribir “1. Nombre 2. Nota definitiva”

6 Leer orden

7 Si orden = 1 entonces

8 Ordenarporapellido()

9 Si no

Page 349: Disenio Algoritmos

349

7. Búsqueda y ordenamiento

Cuadro 132. (continuación)

10 Ordenarpornota()

11 Fin si

12 Escribir “código \t Nombre \t Nota1 \t Nota2 \t Nota3 \t Nota def.”

13 Para i = 1 hasta n hacer

14 Escribir código[i], “\t”, nombre[i], “\t”, nota[i][1], “\t”, nota[i][2],“\t”, nota[i][3], “\t”, nota[i][4]

15 Fin para

16 Fin listar

Continuando con el algoritmo de solución al problemaplanteado, ya se tienen varios procedimientos y algunas funcionespara desarrollar las tareas específicas, ahora se requiere unafunción que interactúe con el usuario y reporte al algoritmo principalla tarea que él desea ejecutar. Para ello se diseña un menú y unafunción que lo muestra y captura la selección, el pseudocódigo deésta se presenta en el cuadro 133.

Cuadro 133. Función menú

1 Entero menu()2 Entero: opción3 Escribir “Menu”4 Escribir “1. Registrar estudiantes”5 Escribir “2. Registrar calificaciones”6 Escribir “3. Calcular nota definitiva”7 Escribir “4. Consultar notas de un estudiante”8 Escribir “5. Actualizar notas de un estudiante”9 Escribir “6. Imprimir reporte”10 Escribir “7. Terminar11 Hacer12 Leer opción13 Mientras opción < 1 u opción > 714 Retornar opción15 Fin menú

Page 350: Disenio Algoritmos

Diseño de algoritmos

350

Finalmente, en el cuadro 134 se presenta el algoritmo principal,el que controla la ejecución de todos los procedimientos y funcionesque se han diseñado previamente.

Cuadro 134. Algoritmo principal

1 Inicio2 Global Entero: codigo[65]

Entero opc, nnotaGlobal Cadena: nombre[65]Global Real: notas[65][4]

3 Inicializar()

4 Hacer

5 opc = menú()

6 Según sea opc hacer

7 1: registrarestudiantes()

8 2: Escribir “Cuál nota desea ingresar. (1, 2 o 3)?”

9 Leer nnota

10 Registrarnotas(nnota)

11 3: calcularnotadefinitiva()

12 4: consultar()

13 5: modificar()

14 6: listar()

15 Fin según sea

16 Mientras opc != 7

17 Fin algoritmo

Así se concluye este pequeño ejercicio de diseño de un programapara solucionar un problema de baja complejidad como es eladministrar las calificaciones de un curso. No obstante, hapermitido mostrar la aplicación de todos los conceptos estudiados alo largo de los capítulos anteriores, incluyendo manejo de arreglos,búsqueda y ordenamiento de datos. De manera que puede sertomado como referencia para desarrollar los ejercicios que seplantean a continuación.

Page 351: Disenio Algoritmos

351

7. Búsqueda y ordenamiento

7.2.10 Ejercicios propuestos

1. La biblioteca Lecturas Interesantes desea administrar susmateriales mediante un programa de computador y hasolicitado que se le diseñe un algoritmo para este propósito. Sedesea almacenar los datos de los libros, como son: materia,titulo, editorial, autor y año. Se desea ingresar todos los librosy poder adicionar las nuevas adquisiciones en la medida enque se hacen; hacer consultas con base en autor, título o ISBN,de igual manera generar listados ordenados por autor o portítulo.

2. La empresa Buena Paga desea un algoritmo para procesar lainformación de su nómina. Se pretende almacenar en arregloslos datos: nombre del empleado, cargo, sueldo básico, díastrabajados, deducciones y sueldo del mes. Entre las tareas arealizar están: ingreso de datos, modificación de datos,procesamiento de la nómina, consultas y generación dereportes.

3. Un algoritmo que mediante matrices mantenga los datos:nombre, dirección y teléfono de los profesores de launiversidad y permita adicionar datos, modificar, listar enorden alfabético y buscar por nombre.

Page 352: Disenio Algoritmos

352

8. RECURSIVIDAD

El juicio de los hombres entendidosdescubre por las cosas claras las oscuras,

por las pequeñas las grandes,por las próximas las remotas

y por la apariencia la realidad.Séneca

Recursividad o recursión, como también se le llama, es unconcepto que se aplica de manera especial en las matemáticas y enla programación de computadores; y de forma similar en numerosassituaciones de la vida cotidiana. En matemáticas se habla dedefinición inductiva para referirse a los numerosos métodos quehacen uso de la recursividad; mientras que en programación, estetema, se aplica a los algoritmos en el momento de la especificación,y a las funciones en la implementación (Joyanes, 1999).

La utilización del concepto de recursividad en los lenguajes deprogramación se la debe al profesor John McCarthy, del Massachu-setts Institute of Tenology (MIT), quien recomendó su inclusión en eldiseño de Algol60 y desarrolló el lenguaje Lisp, que introdujoestructuras de datos recursivas junto con procedimientos yfunciones recursivas (Baase, 2002).

La recursividad es una alternativa a la utilización de estructurasiterativas. Un algoritmo recursivo ejecuta cálculos repetidas vecesmediante llamados consecutivos a sí mismo. Esto no significa quelos algoritmos recursivos sean más eficientes que los iterativos,

Page 353: Disenio Algoritmos

8. Recursividad

353

incluso, en algunos casos, los programas pueden requerir mástiempo y memoria para ejecutarse, pero este costo puede sercompensado por una solución más intuitiva y sustentadamatemáticamente en una prueba por inducción.

La mayoría de los lenguajes de programación actuales permitenla implementación de algoritmos recursivos, mediante procedimien-tos o funciones. Para el caso de lenguajes que no permiten suimplementación directa, ésta puede simularse utilizando estructu-ras de datos de tipo pila.

La recursividad es un concepto que se aplica indistintamente aalgoritmos, procedimientos y programas. No obstante, en este librose aborda desde la perspectiva del diseño de algoritmos.

8.1 LA RECURSIVIDAD Y EL DISEÑO DE ALGORITMOS

En el ámbito del diseño de algoritmo se define como recursividadla técnica de plantear la solución de un problema invocandoconsecutivamente el mismo algoritmo con un problema cada vezmenos complejo, hasta llegar a una versión con una soluciónconocida. Por ejemplo, para calcular el factorial de un número.

Ejemplo 73. Función recursiva para calcular el factorial de unnúmero

Se conoce como factorial de un número al producto de losenteros comprendidos entre 1 y n inclusive, y se representamediante: n!

De manera que:

n! = 1 * 2 * 3 * 4 * … * (n-2) * (n - 1) * n

También se sabe que el factorial está definido para el caso deque n = 0, cuyo resultado es 1. Es decir, 0! = 1.

Page 354: Disenio Algoritmos

Diseño de algoritmos

354

De esto se desprende que para calcular el factorial de 4 (4!) secalculará el producto de 4 por el factorial de 3 (3!); para calcular elfactorial de 3 (3!), el producto de 3 por el factorial de 2 (2!); paracalcular el factorial de 2 (2!), 2 por factorial de 1 (1!); para calcularfactorial de 1 (1!), 1 por el factorial de 0. Ahora, como se conoceque el factorial de 0 es 1 (0! = 1), entonces el problema estáresuelto. Más adelante se desarrolla completamente este ejercicio.

Como se aprecia en la figura 126, la recursividad consiste enescribir una función que entre sus líneas o sentencias incluyen unllamado a sí misma con valores diferentes para sus parámetros, demanera que progresivamente llevan a la solución definitiva.

Figura 126. Esquema de una función recursiva

factorial(4) = 4 * factorial(3)

factorial(3) = 3 * factorial(2)

factorial(2) = 2 * factorial(1)

factorial(1) = 1 * factorial(0)

factorial(0) = 1

1

1 * 1 = 1

2 * 1 = 2

3 * 2 = 6

4 * 6 = 24

Page 355: Disenio Algoritmos

8. Recursividad

355

La recursividad es otra forma de hacer que una parte del códigose ejecute repetidas veces, pero sin implementar estructurasiterativas como: mientras, para o hacer mientras.

8.2 ESTRUCTURA DE UNA FUNCIÓN RECURSIVA

Se ha mencionado que consiste en implementar funciones quese invocan a sí mismas. Esto implica que la función debe tener unaestructura tal que le permita invocarse a sí misma y ejecutarsetantas veces como se requiera para solucionar el problema, pero ala vez, sin hacer más invocaciones de las estrictamente necesarias,evitando que se genere una secuencia infinita de llamadas a símisma. Cuando una función recursiva especifica en su definicióncuándo autoinvocarse y cuándo dejar de hacerlo se dice queaquella está correctamente definida (Lipschutz, 1993)

Una función recursiva bien definida ha de cumplir las doscondiciones siguientes:

1. Debe existir un criterio base cuya solución se conoce y que noimplica una llamada recursiva. En el caso de utilizar unafunción recursiva para calcular el factorial, el criterio baseindica que factorial de 0 es 1 (0! = 1). Es decir, si la funciónrecibe como parámetro el 0 ya no necesita invocarsenuevamente, simplemente retorna el valor correspondiente, eneste caso el 1.

factorial(n) = ? (requiere llamada a la función recursiva)factorial(0) = 1 (no requiere llamado a la función)

2. Cada vez que la función se invoque a sí misma, directa oindirectamente, debe hacerlo con un valor más cercano alcriterio base. Dado que el criterio base es un caso particulardel problema en el que se conoce la solución esto indica quecon cada llamado a la función recursiva se estará acercando ala solución conocida. Continuando con el ejemplo de la función

Page 356: Disenio Algoritmos

Diseño de algoritmos

356

factorial, se ha determinado que el criterio base es 0! = 1,entonces, cada vez que se invoque la función deberá utilizarsecomo parámetro un valor más cercano a 0.

El factorial de un número es el producto del número por elfactorial del número menor, hasta llegar al factorial de 0 que esconstante. Con base en esto se puede afirmar que está definidopara cualquier entero positivo, así:

0! = 11! = 1 * 1 = 1 1! = 1 * 0!2! = 2 * 1 = 2 2! = 2 * 1!3! = 3 * 2 * 1 = 6 3! = 3 * 2!4! = 4 * 3 * 2 * 1 = 24 4! = 4 * 3!5! = 5 * 4 * 3 * 2 * 1 = 120 5! = 5 * 4!

Por lo tanto, la solución del factorial se puede expresar como:

a. Si n = 0 n! = 1b. Si n > 0 n! = n * (n – 1)!

Y esta es la definición correcta de una función recursiva, donde aes el criterio base, es decir, la solución conocida, y b es lainvocación recursiva con un argumento más cercano a la solución.Expresado en forma de función matemática se tiene:

Siendo f(n) la función para calcular el factorial de n, entonces:

El pseudocódigo para esta función se presenta en el cuadro135.

f(n) =

1 Si n = 0

n * f(n-1) Si n > 0

Page 357: Disenio Algoritmos

8. Recursividad

357

Cuadro 135. Función recursiva para calcular el factorial de un número

1. Entero factorial(entero n)2. Si n = 0 entonces3. Retornar 14. Si no5. Retornar (n * factorial(n – 1))6. Fin si7. Fin factorial

En la definición se puede apreciar claramente el cumplimientode las dos condiciones de que trata esta sección. En las líneas 2 y3 se examina el cumplimiento del criterio base, para el cual seconoce la solución (0! = 1).

2. Si n = 0 entonces3. Retornar 1

Si aun no se ha llegado a dicho criterio, es necesario invocarnuevamente la función recursiva, pero con un valor menor, como seaprecia en las líneas 4 y 5.

4. Si no5. Retornar (n * factorial(n – 1))

8.3 EJECUCIÓN DE FUNCIONES RECURSIVAS

La ejecución de una función recursiva requiere quedinámicamente se le asigne la memoria suficiente para almacenarsus datos. Por cada ejecución se reserva espacio para losparámetros, las variables locales, las variables temporales y el valordevuelto por la función. El código se ejecuta desde el principio conlos nuevos datos. Cabe aclarar que no se hace copia del códigorecursivo en cada marco de activación. (Schildt, 1993).

Page 358: Disenio Algoritmos

Diseño de algoritmos

358

El espacio en que se ejecuta cada invocación de una funciónrecursiva se denomina Marco de activación (Baase, 2002). Estemarco, además de proporcionar espacio para guardar las variablescon que opera la función, también, proporciona espacio para otrasnecesidades contables, como la dirección de retorno, que indica lainstrucción que se ha de ejecutar una vez salga de la funciónrecursiva. Así, se crea un marco de referencia en el que la funciónse ejecuta únicamente durante una invocación.

Ahora bien, como la función será invocada un número indetermi-nado de veces (depende del valor de los parámetros) y por cadainvocación se creará un marco de activación, el compilador deberáasignar una región de la memoria para la creación de la pila demarcos. A este espacio se hace referencia mediante un registrollamado apuntador de marco, de modo que mientras se ejecuta unainvocación de la función, se conoce dónde están almacenadas lasvariables locales, los parámetros de entrada y el valor devuelto.

Una ejecución a mano que muestra los estados de los marcos deactivación se denomina rastreo de activación (Baase, 2002) ypermite analizar el tiempo de ejecución de la función y comprendercomo funciona realmente la recursividad en el computador.

Cada invocación activa tiene un marco de activación único. Unainvocación de función está activa desde el momento en que seentra en ella hasta que se sale, después de haber resuelto elproblema que se le paso como parámetro. Todas las activacionesde la función recursiva que están activas simultáneamente tienenmarcos de activación distintos. Cuando se sale de una invocaciónde función su marco de activación se libera automáticamente paraque otras invocaciones puedan hacer uso de ese espacio y laejecución se reanuda en el punto donde se hizo la invocación de lafunción.

Para ilustrar mejor estas ideas, en la figura 127 se presenta elrastreo de activación para la función factorial.

Page 359: Disenio Algoritmos

8. Recursividad

359

Figura 127. Rastreo de activación para la función factorial

ProgPrincipal

Numero: 4Valfact:

ProgPrincipal

Numero: 4Valfact:

Factorial (4)

n: 4fact:

ProgPrincipal

Numero: 4Valfact:

Factorial (4)

n: 4fact:

Factorial (3)

n: 3fact:

ProgPrincipal

Numero: 4Valfact:

Factorial (4)

n: 4fact:

Factorial (3)

n: 3fact:

Factorial (2)

n: 2fact:

Marco deactivaciónprogprincipal()

Marco deactivaciónprimerainvocación

Marco deactivaciónsegundainvocación

Marco deactivacióntercerainvocación

Page 360: Disenio Algoritmos

Diseño de algoritmos

360

Figura 127. (Continuación)

Marco de activación en la cuartainvocación a factorial()

Factorial (1)

n: 1fact:

Factorial (2)

n: 2fact:

Factorial (3)

n: 3fact:

Factorial (4)

n: 4fact:

ProgPrincipal

Numero: 4Valfact:

Marco de activación en la cuartainvocación a factorial()

Factorial (0)

n: 0fact:

Factorial (1)

n: 1Valfact:

Factorial (2)

n: 2fact:

Factorial (3)

n: 3fact:

Factorial (4)

n: 4fact:

ProgPrincipal

Numero: 4Valfact:

Page 361: Disenio Algoritmos

8. Recursividad

361

Una vez que la función ha encontrado el criterio base, es decir,un caso con solución no recursiva, éste marco devuelve a quien loinvocó el valor determinado para dicho criterio y libera el espacioocupado; en este caso, el último marco retorna 1 para el marcoanterior y desaparece. Y continúa un proceso regresivo en que cadamarco de activación desarrolla sus operaciones utilizando el valordevuelto por la función recursiva invocada y retorna el valorobtenido al marco que lo invocó.

8.4 ENVOLTURAS PARA FUNCIONES RECURSIVAS

Es común que las funciones recursivas se concentren en labúsqueda de un valor o en el desarrollo de una tarea concreta,como calcular el factorial, invertir una cadena, encontrar un valor enuna estructura de datos u ordenar una lista y no se ocupen de otrastareas que no requieren ser recursivas como leer el dato a buscar,comprobar la validez de un argumento o imprimir los resultados.

Es decir, cuando se programa utilizando recursividad se encon-trará que hay algunas tareas que no requieren un tratamientorecursivo y que pueden estar antes o después de la ejecución de lafunción recursiva. Para manejar estas tareas se definen programas,procedimientos o funciones envoltura.

Se denomina envoltura a los procedimientos no recursivos quese ejecutan antes o después de la invocación de una funciónrecursiva y que se encargan de preparar los parámetros de lafunción y de procesar los resultados (Baase, 2002).

En el ejemplo del factorial se utiliza como envoltura un algoritmoque se encarga de leer el número que se utiliza como argumento dela función, invocar la función y mostrar el resultado. El seudocódigose presenta en el cuadro 136.

Page 362: Disenio Algoritmos

Diseño de algoritmos

362

Cuadro 136. Pseudocódigo del programa principal para calcular el factorial

1. Inicio2. Entero: num3. Leer num4. Imprimir “factorial de”, num, “ = “, factorial(num)5. Fin algoritmo

8.5 TIPOS DE RECURSIVIDAD

La recursividad puede presentarse de diferentes maneras ydependiendo de ellas se han establecido al menos cuatro tiposdiferentes de implementaciones recursivas.

Recursividad simple: se presenta cuando una función incluye unllamado a sí misma con un argumento diferente. Ejemplo de estetipo de recursividad es la función factorial().

Este tipo de recursividad se caracteriza porque puede pasarsefácilmente a una solución iterativa.

Recursividad múltiple: el cuerpo de una función incluye más deuna llamado a la misma función, por ejemplo, la función paracalcular un valor de la serie Fibonacci (esta función se explica en lasección 8.7).

Recursividad anidada: se dice que una función recursiva esanidada cuando entre los parámetros que se pasan a la función seincluye una invocación a la misma. Un ejemplo de recursividadanidada es la solución al problema de Ackerman*.

* Wilhelm Ackerman (29 de marzo 1896 - 24 de diciembre 1962) matemáticoalemán, concibió la función doblemente recursiva que lleva su nombre como unejemplo de la teoría computacional y demostró que no es primitiva recursiva.

Page 363: Disenio Algoritmos

8. Recursividad

363

Recursividad cruzada o indirecta: en este tipo de recursividad,el cuerpo de la función no contiene un llamado a sí misma, sino aotra función; pero, la segunda incluye un llamado a la primera.Puede ser que participen más de dos funciones. Este tipo deimplementaciones también se conoce como cadenas recursivas.Como ejemplo de este tipo de recursividad se tiene la función paravalidar una expresión matemática.

8.6 EFICIENCIA DE LA RECURSIVIDAD

En general, una versión iterativa se ejecutará con más eficienciaen términos de tiempo y espacio que una versión recursiva. Esto sedebe a que, en la versión iterativa, se evita la información generalimplícita al entrar y salir de una función. En la versión recursiva,con frecuencia, es necesario apilar y desapilar variables anónimasen cada campo de activación. Esto no es necesario en el caso deuna implementación iterativa donde los resultados se vanreemplazando en los mismos espacios de memoria.

Por otra parte, la recursividad es la forma más natural desolucionar algunos tipos de problemas, como es el caso de:ordenamiento rápido (QuickSort), las torres de Hanoy, las ochoreinas, la conversión de prefijo a posfijo o el recorrido de árboles,que aunque pueden implementarse soluciones iterativas, lasolución recursiva surge directamente de la definición del problema.

El optar por métodos recursivos o iterativos es, más bien, unconflicto entre la eficiencia de la máquina y la eficiencia delprogramador (Langsam, 1997). Considerando que el costo de laprogramación tiende a aumentar y el costo de computación adisminuir, no vale la pena que un programador invierta tiempo yesfuerzo desarrollando una complicada solución iterativa para unproblema que tiene una solución recursiva sencilla, como tampocovale la pena implementar soluciones recursivas para problemas quepueden solucionarse fácilmente de manera iterativa. Muchos de los

Page 364: Disenio Algoritmos

Diseño de algoritmos

364

ejemplos de soluciones recursivas de este capítulo se presentancon fines didácticos más no por su eficiencia.

Conviene tener presente que la demanda de tiempo y espacioextra, en las soluciones recursivas, proviene principalmente de lacreación de los espacios de activación de las funciones y delapilamiento de resultados parciales, de manera que éstas puedenoptimizarse reduciendo el uso de variables locales. A la vez que lassoluciones iterativas que utilizan pilas pueden requerir tanto tiempoy espacio como las recursivas.

8.7 EJEMPLOS DE SOLUCIONES RECURSIVAS

Ejemplo 74. Sumatoria recursiva

Diseñar una función recursiva para calcular la sumatoria de losprimeros n números enteros positivos, de la forma:

1 + 2 + 3 + 4 + 5 + 6 + … + (n-1) + n

Se define la función f(n) donde n puede ser cualquier númeromayor o igual a 1 (n >= 1).

Se conoce que al sumar 0 a cualquier número éste se mantiene.De ahí se desprende que la sumatoria de cero es cero. Paracualquier otro entero positivo, la sumatoria se calcula adicionandosu propio valor a la sumatoria del número inmediatamente inferior.Así:

f(0) = 0f(1) = 1 + f(0)f(2) = 2 + f(1)f(3) = 3 + f(2)f(4) = 4 + f(3)f(n) = n + f(n-1)

Page 365: Disenio Algoritmos

8. Recursividad

365

De esto se desprende que

a. Si n = 0 f(n) =0b. Si n > 0 f(n) = n + f(n-1)

De esta manera se plantea una solución recursiva donde arepresenta el criterio base y b la invocación recursiva de la función.

El pseudocódigo de la función sumatoria se presenta en elcuadro 137.

Cuadro 137. Función recursiva para calcular la sumatoria de un número

1. Entero sumatoria(entero n)2. Si n = 0 entonces3. Retornar 04. Si no5. Retornar (n + sumatoria(n – 1))6. Fin si7. Fin sumatoria

Ejemplo 75. Potenciación recursiva

Se define como cálculo de una potencia a la solución de unaoperación de la forma xn, donde x es un número entero o real quese conoce como base y n es un entero no negativo conocido comoexponente.

f(n) =

0 Si n = 0

n + f(n-1) Si n > 0

Page 366: Disenio Algoritmos

Diseño de algoritmos

366

La potencia xn es el producto de n veces x, de la forma:

xn = x * x * x * … * x (n veces x)

Por las propiedades de la potenciación se tiene que cualquiernúmero elevado a 0 da como resultado 1 y que cualquier númeroelevado a 1 es el mismo número.

x0 = 1x1 = x

Para este ejercicio se extiende la primera propiedad, también,para el caso de x = 0. Aunque normalmente se dice que esteresultado no está definido, para explicar recursividad esto esirrelevante.

Para proponer una solución recursiva es necesario considerar lapotencia xn en función de una expresión más cercana a la identidad:x0 = 1.

Se propone el siguiente ejemplo:

20 = 121 = 2 21 = 2 * 20 = 222 = 4 22 = 2 * 21 = 2 * 2 = 423 = 8 23 = 2 * 22 = 2 * 4 = 824 = 16 24 = 2 * 23 = 2 * 8 = 1625 = 32 25 = 2 * 24 = 2 * 16 = 32

Como se aprecia en la columna de la derecha, cada potenciapuede plantearse utilizando la solución de la potencia anterior, conexponente menor.

En consecuencia:

a. Si n = 0 xn = 1b. Si n > 0 xn = x * xn-1

Page 367: Disenio Algoritmos

8. Recursividad

367

Donde a es el criterio base y b es la invocación recursiva.

En el cuadro 138 se presenta el pseudocódigo para calcularrecursivamente cualquier potencia de cualquier número.

Cuadro 138. Función recursiva para calcular una potencia1. Entero potencia(entero x, entero n)2. Si(n = 0)3. Retornar 14. Si no5. Retornar (x * potencia(x, n-1))6. Fin si7. Fin potencia

En las líneas 2 y 3 se soluciona el problema cuando se presentael criterio base, en caso contrario, se debe hacer una invocaciónrecursiva de la función, según las líneas 4 y 5.

Ejemplo 76. Serie Fibonacci

La serie Fibonacci tiene muchas aplicaciones en ciencias de lacomputación, en matemáticas y en teoría de juegos. Fue publicadapor primera vez en 1202 por un matemático italiano del mismonombre, en su libro titulado Liberabaci (Brassard, 1997).

Fibonacci planteó el problema de la siguiente manera:supóngase que una pareja de conejos produce dos descendientescada mes y cada nuevo ejemplar comienza su reproduccióndespués de dos meses. De manera que al comprar una pareja deconejos, en los meses uno y dos se tendrá una pareja, pero al tercermes se habrán reproducido y se contará con dos parejas, en el mescuatro solo se reproduce la primera pareja, así que el númeroaumentará a tres parejas; en el mes cinco, comienza lareproducción de la segunda pareja, con lo cual se obtendrán cincoparejas, y así sucesivamente.

Page 368: Disenio Algoritmos

Diseño de algoritmos

368

Si ningún ejemplar muere, el número de conejos que se tendráncada mes está dado por la sucesión: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,…, que corresponde a la relación que se muestra en el cuadro 139:

Cuadro 139. Términos de la serie Fibonacci

Mes (n) 0 1 2 3 4 5 6 7 8 9 …Pares de

conejos f(n) 0 1 1 2 3 5 8 13 21 34 …

Cuya representación formal es:

a. f(0) = 0b. f(1) = 1c. f(n) = f(n-1) + f(n-2)

Es decir, en el mes 0 aun no se tiene ningún par de conejos, enel mes uno se adquiere la primera pareja, en el mes dos semantiene la misma pareja comprada, porque aun no comienzan areproducirse. Pero a partir del mes tres hay que calcular la cantidadde parejas que se tienen considerando la condición de que cadapar genera un nuevo par cada mes, pero solo comienza areproducirse después de dos meses.

De esta manera, el problema está resuelto para el mes cero ypara el mes uno, estos se toman como criterio base (a, b) y a partirdel segundo mes se debe tener en cuenta los meses anteriores.Esto genera una invocación recursiva de la forma:

f(n) = f(n-1) + f(n-2) para n >= 2.

En el pseudocódigo que se presenta en el cuadro 140 se apreciaque cada activación tiene definidos dos criterios bases (líneas 2) y,si aun no se ha llegado a estos, en cada marco de activación segeneran dos nuevas invocaciones recursivas (línea 5). En la figura128 se presenta el árbol que se forma al calcular el valor de la seriepara el número 4.

Page 369: Disenio Algoritmos

8. Recursividad

369

Cuadro 140. Función recursiva para calcular el n-ésimo terminode la serie Fibonacci

1. Entero Fibonacci(Entero n)2. Si (n = 0) o (n = 1) entonces3. Retornar n4. Si no5. Retornar (Fibonacci(n – 1) + Fibonacci(n – 2))6. Fin si7. Fin Fibonacci

Figura 128. Marcos de activación de la serie Fibonacci

Ejemplo 77. Máximo común divisor

El Máximo Común Divisor (MCD) entre dos o más números es elmayor de los divisores comunes. Se conocen dos métodos paraencontrar el MCD entre dos números: el primero consiste endescomponer cada número en sus factores primos, escribir losnúmeros en forma de potencia y luego tomar los factores comunescon menor exponente y el producto de estos será el MCD; elsegundo, es la búsqueda recursiva en la que se verifica si elsegundo número es divisor del primero, en cuyo caso será el MCD,

Fibonacci(4)

Fibonacci(3) Fibonacci(2)

Fibonacci(2) Fibonacci(1) Fibonacci(1) Fibonacci(0)

Fibonacci(1) Fibonacci(0)

Page 370: Disenio Algoritmos

Diseño de algoritmos

370

si no lo es se divide el segundo número sobre el módulo del primerosobre el segundo y así sucesivamente con un número cada vez máspequeño que tiende a 1 como el divisor común a todos losnúmeros. Este último se conoce como algoritmo de Euclides.

Por ejemplo, si se desea encontrar el MCD de 24 y 18, aplicandoel algoritmo de Euclides, se divide el primero sobre el segundo(24/18= 1, residuo = 6), si la división es exacta se tiene que el MCDes el segundo número, pero si no lo es, como en este caso, sevuelve a buscar el MCD entre el segundo número (18) y el módulode la división (6) y de esa manera hasta que se lo encuentre. Si losdos números son primos se llegará hasta 1.

Si f(a,b) es la función que devuelve el Máximo Común Divisor dea y b, entonces se tiene que:

c = a mod b

a. Si c = 0 f(a,b) = bb. Si c > 0 f(a,b) = f(b,c)

La función recursiva para calcular el MCD de dos númerosaplicando el algoritmo de Euclides se presenta en el cuadro 141.

Cuadro 141. Función recursiva para calcular el MCD

1. Entero mcd(Entero a, Entero b)2. Entero c3. c = a Mod b4. Si c = 0 entonces5. Retornar b6. Si no7. Retornar mcd(b, c)8. Fin si9. Fin mcd

Page 371: Disenio Algoritmos

8. Recursividad

371

Ejemplo 78. Algoritmo de ordenamiento rápido recursivo

Este algoritmo recursivo de ordenamiento de vectores o listas sebasa en el principio dividir para vencer, que aplicado al caso setraduce en que es más fácil ordenar dos vectores pequeños queuno grande. Se trata de tomar un elemento del vector comoreferencia, a éste se le llama pivote, y dividir el vector en tres partes:los elementos menores al pivote, el pivote y los elementos mayoresal pivote.

Para particionar el vector se declara dos índices y se hacen dosrecorridos, uno desde el primer elemento hacia adelante y otrodesde el último elemento hacia atrás. El primer índice se muevehasta encontrar un elemento mayor al pivote, mientas que elsegundo índice se mueve hasta encontrar un elemento menor alpivote, cuando los dos índices se han detenido se hace elintercambio y se continúa los recorridos. Cuando los dos índices secruzan se suspende el particionamiento. Como ejemplo,considérese el vector de la figura 112 y aplíquesele las instruc-ciones del cuadro 142.

Figura 129. Recorridos para particionar un vector

1 2 3 4 513 15 12 8 17 3 7 22 11 20v

6 7 8 9 10

m= 1, 2, …

13

pivote

.., 9, 10, 11 = n

Page 372: Disenio Algoritmos

Diseño de algoritmos

372

Cuadro 142. Recorridos para particionar un vector

1 Entero m = 1, n = 11, pivote = v[1]

2 Mientras m <= n hacer

3 Hacer

4 m = m + 1

5 Mientras v[m] < pivote

6 Hacer

7 n = n – 1

8 Mientras v[n] > pivote

9 Si m < n entonces

10 aux = v[m]

11 v[m] = v[n]

12 v[n] = aux

13 Fin si

14 Fin mientras

Después de ejecutar las instrucciones del cuadro 142 el vectorquedaría como se muestra en la figura 130.

Figura 130. Recorridos para particionar un vector

Después de pasar los datos mayores al pivote al lado derecho ylos menores al lado izquierdo se intercambia el pivote con el dato

1 2 3 4 513 11 12 8 7 3 17 22 15 20v

6 7 8 9 10

m

13

pivote

n

Page 373: Disenio Algoritmos

8. Recursividad

373

indicado por el índice que recorre el vector de derecha a izquierda(n), como lo muestran las flechas en la figura 130. Después dedicho intercambio, los elementos quedan en el orden que semuestra en la figura 131.

Figura 131. Orden del vector después de la primera partición

Aunque las divisiones son puramente formales, ahora se tienentres sublistas:

lista-izquierda = {3, 11, 12, 8, 7}lista-centro = {13}lista-derecha = {17, 22, 15, 20}

Como se aprecia en las sublistas, los datos se han movido de unlado del pivote al otro, pero no están ordenados. Por ello, elsiguiente paso en el algoritmo Quicksort consiste en tomar cadauna de las sublistas y realizar el mismo proceso, y continuarhaciendo particiones de las sublistas que se generan hasta reducirsu tamaño a un elemento.

En el cuadro 143 se presenta la función recursiva Quicksort conel algoritmo completo para ordenar un vector aplicando éstemétodo.

1 2 3 4 513 11 12 8 7 3 17 22 15 20v

6 7 8 9 10

Sublista izquierda Sublistacentro

Sublista derecha

Page 374: Disenio Algoritmos

Diseño de algoritmos

374

Cuadro 143. Función recursiva Quicksort

1 Entero[] Quicksort(entero v[], entero inf, entero sup)2 Entero: aux, pivote = v[inf], m = inf, n = sup+1

3 Mientras m <= n hacer

4 Hacer

5 m = m + 1

6 Mientras v[m] < pivote

7 Hacer

8 n = n – 1

9 Mientras v[n] > pivote

10 Si m < n entonces

11 Aux = v[m]

12 v[m] = v[n]

13 v[n] = aux

14 Fin si

15 Fin mientras

16 v[inf] = v[n]

17 v[n] = pivote

18 Si inf < sup entonces

19 v[] = Quicksort(v[], inf, n-1)

20 v[] = Quicksort(v[], n+1,sup)

21 Fin si

22 Retornar v[]

23 Fin Quicksort

La función Quicksort recibe un vector de enteros, en esteejemplo, y dos valores: inf y sup, correspondientes a las posicionesque delimitan el conjunto de elementos a ordenar. La primerainvocación a la función se hará con todo el vector, enviando comoparámetros el índice del primero y del último elemento (1 y n), peroen las que siguen el número de elementos se reducensignificativamente en cada llamada, pues corresponde a las sub-listas que se generan en cada partición.

Page 375: Disenio Algoritmos

8. Recursividad

375

En esta versión de la función se toma como pivote el primerelemento, pero esto no necesariamente tiene que ser así, se puedediseñar una función para buscar un elemento con un valorintermedio que permita una partición equilibrada de la lista.

8.8 EJERCICIOS PROPUESTOS

Diseñar las soluciones recursivas para las necesidades que seplantean a continuación

1. Mostrar los números de 1 a n

2. Generar la tabla de multiplicar de un número

3. Sumar los divisores de un número

4. Determinar si un número es perfecto

5. Calcular el producto de dos números sin utilizar el operador *,teniendo en cuenta que una multiplicación consiste en sumarel multiplicando tantas veces como indica el multiplicador.

6. Calcular el Mínimo Común Múltiplo (MCM) de dos números.

7. Convertir un número decimal a binario

8. Convertir un número binario a decimal

9. Determinar si una cadena es palíndromo

10. Mostrar los primeros n términos de la serie Fibonacci

11. Invertir el orden de los dígitos que conforman un número

12. Determinar si un número es primo.

Page 376: Disenio Algoritmos

376

9. EL CUBO DE RUBIK

Si es que dormido estoy,o estoy despiertosi un muerto soy

que sueña que está vivoo un vivo soy

que sueña que está muerto.Nuestros sueños se cumplen

siempre que tengamos paciencia…W. Stekel

El cubo de Rubik o cubo mágico, como se lo llama comúnmente,es un rompecabezas mecánico diseñado por el arquitecto y escultorhúngaro Ernö Rubik y patentado en 1975 en Hungría. Inicialmente,se utilizó este juego como instrumento didáctico en algunasescuelas de Hungría, se consideraba que por la atención y elesfuerzo mental que requiere para armarlo era un buen ejerciciopara la mente.

Desde los primeros años de difusión de este objeto, losjugadores han medido sus habilidades para armarlo en el menortiempo. En 1982 se celebró el primer campeonato mundial enBudapest.

En el año 1976 se patentó en Japón un invento similar al cubode Rubik, su autor fue el ingeniero Teruthos Ishige.

Page 377: Disenio Algoritmos

9. El cubo de Rubik

377

9.1 DESCRIPCIÓN DEL CUBO

Es un rompecabezas formado por 26 piezas que se muevensobre un dispositivo mecánico ubicado en el centro del cubo, ocultoa la vista del usuario, como se observa en la figura 132.

Se han producido muchas versiones del cubo de Rubik utilizandonúmeros, letras, figuras y colores. La más difundida es la de losseis colores, uno para cada cara. El juego consiste en ordenar laspiezas de tal manera que el cubo tenga un solo color en cada cara.

Figura 132. Cubo de Rubik

Aparentemente cada una de las 26 piezas que forman el cuboes, también, un pequeño cubo; sin embargo no lo son, se tienentres tipos diferentes: centro, aristas y vértice (esquina), como semuestran en la figura 133.

Figura 133. Piezas que forman el cubo de Rubik

a. Piezas centrales b. Arista c. Vértice o esquina

Page 378: Disenio Algoritmos

Diseño de algoritmos

378

Los centros tienen solo una cara y el color de esta pieza es elpunto de referencia para ordenar el cubo, estas piezas están fijas aldispositivo interno y por tanto no cambian de posición; las aristastienen dos caras con diferente color y los vértices tienen tres.

El posicionamiento de las piezas se logra mediante sucesivosgiros de los módulos que conforman el cubo. Para efecto defacilitar la compresión de los movimientos necesarios para armar elcubo, en este documento se proponen los módulos de la figura 134.

Figura 134. Módulos del cubo de Rubick

a. Módulo superior b. Módulo central c. Módulo inferior

d. Módulo izquierdo e. Módulo derecho

g. Módulo frontal h. Módulo posterior

Page 379: Disenio Algoritmos

9. El cubo de Rubik

379

9.2 SOLUCION ALGORÍTMICA

La solución que se propone aquí consiste en armar el cubo en elsiguiente orden.

1. Armar módulo superior2. Armar módulo central3. Armar módulo inferior

En el módulo superior y en el inferior es necesario ubicar yordenar tanto las aristas como los vértices, mientras que en elcentral sólo se tienen que ordenar aristas. La principal dificultadradica en que en cada paso se debe cuidar de no deshacer lo quese ha hecho en los anteriores. Más adelante, en este mismocapítulo, se presentan algoritmos detallados para lograr estepropósito, todo lo que se requiere es atención, paciencia yperseverancia en la aplicación de los mismos.

9.3.1 Consideraciones preliminares

Antes de presentar las secuencias que permiten armar el cuboes necesario especificar cómo deben efectuarse los movimientos ylos nombres que se utiliza para describirlos.

Cada módulo puede efectuar dos tipos de movimientos: losmódulos derecho e izquierdo puede girar hacia adelante o haciaatrás; los módulos superior, inferior, frontal y posterior pueden girarhacia la derecha o hacia la izquierda, como se indica en los cubosde la figura 135. El módulo central no gira, a menos que se giretodo el cubo, en cuyo caso no cambiarán de posición las piezas.

Page 380: Disenio Algoritmos

Diseño de algoritmos

380

Figura 135. Movimientos de los módulos del cubo de Rubick

a. Módulo izquierdo,giro hacia adelante

b. Módulo derecho,giro hacia adelante

c. Módulo superior,giro hacia la derecha

d. Módulo inferior,giro hacia la derecha

e. Módulo frontal, girohacia la derecha

f. Módulo posterior,giro hacia la derecha

Page 381: Disenio Algoritmos

9. El cubo de Rubik

381

Cada giro que se indique debe efectuarse de 90 grados; es decir,que una esquina pasa a ocupar la posición de la siguiente en elorden que corresponda según el tipo de giro. Cuando se requierahacer un giro de 180 grados se escribirá dos veces.

El algoritmo para armar el cubo se presenta de forma modular;es decir que está conformado por varios procedimientos que sonllamados en el momento que se necesitan. Esto facilita lacomprensión de las secuencias, ya que cada una cambia deposición una o dos piezas.

En la solución que se presenta se utilizan las secuencias másfáciles de comprender y de aplicar, no las más cortas, esto para queel lector no se desanime. Cuando haya adquirido confianza en laejecución del algoritmo y haya aprendido cómo cambian de posiciónlas piezas, podrá introducir algunos cambios para armar el cubo conun número menor de movimientos.

Para armar el cubo es necesario desarrollar una combinación degiros de los diferentes módulos que lo conforman. Cada giro seindica citando el nombre del módulo, seguido del tipo de giro arealizar. Ejemplo:

Superior derecha: indica que el módulo superior debe girarsehacia la derecha.

Derecho adelante: significa que se debe girar el móduloderecho hacia adelante.

9.3.2 Algoritmo principal para armar el cubo de Rubik

Como se ha mencionado en páginas anteriores, el cubo de Rubikes un rompecabezas, así que armarlo no es más que un juego, unentretenimiento; no obstante, dado el número de piezas y lacantidad de combinaciones de movimientos que se puedengenerar, aprender a armarlo por el método de prueba y error puedetomar bastante tiempo y muchas personas podrían desanimarse al

Page 382: Disenio Algoritmos

Diseño de algoritmos

382

ver que cada vez que intentan poner en orden una pieza sedesordenan las que había ordenado previamente.

Para facilitar esta actividad se presentan, en forma algorítmica,las secuencias de movimientos necesarios para armarlo. Como lalista es extensa se opta por aplicar la estrategia dividir para vencer yse diseñan procedimientos para armar cada parte del cubo. Elalgoritmo principal se presenta en el cuadro 144.

Cuadro 144. Algoritmo principal cubo de Rubik

1. Inicio2. Seleccionar y posicionar el centro de referencia3. Armar el módulo superior4. Armar el módulo central5. Armar el módulo inferior6. Fin algoritmo

Cada uno de los pasos de este algoritmo se explica y se refinan enlo que sigue de este capítulo.

9.3.3 Seleccionar y posicionar un centro de referencia

Para proceder a armar el cubo lo primero que se hace esseleccionar un color de referencia para evitar confundirse cuando elcubo gira y cambia de posición. Dado que las piezas del centro nocambian de posición, son éstas las que determinan el color de cadauna de las caras y una de ellas servirá de referencia durante todo elproceso.

Siguiendo esta lógica, lo primero que se debe hacer es escogeruno de los seis colores y ubicar hacia arriba la cara que tiene dichocolor en el centro. De esta manera, ya está definido cuál es elmódulo superior para proceder a ordenar sus piezas en el siguientepaso.

Page 383: Disenio Algoritmos

9. El cubo de Rubik

383

Por ejemplo, si se toma como color de referencia el blanco, secomienza a armar el módulo que tiene en el centro la pieza de estecolor y se ubica hacia arriba. Cada vez que se ejecute alguno de lossub-algoritmos para armar cualquier módulo, la pieza central decolor blanco debe estar hacia arriba.

El centro de referencia se mantiene durante todo el proceso dearmar el cubo, pero antes de iniciar cualquier procedimiento esimportante prestar atención al color del centro frontal para nocambiar de posición el cubo por error.

9.3.4 Armar el módulo superior

Este módulo se arma en dos fases: primero se ordenan lasaristas haciendo uso del procedimiento ordenar_arista_superior(),luego se ordenan los vértices, para ello se invoca el procedimientoordenar_vértice_superior(). El procedimiento principal se presentaen el cuadro 145.

Cuadro 145. Procedimiento para armar el módulo superior

1. Armar_módulo_superior()2. Entero: arista, vértice3. // ciclo para ordenar las aristas del módulo superior4. Para arista = 1 hasta 4 hacer5. Si arista no está ordenada entonces6. Ordenar_arista_superior()7. Fin si8. Girar cubo hacia la izquierda9. Fin para10. // ciclo para ordenar los vértices del módulo superior11. Para vértice = 1 hasta 4 hacer12. Si vértice no está ordenado entonces13. Ordenar_vértice_superior()14. Fin si

Page 384: Disenio Algoritmos

Diseño de algoritmos

384

Cuadro 145. (Continuación)

15. Girar cubo hacia la izquierda16. Fin para17. Fin Armar_módulo_superior

En este procedimiento, mediante un ciclo, se examina cada unade las aristas del cubo, si ésta está ordena se pasa a la siguiente,pero si no lo está se invoca al procedimiento diseñado para ordenararistas superiores. Luego se realiza la misma operación con losvértices.

Una arista está ordenada si el color de cada una de sus caras esel mismo color de la pieza central del cubo en la caracorrespondiente. Por ejemplo, si el color de la pieza del centro en lacara superior es blanco y el color de la pieza central en la carafrontal es rojo, la arista superior frontal estará ordena si el colorsuperior es blanco y el frontal es rojo, en caso contrario no estáordenada y será necesario invocar al procedimiento Ordenar_arista_superior(). Un vértice está ordenado si cada una de sus carascorresponde con el color de la pieza central en la cara respectiva,en caso contrario es necesario invocar el procedimiento Ordenar_véritice_superior().

Ordenar las aristas del módulo superior

En esta fase del proceso se colocan las aristas del módulosuperior de tal manera que los colores de cada una correspondancon el color del centro superior o color de referencia y con el colordel centro de cada una de las caras del cubo según la posición queocupan.

El procedimiento Ordenar_arista_superior(), que se presenta enel cuadro 146, está diseñado para colocar la pieza correcta en laposición frontal-superior, para ello se realizan tres operacionesfundamentales:

Page 385: Disenio Algoritmos

9. El cubo de Rubik

385

1. Encontrar la arista cuyos colores correspondan al centrosuperior y al centro frontal;

2. Mover la arista de su posición actual a la posición frontal-inferior sin importar la orientación.

3. Llevar la arista desde la posición frontal-inferior a la frontal-superior y orientarla.

Cuadro 146. Procedimiento para ordenar aristas superiores

1. Ordenar_arista_superior()2. Identificar posición actual de la arista a ordenar3. // mover arista a la posición frontal inferior4. Según sea posición actual hacer5. Posición actual = Modulo posterior: arista superior6. Posterior derecha7. Posterior derecha8. Inferior derecha9. Inferior derecha10. Posición actual = Módulo derecho: arista posterior11. Derecho adelante12. Inferior izquierda13. Derecho atrás14. Posición actual = Módulo derecho: arista superior15. Derecho adelante16. Derecho adelante17. Inferior izquierda18. Posición actual = Módulo derecho: arista frontal19. Frontal derecha20. Posición actual = Módulo izquierdo: arista posterior21. Izquierdo adelante22. Inferior derecha23. Izquierdo atrás24. Posición actual = Módulo izquierdo: arista superior25. Izquierdo adelante

Page 386: Disenio Algoritmos

Diseño de algoritmos

386

Cuadro 146. (Continuación)

26. Izquierdo adelante27. Inferior derecha28. Posición actual = Módulo izquierdo: arista frontal29. Frontal izquierda30. Posición actual = Módulo Frontal: arista superior31. Frontal derecha32. Frontal derecha33. Posición actual = Módulo inferior: arista posterior34. Inferior izquierda35. Inferior izquierda36. Posición actual = Módulo inferior: arista derecha37. Inferior izquierda38. Posición actual = Módulo inferior: arista izquierda39. Inferior derecha40. Fin según sea

41. // pasar la pieza de la posición frontal-inferior a la frontal-superior

42. Si color_frontal de arista frontal-inferior = color de referenciaentonces

43. Inferior derecha44. Derecho adelante45. Frontal izquierda46. Derecho atrás47. Si no48. Frontal izquierda49. Frontal izquierda50. Fin si51. Fin ordenar_arista_superiores

La ejecución de este procedimiento ordena la arista superior-frontal, para ordenar todas las aristas del módulo superior es

Page 387: Disenio Algoritmos

9. El cubo de Rubik

387

necesario ejecutarlo cuatro veces, como se especifica en elprocedimiento Armar_módulo_superior().

Después de ordenar las aristas superiores el cubo estará como semuestra en la figura 136, en la que se presenta con color grisoscuro la parte del cubo que ya está ordenada.

Figura 136. Módulo superior con aristas superiores ordenadas

Ordenar los vértices del módulo superior

Los vértices (piezas de las esquinas) están formadas por trescolores correspondientes a los colores de las tres caras queconvergen en ellos. Si por cada lado el color del vértice es el mismode la pieza central de la cara, entonces, el vértice está en laposición correcta, en caso contrario se lo debe desplazar hasta elvértice que le corresponde y orientarlo según los colores de lascaras.

Los movimientos indicados en el procedimiento Ordenar_vér-tice_superior(), que se presenta en el cuadro 147, permiten ordenarel vértice frontal–superior–derecho. Para ello se requieren tresacciones:

1. Identificar la posición actual del vértice que se pretendeordenar;

Page 388: Disenio Algoritmos

Diseño de algoritmos

388

2. Mover la pieza hasta la posición frontal–inferior–derecha.Para este paso se utiliza una estructura de decisión múltipleque incluye una secuencia de movimientos para cada una delas siete alternativas;

3. Mover la pieza desde la esquina frontal-inferior–derechahasta la posición frontal–superior –derecha, en este paso sepresentan tres posibilidades según la orientación del vértice,éstas se evalúan mediante decisiones anidadas.

Cuadro 147. Procedimiento para ordenar los vértices superiores

1. Ordenar_vértice_superior()2. Identificar posición_actual del vértice3. // mover pieza a la posición inferior-frontal-derecha4. Según sea posición_actual hacer5. Posición_actual = módulo superior: vértice posterior-derecho6. Derecho adelante7. Inferior izquierda8. Inferior izquierda9. Derecho atrás10. Inferior derecha11. Posición_actual = módulo superior: vértice posterior-izquierdo12. Izquierdo adelante13. Inferior derecha14. Inferior derecha15. Izquierdo atrás16. Posición_actual = módulo superior: vértice frontal-derecho17. Derecho atrás18. Inferior izquierda19. Derecho adelante20. Inferior derecha21. Posición_actual = módulo superior: vértice frontal-izquierdo22. Izquierdo atrás23. Inferior derecha24. Izquierdo adelante

Page 389: Disenio Algoritmos

9. El cubo de Rubik

389

Cuadro 147. (Continuación)

25. Posición_actual = módulo inferior: vértice posterior-derecho26. Inferior izquierda27. Posición_actual = módulo inferior: vértice posterior-izquierdo28. Inferior derecha29. Inferior derecha30. Posición_actual = módulo inferior: vértice frontal-izquierdo31. Inferior derecha32. Fin según sea33. // mover y orientar pieza a la posición superior-frontal-derecha

34. Si color de referencia = color frontal del vértice inferior-derechoentonces

35. Inferior izquierda36. Derecho atrás37. Inferior derecha38. Derecho adelante39. Si no

40. Si color de referencia = color derecho del vértice inferior-derechoentonces

41. Inferior derecha42. Frontal derecha43. Inferior izquierda44. Frontal izquierda45. Si no46. Derecho atrás47. Inferior derecha48. Derecho adelante49. Frontal derecha50. Inferior derecha51. Inferior derecha52. Frontal izquierda53. Fin si54. Fin si55. Fin ordenar_vértice_superior

Page 390: Disenio Algoritmos

Diseño de algoritmos

390

Este procedimiento se ejecuta cuatro veces, según lo establecela estructura iterativa del procedimiento Armar_módulo_superior(),al cabo de las cuales el cubo contará con el primer móduloordenado, como se muestra en la figura 136.

Figura 136. Cubo ordenado el módulo superior

9.3.5 Armar el Módulo Central

Después de haber ordenado el módulo superior se procede aordenar las cuatro aristas del módulo central. Cabe anotar que denada serviría armar este módulo si alguna de las piezas del módulosuperior no está en el lugar y con la orientación que le corresponde.

Para ordenar el módulo central se observa la arista inferior delmódulo central y se determina si ésta corresponde a la posiciónderecha o izquierda del módulo central y se procede a moverla.También puede ocurrir que una arista esté en el módulo central,pero no en la posición y orientación correcta, en este caso se lapasa al módulo inferior para luego llevarla a la posición que lecorresponda en el módulo central.

El procedimiento del cuadro 148 define un ciclo para ordenar lascuatro aristas y dentro de éste un segundo ciclo para buscar en el

Page 391: Disenio Algoritmos

9. El cubo de Rubik

391

módulo inferior la arista que corresponde a la posición centralizquierda o central derecha de cada una de las caras.

Cuadro 148. Procedimiento para armar el módulo central

1. Armar_módulo_central()2. Entero: aristasordenadas, contador3. aristasordenadas = aristas ordenadas en el módulos central4. // ciclo para ordenar las aristas del módulo central5. Mientras aristasordenadas < 4 hacer6. contador = 17. Mientras contador <= 4 hacer8. Si color frontal de arista frontal-inferior = color centro-frontal

Y color inferior de arista frontal-inferior = color centro-derechoentonces

9. Ordenar_arista_central_derecha()10. Si no11. Si color frontal de arista frontal-inferior = color centro-frontal

Y color inferior de arista frontal-inferior = color centro-izquierdo entonces

12. Ordenar_arista_central_izquierda()13. Fin si14. Fin si15. Inferior izquierda16. contador = contador + 117. Fin mientras18. Si arista frontal-derecha NO está ordenada

Y color frontal de arista central-derecha != color centro-inferiorY color derecho de arista central-derecha != color centro-inferiorentonces

19. Mover_arista_central_derecha()20. Fin si21. Girar cubo hacia la izquierda22. Fin para23. Fin Armar_módulo_central

Page 392: Disenio Algoritmos

Diseño de algoritmos

392

Este procedimiento está diseñado para identificar la arista amover, ya sea del módulo inferior al central o del central al inferior,una vez localizada una pieza que debe ser movida invoca alprocedimiento Ordenar_arista_central_izquierda(), Ordenar_arista_central_derecha() o Mover_arista_central_derecha(), según corres-ponda a la posición y colores de la arista.

El procedimiento Ordenar_arista_central_derecha() se encarga demover la arista que ocupa posición inferior del módulo frontal a laposición derecha del mismo; o lo que es igual, mueve la aristadesde el módulo inferior al módulo central, como se muestra en lafigura 137, para ello es necesario que el color frontal de la aristacorresponda al color del centro frontal y la cara inferior de la aristasea del mismo color que el centro del módulo derecho. Esteprocedimiento se presenta en el cuadro 149.

Figura 137. Ordenar arista central derecha

El procedimiento Ordenar_arista_central_izquierda() que sepresenta en el cuadro 150 cumple una tarea similar al anterior, conla diferencia que mueve la arista inferior al lado izquierdo delmódulo frontal.

Page 393: Disenio Algoritmos

9. El cubo de Rubik

393

Cuadro 149. Procedimiento para ordenar la arista central derecha

1. Ordenar_arista_central_derecha()2. Inferior izquierda3. Derecho atrás4. Inferior derecha5. Derecho adelante6. Inferior derecha7. Frontal derecha8. Inferior izquierda9. Frontal izquierda10. Fin procedimiento

Cuadro 150. Procedimiento para ordenar la arista central izquierda

1. Ordenar_arista_central_izquierda()2. Inferior derecha3. Izquierdo atrás4. Inferior izquierda5. Izquierdo adelante6. Inferior izquierda7. Frontal izquierda8. Inferior derecha9. Frontal derecha10. Fin procedimiento

Los dos procedimientos anteriores se utilizan para mover unapieza desde el módulo inferior al central, pero en ocasiones lasaristas se encuentran en el módulo central, en posiciones que noles corresponden y es necesario pasarlas al módulo inferior, para locual se utiliza el procedimiento Mover_arista_central_derecha() quese presenta en el cuadro 151.

Page 394: Disenio Algoritmos

Diseño de algoritmos

394

Cuadro 151. Procedimiento para mover la arista central derecha

1. Mover_arista_central_derecha()2. Derecho: atrás3. Inferior: derecha4. Derecho: adelante5. Inferior: derecha6. Frontal: derecha7. Inferior: izquierda8. Frontal: izquierda9. Fin Mover_arista_central_derecha

Terminada esta fase, el cubo estará como se muestra en lafigura 138.

Figura 138. Cubo con los módulos superior y central ordenados

9.3.6 Armar el Módulo Inferior

El módulo inferior debe armarse cuidadosamente para nodesordenar los módulos superior y central. Para facilitar la

Page 395: Disenio Algoritmos

9. El cubo de Rubik

395

comprensión del procedimiento y para evitar que las secuencias demovimientos resulten excesivamente extensas, este módulo seordena en tres pasos:

1. Se posicionan los vértices inferiores2. Se orientan los vértices inferiores3. Se ordenan las aristas inferiores

Al comenzar esta fase debe haber dos vértices que estánposicionados aunque no necesariamente orientados, para ubicarlosse gira el módulo inferior, se observa los colores de las tres carasde la pieza y se comparan con los colores de los tres centros de lascaras que convergen en dicho vértice. Un vértice está posicionado sitiene los tres colores de las caras, pero sólo está orientado si elcolor del vértice y el del centro es el mismo en cada cara.

En el algoritmo del cuadro 152 se presenta el algoritmo paraarmar el módulo inferior. El primer ciclo se ejecutará hastaposicionar los cuatro vértices. Dentro de este está un segundo cicloanidado que tiene como propósito girar el módulo inferior hastaidentificar los dos vértices que ya están posicionados, una vez hansido encontradas se ejecuta un procedimiento para posicionar lasdos restantes. En cada ejecución del procedimiento los vérticescambian de posición, pero eso no garantiza que lleguen a laposición que les corresponde, por eso después de cada ejecuciónes necesario evaluar el estado del módulo y ejecutar nuevamente,tal como lo indica la estructura de repetición.

Cuadro 152. Procedimiento para armar el módulo inferior

1. Armar_Módulo_Inferior()2. Mientras vértices_posicionados < 4 hacer3. // se identifica las dos que ya están posicionadas4. Mientras vértices_posicionados < 2 hacer5. Inferior izquierda6. Fin mientras7. posicionar_vertices_inferiores()

Page 396: Disenio Algoritmos

Diseño de algoritmos

396

Cuadro 152. (Continuación)

8. Fin mientras9. // orientar vértices inferiores10. Mientras vértices_orientados < 4 hacer11. Orientar_Vértices_Inferiores()12. Fin mientras13. // Orientar aristas inferiores14. Mientras aristas_orientados < 4 hacer15. Ordenar_Aristas_Inferiores()16. Fin mientras17. Fin procedimiento

Después de posicionar los vértices se procede a orientarlos, estoes, a hacer que los colores de las caras del vértice y los del centrodel cubo correspondan, este procedimiento también se ejecutahasta que los cuatro vértices estén orientados. Finalmente, seposicionan y orientan las aristas del módulo inferior, para esto seincluye otro ciclo en el algoritmo.

Posicionar vértices inferiores

Al llegar a este punto ya ha identificado cuáles son los dosvértices que están posicionados. Éstos pueden estar adyacentes oen diagonal respecto a sí mismos, como se muestra en la figura139. Es importante tener en cuenta si están adyacentes o endiagonal, ya que en el segundo caso se requiere un movimientoadicional.

El procedimiento para posicionar los vértices inferiores sepresenta en el cuadro 153. Como se mencionó anteriormente, sidespués de ejecutarlo los cuatro vértices no están posicionados, sedebe identificar los dos que si lo están y ejecutar nuevamente elprocedimiento.

Page 397: Disenio Algoritmos

9. El cubo de Rubik

397

Figura 139. Posición de los vértices inferiores

Cuadro 153. Procedimiento para posicionar vértices inferiores

1. Posicionar_vértices_inferiores()2. Entero aux3. Si vértices_posicionados están seguidos entonces4. aux = 15. Colocar vértices posicionados en las posiciones Frontal-inferior

izquierda y frontal-inferior derecha6. Si no (si están en diagonal)7. aux = 28. Colocar vértices_posicionados en posiciones Frontal-inferior

derecha y posterior-inferior izquierda9. Fin si10. Derecho atrás11. Inferior izquierda12. Derecho adelante13. Frontal derecha14. Si aux = 1 entonces15. Inferior derecha16. Si no17. Inferior derecha18. Inferior derecha19. Fin si

9. El cubo de Rubik

397

Figura 139. Posición de los vértices inferiores

Cuadro 153. Procedimiento para posicionar vértices inferiores

1. Posicionar_vértices_inferiores()2. Entero aux3. Si vértices_posicionados están seguidos entonces4. aux = 15. Colocar vértices posicionados en las posiciones Frontal-inferior

izquierda y frontal-inferior derecha6. Si no (si están en diagonal)7. aux = 28. Colocar vértices_posicionados en posiciones Frontal-inferior

derecha y posterior-inferior izquierda9. Fin si10. Derecho atrás11. Inferior izquierda12. Derecho adelante13. Frontal derecha14. Si aux = 1 entonces15. Inferior derecha16. Si no17. Inferior derecha18. Inferior derecha19. Fin si

Page 398: Disenio Algoritmos

Diseño de algoritmos

398

Cuadro 153. (Continuación)

20. Frontal izquierda21. Derecho atrás22. Inferior derecha23. Derecho adelante24. Inferior derecha25. Fin algoritmo

Orientar los vértices inferiores

En el paso anterior se colocó las piezas esquineras en laposición que les corresponde según sus colores, pero no se lasorientó para que los colores de sus caras correspondan con el colorde cada una de las caras del cubo.

A estas alturas del proceso, al observar las esquinar inferioresdel cubo puede encontrarse alguno de estos casos:

1. Que ningún vértice esté orientado2. Que solo uno esté orientado3. Que dos estén orientados y en posiciones seguidas4. Que dos estén orientados y en diagonal

En cualquiera de los casos, el procedimiento que se presenta enel cuadro 154 se encarga de orientar las caras de los vértices. Enesta subrutina se presentan dos secuencias de movimientos: unapara situaciones en que ninguno o sólo uno de los vértices estéorientado y otra para cuando hay dos vértices orientados. Si hayvértices orientados se debe girar el cubo hasta que uno de losvértices orientados ocupe la posición inferior izquierda y si hay unsegundo, este debe estar en el módulo derecho. Si hay dos vérticesorientados, ya sea que estén seguidos o en diagonal, la secuenciade movimientos es la misma, con la diferencia de que si están endiagonal se requiere un movimiento adicional en el módulo inferior.

Page 399: Disenio Algoritmos

9. El cubo de Rubik

399

Cuadro 154. Procedimiento para orientar los vértices inferiores

1. Orientar_vértices_inferiores()2. Si vértices orientados < 2 entonces3. Si vértices orientados = 1 entonces4. Colocar vértice orientado en la posición frontal

inferior izquierda5. Fin si6. Derecho atrás7. Inferior izquierda8. Derecho adelante9. Inferior izquierda10. Derecho atrás11. Inferior derecha12. Inferior derecha13. Derecho adelante14. Inferior derecha15. Inferior derecha16. Si no (si dos vértices están orientados)17. Colocar un vértice orientado en la posición frontal inferior

izquierda y el otro en el módulo derecho18. Izquierdo adelante19. Superior derecha20. Izquierdo atrás21. Frontal derecha22. Superior derecha23. Frontal izquierda24. Si vértices orientados están seguidos entonces25. Inferior derecha26. Si no27. Inferior derecha28. Inferior derecha29. Fin si30. Frontal derecha31. Superior izquierda

Page 400: Disenio Algoritmos

Diseño de algoritmos

400

Cuadro 154. (Continuación)

32. Frontal izquierda33. Izquierdo adelante34. Superior izquierda35. Izquierdo atrás36. Inferior izquierda37. Fin si38. Fin procedimiento

Puede ocurrir que después de ejecutar este procedimiento losvértices no estén orientados, que aunque hayan girado sobre símismos los colores aun no correspondan con los colores de laspiezas centrales en cada una de las caras. Este procedimiento seejecuta repetidas veces hasta ordenar los vértices, como lo indica laestructura iterativa del procedimiento Armar_Módulo_Inferior(). Noobstante, conviene observar atentamente los colores de las piezas,podría ser que por un error en la ejecución de los movimientosalguno de los vértices cambiara de posición en cuyo caso esnecesario volver a ejecutar el procedimiento Posicionar_vértices_inferiores().

Al orientar los vértices del módulo inferior solo quedaránfaltando las aristas del mismo, como se muestra en la figura 140.

Figura 140. Cubo con vértices inferiores ordenados

Page 401: Disenio Algoritmos

9. El cubo de Rubik

401

Posicionar y orientar las aristas del módulo inferior

Si los procedimientos anteriores se han ejecutado satisfac-toriamente, en este momento sólo restará por ordenar las cuatroaristas del módulo inferior. En la distribución de éstas puedenpresentarse los siguientes casos:

1. Ninguna arista está en el lugar correcto2. Solo una arista está ubicada y orientada3. Dos aristas están ubicadas y orientadas

Si dos aristas están posicionadas y orientas, éstas pueden estaradyacentes u opuestas, como se muestra en la figura 141. De estodepende la secuencia de movimientos a realizar para llevarlas a laposición final.

Figura 141. Posición de las dos últimas aristas por ordenar

En el caso de que tres aristas estuvieran ordenadas y la cuartaposicionada y no orientada, significa que el cubo se desensambló yal ensamblarlo nuevamente la pieza quedó al revés, y por tanto notiene solución a menos que se ensamble correctamente. Simientras se gira los módulos del cubo, accidentalmente una pieza ovarias se desencajan es recomendable ensamblar el cubo colocan-do las piezas de manera que cada cara tenga un solo color.

Aristas opuestas Aristas adyacentes

9. El cubo de Rubik

401

Posicionar y orientar las aristas del módulo inferior

Si los procedimientos anteriores se han ejecutado satisfac-toriamente, en este momento sólo restará por ordenar las cuatroaristas del módulo inferior. En la distribución de éstas puedenpresentarse los siguientes casos:

1. Ninguna arista está en el lugar correcto2. Solo una arista está ubicada y orientada3. Dos aristas están ubicadas y orientadas

Si dos aristas están posicionadas y orientas, éstas pueden estaradyacentes u opuestas, como se muestra en la figura 141. De estodepende la secuencia de movimientos a realizar para llevarlas a laposición final.

Figura 141. Posición de las dos últimas aristas por ordenar

En el caso de que tres aristas estuvieran ordenadas y la cuartaposicionada y no orientada, significa que el cubo se desensambló yal ensamblarlo nuevamente la pieza quedó al revés, y por tanto notiene solución a menos que se ensamble correctamente. Simientras se gira los módulos del cubo, accidentalmente una pieza ovarias se desencajan es recomendable ensamblar el cubo colocan-do las piezas de manera que cada cara tenga un solo color.

Aristas opuestas Aristas adyacentes

Page 402: Disenio Algoritmos

Diseño de algoritmos

402

En el procedimiento del cuadro 155 se presenta la secuencia demovimientos para ordenar las aristas del módulo inferior. Seproponen tres conjuntos de movimientos, el primero se ejecutacuando ninguna o sólo una arista está posicionada y orientada, elsegundo y el tercero cuando dos aristas están posicionadas yordenadas, dependiendo si están en posiciones adyacentes uopuestas.

Cuadro 156. Procedimiento para posicionar y orientar las aristas del móduloinferior

1. Ordenar_oristas_inferiores()2. Si aristas_ordenas < 2 entonces3. Si aristas_ordenadas = 1 entonces4. Colocar arista ordenada en posición frontal inferior5. Fin si6. Izquierdo adelante7. Derecho adelante8. Frontal derecha9. Izquierdo atrás10. Derecho atrás11. Inferior derecha12. Inferior derecha13. Izquierdo adelante14. Derecho adelante15. Frontal derecha16. Izquierdo atrás17. Derecho atrás18. Fin si19. Si aristas_ordenadas = 2 entonces20. Si aristas ordenadas están en caras adyacentes entonces

21. Colocar las aristas no orientadas en las posiciones:frontal inferior e izquierda inferior

22. Izquierdo adelante23. Inferior izquierda24. Superior derecha

Page 403: Disenio Algoritmos

9. El cubo de Rubik

403

Cuadro 156. (Continuación)

25. Posterior izquierda26. Posterior izquierda27. Inferior izquierda28. Inferior izquierda29. Superior derecha30. Superior derecha31. Frontal izquierda32. Inferior izquierda33. Frontal derecha34. Superior derecha35. Superior derecha36. Inferior izquierda37. Inferior izquierda38. Posterior izquierda39. Posterior izquierda40. Inferior derecha41. Superior izquierda42. Izquierda atrás43. Inferior derecha44. Fin si45. Si las aristas orientas están en caras opuestas entonces

46. Colocar las aristas no orientadas ocupen las posiciones:frontal inferior y posterior inferior

47. Inferior derecha48. Inferior derecha49. Derecho adelante50. Izquierdo adelante51. Frontal derecha52. Derecho adelante53. Izquierdo adelante54. Superior derecha

Page 404: Disenio Algoritmos

Diseño de algoritmos

404

Cuadro 156. (Continuación)

55. Derecho adelante56. Izquierdo adelante57. Posterior izquierda58. Posterior izquierda59. Derecha atrás60. Izquierda atrás61. Superior derecha62. Derecha atrás63. Izquierda atrás64. Frontal derecha65. Derecho atrás66. Izquierdo atrás67. Fin si68. Fin si69. Fin de algoritmo

De igual manera que en los procedimientos anteriores, puedesuceder que las piezas no se ordenan aunque cambien de posicióno de orientación, es por este motivo que este procedimiento seinvoca desde un ciclo, para ejecutarse repetidas veces hasta que selogre el propósito. Las secuencias de movimientos para ordenar elmódulo inferior son más largas que las anteriores y mientras sedesarrolla habilidad para armar el cubo es probable que secometan algunos errores en las rutinas y se desordene el módulocentral o el superior. Cuando esto ocurra no se desanime, descansey vuelva a comenzar desde el paso en que se encuentre. Losprimeros intentos seguramente no llegarán hasta el final, pero sipersiste en su propósito finalmente lo logrará.

Si ya logró armarlo, felicitaciones. Ha demostrado ser paciente ydedicado. Si logró armar el cubo de Rubik puede lograr cualquiermeta que se proponga, muchos proyectos, al igual que armar elcubo, requieren más de voluntad y perseverancia que de inteligen-cia o fuerza.

Page 405: Disenio Algoritmos
Page 406: Disenio Algoritmos

406

REFERENCIAS

Aho, A., Hopcroft, J. y Ullman, J. (1988). Estructuras de Datos yAlgoritmos. Wilmington: Addison-Wesley Iberoamericana.

Alcalde, E. y García, M. (1992). Metodología de la Programación.Madrid: McGraw-Hill.

Appleby, D. y Vandekopple, J. (1998). Lenguajes deProgramación: paradigma y práctica. México: McGraw-Hill.

Baase, S. y Gelder, A. (2002). Algoritmos computacionales.México: Pearson Education.

Becerra, C. (1998). Algoritmos: conceptos básicos. 4 ed. Bogotá:Quimpres.

Booch, G. (1994). Análisis y diseño orientado a objetos. 2 ed.Wilmington: Addison-Wesley.

Brassard G. y Bratley, T. (1997). Fundamentos de algoritmia.España: Prentice Hall.

Bruegge, B. y Dutoit, A. (2002). Ingeniería del software Orientadaa Objetos. México: Pearson Education.

Cairó, O. (2005). Metodología de la Programación. México:Alfaomega.

Carretero, J., De Miguel, P., García, F. y Pérez, F. (2001).Sistemas Operativos: una visión aplicada. Madrid: McGraw-Hill.

Page 407: Disenio Algoritmos

Referencias

407

Círculo Enciclopedia Universal. (2006). Tomo 4. Bogotá: Círculode lectores.

Comer, T., Leiserson, C. Rivest, R. y Stein, C. (2001). Introductionto Algorithms. Cambridge: McGraw-Hill.

Deitel, H. y Deitel, P. (2004). Como Programar en Java. 5 ed.México: Pearson education

Galve, J., González, J., Sánchez, Á. y Veláquez J. (1993).Algorítmica: diseño y análisis de algoritmos funcionales eimperativos. Wilmington: Addison-Wesley Iberoamericana.

Espasa Calpe (2005). Gran Enciclopedia Espasa. Tomos 8, 9, 13y 14. Bogotá.

Hermes, H. (1984). Introducción a la Teoría de laComputabilidad: algoritmos y máquinas. Madrid: Tecnos.

Hernández, R., Lázaro, J. C., Dormido, R. y Ros, S. (2001).Estructuras de datos y algoritmos. Madrid: Pearson Education.

Joyanes, L. (1992). Metodología de la Programación. México:McGraw-Hill.

Joyanes, L., Rodríguez, L. y Fernández, M. (1998). Fundamentosde programación: libro de problemas. Madrid: McGraw-Hill.

Joyanes, L. (1996). Fundamentos de Programación: algoritmos yestructuras de datos. 2 ed. Madrid: McGraw-Hill.

Joyanes, L. (2000). Programación en C++: algoritmos,estructuras de datos y objetos. Madrid: McGraw-Hill.

Joyanes, L. y Zahonero, I. (2002). Programación en Java 2:Algoritmos, estructuras de datos y programación orientada aobjetos. Madrid: McGraw-Hill

Page 408: Disenio Algoritmos

Diseño de algoritmos

408

Langsam, Y. y Otros. (1997). Estructuras de datos con C y C++. 2ed. México: Prentice Hall.

Lipschutz, S. (1993). Estructuras de datos. Meéxico : McGraw-Hill.

López, G., Jeder, I y Vega, A. (2009). Análisis y Diseño deAlgoritmos. Buenos Aires: Alfaomega.

Lopezcano, G. (1998). Nuevo Diccionario de la Computación.Tomo 1. Colombia: Zamora Editores.

Martínez, J. y Olvera, J. (2000). Organización y Arquitectura decomputadoras. México: Prentice Hall.

Nassi, I. y Shneiderman, B. (1973). Flowchart Techniques forStructure Programming. Notes of the ACM, v. 8, N. 8. p. 12-26,August.

Oviedo, E. (2002). Lógica de la Programación. Bogotá: Ecoediciones. Plasencia, Z. (2008). Introducción a la Informática.Madrid: Anaya multimedia.

Santos, M., Patiño, I. y Carrasco, R. (2006). Fundamentos deprogramación. Bogotá: Alfaomega Ra-Ma.

Schildt, Herbert. (1993). Aplique turbo C++. Madrid : MacGraw-Hill.

Sommerville, I. (2005). Ingeniería del Software. Madrid: PearsonEducation.

Timarán, R., Chaves, A., Checha, J., Jiménez, J. y Ordóñez, H.(2009). Introducción a la programación con Scheme. Pasto:Universidad de Nariño.

Page 409: Disenio Algoritmos

409

Page 410: Disenio Algoritmos

410

LISTA DE FIGURAS

Pág.

Figura 1. Composición del computador ............................................19Figura 2. Organización física del computador ...................................20Figura 3. Clasificación del software..................................................25Figura 4. Tipos de datos...................................................................37Figura 5. Símbolos utilizados para diseñar diagramas de flujo .........65Figura 6. Diagrama de flujo para el algoritmo de Euclides ................69Figura 7. Estructura secuencia en notación N-S ...............................71Figura 8. Estructura selectiva en notación N-S .................................71Figura 9. Estructura de selección múltiple en notación N-S ..............72Figura 10. Estructura iterativa en notación N-S ................................73Figura 11. Algoritmo de Euclides en notación N-S ............................73Figura 12. Diagrama de flujo del algoritmo número par/impar .........78Figura 13. Diagrama de Nassi-Shneiderman del algoritmo número

par/impar. ....................................................................78Figura 14. Símbolos de entrada de datos.........................................84Figura 15. Símbolos de salida de datos ...........................................86Figura 16. Diagrama de flujo para sumar dos números ....................88Figura 17. Diagrama N-S para sumar dos números ..........................88Figura 18. Diagrama de flujo para calcular el cuadrado de un

número.........................................................................91Figura 19. Diagrama N-S para calcular el cuadrado de un número...91Figura 20. Diagrama de flujo para calcular el precio unitario de un

producto .......................................................................94

Page 411: Disenio Algoritmos

411

Lista de figuras

Figura 21. Diagrama N-S para calcular el precio unitario de unproducto....................................................................... 95

Figura 22. Diagrama de flujo para calcular el tiempo dedicada a unaasignatura.................................................................. 100

Figura 23. Decisión simple en notación diagrama de flujo ............. 108Figura 24. Decisión simple en notación diagrama N-S ................... 108Figura 25. Diagrama de flujo de valor absoluto de un número ....... 110Figura 26. Diagrama N-S para calcular el valor absoluto de un

número ...................................................................... 110Figura 27. Decisión doble en notación diagrama de flujo............... 111Figura 28. Decisión simple en notación diagrama N-S ................... 112Figura 29. Diagrama de flujo para hacer una división .................... 114Figura 30. Diagrama N-S para hacer una división .......................... 114Figura 31. Decisión múltiple en notación diagrama de flujo ........... 117Figura 32. Decisión múltiple en notación N-S ................................ 117Figura 33. Diagrama de flujo para número romano ....................... 119Figura 34. Diagrama N-S para número romano ............................. 120Figura 35. Diagrama de flujo del algoritmo nombre del día de la

semana...................................................................... 122Figura 36. Diagrama N-S del algoritmo día de la semana .............. 123Figura 37. Diagrama de flujo de decisiones anidadas.................... 125Figura 38. Diagrama N-S de decisiones anidadas.......................... 126Figura 39. Diagrama de flujo del algoritmo comparar números..... 128Figura 40. Diagrama N-S del algoritmo comparar números .......... 129Figura 41. Diagrama de flujo del algoritmo nuevo sueldo .............. 132Figura 42. Diagrama N-S del algoritmo nuevo sueldo .................... 133Figura 43. Diagrama de flujo para seleccionar un empleado ......... 136Figura 44. Diagrama N-S del algoritmo auxilio de transporte ......... 138Figura 45. Diagrama de flujo del algoritmo hermano mayor........... 144Figura 46. Diagrama N-S algoritmo descuento a mayoristas .......... 146Figura 47. Diagrama de flujo del algoritmo Empresa editorial ........ 152Figura 48. Descuento en motocicleta ............................................ 155Figura 49. Facturación servicio de energía .................................... 163Figura 50. Diagrama N-S del algoritmo Calculadora....................... 165

Page 412: Disenio Algoritmos

Diseño de algoritmos

412

Figura 51. Representación ciclo mientras en diagrama de flujo(versión 1) ..................................................................174

Figura 52. Representación ciclo mientras en diagrama de flujo(versión 2) ..................................................................174

Figura 53. Representación ciclo mientras en diagrama N-S ...........174Figura 54. Diagrama de flujo del algoritmo para generar números .176Figura 55. Diagrama N-S del algoritmo para generar números .......176Figura 56. Diagrama de flujo algoritmo divisores de un número .....181Figura 57. Diagrama N-S del algoritmo divisores de un número .....182Figura 58. Ciclo Hacer - mientras en Diagrama de Flujo ................183Figura 59. Ciclo Hacer – Mientras en Diagrama N-S.......................184Figura 60. Diagrama de Flujo del algoritmo sumar enteros ............185Figura 61. Diagrama N-S del algoritmo sumar enteros ...................186Figura 62. Diagrama de flujo del algoritmo número binario ............189Figura 63. Diagrama N-S del algoritmo número binario ..................190Figura 64. Ciclo para en Diagrama de Flujo (Versión 1) .................192Figura 65. Ciclo para en DiagramaN-S (Versión 1)..........................192Figura 66. Ciclo Para en Diagrama de Flujo (Versión 2) ..................193Figura 67. Ciclo Para en N-S (Versión 2).........................................193Figura 68. Diagrama de flujo de algoritmo sumatoria .....................195Figura 69. Diagrama N-S del algoritmo sumatoria ..........................196Figura 70. Diagrama de flujo del algoritmo tabla de multiplicar......198Figura 71. Diagrama N-S del algoritmo tabla de multiplicar............198Figura 72. Diagrama de flujo del algoritmo Reloj digital .................201Figura 73. Diagrama N-S del algoritmo Reloj digital........................202Figura 74. Diagrama de flujo para 9 tablas de multiplicar ..............204Figura 75. Diagrama N-S para Nueve tablas de multiplicar ............205Figura 76. Diagrama de flujo para procesamiento de notas ...........212Figura 77. Diagrama N-S para Serie Fibonacci ...............................215Figura 78. Diagrama de flujo para invertir los dígitos de un número220Figura 79. Diagrama N-S para Número perfecto.............................222Figura 80. Diagrama de flujo para número primo ...........................226Figura 81. Diagrama N-S para Puntos de una línea ........................228Figura 82. Representación gráfica de un vector .............................237

Page 413: Disenio Algoritmos

413

Lista de figuras

Figura 83. Representación gráfica de una matriz de dosdimensiones............................................................... 237

Figura 84. Representación gráfica de una matriz de tresdimensiones............................................................... 238

Figura 85. Representación gráfica de un vector de edades ........... 239Figura 86. Vector con datos........................................................... 240Figura 87. Diagrama N-S para guardar números en un vector ....... 242Figura 88. Diagrama N-S para entrada y salida de datos de un

vector......................................................................... 243Figura 89. Representación gráfica de un vector............................. 243Figura 90. Representación gráfica del vector numérico ................. 244Figura 91. Representación gráfica de una matriz .......................... 247Figura 92. Representación gráfica de una matriz con datos .......... 249Figura 93. Diagrama de flujo para llenar matriz ............................. 250Figura 94. Matriz de 4 * 6 ............................................................. 251Figura 95. Diagrama N-S para imprimir el contenido de una matriz 252Figura 96. Vector con datos del ejemplo 47 .................................. 254Figura 97. Diagrama N-S recurrencia de datos en una matriz ........ 256Figura 98. Diferencia de vectores .................................................. 257Figura 99. Diagrama de flujo del algoritmo diferencia de vectores . 258Figura 100. Intercalación de vectores ........................................... 259Figura 101. Sumatoria de filas y columnas de una matriz............. 261Figura 102. Diagrama N-S para sumatoria de filas y columnas de

una matriz.................................................................. 261Figura 103. Diagonal principal de una matriz ................................ 263Figura 104. Diagrama de flujo del algoritmo diferencia de vectores264Figura 105. Arreglos para procesar notas ...................................... 265Figura 106. Diagrama de flujo de una función ............................... 275Figura 107. Diagrama de flujo de la función interés simple ........... 284Figura 108. Diagrama de flujo de algoritmo interés simple ............ 285Figura 109. Diagrama de flujo de la función año bisiesto .............. 288Figura 110. Diagrama N-S para el procedimiento imprimir vector .. 296Figura 111. Diagrama de flujo del algoritmo de búsqueda lineal ... 302Figura 112. Datos de estudiantes almacenados en vectores ......... 303Figura 113. Diagrama de flujo del algoritmo de buscar estudiante 304

Page 414: Disenio Algoritmos

Diseño de algoritmos

414

Figura 114. Diagrama de flujo del algoritmo de búsqueda lineal ....307Figura 115. Número de billetes de lotería y lugar de venta.............310Figura 116. Algoritmo de intercambio ............................................315comparaciones del primer elemento ..............................................315Figura 117. Algoritmo de selección – intercambio del primer

elemento ....................................................................318Figura 118. Algoritmo de la burbuja – comparaciones del primer

recorrido .....................................................................320Figura 119. Algoritmo de inserción – intercambio para el segundo

elemento ....................................................................324Figura 120. Algoritmo de Shell – primera iteración ........................327Figura 121. Algoritmo de Shell – primera iteración ........................328Figura 122. Algoritmo de Shell – primera iteración ........................329Figura 123. Fusión de vectores ordenados ....................................333Figura 124. Arreglos para guardas planilla de calificaciones ..........336Figura 125. Diagrama de procedimientos y funciones....................338Figura 126. Esquema de una función recursiva .............................354Figura 127. Rastreo de activación para la función factorial ............359Figura 128. Marcos de activación de la serie Fibonacci .................369Figura 129. Recorridos para particionar un vector .........................371Figura 130. Recorridos para particionar un vector .........................372Figura 131. Orden del vector después de la primera partición .......373Figura 132. Cubo de Rubik ............................................................377Figura 133. Piezas que forman el cubo de Rubik ...........................377Figura 134. Módulos del cubo de Rubick .......................................378Figura 135. Movimientos de los módulos del cubo de Rubick ........380Figura 136. Cubo ordenado el módulo superior .............................390Figura 137. Ordenar arista central derecha ...................................392Figura 138. Cubo con los módulos superior y central ordenados....394Figura 139. Posición de los vértices inferiores ...............................397Figura 140. Cubo con vértices inferiores ordenados ......................400Figura 141. Posición de las dos últimas aristas por ordenar ..........401

Page 415: Disenio Algoritmos

415

Page 416: Disenio Algoritmos

416

LISTA DE CUADROS

Pág.

Cuadro 1. Magnitudes de almacenamiento......................................23Cuadro 2. Operadores aritméticos ...................................................49Cuadro 3. Jerarquía de los operadores aritméticos ..........................51Cuadro 4. Operadores relacionales ..................................................52Cuadro 5. Operadores lógicos ..........................................................53Cuadro 6. Resultado de operaciones lógicas....................................53Cuadro 7. Jerarquía de los operadores.............................................54Cuadro 8. Primer algoritmo para preparar una taza de café .............60Cuadro 9. Segundo algoritmo para preparar una taza de café..........60Cuadro 10. Algoritmo para obtener el MCD ......................................64Cuadro 11. Algoritmo de Euclides en notación funcional ..................74Cuadro 12. Pseudocódigo algoritmo número par/impar ...................77Cuadro 13. Verificación del algoritmo número par/impar .................80Cuadro 14. Pseudocódigo del algoritmo sumar dos números ...........87Cuadro 15. Verificación del algoritmo para sumar dos números.......89Cuadro 16. Pseudocódigo para calcular el cuadrado de un número .90Cuadro 17. Verificación del algoritmo el cuadrado de un número.....90Cuadro 18. Pseudocódigo para calcular el precio unitario de un

producto .......................................................................94Cuadro 19. Verificación del algoritmo para calcular el precio unitario

de un producto .............................................................95Cuadro 20. Pseudocódigo para calcular el área y perímetro de un

rectángulo ....................................................................97Cuadro 21. Verificación del algoritmo área y perímetro de un

rectángulo ....................................................................98

Page 417: Disenio Algoritmos

417

Lista de cuadros

Cuadro 22. Verificación del algoritmo tiempo dedicado a unaasignatura.................................................................. 100

Cuadro 23. Pseudocódigo para calcular el valor absoluto de unnúmero ...................................................................... 109

Cuadro 24. Verificación del algoritmo para calcular valor absoluto 109Cuadro 25. Pseudocódigo para realizar una división...................... 113Cuadro 26. Verificación del algoritmo para hacer una división....... 113Cuadro 27. Pseudocódigo para identificar número mayor y menor 115Cuadro 28. Verificación del algoritmo número mayor y menor ....... 115Cuadro 29. Pseudocódigo para números romanos ........................ 118Cuadro 30. Verificación del algoritmo número romano .................. 120Cuadro 31. Pseudocódigo del algoritmo día de la semana............. 121Cuadro 32. Verificación del algoritmo día de la semana ................ 123Cuadro 33. Pseudocódigo de Decisiones anidadas........................ 124Cuadro 34. Pseudocódigo del algoritmo comparar números .......... 127Cuadro 35. Pseudocódigo del algoritmo comparar números .......... 129Cuadro 36. Pseudocódigo del algoritmo nuevo sueldo................... 131Cuadro 37. Verificación del algoritmo nuevo sueldo ...................... 133Cuadro 38. Verificación del algoritmo selección de personal ......... 135Cuadro 39. Verificación del algoritmo auxilio de transporte ........... 138Cuadro 40. Pseudocódigo algoritmo Nota Definitiva ...................... 141Cuadro 41. Verificación del algoritmo Nota Definitiva .................... 142Cuadro 42. Verificación algoritmo del hermano mayor................... 145Cuadro 43. Verificación algoritmo descuento a mayorista ............. 147Cuadro 44. Pseudocódigo algoritmo depósito a término ................ 150Cuadro 45. Verificación del algoritmo depósito a término .............. 151Cuadro 46. Verificación del algoritmo Empresa editorial ................ 153Cuadro 47. Verificación del algoritmo descuento en motocicleta ... 156Cuadro 48. Algoritmo comisión de ventas...................................... 159Cuadro 49. Verificación del algoritmo comisión de ventas ............. 160Cuadro 50. Verificación del algoritmo calculadora ......................... 165Cuadro 51. Pseudocódigo del algoritmo para generar números ..... 175Cuadro 52. Verificación algoritmo para generar números .............. 177Cuadro 53. Pseudocódigo algoritmo divisores de un número......... 179

Page 418: Disenio Algoritmos

Diseño de algoritmos

418

Cuadro 54. Verificación algoritmo divisores de un número .............180Cuadro 55. Pseudocódigo del algoritmo sumar enteros .................184Cuadro 56. Verificación del algoritmo sumar enteros .....................186Cuadro 57. Pseudocódigo del algoritmo número binario ................188Cuadro 58. Verificación del algoritmo número binario ....................190Cuadro 59. Pseudocódigo algoritmo sumatoria..............................195Cuadro 60. Verificación de algoritmo sumatoria.............................196Cuadro 61. Pseudocódigo del algoritmo tabla de multiplicar ..........197Cuadro 62. Verificación del algoritmo tabla de multiplicar..............199Cuadro 63. Pseudocódigo algoritmo Reloj digital ...........................200Cuadro 64. Pseudocódigo para Nueve tablas de multiplicar...........203Cuadro 65. Pseudocódigo para número menor, mayor y promedio.207Cuadro 66. Verificación del algoritmo Número menor, mayor y

promedio ....................................................................209Cuadro 67. Verificación del algoritmo procesamiento de notas ......213Cuadro 68. Verificación del algoritmo serie Fibonacci ....................216Cuadro 69. Pseudocódigo del algoritmo Máximo Común Divisor ....218Cuadro 70. Verificación del algoritmo Máximo Común Divisor ........218Cuadro 71. Verificación del algoritmo invertir dígitos de un número221Cuadro 72. Verificación del algoritmo Número perfecto .................223Cuadro 73. Pseudocódigo Potencia iterativa ..................................224Cuadro 74. Verificación del algoritmo potencia iterativa.................224Cuadro 75. Verificación del algoritmo Número primo .....................227Cuadro 76. Verificación del algoritmo Número primo .....................228Cuadro 77. Pseudocódigo del algoritmo raíz cuadrada...................229Cuadro 78. Verificación del algoritmo raíz cuadrada ......................230Cuadro 79. Verificación del algoritmo raíz cuadrada ......................246Cuadro 80. Pseudocódigo para buscar los datos mayor y menor en

un vector ....................................................................254Cuadro 81. Pseudocódigo para intercalar vectores ........................260Cuadro 82. Pseudocódigo para procesar notas utilizando arreglos 266Cuadro 83. Pseudocódigo de la función sumar ..............................276Cuadro 84. Pseudocódigo de la función factorial ...........................277Cuadro 85. Pseudocódigo de la función restar ...............................279

Page 419: Disenio Algoritmos

419

Lista de cuadros

Cuadro 86. Pseudocódigo de la función multiplicar ....................... 279Cuadro 87. Pseudocódigo de la función dividir .............................. 279Cuadro 88. Pseudocódigo del algoritmo operaciones aritméticas .. 280Cuadro 89. Pseudocódigo de la función valor absoluto.................. 281Cuadro 90. Pseudocódigo de la función potencia .......................... 281Cuadro 91. Pseudocódigo del algoritmo principal para potenciación282Cuadro 92. Verificación función potencia ...................................... 282Cuadro 93. Verificación del algoritmo para calcular una potencia .. 283Cuadro 94. Verificación solución para calcular interés simple ....... 285Cuadro 95. Pseudocódigo de la función nota definitiva ................. 286Cuadro 96. Pseudocódigo de la función área de un triángulo ........ 287Cuadro 97. Pseudocódigo de la función contar caracteres ............ 289Cuadro 98. Pseudocódigo de la función sumar días a fecha .......... 291Cuadro 99. Verificación de la función sumar días a fecha.............. 292Cuadro 100. Procedimiento tabla de multiplicar............................ 295Cuadro 101. Pseudocódigo del algoritmo para generar tablas de

multiplicar .................................................................. 295Cuadro 102. Pseudocódigo del procedimiento escribir fecha......... 297Cuadro 103. Pseudocódigo del procedimiento escribir fecha......... 298Cuadro 104. Pseudocódigo del algoritmo consultar saldo ............. 305Cuadro 105. Pseudocódigo de la función búsqueda binaria .......... 308Cuadro 106. Pseudocódigo del algoritmo número ganador............ 310Cuadro 107. Pseudocódigo del algoritmo historia clínica ............... 311Cuadro 108. Ordenamiento por intercambio - ubicación del primer

elemento.................................................................... 316Cuadro 109. Función ordenar vector por el método de intercambio317Cuadro 110. Recorrido para seleccionar el i-ésimo elemento ........ 318Cuadro 111. Función ordenar vector por el método de selección .. 319Cuadro 112. Recorrido para burbujear un elemento...................... 321Cuadro 113. Recorrido mejorado para burbujear el i-ésimo

elemento.................................................................... 322Cuadro 114. Función ordenar vector por el método de la burbuja . 323Cuadro 115. Instrucciones para insertar el i-ésimo elemento en la

posición que le corresponde....................................... 325Cuadro 116. Función ordenar vector por el método de inserción ... 325

Page 420: Disenio Algoritmos

Diseño de algoritmos

420

Cuadro 117. Algoritmo de Shell – una iteración .............................329Cuadro 118. Función ordenar vector por el método de Shell ..........330Cuadro 119. Función para particionar un vector ............................332Cuadro 120. Función para fusionar vectores ordenados ................334Cuadro 121. Función para inicializar vector ...................................339Cuadro 122. Función para contar estudiantes ...............................339Cuadro 123. Función para registrar estudiantes ............................340Cuadro 124. procedimiento para registrar calificaciones ...............341Cuadro 125. Procedimiento para calcular nota definitiva ...............341Cuadro 126. Procedimiento ordenar vector por el método de

selección ....................................................................342Cuadro 127. Función búsqueda binaria para código de estudiante 343Cuadro 128. Procedimiento consultar notas ..................................344Cuadro 129. Procedimiento modificar notas ..................................345Cuadro 130. Procedimiento para ordenar los datos alfabéti-

camente por intercambio directo ..............................346Cuadro 131. Procedimiento para ordenar datos descenden-

temente aplicando algoritmo de Shell .........................347Cuadro 132. Procedimiento para listar estudiantes y califica-

ciones.........................................................................348Cuadro 133. Función menú ...........................................................349Cuadro 134. Algoritmo principal.....................................................350Cuadro 135. Función recursiva para calcular el factorial de un

número.......................................................................357Cuadro 136. Pseudocódigo del programa principal para calcular el

factorial ......................................................................362Cuadro 137. Función recursiva para calcular la sumatoria de un

número.......................................................................365Cuadro 138. Función recursiva para calcular una potencia ............367Cuadro 139. Términos de la serie Fibonacci ..................................368Cuadro 140. Función recursiva para calcular el n-ésimo termino de

la serie Fibonacci........................................................369Cuadro 141. Función recursiva para calcular el MCD .....................370Cuadro 142. Recorridos para particionar un vector ........................372Cuadro 143. Función recursiva Quicksort ......................................374

Page 421: Disenio Algoritmos

421

Lista de cuadros

Cuadro 146. Procedimiento para ordenar aristas superiores ......... 385Cuadro 147. Procedimiento para ordenar los vértices superiores . 388Cuadro 148. Procedimiento para armar el módulo central ............ 391Cuadro 149. Procedimiento para ordenar la arista central

derecha...................................................................... 393Cuadro 150. Procedimiento para ordenar la arista central

izquierda .................................................................... 393Cuadro 151. Procedimiento para mover la arista central derecha . 394Cuadro 152. Procedimiento para armar el módulo inferior ............ 395Cuadro 153. Procedimiento para posicionar vértices inferiores ..... 397Cuadro 154. Procedimiento para orientar los vértices inferiores.... 399Cuadro 156. Procedimiento para posicionar y orientar las aristas

del módulo inferior ..................................................... 402

Page 422: Disenio Algoritmos

422

LISTA DE EJEMPLOS

Pág.

Ejemplo 1. Máximo Común Divisor ...................................................... 62Ejemplo 2. Número par o impar ........................................................... 75Ejemplo 3. Sumar dos números ........................................................... 86Ejemplo 4. El cuadrado de un número................................................. 89Ejemplo 5. Precio de venta de un producto......................................... 91Ejemplo 6. Área y el perímetro de un rectángulo ............................... 95Ejemplo 7. Tiempo dedicado a una asignatura................................... 98Ejemplo 8. Calcular el valor absoluto de un número ........................108Ejemplo 9. División..............................................................................112Ejemplo 10. Número mayor y número menor. ..................................113Ejemplo 11. Número romano .............................................................118Ejemplo 12. Nombre del día de la semana .......................................121Ejemplo 13. Comparación de dos números ......................................126Ejemplo 14. Calcular aumento de sueldo..........................................129Ejemplo 15. Selección de personal....................................................134Ejemplo 16. Auxilio de transporte ......................................................137Ejemplo 17. Nota definitiva ................................................................138Ejemplo 18. El hermano mayor ..........................................................143Ejemplo 19. Descuento a mayoristas ................................................145Ejemplo 20. Depósito a término.........................................................147Ejemplo 21. Empresa editorial ...........................................................151Ejemplo 22. Descuento en motocicleta .............................................153Ejemplo 23. Comisión de ventas........................................................156Ejemplo 24. Factura del servicio de energía .....................................160Ejemplo 25. Calculadora.....................................................................162Ejemplo 26. Generar números ...........................................................175Ejemplo 27. Divisores de un número.................................................177

Page 423: Disenio Algoritmos

423

Lista de ejemplos

Ejemplo 28. Sumar enteros positivos................................................ 184Ejemplo 29. Número binario .............................................................. 186Ejemplo 30. Sumatoria iterativa ........................................................ 194Ejemplo 31. Tabla de multiplicar ....................................................... 197Ejemplo 32. Reloj digital ..................................................................... 200Ejemplo 33. Nueve tablas de multiplicar.......................................... 202Ejemplo 34. Mayor, menor y promedio de n números ..................... 205Ejemplo 35. Procesamiento de notas................................................ 209Ejemplo 36. Serie Fibonacci............................................................... 213Ejemplo 37. Máximo común divisor................................................... 216Ejemplo 38. Invertir dígitos................................................................. 219Ejemplo 39. Número perfecto ............................................................ 221Ejemplo 40. Potenciación iterativa .................................................... 223Ejemplo 41. Número primo ................................................................ 225Ejemplo 42. Puntos de una línea ....................................................... 227Ejemplo 43. Raíz cuadrada ................................................................ 228Ejemplo 44. Guardar números en vector .......................................... 242Ejemplo 45: Entrada y salida de datos de un vector ........................ 242Ejemplo 46: Calcular promedio de números en un vector ............... 244Ejemplo 47. Llenar una matriz ........................................................... 250Ejemplo 48. Imprimir el contenido de una matriz............................. 251Ejemplo 49. Buscar los datos mayor y menor en un vector............. 253Ejemplo 50. Recurrencia de un dato en un arreglo.......................... 255Ejemplo 51. Diferencia de vectores.................................................. 255Ejemplo 52. Intercalar vectores ........................................................ 259Ejemplo 53. Sumatoria de filas y columnas de una matriz............. 260Ejemplo 54. Diagonal principal de una matriz .................................. 263Ejemplo 55. Procesar notas utilizando arreglos ............................... 265Ejemplo 54. Función sumar ............................................................... 276Ejemplo 55. Función factorial ............................................................ 276Ejemplo 56. Operaciones aritméticas................................................ 278Ejemplo 57. Función potencia............................................................ 280Ejemplo 58. Función Interés simple .................................................. 283Ejemplo 59. Función nota definitiva .................................................. 285Ejemplo 60. Función área de un triángulo ........................................ 286Ejemplo 61. Función año bisiesto...................................................... 287Ejemplo 62. Función contar caracteres............................................. 288Ejemplo 63. Sumar días a una fecha ................................................ 289

Page 424: Disenio Algoritmos

Diseño de algoritmos

424

Ejemplo 64. Procedimiento tabla de multiplicar ...............................294Ejemplo 65. Procedimiento imprimir vector ......................................296Ejemplo 66. Procedimiento escribir fecha.........................................296Ejemplo 67. Procedimiento mostrar una sucesión ...........................297Ejemplo 68. Buscar un estudiante.....................................................302Ejemplo 69. Consultar saldo...............................................................303Ejemplo 70. Número ganador ............................................................309Ejemplo 71. Historia clínica ................................................................311Ejemplo 72. Lista de calificaciones....................................................336Ejemplo 73. Función recursiva para calcular el factorial de un

número ............................................................................353Ejemplo 74. Sumatoria recursiva .......................................................364Ejemplo 75. Potenciación recursiva...................................................365Ejemplo 76. Serie Fibonacci ...............................................................367Ejemplo 77. Máximo Común Divisor ..................................................369Ejemplo 78. Algoritmo de Ordenamiento Rápido Recursivo ............371

Page 425: Disenio Algoritmos

425