Выполнение программы
Выполнение программы — это последовательное преобразование исходных данных в результат по правилам алгоритма. Компьютер читает команды, вычисляет выражения, изменяет значения переменных и проверяет условия, поэтому ответ зависит не только от текста программы, но и от порядка выполнения команд.
1. Что происходит при запуске
Сначала программа записана в виде исходного текста. Структура программы определяет, где находятся объявления, команды и блоки алгоритма. Перед запуском текст обрабатывает компилятор или интерпретатор: проверяется запись команд, имена переменных и допустимость операций. Затем программа выполняется по шагам.
- Компьютер получает исходные данные: их вводит пользователь, читает из файла или они уже записаны в программе.
- Создаются переменные и их начальные значения.
- Выполняется первая команда, затем следующая, если управление не передано в другое место.
- Для каждой команды вычисляются нужные выражения.
- Полученные значения записываются в переменные, выводятся на экран или используются в следующей команде.
Команда задаёт действие программы: присваивание, ввод, вывод, проверку условия или повторение. Выражение состоит из чисел, переменных, знаков операций и вызовов функций и имеет значение. Например, в команде \(c = a + b\) выражение \(a+b\) вычисляется, а затем его результат присваивается переменной \(c\).
Важно отличать выполнение команды от её записи. В строке x = x + 1 правая часть вычисляется по старому значению \(x\), а затем новое значение сохраняется в \(x\). Это не равенство из математики, а присваивание.
2. Вычисление выражений
При вычислении выражения учитываются приоритеты операций. Обычно сначала выполняются действия в скобках, затем возведение в степень, затем умножение, деление и остаток от деления, а после них сложение и вычитание. Операции одного приоритета выполняются слева направо, если язык программирования не устанавливает иное.
| Уровень | Операции | Пример |
|---|---|---|
| 1 | Скобки | (a + b) |
| 2 | Степень | a ** 2 |
| 3 | Умножение, деление, остаток | a * b, a / b, a % b |
| 4 | Сложение и вычитание | a + b, a - b |
| 5 | Сравнение | a > b, a == b |
| 6 | Логические операции | not, and, or |
Тип данных влияет на результат. При целочисленном делении результат может быть целым, а при обычном делении — вещественным. Остаток \(a\bmod b\) показывает, что осталось после деления \(a\) на \(b\). Например, \(17\bmod 5=2\), потому что \(17=3\cdot5+2\).
Чтобы вычислить выражение, сначала расставьте скобки согласно приоритетам, затем заменяйте каждую операцию её результатом. Подставляйте текущие значения переменных, а не значения, которые были в начале программы.
Каково значение переменной x после выполнения команд x = 7; x = x * 2 - 3?
3. Переменные и состояние программы
В каждый момент выполнения у программы есть состояние: значения всех переменных и положение управления. Команда присваивания изменяет состояние только после полного вычисления правой части. Если переменная встречается справа, используется её значение до присваивания.
1a = 4 2b = a + 3 3a = b * 2 4print(a, b)
После первой строки \(a=4\). После второй \(b=7\), но \(a\) остаётся равным 4. После третьей \(a=14\). Поэтому выводом будут числа 14 и 7. Удобно записывать состояние после каждой команды в таблице трассировки.
Нельзя без дополнительной переменной просто выполнить a = b; это уничтожит старое значение \(a\). Для обмена используют временную переменную.
4. Ветвление и повторение команд
Управление может идти не только сверху вниз. В условной команде проверяется логическое выражение, результат которого — истина или ложь. Если условие истинно, выполняется одна ветвь, иначе — другая. Сравнение = в некоторых языках означает присваивание, а проверка равенства записывается как ==; конкретный синтаксис нужно знать для используемого языка.
Повторение команд выполняется в цикле. Число повторений зависит от начального значения счётчика, условия продолжения и изменения счётчика. При ручном разборе полезно для каждой итерации фиксировать номер шага и значения переменных.
1s = 0 2for i in range(1, 4): 3 s = s + i 4print(s)
Цикл выполняется для \(i=1\), затем \(i=2\), затем \(i=3\). Значения \(s\) после итераций равны 1, 3 и 6. После этого условие продолжения не выполняется, и выводится 6.
<ul><li>Читать программу «по смыслу», пропуская отдельные команды.</li><li>Использовать первоначальное значение переменной после того, как оно уже изменилось.</li><li>Забывать о приоритете операций и скобках.</li><li>Считать лишней последнюю итерацию цикла или, наоборот, выполнять её после окончания условия.</li><li>Путать остаток от деления с частным: \(17\bmod5=2\), а не 3.</li><li>Не учитывать целочисленный тип, отрицательные числа и округление вещественных значений.</li></ul>
5. Разбор программы по шагам
Рассмотрим программу. Нужно определить значение z после её выполнения.
1x = 5 2y = 2 3x = x + y * 3 4y = x % 4 5z = x - y
Показать решение Решение
Составим трассировку: после каждой строки записываем только изменившиеся значения.
| Шаг | Команда | x | y | z |
|---|---|---|---|---|
| 1 | x = 5 | 5 | — | — |
| 2 | y = 2 | 5 | 2 | — |
| 3 | x = x + y * 3 | 11 | 2 | — |
| 4 | y = x % 4 | 11 | 3 | — |
| 5 | z = x - y | 11 | 3 | 8 |
После выполнения всех команд \(z=8\). Ключевой момент — в строке y = x % 4 используется уже изменённое значение \(x=11\).
6. Как решать задания на выполнение программы
- Выпишите начальные значения переменных и входные данные.
- Проверьте, где начинаются и заканчиваются ветви и циклы.
- Для каждой строки вычислите правую часть с учётом приоритета операций.
- Сразу занесите новый результат в таблицу; старое значение больше не используйте.
- Для цикла выделите отдельную строку на каждую итерацию.
- В конце перепроверьте ответ обратной подстановкой или повторным проходом.
Если программа длинная, не переписывайте неизменяемые переменные в каждом столбце. Но обязательно фиксируйте переменные, которые участвуют в следующих командах, условиях и циклах.
Быстрая проверка
r после a = 19; r = a % 6?x = x + 4?2 + 3 * 4?Главное
- Программа выполняется по командам, но порядок может изменяться условиями и циклами.
- Правая часть присваивания вычисляется по текущим значениям, после чего результат записывается в переменную.
- Скобки и приоритет операций определяют порядок вычислений.
- Для ручного решения фиксируйте состояние переменных после каждой команды или итерации.
- Проверяйте типы данных, остаток от деления и границы выполнения цикла.