nextupprevious

Next:3.1.3 Оператор выбора Up:3.1 Средства для организации Previous:3.1.1 Блок-схемы


3.1.2 Условный оператор

Для задания разветвляющихся вычислительных процессов обычно используются условные операторы, которые относятся к структурированным операторам языка Zonnon. Синтаксис условного оператора приведен на рис. 3.3.
 

IfStatement =    if Expression then StatementSequence
                        {elsif Expression then StatementSequence}
                         [else StatementSequence]
                       end.

Рис. 3.3. Синтаксис условного оператора

Условный оператор в стандартной форме состоит из условия (логического выражения) и двух последовательностей операторов, размещенных после символа then и после символа else. Действие всего такого условного оператора совпадает (если при вычислении условия не возникают побочные эффекты, или ,что тоже, самое изменения в состоянии памяти -- см. п. 6.1.5) с действием одной из двух составляющих его последовательностей операторов, выбор которой для исполнения осуществляется по значению условия, вычисление которого начинает выполнение условного оператора. Условный оператор назначает к исполнению первую последовательность операторов (он стоит непосредственно после символа then), если на текущем состоянии памяти ВМ условие принимает истинное значение, либо вторую последовательность операторов (она находится за символом else), если условие ложно.

Рис. 3.4. Пример блок-схемы
 

Например, условный оператор if $>$ Y then Z := X else Z := Y end присваивает переменной $Z$ максимальное из значений переменных $X$ и $Y$ и описывается блок-схемой рис. 3.4.

Рассмотрим задачу вычисления корней уравнения $ax^2 + bx + c = 0$, заданного коэффициентами $a$$b$ и $c$. Предположим, что a$а \ne 0$ и что корни действительны. Тогда возможным решением является следующая программа, использующая правила Виета:

module Корни3;
    var A,B,C,X1,X2,D,E : Real;
begin
    read(A,B,C);
    D := sqrt(Sqr(B) - 4$*$A$*$C);
    if B>= 0 then X1 := -(B+D)/(2$*$A) else X1 := (-B+D)/(2$*$A) end ;
    X2 := C/(X1$*$A);
    write(X1,X2)
end Корни3.

Предусматривается возможность сокращенной записи вложенности одного условного оператора в другой. Например, оператор

if E1 then S1 else if E2 then S2 else S3 end end,

где E1, E2, E3 - произвольные последовательности операторов, можно записать в виде

if E1 then S1 elsif E2 then S2 else S3 end.

В этом случает говорят, что условный оператор содержит не одну, а две охраняемые последовательности операторов (E1и E2), первая из которых охраняется выражением E1, а вторая - выражением  E2. Действие всего такого условного оператора совпадает (если при вычислении условия не возникают побочные эффекты, или ,что тоже, самое изменения в состоянии памяти -- см. п. 6.1.5) с действием одной из трех составляющих его последовательностей операторов, выбор которой для исполнения осуществляется по значению условий E1и E2, вычисление которых  происходит, начиная с E1. Условный оператор назначает к исполнению первую последовательность операторов S1, если на текущем состоянии памяти ВМ условие E1 принимает истинное значение, вторую последовательность операторов S2, если условие E1 ложно, а E2 истинно, и третью последовательность S3, если условия E1и E2 ложны.

Например, программа распознавания -- равно ли данное натуральное число некоторому нечетному числу, умноженному на два (печатает "ДА", если ответ положительный, и "НЕТ" -- в противном случае) -- может иметь следующий вид:

module Проверка;
    var N : integer;
begin read(N);
    if odd(N) then write('НЕТ')
    elsif N mod 4# 0 then write ('ДА')
    else write ('НЕТ')
    end
end Проверка.

Ее управляющая структура описывается блок-схемой рис. 3.5.

Рис. 3.5. Блок-схема программы Проверка

В общем случае условный оператор может содержать произвольное число охраняемых логическими выражениями последовательностей операторов. Логическое выражение, предшествующее операторной последовательности, называется ее предохранителем. Предохранители вычисляются в порядке их вхождения, если один из них принимает значение true, выполняется ассоциированная с ним последовательность операторов. Если не удовлетворяется ни один предохранителей, выполняется последовательность операторов, следующая за символом else, если он есть.
 

Next:3.1.3 Оператор выбора Up:3.1 Средства для организации Previous:3.1.1 Блок-схемы



© В.Н. Касьянов, Е.В.Касьянова, 2004