Download Ventajas de la programación estructurada
Document related concepts
Transcript
Diagrama de flujo Es una representación gráfica de un algoritmo. Se utiliza en disciplinas como la programación, la economía, los procesos industriales y la psicología cognitiva. Estos diagramas utilizan símbolos con significados bien definidos que representan los pasos del algoritmo, y representan el flujo de ejecución mediante flechas que conectan los puntos de inicio y de término. Características Un diagrama de flujo siempre tiene un único punto de inicio y un único punto de término. Además, todo camino de ejecución debe permitir llegar desde el inicio hasta el término. Las siguientes son acciones previas a la realización del diagrama de flujo: Identificar las ideas principales a ser incluidas en el diagrama de flujo. Deben estar presentes el dueño o responsable del proceso, los dueños o responsables del proceso anterior y posterior y de otros procesos interrelacionados, otras partes interesadas. Definir qué se espera obtener del diagrama de flujo. Identificar quién lo empleará y cómo. Establecer el nivel de detalle requerido. Determinar los límites del proceso a describir. Los pasos a seguir para construir el diagrama de flujo son : Establecer el alcance del proceso a describir. De esta manera quedará fijado el comienzo y el final del diagrama. Frecuentemente el comienzo es la salida del proceso previo y el final la entrada al proceso siguiente. Identificar y listar las principales actividades/subprocesos que están incluidos en el proceso a describir y su orden cronológico. Si el nivel de detalle definido incluye actividades menores, listarlas también. Identificar y listar los puntos de decisión. Construir el diagrama respetando la secuencia cronológica y asignando los correspondientes símbolos. Asignar un título al diagrama y verificar que esté completo y describa con exactitud el proceso elegido. Ventajas de los diagrama de flujo Favorecen la comprensión del proceso a través de mostrarlo como un dibujo. El cerebro humano reconoce fácilmente los dibujos. Un buen diagrama de flujo reemplaza varias páginas de texto. Permiten identificar los problemas y las oportunidades de mejora del proceso. Se identifican los pasos redundantes, los flujos de los re-procesos , los conflictos de autoridad, las responsabilidades, los cuellos de botella, y los puntos de decisión. Muestran las interfaces cliente-proveedor y las transacciones que en ellas se realizan, facilitando a los empleados el análisis de las mismas. Son una excelente herramienta para capacitar a los nuevos empleados y también a los que desarrollan la tarea, cuando se realizan mejoras en el proceso. Tipos de diagramas de flujos Formato vertical: En él el flujo o la secuencia de las operaciones, va de arriba hacia abajo. Es una lista ordenada de las operaciones de un proceso con toda la información que se considere necesaria, según su propósito. Formato horizontal: En él, el flujo o la secuencia de las operaciones, va de izquierda a derecha. Formato panorámico: El proceso entero está representado en una sola carta y puede apreciarse de una sola mirada mucho más rápido que leyendo el texto, lo que facilita su comprensión, aun para personas no familiarizadas. Registra no solo en línea vertical, sino también horizontal, distintas acciones simultáneas y la participación de más de un puesto o departamento que el formato vertical no registra. Formato Arquitectónico: Describe el itinerario de ruta de una forma o persona sobre el plano arquitectónico del área de trabajo. El primero de los flujogramas es eminentemente descriptivo, mientras que los utilizados son fundamentalmente representativos. Algoritmo Los diagramas de flujo sirven para representar algoritmos de manera gráfica. En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo (del latín, dixit algorithmus y éste a su vez del matemático persa Al Juarismi1 ) es un conjunto preescrito de intrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien lo ejecute.2 Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son objeto de estudio de la algoritmia.1 En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver problemas. Algunos ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos en matemáticas son el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para obtener el máximo común divisor de dos enteros positivos, o el método de Gauss para resolver un sistema lineal de Lenguaje de programación Un lenguaje de programación es un idioma artificial diseñado para expresar computaciones que pueden ser llevadas a cabo por máquinas como las computadoras. Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana.1 Está formado de un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le llama programación. También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos: El desarrollo lógico del programa para resolver un problema en particular. Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa) Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina. Prueba y depuración del programa. Desarrollo de la documentación. Existe un error común que trata por sinónimos los términos 'lenguaje de programación' y 'lenguaje informático'. Los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo el HTML. (lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación sino un conjunto de instrucciones que permiten diseñar el contenido y el texto de los documentos) Permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural, tal como sucede con el lenguaje Léxico. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción del programa de forma colaborativa. Historia Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje específico conocido como código máquina, el cual la máquina comprende fácilmente, pero que lo hace excesivamente complicado para las personas. De hecho sólo consiste en cadenas interminables de números 1 y 0. (Binario) Para facilitar el trabajo, los primeros operadores de computadoras decidieron reemplazar los 1 y 0 por palabras o letras provenientes del inglés; éste se conoce como lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). En realidad escribir en lenguaje ensamblador es básicamente igual que hacerlo en lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que los números. La necesidad de recordar secuencias de programación para las acciones usuales llevó a denominarlas con nombres fáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. A esta secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se le llamó lenguaje ensamblador. Posteriormente aparecieron diferentes lenguajes de programación, los cuales reciben su denominación porque tienen una estructura sintáctica similar a los lenguajes escritos por los humanos, denominados también lenguajes de alto nivel. La primera programadora de computadora conocida fue Ada Lovelace, hija de Anabella Milbanke Byron y Lord Byron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera de sus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a esta programadora. A finales de 1953, John W. Backus sometió una propuesta a sus superiores en IBM para desarrollar una alternativa más práctica al lenguaje ensamblador para programar el computador central IBM 704. El histórico equipo Fortran de Backus consistió en los programadores Richard Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, Roy Nutt, Robert Nelson, Irving Ziller, Lois Haibt y David Sayre.2 El primer manual para el lenguaje Fortran apareció en octubre de 1956, con el primer compilador Fortran entregado en abril de 1957. Esto era un compilador optimizado, porque los clientes eran reacios a usar un lenguaje de alto nivel a menos que su compilador pudiera generar código cuyo desempeño fuera comparable al de un código hecho a mano en lenguaje ensamblador. En 1960, se creó COBOL, uno de los lenguajes usados aun en 2010 en informática de gestión. A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método más eficiente para programarlas. Entonces, se crearon los lenguajes de alto nivel, como lo fue el BASIC en las versiones introducidas en los microordenadores de la década de 1980. Mientras que una tarea tan sencilla como sumar dos números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una. Implementación La implementación de un lenguaje es la que provee una manera de que se ejecute un programa para una determinada combinación de software y hardware. Existen básicamente dos maneras de implementar un lenguaje: Compilación e interpretación. Compilación es la traducción a un código que pueda utilizar la máquina. Los programas traductores que pueden realizar esta operación se llaman compiladores. Éstos, como los programas ensambladores avanzados, pueden generar muchas líneas de código de máquina por cada proposición del programa fuente. Se puede también utilizar una alternativa para traducir lenguajes de alto nivel. En lugar de traducir el programa fuente y grabar en forma permanente el código objeto que se produce durante la compilación para utilizarlo en una ejecución futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar. A continuación, un programa intérprete, almacenado en el sistema operativo del disco, o incluido de manera permanente dentro de la máquina, convierte cada proposición del programa fuente en lenguaje de máquina conforme vaya siendo necesario durante el procesamiento de los datos. El código objeto no se graba para utilizarlo posteriormente. La siguiente vez que se utilice una instrucción, se la deberá interpretar otra vez y traducir a lenguaje máquina. Por ejemplo, durante el procesamiento repetitivo de los pasos de un ciclo o bucle, cada instrucción del bucle tendrá que volver a ser interpretada en cada ejecución repetida del ciclo, lo cual hace que el programa sea más lento en tiempo de ejecución (porque se va revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porque no se tiene que estar compilando a cada momento el código completo). El intérprete elimina la necesidad de realizar una compilación después de cada modificación del programa cuando se quiere agregar funciones o corregir errores; pero es obvio que un programa objeto compilado con antelación deberá ejecutarse con mucha mayor rapidez que uno que se debe interpretar a cada paso durante una ejecución del código. La mayoría de lenguajes de altonivel, permiten la programación multipropósito, sin embargo, muchos de ellos fueron diseñados para permitir programación dedicada, como lo fue PASCAL con las matemáticas en su comienzo. También, se han implementado lenguajes educativos infantiles como LOGO que mediante una serie de simples instrucciones, permitía mover una tortuga entre otras cosas. En el ámbito de infraestructura de internet, cabe destacar a Perl con un poderoso sistema de procesamiento de texto y una enorme colección de módulos. Técnica Para escribir programas que proporcionen los mejores resultados, cabe tener en cuenta una serie de detalles. Corrección. Un programa es correcto si hace lo que debe hacer tal y como se estableció en las fases previas a su desarrollo. Para determinar si un programa hace lo que debe, es muy importante especificar claramente qué debe hacer el programa antes de desarrollarlo y, una vez acabado, compararlo con lo que realmente hace. Claridad. Es muy importante que el programa sea lo más claro y legible posible, para facilitar así su desarrollo y posterior mantenimiento. Al elaborar un programa se debe intentar que su estructura sea sencilla y coherente, así como cuidar el estilo en la edición; de esta forma se ve facilitado el trabajo del programador, tanto en la fase de creación como en las fases posteriores de corrección de errores, ampliaciones, modificaciones, etc. Fases que pueden ser realizadas incluso por otro programador, con lo cual la claridad es aún más necesaria para que otros programadores puedan continuar el trabajo fácilmente. Algunos programadores llegan incluso a utilizar Arte ASCII para delimitar secciones de código. Otros, por diversión o para impedir un análisis cómodo a otros programadores, recurren al uso de código ofuscado. Eficiencia. Se trata de que el programa, además de realizar aquello para lo que fue creado (es decir, que sea correcto), lo haga gestionando de la mejor forma posible los recursos que utiliza. Normalmente, al hablar de eficiencia de un programa, se suele hacer referencia al tiempo que tarda en realizar la tarea para la que ha sido creado y a la cantidad de memoria que necesita, pero hay otros recursos que también pueden ser de consideración al obtener la eficiencia de un programa, dependiendo de su naturaleza (espacio en disco que utiliza, tráfico de red que genera, etc.). Portabilidad. Un programa es portable cuando tiene la capacidad de poder ejecutarse en una plataforma, ya sea hardware o software, diferente a aquélla en la que se elaboró. La portabilidad es una característica muy deseable para un programa, ya que permite, por ejemplo, a un programa que se ha desarrollado para sistemas GNU/Linux ejecutarse también en la familia de sistemas operativos Windows. Esto permite que el programa pueda llegar a más usuarios más fácilmente. Paradigmas Los programas se pueden clasificar por el paradigma del lenguaje que se use para producirlos. Los principales paradigmas son imperativos y declarativos. Los programas que usan un lenguaje imperativo especifican un algoritmo, usan declaraciones, expresiones y sentencias.3 Una declaración asocia un nombre de variable con un tipo de dato, por ejemplo: var x: integer; . Una expresión contiene un valor, por ejemplo: 2 + 2 contiene el valor 4. Finalmente, una sentencia debe asignar una expresión a una variable o usar el valor de una variable para alterar el flujo de un programa. Por ejemplo: x := 2 + 2; if x == 4 then haz_algo();. Una crítica común en los lenguajes imperativos es el efecto de las sentencias de asignación sobre una clase de variables llamadas "no locales".4 Los programas que usan un lenguaje declarativo especifican las propiedades que la salida debe conocer y no especifica cualquier detalle de implementación. Dos amplias categorías de lenguajes declarativos son los lenguajes funcionales y los lenguajes lógicos. Los lenguajes funcionales (como Haskell) no permiten asignaciones de variables no locales, así, se hacen más fácil, por ejemplo, programas como funciones matemáticas.4 El principio detrás de los lenguajes lógicos (como Prolog) es definir el problema que se quiere resolver (el objetivo) y dejar los detalles de la solución a el sistema de Prolog.5 El objetivo es definido dando una lista de sub-objetivos. Cada subobjetivo también se define dando una lista de sus sub-objetivos, etcétera. Si al tratar de buscar una solución, una ruta de sub-objetivos falla, entonces tal sub-objetivo se descarta y sistemáticamente se prueba otra ruta. La forma en la cual es programa se crea puede ser por medio de texto o de forma visual. En un lenguaje de programación visual, los elementos son manipulados gráficamente en vez de especificarse por medio de texto. Referencias 1. ↑ [Mark] (2010). O'Reilly Media, Inc. (ed.): «Learning Python, Fourth Edition» (libro). O'Reilly. Consultado el 11 de febrero de 2010. 2. ↑http://www.softwarepreservation.org/projects/FORTRAN/index.html#By_FOR TRAN_project_members 3. ↑ Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley, pp. 75. ISBN 0-201-56885-3. (en inglés). 4. ↑ a b Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley, pp. 213. ISBN 0-201-56885-3. (en inglés). 5. ↑ Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley, pp. 244. ISBN 0-201-56885-3. (en inglés). Resolución de problemas de programación La resolución de un problema mediante un ordenador consiste en el proceso que a partir de la descripción de un problema, expresado habitualmente en lenguaje natural y en términos propios del dominio del problema, permite desarrollar un programa que resuelva dicho problema. Este proceso exige los siguientes pasos: Análisis del problema. Diseño o desarrollo de un algoritmo. Transformación del algoritmo en un programa (codificación). Ejecución y validación del programa. Los dos primeros pasos son los más difíciles del proceso. Una vez analizado el problema y obtenido un algoritmo que lo resuelva, su transformación a un programa de ordenador es una tarea de mera traducción al lenguaje de programación deseado. Análisis del problema Cuando un usuario plantea a un programador un problema a resolver mediante su ordenador, por lo general ese usuario tendrá conocimientos más o menos amplios sobre el dominio del problema, pero no es habitual que tenga conocimientos de informática. Por ejemplo, un contable que necesita un programa para llevar la contabilidad de una empresa será un experto en contabilidad (dominio del problema), pero no tiene por qué ser experto en programación. Del mismo modo, el informático que va a resolver un determinado problema puede ser un experto programador, pero en principio no tiene por qué conocer el dominio del problema; siguiendo el ejemplo anterior, el informático que hace un programa no tiene por qué ser un experto en contabilidad. Por ello, al abordar un problema que se quiere resolver mediante un ordenador, el programador necesita de la experiencia del experto del dominio para entender el problema. Al final, si se quiere llegar a una solución satisfactoria es necesario que: El problema esté bien definido con el máximo detalle Las especificaciones de las entradas y salidas del problema, deben ser descritas también en detalle: o ¿Qué datos son necesarios para resolver el problema? o ¿Qué información debe proporcionar la resolución del problema? Diseño del algoritmo Un algoritmo consiste en una especificación clara y concisa de los pasos necesarios para resolver un determinado problema, pero para poder diseñar algoritmos es necesario disponer de una notación, que llamaremos ‘notación algorítmica’, que permita: Describir las operaciones puestas en juego (acciones, instrucciones, comandos,...) Describir los objetos manipulados por el algoritmo (datos/informaciones) Controlar la realización de las acciones descritas, indicando la forma en que estas se organizan en el tiempo Para poder describir cualquier tipo de acción de las que intervienen en un algoritmo, diversos autores proponen el uso de un conjunto de construcciones lógicas (secuencia, decisión e iteración) con las que es posible escribir cualquier programa. Lo que sigue a continuación es la descripción de las diferentes construcciones disponibles para el diseño de algoritmos. Acciones elementales Se entiende por acciones elementales aquellas que el ordenador es capaz de realizar y que serán de dos tipos: Aritmético – lógicas: Operaciones que, a partir de unos determinados datos, realizan un cálculo aritmético (suma, resta, multiplicación,...) o un cálculo lógico (mayor que, menor que, igual que,...).Las primeras devuelven un valor numérico (4, -5.67,...) y las segundas un valor lógico (verdadero o falso). De entrada – salida: Acciones que permiten capturar datos para su posterior tratamiento (las de entrada) y guardar los resultados de dicho tratamiento (las de salida). Secuencia de acciones elementales Cuando en un algoritmo se deben ejecutar varias acciones sucesivamente, éstas se describen una detrás de otra según el orden en que deban ejecutarse. Si se desea se puede emplear algún tipo de símbolo para separar dos acciones consecutivas. En el siguiente ejemplo se nuestra la descripción de n acciones separadas por punto y coma (símbolo que habitualmente se emplea como separador). Acción 1; Acción 2; ... Acción n; Composición condicional Cuando en un algoritmo se quiere indicar que cierta acción sólo se debe ejecutar bajo cierta condición se indica del siguiente modo: Si Condición Entonces Acción; FinSi Sólo si la Condición (operación lógica) es verdadera se ejecutará la Acción. En este caso, la Acción puede referirse tanto a una acción elemental como a un conjunto de ellas. Composición condicional doble (alternativa) [editar] En ocasiones, se deben ejecutar unas acciones u otras dependiendo de la ocurrencia de una determinada condición. Esta especificación se realiza del siguiente modo: Si Condición Entonces Acción A; SiNo Acción B; FinSi Dependiendo de si la Condición es verdadera o falsa se ejecutará la Acción A o la Acción B respectivamente. De forma análoga a como ocurría en el caso anterior, tanto la Acción A como la Acción B pueden referirse a una acción elemental o a un conjunto de ellas. Composición condicional múltiple También es posible que a la hora de especificar la ejecución de una acción haya que escoger ésta entre varias dependiendo del valor de una determinada variable (o indicador). Este caso se expresa del siguiente modo: Seleccionar Indicador Caso Valor 1: Acción 1; Caso Valor 2: Acción 2; ... Caso Valor n: Acción n; [EnOtroCaso: Acción X;] FinCaso En esta construcción Indicador debe tener un determinado valor que en caso de coincidir con alguno de los n valores provocará la ejecución de la acción asociada a dicho valor. Si el valor del Indicador no coincidiera con ninguno de los especificados se ejecutará la Acción X. No tiene por qué haber una Acción X para cuando el Indicador' no coincida con ninguno de los n valores; en ese caso, si el Indicador' no coincide con ningún valor no se ejecutaría ninguna acción. Al igual que en los casos anteriores, todas las acciones que aparecen en esta estructura (Acción 1, Acción 2,..., Acción n y Acción X) pueden referirse a una única acción o a un conjunto de ellas. Composición iterativa o bucle Cuando una acción o conjunto de acciones debe ejecutarse varias veces se recurre a una estructura iterativa o bucle. En este tipo de estructuras se necesita una condición que determine cuando terminan las iteraciones. Dependiendo de si esa condición se evalúa al principio o al final de la estructura y de si la condición para que las iteraciones continúen debe ser verdadera o falsa, se pueden definir cuatro construcciones iterativas distintas: La condición de La condición de terminación ha de terminación ha de ser ser FALSA VERDADERA (Estructura 1) Condición al Mientras Condición principio de la Hacer estructura Acción; FinMientras Condición al final de la estructura (Estructura 3) Hacer Acción; Mientras Condición; (Estructura 2) Hasta Condición Hacer Acción; FinHasta (Estructura 4) Hacer Acción; Hasta Condición; Sobre las cuatro construcciones que se acaban de presentar cabe hacer las siguientes observaciones: Si en las estructuras 1 y 2, cuando se evalúa la ‘Condición’, ésta toma por primera vez un valor tal que no permita ejecutar la ‘Acción’ (FALSO en la 1 y VERDADERO en la 2), ésta no se ejecutará ninguna vez. Es decir, puede ocurrir que la ‘Acción’, en las estructuras 1 y 2, no se ejecute nunca. En las estructuras 3 y 4, al estar la ‘Condición’ de terminación al final, la ‘Acción’ se ejecutará antes de que la condición se evalúe por primera vez, por lo que aunque la ‘Condición’ tome un valor tal que no se permita realizar más iteraciones, la ‘Acción’ se ejecutará al menos una vez. Si las ‘Condiciones’ de las estructuras 1 y 2 son complementarias, es decir, que siempre que una es verdadera la otra es falsa y viceversa (ejemplo: [a > b] y [a ≤ b] son condiciones complementarias), entonces ambas estructuras son equivalentes ya que en ambas la ‘Acción’ se ejecutará el mismo número de veces. De forma análoga, si las ‘Condiciones’ de las estructuras 3 y 4 son complementarias también ambas estructuras serán equivalentes. Existe una construcción especial para indicar una repetición de acciones que se suele emplear cuando se quiere que dicha repetición se realice un número determinado de veces: Para i = 1 Hasta n Hacer Acción; FinPara En este caso la ‘Acción’ se repetirá n veces e ‘i’ será una variable que tomará todos los valores entre 1 y n (ambos inclusive) en cada una de las sucesivas repeticiones. Esta construcción, aunque de apariencia diferente a las anteriores, se podría expresar como un caso particular de la estructura 1 del siguiente modo: i = 1; Mientras i <= n Hacer Acción; i = i + 1; FinMientras En este caso la condición de finalización del bucle es que la variable ‘i’ sea mayor que ‘n’ y siempre, al finalizar la ejecución de la ‘Acción’, ‘i’ se incrementa en una unidad antes de volver a evaluar la ‘Condición’ para el nuevo valor de ‘i’. Estructuras de control En lenguajes de programación, las estructuras de control permiten modificar el flujo de ejecución de las instrucciones de un programa. Con las estructuras de control se puede: De acuerdo a una condición, ejecutar un grupo u otro de sentencias (If-ThenElse y Select-Case) Ejecutar un grupo de sentencias mientras exista una condición (Do-While) Ejecutar un grupo de sentencias hasta que exista una condición (Do-Until) Ejecutar un grupo de sentencias un número determinado de veces (For-Next) Etc Todas las estructuras de control tienen un único punto de entrada y un único punto de salida. Las estructuras de control se puede clasificar en : secuenciales, iterativas y de control avanzadas. Esto es una de las cosas que permite que la programación se rija por los principios de la programación estructurada. Los lenguajes de programación modernos tienen estructuras de control similares. Básicamente lo que varía entre las estructuras de control de los diferentes lenguajes es su sintaxis, cada lenguaje tiene una sintaxis propia para expresar la estructura. Otros lenguajes ofrecen estructuras diferentes, como por ejemplo los comandos guardados. Tipos de estructura de control Algunas estructuras de control en el lenguaje Java Antecendentes El término "estructuras de control", viene del campo de la ciencia computacional. Cuando se presentan implementaciones de Java para las estructuras de control, nos referimos a ellas con la terminología de la Especificación del lenguaje Java, que se refiera a ella como instrucciones. Ejecución secuencial Pero por lo general las instrucciones se ejecutan una después de la otra, en el orden en que están escritas, es decir, en secuencia. Este proceso se conoce como ejecución secuencial. Transferencia de control En Java, como en otros lenguajes de programación por excelencia como C y/o C++, el programador puede especificar que las siguientes instrucciones a ejecutarse tal vez no sea la siguiente en secuencia. Esto se conoce como transferencia de control. Hay que tener en cuenta que la instrucción goto es una palabra reservada pero no se utiliza ni se recomienda. Un programa bien estructurado no necesita de esta instrucción. Si sabes programar no utilizaras goto. Estructura de control: selección if simple Se trata de una estructura de control que permite redirigir un curso de acción según la evaluación de una condición simple, sea falsa o verdadera. Por ejemplo: Escribir un programa en Java que compare dos números e indique si cuál es mayor, menor, mayor y/o igual, menor y/o igual, o si son iguales: String strComparacion = ""; ... if( numero1 == numero2 ) strComparacion += numero1 + " == " + numero2; if( numero1 > numero2 ) strComparacion += numero1 + " > " + numero2; if( numero1 < numero2 ) strComparacion += numero1 + " < " + numero2; if( numero1 >= numero2 ) strComparacion += numero1 + " >= " + numero2; if( numero1 <= numero2 ) strComparacion += numero1 + " <= " + numero2; System.out.println(strComparacion); ... If-Then-Else Si la condición es verdadera, se ejecuta el bloque de sentencias 1, de lo contrario, se ejecuta el bloque de sentencias 2. IF (Condición) THEN (Bloque de sentencias 1) ELSE (Bloque de sentencias 2) END IF Select-Case Se evalúa la expresión, dando como resultado un número. Luego, se recorren los "Case" dentro de la estructura buscando que el número coincida con uno de los valores. Es necesario que coincidan todos sus valores. Cuando se encuentra la primera coincidencia, se ejecuta el bloque de sentencias correspondiente y se sale de la estructura Select-Case. Si no se encuentra ninguna coincidencia con ningún valor, se ejecuta el bloque de sentencias de la sección "Case Else". SELECT (Expresión) CASE Valor1 (Bloque de sentencias 1) CASE Valor2 (Bloque de sentencias 2) CASE Valor n (Bloque de sentencias n) CASE ELSE (Bloque de sentencias "Else") END SELECT Do-While Mientras la condición sea verdadera, se ejecutarán las sentencias del bloque. DO WHILE (Condición) (Bloque de sentencias) LOOP que también puede expresarse: WHILE (Condición) (Bloque de sentencias) WEND Do-Until Se ejecuta el bloque de sentencias, hasta que la condición sea verdadera DO (Bloque de sentencias) LOOP UNTIL (Condición) For-Next Primero, se evalúan las expresiones 1 y 2, dando como resultado dos números. La variable del bucle recorrerá los valores desde el número dado por la expresión 1 hasta el número dado por la expresión 2. El bloque de sentencias se ejecutará en cada uno de los valores que tome la variable del bucle. FOR (Variable) = (Expresión1) TO (Expresión2) STEP (Salto) (Bloque de sentencias) NEXT Estructuras anidadas Las estructuras de control básicas pueden anidarse, es decir pueden ponerse una dentro de otra. Estructura For-Next dentro de una estructura If-Then-Else IF A > B THEN FOR X = 1 TO 5 (Bloque de sentencias 1) NEXT ELSE (Bloque de instrucciones 2) END IF Estructura If-Then-Else dentro de estructura For-Next FOR x = 10 TO 20 STEP 2 IF A = C THEN (Bloque de instrucciones) ELSE (Bloque de instrucciones) END IF NEXT Estructura For-Next que está dentro de estructura Do-While DO WHILE A > 0 FOR X = 1 TO 10 (Bloque de instrucciones) NEXT A=A-1 LOOP Estructura Do-While que está dentro de estructura For-Next for(i=1;i<=10;i++) { do { /* Bloque de instrucciones */ a--; } while(a>0); } Estructura If-Then dentro de estructura For-Next dentro de estructura Do-While Do While A > 0 For X = 1 to 10 If A = C Then (Bloque de instrucciones1) Else (Bloque de instrucciones2) End If Else Nextif A=A-1 Loop Bucle (programación) Un bucle o ciclo, en programación, es una sentencia que se realiza repetidas veces a un trozo aislado de código, hasta que la condición asignada a dicho bucle deje de cumplirse. Generalmente, un bucle es utilizado para hacer una acción repetida sin tener que escribir varias veces el mismo código, lo que ahorra tiempo, deja el código más claro y facilita su modificación en el futuro. El bucle y los condicionales representan la base de la programación estructurada. Es una evolución del código ensamblador, donde la única posibilidad de iterar un código era establecer una sentencia jump (que en los lenguajes de programación fue sustituida por el "ir a" o GOTO). Los tres bucles más utilizados en programación son el bucle while, el bucle for y el bucle repetir. Ejemplo en código C de sentencias repetidas: int var=0; //código que puede ser sustituido por un bucle var = var + 2; //var igual a 2 (puede ser sustituído por var+=2) var = var + 2; //var igual a 4 var = var + 2; //var igual a 6 var = var + 2; //var igual a 8 var = var + 2; //var igual a 11 // fin de código que puede ser sustituido por un bucle printf("el resultado es %i", var ); Ejemplo con un bucle: int var=0; //Código para el bucle int i; // este es el Bucle for for(i=0;i<10;i+=2) { var += 2; } printf("el resultado es %i", var); Algunos lenguajes de programación tienen sentencias que permiten "escapar" de los bucles sin llegar a la condición de fin, como el romper o el devolver. Ejemplo escapando de un bucle en Visual Basic 1: Dim h&, var& var = 0 'Codigo del Bucle do var = var + 2 if var = 10 then goto escape end if loop 'Codigo para salir del bucle escape: print "El resultado es " & var Ejemplo escapando de un bucle en Visual Basic 2: Dim h&, var& var = 0 'Codigo del Bucle do var = var + 2 if var = 10 then exit do end if loop 'Codigo para salir del bucle print "El resultado es " & var Bucle for El bucle for o ciclo for es una estructura de control en la que se puede indicar el número máximo de iteraciones. Está disponible en casi todos los lenguajes de programación imperativos. Elementos del bucle 'Variable de control': prácticamente un mandato impuesto por el uso habitual es utilizar la letra i como variable de control, o bien sus sucesoras en caso de bucles anidados. El uso de esta letra críptica quizás a primera vista es sin embargo una excelente forma de aportar agilidad de lectura al código por su uso tan extensivo. Como raras veces los bucles anidados superan las tres dimensiones (por una sencilla cuestión de explosión exponencial), las letras i, j y k suelen ser las únicas relacionadas con este uso. En C se define en el primer parámetro de la instrucción junto con la inicialización (opcional). Inicialización de la variable de control: en pseudolenguaje se pide explicitarlo (es la sección := ValorInicial), sin embargo, otros lenguajes más permisivos como C no lo requieren de forma obligatoria. De todos modos, la práctica de utilizar variables de control que no se inicializan en el bucle no es recomendada para la legibilidad del código. En C se define en el primer parámetro del bucle junto con la variable de control. Condición de control: en pseudolenguaje se ve representado por el valor final que puede tomar la variable de control (la sección A ValorFinal). En C es el segundo parámetro y puede ser cualquier condición (ni siquiera es obligación que esté la variable de control, aunque una vez más, esto no se considera una buena práctica). Incremento: en pseudolenguaje se toma por defecto el valor 1, aunque puede explicitarse por medio de la sentencia PASO = ValorPaso cualquier número entero (léase bien entero, o sea que técnicamente podemos decrementar). En C es el último parámetro. Cuerpo: es lo que se hará en cada iteración, pueden ser una o más instrucciones. En pseudolenguaje pesa la restricción de no poder alterar el valor de la variable de control; esto no es requerido en C, pero no se considera una buena práctica. Usos Su uso principal se orienta a los vectores, pudiendo modificar, agregar, eliminar o consultar datos que se encuentren según el índice. Por esto último, una condición mínima del vector es que debe ser ordenado, por que si se intenta leer un dato inexistente, esto genera un error de programación. For en pseudolenguaje La principal diferencia de un bucle PARA con respecto a los bucles MIENTRAS Y REPETIR, es que puede determinarse al comienzo del bucle cuántas veces se iterará el mismo, lo cual muchas veces puede redundar en una optimización del código por parte de los compiladores. Los condicionales constituyen junto con los bucles los pilares de la programación estructurada, y su uso es una evolución de una sentencia de lenguaje ensamblador que ejecutaba la siguiente línea o no en función del valor de una condición. El bucle PARA se ha convertido en el bucle más ampliamente utilizado en la programación, ya que con la evolución de los lenguajes la mayoría de las condiciones de fin MIENTRAS NoFinDeTabla(tabla) HACER PróximoRegistro(tabla) HacerAlgo(ElementoActual(tabla)) FIN MIENTRAS Es lo mismo decir: PARA i := 0 a CantidadRegistros(tabla) - 1, PASO = 1 PróximoRegistro(tabla) HacerAlgo(ElementoActual(tabla)) FIN PARA Otro uso común es utilizar los bucles PARA para recorrer vectores de dos o más dimensiones, en cuyo caso se anidan estas iteraciones. SEUDOLENGUAJE Vector a[3][4][2]. // Estamos indicando un vector de 3 dimensiones y 24 elementos en total. PARA i:= 0 A 2 HACER PARA j:= 0 A 3 HACER PARA k:= 0 A 1 HACER HacerAlgo(a[i][j][k]) FIN PARA FIN PARA FIN PARA Ejemplo de PARA en pseudolenguaje PARA VariableControl := ValorInicial A ValorFinal, PASO = Incremento Cuerpo FIN PARA donde VariableControl, ValorInicial, ValorFinal y Paso son enteros. La(s) instrucción(es) del cuerpo se ejecutará(n) (ValorFinal - ValorInicial + 1) veces, o sea que va desde ValorInicial a ValorFinal inclusive. Ejemplo en C # include <stdio.h> int main() { int vector[10], i; for(i = 0; i < 10; i++) { vector[i] = i; } } En la definición del for, tenemos que la variable de control i se inicializa en un valor 0, luego se entrega la condición de control que debe ser falsa durante su ejecución, para completar el ciclo; y por último, tenemos el incrementador en una unidad. Si por ejemplo en la condición colocamos i < 11, entonces el ciclo for se ejecutará desde [0...10], lo cual, al intentar acceder al elemento vector[10], esto generará error, ya que el vector (por definición) va desde [0..(n-1)]. Ejemplo anterior escrito en Lexico tarea { los objetos vector[10], i son cantidades variando i desde 0 hasta 9 haga copie i en vector[i] } Bucle Por Cada (For Each) Este bucle es una evolución del concepto del bucle Para en algunos lenguajes. Se utiliza para recorrer estructuras repetitivas de datos de forma más simple y ágil. El bucle For Each puede describirse genéricamente (en pseudolenguaje) de la siguiente manera: P OR CADA elemento DE tipo EN conjunto HACER Cuerpo FIN FOR EACH Elemento: es el nombre de la variable u objeto que toma el elemento iterado en el cuerpo del bucle. Tipo de Dato: es el tipo de variable o la clase a la que pertenece el objeto que se quiere iterar. Conjunto: es la estructura de datos que se quiere iterar. El uso más típico es con vectores o -en programación orientada a objetos- clases del tipo Colección. Cuerpo: es lo que se hará en cada iteración, pueden ser una o más instrucciones. Si bien no se impone una obligación al respecto, lo más común es que en este Cuerpo exista alguna operación sobre el elemento iterado. Necesidad de una nueva estructura de control Esta estructura surge como una innovación en los lenguajes para permitir un código más ágil y legible en una situación que es una de las principales causas del uso del bucle PARA: aplicar la misma operación sobre todos los elementos de un vector, y no necesitar conocer la posición del elemento en el vector. Esta estructura con el bucle PARA se resuelve de la siguiente manera: Con el bucle POR CADA esto se reduce a: POR CADA x DE tipo EN Vector HACER x = AlgunaOperación(x) FIN PARA Las ventajas de utilizar la estructura POR CADA son las siguientes: 1. No es necesario llamar a una función que obtenga el tamaño del vector 2. No es necesario utilizar la incómoda notación de subíndices para referirnos al valor en cuestión, sobre todo teniendo en cuenta que si utilizamos esta estructura es porque no necesitamos el valor del índice. 3. Nos permite hacer un chequeo en tiempo de compilación sobre el tipo de dato que representa el elemento. El bucle POR CADA no es un sustituto del PARA, es una mejora para el muy frecuente caso anteriormente mencionado. La diferencia esencial entre el bucle PARA y el POR CADA es que en el primero guía su iteración por una variable que se incrementa hasta cierto punto de corte; en cambio en el segundo lo que guía la iteración es el recorrido de todos los elementos de un vector. Ciertamente podemos transformar cualquier POR CADA en un PARA, pero transformar un bucle PARA en un bucle POR CADA requeriría inicializar y controlar manualmente las variables de control, con lo cual se perdería nuevamente legibilidad en el código. Por tanto, cuando en un lenguaje se nos da la posibilidad de utilizar ambas estructuras, la elección del POR CADA debe hacerse en aquellos casos para los que fue pensado: aplicar la misma operación a todos los elementos de un vector sin importar el orden en que se hagan; si bien no es necesario que la variable elemento sea utilizada en el cuerpo del bucle, su ausencia denota con seguridad una mala elección de estructura de control. Bucle while El Bucle while o bucle mientras es una estructura de la mayoría de los lenguajes de programación estructurados cuyo propósito es repetir un bloque de código mientras una condición se mantenga verdadera. Contenido [ocultar] 1 Sintaxis 2 Condición o 2.1 Sentencias Comparativas o 2.2 Particularidades de lenguajes 3 Ejemplo (usando sintaxis de C) 4 Ejemplo (usando el lenguaje Lexico) Sintaxis La sintaxis en pseudocódigo es la siguiente: Condición La condición ha de ser una sentencia que devuelva un valor booleano, y esta puede ser el valor booleano en sí, verdadero(true) si la condición se cumple, o falso si esta no se cumple(false). También puede contener el nombre de una variable booleana, y el valor de la expresión dependerá de su contenido. Se debe tener en cuenta que además de las variables también puede haber llamadas a funciones que devuelvan un valor. Sentencias Comparativas La forma más obvia tal vez, y la más usada sin duda, son las sentencias comparativas, que usan los operandos igual, diferente, menor o igual, mayor o igual, menor y mayor. En el caso del lenguaje C, se utilizan los siguientes símbolos para representar las comparaciones anteriores: ==, !=, <=, >=, <, >, Particularidades de lenguajes En algunos lenguajes, se pueden utilizar variables no booleanas en la comparación: Por ejemplo, si la variable vale 0 será como si la condición no se cumpliera, y siempre que sea diferente de 0, se considerará que la condición se cumple. Ejemplo (usando sintaxis de C) int Tecla = 0; while(Tecla == 0) { Tecla = readkey(); /* Intentamos leer una pulsación de tecla*/ } En este ejemplo el programa va a leer la pulsación de una tecla mientras su valor sea igual a cero, en el momento en el que se pulse una Tecla distinta, se detendrá. Ejemplo (usando el lenguaje Lexico) Genera y muestra los primeros 10 números naturales: tarea { el objeto número_natural es una cantidad copie 0 en número_natural mientras número_natural < 10 haga: { copie número_natural + 1 en número_natural muestre número_natural } } Bucle repetir El bucle repetir comprueba la condición de finalización al final del cuerpo del bucle, y si ésta es cierta continua con el resto del programa, a veces esto resulta más adecuado. Contenido [ocultar] 1 Sintaxis 2 En lenguajes de programación 3 Ejemplos 4 Reemplazable en casi todos los casos 5 Véase también Sintaxis La sintaxis en pseudocódigo es la siguiente: El cuerpo del bucle es el fragmento de programa que será repetido en cada iteración. La condición es una variable o una función reducible a valor booleano. En lenguajes de programación En la mayoría de los lenguajes de programación seria: REPEAT … … UNTIL (condición) Esta estructura de control siempre permite la ejecución del cuerpo del bucle cuando menos una vez, y lo finaliza cuando la condición es cierta. Ejemplos Una situación típica en la que resulta cómoda el empleo de esta sentencia es la que se produce cuando al finalizar cada iteración se pregunta al operador si desea continuar con otra nueva. En estos casos, el programa siempre realiza la primera iteración y según la condición de salida la repite. Otro caso también típico son los filtros de entrada de datos, donde se comprueba si el valor de la entrada esta en un rango de valores. Admite un número del 3 al 7, si no pregunta de nuevo REPEAT WriteString(“Escribe el numero”) ReadInt(numero) UNTIL (numero >= 3) AND (numero <= 7) Reemplazable en casi todos los casos Dentro de la programación estructurada, el bucle repetir puede ser sustituido por un bucle mientras, del siguiente modo: Repetir (Cuerpo del bucle) Hasta que (condición) Puede escribirse (Cuerpo del bucle) Mientras NO(condición) (Cuerpo del bucle) fmientras Estos dos fragmentos de código son equivalentes, porque ambos presentan el mismo resultado en la mayoría de los casos. De todos modos, el bucle repetir es útil cuando se desean realizar las acciones que están dentro al menos en una ocasión. Bucle repetir El bucle repetir comprueba la condición de finalización al final del cuerpo del bucle, y si ésta es cierta continua con el resto del programa, a veces esto resulta más adecuado. Contenido [ocultar] 1 Sintaxis 2 En lenguajes de programación 3 Ejemplos 4 Reemplazable en casi todos los casos 5 Véase también Sintaxis La sintaxis en pseudocódigo es la siguiente: El cuerpo del bucle es el fragmento de programa que será repetido en cada iteración. La condición es una variable o una función reducible a valor booleano. En lenguajes de programación En la mayoría de los lenguajes de programación seria: REPEAT … … UNTIL (condición) Esta estructura de control siempre permite la ejecución del cuerpo del bucle cuando menos una vez, y lo finaliza cuando la condición es cierta. Ejemplos Una situación típica en la que resulta cómoda el empleo de esta sentencia es la que se produce cuando al finalizar cada iteración se pregunta al operador si desea continuar con otra nueva. En estos casos, el programa siempre realiza la primera iteración y según la condición de salida la repite. Otro caso también típico son los filtros de entrada de datos, donde se comprueba si el valor de la entrada esta en un rango de valores. Admite un número del 3 al 7, si no pregunta de nuevo REPEAT WriteString(“Escribe el numero”) ReadInt(numero) UNTIL (numero >= 3) AND (numero <= 7) Reemplazable en casi todos los casos Dentro de la programación estructurada, el bucle repetir puede ser sustituido por un bucle mientras, del siguiente modo: Repetir (Cuerpo del bucle) Hasta que (condición) Puede escribirse (Cuerpo del bucle) Mientras NO(condición) (Cuerpo del bucle) fmientras Estos dos fragmentos de código son equivalentes, porque ambos presentan el mismo resultado en la mayoría de los casos. De todos modos, el bucle repetir es útil cuando se desean realizar las acciones que están dentro al menos en una ocasión. Bucle infinito Bucle infinito en programación es aquel ciclo que se repite de forma indefinida ya que su condición para finalizar nunca se cumple. Por definición un bucle debe contener condiciones que establezcan cuándo empieza y cuándo acaba, de manera que, mientras las condiciones se cumplan, ejecute una secuencia de código de manera repetitiva. En el caso de ciclo infinito, como la condición de finalización no se alcanza, el bucle sigue ejecutando el segmento de código indefinidamente. Contenido [ocultar] 1 Ejemplo de ciclo infinito en C (WHILE) 2 Ejemplo de ciclo infinito en C (FOR) 3 Bucle infinito en Visual Basic (While) 4 Véase también Ejemplo de ciclo infinito en C (WHILE) #include <stdio.h> int main(void) { int x = 0; while(x < 10) { printf("No acabaré nunca!\n"); } return 0; } Se observa que la sentencia printf("No acabaré nunca\n"); siempre se ejecuta porque la condición del bucle while() siempre es cierta, no existe una condición de salida que obligue al bucle a finalizar. Exactamente, no se alcanza la condición de salida. Si en el ejemplo anterior, dentro del bloque de código del bucle while, se encontrase la instrucción x++; el bucle hubiera ejecutado 10 veces y hubiera terminado. También existe esta posibilidad con el while(true). En C: #include <stdio.h> int main(void) { while(1) { printf("No acabaré nunca!\n"); } return 0; /*De todas maneras no llega nunca a ejecutarse esta línea*/ } Ejemplo de ciclo infinito en C (FOR) #include <stdio.h> int main(void) { int cont; for (cont = 0; cont < 5; cont++) { if (cont == 4) cont = 0; printf("%d\n",cont); } return 0; } En la sentencia "printf" se muestra en pantalla 0,1,2,3,0,1,2,3,0,.... infinitamente y mientras no llegue a 5 no se cerrará el programa. Y también podemos crear un ciclo infinito con el for de esta forma: #include <stdio.h> int main(void) { for (;;) printf("Bucle infinito\n"); return 0; } Bucle infinito en Visual Basic (While) Public function suma2(a, b) As Double suma2 = a + b While (suma2 >= 10) suma2 = suma2 + 1 Wend Siempre que la suma de a y b sea superior o igual a 10 Programación estructurada La programación estructurada es una forma de escribir programas de ordenador (programación de computadora) de manera clara. Para ello utiliza únicamente tres estructuras: secuencia, selección e iteración; siendo innecesario el uso de la instrucción o instrucciones de transferencia incondicional (GOTO, EXIT FUNCTION, EXIT SUB o múltiples RETURN). Hoy en día las aplicaciones informáticas son mucho más ambiciosas que las necesidades de programación existentes en los años 1960, principalmente debido a las aplicaciones gráficas, por lo que las técnicas de programación estructurada no son suficientes. Ello ha llevado al desarrollo de nuevas técnicas, tales como la programación orientada a objetos y el desarrollo de entornos de programación que facilitan la programación de grandes aplicaciones. Contenido [ocultar] 1 Orígenes de la programación estructurada o 1.1 Estructura secuencial o 1.2 Estructura selectiva o de selección o 1.3 Estructura iterativa o 1.4 Anidamiento 2 Ventajas de la programación estructurada 3 Inconvenientes de la programación estructurada 4 Véase también Orígenes de la programación estructurada A finales de los años 1960 surgió una nueva forma de programar que no solamente daba lugar a programas fiables y eficientes, sino que además estaban escritos de manera que facilitaba su comprensión posterior. El teorema del programa estructurado, demostrado por Böhm-Jacopini, demuestra que todo programa puede escribirse utilizando únicamente las tres instrucciones de control siguientes: Secuencia Instrucción condicional. Iteración (bucle de instrucciones) con condición al principio. Solamente con estas tres estructuras se pueden escribir todos los programas y aplicaciones posibles. Si bien los lenguajes de programación tienen un mayor repertorio de estructuras de control, éstas pueden ser construidas mediante las tres básicas. Estructura secuencial Una estructura de programa es secuencial si se ejecutan una tras otra a modo de secuencia, es decir que una instrucción no se ejecuta hasta que finaliza la anterior. Ejemplo: INPUT x INPUT y auxiliar= x x= y y= auxiliar PRINT x PRINT y Esta secuencia de instrucciones permuta los valores de x e y, con ayuda de una variable auxiliar, intermedia. 1º Guardamos una copia del valor de x en auxiliar. 2º Guardamos el valor de y en x, se pierde el valor anterior de x pero no importa porque tenemos una copia en auxiliar. 3º Guardamos en y el valor de auxiliar, que es el valor inicial de x. El resultado es el intercambio de los valores de x e y, en tres operaciones secuenciales. Estructura selectiva o de selección La estructura selectiva permite la realización de una instrucción u otra según un criterio, solo una de estas instrucciones se ejecutara. Ejemplo: IF a > b THEN PRINT a ; " es mayor que " ; b ELSE PRINT a ; " no es mayor que " ; b END IF Esta instrucción selectiva puede presentar dos mensajes, uno a es mayor que b, y el otro a no es mayor que b, solo uno de ellos será presentado, según el resultado de la comparación de a y b, si el resultado de a > b es cierto, se presenta el primer mensaje, si es falso el segundo, las palabras IF, THEN, ELSE, END IF; son propias de la instrucción (palabra reservadas) que tienen un significado en el lenguaje, sirven de separadores, y el usuario no debe utilizarlas salvo para este fin. IF señala el comienzo de la instrucción condicional, y se espera que después esté la condición de control de la instrucción. THEN señala el fin de la condición, y después estará la instrucción a realizar si la condición es cierta. ELSE separa la instrucción que se ejecutará si la condición es cierta de la que se ejecutará si es falsa. END IF indica que la instrucción condicional finaliza y el programa seguirá su curso. Ampliemos un poco el ejemplo anterior: IF a > b THEN PRINT a ; " es mayor que " ; b ELSEIF a < b THEN PRINT a ; " es menor que " ; b ELSE PRINT a ; " es igual que " ; b END IF Este ejemplo nos permite considerar situaciones en las que tenemos más de dos alternativas. En este caso hemos considerado tres, pero hay situaciones en las que deben considerarse más casos y para ellos se puede repetir las veces que queramos la parte ELSEIF. Estructura iterativa Un bucle iterativo o iteración de una secuencia de instrucciones, hace que se repitan mientras se cumpla una condición, en un principio el número de iteraciones no tiene porque estar determinado. Ejemplo: a= 0 b= 7 WHILE b > a DO PRINT a a= a + 1 WEND Esta instrucción tiene tres palabras reservadas WHILE, DO y WEND. WHILE: señala el comienzo del bucle y después de esta palabra se espera la condición de repetición, si la condición es cierta se pasa al cuerpo del bucle, si no al final de la instrucción mientras. DO: señala el final de la condición, lo que esté después será el cuerpo del bucle. WEND: señala el final del cuerpo del bucle y de la instrucción WHILE. El bucle mientras, se repite mientras la condición sea cierta, esta condición se comprueba al principio por lo que el cuerpo del bucle puede que no se ejecute nunca, cuando la condición es falsa en un principio, o que se repita tantas veces como sea necesario, mientras la condición sea cierta. En el ejemplo tenemos dos variables a y b que al iniciarse el bucle tienen los valores a=0 y b=7. La condición del bucle es b > a. Cuando a=0 y b=7. la condición es cierta, en el cuerpo del bucle se escribe el valor de a en pantalla y se incrementa a en una unidad. Entonces a=1 y b=7. ... ... Cuando a=6 y b=7. la condición es cierta, se escribe el valor de a en pantalla y se incrementa en una unidad. Resultando que a=7 y b=7. Entonces la condición es falsa y la instrucción WHILE finaliza. La salida por pantalla de este ejemplo seria 0 1 2 3 4 5 6 Anidamiento El cuerpo de cualquier estructura puede ser una instrucción simple u otra estructura, que a su vez puede anidar a otra. Ejemplo: IF a > b THEN auxiliar= a a= b b= auxiliar ELSE REM nada END IF PRINT a ; b Ventajas de la programación estructurada 1. Los programas son más fáciles de entender, ya que pueden ser leídos de forma secuencial, sin necesidad de hacer seguimiento a saltos de línea (GOTO) dentro de los bloques de código para entender la lógica. 2. La estructura del programa es clara, puesto que las instrucciones están más ligadas o relacionadas entre sí. 3. Reducción del esfuerzo en las pruebas. El seguimiento de los fallos o errores del programa ("debugging") se facilita debido a la estructura más visible, por lo que los errores se pueden detectar y corregir más fácilmente. 4. Reducción de los costos de mantenimiento de los programas. 5. Programas más sencillos y más rápidos (ya que es más fácil su optimización). 6. Los bloques de código son auto explicativos, lo que facilita la documentación. 7. Los GOTO se reservan para construir las instrucciones básicas. Aunque no se usan de forma directa, por estar prohibida su utilización, están incluidas implícitamente en las instrucciones de selección e iteración. 8. Un programa escrito de acuerdo a estos principios no solamente tendrá una mejor estructura sino también una excelente presentación. 9. La programación estructurada ofrece estos beneficios, pero no se la debe considerar como una panacea ya que el desarrollo de programas es, principalmente, una tarea de dedicación, esfuerzo y creatividad. Inconvenientes de la programación estructurada El principal inconveniente de este método de programación es que se obtiene un único bloque de programa, que cuando se hace demasiado grande puede resultar problemático su manejo; esto se resuelve empleando la programación modular, definiendo módulos interdependientes programados y compilados por separado (en realidad esto no es necesario, pero es recomendable para su mantenimiento y funcionalidad). En realidad, cuando se programa hoy en día (inicios del siglo XXI) se suelen utilizar, tanto las técnicas de programación estructurada como las de programación modular, de forma conjunta y por lo tanto es posible que cuando uno haga referencia a la programación estructurada esté considerando también las técnicas de modularización. Un método un poco más sofisticado es la programación por capas, en la que los módulos tienen una estructura jerárquica en la que se pueden definir funciones dentro de funciones o de procedimientos.