"Информатика", Поляков К.Ю., Еремин Е.А.
Разработка программы — это последовательный путь от понимания задачи до проверки готового решения. Сначала выясняют, какие данные получает программа и что должна выдать, затем формализуют условие и составляют алгоритм. После этого алгоритм записывают на языке программирования и проверяют на разных данных. Такой порядок помогает избежать неоднозначностей, найти ошибки и убедиться, что программа решает именно поставленную задачу, а не только успешно запускается.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Постановка задачи — точное описание того, что требуется получить, какие данные подаются на вход и какие ограничения нужно учитывать. Например, для задачи о сумме двух чисел нужно знать, что вводятся именно два числа, а результатом будет их сумма. Это определение помогает заранее понять, какие действия должна выполнять программа и какие случаи нельзя упустить.
Формализация — представление условия задачи в виде, удобном для решения: выделяют исходные данные, результат и связи между ними. Слова условия превращаются в чёткие требования, например «ввести три числа» и «вывести наибольшее». Формализация нужна, чтобы разные люди одинаково понимали задачу и не начинали программировать на основе догадок.
Алгоритм — точная последовательность действий, которая приводит от исходных данных к результату. В нём описывают, что и в каком порядке нужно сделать, например сравнить числа или выполнить вычисления. Алгоритм позволяет проверить замысел решения отдельно от кода и помогает позже записать его на языке программирования.
Отладка — поиск и исправление ошибок в программе; тестирование — проверка её работы на специально подобранных данных. Во время тестирования выясняют, верно ли программа обрабатывает разные входные значения, а при отладке ищут причины неверного поведения. Эти действия нужны, потому что даже тщательно написанный код может содержать ошибки.
Разработка начинается с постановки задачи: сначала нужно выяснить, что именно должна делать программа и какие данные получать. Если начать с кода, не определив ожидаемый результат, можно построить программу, которая выполняет действия, но отвечает не на тот вопрос. Поэтому в условии уточняют входные данные, результат и ограничения. Например, важно различать задачу «найти корни уравнения» и задачу «найти только действительные корни».
Затем условие формализуют: выделяют входные и выходные данные, допустимые значения и нужные вычисления. Это делают потому, что обычный текст может допускать разные толкования, а программа должна действовать по точным правилам. Например, для поиска наибольшего из трёх чисел нужно заранее решить, как сравниваются значения и что делать, если несколько чисел равны. Чёткое описание помогает составить полный способ решения и не забыть особые случаи.
По формализованной задаче разрабатывают алгоритм — последовательность шагов для получения результата. Каждый шаг должен быть понятным и выполнимым, а весь алгоритм — охватывать допустимые исходные данные. Это важно, потому что даже верно записанная программа не сможет исправить неверную логику решения. Алгоритм мысленно проверяют на примерах, чтобы заметить пропущенные действия или ветви.
После этого алгоритм записывают на языке программирования, соблюдая его правила. Язык задаёт точную форму команд, условия их записи и порядок вычислений, поэтому компьютер может выполнить полученный текст. Но программа — это лишь запись алгоритма, а не доказательство его правильности. В коде могут быть как нарушения правил языка, так и ошибки в самой логике.
Готовую программу запускают и проверяют на тестах; обнаруженные ошибки находят и исправляют. Проверки нужны, чтобы увидеть, как решение ведёт себя не только на одном удобном примере, но и в других ситуациях. Если после исправления код всё ещё выдаёт неверный ответ, стоит проверить алгоритм и исходную постановку задачи. Так разработчик возвращается к предыдущему этапу, когда проблема возникла не только из-за записи команд.
| Этап | Что делают | Результат |
|---|---|---|
| Постановка задачи | Уточняют, что требуется получить, какие данные вводятся и какие ограничения заданы. | Точное описание задачи. |
| Формализация | Выделяют входные и выходные данные, связи между ними и необходимые вычисления. | Формальное условие задачи. |
| Разработка алгоритма | Определяют последовательность шагов решения и проверяют её на примерах. | Алгоритм решения. |
| Программирование | Записывают алгоритм на выбранном языке программирования. | Текст программы. |
| Тестирование и отладка | Проверяют программу на тестах, находят причины ошибок и исправляют их. | Проверенная и исправленная программа. |
Таблица показывает, какой результат получают на каждом этапе и почему разработка не сводится к написанию кода. Её можно использовать как план действий: если неизвестно, что вводить, нужно уточнить постановку или формализацию. Если программа даёт неверный ответ, следует проверить тесты, алгоритм и код.
Условие. Нужно составить программу, которая по двум введённым числам выводит их сумму. До записи кода определим, что именно получает программа и какой результат должна показать. Затем составим простой алгоритм и проверим его на нескольких парах значений.
Ответ. Алгоритм состоит из ввода двух чисел, сложения и вывода суммы. Код должен повторять именно эти шаги с соблюдением правил выбранного языка. Несколько тестов помогают убедиться, что программа не ограничивается одним удобным примером.
Условие. Нужно найти наибольшее из трёх введённых чисел. При решении важно учесть, что наибольшим может оказаться любое из них, а значения могут совпадать. Поэтому удобнее сначала описать случаи сравнения, а затем переносить их в ветвления программы.
Ответ. Алгоритм сравнивает числа и по результатам сравнений выбирает наибольшее. Проверка равных значений важна, потому что реальные входные данные не обязаны быть различными. Для проверки программы нужны случаи, в которых максимумом становится каждое из чисел.
Условие. Для введённых коэффициентов нужно решить квадратное уравнение или сообщить, что действительных корней нет. Запись ax² + bx + c = 0 является квадратным уравнением только при a ≠ 0. Значит, программа должна сначала проверить коэффициент a, а затем выбирать действия по дискриминанту D = b² − 4ac.
Ответ. Решение состоит из проверки a, вычисления дискриминанта и выбора результата по его знаку. Ветвления необходимы, потому что формулы и ответ отличаются для разных случаев. Тесты должны покрывать все ветви алгоритма, включая нулевой коэффициент при x².
Начинать писать код, не выяснив входные данные и требуемый результат, — значит рисковать решить другую задачу. Так поступают, когда торопятся перейти к знакомым командам и считают условие очевидным. Перед началом проверьте, можете ли вы одним предложением назвать, что вводится и что должно быть выведено.
Считать программу правильной только потому, что она запускается без сообщений об ошибках, тоже неверно. Запуск показывает, что программа смогла начать выполнение, но не доказывает правильность вычислений. Проверьте ответ вручную хотя бы на нескольких входных данных и сравните его с ожидаемым.
Проверять программу только на одном обычном примере недостаточно: ошибки часто скрываются в граничных, нулевых или повторяющихся значениях. Один удачный тест может не задействовать проблемную ветвь алгоритма. Составьте список разных случаев, включая особые значения из условия, и проверьте каждый из них.
Исправлять отдельные строки кода, не проверяя логику алгоритма, — значит устранять возможное следствие, а не причину. Эту ошибку допускают, когда проблема заметна в тексте программы и кажется, что достаточно заменить одну команду. Чтобы проверить себя, проследите решение по шагам на примере и выясните, верны ли сами действия; если нет, пересмотрите алгоритм.
Для разработки программ нужны умения, которые изучают при работе с алгоритмами и языком программирования. Нужно различать исходные данные и результат, использовать переменные для хранения значений, а ветвления и циклы — для выбора действий и повторений. Эти знания помогают представить решение как набор точных шагов и записать его в форме, понятной компьютеру.
Этапы разработки применяются не только в простых задачах, но и при создании программ с массивами, файлами и функциями. Чем сложнее программа, тем важнее заранее определить данные, разделить решение на части и подобрать проверки для разных ситуаций. Такой порядок остаётся полезным при работе на любом языке программирования.
Почему нельзя сразу переходить от условия задачи к написанию программы?
В условии могут быть неясны входные данные, требуемый результат или ограничения. Если сразу писать код, можно реализовать не то решение; формализация и алгоритм помогают сначала разобраться в задаче.
Чем формализация задачи отличается от разработки алгоритма?
При формализации условие представляют точно: выделяют входные данные, результат, ограничения и связи между ними. При разработке алгоритма определяют последовательность действий, которая по этим данным приводит к результату.
Как понять, что алгоритм приводит к нужному результату?
Нужно проверить, что каждый шаг алгоритма понятен и применим к допустимым исходным данным. Затем его проверяют на разных случаях, включая граничные и особые значения, и сравнивают полученные результаты с ожидаемыми.
Чем тестирование отличается от отладки?
Тестирование — это проверка программы на специально подобранных данных, которая помогает обнаружить неверное поведение. Отладка — поиск причины ошибки и её исправление; после исправления программу снова тестируют.
Почему программа может работать без ошибок, но выдавать неверный ответ?
Сообщения об ошибках при запуске обычно указывают на проблемы, которые программа не может выполнить, например нарушение правил языка. Но алгоритм может быть неверным или не учитывать часть условий, поэтому программа запустится, но даст неправильный ответ.
§ 23. Как разрабатывают программы?