Resumen
Esta clase abre la cuarta unidad del curso, dedicada al control de flujo. Explica para qué sirve la unidad: enseñar a gobernar el orden en que se ejecutan las sentencias de un programa, con decisiones y con bucles, y a razonar sobre su corrección, es decir, a asegurar que cada caso se atienda, que cada bucle haga lo que debe y que termine; presenta sus cuatro clases y el hilo que las une; recuerda lo que la unidad da por sabido, sobre todo las condiciones compuestas de la unidad 3; formula el problema que la unidad resuelve, el de un programa que calcula el máximo común divisor con un número fijo de pasos y que, según los datos, responde mal o se detiene en una división por cero; anticipa el invariante como la herramienta con que la unidad justificará sus bucles; y muestra adónde conduce, en las unidades siguientes y en el curso Programación en C++ II.
Objetivos de aprendizaje
- Describir la secuencia de contenidos de la unidad y explicar qué aporta cada clase a la siguiente.
- Recordar las condiciones compuestas de la unidad 3 (las conectivas, el cortocircuito y la negación por las leyes de De Morgan) y repasarlas si hace falta.
- Anticipar, con un ejemplo, el invariante como herramienta de razonamiento: una relación entre las variables que una repetición conserva y que, al terminar, da el resultado.
- Reconocer qué se espera saber hacer al terminar la unidad, y distinguirlo de lo que se aprenderá en las unidades siguientes.
Evaluación de entrada
Antes de recorrer la unidad conviene medir el punto de partida. Esta evaluación es una autoevaluación: no se califica, y su único propósito es orientar el estudio. Las cuatro primeras preguntas comprueban lo que la unidad da por sabido: la negación de una condición compuesta, el cortocircuito, la traza de una repetición de la clase 1.1 y el límite de un int. Las siete siguientes tocan, en el orden de las clases, las ideas centrales de la unidad, y varias parten de la matemática escolar: el máximo común divisor, la notación de sumatoria, la terminación de un procedimiento. Nadie está obligado a acertarlas todavía, y en algunas «todavía no lo sé» es una respuesta honesta: cada respuesta, acertada o no, explica el punto y nombra la clase que lo trata. Las mismas destrezas se vuelven a medir al final, en la clase de síntesis.
Antes de comenzar la unidad, mide tu punto de partida. Es una autoevaluación breve: no se califica y su resultado se guarda solo en tu navegador.
Pregunta 1De unidades anteriores¿Cuál es la negación de la condición
1 <= n && n <= 10?Niega cada parte, pero conserva la conjunción: olvida De Morgan. Además, ningún número es a la vez menor que 1 y mayor que 10, de modo que esa condición es siempre falsa.Cambia bien la conectiva, pero niega mal las relaciones: excluye de más los bordes 1 y 10, que cumplen la condición original.Niega solo la primera parte.Por De Morgan, la negación de una conjunción es la disyunción de las negaciones, y la negación de1 <= nesn < 1, non <= 1. La unidad la necesita en cada decisión encadenada, porque la ramaelseatiende exactamente la negación de las condiciones anteriores, y en cada bucle, porque al salir vale la negación de su condición.Repasar: Relaciones y lógica
Pregunta 2De unidades anterioresCon
int d{0};yint n{5};, ¿qué ocurre al evaluard != 0 && n / d > 2?Ignora el cortocircuito: la división nunca se calcula.No hay manera de que una conjunción con un operando falso sea verdadera.La expresión es correcta; el compilador no conoce el valor dedal ejecutarse.El primer operando es falso, y el cortocircuito no evalúa el segundo: la guardia a la izquierda protege la división. La unidad convierte esta guardia en decisiones explícitas y en condiciones de bucle que protegen su cuerpo.Repasar: Relaciones y lógica
Pregunta 3De unidades anterioresLa división por restas sucesivas de la clase 1.1 empieza con y , y repite «mientras , restar de y sumar 1 a ». Con y , ¿cuántas veces se ejecuta el cuerpo de la repetición?
Cuenta las evaluaciones de la condición, que son una más que las vueltas.Detiene la repetición con : lee como .Confunde el número de vueltas con el valor inicial de .La traza da : el cuerpo se ejecuta cuatro veces, y la condición se evalúa cinco, porque la última evaluación es la que falla. La clase 4.2 escribe esta repetición en C++ y convierte la traza en una tabla.Repasar: Del problema al algoritmo
Pregunta 4De unidades anterioresCon un
intde 32 bits, ¿qué garantiza la norma sobre el valor de46341 * 46341?Ignora el rango del tipo: ese número no cabe en unint.Cree que el desbordamiento se detiene en el borde; la norma no promete nada.El tipo del resultado lo deciden los operandos, que sonint, no el valor del resultado.El máximo es . La unidad encuentra este producto en un lugar donde no se lo busca: la condiciónd * d <= nde un bucle que prueba divisores, que desborda justamente cuando está cerca del máximo.Repasar: Los enteros y su representación
Pregunta 5Un programa contiene la cadena de decisiones
if (score >= 50), que escribe «Aprobado»;else if (score >= 90), que escribe «Excelente»; yelse, que escribe «Reprobado». ¿Qué escribe conscoreigual a 95?Cree que gana la condición más exigente; gana la primera que se cumple.Cree que se ejecutan todas las ramas verdaderas; en una cadena se ejecuta una sola.Es una respuesta honesta: la clase 4.1 lo explica, y la evaluación de salida volverá sobre los bordes de una cadena.En una cadena se ejecuta la primera rama cuya condición es verdadera, y . La rama «Excelente» no se ejecuta nunca: su caso real es y , que es vacío. La clase 4.1 enseña a leer el caso real de cada rama y a ordenar las condiciones.Repasar: Decisiones
Pregunta 6¿Cuál de las expresiones siguientes denota la suma ?
Suma veces el número , es decir, : confunde el término con el límite superior.Suma : corre los límites y pierde el último término, el error por uno de los bucles.El límite superior no puede ser el propio índice: la expresión no tiene significado.El índice recorre los enteros de 1 a , y cada término es el propio . Un bucleforque acumula es la traducción directa de esta notación: la variable de control es el índice, sus límites son los de la sumatoria, y el cuerpo suma el término.Repasar: Bucles
Pregunta 7Con
int total{0};, ¿qué escribestd::println("{}", total);después defor (int i{0}; i < 5; ++i) { total += i; }?Cree queillega a 5: lee<como<=.Confunde el acumulador con el contador: cinco es el número de vueltas, no la suma.Es una respuesta honesta: la clase 4.2 enseña la forma delfory cómo contar sus vueltas.La variableitoma los valores 0, 1, 2, 3 y 4, y ; coniigual a 5 la condición falla y el cuerpo no se ejecuta. Es la sumatoria de la pregunta anterior con los límites 0 y 4.Repasar: Bucles
Pregunta 8En la división por restas sucesivas (, ; mientras , pasa a y a ), ¿qué relación entre las variables vale cada vez que se evalúa la condición?
Vale solo al salir: mientras se repite, la condición asegura lo contrario.Vale solo al terminar; antes, es menor que el cociente.Es una respuesta honesta: la clase 4.3 enseña a encontrar y a comprobar esta relación, y la evaluación de salida volverá a preguntarlo.Vale al comienzo, porque ; y si vale antes de una vuelta, vale después, porque . Al salir se suma la negación de la condición, , y ambas dan el resultado. Una relación así se llama invariante, y la clase 4.3 la convierte en el método para diseñar bucles y justificarlos.Repasar: Diseñar bucles correctos
Pregunta 9Un procedimiento parte de un entero cualquiera (positivo, nulo o negativo) y repite «mientras , restar 2 de ». ¿Termina para todo ?
Eso ocurre con la condición ; con , la repetición se detiene en cuanto vale 0 o .Con negativo la condición es falsa desde el comienzo, y el cuerpo no se ejecuta.La conclusión es correcta, pero la razón no: ser entero no basta; hace falta que la cantidad sea natural mientras se repite y que decrezca.La cantidad es un natural mientras se repite (lo asegura la condición) y decrece estrictamente: es una variante, la herramienta de la clase 1.1 que la clase 4.3 usa en cada bucle. Con «mientras » la respuesta cambiaría: un impar salta el cero.Repasar: Diseñar bucles correctos
Pregunta 10¿Cuál es el máximo común divisor de 84 y 36?
Es un divisor común, pero no el mayor.Es un divisor común, pero no el mayor: falta el factor 3, que también comparten.Es el mínimo común múltiplo, no el máximo común divisor.Los divisores comunes son 1, 2, 3, 4, 6 y 12. El algoritmo de Euclides lo obtiene sin buscar divisores: y , de modo que . La clase 4.4 lo escribe como bucle y prueba por qué funciona.Repasar: Algoritmos numéricos
Pregunta 11Para decidir si 101 es primo probando divisores, ¿hasta qué divisor basta llegar?
Usa la mitad: es correcto, pero cinco veces más largo de lo necesario.Prueba todos los candidatos: es correcto, pero no aprovecha que los divisores van en pares.Es una respuesta honesta: la clase 4.4 lo demuestra.Si 101 tuviera un divisor con , también lo sería, y uno de los dos sería a lo sumo . Basta probar de 2 a 10: ninguno divide a 101, que es primo. La clase 4.4 demuestra la regla y la escribe sin raíces ni productos que desborden.Repasar: Algoritmos numéricos
Cargando el contenido…