Bienvenidos a este nuevo capítulo de este Curso Gratis de Programación #4 Programación Estructurada. La Programación Estructurada Es un método disciplinado de escribir programas. Con la programación estructurada, los programadores hicieron que la lógica de sus programas fuese más fácil de seguir.
Esto significaba que era más fácil localizar y corregir errores y hacer cambios a esos programas según lo requerido. Pero incluso los programas estructurados son a menudo consumidores de tiempo para escribir, difíciles de entenderé inflexibles, dado que son diseñados para cumplir una tarea específica y de un modo específico.
¿Te gustaría enterarte de cuando lanzamos descuentos y nuevos cursos?
Uno de los principales beneficios de Pascal sobre BASIC fue su diseño para apoyar los conceptos de programación estructurada. “En el caso de lenguas anteriores como BASIC, la estructura de un programa puede ser bastante compleja e intentar seguir la Secuencia de ejecución (cómo se ejecuta un programa) era como tratar de desenredar un plato de espaguetis”. Los lenguajes de alto nivel considerados estructurados trabajan con tres estructuras básicas:
- Estructura secuencial: las sentencias se ejecutan una tras otra en el orden en que se escriben.
- Estructura repetitiva: un grupo de declaraciones debe ser ejecutado repetidamente.
- Estructura de bifurcación: se selecciona una alternativa que contiene una o más sentencias para su ejecución a partir de un número de 1 a n alternativas, según la estructura.
Dentro de un programa estructurado
estas estructuras de control están organizadas para que el programa pueda leerse de arriba a abajo. Cada estructura permite solo una entrada y una salida. La indentación de las instrucciones en un programa ayuda a alguien que lee un programa a entender su lógica más fácilmente. El término programación estructurada ahora se relaciona no sólo con la lógica de control del programa, sino con cómo se diseñan y desarrollan los programas.
Hoy en día, las personas que hablan de programación estructurada, a menudo se refieren a una forma sistemática de analizar los problemas informáticos y diseñar soluciones llamadas de arriba a abajo. En la programación de arriba abajo, el problema se descompone en una serie de problemas más pequeños, y a cada uno de ellos se los resuelve.
Una vez que se resuelven los problemas más pequeños, las soluciones se combinan para resolver el problema más grande. A medida que el uso de computadoras y programas se fue extendiendo, aparecieron nuevos desafíos. se diseña programas con un enfoque de arriba hacia abajo, se comienza escribiendo las especificaciones del problema a resolver y gradualmente se va refinando la solución dividiéndola en partes, que también pueden ser divididas en más partes.
Programación estructurada. Una forma de escribir los programas
Siguiendo las reglas asociadas, con la programación estructurada, los programadores hicieron que la lógica de sus programas fuese más fácil de seguir. Esto significaba que era más fácil localizar y corregir errores y hacer cambios a esos programas según lo requerido. Pero la realidad es que incluso los programas estructurados son a menudo consumidores de tiempo para escribir, difíciles de entender e inflexibles, dado que son diseñados para cumplir una tarea específica y de un modo específico. En 1970, Pascal fue desarrollado por Niklaus Wirth en el Instituto Federal de Tecnología de Suiza.
Uno de los principales beneficios de Pascal sobre BASIC fue su diseño para apoyar los conceptos de programación estructurada. “En el caso de lenguas anteriores como BASIC, la estructura de un programa puede ser bastante compleja e intentar seguir la Secuencia de ejecución era como tratar de desenredar un plato de espaguetis”. Los lenguajes de alto nivel considerados estructurados usan dentro del programa algunas sentencias que controlan el flujo de información, a menudo denominados
Las estructuras de control, que son tres, a saber:
- Estructura secuencial: las sentencias se ejecutan una tras otra en el orden en que se escriben.
- Estructura repetitiva: un grupo de declaraciones debe ser ejecutado repetidamente.
- Estructura de bifurcación: se selecciona una alternativa que contiene una o mas sentencias para su ejecución a partir de un número de 1 a n alternativas, según la estructura.
Dentro de un programa estructurado, estas estructuras de control están organizadas para que el programa pueda leerse de arriba a abajo. Cada estructura permite solo una entrada y una salida. La indentación de las instrucciones en un programa ayuda a alguien que lee un programa a entender su lógica más fácilmente. El término programación estructurada ahora se relaciona no sólo con la lógica de control del programa, sino con cómo se diseñan y desarrollan los programas.
Hoy en día, las personas que hablan de programación estructurada, a menudo se refieren a una forma sistemática de analizar los problemas informáticos y diseñar soluciones llamadas de arriba a abajo. En la programación de arriba abajo, el problema se descompone en una serie de problemas más pequeños, y a cada uno de ellos se los resuelve. Una vez que se resuelven los problemas más pequeños, las soluciones se combinan para resolver el problema más grande.
Enfoque top-down de la programación estructurada
- El código inicial esta arriba y el final abajo
- Comprensión sencilla
- Se puede dividir en operaciones
- Módulos referenciales.
La programación estructurada se basa en refinamiento sucesivos: Se plantea una operación como un todo y se divide en segmentos más sencillos o de menor complejidad. Una vez terminado todos los segmentos del programa, se unifica las aplicaciones realizadas por el pool de programadores.
Combinando esquemas sencillos se pueden llegar a construir sistemas amplios y complejos pero de fácil entendimiento. se da por supuesto que los datos son mantenidos centralizados en un programa principal (Main program) y que si un procedimiento es cambiado, puede causar algún efecto que altere la forma en que otro procedimiento funcione, si estos dos comparten los datos. Se dice en este entorno que los datos son globales a todos los procedimientos.
Los datos son centralizados y accedidos por programas.
Programación estructurada:
El diseño de un algoritmo debe ser fácil de comprender para facilitar su posterior codificación. Es un paradigma de programación orientado a mejorar la claridad, calidad y tiempo de desarrollo de un programa utilizando únicamente subrutinas y tres estructuras: secuencia, selección (if y switch) e iteración (bucles for y while) El teorema del programa estructurado indica que todo diseño de algoritmo puede ser implementado utilizando estas estructuras de programación.
considera innecesario y contraproducente el uso de la instrucción de transferencia incondicional (GOTO), que podría conducir a “código espagueti”, que es mucho más difícil de seguir y de mantener, y era la causa de muchos errores de programación.
Estructura secuencial:
las instrucciones se ejecutan una tras otra, a modo de secuencia lineal; es decir, que una instrucción no se ejecuta hasta que finaliza la anterior, no se bifurca ni se repite el flujo del programa. Ejemplo en QBASIC:
Estructura selectiva:
permite que la ejecución del programa se bifurque a una instrucción (o conjunto de ellas). Según un criterio o condición lógica sólo uno de los caminos en la bifurcación será el tomado para ejecutarse.
Las palabras clave IF, THEN, ELSE y END IF constituyen la estructura de la instrucción condicional.
Estructura iterativa:
hace que se repita su ejecución mientras se cumpla una condición. El número de iteraciones normalmente está determinado por un cambio en la condición dentro del mismo bucle, aunque puede ser forzado o explícito por otra condición.
Esta instrucción tiene tres palabras reservadas: DO, WHILE y LOOP, que conforman un bucle WHILE.
Anidamiento
El cuerpo de cualquier estructura puede tener instrucciones simples u otras estructuras, que a su vez pueden contener a otras.
En el ejemplo anterior hay una estructura WHILE anidada dentro de una estructura IF. –>
Ventajas de la programación estructurada comparada con el modelo anterior (hoy llamado despectivamente código espagueti).
Los programas son más fáciles de entender, pueden ser leídos de forma secuencial y no hay necesidad de hacer engorrosos seguimientos en saltos de líneas (GOTO) dentro de los bloques de código para intentar entender la lógica. La estructura de los programas es clara, puesto que las instrucciones están más ligadas o relacionadas entre sí. Reducción del esfuerzo en las pruebas y depuración.
El seguimiento de los fallos o errores del programa (“debugging”) se facilita debido a su estructura más sencilla y comprensible, por lo que los errores se pueden detectar y corregir más fácilmente. Reducción de los costos de mantenimiento.
La depuración, durante la fase de mantenimiento, modificar o extender los programas resulta más fácil. Los programas son más sencillos y más rápidos de confeccionar. Se incrementa el rendimiento de los programadores,
Programación estructurada de bajo nivel
En un bajo nivel, los programas estructurados con frecuencia están compuestos de simples estructuras de flujo de programa jerárquicas. Estas son secuencia, selección y repetición: “Secuencia” se refiere a una ejecución ordenada de instrucciones.
En “selección”, una de una serie de sentencias es ejecutada dependiendo del estado del programa. Esto es usualmente expresado con palabras clave como if..then..else..endif, switch, o case.
En la “repetición” se ejecuta una sentencia hasta que el programa alcance un estado determinado, o las operaciones han sido aplicadas a cada elemento de una colección. Ente expresado con palabras clave como while, repeat, for o do..until.
A menudo se recomienda que cada bucle sólo debe tener un punto de entrada (y en la programación estructural original, también sólo un punto de salida, y pocos lenguajes refuerzan esto).
Un lenguaje es descrito como estructurado en bloques cuando tiene una sintaxis para encerrar estructuras entre palabras clave tipo corchete.
Es posible hacer la programación estructurada en cualquier lenguaje de programación, aunque es preferible usar algo como un lenguaje de programación procedimental.
Ventajas de la Programación estructurada
- Los programas son más fáciles de entender. Pueden ser leídos de forma secuencial (no GOTO)
- La estructura del programa es clara. Las instrucciones están más ligadas o relacionadas entre sí.
- La estructura es más visible. Los errores se pueden detectar y corregir más fácilmente y rápidamente-
- Reduce los costos de mantenimiento de los programas.
- Hace que los programas sean más sencillos y rápidos
- Al ser más simples, facilita la documentación.
- Mejora la presentación de los programas
Origen
A mitad de los años 40 se reconoció que un programa y sus datos podían residir en la memoria de una computadora. La arquitectura de Von Neuman es en la que se basan nuestros procesadores, una maquina puede almacenar un programa y los datos del programa, está organizada de la siguiente manera:
- Unidad de control: Se encargan de las etapas de captación y decodificación de una instrucción
- Unidad lógica-aritmética o ALU: Se encarga de realizar operaciones matemáticas y de lógica
- Memoria: Dónde se almacena nuestro programa
- Dispositivo de entrada: Los datos de entrada
- Dispositivo de salida: Salida de datos
Arquitectura de Von Neumann
Estructuras de Control:
- Unidad Lógica
- Memoria
- Dispositivo entrada
- Dispositivo salida
Características del lenguaje imperativo
- Estructuras de control.
- Manejo de errores y abstracciones.
- Abstracción de procedimientos.
- Expresión y asignación.
- Soporte para estructura de datos.
Algunos lenguajes
- Fortran
- Pascal
- Cobol
- Ada
- C
- Fortran
- ALGOL
- COBOL
- Basic
- Simula
- Java
- C++
- Python
- PHP
Las funciones o procedimientos son subalgoritmos del algoritmo original. Hay diferentes motivos para dividir un algoritmo en funciones o procedimientos:
Las funciones o procedimientos evitan la repetición de instrucciones al reutilizarlas mediante una llamada a la función o procedimiento, por lo que el algoritmo se vuelve más compacto.
Los procedimientos y las funciones son algoritmos más fáciles de diseñar, corregir, mantener y modificar. Las funciones o procedimientos ocultan los detalles de su especificación, de manera que para utilizarlas sólo es necesario conocer su interfaz.
Algoritmo – Serie Fibonacci
Estructuras de control
Teorema de Böhm y Jacopini (1966): Cualquier programa puede diseñarse e implementarse utilizando únicamente las tres construcciones estructuradas (secuencia, selección e iteración; esto es, sin sentencias goto).
En 1968 Dijkstra advirtió el daño de la expresión “GOTO”. Controlan la ejecución de las instrucciones de un programa (especifican el orden en el que se realizan las acciones). sólo deben tener un punto de entrada y un punto de salida. La programación estructurada…
- mejora la productividad de los programadores.
- mejora la legibilidad del código resultante.
- La ejecución de un programa estructurado progresa disciplinadamente, en vez de saltar de un sitio a otro de forma impredecible
- Gracias a ello, los programas…
- resultan más fáciles de probar
- se pueden depurar más fácilmente
- se pueden modificar con mayor comodidad
Programación Procedural
Se deriva de la programación estructurada agrupando el código en procedimientos, estos son un tipo de funciones o subrutinas a través de un sistema de pilas.
Antes de comenzar a programar es preciso saber desarrollar algoritmos. Como se ha visto en el tema anterior, un algoritmo es una descripción detallada de los pasos a seguir para resolver una tarea. Los pasos han de ser operaciones capaces de ser llevadas a cabo por el operador al cual va dirigido el algoritmo. A fin de poder abordar problemas complejos es preciso aprender a diseñar correctamente algoritmos y sus diagramas respetando las reglas de la programación estructurada. Para ello se presentan en este tema una serie de algoritmos básicos los cuales se han dividido en varios grupos.
Fundamentos de la programación estructurada
Es difícil hacer un resumen de las ideas de la programación estructurada a lectores que no tienen cierta experiencia en programación. Esto sucede porque la programación estructurada pretende evitar cierto tipo de situaciones que aparecen en programas grandes y medianos, pero que no se advierten en los ejemplos dados a principiantes. Una de estas situaciones es la siguiente: un programador escribe un diagrama de flujo tal y como aparece en la parte derecha de la figura. Transcurrido cierto tiempo, el mismo programador es requerido para realizar una modificación en el mismo.
Este intenta modificar el diagrama, pero la tarea le resulta ardua. Analizando los motivos por los que el trabajo no avanza con rapidez se puede observar que: Es difícil hallar el punto en el cual hay que eliminar un bloque o insertar uno nuevo, pues todo esta enmarañado. Incluso aunque el diagrama tuviera una mejor disposición gráfica, cuesta trabajo ver si una modificación de una parte dar ‘a resultados indeseables en otra, debido al gran número de interconexiones que hay.
Diagrama de flujo estructurado (izquierda) y no estructurado (derecha). Y los problemas no acaban ahí. Tras realizar los cambios, el programador deberá probar el nuevo programa para comprobar su correcto funcionamiento. Cada vez que se detecte un error deberá volver a repetir el tedioso proceso de modificación. Los problemas descritos no serían tales si el programador hubiera podido escribir el diagrama de flujo de forma parecida a la de la figura (izquierda), en la que se aprecia que no existen cruces de líneas y que cada módulo tiene una entrada y una salida.
Flujo lineal
Los diagramas se dice que tienen flujo lineal cuando no existen conexiones de vuelta atrás o laterales. El flujo lineal se puede conseguir restringiendo las uniones entre bloques constructivos a estructuras de entrada única y salida única. Es decir, usando para la confección del diagrama de flujo grupos de bloques a los cuales llega solo una flecha y de los cuales parte solo una flecha.
La secuencia, la selección entre alternativas y la iteración forman un conjunto suficiente de módulos constructivos para describir cualquier algoritmo. Es decir, es posible siempre realizar un diagrama de flujo que contiene solo las estructuras citadas. En la figura se tienen tales estructuras; se puede ver que son de entrada única y salida única.
Construcciones o uniones de bloques permitidas para programas estructurados.
Estas estructuras permitidas reciben los nombres que se indican a continuación . De izquierda a derecha en la citada figura 7 se tiene un par de bloques formando una secuencia, una bifurcación y bloques articulados en una estructura disyuntiva, una bifurcación con conexión hacia atrás formando un bucle o estructura repetitiva con salida en cola y, finalmente, una bifurcación formando una estructura repetitiva con salida en cabeza. En lo sucesivo se usaran estas estructuras (y ninguna otra) para realizar los diagramas de flujo, pero antes de pasar a los ejemplos es preciso comentar como se va a producir la descomposición del problema global en módulos.
Análisis descendente
En ocasiones se presenta la programación estructurada como un conjunto de reglas a seguir. En realidad no hay una definición exacta de programación estructurada, por lo que las reglas son solo una aproximación. Una idea importante de la programación estructurada es el análisis ´ descendente o jerarquizado. Consiste este en identificar las funciones o tareas a cumplir por el programa desde un punto de vista global y proceder luego a descomponer estas funciones en otras menores.
Estas a su vez se vuelven a descomponer en un proceso que termina cuando se ´alcanza el nivel del lenguaje o código usado. De este modo, el diseño del programa se realiza por niveles. Se comienza por el nivel más general y se termina por lo particular o concreto. El resultado del análisis descendente es un conjunto de diagramas que describen el algoritmo con un nivel de detalle creciente. En un primer nivel el diagrama de flujo puede tomar la forma dada en la figura en la parte superior. En un segundo nivel, cada uno de los módulos es detallado en un diagrama aparte. El proceso continua mientras existan bloques que necesiten explicaciones adicionales.
El análisis descendente aplicado a la confección de diagramas de flujo. Es importante que antes de pasar al siguiente nivel se compruebe la validez del diagrama actual. Para ello se ha de comprobar que las construcciones utilizadas pertenecen al conjunto de las estructuras permitidas.
Cálculos en secuencia
Los cálculos en secuencia no presentan dificultad alguna desde el punto de vista algorítmico. Los diagramas de flujo resultantes son lineales, sin bifurcaciones ni ciclos o repeticiones, y por tanto de fácil creación. Un programa evoluciona de modo lineal cuando realiza toda la secuencia de instrucciones de forma continua, sin saltos en la ejecución. Este es el caso presentado en el ejemplo de la suma de dos números (ver figura). La realización y representación en diagrama de flujo de estos programas es muy simple.
Diagrama de flujo de un algoritmo para sumar dos números.
Estructuras selectivas
Las disyunciones o estructuras selectivas se construyen mediante un bloque bifurcación conectado dos módulos que después vuelven a unirse. En el interior de cada módulo puede haber otras estructuras permitidas: secuencias, iteraciones, etc. Las bifurcaciones permiten tomar un camino o su alternativa, permitiendo que el programa discurra por uno de dos caminos posibles en función de condiciones.
Un ejemplo muy simple es el siguiente: leer un número real por teclado y escribir el valor absoluto del mismo. Una forma de resolver el programa es mediante el diagrama de flujo de la figura. La idea es hacer que la secuencia de ejecución pase por la escritura del número o del número cambiado de signo en función de que sea positivo o negativo. Nota importante: en este libro la palabra positivo se ha de entender como ”mayor que cero” quiere esto decir que el número cero no forma parte del conjunto de los números positivos.
Diagrama de flujo con ruptura de secuencia.
Las bifurcaciones se pueden encadenar para dar solución a situaciones más complejas. Por ejemplo considérese la función: NC(x, y), con (x, y) ∈ IR2 %→ c ∈ {1, 2, 3, 4}. Esta función calcula el número de cuadrante en que se encuentra el punto (x, y) de IR2. Se desea desarrollar un algoritmo que lea las coordenadas x e y de un punto del plano (suponiendo que x += 0 y que y += 0) y calcule y escriba r =NC(x, y). El diagrama de la figura presenta una posible solución mediante el uso de bifurcaciones en cascada.
Programa que escribe el cuadrante en el cual se sitúa el punto en el plano (x, y).
Estructuras cíclicas
Muchos algoritmos requieren la repetición de operaciones cierto número de veces. Al conjunto de operaciones que se repite se le llama cuerpo del proceso repetitivo. Un ciclo (o proceso repetitivo o bucle) queda completamente definido por el cuerpo y la condición de parada o salida. Cada vez que el programa en ejecución pasa por el cuerpo del bucle se dice que ha realizado una iteración.
La estructura denominada proceso repetitivo o bucle permite plasmar en diagramas de flujo este tipo de procesos. La bifurcación al final del bloque hace las veces de control de salida. En ocasiones es conveniente poner el control de salida en la cabeza del bucle, de este modo se puede salir del bucle sin haber realizado ninguna operación. Ambos tipos de proceso iterativos se muestran en la figura.
Estructuras repetitivas con control de salida en la cola (diagrama de la izquierda) y control de salida en la cabeza (diagrama de la derecha).
Ejemplo
A modo de ejemplo considérese la tarea de construir un vector v de dimensión n de forma que la componente k-esima tenga el valor vk = k2 – 4. Por ejemplo, para n = 2 el vector resulta ser v = [–3, 0], para n = 3 se obtiene v = [–3, 0, 5]. El problema que se quiere resolver es calcular las componentes de v para un valor concreto de la dimensión n que se proporcione. Dicho de otro modo, el algoritmo tendrá que requerir un valor concreto de n y calcular las componentes v1 a vn. Se supondrá que n es entero y positivo.
El diagrama de la figura presenta una posible solución al problema haciendo uso de una estructura repetitiva con salida en la cola. Es muy conveniente dedicar unos minutos a comprobar que el algoritmo resuelve el problema. Para ello pruebe a seguir mediante cálculos a mano los pasos indicados en el diagrama para n = 1, n = 2, n = 3. Una vez realizado este ejercicio no le resultar ‘a difícil determinar que el algoritmo ha de funcionar necesariamente para todo n > 0.
Construcción de un vector mediante proceso iterativo con salida en la cola.
En el diagrama de la figura se muestra otro diagrama que utiliza un bucle con salida en la cabeza. Compruebe también mediante pruebas a mano que este diagrama realiza la misma tarea que el del ejemplo anterior. Debido a la sencillez de este ejemplo puede parecer que ambas maneras de realizar una estructura cíclica son equivalentes de un modo trivial.
Aunque es cierto que se puede pasar de una a otra esto no siempre se logra con facilidad. Además hay que tener en cuenta que algunos lenguajes de programación están orientados a usar una de ellas, por ejemplo en el caso de MATLAB siempre se prefiere la comprobación de salida en cabeza.
El bloque constructivo
llamado modulo puede usarse para mejorar el aspecto visual de los diagramas de flujo. En particular si un diagrama consta de varias estructuras repetitivas puede ser interesante dedicar un módulo a cada uno de ellos. Para ilustrar esta idea considere el problema cuyo enunciado es ”Se ha de leer una lista de n números reales, siendo n un entero que ha de leerse previamente. Posteriormente se escribir ‘a la lista en orden inverso. Se supondrá que n > 0”.
La figura muestra el diagrama de flujo de una posible solución. Dicho diagrama incluye dos módulos que se detallan en diagramas separados. La tabla de objetos es ´única pues los diagramas correspondientes a los módulos se interpretan como parte del diagrama general.
Construcción de un vector mediante proceso iterativo con salida en cabeza.
A todos los efectos se trata por tanto de un ´único diagrama con la particularidad de que algunas partes (los módulos) se detallan de forma separada. Puede verse que los módulos ayudan a comprender mejor el algoritmo. Cada parte del diagrama puede abarcarse de un golpe de vista, facilitando su comprensión y el análisis de su validez.
Ciclos dobles
El cuerpo de una estructura repetitiva no es necesariamente un módulo simple sino que puede contener otras estructuras. En el punto anterior se han expuesto diversos ejemplos en los cuales el cuerpo contiene exclusivamente estructuras en secuencia. No existe ningún impedimento para que el cuerpo contenga estructuras selectivas o incluso otros ciclos. Cuando un ciclo contiene a otro se obtiene una estructura doblemente repetitiva2.
En cada iteración del ciclo externo se realizan varias repeticiones del cuerpo del ciclo interno. Las repeticiones dobles son especialmente apropiadas para trabajar con matrices A ∈ IRm×n. En muchas situaciones es preciso recorrer los elementos de la matriz para realizar de este modo la lectura, escritura o cualquier otro cálculo. Se plantea en estos casos el problema de considerar todos los posibles elementos akj de la matriz. Conviene recordar que el elemento gen érico akj tiene dos subíndices: k (filas) y j (columnas) que varían en los intervalos: k = 1, 2, …, m y j = 1, 2, …, n.
1La sucesión de Fibonacci comienza con a1 = 1, a2 = 1 y posteriormente cada termino ak es la suma de los dos anteriores ak-1 + ak-2 para k > 2. 2 Llamada frecuentemente bucles anidados por ser estas palabras la traducción literal de nested loops. Para trabajar con matrices se puede emplear un ciclo dentro de otro. Normalmente el ciclo externo recorre el ´índice de filas y el interno el ´índice de columnas. En la figura 7.11 se presenta un diagrama de flujo que puede utilizarse para recorrer la matriz.
Diagrama de flujo que permite recorrer una matriz gracias a dos estructuras repetitivas.
Comprobación del funcionamiento de algoritmos
La comprobación del buen funcionamiento de un algoritmo es una tarea difícil y para la cual no existen reglas generales. En muchos casos sin embargo el sentido común y el razonamiento lógico permiten realizar pruebas que permiten asegurar la corrección. Existen dos formas de enfrentarse a la tarea de decidir si un algoritmo dado es verdaderamente una solución al problema planteado: la prueba del algoritmo con un conjunto de datos controlado y la prueba mediante razonamiento lógico matemático.
Pruebas con datos controlados
La prueba del algoritmo con datos controlados consiste en preparar una serie de valores de los datos para los cuales se conoce el resultado correcto. Posteriormente se siguen los pasos del algoritmo y se comprueba si los resultados que el algoritmo produce coinciden con los resultados conocidos de antemano. Como ejemplo considere el problema de escribir un uno en caso de que cierto entero x sea primo y cero en otro caso.
Ahora, Si se desea comprobar si cierto algoritmo A es correcto puede ser buena idea probar A con x = 2 y comprobar que el resultado es que se escribe un uno. Si el resultado no es este no hace falta comprobar más, pues un solo fallo sirve para invalidar A. Si el resultado es correcto se puede pasar a probar A con x = 3 y repetir el proceso. Es fácil ver que este método tiene el grave inconveniente de que hacen falta tantas pruebas como posibles valores distintos puede tomar el dato x.
En muchas ocasiones se recurre al método de probar el algoritmo solo en algunos valores elegidos. Por ejemplo con varios números primos y otros no primos tanto grandes como pequeños. Hay que resaltar que este tipo de pruebas no permite validar el algoritmo completamente. Esto es así porque un algoritmo puede dar resultados correctos en muchas situaciones y sin embargo no ser correcto universalmente pues puede que contenga errores que no se han manifestado con esos datos.
Razonamientos por inducción
En muchos casos es posible aplicar el método maten ático de prueba inductiva. Por ejemplo cuando el dato de un algoritmo puede tomar cualquier valor n ∈ IN. El razonamiento inductivo se lleva a cabo probando (en el sentido matemático) que si el algoritmo funciona para un valor n cualquiera entonces debe funcionar también para el valor siguiente n + 1.
La prueba se completa utilizando el algoritmo con n = 1 y comprobando que el resultado es satisfactorio. Mediante inducción se obtiene que entonces el algoritmo debe funcionar correctamente para n = 2 y de aquí que también sea correcto para n = 3, etc. Este tipo de razonamiento permite decidir la corrección de algoritmos que contienen estructuras iterativas.
En estos casos los puntos que causan mayores problemas son las entradas y salidas de los ciclos de repetición. Por este motivo hay que prestar mucha atención a los valores iniciales asignados a ´índices y contadores antes de entrar en el ciclo, a la actualización de los mismos dentro del cuerpo que se repite y finalmente a la condición de salida del ciclo. El principal inconveniente de este método de corrección es que es posible que la prueba maten ática contenga errores, proporcionando como resultado que se etiquete como correcto un algoritmo que no lo es. Por este motivo es conveniente siempre realizar la prueba por ambos métodos.
Modularidad
Si el diseño del algoritmo se ha llevado a cabo de forma adecuada el diagrama ha de consistir en una serie de módulos (o funciones) de pequeño tamaño que se unen para formar módulos mayores. El análisis de algoritmos se realiza entonces de una forma cómoda pues basta con probar cada módulo de forma independiente. Cuando se han comprobado los módulos de un cierto nivel puede pasarse al nivel superior.
Las comprobaciones de un nivel superior pueden llevarse a cabo sin necesidad de volver a utilizar o analizar los módulos de niveles inferiores. En lugar de ello es posible sustituir mentalmente dichos módulos por mecanismos que automáticamente proporcionan los resultados correctos. De este modo el análisis se lleva a cabo de forma jerárquica lo cual permite avanzar con mayor rapidez y confianza.
Análisis de la estructura
Es posible ahora poner un par de ejemplos para aclarar las ideas sobre la programación estructurada. Considere en primer lugar el diagrama que aparece en la parte izquierda de la figura. A la vista como están unidos los bloques ¿sabría decir si es un diagrama bien estructurado?. Para responder a esta cuestión resulta conveniente agrupar los bloques que forman secuencias en módulos, de forma que la estructura subyacente quede expuesta con mayor claridad.
Esto se ha realizado en el diagrama del centro. Finalmente, en el diagrama de la derecha se han sustituido las secuencias por módulos, quedando al descubierto una estructura que coincide con una de las estructuras permitidas (véase de nuevo la figura 7.2). Esta estructura es un bucle con salida en cola y aparece aquí combinado en secuencia por arriba y abajo con otros dos módulos.
Análisis de la estructura de un diagrama.
Este sencillo análisis permite determinar que la estructura del diagrama está de acuerdo con las normas establecidas en este capítulo. Observe que para discutir sobre la estructura de un diagrama no es preciso conocer las operaciones que se realizan en cada bloque. En efecto, la estructura depende exclusivamente de las uniones entre bloques y no de su contenido. Considere ahora el diagrama que se muestra en la parte izquierda de la figura.
A primera vista no parece haber nada que indique que el diagrama no sea estructurado (al menos no lo parece para el principiante en esta materia). En la parte central y derecha de la figura se pone de manifiesto que esto es un error. En efecto, el recuadro a trazos intenta encerrar una estructura del tipo repetición o bucle con salida en cola. Sin embargo el recuadro no tiene solamente una entrada y una salida como se requiere.
De hecho, el recuadro es cortado por dos flechas de entrada y por una de salida. Si uno intenta encerrar la estructura inferior mediante un recuadro (véase parte derecha de la figura) ocurre nuevamente que no se cumple la regla de una ´única entrada y una ´única salida. En este caso hay dos salidas y una sola entrada.
Análisis de la estructura de un diagrama.
Ejercicios
Utilizando las ideas que se han presentado en los puntos anteriores desarrolle algoritmos que den solución a los problemas siguientes:
1. Leer un número real x y calcular y escribir r =| x |3.
2. Calcular el coste de una llamada telefónica que ha durado t minutos sabiendo que si t < 1 el coste es de 0.4 euros mientras que para duraciones superiores el coste es 0.4 + (t – 1)/4 euros.
3. Leer un número real del teclado. Calcular el valor de p sabiendo que si x está en el intervalo (2, 8] el resultado p toma el valor uno, en caso contrario toma el valor cero. Escribir posteriormente el valor de p.
4. Leer un valor x del teclado. Calcular y escribir el valor y = f(x) siendo f una función definida a trozos del siguiente modo:
5. Leer las componentes de un vector de IR2 (x e y). Calcule el valor de r que se define como r =NC(x, y) si x ≠ 0, y ≠ 0 y r = 0 si x = 0 o si y = 0.
No te detengas, sigue avanzando
Aquí tienes un propósito para este 2024 que debes considerar seriamente: si has querido mejorar tus habilidades en hacking, Ciberseguridad y programación ahora es definitivamente el momento de dar el siguiente paso. ¡Desarrolla tus habilidades aprovechando nuestros cursos a un precio increíble y avanza en tu carrera!
Python Practicando. Desde 0 hasta Desarrollador en Python
Aprende Python, donde iniciamos desde 0, sin conocimientos previos hasta desarrollar aplicaciones con mucha practica!
Calificación: 4,6 de 5 (20.833 calificaciones) 249.493 estudiantes Creado por Alvaro Chirou • 1.800.000+ Enrollments Worldwide, Walter Coto || +450,000 Estudiantes Español.
Lo que aprenderás
- Ejercitar la lógica de programación
- Comprender cómo la vida cotidiana puede ser fácilitada o simulada con código
- Aprender programación desde cero
- Usar Visual Studio Code como Editor de Código
- Conocer y aprender el lenguaje de programación Python
- Ser un programador desde cero, sin conocimiento en otro lenguaje o con algo previo
- Mejorar las habilidades de programación, mejorar procesos y fácilitar la comprensión de código
- Preparar un entorno dónde programar en Python
- Operaciones aritméticas y jerarquía de Python
- Manejo de cadenas en Python
- Digitar datos por teclado con Python
- Mostrar Datos por Pantalla al usuario en Python
- Operadores Relacionales de Python
- Operadores Lógicos de Python
- Condicionales en Python
- Estructuras de Datos: Listas, Tuplas y Diccionarios
- Iteraciones y bucles repetitivos de Python
- Segmentar Código y hacerlo más eficaz con las Funciones en Python
- Gestionar posibles errores que puedan dar tus programas
- Programación Orientada a Objetos
- HTML y CSS
- Selenium Web Driver con Python
- Ejercitar todo lo Aprendido con Ejercicios
Este curso incluye:
- 25,5 horas de vídeo bajo demanda
- 21 artículos
- 148 recursos descargables
- Acceso en dispositivos móviles y TV
- Certificado de finalización
Python es Hoy uno de los lenguajes más utilizados por Excelencia.
Esto se debe por su simpleza al momento de Desarrollar aplicaciones.
Por su capacidad de procesamiento a altas velocidades con grandes volúmenes de información.
Es un increíble lenguaje con el cual si no sabes programar, podrás aprender.
Y si ya sabes desarrollar, te aconsejo aprenderlo ya que en el mercado cada vez se solicitan más desarrolladores en Python.
Aspirar al trabajo que desean, o mejorar sus ingresos con un aumento de salario.
Python se utiliza para muchisimas cosas como:
- Machine Learning
- Data Science
- Inteligencia Artificial.
- Y mucho más!
En este curso te acompañare en el proceso por el cual aprenderás las bases del lenguaje, para luego determinar qué camino quieres seguir.
Te invito que me acompañes a conocer este Gran Lenguaje!
Aprende con nuestros más de 100 cursos que tenemos disponibles para vos
¿Te gustaría enterarte de cuando lanzamos descuentos y nuevos cursos?
Sobre los autores
Álvaro Chirou
Yo soy Álvaro Chirou, tengo más de 20 Años de experiencia trabajando en Tecnología, eh dado disertaciones en eventos internacionales como OWASP, tengo más de 1.800.000 estudiantes en Udemy y 100 formaciones profesionales impartidas en la misma. Puedes serguirme en mis redes:
Laprovittera Carlos
Soy Laprovittera Carlos. Con más de 20 años de experiencia en IT brindo Educación y Consultoría en Seguridad de la Información para profesionales, bancos y empresas. Puedes saber más de mi y de mis servicios en mi sitio web: laprovittera.com y seguirme en mis redes:
¿Quieres iniciarte en hacking y ciberseguridad pero no sabes por dónde empezar? Inicia leyendo nuestra guia gratuita: https://achirou.com/como-iniciarse-en-ciberseguridad-y-hacking-en-2024/ que te lleva de 0 a 100. Desde los fundamentos más básicos, pasando por cursos, recursos y certificaciones hasta cómo obtener tu primer empleo.