(495) 240-82-80ПН-СБ с 10:00 до 18:00
We speak English

4.1. Структуры IF THEN END; и IF THEN ELSE END;

В этой главе мы рассмотрим некоторые основные управляющие структуры.

Если команда должна выполняться только при соблюдении определенного условия, то структура IF THEN END будет простым способом выполнения последовательности команд, только если условие(я) выполнено(ы). Синтаксис в таком случае будет следующий:

IF expression THEN
  // здесь размещаются команды, выполняемые, если "выражение" верное
END;

Очень простой, но понятный пример такого блока управления показан ниже. Предположим, что нам необходимо решить простую задачу: определить угол правильного треугольника с двумя катетами a и b. Далее, допустим, что результат должен всегда быть в градусах. С математической точки зрения решение будет просто в виде . Дело в том, что значение функции зависит от режима угла.

Функция ATAN выдает число, а интерпретация этого числа зависит от пользовательских настроек угла. Система отслеживает эти настройки через глобальную переменную HAngle.

Некоторые программисты предпочитают кодировать в режиме радиан в том смысле, что все углы предположительно измеряются в радианах, даже если сама система может быть установлена в режим градусов.

Этот пример демонстрирует, как создать код, независящий от настроек пользователя, таких как режим единицы измерения угла, без изменения пользовательских настроек.

ANG();
// FINDANG(a, b)
// определяет угол правильного треугольника, где сторона, противоположная углу
// будет b, и сторона, прилегающая к углу, будет a; результат всегда в градусах
EXPORT FINDANG(a, b)
BEGIN
  a := ATAN(b/a); // еще раз используется внутренняя переменная a
  RETURN(ANG(a));
END;

ANG(a)
BEGIN
  // если режим единицы измерения угла – радиан, то значение HAngle равно 0
  // в противном случае HAngle равна 1 для режима измерения угла в градусах
  IF HAngle == 0 THEN
    a := a/PI*180; // значение a интерпретируется в радианах; конвертировать в градусы
  END;
  RETURN(a);
END;

В коде выше программа ANG() была переопределена для использования структуры IF THEN END, которая конвертирует угол, только если режим измерения угла в системе установлен на радианы.

В противном случае ANG() ничего не выполняет. Обратите внимание на то, что внутренняя переменная a для ANG() отличается от внутренней переменной а, использованной в FINDANG().

Пример: Простота в работе с единицами измерения угла. Очень удобно в этой простой программе ANG() то, что с помощью небольшой модификации мы можем создать любую программу, в которой углы всегда будут использованы в радианах, и ANG() будет отвечать за конвертирование, опираясь на пользовательские настройки.

Вот как можно модифицировать ANG():

ANG(a)
BEGIN
  // обратите внимание на небольшое изменение с HAngle == 0 на HAngle (эквивалентно HAngle == 1)
  IF HAngle THEN
    a := a/PI*180; // значение a интерпретируется в радианах; конвертировать в градусы
  END;
  RETURN(a);
END;

Теперь мы можем в своем коде использовать команду COS(ANG(PI/6)) (скорее всего потому, что мы предпочитаем использовать значения, ассоциируемые с единицей измерения радиан), и всегда ожидаем, что результат будет ½ независимо от режима единицы измерения угла. Альтернативным решением будет настройка пользовательского режима единицы измерения угла в радианах, затем нужно перезагрузить режим после завершения программы.

Замечание: Переменная HAngle (главный угол) является глобальной переменной, по которой можно определить системный режим единицы измерения угла. Если ее значение равно 0, то режим измерения угла установлен в радианах. И если оно равно 1, то режим измерения угла установлен на градусы. Есть еще другая системная переменная, которая показывает режим измерения угла: AAngle (угол приложения). Если переменная AAngle равна 0, то режим угла приложения по умолчанию соответствует переменной HAngle. Если AAngle равна 1, то режим угла переменной измеряется в радианах, а значение 2 соответствует измерению в градусах. Угол приложения имеет более высокий приоритет, чем системный угол, так как работа происходит в приложении.

Второй вариант условного перехода:

IF expression THEN
  // код при верном "выражении" (не ноль)
  ELSE
  // код при неверном "выражении" (ноль)
END;

Выражение любой из форм ветви IF THEN не должно быть логическим тестом. Все что имеет значение, является ли выражение нолем (неверное) или не равняется нолю (верное). Если выражение само является командой или вызовом другой функции, то команда/вызов не должна оканчиваться точкой с запятой.

Например,

// обратите внимание на отсутствие точки с запятой ; после MYPROG1()
IF MYPROG1() THEN
  // код, при котором MYPROG1 выдает ненулевое значение
END;