Підпрограми, розгалуження і цикли. Логічні функції. Функції 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 в іншій програмі.
Читайте также: While (Not(EOF(f))) Do Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|