Краткое содержание
Этот урок завершает первый раздел курса, посвящённый первым шагам в программировании на C++. Он восстанавливает цепочку понятий, ведущую от специфицированной задачи к ошибке, классифицированной по моменту её появления, через алгоритм, исходный код, компиляцию и компоновку, исполняемый файл и связь программы с внешним миром; отделяет то, что из всего этого верно для любого языка, от того, что свойственно C++; собирает неопределённое поведение, которое показал раздел, и вытекающее из него правило курса: всегда компилировать с предупреждениями, а во время разработки и с санитайзерами; повторяет в итоговой проверке навыки входной проверки; и заканчивается шестью задачами повышенной трудности, объединяющими весь раздел: сдача наименьшим числом монет, выровненная таблица без циклов, программа с пятью дефектами пяти видов, эксперимент с буфером вывода, дата в фиксированном формате и объяснение компилятора тому, кто знает только интерпретируемый язык.
Цели обучения
- Самостоятельно пройти путь от условия задачи до выполненной программы: специфицировать, записать алгоритм, выполнить его вручную, записать его на C++, скомпилировать с опциями курса, запустить и проверить результат.
- Объяснить, какой инструмент действует на каждом шаге этого пути (редактор, препроцессор, компилятор, компоновщик, санитайзеры) и что каждый из них получает и выдаёт.
- Распознавать вид ошибки (компиляции, компоновки, времени выполнения или логическая) по тому, как она проявляется, и исправлять несколько ошибок в том порядке, в каком они обнаруживаются.
- Объяснить на примере, что такое неопределённое поведение и почему в курсе компилируют с предупреждениями и санитайзерами.
- Отделять в изученном в разделе то, что верно для любого языка, от того, что свойственно C++.
Чего достиг раздел
Раздел ставил целью провести того, кто никогда не программировал, от задачи, сформулированной обычным языком, до программы, которая компилируется, выполняется, читает данные и выводит результаты, с пониманием того, что сделал на этом пути каждый инструмент. Он достиг этого, опираясь лишь на то, что введение объявило известным: школьную арифметику, привычку следовать письменным инструкциям и умение обращаться с файлами и папками.
От задачи к алгоритму
Урок От задачи к алгоритму установил, что задача определяется своей спецификацией, контрактом, который обещает постусловие для всякого входа, удовлетворяющего предусловию, и ничего за его пределами. Алгоритм есть конечная, определённая и массовая процедура, которая записывается пронумерованными шагами, выполняется вручную с помощью таблицы трассировки и строится из следования, ветвления и повторения; каждое повторение сопровождается вариантом цикла, натуральной величиной, которая уменьшается на каждой итерации и гарантирует, что повторение завершается.
Программы, компиляторы и C++
Урок Программы, компиляторы и C++ показал, что текст программы на C++ не выполняется как есть: препроцессор, компилятор и компоновщик превращают его в исполняемый файл. Отсюда вытекло различение, проходящее через весь раздел: то, что зависит только от текста, обнаруживается при компиляции или компоновке, а то, что зависит от данных, только при выполнении. Урок сравнил компилируемую модель с интерпретируемой и обосновал, почему курс использует C++23 и запрашивает его опцией -std=c++23.
Установка среды
Урок Установка среды в Windows, macOS и Linux установил компилятор, поддерживающий C++23, и Visual Studio Code с расширением для C++. Его методический урок состоит в том, что редактор не компилирует, а вызывает компилятор, который должен находить терминал, и что точный текст сообщения отличает сбой установки от сбоя вызова.
Компиляция, запуск и настройка
Урок Компиляция, запуск и настройка закрепил цикл из правки, сохранения, компиляции, запуска и чтения, а также команду курса. Он отличил ошибку, которая не даёт получить исполняемый файл, от предупреждения, которое его допускает, но указывает на подозрительный код; включил санитайзеры (санитайзер ошибок памяти, AddressSanitizer, и санитайзер неопределённого поведения, UndefinedBehaviorSanitizer), которые наблюдают за выполнением, и показал их пределы; и объяснил, что файл, компилятор и консоль должны сходиться на UTF-8.
Анатомия программы
Урок Анатомия программы разобрал минимальную программу: заголовочные файлы, которые объявляют каждую зависимость; main, точку входа, значение которой служит кодом возврата; пространство имён std; инструкции, блоки и комментарии. Он научил читать сообщения начиная с первого и закрепил руководство по стилю курса.
Ввод, вывод и ошибки
Урок Ввод, вывод и ошибки привёл программу в соприкосновение с внешним миром: std::println выводит ровно то, что запрошено, со спецификациями формата, а std::cin читает и останавливается на первом непригодном символе. Чтение, которое натыкается на символ, не способный составить число, записывает в переменную ноль и оставляет поток ввода в состоянии ошибки, молча (число, не помещающееся в тип, или исчерпанный ввод оставляют в переменной другое значение, и урок перечисляет эти случаи); поэтому результат чтения проверяют. Урок завершил раздел классификацией ошибок по моменту их появления: ошибки компиляции, компоновки, времени выполнения и логические.
Загрузка содержимого…