Semana 2: Profundizando en Lógica de Programación

Esta semana, exploraremos cómo la lógica se une con la tecnología para crear programas funcionales. Abordaremos la metodología completa para resolver problemas computables y profundizaremos en las estructuras de control de flujo que permiten a nuestros programas tomar decisiones y repetir acciones.

1. La Tecnología en la Programación

La tecnología es el puente que permite que nuestros algoritmos cobren vida y sean ejecutados por las computadoras a velocidades asombrosas. Un lenguaje de programación es ese "puente perfecto" que permite al computador ejecutar lo que concebimos como algoritmo[1].

Lenguajes de Bajo Nivel

Son lenguajes cuyas instrucciones son complejas de entender para los humanos, pero muy sencillas para el computador. El ejemplo más claro es el Lenguaje Ensamblador (Assembler), que es el "lenguaje verdadero de los computadores"[2]. La programación a bajo nivel era la utilizada en los inicios de la programación, requiriendo programadores muy especializados debido a su complejidad.

mov bp, sp ; Ejemplo de instrucción en Ensamblador

Lenguajes de Alto Nivel

Fueron creados para ser más entendibles al ser humano, facilitando la programación. Sin embargo, el computador necesita un programa adicional para "traducir" este código a lenguaje de bajo nivel. Aquí es donde entran los intérpretes y compiladores[3].

  • Lenguajes Interpretados: Un programa "intérprete" convierte y ejecuta el código línea por línea. Si hay un error, se detiene al llegar a esa línea. Ej: Python (en su ejecución interactiva), JavaScript.
  • Lenguajes Compilados: Un programa "compilador" revisa todo el código (programa fuente) y, si no hay errores, lo convierte a un "objeto compilado" y luego a un "programa ejecutable". Esto reduce el riesgo de interrupciones durante la ejecución. Ej: C++, Java.

Errores en un Programa

Existen dos tipos principales de errores que podemos encontrar al programar[4]:

  • Errores Humanos: Dependen exclusivamente del programador y su lógica. Son los más difíciles de detectar por una máquina[5].
    • De Concepción: Cuando el programador no entiende bien el objetivo del problema[6].
    • Lógicos: El algoritmo está mal diseñado y no produce el resultado esperado, aunque sintácticamente sea correcto. Se detectan en la prueba de escritorio[7].
  • Errores Detectados por un Compilador: Son los errores más sencillos, ya que los compiladores modernos no solo indican el error, sino también su ubicación aproximada[8].
    • De Sintaxis: Omisiones o violaciones de las reglas del lenguaje (ej. olvidar cerrar un paréntesis)[9]. El programa no se ejecuta.
    • De Precaución: Recomendaciones para mejorar o asegurar el programa. El programa puede ejecutarse, pero los resultados podrían no ser los esperados[10].

¡Ejercicio en Clase! 🧑‍💻

Discute con tu compañero:

  • ¿Por qué es importante la "prueba de escritorio" si el compilador ya nos dice los errores de sintaxis?
  • Si escribes `print("Hola" + 5)` en Python, ¿qué tipo de error esperarías? ¿Humano o detectado por el compilador? (Pista: Python es un lenguaje interpretado, pero tiene verificaciones).

2. Metodología para Solucionar un Problema Computable

Para resolver cualquier problema en el mundo de la programación, seguimos una metodología estructurada que nos asegura llegar a una solución eficiente y confiable[11].

Pasos Clave de la Metodología

  1. Clarificación del Objetivo: El primer y más importante paso. Debes tener "muy claro no solo hacia dónde debemos ir, sino hasta dónde debemos llegar"[12]. Un objetivo claro es el "faro" que ilumina el camino[13].
  2. Algoritmo: Es el conjunto de pasos secuenciales y ordenados para lograr el objetivo. Solo se puede vislumbrar claramente cuando el objetivo es claro[14].
  3. Prueba de Escritorio: La "prueba reina" de un algoritmo. Simulación manual para verificar si el algoritmo logra el objetivo propuesto[15]. Aquí se detectan los errores lógicos.
  4. Transcripción (Codificación): Convertir el algoritmo (informal o pseudocódigo) en un listado de instrucciones entendibles por un computador, ajustándose a las reglas sintácticas de un lenguaje de programación. El algoritmo escrito con estas reglas se llama programa[16].
  5. Digitación: Escribir el programa en el computador usando un editor de texto o un Entorno Integrado de Desarrollo (IDE)[17].
  6. Compilación: El computador revisa que el programa se ajuste a las reglas sintácticas del lenguaje. Lo realiza un "compilador", que detecta errores de sintaxis y de precaución[18].
  7. Ejecución o Puesta en Marcha: Una vez sin errores de compilación, el programa se "pone a correr" en el computador[19].
  8. Verificación de Resultados: Comprobar si la salida del programa cumple con el objetivo inicial. Si no, se debe revisar el objetivo, la prueba de escritorio o la transcripción[20].

Ejemplo: Determinar si un Número es Par

Vamos a aplicar la metodología para resolver un problema clásico: leer un número entero y determinar si es par.

Pseudocódigo (Versión Técnica)[21]:

Proceso Numero_Par
    Variables
        Entero : num
    Inicio
        Escriba "Digite un número entero"
        Lea num
        Si num < 0 Entonces
            Escriba "El número debe ser positivo"
        Sino
            Si num / 2 * 2 = num Entonces
                Escriba "El número leído es par"
            Sino
                Escriba "El número leído no es par"
            FinSi
        FinSi
    Fin

Código Python:

num = int(input("Digite un número entero: "))

if num < 0:
    print("El número debe ser positivo")
else:
    # La lógica para saber si es par en aritmética entera
    if num // 2 * 2 == num: # Usamos // para división entera
        print("El número leído es par")
    else:
        print("El número leído no es par")
                        
¡Prueba este código!

Copia el código Python en tu entorno de desarrollo o en la consola simulada de la clase anterior para ver cómo funciona.

¡Ejercicio en Clase! 🧑‍💻

En parejas, apliquen la metodología completa para el siguiente problema:

  • Problema: Leer dos números enteros y determinar si el último dígito de un número es igual al último dígito del otro.
  • Pasos:
    1. Clarificación del Objetivo (Análisis: Entrada, Proceso, Salida).
    2. Diseño del Algoritmo (en pseudocódigo).
    3. Realización de la Prueba de Escritorio (con al menos dos escenarios: dígitos iguales y diferentes).
    4. (Opcional para los más avanzados) Transcripción a Python.

3. Decisiones: Controlando el Flujo Condicional

Una decisión es la elección de uno entre varios caminos lógicos, dependiendo de una condición[22]. En programación, esto nos permite que el programa reaccione de diferentes maneras según los datos o el estado actual.

Estructura `Si-Entonces-Sino` (if-else)

Es la estructura de decisión más común. Permite ejecutar un bloque de código si una condición es verdadera, y otro bloque si es falsa[23].

Pseudocódigo Básico:

Si Condicion Entonces
    // Instrucciones si la condición es Verdadera
Sino
    // Instrucciones si la condición es Falsa
FinSi

Variaciones Comunes:

  • Decisión Simple: Solo tiene el bloque `Si-Entonces`. No hay `Sino` si no se necesita una acción para el caso falso[24].
  • Decisión en Cascada (`elif`): Múltiples `Si-Entonces` anidados en los `Sino`, para evaluar varias condiciones en orden. Si una se cumple, las demás no se evalúan[25].
  • Decisión en Secuencia: Varios `Si` independientes. Todas las condiciones se evalúan, y se ejecutan los bloques correspondientes si son verdaderos. Se usa cuando las condiciones no son mutuamente excluyentes o cuando se necesita evaluar todas[26].
  • Decisión Anidada: Un `Si-Entonces-Sino` completo dentro de otro `Si-Entonces-Sino`. Permite evaluar condiciones más complejas donde una depende de la otra[27].

Estructura `Casos` (Selección Múltiple)

Esta estructura permite abreviar una serie de decisiones en cascada o en secuencia cuando se compara una variable con múltiples valores específicos. Ejecuta instrucciones que coinciden con el valor de una variable[28].

Pseudocódigo:

Evalúe (variable)
    Si vale (valor_1) : Instrucciones para valor_1
    Si vale (valor_2) : Instrucciones para valor_2
    ...
    Si vale (valor_n) : Instrucciones para valor_n
    Sino : Instrucciones si no coincide con ningún valor anterior
Fin_Evalúe
                        

Ventaja: Más legible y eficiente que muchos `if-elif-else` anidados para comparaciones de igualdad.

Ejemplo: Día de la Semana con `Casos`

Lee un número del 1 al 7 y muestra el día de la semana correspondiente.

Proceso dia_de_la_semana
    Definir dia Como Entero
    Escribir "Ingrese un número del 1 al 7:"
    Leer dia

    Segun dia Hacer
        1: Escribir "Lunes"
        2: Escribir "Martes"
        3: Escribir "Miércoles"
        4: Escribir "Jueves"
        5: Escribir "Viernes"
        6: Escribir "Sábado"
        7: Escribir "Domingo"
        De Otro Modo: Escribir "No pertenece a un día de la semana"
    Fin Segun
FinProceso
                        

¡Ejercicio en Clase! 🧑‍💻

En pseudocódigo, resuelve el siguiente problema utilizando la estructura de decisión más adecuada:

  • Problema: Una frutería ofrece descuentos según la cantidad de manzanas compradas:
    • 0-4 manzanas: 0% de descuento
    • 5-8 manzanas: 10% de descuento
    • 9-12 manzanas: 15% de descuento
    • 13 o más manzanas: 20% de descuento
  • Tarea: Elabora un algoritmo que pida la cantidad de manzanas y el precio por manzana, y determine cuánto pagará el cliente.

4. Ciclos: Automatizando Tareas Repetitivas

Los ciclos, también conocidos como estructuras repetitivas o bucles, permiten ejecutar un conjunto de acciones las veces que sea necesario, siempre y cuando se cumpla una condición[29]. Son fundamentales para automatizar tareas y evitar escribir código repetitivo.

Conceptos Clave en Ciclos

  • Contador: Una variable de tipo entero que se incrementa o disminuye en un valor constante en cada repetición. Se usa para "conocer el número de veces que se repite un procedimiento"[30]. Ej: `contador = contador + 1`.
  • Acumulador (o Totalizador): Una variable que almacena cantidades resultantes de procesos sucesivos. Se incrementa con un valor variable en cada repetición[31]. Ej: `total = total + valor_venta`.

Tipos de Ciclos

La mayoría de lenguajes de programación ofrecen tres formas principales de ciclos[32]:

  • Ciclo `Mientras` (While): Controla la ejecución de instrucciones basándose en una expresión lógica. El bloque de código se repite mientras la condición sea verdadera. La condición se evalúa antes de cada iteración.
  • Ciclo `Repetir` (Do-While / Repeat-Until): Primero realiza las acciones y después comprueba la expresión lógica. Esto garantiza que las acciones se ejecuten al menos una vez. El bloque se repite hasta que la condición sea verdadera.
  • Ciclo `Para` (For): Permite implementar un conjunto de instrucciones un número predeterminado de veces. Utiliza una variable de control con un valor de inicio, un valor final y un incremento/decremento.

Ejemplos en Pseudocódigo y Python

Ciclo `Mientras` (Mostrar números del 1 al 10)[33]:

Proceso ImprimirNumerosMientras
    Definir num Como Entero;
    num = 1;
    Mientras num <= 10 Hacer
        Escribir num;
        num = num + 1;
    FinMientras
FinProceso

Ciclo `Repetir` (Mostrar números del 1 al 10)[34]:

Proceso ImprimirNumerosRepetir
    Definir num Como Entero;
    num = 1;
    Repetir
        Escribir num;
        num = num + 1;
    Hasta Que num > 10
FinProceso

Ciclo `Para` (Mostrar números del 1 al 10)[35]:

Proceso ImprimirNumerosPara
    Definir num Como Entero;
    Para num = 1 Hasta 10 Con Paso 1 Hacer
        Escribir num;
    FinPara
FinProceso

¡Ejercicio en Clase! 🧑‍💻

En pseudocódigo, resuelve el siguiente problema utilizando los tres tipos de ciclos (`Mientras`, `Repetir`, `Para`).

  • Problema: Crear un algoritmo que capture un número entero y realice la tabla de multiplicar de dicho número del 1 al 10.

Notas al Pie

  1. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 95)
  2. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 96)
  3. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 97)
  4. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 99)
  5. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 100)
  6. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 100)
  7. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 101)
  8. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 102)
  9. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 103)
  10. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 103)
  11. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 109)
  12. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 110)
  13. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 28)
  14. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 28)
  15. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 30)
  16. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 32)
  17. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 32)
  18. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 33)
  19. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 34)
  20. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 34)
  21. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 117)
  22. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 149)
  23. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 45)
  24. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 46)
  25. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 49)
  26. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 53)
  27. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 56)
  28. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 61)
  29. Trejos Buriticá, O. I. (2017). *Lógica de programación*. Ediciones de la U. (p. 171); Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 64)
  30. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 64)
  31. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 64)
  32. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 176)
  33. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 67)
  34. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 70)
  35. Salazar Guaña, C. E. (2022). *Lógica de Programación*. Instituto Superior Tecnológico CEMLAD. (p. 73)

Referencias