ЭТАПЫ ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ



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

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






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