Анализ структуры программы
Структура программы — это порядок и взаимосвязь её частей: объявлений, команд, блоков, условий, циклов и подпрограмм. Умение видеть эту структуру помогает читать исходный код последовательно и определять, какие действия выполняются и в каком порядке.
Из каких частей состоит программа
Программа обычно состоит из нескольких уровней. Сначала идут служебные элементы и объявления, затем основная часть с командами. В больших программах отдельные действия выносят в подпрограммы: процедуры и функции. Внутри основной части и подпрограмм располагаются операторы, объединённые в блоки.
- Заголовок или имя программы. Он может указывать название программы и параметры запуска.
- Объявления. Здесь задают переменные, константы, типы данных, процедуры и функции.
- Основной блок. Это команды, с которых начинается выполнение программы.
- Подпрограммы. Именованные части кода, которые выполняют отдельную задачу и вызываются из основной программы или друг из друга.
Блок программы — логически выделенная последовательность операторов, выполняемая как единое целое. Блок может быть основной частью программы, телом условия или цикла, а также телом процедуры или функции. В разных языках границы блока обозначаются по-разному: например, отступами, ключевыми словами или фигурными скобками.
Границы частей важно отличать от комментариев. Комментарий объясняет код человеку, но не является командой и не влияет на результат выполнения. Интерпретатор или компилятор пропускает комментарии при обработке программы.
Объявления, операторы и выражения
Объявление сообщает программе, какие имена используются и какие значения или типы с ними связаны. Например, объявление переменной \(x\) резервирует имя для хранения значения. В некоторых языках тип указывают явно, в других он определяется по присваиваемому значению.
1a = 5 2b = 2 * a + 1 3print(b)
В этом фрагменте первые две строки содержат присваивания, а третья — вызов функции вывода. Выражение \(2 \cdot a + 1\) вычисляется справа от знака присваивания, после чего результат записывается в \(b\). Поэтому на момент вывода \(b=11\).
Оператор — команда, задающая действие программы: присваивание, ввод, вывод, проверку условия, повторение или вызов подпрограммы. Выражение — запись, значение которой можно вычислить, например \(a+b\), \(x>0\) или \(2 \cdot n\). Объявление вводит имя или описывает его свойства, а оператор изменяет состояние программы или управляет её выполнением.
При чтении кода полезно различать знак присваивания и знак сравнения. В Python и многих других языках \(=\) означает записать значение, а \(==\) — проверить равенство. Условия часто записываются с помощью простого условия или составного условия.
Порядок выполнения и вложенность блоков
Если команды записаны последовательно и не входят в управляющую конструкцию, они выполняются сверху вниз. Однако управление выполнением программы может изменить этот порядок: условие выбирает одну из ветвей, цикл повторяет блок, а вызов подпрограммы временно передаёт управление другой части кода.
| Конструкция | Как читается | Что происходит |
|---|---|---|
| Последовательность | Сверху вниз | Выполняются все команды по очереди |
| Условие | Если условие истинно, то... | Выполняется выбранный блок; возможна ветка иначе |
| Цикл | Повторять блок | Один блок выполняется несколько раз |
| Вызов подпрограммы | Выполнить имя(...) | Управление передаётся процедуре или функции |
Вложенность показывает, какие команды относятся к блоку. В Python это отступы, в Pascal — ключевые слова begin и end, в C++ — фигурные скобки. При анализе сначала определите внешнюю конструкцию, затем рассмотрите команды внутри неё.
Что произойдёт при выполнении кода: x = 3; x = x + 4; print(x)?
Подпрограммы: процедуры и функции
Подпрограмма — отдельный именованный блок команд, предназначенный для многократного использования. Процедура обычно выполняет действие, а функция дополнительно возвращает значение. Перед выполнением подпрограмму объявляют, а затем вызывают по имени, иногда передавая ей аргументы.
1def square(n): 2 return n * n 3 4x = 4 5print(square(x))
При чтении этого кода не следует выполнять тело функции сразу после строки с её объявлением. Сначала функция только создаётся. Её тело выполняется при вызове \(square(x)\). Аргумент \(x=4\) подставляется вместо параметра \(n\), функция возвращает \(4\cdot4=16\), затем число выводится.
Составьте список имён и их текущих значений. При каждом присваивании обновляйте значение, при условии проверяйте только нужную ветвь, а при вызове функции временно переходите в её тело. После команды return вернитесь к месту вызова.
Разобранный пример: читаем программу по блокам
Определим, что выведет программа. В ней есть функция, цикл и условие. Для анализа выделим объявления, основной блок и вложенные команды.
1def add_if_even(s, x): 2 if x % 2 == 0: 3 return s + x 4 return s 5 6s = 0 7for x in range(1, 5): 8 s = add_if_even(s, x) 9print(s)
После завершения цикла \(s=6\). Команда print(s) выведет 6. Важный шаг — не прибавлять нечётные числа: вызов функции каждый раз проходит через условие.
Алгоритм чтения исходного кода
Для экзаменационных заданий удобно использовать один и тот же порядок действий. Он снижает риск пропустить изменение переменной или неправильно понять вложенность.
- Найдите начало и конец основной части программы.
- Отметьте объявления переменных, констант, функций и процедур.
- Разделите команды на последовательности и вложенные блоки.
- Определите порядок выполнения: последовательность, условие, цикл, вызов подпрограммы.
- Составляйте таблицу значений переменных после каждой важной команды.
- Проверьте, какая команда выполняется последней и что именно выводится.
Не выполняйте команды, находящиеся внутри ложной ветви условия. Не считайте объявление функции её вызовом. Следите за тем, что переменная может изменяться на каждой итерации цикла. Также не путайте локальную переменную внутри функции с одноимённой переменной основной программы: области видимости могут быть различными.
Если в условии есть оператор выбора, анализируйте сначала значение, по которому выбирается вариант, а затем только соответствующую ветвь. Если конструкция записана в другом языке, границы блоков определяйте по его синтаксису, но общий способ рассуждения остаётся тем же.
Проверь себя
Главное
- Структура программы включает объявления, основной блок, операторы и подпрограммы.
- Оператор задаёт действие, выражение вычисляется, а объявление вводит имя или описывает его свойства.
- Код читают сверху вниз, учитывая условия, циклы, вызовы функций и вложенность блоков.
- При трассировке фиксируют значения переменных после важных команд.
- Объявление подпрограммы не запускает её: выполнение начинается при вызове.