Методика организации программ с ветвлением и циклами
Приведенная ниже программа 4 иллюстрирует ветвление по условию с использованием функции IF.
; Программа 4. Вычисление тангенса
(DEFUN TAN (A / S С) ; Заголовок функции
; А - аргумент функции - угол, S, С - локальные переменные
(SETQ S (SIN А ))
(SETQ С (COS A))
(I F (/ = С 0.0) (/ S С) “бесконечность”)
); Конец функции
Здесь, если С не равно нулю, вычисляется тангенс (и значение тангенса будет возвращено функцией TAN). Если же С равно нулю, то. тангенс не вычисляется, а функция возвращает строку “бесконечность” ‒ это слово и появится на экране.
Цикл в AutoLISP организуется с помощью функции WHILE:
(WHILE <условие> < выражение >...).
Здесь <условие> ‒ это выражение, которое в некоторых ситуациях может принимать значение NIL.
Функция WHILE вычисляет значение условия и, если оно не NIL, вычисляет выражение, затем снова условие и т.д. Это продолжается, пока условие не станет равно NIL. Затем WHILE возвращает последнее значение последнего выражения. Рассмотрим пример использования функции WHILE для вычисления факториала. [5]
Пример:
; Вычисление факториала
( SETQ N 10); Задайте N
( SETQ I 1 FACTORIAL 1)
(WHILE (< I N)
(SETQ I (1+ I))
(SETQ FACTORIAL (* FACTORIAL I))
); конец WHILE.
Рассмотрим работу примера, когда число N равно 10 (т.е. вычисляется 10!). В программе используются переменные I и FACTORIAL . Переменная I является счетчиком цикла. Переменная FACTORIAL накапливает произведение чисел, формирующее факториал. Перед входом в цикл они получают начальные значения, соответственно 1 и 1 (по определению 1! считается равным 1). [5]
|
|
Функция WHILE проверяет условие (< I N ) для текущего значения I, и если результат вычисления условия отличен от NIL, то выполняет внутренние операции (две операции с участием функции SETQ). На первом шаге цикла I равно 1. Проверяемое условие (< I N ) возвращает значение T («истина»). Поэтому функция WHILE увеличивает I на 1 (получается I =2) и умножает переменную FACTORIAL на I : FACTORIAL =1*2 (не что иное, как 2!). [5]
Далее снова передается управление на вход в цикл (уже при I =2). Проверка условия опять дает результат «истина», поэтому I получает значение 3 (2+1), а FACTORIAL — 6 (2*3). И так далее, пока I не станет равным N (10). Тогда программа покинет цикл, не выполняя внутренних операций. Результат: при N =10 FACTORIAL =3628800. [5]
Приведенная ниже программа 5 иллюстрирует использование цикла, позволяющего компактно записать построение сложного изображения: строится семейство из 20 квадратов, каждый из которых повернут на угол 0.1*π относительно предыдущего и имеет периметр в 0,9 раз меньше предыдущего. Для построения 20 замкнутых линий используется команда LINE.
; Программа 5. Построение семейства квадратов:
; Получение исходных данных (описание функции)
|
|
(DE F UN ID ( ); Заголовок функции
(SETQ P1 (GETPOINT "\n Нач. точка:"))
(SETQ L (GETDIST P1 "\n Нач. длина:"))
)
; Построение одного квадрата:
(DEFUN QUADR (L A /P2 P 3 P 4); Заголовок функции
; Здесь P2, РЗ, Р4 объявлены как локальные
; переменные
(SETQ P2 (POLAR PI A L))
(SETQ РЗ (POLAR P2 (+ А (/ PI 2)) L))
(SETQ P4 (POLAR РЗ (+ A PI) L))
(COMMAND "LINE" P1 P2 P3 P4 "C"))
; Построение семейства квадратов:
(DEFUN QN ( ) ; Заголовок функции
(SETQ В 0.0) ; Задан начальный угол В=0
(ID) ; Выполнена функция ID
(WHILE (< = В (* 2 PI)); Начало цикла
; Выполним функцию QUADR с
; параметрами L, В
(QUADR L В)
; Увеличим угол на 0.1*PI
(SETQ В (+В (* PI 0.1)))
; Изменим L в 0.9 раз
(SETQ L (* L 0.9))
); Конец цикла
)
Результат выполнения программы 5 показан на рис.1. В предыдущих примерах каждая программа содержала по одному описанию функции. Пример программы 5 демонстрирует, что такое соответствие не обязательно. Программа может содержать несколько описаний функций (несколько функций DEFUN).
Каждое описание функции ‒ это функциональный модуль, который можно использовать отдельно, в частности, в других программах. Обратим внимание на передачу данных при вызове функции. В заголовке функции QUADR описано два аргумента: L, А. При обращении в функцию QUADR передаются значения параметров: L и В. Это следует понимать так, что в момент обращения к QUADR А становится равно В; L (которое будет работать внутри QUADR) становится равным L (которое существовало вне QUADR).
|
|
Рис. 1. Результат двукратного выполнения программы 5 с разными исходными данными.
Следовательно, А и В, L и L ‒ это разные данные, и не имеет значения, выбраны для их обозначения разные имена (как А и В) или одинаковые (как L). Изменения, которые происходят с В и L внутри функции, никак не отражаются на значениях А и L в остальной программе.
Программа 5 иллюстрирует общую схему построения программ для получения параметризованных чертежей:
ввод исходных данных (в том числе базовой точки);
определение точек внутри программы с помощью функции POLAR с использованием введенных данных;
построение примитивов на экране с помощью функции COMMAND по определенным точкам. [2-6]
Рассмотрим еще одну функцию для организации цикла в LISP-программе [5]. Функция REPEAT выполняет операцию цикла с фиксированным количеством повторений:
( REPEAT <количество> [<выражение1>…]) .
Типы аргументов: <количество> ‒ целое число, <выражение1> ‒ любое выражение. После аргумента <выражение1> могут идти другие выражения, которые нужно выполнить внутри цикла. Возвращаемое значение ‒ значение последнего вычисленного выражения. Если <количество> имеет значение 0, или отрицательно или после аргумента <количество> не заданы выражения, то функция REPEAT возвращает значение NIL.
|
|
Воспользуемся функцией REPEAT для вычисления факториала. Программа в данном случае может выглядеть следующим образом:
Пример:
; Вычисление факториала с помощью функции REPEAT
(SETQ N 10); Задайте N
(SETQ I 1 FACTORIAL 1)
( REPEAT (1- N)
(SETQ I (1+ I))
(SETQ FACTORIAL (* FACTORIAL I))
); конец REPEAT.
Поскольку входные значения I =1 и FACTORIAL =1!=1, то остается умножить FACTORIAL на 2,3,… N. Количество таких умножений равно N -1, что на языке AutoLISP записывается как (1- N ). Остальное работает как в предыдущем примере вычисления факториала с помощью функции WHILE. [5]
Дата добавления: 2019-09-13; просмотров: 250; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!