Saltar al contenido
Topos Uranos

Resumen

Esta clase abre la octava y última unidad del curso, dedicada a los programas más grandes. Explica su propósito: organizar, verificar y depurar programas que ya no caben en un archivo ni en la cabeza; presenta sus tres clases y el hilo que las une, que cierra el círculo abierto en la primera clase del curso (especificar, construir, verificar); recuerda lo que la unidad da por sabido, que es el curso entero; formula el problema que la unidad resuelve, el de un programa de un solo archivo que funciona con los datos con que se lo probó y calla un error en el borde de su especificación; anticipa la diferencia entre probar y demostrar; y muestra adónde conduce, en el proyecto final y en 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, con un ejemplo, la diferencia entre declarar y definir una función, el contrato que la especifica y las etapas (compilación y enlace) que convierten varios archivos en un programa.
  3. Anticipar, con un ejemplo, la diferencia entre probar un programa con algunos casos y demostrar que es correcto para todos los admisibles.
  4. Reconocer qué se espera saber hacer al terminar la unidad y el curso, y distinguirlo de lo que se aprenderá en Programación en C++ II.

Evaluación de entrada

Antes de recorrer la unidad conviene medir el punto de partida. Esta evaluación no se califica: orienta el estudio. Las siete primeras preguntas comprueban lo que la unidad da por sabido (declarar y definir, la precondición, el contrato de una función de la unidad 6, los mensajes del enlazador, los casos de una búsqueda binaria, la tabla de traza y la lectura fuera de un vector); las tres siguientes tocan, en el orden de las clases, las ideas centrales de la unidad, y en ellas «todavía no lo sé» es una respuesta honesta. Cada respuesta explica el punto y nombra la clase que lo trata; las mismas destrezas se vuelven a medir 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é hace la línea int gcd(int a, int b); escrita antes de main?

  2. Pregunta 2De unidades anterioresLa función toBase(n, base) tiene la precondición «n >= 0 y 2 <= base <= 10». ¿Quién debe garantizarla?

  3. Pregunta 3De unidades anterioresLa función binarySearch(values, target) de la clase 6.4 devuelve una posición de target o values.size() si no está. ¿Cuál es su precondición?

  4. Pregunta 4De unidades anterioresUn programa compila sin errores y, al construir el ejecutable, aparece undefined reference to `tetrahedral(int)'. ¿Qué etapa falló?

  5. Pregunta 5De unidades anteriores¿Cuál de estos conjuntos de casos pone mejor a prueba una búsqueda binaria?

  6. Pregunta 6De unidades anteriores¿Qué valen a y b después de int a{0}; int b{1}; for (int i{0}; i < 4; ++i) { const int t{a + b}; a = b; b = t; }?

  7. Pregunta 7De unidades anteriores¿Por qué std::vector<int> v{1, 2}; std::println("{}", v[2]); se detiene con las opciones del curso y, compilado con -O2, puede escribir un número cualquiera?

  8. Pregunta 8Una cabecera con guardas de inclusión define (no solo declara) double scale(double x), sin inline, y la incluyen main.cpp y report.cpp. ¿Qué ocurre al construir el programa?

  9. Pregunta 9Una función pasa quinientas pruebas automáticas elegidas con cuidado. ¿Qué se puede afirmar?

  10. Pregunta 10Un punto de interrupción está en la línea total += k;, dentro de un bucle, y el programa se detiene allí por tercera vez. ¿Qué indica la línea resaltada?