
Тема 7. Рекурсивні специфікації систем.
Індуктивні визначення множин та функцій. БНФ. Рекурсивні специфікації функцій. Подання рекурсивних специфікацій засобами мов програмування. Бінарні дерева. Стратегії обходу дерев. Дерева пошуку. Таблиці у вигляді дерев пошуку. Синтаксичний аналіз арифметичних виразів. Переборні алгоритми. Бектрекінг.
ЗАДАЧІ
Написати процедури для:
а) генерації порожнього бінарного дерева,
б) приєднання нового листка до заданого листка,
в) заміни одного педдерева дерева на інше,
г) вилучиння заданого піддерева,
д) перепису дерева в файл,
е) відновлення дерева з файлу,
є) виведення дерева на екран.
Побудувати частотний словник слів текстового файлу у вигляді дерева пошуку з вузлами ( слово, кількість входжень, ліве_піддерево, праве_піддерево ).
Написати процедури обходу дерева: 1) в префіксному порядку, 2) в суфіксному порядку, 3) в постфіксному порядку.
Побудувати: а) дерево пошуку, вузли якого зважені натуральними числами від
до ., б) те саме, що і в п.а) тільки побудувати збалансоване дерево пошуку.
«Ханойська вежа». Дошка має три стовбчики. На першому нанизано
дисків зі спадаючим нагору діаметром (утворюють пірамду). Розташувати диски в тому ж порядку на іншому стовбчику. Диски можна перекладати зі стобчика на стовбчик по одному. Класти більший диск на менший не дозволяється. Написати процедуру, що задає відповідну послідовність операцій: а) рекурсивну, б) ітеративну.
Написати рекурсивні процедури для задачі 5.4.
Знайти скількома способами можна подати натуральне число у вигляді суми доданків. Наприклад, для числа 4 існує 5 варіантів: 1+1+1+1, 1+2+1, 1+3, 2+2, 4.
Написати рекурсивну функцію для ”швидкого” піднесення дійсного числа до цілого степені.
7.9 Знайти бездужкову постфіксну форму (БПФ) для заданого арифметичного виразу. Сам вираз побудований з обднобуквенних змінних та символів арифметичних операцій і вводиться з клавіатури.. Всі дужки обов'язкові. Тобто кожному входженню символа операції відповідає пара дужок. Наприклад, для виразу (b+(d*c)) БПФ є bdc*+.
Лабораторна робота 6
ТЕМА: Синтаксичний аналіз виразів.
Мова в певному
алфавіті (основному) символів – це
слова, записані за певними синтаксичними
правилами. Синтаксичні правила подаються
записами вигляду <…>
::=
де <…>
- позначає
синтаксичне поняття, а
- послідовність символів розширеного
алфавіту. Розширений алфавіт – це
основний алфавіт, доповнений синтаксичними
поняттями та метасимволами - ‘|’,
‘[‘, ‘]’, ‘{‘, ‘}’, ‘(‘, ‘)’.
Метасимвол ‘|’
розділяє варіанти поняття.
Вираз […]
означає, що послідовність символів
входить або не входить в конструкцію.
Вираз {…} – що послідовність символів
може входити в конструкцію n раз (n>=0).
Кожному поняттю відповідає сукупність
слів в основному алфавіті, що задовольняють
певному синтаксичному правилу.
Синтаксичний аналізатор - це програма,
що для заданої послідовності символів
основного алфавіту розпізнає, чи
побудована вона у відповідності з
синтаксичними правилами для даного
поняття.
ЗАВДАННЯ
Побудувати синтаксичний аналізатор для даного поняття і там, де це можливо, обчислити значення заданого виразу. Вхідний рядок вводиться з клавіатури.
ПОНЯТТЯ
<список-списків> ::= <список> {';' <список>}
<список> ::= <буква> {',' <буква> }
2) <дійсне-число> ::= <ціле-число> '.' <ціле-без-знака> |
<ціле-число> ['.' <ціле-без-знака> ] 'Е' <ціле-число>
<ціле-без-знака> ::= <цифра> { <цифра> }
<ціле-число> ::= [ '-' | '+' ] <ціле-без-знака>
Якщо розпізнано вірний вираз, то аналізатор обчислює його значення.
3) <сума> ::= <ціле> { <знак-операцІЇ> <ціле> }
< знак-операції > ::= '-' | '+' | '*'
<ціле > ::= <цифра> { <цифра> }
Якщо розпізнано вірний вираз, то аналізатор обчислює його значення.
4) < дужки > ::= <квадратні > | < круглі >
< квадратні > ::= '+' | '[' < круглі > < круглі >']'
< круглі> ::= '-' | '('<квадратні> <квадратні>')'
5) < простий-вираз > ::= < простий-ідентифікатор > |
'(' < простий-вираз > < знак-операції > < простий-вираз >')'
< знак-операції > ::= '-' | '+' | '*'
< простий-ідентифікатор > ::= < буква >
< список-параметрів > ::= <параметр> {',' <параметр>}
<параметр> ::= <ім'я> '=' <цифра> <цифра> |
<ім'я> '=' '(' < список-араметрів > ')'
<ім'я> ::== <буква> <буква> <буква>
7) <дужки> ::= <квадратні> | <круглі>
<квадратні> ::= 'В' | '[' '[' <квадратні> ']' '(' <круглі> ') ' ']'
<круглі> ::= 'А' | '(' '(' <круглі> ')' '[' <квадратні> ']' ')'
8) <константний-вираз> ::= <цифра> { <цифра>} |
'(' <константний-вираз> <знак-операції> <константний-вираз> ') '
<знак-операції> ::= '-' | '+' | '*'.
Якщо розпізнано вірний вираз, то аналізатор обчислює його значення.
9) <простий-логічний> ::= <простий-ідентифікатор> |
TRUE | FALSE | <простий-логічний> |
'(' <простий-логічний> <знак-операції> <простий-логічний> ')'
<знак-операції> ::= AND> | OR
<простий-ідентифікатор> ::= <буква>
Якщо розпізнано вірний простий логічний вираз, в який не входять прості ідентифікатори, то аналізатор обчислює його значення.
10) Визначити, чи еквівалентний заданий простий-логічний вираз виразу
FALSE.
11) Визначити, чи зберігає заданий простий-логічний вираз свої значення при довільній перестановці значень аргументів.
12) Визначити, чи еквівалентні два прості-логічні вирази.
13) Визначити, чи містить заданий простий-логічний вираз входження іншого заданого простого-логічного виразу.
ВКАЗІВКИ:
виконати аналіз та проектування ЖЦП;
провести автономне тестування та відлагодження всіх процедур і функцій та комплексне тестування всієї програми;
аналізатор працює до першої помилки і друкує діагностику помилки;
підготувати Звіт про виконання Лабораторної роботи .
Лiтература
Зубенко В.В. Науково-методичні матеріали. Факультет кібернетики KНУ ім.Тараса Шевченка, 2004-05 н.р. http://www.unicyb.kiev.ua /~vvz
Кнут Д. Искусство программирования.Т.1,2,3. Изд 3-е, испр. -М.СбП.К.:Вильямс, 2001.
Вирт Н. Систематическое программирование. Введение.- М.:Мир,1987.с.184.
Вирт Н. Алгоритмы и структуры данных. - М.:Мир,1989.с.263.
Керниган Б., Ричи Д.-Язык программирования Си. Изд. 3-е, испр.-СПб.:Невский Диалект.- 2001.
Фьюэр А. Задачи по языку Си.- - М.: Финансы и статистика. -1985.
Харбисон С.П., Стил Г.Л. Язык программирования. Изд. 5-е.-М.:БИНОМ, 2004. -528с.
Проценко В.С. та ін. Техніка програмування мовою Сі.- К.: Либідь.-1993
Белов Ю.А. , Проценко В.С., Чаленко П.Й Інструментальні засоби програмування.- К.: Либідь.-1993.
Подбельский В.В., Фомин С.С. Программировнаие на языке Си. – М.: Финансы и статистика, 1999 , 600 с.
Глібовець М.М., та ін. Мова програмування Сі. Учбовий посібник з лабораторного практикуму. – Київ, НаУКМА, 2002, 67с.
Иодан Э. . Структурное программирование и конструирование программ. - М.:Мир, 1979. с.378.
Майерс Г. Надежность программного обеспечения. . - М.:Мир,1980.с.360.
Ставровский А.Б.,Коваль Ю.В. Вступний курс програмування . Київ, РВЦ ”Київський університет”, 1998, с.215.
Схвалено на засіданні кафедри TТП
Прокол № 2 від 7.10.2004 р.
Зав. Кафедри ТТП проф. Нікітченко М.С,
Підготував доц. Зубенко В.В.