линейным участком. Графически он может быть представлен следующим
изображением (рис. 3).
Рис. 3
При выполнении каждого встреченного в строке императивной программы
предписания некоторым образом меняется состояние ЭВМ (содержимое
ячеек памяти). При этом можно сказать, что мы имеем фокус управления,
находящийся при выполнении программы в том или ином известном месте
и определяющий, какое действие будет выполняться следующим.
Какие виды операторов встречаются в программах? Фундаментальное
значение в императивной парадигме программирования имеет так
называемый оператор присваивания, меняющий значение некоторой
переменной в памяти ЭВМ. Приведем примеры операторов присваивания
из разных языков программирования.
Пример на языке Бейсик:
LET X=X+1
Пример на языке Фортран:
A=B+C
Пример на языке Си:
b=sin(x)+cos(x)/(-2)*y;
Пример на языке РАПИРА:
К*СУММАНАЛОГА → M;
Оператор присваивания имеет две части. В одной из них содержится имя
38
переменной, принимающей в результате выполнения оператора
присваивания некоторое значение. В другой содержится константа, имя
другой переменной или записанное в соответствии с правилами языка
выражение, значение которого вычисляется и присваивается. Как видно из
примеров, в выражении допускаются вызовы функций.
Помимо исполнения оператора в программе может встретиться другой вид
действия, а именно вызов подпрограммы с указанием ее имени или номера
строки, которой нужно передать управление. Подразумевается, что при его
исполнении произойдет передача управления иным функции, процедуре,
классу нашей программы или же библиотечной подпрограмме. В
вызванной функции, в свою очередь, должен обязательно встретиться
оператор возврата управления, по выполнении которого вызывающая
программа продолжится со следующей за вызовом подпрограммы строки.
Условный оператор и оператор выбора
Если бы все программы были линейными (их операторы выполнялись
строго в однажды заданном порядке, без альтернатив), их возможности
были бы сильно ограниченными. Несомненно, реальные задачи могут
содержать множество альтернатив, и хочется, чтобы программа могла
обрабатывать разные случаи и ситуации (вспоминая русские сказки:
«направо пойдешь — коня потеряешь», «налево пойдешь…» и пр.). В
языках программирования с этой целью используются условный переход,
условный оператор и оператор выбора.
Условный оператор — конструкция, позволяющая поставить выполнение
тех или иных действий в зависимость от выполнения некоторых условий.
Различают несколько форм условного оператора. Обычный вариант,
содержащий записываемоме по правилам языка программирования
условие, имеет две разновидности полную и сокращенную. В полной форме
указывают два действия — первое, подлежащее выполнению, если условие
выполняется, и второе — выполняемое, если условие ложно.
Пример на языке Паскаль:
IF D>=0 THEN VYCHKORNI()
ELSE WRITELN('Действительных корней у данного уравнения нет');
В некоторых языках (например, Nemerle, какой-то из форм, сокращенной
или полной, может не быть).
Графически условный оператор принято изображать в виде ромба, в
котором записывается условие, а из боковых углов исходят линии,
соответствующие ветвям выполнения ДА и НЕТ (рис. 6). На блок-схеме
видно условие P (предикат) и два действия, S1 и S2, подлежащие
выполнению при истинности и ложности условия.
39
Рис. 4
В сокращенной форме условного оператора приводится лишь действие,
которое необходимо выполнить в ситуации, когда условие истинно. В
противном случае просто ничего не выполняется, лишь происходит
передача управления следующему по порядку записи программы
оператору.
Пример на языке РАПИРА:
ЕСЛИ ОСТДЕНЕГ>0 ТО ВЫДАТЬ_ДЕНЬГИ();
В качестве условия P могут выступать переменная специального
логического типа или некоторое выражение, могущее быть истинным или
ложным, например, в случае сравнения двух величин.
Условие в операторе может быть и сложным, в нем могут присутствовать
логические связки И, ИЛИ, НЕ.
В некоторых языках программирования применяется условный переход. В
этом случае действием является передача управления оператору с
заданным номером или помеченному указанной в операторе условного
перехода меткой. В следующем примере в качестве действия,
выполняемого при истинности условия, использован оператор перехода
goto
.
Пример на языке Си:
if (summa<0) goto oshibka;
Любопытен так называемый арифметический условный оператор. В
ранних версиях языка Фортран имелся лишь данный вариант условного
оператора, который затем был дополнен описанными выше
разновидностями. Выглядит он следующим образом: IF (E) Mneg ,
Mzero , Mpos
. Здесь E – некоторое выражение, значение которого
вычисляется (должно быть числом). Затем перечислены три метки
программы, переход к которым происходит соответственно, если результат
Да
40
меньше нуля, равен нулю и больше нуля. Ниже приводится пример
фрагмента программы на Фортране, вычисляющей корни квадратного
уравнения
DN = B*B - 4*A*C
IF (DN) 90,10,10
10 D = SQRT(DN)
X1 = (-B + D) / (2*A)
X2 = (-B - D) / (2*A)
В языках уровня ассемблера обычно не предусматривается разветвление
программы по условию одной командой. В них подобное действие
разбивается на два:
1.
Установка флагов процессора - либо автоматически арифметическими и
логическими командами при равенстве результата нулю, переносе в
следующий разряд, получении отрицательного значения, и в других
подобных ситуациях, или с помощью использования специальных
команд тестирования ячейки и сравнения двух величин.
2.
Переход по значению заданного условия (флага).
В случае если условие не выполняется, происходит переход к следующей
команде.
Пример на языке ассемблера PDP-11:
BIT #1,A ; проверка первого разряда А
BEQ KZ1; переход, если равен нулю
или
CMP NOB,#33 ; сравнение NOB с числом 33
BLT KZ1; переход, если NOB < 33
На практике встречаются случаи, когда возможных ситуаций не две, а
больше (вспомним камень на развилке из сказки, обычно там
предусмотрены три варианта). Во многих языках программирования
существует специальный оператор для поддержки подобных случаев —
оператор выбора, или переключатель. Как правило, для ветвления
используется набор допустимых значений некоторой переменной
(заметим, что переменная должна быть перечислимого, например целого,
типа), однако возможен и более универсальный вариант с возможностью
указания произвольного условия для каждого варианта, подлежащего
обработке. Каждому указанному в операторе выбора значению переменной
сопоставляется своя ветвь выполнения программы. Еще одна ветвь может
присутствовать для случая, если значение переменной, по которому
производится выбор, не соответствует ни одному из указанных.
Пример на языке Паскаль:
41
case NUM of
0: writeln ('
Нуль');
1: writeln ('
Один');
2: writeln ('
Два');
3: writeln ('
Три');
4: writeln ('
Четыре');
end;
Пример на языке РАПИРА:
ВЫБОР ИЗ
А>Б: А-Б→A !
А=Б: 0 → Б !
А<Б: Б-А→A
ИНАЧЕ ?"ТАК НЕ ДОЛЖНО БЫТЬ"
ВСЕ
Повторное исполнение — рекурсия и итерация
В программах может возникать необходимость повторяющегося
выполнения некоторых действий. Для этого можно использовать два
механизма — итерацию и рекурсию.
Рекурсия означает, что некоторая подпрограмма — прямо или косвенно
через другие подпрограммы — вызывает на выполнение саму себя,
реализуя принцип змеи, кусающей себя за хвост. Многие математические
понятия, например факториал, определяются с использованием рекурсии:
факториал N — это умноженный на N факториал N-1 для N>0, факториал
нуля принимается равным единице.
Достарыңызбен бөлісу: |