Методика организации программ с ветвлением и циклами



Приведенная ниже программа 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!