ЭТАПЫ ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ
2.1. Изучите функции ветвления и организации циклов.
2.2. Изучите принцип построения программ с ветвлением и циклами.
2.3. Изучите программу 5.
2.4. Напишите ЛИСП-программу вычерчивания семейства квадратов в соответствии с индивидуальным вариантом.
2.5. В среде AutoCAD проведите отладку своей программы.
2.6. Распечатайте полученные изображения и программу.
ПЛАН ОТЧЕТА
1. Титульный лист.
2. Цель работы.
3. Задание.
4. Описание программы.
5. Полученные распечатки.
ВАРИАНТЫ ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ
Таблица 2.
№ п/п | Параметры | ||
Число квадратов | Координаты точки Р1 | Угол поворота | |
1 | 10 | 120, 150 | 0,2*π |
2 | 15 | 120, 120 | -0,2*π |
3 | 20 | 150, 150 | 0,1*π |
4 | 15 | 100, 100 | -0,1*π |
5 | 20 | 200, 200 | 0,3*π |
6 | 20 | 250, 250 | -0,3*π |
7 | 15 | 220, 250 | 0,25*π |
8 | 10 | 120, 120 | -0,25*π |
9 | 18 | 300, 150 | 0,4*π |
10 | 15 | 120, 250 | -0,4*π |
11 | 21 | 320, 350 | 0,15*π |
12 | 12 | 350, 350 | -0,15*π |
13 | 3 | 320, 320 | 0,35*π |
14 | 4 | 400, 150 | -0,35*π |
15 | 5 | 420, 150 | 0,2*π |
ЛАБОРАТОРНАЯ РАБОТА 5
РАБОТА СО СПИСКАМИ
Цель работы: освоение использования списков в ЛИСП-программах.
ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛ
Формирование списковых структур
В этом разделе рассматриваются функции, работающие со списками и точечными парами. Точечная пара ‒ это особый двухэлементный список вида ( a . b ), в котором в качестве разделителя выступает точка. Первый элемент такого списка называют DFX -кодом, а второй ‒ данными этого кода. Основной способ создания точечных пар ‒ функция CONS. Точечные пары используются для работы с примитивами рисунка. [5]
|
|
Для формирования списковых структур используются следующие функции:
LIST ‒ создание списков (списка списков).
CONS ‒ для добавления первого элемента в список, создания точечных пар (при наличии в списке вещественного числа).
APPEND ‒ «сливает» списки в один общий.
SUBST ‒ позволяет заменять старый элемент в списке на новый.
ASSOC ‒ осуществляет поиск элемента в списке по ключевому слову, возвращая пару.
CAR , CDR и др. ‒ служат для выделения элементов списка (первого, без первого и т.д.). для выделения точечной пары применяют CAR, выделяя X, CADR, выделяя Y.
MEMBER ‒ поиск заданного элемента и списка после него.
APPLY ‒ получение результата циклического выполнения функции над списком (подсчет по строке).
FOREACH ‒ аналог цикла с индексацией переменной (циклическое выполнение выражения в сочетании со списком).
MAPCAR ‒ организация выполнения функции над списками (подсчет сумм по столбцам, например).
STRCAT ‒ сцепление двух строковых переменных или вводимых значений. [2-6]
Списки и их применение. Точечные пары
|
|
Любой, кто знаком с языками программирования, такими, как Бэйсик, Паскаль, С, Фортран, заметит в AutoLISP ряд отличий от этих языков, в частности, отсутствие такого важного способа организации данных, как массивы (переменные с индексами), обеспечивающего компактную запись повторяющихся действий с помощью циклов. Подобные задачи решаются в AutoLISP с помощью списков.
Как уже известно, геометрические точки представляются в AutoLISP в форме списков из двух или трех координат. В дальнейшем будет показано, что примитивы ACAD также представляются в виде сложных списковых структур. Таким образом, для понимания специфики AutoLISP и его возможностей по обработке геометрических и графических данных ACAD, необходимо изучить функции работы со списками.
Список ‒ это объект формы:
< список >::=([< элемент > ...]),
где < элемент > ‒ это список или атом.
Особым случаем списка является точечная паpa:
< точечная пара >::=(< атом > . <атом>).
При хранении точечных пар требуется меньше места в памяти, чем при хранении обычных списков. Точечная пара может быть сформирована функцией CONS (см. ниже). Некоторые функции обработки списков не могут работать с точечными парами. Если точечная пара выдается на экран, то между атомами AutoLISP печатает точку. Об использовании точечных пар будет сказано ниже. [2-6]
|
|
Создание списков
Можно сформировать список (из двух или трех элементов) и записать его в качестве значения переменной путем ввода точки с помощью функции GETPOINT.
Список можно сформировать и путем указания примитива на экране, «развернуть» его с помощью функции ENTGET. Кроме того, имеются функции, позволяющие конструировать списки из данных, определенных ранее в программе.
Функция (LIST < элемент > ...) формирует список из любого числа элементов (атомов или списков) и возвращает список.
Функция (CONS <элемент> <список>) добавляет < элемент > (атом или список) в качестве первого элемента к уже существующему списку и возвращает обновленный список.
Таким образом, если функция LIST формирует новый список, то CONS расширяет существующий. Однако, возможно использование CONS и в следующей форме:
(CONS <атом> <атом>).
В этом случае создается точечная пара.
Функция (APPEND <список>...) соединяет несколько списков в один общий список. Отличие APPEND от LIST поясняется примерами, приведенными ниже.
Функция (REVERSE <список>) возвращает список с элементами, расставленными в обратном порядке.
|
|
Примеры:
(SETQ A '(1.0 2.0));
(SETQ В '(С D Е));
(SETQ F (LIST А В)) создает в F список ((1.0 2.0)(С D Е));
(SETQ G (LIST 'X В)) создает в G список Х (С D Е));
(SETQ G (CONS 'X В)) создает (X С D E);
(SETQ G (CONS '(X) В)) создает ((X) С D Е);
(SETQ G (CONS 34)) создает точечную пару (3.4);
(SETQ H (APPEND А В)) создает (1.0 2.0 С D Е), т.е. происходит слияние списков в отличие от функции LIST, формирующей «список списков».
Функция (SETQ H (APPEND '(X) В)) создает (X С D Е) ‒ в отличие от функции CONS с такими же аргументами.
Запись (SETQ H (APPEND 'X В)) ‒ пример ошибки, т.к. аргументы должны быть списками.
Функция (SETQ В (REVERSE В)) создает в В список (Е D С). [2-6]
Выделение элементов списков
Любая структура данных имеет смысл тогда, когда возможен доступ к отдельным элементам этой структуры. При работе со списками необходимо выделять элементы и другие части списков. Например, если необходимо изменить координату Х точки, заданной как (LIST X Y ), то элемент Х предварительно следует извлечь из списка c помощью функции (CAR < список >). Эта функция возвращает первый элемент списка. Если список пуст, то возвращается NIL.
Функция (CDR < список >) возвращает новый список, отличающийся отсутствием первого элемента (обрезает список спереди). Если список пуст, возвращается NIL. Если параметр < список > представлен как точечная пара, то CDR возвращает второй элемент как атом, а не как список.
В AutoLISP определены функции, обеспечивающие последовательное выполнение CAR и (или) CDR вплоть до четырех уровней вложенности: CAAR, CADR, CDDR, CADAR и т.д.
Пусть (SETQ X '((А В) С D)). Тогда (CAAR X) возвращает А как (CAR (CAR X)); (CDAR X) возвращает (В) как (CDR (CAR X)); (CADAR X) возвращает В как (CAR (CDR (CAR X))) и т.п.
Функции типа CAR и CDR часто используются для выделения координат точек (CAR ‒ для координаты X, CADR ‒ для координаты Y, CADDR ‒ для координаты Z).
Функция (LAST < список >) возвращает последний элемент < списка >, который может быть атомом либо списком.
Функция (MEMBER < элемент >< список>) просматривает < список > и ищет в нем заданный < элемент >. Если < элемент > найден, то возвращается список от < элемента > до конца исходного < списка >. Иначе возвращается NIL.
Функция (NTH < номер > < список >) возвращает элемент < списка >, имеющий заданный < номер >. < Номер > должен иметь целое неотрицательное значение. Примем во внимание, что первый элемент списка имеет номер 0. Если < номер > превышает число элементов в < списке >, то возвращается NIL.
Примеры:
Пусть (SETQ А (В С (D Е))), Тогда (LAST А) возвращает (D E); (MEMBER 'С А) возвращает (С (D Е)); (NTH О А) возвращает В; (NTH 2 А) возвращает (D Е); (NTH 3 А) возвращает NIL.
Функция (ASSOC <элемент> <список>) обеспечивает «ассоциативный поиск» в структурированном списке. В структурированном списке, элементы которого являются списками, эти списки построены по схеме:
(< ключевой элемент >< значение > ...).
Поиск проводится по совпадению < элемента >, заданного в функции ASSOC, с < ключевым элементом > в списке ‒ элементе < списка >, заданного в ASSOC. Если поиск удался, то возвращается найденный список, иначе ‒ NIL. Таким образом осуществляется поиск данных по ключу в сложной структуре данных.
Пусть (SETQ DETAL '((КОД 123456) (КОДМ 001234) (М 1.45))). Тогда (ASSOC 'КОДМ DETAL) возвращает (КОДМ 001234). Теперь с помощью функции CADR можно «отрезать» ключевой элемент КОДМ и выделить значение (001234).
Функция (SUBST < новый элемент > < старый элемент > <список>) дополняет функцию ASSOC, позволяя заменять элементы в списке. Производится просмотр списка, и каждый найденный <старый элемент> заменяется на < новый элемент >. Возвращается обновленный список. [2-6]
Анализ списков
Имеются функции проверки условий, связанные с анализом списков.
Функция (LISTP < элемент >) возвращает Т, если < элемент > является списком, иначе ‒ NIL.
Функция (ATOM < элемент >) является обратной к LISTP, т.е. возвращает Т, если < элемент > является атомом.
Функция (EQ < выражение1 > <выражение2>) проверяет идентичность двух выражений, которые, как правило, являются списками. Списки считаются идентичными, если они связаны друг с другом через SETQ. Если два списка идентичны (EQ), то они всегда равны (EQUAL). Если же два списка равны, то они необязательно идентичны. [2-6]
Пример:
Пусть (SETQ X '(А В С)) (SETQ Y X). Тогда (EQUAL X Y) дает Т; (EQUAL X '(А В С)) дает Т; (ЕОХУ) дает Т; (EQ X '(А В С)) дает NIL.
1.6. Функции APPLY, FOREACH, MAPCAR
Как отмечалось выше, имеются возможности компактной записи некоторых действий с помощью списков. Для этого можно использовать функции APPLY, FOREACH, MAPCAR.
С помощью функции (APPLY '< имя функции > <список>) выполняется какая-либо функция AutoLISP, имя которой указано и которая может иметь несколько аргументов. Эти аргументы задаются < списком >. Например, (APPLY '+'(12 3)) эквивалентно (+123).
Функция (FOREACH < переменная > < список > < выражение > ...) организует циклическое выполнение < выражений >. Предполагается, что в этих выражениях присутствует < переменная >. Функция работает так: присваивает < переменной > значение первого элемента < списка >, подставляет это значение в < выражения > и выполняет их. То же самое делается для каждого последующего элемента <списка>.
Пример:
( FOREACH 1(123) ( SETQ Е ( + Е I ))) эквивалентно последовательности
(SETQE(+E1))
(SETQE(+E2))
(SETQE(+ E3)).
Функция (MAPCAR '< имя функции > <cписок1>... <cписок N>) организует цикл. В нем выполняется функция, имя которой указано, имеющая N аргументов, т.е. столько, сколько перечислено < списков >. Во всех < списках > при этом должно быть одинаковое число элементов. Таким образом, цикл будет иметь столько шагов, сколько элементов в любом < списке >. Возвращается список значений функции, полученных для каждого номера элементов < списков >. [2-6]
Пример:
( SETQ S ( MAPCAR ' + '(10 20 30) '(1 2 3))) формирует S в виде списка (11 22 33), каждый элемент которого есть результат применения функции «+» к паре аргументов, взятых из двух списков.
Дата добавления: 2019-09-13; просмотров: 225; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!