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