"Информатика. Учебное пособие для учреждений общего среднего образования с русским языком обучения", В. М. Котов, А. И. Лапо, Ю.А. Быкадоров, Е.Н. Войтехович
Получение решения задачи — заключительный этап, на котором программу выполняют на исходных данных и проверяют полученный ответ. Для проверки подбирают тесты, в том числе контрольные примеры с заранее известным результатом, граничные и особые случаи. Если ответ неверен, выясняют причину ошибки, исправляют программу и запускают тесты снова. Так можно убедиться, что программа работает не только на одном удобном примере.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Получение решения задачи — заключительный этап, когда составленную программу выполняют на исходных данных и получают результат. Сам факт запуска ещё не означает, что задача решена правильно: ответ нужно проверить. Этот этап нужен, чтобы убедиться, что программа действительно выполняет поставленную задачу.
Тестирование программы — проверка её работы на специально подобранных исходных данных. Такие данные называют тестами; с их помощью выясняют, правильно ли программа обрабатывает разные ситуации. Тестирование нужно, потому что ошибка может проявляться только при определённых значениях.
Контрольный пример — набор исходных данных, для которого ожидаемый результат известен заранее. Ответ программы на нём сравнивают с правильным ответом, который можно получить вручную или другим надёжным способом. Это позволяет не принимать любой выведенный программой результат за верный.
Отладка — поиск и исправление ошибок в программе. Сначала выясняют, где и почему возникает неверный результат, затем изменяют программу и снова её проверяют. Такой порядок помогает исправить причину сбоя, а не маскировать его случайной правкой.
После составления программы задачу ещё нельзя считать решённой, потому что в алгоритме или его записи могли появиться ошибки. Нужно запустить программу, подать ей исходные данные и изучить полученный результат. Если он соответствует ожидаемому, это подтверждает правильность работы только для проверенного случая, а не для всех возможных данных.
Тесты подбирают так, чтобы проверить разные ситуации, которые может встретить программа. Обычные значения показывают, справляется ли она с типичным случаем, а граничные позволяют проверить поведение у края допустимого диапазона. Особые случаи, например ноль или одинаковые числа, могут обрабатываться отдельной ветвью алгоритма, поэтому их тоже нужно проверять.
Порядок проверки прост: программу запускают на выбранных тестовых данных, записывают её ответ и сопоставляют его с ожидаемым. Если ответы совпали, тест пройден; если нет, нужно выяснить, на каком этапе возникло расхождение. Для этого полезно отдельно проверить исходные данные, вычисления и то, какую ветвь алгоритма выполнила программа.
Чтобы найти место сбоя, выполнение можно проследить пошагово. После каждой команды записывают текущие значения важных переменных и сравнивают их с теми, которые должны получиться по алгоритму. Так становится видно, где значение изменилось неправильно: например, в условии цикла, при обновлении наибольшего элемента или при выводе ответа.
Найденную ошибку исправляют и проверяют программу ещё раз. Повторный запуск теста, на котором появился неверный ответ, показывает, устранена ли причина сбоя. Но нужно повторить и прежние тесты: изменение одной команды может повлиять на другие случаи и создать новую ошибку.
| Способ проверки | Что делают | Для чего применяют |
|---|---|---|
| Проверка на контрольном примере | Запускают программу на данных с заранее известным ответом и сравнивают результаты. | Чтобы проверить правильность вычисления на конкретном примере. |
| Проверка граничных и особых случаев | Подбирают значения у границ диапазона и ситуации с особой обработкой. | Чтобы обнаружить ошибки, незаметные на обычных данных. |
| Пошаговое прослеживание выполнения | Записывают команды и изменения значений переменных по ходу работы. | Чтобы найти шаг, на котором появляется неверное значение. |
| Повторное тестирование после исправления | Снова запускают тесты, включая ранее пройденные. | Чтобы убедиться, что ошибка устранена и исправление не нарушило другую работу. |
Выбирай способ проверки в зависимости от того, что нужно выяснить: совпадает ли ответ, не пропущен ли особый случай или где возник сбой. Для надёжной проверки одного способа обычно недостаточно. Сначала сравнивают результаты на тестах, а при расхождении прослеживают выполнение.
Условие: программа вычисляет сумму двух чисел. Проверим её на контрольном примере, результат которого легко найти самостоятельно. Возьмём числа 7 и 5: ожидаемая сумма равна 12.
Введём в программу первое число 7 и второе число 5. Это исходные данные контрольного примера. Заранее запишем ожидаемый ответ: 7 + 5 = 12.
Запустим программу и посмотрим, что она вывела. Если на экране появилось 12, результат совпал с ожидаемым. Значит, данный тест программа прошла.
Если программа вывела, например, 35, одного этого наблюдения недостаточно для исправления. Нужно проверить, не выполняется ли умножение вместо сложения и правильно ли считываются числа. Затем повторить тест после исправления.
Ответ: на контрольном примере с числами 7 и 5 правильный результат — 12. Совпадение ответа программы с этим значением подтверждает корректность для данного теста. Чтобы проверить другие входные данные, понадобятся дополнительные примеры.
Условие: программа должна определить, является ли целое число положительным, отрицательным или нулём. Здесь алгоритм выбирает один из трёх вариантов, поэтому тест должен проверить каждую ветвь. Возьмём набор значений −4, 6 и 0.
Для числа −4 ожидаем ответ «отрицательное», потому что оно меньше нуля. Запустим программу с этим значением и сравним её ответ с ожидаемым. Так проверяется ветвь для отрицательных чисел.
Для числа 6 правильный ответ — «положительное», поскольку оно больше нуля. Этот тест проверяет другую ветвь условия. Если программа сообщает «отрицательное» или «ноль», нужно искать ошибку в условии или порядке проверок.
Для числа 0 ожидаемый ответ — «ноль». Ноль является особым случаем: он не больше и не меньше нуля. Проверка показывает, выделен ли этот вариант в алгоритме отдельно.
Ответ: для полного набора тестов ожидаются результаты «отрицательное», «положительное» и «ноль» соответственно. Сравнение показывает, правильно ли работают все три варианта алгоритма. Проверка только числа 6 не выявила бы возможную ошибку в обработке нуля.
Условие: программа должна найти наибольший элемент последовательности, но на одном тесте ответ неверен. Проследим вычисления на последовательности 3, 8, 5. Ожидаемый ответ — 8, поэтому она подходит для проверки работы программы.
Запишем предполагаемый ход алгоритма: сначала текущий максимум равен первому элементу, то есть 3. При просмотре следующего числа 8 программа должна заменить максимум на 8. Число 5 уже не должно изменить это значение.
Во время выполнения будем записывать текущее число и значение переменной максимума после каждого шага. Если после обработки 8 максимум остаётся равным 3, сбой произошёл при сравнении или обновлении переменной. Если значение становится 8, но затем меняется на 5, ошибку нужно искать в условии обновления.
Исправим именно ту команду или условие, которое привело к неверному изменению. Затем снова запустим программу на последовательности 3, 8, 5 и проверим, что ответ равен 8. После этого повторим прежние тесты и добавим, например, последовательность, в которой максимум стоит первым.
Ответ: причину ошибки находят по изменению переменной максимума, исправляют соответствующий шаг и повторно проверяют программу. Так проверяется не только конкретный ответ, но и то, правильно ли алгоритм обновляет значение. Дополнительные тесты помогают убедиться, что исправление работает при другом расположении наибольшего элемента.
Проверка только на одном обычном примере — ошибка, потому что она охватывает лишь одну ситуацию. Её допускают, когда простой тест сразу даёт правильный ответ. Проверь себя: подбери несколько разных значений, включая границы диапазона и особые случаи.
Считать любой полученный ответ правильным нельзя: программа может вывести число, но вычислить его неверно. Так поступают, если не подготовили ответ для сравнения. Проверь себя: до запуска запиши ожидаемый результат контрольного примера и сопоставь его с выводом.
Менять программу, не выяснив причину неверного ответа, рискованно: случайная правка способна скрыть один сбой и добавить другой. Это происходит, когда исправление выбирают наугад, не прослеживая алгоритм. Проверь себя: определи команду или условие, где значения перестают соответствовать ожидаемому ходу вычислений.
После исправления нельзя пропускать повторные тесты, потому что изменённый фрагмент может повлиять на уже работавшие случаи. Иногда проверяют только тот пример, на котором нашли ошибку. Проверь себя: повторно запусти и этот тест, и прежние пройденные примеры.
Для проверки программы нужно знать этапы решения задачи, уметь читать алгоритм и понимать, какой результат должен получиться. Без этого нельзя выбрать подходящие тесты и определить, на каком шаге возникло расхождение. Поэтому заключительный этап опирается на постановку задачи и разработанный алгоритм.
Тестирование и отладка нужны при создании программ на любом языке программирования. Команды и инструменты могут различаться, но сравнение ответа с ожидаемым и поиск причины ошибки остаются важными. Эти умения пригодятся и при разработке небольших учебных программ, и при работе с более сложными проектами.
Почему недостаточно просто запустить программу?
Запуск показывает, что программа выполнилась, но не доказывает правильность ответа. Результат нужно сравнить с заранее известным или независимо проверенным ответом на тех же исходных данных.
Чем тест отличается от контрольного примера?
Тест — это исходные данные, на которых проверяют программу. Контрольный пример — такой тест, для которого ожидаемый результат заранее известен, поэтому ответ программы можно проверить.
Какие исходные данные выбирать для проверки?
Нужны обычные значения, разные варианты входных данных и случаи на границах допустимого диапазона. Также проверяют особые значения, например ноль, если алгоритм обрабатывает его отдельно.
Как понять, на каком шаге программы возникла ошибка?
Можно пошагово проследить выполнение и записывать, как меняются значения переменных после каждой команды. Так станет заметно, на каком шаге значение становится неверным или программа выбирает не ту ветвь.
Зачем повторно проверять программу после исправления?
Исправление может повлиять на другие части программы и испортить работу на данных, которые раньше обрабатывались правильно. Поэтому после изменения снова запускают как тест, выявивший ошибку, так и уже пройденные тесты.
21.6. Получение решения задачи (этап 5)