Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Підпрограми, розгалуження і цикли. Логічні функції. Функції WHILE і IF.




 

У будь-якій мові програмування є засоби для створення підпрограм, циклів, розгалужень у програмах у залежності від результатів перевірки умов. Такі засоби є й в Автоліспі.

Підпрограма дозволяє описати деяку послідовність дій один раз, а використовувати її в різних місцях програми і навіть включати в інші програми, що значно спрощує програмування.

Для цих цілей в Автоліспі служить вже відома функція DEFUN. Опис деякої функції за допомогою DEFUN і можна вважати підпрограмою, а звертання до описаної раніше функції - викликом підпрограми. При звертанні на місце символічних аргументів в описі функції підставляються значення цих змінних. Наприклад, описана в Програмі 1 функція SINCOS(A) може розглядатися як підпрограма. А рядок (SINCOS 0.0), який зустрічається в якій-небудь програмі, є звертанням до цій підпрограми, причому аргумент А приймає значення 0.

Розгалуження в програмі організуються за допомогою функції IF:

 

(IF <умова> <функція1> [<функція2>])

Тут < умова> - такий вираз Автоліспа, який серед інших значень може в якійсь ситуації одержати значення NIL.

Функція IF обчислює значення умови і, якщо воно не NIL, те виконує < функцію1 >, інакше - виконує <функцію2>, якщо та присутня. Функція IF повертає результат виконання функції. Таким чином, функція IF відповідає керуючій структурі псевдокоду ЯКЩО - ТО - ІНАКШЕ.

Для запису умов найчастіше використовуються функції, що назвемо логічними. До них відносяться функції

= (дорівнює) < (менше) > (більше)

/= (не дорівнює) < = (менше або дорівнює)

> = (більше або дорівнює),

які дозволяють виконувати порівняння чисел або текстів, а також функції AND, OR, NOT, що забезпечують можливість будувати складні умови з простих.

Усі ці функції можуть повертати одне з двох значень: NIL ("ні", умова не виконується) або Т ("так", умова виконується).

Наприклад, функція " = " має вигляд:

(= <атом> <атом>...)

Тут як атоми можуть стояти або числа (як цілі, гак і речовинні), або текстові дані. Функція повертає Т, якщо всі атоми рівні між собою, інакше - NIL.

Функція "/=" визначена тільки для двох атомів.

Функція "<":

(< < атом> <атом>... )

Якщо кожен попередній атом менше наступного, то повертається Т, інакше - NIL.

Аналогічно визначаються інші функції порівняння. Для текстових констант поняття "менше" означає наступне: порівняння виконується по першій літері. "Меншим" вважається той символ, ASCII-код якого менше. Для літер алфавіту коди наростають за абеткою (окремо для заголовних, окремо для малих літер).

Функції AND, OR, NOT є функціями алгебри логіки.

(AND <вираз>...)

Функція виконує операцію логічного “І” над списком виразів, тобто функція повертає NIL, якщо хоча б один вираз має значення NIL. Інакше повертається Т.

(OR <вираз>...)

Виконується операція логічного “АБО”. Повертається Т, якщо хоча б один вираз має значення Т, інакше - NIL.

(NOT < вираз >)

Виконується логічна функція “НІ”. Якщо вираз має значення NIL, то повертається Т, у всіх інших випадках повертається NIL.

Приклади:

Нехай маються.наступні значення:

А = 5

В = "ТЕХТ1”

С = NIL

Тоді

(= А 5) повертає Т

(= А 5.0) - Т

(>= A 10) - NIL

(< У “ТЕХТ2") -Т

(AND А В С) - NIL

(OR А В С)-Т

(NOT З) - Т

(OR(= A5)(= A 10))-Т

Наведена нижче Програма 4 ілюструє розгалуження за умовою з використанням функції IF.

; Програма 4. Обчислення тангенса

(DEFUN TAN (А / S С); Заголовок функції; А - аргумент функції - кут, S, С - локальні

; змінні

(SETQ S (SIN A))

(SETQ C (COS A))

(IF (/= С 0.0) (/ S С) "нескінченність")

); Кінець функції

Тут, якщо С не дорівнює нулеві, обчислюється тангенс (і значення тангенса буде повернуто функцією). Якщо ж С дорівнює нулеві, то тангенс не обчислюється, а функція повертає рядок "нескінченність" - це слово і з'явиться на екрані.

Цикл в Автоліспі організується за допомогою функції WHILE.

(WHILE <умова> < вираз >...)

Тут < умова > - це вираз, який в деяких ситуаціях може приймати значення NIL.

Функція WHILE обчислює значення умови і, якщо воно не NIL, обчислює вираз, потім знову умова і т.д. Це продовжується, поки умова не стане дорівнює NIL. Потім WHILE повертає останнє значення останнього виразу. Таким чином, функція WHILE відповідає структурі псевдокоду ПОКИ - ЦИКЛ.

Наведена нижче Програма 5 ілюструє використання циклу, що дозволяє компактно записати побудову складного зображення: будується сімейство з 20 квадратів, кожний з яких повернутий на кут 0.1 * РІ щодо попередніх і має периметр у 0.9 разів менше попереднього. Для побудови 20 замкнутих ліній використовується всього одна команда LINE

; Програма 5. Побудова сімейства квадратів:

; Введення вихідних даних (опис функції)

(DEFUN ID (); Заголовок функції

(SETQ PI (GETPOINT "\n Початкова точка:"))

(SETQ L (GETDIST P1 “ Початкова довжина:"))

)

; Побудова одного квадрата:

(DEFUN QUADR (L A /P2 P3 P4); Заголовок функції

;Тут Р2, РЗ, Р4 оголошені як локальні

;змінні

(SETQ P2 (POLAR PI A L))

(SETQ РЗ (POLAR P2 (+ А (/ PI 2)) L))

(SETQ P4 (POLAR P3 (+ A PI) L))

(COMMAND "LINE" PI P2 P3 P4 "C")

)

; Побудова сімейства квадратів:

(DEFUN QN (); Заголовок функції

(SETQ B 0.0); Заданий початковий кут B = 0

(ID); Виконана функція ID

(WHILE (< = B (* 2 PI)); Початок циклу

; Виконаємо функцію QUADR з

; параметрами L, B:

(QUADR L B)

; Збільшимо кут на 0.1 РІ

(SETQ B (+ B (* PI 0.1)))

; Змінимо L у 0.9 разів:

(SETQ L(* L 0.9))

); Кінець циклу

);defun

 

Результат виконання Програми 5 показаний на рис.2. У попередніх прикладах кожна програма містила по одному опису функції. Приклад Програми 5 демонструє, що така відповідність не обов'язкова. Програма може містити кілька описів функцій (кілька функцій DEFUN).

Рис. 1. Результат двохкратного виконання Програми 5 з різними вихідними даними

 

Кожен опис функції - це функціональний модуль, який можна використовувати окремо, зокрема в інших програмах. Зверніть увагу на передачу даних при виклику функції. У заголовку функції QUADR описано два аргументи: L, А. При звертанні у функцію QUADR передаються значення параметрів: L і В. Це варто розуміти так, що в момент звертання до QUADR:

А дорівнює В;

L (яке буде працювати усередині QUADR) стає рівним L (яке існувало поза QUADR).

Отже, А і В, L і L - це різні дані, і не має значення які вони мають імена (як А і В) або однакові (як L). Зміни, що відбуваються з В и L всередині функції, ніяк не відбиваються на значеннях А і L в іншій програмі.

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...