Информатика |
Глава 8. Введение в программирование | назад оглавление вперед |
8.1. Основные понятия программирования
Введем основные понятия программирования. Их рассмотрение позволит сосредоточить внимание на специфике вычислительной машины как средства выполнения разрабатываемых программ и подготовит Вас для восприятия дальнейшего материала.
Исполнитель — это человек или автомат (в частности, им может быть процессор ЭВМ), умеющий выполнять некоторый, вполне определенный конечный набор действий. Приказ на выполнение действия из указанного набора, выраженный каким-либо заранее оговоренным способом, называется предписанием, а вся совокупность допустимых приказов—системой предписаний исполнителя.
Давая задание исполнителю на выполнение некоторой работы, мы обычно выдаем ему не одно предписание, а некоторую конечную последовательность предписаний, задавая также порядок, в котором эти предписания должны быть выполнены. Такая последовательность предписаний с указанием порядка их выполнения называется программой.
Всякое действие производится над некоторыми объектами, и о его результатах можно полностью судить по изменению состояния этих объектов. Один из видов объектов — переменная. Понятие переменной является одним из центральных понятий программирования. (Понятие переменной имеет в программировании другой смысл, чем в математике.) Поясним это понятие на примере.
Пример. Требуется найти произведение любых двух натуральных чисел n, m. Результат обозначить через k.
Составим задание для исполнителя, который не умеет выполнять умножение, а умеет лишь складывать. В этом случае решение задачи не может быть выполнено в одно действие, а требует разложения на ряд последовательных действий, т. е. составления программы.
Так как программа должна “работать” для любой пары натуральных чисел, то сами конкретные числа в программе не фигурируют. Вместо чисел употребляются имена, обозначающие изменяемые объекты, которые называются переменными. Перед началом вычислений этим переменным должны быть присвоены значения. Присвоение—одно из важнейших действий, выполняемых вычислительной машиной (на использование которой в качестве исполнителя мы и ориентируемся в конечном счете).
Переменную можно представить себе как ящик, обозначенный именем, идентифицирующим эту переменную. Присвоение переменной с именем n значения 5 можно представить себе так; положить в ящик, обозначенный n, 5 шаров. (Ящик является аналогом ячейки памяти ЭВМ.)
Значение одной переменной можно переслать в другую переменную. При этой операции значение пересылаемой переменной не изменяется. Например переслать значение n в переменную i, или присвоить переменной i значение n, означает задать i такое же значение, которое имеет переменная n, т. е, скопировать значение n. Если было, допустим, n=5, то присвоение i значения n (записывается i = n — i присвоить значение n) означает, что нужно как бы посмотреть, какое число находится в ячейке памяти n, и такое же число “положить” в ячейку памяти i. Теперь будет i=5, но при этом n сохранило значение (n=5). Следует отметить также, что в выражении i = n знак “=” обозначает не равенство, а операцию присвоения.
Часто в программировании используется такая операция присваивания, когда слева и справа используется одна и та же переменная, например, i = i + 1. Такая запись означает, что сначала должна быть выполнена операция сложения (i+1), а затем полученная сумма присвоена переменной i в качестве ее нового значения. При этом старое значение i пропадает, “стирается”. После выполнения этой операции i будет иметь значение на 1 больше, чем перед ее выполнением.
Вернемся к нашей задаче. Чтобы получить произведение n на m, используя операцию сложения, нужно просуммировать m слагаемых, равных n, т. е. вычислить
Но эта формула — не программа, хотя бы потому, что здесь есть неопределенность (например, многоточие),
Решение этой задачи можно представить как последовательность выполнения следующих простых шагов;
Положить k = 0.
Далее выполнить операцию
k = k + n
m раз. При этом после каждого выполнения указанной операции значение k увеличивается на n. В итоге в k будет получен результат решения задачи.
Чтобы выполнить операцию требуемое число раз, нужно считать, сколько раз эта операция уже выполнена. Используем для этого вспомогательную переменную i. Назовем ее счетчиком. Перед первым прибавлением к k значения n положим i = 1 и после очередного изменения k. значение счетчика i будем менять на 1.
Тогда программа может быть записана так:
1 задать конкретные значения n, m
2 k = 0
3 i =1
4 k = k + n
5.i = i +1
6 если i m идти к 4. (Повторить выполнение операций, начиная с п. 4)
7 закончить вычисления
Пояснения к программе.
1. Программа написана на обычном языке человеческого общения с использованием общепринятой математической символики (это так называемый “естественный” язык).
2. Операторы 2, 3 задают начальные значения переменных k и i. В языках программирования предписание о выполнении некоторой операции (например, операции присваивания) называется оператором.
3. Оператор 4 при каждом своем выполнении увеличивает значение k на n. Оператор 5 увеличивает значение счетчика на 1 после того, как выполнено очередное сложение.
4. Оператор 6 проверяет условие i m, и если оно выполняется, т. е. не все m сложений еще выполнены, то происходит возврат к оператору 4 и повторное выполнение программы, начиная с оператора 4. Как только в процессе выполнения программы условие i m не будет выполнено, процесс вычислений заканчивается. Это произойдет, когда будет i > m, т. е. все нужные сложения выполнены.
Приведенная программа задает порядок действий, которые могут быть выполнены, когда n и m получат конкретные значения.
Совокупность значений переменных, которые должны быть заданы перед выполнением программы, называется исходными данными.
Упражнение 1. Выполнить программу при n=5, m=3. Проследить за изменением переменных.
Указание. Для каждой переменной, используемой в программе (n, m, k., i), предусмотреть ячейку памяти. При задании значения переменной записать это значение в ячейке памяти с соответствующим именем. После выполнения программы сравнить содержимое ячейки k с правильным ответом (результатом умножения 3 на 5).
Решение. Содержимое ячеек памяти (значения переменных) после выполнения оператора 1.
Отсутствие записи означает, что значение переменной не определено.
Содержимое ячеек памяти после выполнения операторов 2, 3.
Содержимое ячеек n, m далее не изменяется.
После первого выполнения операторов 4, 5.
Выполнение оператора 6 не изменяет значений переменных, а связано с проверкой условия. Условие здесь задано в виде отношения и вычисляется каждый раз при текущих значениях входящих в него переменных. Результатом вычисления условия является да, если условие удовлетворяется для входящих в него переменных, или нет, если условие не удовлетворяется. При значении да в данной программе будет осуществляться переход к оператору 4, при значении нет — переход к следующему по порядку оператору (в данном случае - окончание выполнения программы).
При первом выполнении оператора 6 проверяется условие 2 3. Оно имеет значение да, поэтому следующим выполняется оператор с номером 4.
После второго выполнения операторов 4, 5.
При втором выполнении оператора 6 условие 3 3 имеет значение да, и снова выполняется оператор 4.
После третьего выполнения операторов 4, 5.
При третьем выполнении оператора 6 условие 4 3 не удовлетворяется (имеет значение нет}, и выполнение программы прекращается.
Результатом является последнее значение переменной k, равное 15.
Изменение значений переменных при выполнении программы можно представить в более компактном виде — в виде трассировочной таблицы, в которой записываются все значения, последовательно принимаемые изменяемыми переменными программы. Для рассмотренной выше программы изменяются только переменные k и i, и трассировочная таблица имеет вид
k |
0 |
5 |
10 |
15 |
i |
1 |
2 |
3 |
4 |
Отметим, что в рассмотренной программе после выполнения оператора 6 (если условие выполняется) осуществляется возврат к оператору 4 и повторное выполнение операторов 4—6. Многократно повторяющаяся при выполнении часть программы носит название цикл. Цикл является типичной структурой, реализуемой в программах для ЭВМ. Его использование позволяет записать последовательность действий один раз, а выполнять их многократно, после каждого выполнения возвращаясь к началу этой последовательности (цикла).
Упражнение 2. Составить программу на естественном языке для возведения числа х в степень k (k — натуральное число), используя операцию умножения. Результат обозначить через z.
Выполнить программу для х=4, k=3, фиксируя изменение переменных с использованием: а) ячеек памяти; б) трассировочной таблицы.
Решение. Необходимо составить программу для вычисления
Положим вначале z = 1, а далее выполним операцию z = z * x
k раз. Для подсчета выполненных умножений используем счетчик i (см. также предыдущий пример).
Программа на естественном языке будет иметь вид
1 задать конкретные значения x, k
2 z = 1
3 i = 1
4 z = z * x
5 i = i +1
6 если i k идти к 4
7 закончить вычисления
Предусмотрим четыре ячейки памяти для переменных. При изменении значения переменной старое значение теперь будем зачеркивать и рядом записывать новое:
Последнее значение z = 64 и является результатом выполнения программы.