Перейти к содержимому
Topos Uranos

Краткое содержание

Этот урок открывает восьмой и последний раздел курса, посвящённый большим программам. Он объясняет назначение раздела: организовывать, проверять на корректность и отлаживать программы, которые уже не помещаются ни в один файл, ни в голову; представляет три его урока и нить, которая их связывает и замыкает круг, открытый в первом уроке курса (специфицировать, строить, проверять); напоминает, что раздел считает известным, а именно весь курс; формулирует задачу, которую решает раздел, задачу программы из одного файла, которая работает на тех данных, на которых её тестировали, и умалчивает об ошибке на границе своей спецификации; предвосхищает различие между тестированием и доказательством; и показывает, куда ведёт раздел: к итоговому проекту и к курсу «Программирование на C++ II».

Цели обучения

  1. Описать последовательность содержания раздела и объяснить, что каждый урок даёт следующему.
  2. Вспомнить на примере различие между объявлением и определением функции, контракт, который её специфицирует, и этапы (компиляцию и компоновку), превращающие несколько файлов в программу.
  3. Предвосхитить на примере различие между тестированием программы на нескольких случаях и доказательством того, что она корректна для всех допустимых.
  4. Распознавать, что ожидается уметь делать по окончании раздела и курса, и отличать это от того, что будет изучаться в курсе «Программирование на C++ II».

Входная проверка

Прежде чем проходить раздел, полезно определить исходный уровень. Эта проверка не оценивается: она направляет занятия. Первые семь вопросов касаются того, что раздел считает известным (объявление и определение, предусловие, контракт функции из раздела 6, сообщения компоновщика, случаи двоичного поиска, таблица трассировки и чтение за пределами вектора); следующие три в порядке уроков касаются центральных идей раздела, и в них ответ «Пока не знаю» честен. Каждый ответ объясняет суть и называет урок, который её разбирает; те же умения снова измеряются в уроке итогов.

Входная проверка

Перед началом раздела оцени свою отправную точку. Это короткая самопроверка: она не оценивается, а результат хранится только в твоём браузере.

  1. Вопрос 1Из предыдущих разделовЧто делает строка int gcd(int a, int b);, написанная перед main?

  2. Вопрос 2Из предыдущих разделовУ функции toBase(n, base) предусловие «n >= 0 и 2 <= base <= 10». Кто должен его обеспечить?

  3. Вопрос 3Из предыдущих разделовФункция binarySearch(values, target) из урока 6.4 возвращает позицию target или values.size(), если его нет. Каково её предусловие?

  4. Вопрос 4Из предыдущих разделовПрограмма компилируется без ошибок, а при сборке исполняемого файла появляется undefined reference to `tetrahedral(int)'. Какой этап не удался?

  5. Вопрос 5Из предыдущих разделовКакой из этих наборов случаев лучше всего испытывает двоичный поиск?

  6. Вопрос 6Из предыдущих разделовЧему равны a и b после int a{0}; int b{1}; for (int i{0}; i < 4; ++i) { const int t{a + b}; a = b; b = t; }?

  7. Вопрос 7Из предыдущих разделовПочему std::vector<int> v{1, 2}; std::println("{}", v[2]); останавливается с опциями курса, а при компиляции только с -O2, без санитайзеров, может напечатать произвольное число?

  8. Вопрос 8Заголовочный файл с защитой от повторного включения определяет (а не только объявляет) double scale(double x) без inline, и его включают main.cpp и report.cpp. Что происходит при сборке программы?

  9. Вопрос 9Функция проходит пятьсот тщательно подобранных автоматических тестов. Что можно утверждать?

  10. Вопрос 10Точка останова стоит на строке total += k; внутри цикла, и программа останавливается там в третий раз. Что означает выделенная строка?