Las estructuras de un programa
Un cajero automático de un banco en San José le pide la clave, le deja equivocarse tres veces y después bloquea la tarjeta. Detrás hay un programa, y por complejo que sea siempre se arma con las mismas piezas: variables que guardan datos, decisiones que eligen un camino, repeticiones que ejecutan lo mismo varias veces y, como ampliación, funciones con nombre. Aquí repasará cómo leer y diseñar esas piezas en pseudocódigo y diagramas de flujo. Al final volveremos al cajero.
Variables, constantes y tipos de dato
Piense en un videojuego: la variable puntos empieza en 0 y sube cada vez que pasa de nivel con puntos ← puntos + 100. En cambio, el IVA de 13 % de una tienda en línea se guarda en una constante, porque no debe cambiar mientras el programa corre. Así, un producto de ₡20.000 queda en ₡22.600 con el impuesto.
Explique qué es una variable en un programa y ponga un ejemplo: qué nombre y qué contenido tendría una variable en un videojuego que guarda los puntos del jugador. ¿Qué…
Explique qué es una variable en un programa y ponga un ejemplo: qué nombre y qué contenido tendría una variable en un videojuego que guarda los puntos del jugador. ¿Qué operación cambiaría su valor al superar un nivel?
Explique la diferencia entre una variable y una constante en un programa, con un ejemplo de cada una en un programa de facturación (el precio del producto frente al…
Explique la diferencia entre una variable y una constante en un programa, con un ejemplo de cada una en un programa de facturación (el precio del producto frente al porcentaje del impuesto de ventas).
Los datos de un programa tienen tipo: entero, decimal, texto o booleano. Indique el tipo más adecuado para cada dato y justifíquelo: la edad de una persona, su altura en…
Los datos de un programa tienen tipo: entero, decimal, texto o booleano. Indique el tipo más adecuado para cada dato y justifíquelo: la edad de una persona, su altura en metros, su nombre y si ha aprobado o no.
Lea este fragmento y haga la traza: Indique qué valor se muestra en pantalla y explique por qué la segunda instrucción no es una ecuación matemática sino una asignación.
Lea este fragmento y haga la traza:
inicio
x ← 4
x ← x + 2
escribir x
fin
Indique qué valor se muestra en pantalla y explique por qué la segunda instrucción no es una ecuación matemática sino una asignación.
Operadores: aritméticos, relacionales y lógicos
Con las variables se construyen expresiones usando operadores. Hay tres familias:
| Familia | Operadores | Resultado |
|---|---|---|
| Aritméticos | +, −, ·, /, mod |
un número |
| Relacionales | <, ≤, >, ≥, =, ≠ |
verdadero o falso |
| Lógicos | y, o, no |
verdadero o falso |
Su uso más común es la divisibilidad: a es divisible entre b justo cuando a mod b = 0. Así, n mod 2 = 0 indica que n es par, y n mod 2 = 1 que es impar.
La comisión de garantía de calidad de un colegio evalúa el siguiente algoritmo, destinado a determinar la calificación final de un módulo técnico a partir de tres notas…
La comisión de garantía de calidad de un colegio evalúa el siguiente algoritmo, destinado a determinar la calificación final de un módulo técnico a partir de tres notas parciales ($N_1, N_2, N_3 \in [0{,}0; 10{,}0]$). La normativa oficial establece: «El estudiante resulta 'Apto' si la media ponderada ($30\,\%$ para $N_1$, $30\,\%$ para $N_2$ y $40\,\%$ para $N_3$) es igual o superior a $5{,}0$, siempre y cuando ninguna de las notas individuales sea inferior a $4{,}0$; en caso contrario, resultará 'No apto'».
inicio
leer N1, N2, N3
media ← N1 · 0,3 + N2 · 0,3 + N3 · 0,4
si media ≥ 5,0 o (N1 ≥ 4,0 y N2 ≥ 4,0 y N3 ≥ 4,0) entonces
escribir "Apto"
si no
escribir "No apto"
fin si
fin
(a) Explique detalladamente por qué el programa no genera ningún error de sintaxis y se ejecuta con normalidad a pesar de contener un error lógico crítico en la estructura condicional.
(b) Diseñe dos ternas de notas de prueba $(N_1, N_2, N_3)$ que pongan en evidencia el fallo del algoritmo: una que cause un falso positivo (el programa declare 'Apto' debiendo ser 'No apto') y otra que cause un falso negativo (o justifique si este último es posible con la expresión actual).
(c) Reescriba el algoritmo en pseudocódigo corrigiendo la condición lógica y agregando una comprobación previa que verifique que las tres notas introducidas se encuentren dentro del rango válido $[0{,}0; 10{,}0]$.
Estructuras condicionales (selectivas)
Explique qué es una estructura condicional (si... entonces... si no...) y escriba dos ejemplos de decisiones cotidianas expresadas con esa estructura, indicando la…
Explique qué es una estructura condicional (si... entonces... si no...) y escriba dos ejemplos de decisiones cotidianas expresadas con esa estructura, indicando la condición y las dos acciones posibles.
Escriba en pseudocódigo un programa que lea la nota de un examen (un número de 0 a 10) y escriba «apto» si la nota es 5 o mayor, y «no apto» en caso contrario. Use una…
Escriba en pseudocódigo un programa que lea la nota de un examen (un número de 0 a 10) y escriba «apto» si la nota es 5 o mayor, y «no apto» en caso contrario. Use una variable, una lectura de dato y una estructura condicional.
Este programa clasifica a una persona según su edad: Haga la traza para una entrada de 17 y para una de 21, indicando en cada caso qué condición se evalúa y qué se…
Este programa clasifica a una persona según su edad:
inicio
leer edad
si edad ≥ 18 entonces
escribir "mayor de edad"
si no
escribir "menor de edad"
fin si
fin
Haga la traza para una entrada de 17 y para una de 21, indicando en cada caso qué condición se evalúa y qué se escribe por pantalla.
Comentarios en el código
Un comentario es texto dentro del código fuente que la computadora ignora. Va dirigido a las personas que leerán el programa después (su equipo o usted dentro de un mes).
Un buen comentario explica el porqué de una decisión, no lo que ya se ve en la línea.
| Comentario | Valoración |
|---|---|
// suma 1 a n |
Inútil: repite lo que dice el código |
// el IVA es 13 %; algunos productos tienen otra tarifa |
Útil: explica una decisión |
¿Qué es un comentario en el código fuente? Explique a quién van dirigidos los comentarios (no a la computadora, sino a quien leerá el código después) y qué debe explicar…
¿Qué es un comentario en el código fuente? Explique a quién van dirigidos los comentarios (no a la computadora, sino a quien leerá el código después) y qué debe explicar un buen comentario (el porqué de las decisiones, no lo que ya se ve).
Estructuras repetitivas: ciclos y su traza
Por ejemplo, para escribir los números del 1 al 5 no hace falta cinco instrucciones escribir: basta un ciclo con una variable que cuenta.
El ciclo para (con contador)
Cuando se sabe de antemano cuántas vueltas dar, el ciclo para es más cómodo: él mismo crea el contador, lo hace avanzar de 1 en 1 y lo comprueba. Se escribe para i desde 1 hasta 5 hacer ... fin para. Equivale a un mientras con i ← 1, la condición i ≤ 5 y la instrucción i ← i + 1 al final del cuerpo, pero no se puede olvidar el incremento.
Los ciclos para se pueden anidar: por cada valor del contador exterior, el interior recorre todos sus valores. Si el interior va desde i hasta N, sus vueltas dependen de i: con N = 3, para i = 1 da 3 vueltas, para i = 2 da 2 y para i = 3 da 1, en total 6.
Explique qué es un bucle y qué problema resuelve frente a repetir las mismas instrucciones muchas veces. Escriba en pseudocódigo un bucle que escriba los números del 1…
Explique qué es un bucle y qué problema resuelve frente a repetir las mismas instrucciones muchas veces. Escriba en pseudocódigo un bucle que escriba los números del 1 al 5.
Lea este programa en pseudocódigo: Haga la traza paso a paso (valor de suma y de n al final de cada vuelta) e indique cuántas veces se repite el bucle y qué valor se…
Lea este programa en pseudocódigo:
inicio
suma ← 0
n ← 1
mientras n ≤ 5 hacer
suma ← suma + n
n ← n + 1
fin mientras
escribir suma
fin
Haga la traza paso a paso (valor de suma y de n al final de cada vuelta) e indique cuántas veces se repite el bucle y qué valor se escribe al final.
El diagrama de flujo de la figura representa un programa con un bucle: lee un número n y, mientras n sea mayor que 0, escribe su valor y le resta 1, como se muestra en…
El diagrama de flujo de la figura representa un programa con un bucle: lee un número n y, mientras n sea mayor que 0, escribe su valor y le resta 1, como se muestra en la figura.
Si el usuario introduce n = 3: (a) haga la traza indicando qué valores toma n y qué se escribe en cada vuelta; (b) indique cuántas veces se ejecuta el cuerpo del bucle; (c) explique qué ocurriría si el usuario introdujera n = 0.
Escriba en pseudocódigo un programa que imprima la cuenta regresiva del 10 al 1 y, al terminar el ciclo, imprima «¡despegue!». Use una variable y un ciclo mientras.
Escriba en pseudocódigo un programa que imprima la cuenta regresiva del 10 al 1 y, al terminar el ciclo, imprima «¡despegue!». Use una variable y un ciclo mientras.
Este programa suma los números que introduce el usuario hasta que escribe un cero: Haga la traza para la secuencia de entradas 4, 3, 0: indique el valor de n y de suma…
Este programa suma los números que introduce el usuario hasta que escribe un cero:
inicio
suma ← 0
leer n
mientras n ≠ 0 hacer
suma ← suma + n
leer n
fin mientras
escribir suma
fin
Haga la traza para la secuencia de entradas 4, 3, 0: indique el valor de n y de suma tras cada lectura y qué se escribe al final. Explique además por qué el primer leer n está fuera del bucle.
Este programa debería escribir los números del 1 al 5, pero tiene un fallo: a) Identifique el error: ¿qué le falta al cuerpo del bucle? b) Explique qué ocurre al…
Este programa debería escribir los números del 1 al 5, pero tiene un fallo:
inicio
n ← 1
mientras n ≤ 5 hacer
escribir n
fin mientras
fin
- a) Identifique el error: ¿qué le falta al cuerpo del bucle?
- b) Explique qué ocurre al ejecutar el programa tal como está escrito.
- c) Escriba el pseudocódigo corregido.
Combinar ciclos y condicionales
El diagrama de flujo de la figura representa el control de acceso de un dispositivo: hay un máximo de tres intentos para introducir la clave correcta, como se muestra en…
El diagrama de flujo de la figura representa el control de acceso de un dispositivo: hay un máximo de tres intentos para introducir la clave correcta, como se muestra en la figura.
(a) Explique el recorrido completo del programa cuando el usuario falla la clave dos veces y acierta a la tercera. (b) Indique el número máximo de veces que el programa pide la clave. (c) Razone por qué la variable intentos se incrementa solo en una de las ramas del segundo rombo.
Diseñe en pseudocódigo el algoritmo de control para un semáforo de cruce peatonal regulado por pulsador que gestione de forma segura el tráfico de una avenida con los…
Diseñe en pseudocódigo el algoritmo de control para un semáforo de cruce peatonal regulado por pulsador que gestione de forma segura el tráfico de una avenida con los siguientes requisitos:
-
En reposo, el semáforo vehicular permanece en verde.
-
Para evitar retenciones provocadas por llamadas continuas, debe garantizarse un tiempo mínimo de verde vehicular de $30$ segundos entre dos fases peatonales consecutivas.
-
Una vez transcurrido dicho tiempo mínimo y detectada la pulsación de un peatón, la secuencia obligatoria es: ámbar vehicular durante $3$ segundos, rojo vehicular y verde peatonal durante $15$ segundos, y finalmente verde peatonal parpadeante durante $4$ segundos antes de restablecer el verde vehicular.
(a) Escriba el pseudocódigo del sistema estructurado dentro de un bucle continuo de supervisión.
(b) Analice qué fallo de bloqueo sufriría el cruce si el sensor se averiara en estado activo continuo (pulsador atascado) y justifique cómo su diseño previene que la avenida quede colapsada indefinidamente.
(c) Justifique técnicamente por qué en sistemas de control concurrentes en tiempo real es preferible consultar una marca temporal de reloj (tiempo_actual()) en lugar de suspender la CPU mediante esperas bloqueantes pasivas (esperar()).
Un analista de ciberseguridad revisa el siguiente pseudocódigo diseñado para controlar el acceso con tarjeta y PIN en un terminal bancario: (a) Identifique y justifique…
Un analista de ciberseguridad revisa el siguiente pseudocódigo diseñado para controlar el acceso con tarjeta y PIN en un terminal bancario:
inicio
pin_secreto ← 3852
intentos ← 0
bloqueada ← falso
mientras intentos < 3 y no bloqueada hacer
leer pin_ingresado
si pin_ingresado = pin_secreto entonces
escribir "Bienvenido al sistema"
si no
intentos ← intentos + 1
escribir "PIN incorrecto"
fin si
fin mientras
si intentos = 3 entonces
bloqueada ← verdadero
escribir "Tarjeta bloqueada por seguridad"
fin si
fin
(a) Identifique y justifique un fallo grave de control de flujo que ocurre cuando la persona usuaria introduce el PIN correcto en el primer intento.
(b) Prediga el comportamiento del programa y el valor final de las variables intentos y bloqueada si la persona usuaria introduce la secuencia de entradas: 1111, 3852, 9999.
(c) Reescriba el algoritmo en pseudocódigo corrigiendo el flujo de ejecución para garantizar salida limpia inmediata tras el acierto y bloqueo estricto tras tres fallos consecutivos, asegurando que bajo ninguna circunstancia se muestre el mensaje de bienvenida si la tarjeta queda bloqueada.
Funciones: dividir el programa en piezas
Dos ventajas de trocear el código en funciones: reutiliza sin copiar y puede entender y probar cada parte por separado.
Variables locales y globales (ámbito)
El ámbito de una variable es la parte del programa donde existe y puede usarse. Una variable local se crea dentro de una función y desaparece cuando la función termina; solo esa función la ve. Una variable global se declara fuera de todas las funciones y cualquier función puede leerla y modificarla.
Parece cómodo que todas las funciones compartan variables globales, pero tiene costos. Hay acoplamiento: la función depende de variables que están fuera de ella, así que no se puede reutilizar en otro programa sin llevarse esas variables. Es difícil de probar: su resultado depende del estado oculto del programa y no solo de lo que recibe. Y es fácil de romper: cualquier otra función puede cambiar la variable global sin que nadie se dé cuenta.
Por eso una buena función recibe sus datos por parámetros, calcula con variables locales y entrega el resultado con devolver. Así, la misma entrada produce siempre la misma salida y cada pieza se entiende por separado.
| Diseño | Cómo obtiene los datos | Consecuencia |
|---|---|---|
| Con globales | Lee secreto e intentos de fuera |
Atada a ese programa; difícil de probar |
| Con parámetros | Recibe secreto e intentos al llamarla |
Reutilizable; se prueba con cualquier valor |
Explique qué es una función en un programa y dos ventajas de dividir el código en funciones con nombre (reutilizar sin copiar, entender y probar cada parte por separado).
Explique qué es una función en un programa y dos ventajas de dividir el código en funciones con nombre (reutilizar sin copiar, entender y probar cada parte por separado).