Descripción: El Teorema del Programa Estructurado, también conocido como el Teorema de Böhm-Jacopini, establece que cualquier programa computacional puede ser escrito utilizando solo tres estructuras de control: secuencia (ejecución de una instrucción tras otra), selección (instrucciones if-then-else) e iteración (bucles while). Estas tres estructuras son suficientes para expresar cualquier función computable.
Importancia: Este teorema es fundamental en la ciencia de la computación porque demuestra que la programación estructurada es completa, es decir, no se necesitan instrucciones de salto incondicional (GOTO) para implementar cualquier algoritmo. Esto llevó a mejores prácticas de programación, código más legible y mantenible, y sentó las bases para los lenguajes de programación modernos.
Descripción: Los lenguajes de programación modernos como Java, Python, C++, y JavaScript implementan directamente las tres estructuras básicas del teorema. Utilizan palabras clave como 'if', 'else', 'while', 'for', y bloques de código secuenciales para permitir a los programadores escribir código estructurado sin necesidad de instrucciones GOTO.
Importancia: La adopción generalizada de estas estructuras ha llevado a una mayor consistencia entre lenguajes de programación, facilitando el aprendizaje y la transición entre ellos. También ha permitido el desarrollo de herramientas de análisis estático y técnicas de verificación formal que mejoran la calidad y fiabilidad del software.
Descripción: El teorema del programa estructurado ha influido profundamente en las metodologías de desarrollo de software, promoviendo enfoques modulares y jerárquicos. Los equipos de desarrollo utilizan estas estructuras básicas para crear sistemas complejos a través de la composición de componentes más simples y bien definidos.
Importancia: Este enfoque estructurado ha mejorado la colaboración en equipos de desarrollo, facilitado la reutilización de código, y reducido la complejidad ciclomática de los programas. También ha permitido el desarrollo de patrones de diseño y arquitecturas de software que son fundamentales en la industria actual.
Descripción: El teorema fue formulado y demostrado por los matemáticos italianos Corrado Böhm y Giuseppe Jacopini en su artículo de 1966 titulado "Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules". Su trabajo surgió en un momento en que la programación con instrucciones GOTO era común, pero estaba llevando a código difícil de entender y mantener, conocido como "código espagueti".
Importancia: Este trabajo académico proporcionó la base teórica para la revolución de la programación estructurada que siguió en los años 70. Edsger W. Dijkstra, en su famosa carta "Go To Statement Considered Harmful" (1968), citó implícitamente este teorema para argumentar contra el uso de GOTO, iniciando un cambio fundamental en las prácticas de programación.
Descripción: La demostración del teorema implica mostrar que cualquier diagrama de flujo (que representa un programa) puede ser transformado en un diagrama equivalente que utiliza solo las tres estructuras básicas. Esto se logra mediante la introducción de variables de estado adicionales y la reestructuración del flujo de control, un proceso conocido como "eliminación estructurada de GOTO".
Importancia: La demostración no solo es teóricamente significativa, sino que también proporciona un método constructivo para transformar programas no estructurados en programas estructurados. Sin embargo, esta transformación puede introducir complejidad adicional, lo que llevó a debates sobre si la programación estructurada estricta siempre resulta en código más claro.
Descripción: Aunque el teorema demuestra que las tres estructuras básicas son suficientes en teoría, en la práctica hay situaciones donde una adherencia estricta puede llevar a código más complejo o menos eficiente. Ejemplos incluyen el manejo de múltiples condiciones de salida en bucles, la implementación de máquinas de estado finito complejas, o el manejo de excepciones.
Importancia: Estas limitaciones llevaron a la introducción de construcciones adicionales en lenguajes modernos, como instrucciones break, continue, return en medio de funciones, y manejo de excepciones. Estos pueden verse como extensiones controladas que mantienen el espíritu de la programación estructurada mientras abordan sus limitaciones prácticas.
Descripción: El término "algoritmo" se refiere a un conjunto de instrucciones o reglas definidas paso a paso que se siguen para realizar una tarea o resolver un problema específico. Los algoritmos son fundamentales en la informática, matemáticas y en muchas otras áreas.
Características principales: Finitud (el algoritmo debe terminar después de un número finito de pasos), Claridad (cada paso debe estar claramente definido y ser comprensible), Entrada (opcionalmente, puede recibir datos de entrada), Salida (produce al menos un resultado o solución y Efectividad (cada paso debe ser realizable).
Importancia: Los algoritmos son importantes porque permiten a los computadores resolver problemas de manera eficiente y estructurada, optimizando procesos y facilitando la toma de decisiones. En la vida cotidiana, los algoritmos son clave para la automatización de tareas, la personalización de experiencias y la detección de patrones, como en redes sociales y sistemas de recomendación.
Descripción: Una asignación en un algoritmo se refiere a una instrucción o conjunto de instrucciones donde se realiza la asignación de valores a variables. La asignación es una operación fundamental en programación y algoritmos que consiste en almacenar un valor en una variable para su posterior uso. En pseudocódigo o diagramas de flujo, los bloques de asignación suelen representarse con un rectángulo donde se indica la operación de asignación.
Un ejemplo sencillo es leer los lados de un triángulo, luego realizar el cálculo del área y, finalmente, mostrar el resultado, tal como se muestra en el objeto interactivo del siguiente apartado.
En la ventana derecha, presentamos un ejemplo de un objeto interactivo que usa lectura de datos , asignación de esos datos a las variables a, b y c, cálculo del área del triángulo e impresión del resultado; es decir, cuatro bloques de secuencia.
La codificación en JavaScript, solo para leer el dato del lado A, sería de esta forma:
¡Se complicó el asunto!... ¡Claro que no!, con el editor de DescartesJS, la codificación es muy sencilla. En el siguiente video, puedes observar tres ejemplos.
Descripción: La estructura IF simple es la forma más básica de control de flujo condicional en programación. Evalúa una condición y ejecuta un bloque de código solo si esa condición es verdadera. Si la condición es falsa, el programa simplemente salta ese bloque y continúa con la siguiente instrucción.
Importancia: Es fundamental para implementar la lógica de decisión en cualquier programa. Permite que el software responda de manera diferente según las circunstancias, lo que es esencial para crear aplicaciones interactivas y dinámicas.
Ejemplo: En la imagen se leen los datos de las variables A y B, si y solo si A es mayor que B, se asigna el producto A*B a la variable C.
En el editor DescartesJS, sería: C = (A>B)? A*B
Descripción: La estructura IF-ELSE extiende el IF simple añadiendo un bloque alternativo de código que se ejecuta cuando la condición es falsa. Esto crea una bifurcación en el flujo del programa: si la condición es verdadera, se ejecuta un bloque; si es falsa, se ejecuta el otro.
Importancia: Permite manejar dos situaciones mutuamente excluyentes de manera clara y eficiente. Es esencial para implementar lógica binaria donde siempre debe ejecutarse exactamente una de dos opciones posibles.
Operador ternario de JavaScript: En el editor DescartesJS, el condicional de la imagen, se codificaría así: Mayor = (A>B)? A:B, expresión conocida como operador ternario, cuya sintaxis es:
condición ? valor_si_verdadero : valor_si_falso
Operadores de comparación: Los operadores de comparación son símbolos que permiten comparar dos valores y devolver un resultado booleano (verdadero o falso). Incluyen igual a (==), idéntico a (===), mayor que (>), menor que (<), mayor o igual que (>=), menor o igual que (<=), y no igual a (!=).
Operadores lógicos: Los operadores lógicos permiten combinar múltiples condiciones en una sola expresión. Los principales son AND (&), OR (|) y NOT (!). AND devuelve verdadero solo si ambas condiciones son verdaderas; OR devuelve verdadero si al menos una condición es verdadera; NOT invierte el valor de una condición.
Ejercicio: En los operadores anteriores, hemos puesto, entre paréntesis, los operadores usados en JavaScript y, en consecuencia, en el editor DescartesJS. Al lado derecho presentamos on objeto interactivo, como ejercicio cambia los valores de A y B y observa cuáles operadores son verdaderos.
El último operador (fondo verde), que llamamos c7, se codificó así: c7=(A=3)&!(B=3)?1:0.
Hallar el número mayor. En la figura de la estructura IF-ELSE, presentamos un algoritmo en forma de diagrama de flujo, para hallar el número mayor entre dos números, usando un condicional o estructura selectiva.
Al lado derecho, presentamos un objeto interactivo, diseñado con DescartesJS, codificado según el algoritmo, permitiendo hallar el número mayor entre dos números.
A continuación, puedes observar un video que explica cómo se usó el operador ternario de JavaScript, el cual también usaremos para terminar nuestro Proyecto 1: "Generador de imágenes con IA"
Presta atención, al inicio del video, pues te explicaremos la utilidad de la opción mostrar región exterior, del selector escena.
Concluimos el primer proyecto de aula con IA usando nuevos parámetros para la generación de imágenes con Pollinations como semilla y el parámetro nologo, para ocultar el logo de Pollinations. Tambié, hemos incorporado nuevos elementos de DescartesJS, como el control tipo texto, la función genera() y la descargas de imágenes abriendo una URL en una pestaña nueva con la imagen. Observa el video y termina de diseñar el proyecto en tu computador.
TAREA 4
Resuelve los los siguientes problemas:
Problema 1. Usa una IA (herramienta 46, por ejemplo), para calcular: "En un almacén se tiene la siguiente promoción: todo artículo con un precio superior a $25,000 tendrá un descuento del 20%, los demás tendrán el 10%. Determinar el precio final que debe pagar una persona por comprar un artículo y el valor del descuento."
Problema 2. Crea un programa en DescartesJS que reciba una calificación numérica entre 0 y 100 e imprima el nivel correspondiente:
¡Sube la solución de los dos problemas en una carpeta llamada "Tarea 4"!