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

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

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

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

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

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

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

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

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

  1. Вопрос 1Из предыдущих разделовЧто выводит int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c);?

  2. Вопрос 2Из предыдущих разделовВ цикле int total{0}; int k{1}; while (k <= n) { total += k; ++k; }, где n≥0n \geq 0, какое соотношение выполняется всякий раз, когда вычисляется условие?

  3. Вопрос 3Из предыдущих разделовСпецификация деления гласит: «даны целые a≥0a \geq 0 и b>0b > 0; найти qq и rr, такие что a=b⋅q+ra = b \cdot q + r и 0≤r<b0 \leq r < b». Каково её предусловие?

  4. Вопрос 4Из предыдущих разделовПосле int a{3}; int b{a}; b = 7; чему равно a?

  5. Вопрос 5Из предыдущих разделовВ программе урока 4.4, которая выводит простые числа, меньшие 100, есть цикл, перебирающий кандидатов, а внутри него другой, проверяющий их делители. Какая часть является вычислением с собственными входными и выходными данными, которое стоило бы назвать?

  6. Вопрос 6Программа начинается в main; main вызывает функцию g, а g вызывает другую функцию h. Какие вызовы не завершены, пока выполняется h?

  7. Вопрос 7Дана функция int f(int x) { x = x + 1; return x; }. Что выводит int a{3}; int b{f(a)}; std::println("{} {}", a, b);?

  8. Вопрос 8Программа читает дату и должна вывести её день недели. Какая декомпозиция отделяет вычисление от представления?

  9. Вопрос 9Какое из следующих определений задаёт n!n! для любого натурального nn?

  10. Вопрос 10Дана функция int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); }. Что выводит std::println("{}", f(3));?