Saltar al contenido
Topos Uranos

Resumen

Esta clase abre la quinta unidad del curso, dedicada a las funciones. Explica para qué sirve la unidad: enseñar a descomponer un problema en partes con nombre, cada una con una interfaz y un contrato, y a resolver ciertos problemas reduciéndolos a una instancia menor de sí mismos, por recursión; presenta sus cuatro clases y el hilo que las une; recuerda lo que la unidad da por sabido, sobre todo los bucles y sus invariantes de la unidad 4; formula el problema que la unidad resuelve, el de un programa que repite el mismo cálculo copiado y que, por un descuido en la copia, responde mal sin que el compilador diga nada; anticipa el contrato (la precondición y la poscondición) como la forma con que la unidad especificará cada parte; y muestra adónde conduce, en las unidades siguientes y en el curso Programación en C++ II.

Objetivos de aprendizaje

  1. Describir la secuencia de contenidos de la unidad y explicar qué aporta cada clase a la siguiente.
  2. Recordar los algoritmos de la unidad 4 (la traza de un bucle, su invariante y su variante) y repasarlos si hace falta.
  3. Anticipar, con un ejemplo, la idea de contrato: lo que una parte del programa exige a quien la usa y lo que le garantiza a cambio.
  4. 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 cinco primeras preguntas comprueban lo que la unidad da por sabido: la traza de un bucle, su invariante, la precondición de una especificación, la copia de un valor en la inicialización y la búsqueda, dentro de un programa de la unidad 4, de un cálculo con entradas y salidas propias. Las cinco siguientes tocan, en el orden de las clases, las ideas centrales de la unidad: la pila de llamadas, el paso de un argumento, la separación entre el cálculo y la presentación, la definición recursiva del factorial y la ejecución de una función que se llama a sí misma. 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.

Evaluación de entrada

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.

  1. Pregunta 1De unidades anteriores¿Qué escribe int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c);?

  2. Pregunta 2De unidades anterioresEn el bucle int total{0}; int k{1}; while (k <= n) { total += k; ++k; }, con n≥0n \geq 0, ¿qué relación vale cada vez que se evalúa la condición?

  3. Pregunta 3De unidades anterioresLa especificación de la división dice: «dados enteros a≥0a \geq 0 y b>0b > 0, obtener qq y rr con a=b⋅q+ra = b \cdot q + r y 0≤r<b0 \leq r < b». ¿Cuál es su precondición?

  4. Pregunta 4De unidades anterioresTras int a{3}; int b{a}; b = 7;, ¿cuánto vale a?

  5. Pregunta 5De unidades anterioresEl programa de la clase 4.4 que escribe los primos menores que 50 tiene un bucle que recorre los candidatos y, dentro, otro que prueba sus divisores. ¿Qué parte es un cálculo con entradas y salidas propias, que convendría nombrar?

  6. Pregunta 6Un programa empieza en main; main llama a una función g, y g llama a otra función h. Mientras h se ejecuta, ¿qué llamadas están en curso?

  7. Pregunta 7Con la función int f(int x) { x = x + 1; return x; }, ¿qué escribe int a{3}; int b{f(a)}; std::println("{} {}", a, b);?

  8. Pregunta 8Un programa lee una fecha y debe escribir su día de la semana. ¿Qué descomposición separa el cálculo de la presentación?

  9. Pregunta 9¿Cuál de las definiciones siguientes define n!n! para todo natural nn?

  10. Pregunta 10Con int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); }, ¿qué escribe std::println("{}", f(3));?