El paradigma de la programación estructurada

Una forma de expresar el pensamiento humano en términos entendibles para las computadoras
Por Luis Everardo Castro Solís Profesor del curso de Informática I. Facultad de Ingeniería. U.A. de C.

El concepto de algoritmo En este ensayo se establecen algunos principios básicos para el diseño de algoritmos. Entonces vale la pena empezar con una “definición” del concepto de algoritmo : Un algoritmo es una lista de instrucciones en la cual se especifica una sucesión de operaciones necesarias para resolver cualquier problema de un tipo dado, en una cantidad finita —determinada— de tiempo. Sus características fundamentales son: • • Carácter finito: El algoritmo eventualmente lo hacen finalizar. contiene instrucciones que

Carácter determinativo: Debe darse en forma de una lista finita de instrucciones, que indique el procedimiento a seguir en cada paso del cálculo, de manera que cualquiera pueda repetirlo con éxito en cualquier momento. Carácter general: Es una lista única de instrucciones que definen un cálculo que puede efectuarse con cualesquiera datos iniciales y que, en cada caso, proporciona un resultado correcto.

El paradigma de programación estructurada La programación estructurada puede ser entendida como la aplicación de una metodología básica de análisis de problemas, para establecer una estructura jerárquica y manipulable de estos. Se realiza vía un proceso de refinamiento sucesivo en una serie de pasos. Cada paso cubre los detalles del problema, enfocados y refinados por el conocimiento disponible en el paso precedente.

© D.R. LUIS EVERARDO CASTRO SOLIS

presentan errores— y estos errores tienen que ser eliminados antes de que el sistema pase a su fase operacional.R. aprender a usar la metodología de programación estructurada. Nicklaus Wirth (el creador del lenguaje Pascal. o sea que no es otra cosa que una forma particular del método analítico. sin embargo un gran número de los errores existentes en un sistema. fase de prueba y depuración (cuando se verifica su correcto funcionamiento) y fase operacional (cuando se usa para resolver el problema para el cual fue diseñado). es de esperar que en un sistema complejo existan más errores que en un sistema menos complejo. está en gran parte relacionado con la complejidad del mismo —es decir. El problema es entonces no que un sistema tenga errores. mejoramiento de la claridad del código. fase de implementación (cuando se comunica el sistema a la computadora).) nos ha provisto de la definición más precisa. Lo que plantea la programación estructurada es una metodología para diseñar programas como secuencias de procesos y variables independientes que una vez que se ejecutan y asignan. LUIS EVERARDO CASTRO SOLIS . si queremos emprender el camino de la programación de computadoras. aumento de la capacidad de modificación y mantenimiento del programa terminado. resuelven el problema por partes. pero todos los sistemas de una cierta complejidad. el profesor Wirth dice: La programación estructurada es la formulación de un programa mediante la anidación jerárquica de estructuras de estatutos y objetos de cómputo. Naturalmente que si la construcción lógica del programa es deficiente y no es posible aislar fallas de software por medio de testeo en un ambiente con itinerario finito. como una colección de subsistemas. y cada nivel de conceptualización más bajo proporciona una descripción de los detalles del mismo. Queda claro que es conveniente. el proceso de depuración se hace increíblemente difícil. se espera que al resolver el problema menos complejo que implica cada subsistema. cuando están en su fase de desarrollo. en donde un problema complejo (sistema) se divide en pedazos coherentes (subsistemas)que a su vez son analizados (divididos en subsistemas cada vez menos complejos) hasta lograr expresar el sistema completo. incremento de la productividad del programador. y hasta necesario en algún contexto. © D. Inevitablemente ocurren errores en la fase de diseño. Algunos beneficios que acompañan a loa reducción de la complejidad de los programas son: menos problemas de prueba y depuración del programa. sino. el problema correspondiente al sistema completo quede resuelto. cómo hacer para eliminarlos de la mejor manera. Objetivos de la programación estructurada Todo software en su proceso de creación pasa por tres fases: fase de diseño (cuando se piensa el sistema).El nivel de conceptualización más alto representa la descripción general del problema.

la programación estructurada no es una panacea que permite a cualquiera hacer buenos programas de computadora.R. es decir la programación estructurada no puede resolver fallas de comunicación o de organización. existen dos grandes áreas en las cuales la programación estructurada no provee solución alguna: • Muchas fallas del software provienen de fallas en la especificación del problema. al tiempo gastado en resolver el problema equivocado. aunque esta técnica de refinamiento puede ser aplicada para descomponer totalmente un programa en sus estatutos elementales. pero puede ser aproximado en términos y entidades naturales al problema en sí. cada el refinamiento refinamiento nos sucesivo como provee de una metodología descripción de más © D. El refinamiento sucesivo es un procedimiento que implica descomponer una función de un módulo en un conjunto extendido de subfunciones. el programa abstracto formulado en un lenguaje adecuado —llamado pseudocódigo— realiza operaciones con datos abstractos. Esta herramienta es la “abstracción” o el “análisis”. es más efectiva como herramienta de descomposición de cada módulo de un programa. en su lógica interna necesaria para realizar la función del módulo. eventualmente. las operaciones pueden ser traducidas directamente a un lenguaje de programación.Con esto en mente. LUIS EVERARDO CASTRO SOLIS . La baja productividad de un programador se debe. Minimizar el costo de operación del software terminado. Note que. por el contrario. Un problema no puede ser atacado inicialmente en términos de instrucciones para la máquina. La disciplina y rigor de la programación estructurada va más allá de la capacidad de cierta clase de programadores. pero equivalente. El proceso de análisis es a la vez un proceso de refinamiento sucesivo de la especificación del programa. estructurada: • • podemos enunciar los objetivos de la programación Minimizar el número de errores que ocurren en el proceso de desarrollo de software. Este proceso continua hasta que finalmente se llega a un nivel entendible por el computador. Minimizar el esfuerzo requerido para corregir errores en secciones de código deficiente. • Sin embargo. Cada subfunción se descompone posteriormente en otros conjuntos de subfunciones extendido. En este proceso. a veces. Las operaciones se consideran como componentes del programa que están sujetos a descomposición en un nivel más bajo de abstracción. hasta que. no es mejor que los métodos tradicionales de diseño. La programación estructurada aplicada impropiamente. • El proceso de estructuración La herramienta mental fundamental para el desarrollo efectivo de programas es común a todas las formas de ingeniería. Cuando utilizamos programación. mejorar secciones con técnicas más funcionales o eficientes.

R. O nodo decisión. y el diseño de estos procesos esta en un lenguaje muy cercano a las especificaciones humanas. un punto de decisión o un simple colector de las rutas de control del programa. Un nodo puede representar una transformación de datos. o tan complejo como un programa completo. que pasa por el nodo a una línea de salida del programa. En un caso simple. Esto implica que no existen bucles infinitos o ciclos cerrados y tampoco código aislado o nodos isla en el programa. Un programa “bien formado” se define como uno en el cual existe. Esto nos permite verificar la fabricación correcta de los nodos proceso en cada nivel de abstracción. o más. no se realiza ninguna operación de asignación con los datos dentro de este tipo de nodo—. que es evaluada cada vez que se entra al nodo. esta asociado con una función predicado. Un nodo proceso propio se define como aquel que contiene solamente un punto de entrada y una sola salida. El proceso puede ser tan simple como un estatuto elemental de asignación de una valor a una variable. para cada nodo. El nodo proceso es un nodo de transformación de datos en el diagrama de flujo del programa. Un nodo proceso “bien formado” es aquel que contiene un solo punto de entrada y una. nodo colector y nodo predicado. Los nodos proceso impropios incrementan la dificultad de la verificación al introducir rutas alternas en el proceso. Nodo predicado. usualmente un test lógico de “valor binario”. Los segmentos de línea se inician y terminan en nodos. una ruta de la línea de entrada. Nodo proceso. cuando el proceso se aproxima al nivel de la máquina. una función predicado puede ser: ¿Es x mayor que y ?. LUIS EVERARDO CASTRO SOLIS . varios pasos de refinamiento después. Nodo proceso. reduciendo la verificación a una magnitud manipulable o en palabras más técnicas a un medio ambiente de prueba y depuración con itinerario finito. donde © D. Un programa propio es un programa bien formado que contiene una y solamente una línea de salida. Un diagrama de flujo es un gráfico que describe el flujo del control de ejecución de un programa. que una descripción del flujo ordenado de un programa.detallada del control lógico del programa. Programa “bien formado”. En este proceso el nodo precedente es tratado como una entidad verificable. hasta que el programa entero puede ser verificado como un solo nodo proceso en el nivel de abstracción más alto.se indica con flechas. A los programas bien formados con salidas múltiples se les denomina programas “impropios”. Programa propio. Los datos del programa NO son transformados en manera alguna en el nodo predicado —es decir. Fundamentos de programación estructurada Existe un número continuar: de conceptos básicos que debemos mencionar antes de Diagrama de flujo. el lenguaje se parece más a un lenguaje de programación. Los refinamientos iniciales nos brindan un proceso muy general. salidas (denominadas salidas abnormales). Algunos programas construidos a base de nodos proceso impropios más bien parecen un tazón de espaguetti en la jerga de la profesión. Nodos fundamentales. El gráfico está construido con segmentos de línea cuya orientación -o dirección del flujo. El nodo proceso se caracteriza como una función con una única entrada y salida.

El número de líneas de control que entrar a un nodo colector es dos.una evaluación a cierto o falso (se trata de un test lógico de valor binario) es adecuada. Es evidente que mediante una adecuada combinación de tests binarios se puede lograr el test multiselector. viudo. Nodo proceso Nodo Predicado: Nodo Colector: © D.R. divorciado. LUIS EVERARDO CASTRO SOLIS . el programa sale por una de las dos líneas de salida de este tipo de nodo según sea el resultado del test. separado]. En un caso más complicado el predicado puede ser ¿Cual es el estatus civil del sujeto? donde una de este grupo es la respuesta [casado. El nodo colector combina un conjunto de dos o más líneas de flujo (entrada) en una línea de salida simple. donde una de varias líneas de salida mutuamente excluyentes es escogida de acuerdo con la respuesta al test. Nodo colector. excepto cuando el nodo sigue a casos especiales del nodo predicado (multiselector)o en nodos proceso con salidas abnormales (impropios). Para este caso advertimos la necesidad de una forma especial del predicado de tipo “multiselector”.

independientemente del nivel de abstracción en que se encuentre el proceso de diseño. llamadas básicas. que nos provee de capacidad de elección entre una de dos alternativas. Cuando uno o más de los nodos proceso son impropios. . sin embargo se ha demostrado que son suficientes únicamente tres estructuras de control. En el proceso de refinamiento un nodo proceso. la secuencia se abrevia en un nodo proceso impropio (abnormal). Estructuras básicas de control Estructura secuencia. Estructura selección . La estructura básica de selección es el If-thenelse.. El proceso de expansión puede ser repetido con cada subnodo. . La estructura secuencia es simplemente la concatenación (o encadenamiento) de dos o más nodos proceso. Utilizando los nodos fundamentales se han construido un número de estructuras de control. obteniendo un nivel adicional de detalle.R. (c)iteración. LUIS EVERARDO CASTRO SOLIS . el cual es un mecanismo de decisión binario. Proceso A1. Programa estructurado. A2. A3. Los tres tipos de nodos fundamentales pueden ser ensamblados para formar una estructura de control de un programa. (b)selección.Estructura básica de control. A2. puede ser reemplazado por una secuencia de dos o más nodos proceso (A1. La estructura secuencia puede ser escrita simplemente como una lista de estatutos: Proceso Proceso Proceso . . Podemos definir un programa estructurado propio como un programa diseñado mediante un proceso de refinamiento sucesivo. A su vez estas pueden ser desglosadas en subtipos de estructuras: (a) (b) secuencia: selección: Concatenación If-then If-then-else Case While-do Repeat-until (c) iteración: En la siguiente sección se detalla cada una de estas estructuras básicas de control. llamémosle A. An. puede ser escrito como: © D... Si los nodos son propios —cada uno con una sola entrada y una sola salida— la secuencia lineal de nodos proceso puede ser comprimida o abstraída en un solo nodo proceso. usando solamente las tres estructuras de control básicas. para construir cualquier programa: (a)secuencia. An) los cuales son una expansión de A.

Proceso B. Una estructura multiselector se puede construir usando este tipo de selección y se ha denominado estatuto CASE. el cual permite decidir entre ejecutar o no ejecutar una cierta alternativa. A3. el cual es ejecutado si el predicado asociado se cumple. Si un predicado no se cumple el control pasa al siguiente predicado. An. luego de lo cual el control pasa a la línea de salida de la estructura. puede ser escrito como: IF (p) THEN Proceso A. de acuerdo al valor del predicado de control.IF (p) THEN Proceso A ELSE Proceso B. tan simple como una o tan complejo como un programa completo. esto se puede escribir como: IF (p1) THEN Proceso A1 ELSE IF (p2) THEN Proceso A2 ELSE IF (p3) THEN Proceso A3 ELSE IF (p4) THEN Proceso A4 ELSE IF : : ELSE IF (pn) THEN Proceso An. A2. proceso A asignación el proceso A es ejecutado solamente si el predicado p es y el proceso B es ejecutado en caso de que p sea falso. A1. El o B puede ser. el flujo del control continua con el proceso B en ambos casos. como se ha mencionado. LUIS EVERARDO CASTRO SOLIS .R. donde cada predicado esta asociado con un nodo proceso. Lo cual puede ser más claramente expresado por un estatuto CASE: CASE (p) of p1: Proceso p2: Proceso p3: Proceso p4: Proceso : : pn: Proceso end_case. A4. si p no es verdadero el proceso A simplemente no se ejecutara. © D. Este estatuto es un grupo de predicados. De esta forma se define un mecanismo multiselector mutuamente excluyente que escoge una de muchas líneas de salida. En donde el proceso A se ejecutara en caso de que p sea verdadero. Una variante de esta estructura es el If-then. En donde verdadero.

La representación de la estructura Repeat-until se diferencía fundamentalmente en dos cosas de la forma While-do: (a) La forma Until testea el predicado (verifica su valor) después de cada iteración. si p no checa con p1. Si p no es verdadero el Proceso A no se sigue ejecutando y el control pasa a la siguiente estructura. Es importante mencionar que el proceso A (denominado cuerpo del bucle ) debe contener transformaciones de datos que eventualmente hagan que el predicado de control p tome valores que hagan que el bucle termine. en donde p* es el complemento lógico del predicado p. El estatuto While especifica que el proceso A es ejecutado repetidamente mientras el predicado de control p es verdadero. es equivalente al programa: Proceso A. Una vez que p sea verdadero el proceso A deja de ser ejecutado y el control pasa a la siguiente estructura. © D.R. El primer tipo y el más ampliamente usado es la estructura While. por lo que se conoce como bucle post-test. Estructura iteración . por lo tanto la forma Until se ejecutará siempre por lo menos una vez. si p checa con p2 ejecutar el proceso A2 y pasar al fin de la estructura. mientras que el bucle While termina cuando el valor de p es falos. LUIS EVERARDO CASTRO SOLIS . La colección de herramientas de programación contiene un último mecanismo. que provee una capacidad de ciclaje básica o de repetición controlada de segmentos de código. Cuando esto no ocurre se dice que entramos en un bucle infinito y es un error. WHILE (p*) DO Proceso A. La forma Repeat-until especifica que el proceso A será ejecutado hasta que el predicado de control p sea verdadero. esto se puede escribir como: WHILE (p)DO Proceso A. verificar si p checa con p3. y se puede escribir como sigue: REPEAT Proceso A UNTIL p.que significa: si p checa con p1 ejecutar el proceso A1 y pasar al final de la estructura. verificar si p checa con p2. si p no checa con p2. (b) La forma Until termina cuando el valor del predicado p es verdadero. sin importar el valor del predicado p. y así sucesivamente hasta agotar las posibilidades. Por ejemplo el programa definido por: REPEAT Proceso A UNTIL (p). mientras que la forma While testea el predicado antes de cada iteración (es un bucle pre-test).

sustituyendo o ampliando. sin tomar en cuanta la sintaxis de un lenguaje de programación en particular. EL PSEUDOCODIGO ES UNA EXTENSION DEL PROCESO DE PENSAR. al nivel de la máquina. siendo entonces más fácil implementar cambios de diseño en el programa. La herramienta es natural y debe ser usada de manera que haga fácil la programación. LUIS EVERARDO CASTRO SOLIS . Es un lenguaje que permite al programador pensar acerca del problema a resolver. o debe ser. y expresar la lógica del programa de una manera semiformal. Los cambios en la lógica del programa son más aparentes al nivel de pseudocódigo que cuando la lógica es complicada por los detalles de un lenguaje de programación específico. por ejemplo: Temporal := ( A[i. El pseudocódigo se asemeja a un lenguaje de programación en operaciones explícitas pueden ser especificadas.i] Calcula el nivel de acercamiento al objetivo Segundo. Primero. que redunda en claridad. para describir las operaciones del programa a cualquier nivel. unas pocas reglas generales están disponibles: REGLA 1. por ejemplo: Cambia cuenta inicial = 1 Imprime el rango de error esto difiere de un lenguaje de programación en dos formas. sin adentrarse en los detalles del programa y sin complicar la representación del mismo con detalles innecesarios. Las únicas convenciones que gobiernan el uso del pseudocódigo están relacionadas con el uso de estructuras de control y la indentación de la escritura.El uso del pseudocódigo El pseudocódigo no es otra cosa que una notación conveniente que brinda el enlace entre el lenguaje nativo del programado y el lenguaje del computador. la información contenida en los diagramas de flujo. Para hacer su uso más efectivo. que las © D.n+1] . no existen reglas formales de sintaxis que limiten el libre uso del pseudocódigo. conservado como parte de la documentación del programa. las operaciones pueden ser indicadas a cualquier nivel de complejidad.sum )/ A[i. El pseudocódigo también es un lenguaje que puede ser usado durante la etapa de refinamiento. La notación permite al programador relacionarse con los problemas a varios niveles de abstracción. y facilita la evaluación del estado del desarrollo en cualquier etapa del proceso de refinamiento. El pseudocódigo no tiene lineamientos formales para dirigir al usuario en su aplicación. Esto nos provee de una forma conveniente para documentar las etapas del desarrollo de un programa para nuestro propio uso. El pseudocódigo permite al diseñador trabajar con un lenguaje a un nivel más alto que un lenguaje de programación.R. permite a otros programadores revisar la funcionalidad del programa antes de que esta sea traducido (codificado) a un lenguaje de programación específico. El pseudocódigo también provee de una descripción detallada del programa fuente completo que puede ser.

de la velocidad de partes no críticas de sus programas.R. por ejemplo: la forma If-then-else. Algunos programadores gastan enormes cantidades de tiempo pensando. ya que un estatuto puede ser expandido en u paso posterior de refinamiento. REGLA 4. © D. y tales intentos de eficiencia tienen un fuerte impacto negativo cuando tomamos en cuenta los requerimientos de mantenimiento y depuración del código. LUIS EVERARDO CASTRO SOLIS . Consideraciones finales La programación estructurada puede ser sumarizada como un conjunto de cuatro importantes lineamientos que debemos tener en mente mientras desarrollamos la estructura de un programa mediante el método de refinamiento sucesivo: • Posponer los detalles. REGLA 3. sin confundirnos con los detalles innecesarios hasta refinamientos posteriores. Un buen programador no se engañaría con tal razonamiento. Los detalles del programa en los niveles de diseño abstracto son triviales y ensucian el proceso de pensamiento. MANTENGA LA LOGICA A UN NIVEL SIMPLE DENTRO DEL PROGRAMA. Si se colocan operaciones múltiples en una sola línea. debe checar cuidadosamente el código crítico. REGLA 2. provocan que éste no se pueda modelar adecuadamente. la optimización prematura del código es la raíz de todo mal. USE ESTRUCTURAS DE CONTROL EN LA FORMA PERMITIDA POR EL Si una estructura específica es de estructura en tal forma. resultara caos y confusión. REGLA 5. USE NOMBRES AUTODEFINIBLES PARA SUS VARIABLES. CODIFIQUE PRIMERO POR CLARIDAD. REGLA 6. o preocupándose. Debemos olvidarnos de pequeñas eficiencias: se dice que el 97% del tiempo. Los detalles deben ser enfocados solo cuando tenga impacto directo en el proceso de refinamiento. Para guiar el proceso de pensamiento y asistir en la creación de una estructura aceptable. Es importante considerar las funciones primordiales del módulo. MODIFIQUE LUEGO POR EFICIENCIA. use la IF (disfunción switch = off) THEN Calcular la densidad media del smog para un periodo de 24 hr ELSE Poner la densidad media del smog = 1000 ppm Cada estatuto de una secuencia debe ser escrito en una línea separada. el uso de estructuras de control no permitidas en un proyecto dado. INDENTAR EL CODIGO PARA RESALTAR LAS ESTRUCTURAS DE CONTROL. PROYECTO.Los estatutos usados deben relacionarse con el refinamiento sucesivo y resultar en un programa estructurado. pero no dejemos pasar nuestra oportunidad de aprovechar el 3% restante crítico. pero solo después de que dicho código ha sido identificado.

asociando los síntomas de los errores con el error apropiado. suele implicar a la estructura completa. mientras otras son todo lo contrario. necesitamos considerarlos y refinar su definición con el mayor detalle posible. algunos problemas requerirán revocar o modificar las decisiones iniciales. los datos necesarios para la función de un módulo estarán descubiertos. Desarrolle procedimientos para hallar alternativas y criterios para seleccionar la mejor solución. Reutilize las ideas que han funcionado previamente en lugar de pensar en ideas nuevas para cada problema. • • Adicionalmente a estos cuatro lineamientos. El principio de las rutas alternativas . Cuando el proceso de refinamiento es llevado hasta los niveles más bajos de abstracción.R. No en balde el profesor Wirth tituló a su libro de programación Algoritmos + Estructuras de Datos = Programación. Los datos requeridos por alguna configuración del programa son artículos importantes a considerar en el proceso de decisión.” Flexibilidad. etc. pseudocódigo. El principio de las huellas. No nos intimidemos con las estructuras ya existentes. diagramas de flujo. Tratemos de analizar cada decisión comprendiendo completamente las implicaciones asociadas con ella. he compilado durante mi carrera como programador de computadoras los siguientes principios básicos. El conocimiento de los errores comunes y sus síntomas asociados facilita la depuración y testeo de sus programas enormemente. concentrándose en un componente a la vez. per no nos entrampemos por detalles hasta los niveles más bajos. Cada revisión de la lógica del programa. Codifique y testee programas complejos en segmentos funcionales a la vez. Cuando los datos aparecen. • • • © D. Genere y evalúe diseños alternativos para problemas de programación. Los datos y la estructura lógica están en función de las decisiones tomadas durante la descomposición en módulos funcionales del programa completo. Esquematice sus ideas en forma múltiple. Ninguna decisión es final. considere representaciones múltiples de una misma idea. Exprésela en lenguaje natural. algunas decisiones son obvias y fáciles de tomar. Desarrolle técnicas de depuración y testeo efectivas. Tome en cuenta los datos. Esta trampa está básicamente enunciada por el antiguo dicho: “no podemos conocer el bosque guiándonos únicamente por unos cuantos árboles. espero que resulten tan útiles a ustedes como lo han sido para mi: • • El principio del reciclado. Use este proceso de “desarrollo incremental” para reducir las demandas cognitivas de la programación. El principio del esquema . o la correción de errores descubiertos. El principio de divide y venceras. para aislar errores y reducir el tiempo gastado buscando problemas. LUIS EVERARDO CASTRO SOLIS . Debemos considerar todas las alternativas.• Tomar las decisiones en cada nivel de abstracción cuidadosamente. En cada etapa de refinamiento.

Adopte un “complejo de persecución” para testear sus programas. o la corrección de errores descubiertos frecuentemente implica modificar la estructura completa. Marque el propósito de cada sección claramente. El principio propio. El principio de flexibilidad. Ninguna decisión es final. Cada revisión de la lógica del programa. Diseñe cada módulo con una sola entrada y una sola salida (como un nodo proceso propio). No se intimide con las estructura existentes. • • • • © D. y gaste tiempo determinando el rango completo de casos. Pruebe todos los posibles errores usando datos típicos y extremos. Los detalles deben ser enfocados solo cuando tengan relevancia directa en el proceso de refinamiento.R. Esto facilitará increíblemente el proceso de mantenimiento del programa. modificar. LUIS EVERARDO CASTRO SOLIS . Posponga los detalles en los niveles de diseño altos y concéntrese en las funciones primordiales del módulo. Produzca código autodocumentado de manera que sea fácil de entender. El principio del retraso . El principio literario .• El principio del complejo de persecución. utilizando interfases o listas de parámetros. testear y corregir.