Sistematizando Algoritmos

Unidad de Apoyo para el Aprendizaje

Iniciar

Introducción


Un problema se puede dividir en subproblemas más sencillos de resolver; de esta manera obtenemos una solución óptima. Por ende, un algoritmo puede transformarse en su expresión computable: el programa. Éste es un conjunto de instrucciones que realizan determinadas acciones y que están escritas en un lenguaje de programación. Por eso la importancia de este tema, para identificar eficazmente todos los elementos posibles y así dar un resultado óptimo.

Si te interesa continuar con el tema te invito a seguir estudiando.



Bases de datos


El estudio de este tema te permitirá:

Reconocer los elementos principales de programación utilizados en la representación de un problema determinado, para la realización de un programa a partir de un algoritmo.

Modularidad. Funciones, rutinas y procedimientos


Un problema se puede dividir en subproblemas más sencillos o módulos; a esto se le llama programación modular. Dentro de los programas se les conoce como subprogramas, los cuales son independientes entre sí y pueden ser tratados separadamente unos de otros, y presentan dos tipos: procedimientos y funciones. Gracias a la modularidad se pueden probar los subprogramas de manera independiente, depurándose sus errores antes de su inclusión en el programa principal y almacenarse para su posterior utilización cuantas veces se precise.

Pulsa en cada concepto para desplegar la información correspondiente.

Función

Es un conjunto de pasos para realizar cálculos especificados y devolver siempre un resultado. Los pasos están almacenados con el nombre de función, la cual acepta ciertos valores o argumentos para realizar cálculos con ellos y proporcionar un resultado. Hay funciones que carecen de argumentos, pero sí arrojan un resultado.

Tanto el resultado de la función como los argumentos que recibe deben tener un tipo de dato previamente definido; por ejemplo, entero, carácter, cadena, fecha, booleano, etcétera.

Una función puede invocar a otra e inclusive tener la capacidad de invocarse a sí misma, como las funciones recursivas. La ventaja es que la función se puede implementar e invocar una y repetido número de veces.

Un ejemplo de una función sería la siguiente, que recibe un valor n y calcula su factorial:



entero función factorial (entero n)
inicio
si (n = 0) entonces
factorial = 1;
si no
factorial = n* factorial (n - 1);
fin si;
retorna factorial
fin función

Rutina

Es un algoritmo que realiza una tarea específica y que puede ser invocado desde otro algoritmo para ejecutar tareas intermedias. También como la función recibe argumentos y retorna valores. De hecho, la rutina es un tipo muy específico de una función, por lo que se puede considerar sinónimo de ésta.

Procedimiento

Es similar a una función, pero no regresa un resultado, sino que en su lugar realiza una o varias tareas; por ejemplo, centrar una cadena en la pantalla de la computadora, dibujar un marco, imprimir un mensaje, etcétera.

Ejemplo:

Procedimiento mensaje Bienvenida
Inicio
Borrar pantalla
Imprimir “Bienvenido al sistema”
Imprimir “Teclee cualquier tecla para continuar…”
Salir


En conclusión, las funciones, las rutinas y los procedimientos son elementos que pueden incluir los programas y que ayudan a que estos sean eficientes.



Una vez que se estudian las piezas clave en la programación estructurada o modularidad, se comienza el proceso de modelado de una solución factible a un problema, es decir, el diseño. Existen numerosas técnicas para encontrar la solución al problema; entre ellas podemos ver los siguientes enfoques.



Enfoque de algoritmos

Existen dos enfoques que se refieren a la forma como se diseña un algoritmo: refinamiento progresivo y procesamiento regresivo.

Refinamiento progresivo

Es una técnica de análisis y diseño de algoritmos basada en la división del problema principal en problemas más simples.

Partiendo de problemas más sencillos se logra dar una solución más efectiva, ya que el número de variables y casos asociados a un problema simple es más fácil de manejar que el problema completo.

Esta técnica se conoce como top-down (arriba-abajo) y es aplicable a la optimización del desempeño y a la simplificación de un algoritmo.

Top-down

Conocida también como diseño descendente, consiste en establecer una serie de niveles de mayor a menor complejidad (arriba-abajo) que den solución al algoritmo.

Se efectúa una relación entre las etapas de la estructuración, de forma que una etapa jerárquica y su inmediato inferior se relacionen mediante entradas y salidas de datos.

Se integra de una serie de descomposiciones sucesivas del problema inicial, que recibe el refinamiento progresivo del repertorio de instrucciones que van a formar parte del programa. Esta técnica tiene los siguientes objetivos:



 Interacción entre los procesos, la estructura de memoria y los archivos.


Un ejemplo de un diseño descendente está representado en este sistema de nómina. Como se puede observar, en este caso, el diseño descendente es jerárquico; el módulo 0 de nómina contendrá el menú principal que integrará al sistema, controlando desde éste los submenús del siguiente nivel. Pulsa en las flechas para avanzar y retroceder por la información.



Módulo 1

El módulo 1 de empleados comprenderá un submenú con las opciones de altas, bajas y los cambios a los registros de los empleados.

Módulo 2

En el módulo 2 se capturarán los movimientos quincenales de la nómina, como los días trabajados, horas extra, faltas, incapacidades de los empleados, etcétera.

Módulo 3

En el módulo 3 se realizarán los cálculos de las percepciones, deducciones y el total de la nómina, individualizado por trabajador.

Menú de reportes

El menú de reportes con el número 4 comprenderá los subprogramas para consultar en pantalla e imprimir los recibos de nómina, la nómina misma y un catálogo de empleados, aunque no es limitativo, puesto que se le pueden incluir más reportes o informes al sistema de reportes correspondiente. Así, teniéndolo en mente, se fue descomponiendo en los distintos módulos y submódulos que conforman al sistema.

El beneficio del diseño descendente radica en la eficiencia a la hora de obtener resultados, ya que al dividir el problema en problemas más pequeños se logra una solución más efectiva.

Procesamiento regresivo


Es otra técnica de análisis y diseño de algoritmos. Parte de la existencia de múltiples problemas y se enfoca en la asociación e identificación de características comunes entre ellos, para diseñar un modelo que represente la solución para todos los casos, de acuerdo a ciertos rasgos específicos de las entradas.

Esta técnica también es conocida como bottom-up (abajo-arriba), aunque suele pasar que no alcance la integración óptima y eficiente de las soluciones de los diversos problemas.

Bottom-up

Es el diseño ascendente referido a la identificación de aquellos subalgoritmos que necesitan computarizarse conforme vayan apareciendo, su análisis y su codificación, para satisfacer el problema inmediato.

Cuando la programación se realiza internamente y con enfoque ascendente, es difícil llegar a integrar los subalgoritmos, a tal grado que el desempeño global sea fluido. Los problemas de integración entre los subalgoritmos no se solucionan hasta que la programación alcanza la fecha límite para la integración total del programa.

Aunque cada subalgoritmo parece ofrecer lo que se requiere, cuando se considera el programa final, éste presenta ciertas limitaciones por haber tomado un enfoque ascendente:



 Interacción entre los procesos, la estructura de memoria y los archivos.

El beneficio del diseño ascendente es que su desarrollo es mucho más económico que el descendente, pero habría que ponderar la bondad de esta ventaja comparada con la eficiencia en la obtención de los resultados que ofrezca el sistema ya terminado. En este tema se estudiaron los dos enfoques de diseño de sistemas: el refinamiento progresivo y el procesamiento regresivo, y se comparan sus ventajas y limitaciones. Del mismo modo, se hace referencia a la programación estructurada que permite la escritura de programas fáciles de leer y modificar, y cuya principal característica es no realizar bifurcaciones lógicas a otro punto del programa (como se hacía en la programación libre), lo cual facilita su seguimiento y mantenimiento.

Actividad. Dividir problemas

Piensa en algún problema complejo que te agobie en este momento; si lo divides en varios subproblemas sería más sencillo resolverlo, ya que ello facilita su comprensión. Es por esto que esta actividad te ayudará a reforzar los conceptos básicos del tema.

Autoevaluación. Elaborando programas

La transformación de un algoritmo a un programa determina su efectividad en la solución de un problema determinado, facilitando su uso y mantenimiento. En la siguiente autoevaluación podrás identificar tu nivel de comprensión del tema.

Fuentes de información

Básicas

SUAyED. (2016). Análisis, diseño e implantación de algoritmos. Apunte electrónico [Versión electrónica]. México: UNAM. Consultado el 21 de agosto de 2017 de http://fcasua.contad.unam.mx/apuntes/interiores/docs/20181/informatica/1/LI_1164_06097_A_Analisis_Diseno_Implantacion_Algoritmos_Plan2016.pdf

SUAyED. (2016). Análisis, diseño e implantación de algoritmos. Cuaderno de actividades [Versión electrónica]. México: UNAM. Consultado el 21 de agosto de 2017 de http://fcasua.contad.unam.mx/apuntes/interiores/docs/20181/informatica/1/LI_1164_06047_C_Analisis_Diseno_Implantacion_Algoritmos_Plan2016.pdf

Complementarias

Bibliografía

Cairó, O. (2006). Fundamentos de programación: piensa en C. México: Pearson Educación. García, J. B. y Laza, R. (2008). Metodología y tecnología de la programación. Madrid: Pearson/Prentice Hall. Gelder, B. (2003). Algoritmos computacionales (3.ª ed.). México: Thompson.

Cómo citar

Texto correspondiente a esta sección.