<Назад

Далее

3. ОСНОВЫ ГРАФИЧЕСКОГО ЯЗЫКА АВТОЛИСП .Часть 4.

 


  • План.
  1. Ветвления и логические функции…………………………….
  2. Организация циклов………………………………………………..
  3. Функции программирования управляющих структур…
  4. Функции обмена информации с файлами данных……..
  5. Вызов команд Автокада……………………………………………
  6. Описание создаваемых функций пользователя…………

3.3.15. Ветвления и логические функции

Функция (IF <условие> <выражение1> [выражение2]) вычисляет значение условия, и если оно не NIL, то выполняет <выражение1> , иначе - выполняет [выражение2], если оно присутствует. Функция IF возвращает результат выполнения функции. Таким образом, функция IF соответствует управляющим структурам псевдокода ЕСЛИ-ТО-ИНАЧЕ или ЕСЛИ-ТО.

Для записи условий чаще всего используются логические функции. К ним относятся следующие функции: = (равно); < (меньше); > (больше); /= (не равно); <= (меньше или равно); >= (больше или равно). Эти функции позволяют выполнять сравнение чисел или текстов. Кроме выше приведенных функций, применяются функции AND, OR, NOT, позволяющие задать сложные условия. Все логические функции возвращают одно из двух значений: NIL ("нет", условие не выполняется) или Т ("да", условие выполняется).

Функция (= <атом> <атом>...), если все атомы равны между собой, возвращает Т, иначе – NIL.

Функция (/= <атом> <атом>), если атомы не равны между собой, возвращает Т, иначе - NIL. Функция имеет только два аргумента.

Функция (< <атом> <атом>…), если каждый предыдущий атом меньше последующего, возвращает Т, иначе – NIL.

Функция (<= <атом> <атом>…), если каждый предыдущий атом меньше последующего или равен ему, возвращает Т, иначе – NIL.

Функция (> <атом> <атом>…), если каждый предыдущий атом больше последующего, возвращает Т, иначе – NIL.

Функция (>= <атом> <атом>…), если каждый предыдущий атом больше последующего или равен ему, возвращает Т, иначе - NIL

Для текстовых констант сравнение “больше” “меньше” производится по первой не совпадающей букве. "Меньшим" считается тот символ, ASCII-код которого меньше. Для букв алфавита коды нарастают в алфавитном порядке отдельно для заглавных и строчных букв.

Функция (AND <выражение>...) выполняет операцию логического 'И' над списком выражений. Функция AND возвращает NIL, если хотя бы одно выражение имеет значение NIL, иначе возвращается Т.

Функция (OR <выражение>...) выполняет операцию логического 'ИЛИ'. Функция OR возвращает Т, если хотя бы одно выражение имеет значение не NIL, иначе возвращается NIL.

Функция (NOT <выражение>) выполняет операцию логического 'НЕ'. Функция NOT возвращает Т, если выражение имеет значение NIL, иначе возвращается NIL.

Например:

(IF (= 2 5) "ДА!!" "НЕТ")

>

"НЕТ"

(IF (= 100 (* 10 10)) "ДА!!")

>

"ДА!!

(IF (= 2 (+ 3 4)) "ДА!!")

>

NIL

Если

то функция

возвращает

(SETQ A 100 B NIL C "ACAD")

(AND 14 A C)

T

 

(AND A B C)

NIL

(SETQ A 100 B NIL C "LISP")

(OR A B C)

T

(SETQ A NIL B ‘() )

(OR A B NIL)

NIL

(SETQ A NIL B "STRING" C 125)

(NOT A)

T

 

(NOT B)

NIL

 

(NOT C)

NIL

3.3.16. Организация циклов

Функция (WHILE <условие> <выражение>…) вычисляет выражения, пока значение условия не станет NIL. WHILE возвращает последнее значение конечного выражения. Таким образом, функция WHILE соответствует структуре псевдокода ПОКА-ЦИКЛ.

Приведенная ниже программа выводит на экран пять раз надпись “Loop-While” и возвращает число 6 – последнее значение конечного выражения (1+ TEST).

; Программа цикла WHILE

(SETQ TEST 1)

; Присвоение переменной TEST значения 1

(WHILE

; Начало цикла

(<= TEST 5)

; Условие выполнения цикла

(PRINT “Loop-While”)

; Вывод на экран текста

(SETQ TEST (1+ TEST))

; Инкрементация переменной TEST

)

; Конец цикла

Функция (REPEAT <целое число> <выражение> ...) вычисляет выражения заданное число раз аргументом <целое число> и возвращает последнее вычисленное значение. Аргумент <целое число> должен быть положительным.

Например:

(SETQ A 20 B 60 N 4)

; Присвоение целых чисел A и B

(REPEAT N

; Начало цикла и количество повторов

(SETQ A (+A 10))(SETQ B (+ B 10))

; Тело цикла

)

; Конец цикла

В результате вычислений значение A= 60, B = 100, и возвращается 100 - последнее вычисленное значение B.

3.3.17. Функции программирования управляющих структур

Функция(COND (<условие1> <выражение1>…)…) выполняет выбор из нескольких вариантов, заменяя многократное использование функции IF. Обычно последним по умолчанию условием используется переменная (истина) T. Ниже приведен пример использования функции COND: при вводе символа Y или y возвращается “ДА!”, иначе, выводится “НЕТ”:

(SETQ S

(GETSTRING ”\n Input character >:”))

;Ввод символа.

(COND((= S "Y") “ДА!”)

;Вывод “ДА”, если символ “Y”

((= S "y") “ДА!”)

; Вывод “ДА”, если символ “y”

((/= S "Y") “НЕТ”)

; Вывод “НЕТ”, если символ не “Y”

((/= S "y") “НЕТ”)

; Вывод “НЕТ”, если символ не “y”

(T NIL))

; Последнее условие

Функция (PROGN [выражение]...) последовательно вычисляет каждое выражение и возвращает последнее вычисленное значение.

Функция PROGN является вспомогательной. Например, PROGN можно использовать совместно с функцией IF, если необходимо, чтобы при выполнении <условия> вычислялись несколько последовательных функций.

Например:

(SETQ A (GETREAL ”\n Input A>:”)

; Ввод чисел и присваивание

B(GETREAL ”\n Input B>:”))

; их значений переменным A и B

(IF (= A B)

; Начало функции IF

(PROGN

; Начало функции PROGN

(PRINC "\n A = B ")

; Вывод на экран дисплея текста A=B

(PRINC "\n")

; Перевод курсора на новую строку

(SETQ A(+A 10)B(*B A))

; Присваивание переменным A и B

; новых значений

)

; Конец функции PROGN

)

; Конец функции IF

Если введенные значения переменных A и B равны, то выводится текст A=B, курсор переводится на новую строку, к переменной A прибавляется 10, вычисляется произведение A на B, присваивается A, и возвращается результат произведения, иначе, при A ? B возвращается NIL.

Например:

Если A=B=2.0, тогда

INPUT A >:2.0

INPUT B >:2.0

A = B

24.0

Если A=2.0, а B=3.0, тогда

INPUT A >:2.0

INPUT B >:3.0

NIL

3.3.18. Функции обмена информации с файлами данных

Для обмена данными между программами могут быть использованы файлы данных из различных программ Автолиспа, из программ, написанных на других языках, файлы данных, созданные другими средствами - текстовыми редакторами, СУБД. Например, программа расчета параметров изображения, написанная на универсальном языке программирования (Паскаль, С, ФОРТРАН и др.), может записать результаты расчета в файл данных, который затем будет использован в программе построения изображения на Автолиспе.

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

Функция (OPEN <имя файла> <режим>) открывает файл, указанный аргументом <имя файла>, для процедур, заявленных аргументом <режим>. Аргументы функции являются строковыми переменными. Данные записываются в отрытый файл только после его закрытия функцией CLOSE.

Аргумент <режим> принимает следующие значения:

"r" – открывается уже существующий файл для чтения, если такого файла нет, то функция возвращает NIL;

"w" - файл открывается для записи, если файла с таким именем нет, то создается новый файл с указанным именем, если такой файл уже существует, то он заменяется новым файлом с тем же именем;

"а" - файл открывается для добавления данных в конец файла, если такого файла нет, то он создается.

Функция OPEN возвращает системное имя файла (дескриптор файла), которое с помощью функции SETQ можно присвоить переменной; в дальнейшем она может быть использована в процедурах ввода-вывода.

Например:

(SETQ DATA (OPEN "DET.DAT" "r")) ; Если существует файл DET.DAT возвращается его дескриптор <File: #2673c80>, иначе – NIL.

Аргумент <имя файла> может включать путь к файлу, состоящий из строки “<дисковод>:<каталог>/<подкаталог>/<имя файла>.<расши-рение>”. Допускается в описании пути вместо прямого слеша (/) использовать обратный двойной слеш (\\).

Например :

(SETQ F (OPEN “C:/CAD/AutoCAD/Data/Det.Dat” “w”)) > <File: #2673b84>.

Функция (CLOSE < дескриптор файла >) закрывает открытый файл.

Работа с файлом по обмену данными должна начинаться его открытием функцией OPEN и заканчиваться закрытием функцией CLOSE.

Например:

Пусть в файл FD.DAT необходимо записать сумму переменных A B C.

(SETQ A (GETREAL “\n Input A>:”)

B (GETREAL “\n Input B>:”)

C (GETREAL “\n Input B>:”))

; Присвоение значений переменным

(SETQ F1

; Присвоение дескриптора файла F1

(OPEN "C:/CAD/DATA/FD.DAT" "w"))

; Открытие файла FD.DAT

(PRINT (+ A B C) F1)

; Запись суммы A, B и C в файл FD

(CLOSE F1)

; Закрытие файла

Функция (FINDFILE <имя файла>), если файл найден, возвращает путь и имя файла, иначе - NIL. Если в аргументе <имя файла> указано только имя файла, то его поиск производится в текущем каталоге Автокада.

Например :

(FINDFILE "FD.DAT") > "C:\\Program Files\\AutoCAD R14\\fd.dat".

(FINDFILE "C:/CAD/AUTOCAD/DATA/FF.DAT") > NIL.

3.3.19. Вызов команд Автокада

Функция (COMMAND “<имя команды>” [ <аргумент >...]) вызывает команду графического редактора Автокада [7-10, 13].

Аргумент <имя команды > - имя требуемой команды, определенной в данной версии Автокада. Если вызываемой командой предусмотрены аргументы, то их значения необходимо перечислить в последовательности, в которой они вводятся в команду в режиме диалога. В качестве аргументов могут использоваться выражения Автолиспа. При этом необходимо, чтобы значение, возвращаемое выражением, соответствовало тому значению, которого требует команда Автокада. В качестве аргументов могут быть заданы переменные, если значения этих переменных были ранее определены в программе. Такие значения необходимо заключать в кавычки. PAUSE в качестве аргумента обозначает переключение в режим графического диалога. Одной функцией COMMAND можно вызывать последовательно нескольких команд.

Например:

Программа вычерчивает квадрат 50x50 единиц со вписанной окружностью

(SETQ P1 '(100 100) P2 '(100 150)

P3 '(150 150) P4 '(150 100)

PC(INTERS P1 P3 P2 P4))

; Присвоение координат

; точкам P1, P2, P3, Р4

; Определение центра окружности

(COMMAND "LINE" P1 P2 P3 P4 "C"

; Вычерчивание квадрата

“CIRCLE” PC (/(DISTANCE P1 P2)2))

; Вычерчивание окружности

3.3.20. Описание создаваемых функций пользователя

В Автолиспе функции разделяются на три группы - встроенные, пользователя и функции других программ. Описание новой функции пользователя приводится до обращения к ней в программе. Для описания функции пользователя используется встроенная функция Автокада DEFUN.

(DEFUN <имя функции>([<аргумент>…][ / <локальная переменная>…]) <выражение>…), где <имя функции> - цепочка символов; <аргумент>… - список аргументов, соответствующий данным, которые передают в функцию из программы при ее вызове; <локальная переменная >… -переменные, действующие только внутри описываемой функции; <выражение>… - любая запись, выполненная по правилам Автолиспа. Аргументы и локальные переменные могут отсутствовать, но скобки () после имени функции обязательны. Между именем функции и списком аргументов не должно быть пробелов, иначе имя функции считается переменной. Значение, возвращаемое функцией, присваивается переменной с именем функции.

Например:

; Программа вычисления тангенса угла.

; Функция TAN : AR- аргумент функции;

; ANN, SI, CO – локальные переменные.

(DEFUN TAN(AR / ANN SI CO)

 

(SETQ ANN(REM AR (* 2 PI)))

; Нормирование угла

(SETQ SI (SIN AR)

; Определение синуса угла

CO(COS AR))

; Определение косинуса угла

; Проверка условия деления на нуль

(COND

((= AR 0.0) 0.0)

((AND (> AR 1.5707) (< AR 1.5708)) (CHR 36))

((AND (>= AR 1.5708) (< AR 1.5709)

(PROGN (PRINT (STRCAT (CHR 45)(CHR 36))))))

((AND (> AR 4.71238) (< AR 4.71239)) (CHR 36))

((AND (>= AR 4.71239) (< AR 4.71240)

(PROGN (PRINT(STRCAT (CHR 45)(CHR 36))))))

((OR (< AR 1.5707) (> AR 1.5709)

(< AR 4.71238) (> AR 4.71240)) (/ SI CO))

(T A))

)

; Конец функции TAN.

; Пример применения функции TAN (вычисление тангенса угла).

(SETQ AN (GETREAL "\n Input radian AN="))

; Ввод угла в радианах.

(TAN AN)

; Вызов функции TAN.

Функция (*ERROR* <сообщение>) определяется пользователем и выводит сообщение об ошибке в случаях, когда возникают условия для ее возникновения. Функция *ERROR* возвращает NIL .

Например:

(DEFUN *ERROR* (MSG) (PRINC "ERROR: ") (PRINC MSG) (PRINC))

Вызов функции (*ERROR* MSG ) выводит сообщение ERROR :

Функция (LAMBDA <аргументы> <выражение>…) определяет функцию без имени, возвращает значение последнего выражения. Функция LAMBDA используется часто совместно с функциями APPLY и MAPCAR.

Например :

(APPLY '(LAMBDA (X Y Z) (/(+ Y Z)X)) '(5 25 15)) > 8;

Если (SETQ CNT 0), то

(MAPCAR '(LAMBDA (X) (SETQ CNT (1+ CNT)) (* X 5)) '(1 2 3)) > 5 10 15.

Контрольные вопросы

  • 1. Перечислите типы данных Автолиспа.
  • 2. Что является списком в Автолиспе?
  • 3. Дайте определения атома списка.
  • 4. Как определяются переменные Автолиспа?
  • 5. Как присваиваются значения переменным Автолиспа?
  • 6. Назовите математические функции Автолиспа и приведите примеры.
  • 7. В чем заключается разница между выражениями:
  • (SETQ L0(GETDIST “\n Введите длину L0 >:”)) и
  • (SETQ L0(GETDIST P0 “\n Введите длину L0 >:”))?
  • 8. Дайте результат вычисления следующих выражений Автолиспа:
  • (+ 2 3 4.0); (+ 5); (- 10 2 4.0); (/ 9 2 4); (/ 9 2 4.0); (LSH 2 1); (MAX 4 5 1).
  • 9. Назовите функции, которыми можно задать координаты точки и приведите примеры.
  • 10. Какие функции используются для организации ветвлений и циклов в Лисп - программах?
  • 11. Чему будет равно значение переменной D для выражения Автолиспа (SETQ D(FLOAT (* 4 25)))?
  • 12. Какие функции позволяют организовать обмен информации с файлами данных в Лисп – программах?
  • •  Объясните выражение Автолиспа (SETQ SSET (SSGET "L")).
  • 14. Приведите примеры описаний функций пользователя в Автолиспе.
  • 15. Как осуществляется вызов команд Автокада в программах, написанных на Автолиспе?


Назад Далее