Приклад 2

Введіть з клавіатури рядок зі слів. Сформуйте новий рядок зі слів введеного рядку, які починаються на англійську букву „а” і виведіть новий рядок на екран.

Predicates

nondeterm Do_new (string, string, string)

Goal

Readln(St),concat(" ",St,Str), do_new(Str, "", Res),!.

Clauses

Do_new("", Str1, Str1):-write(Str1),nl.

Do_new(Str, Str1, Res):- fronttoken(Str,W,R),

frontchar(W, 'a', _),concat(Str1," ", Str2),

concat(Str2,W, Str3),!,do_new(R, Str3, Res);

fronttoken(Str,_,R), !,do_new(R, Str1, Res).

Вводиться рядок і до його початку приєднується пропуск. Новий рядок подається порожнім.

Правило має дві гілки.

По першій гілці оброблюються слова, що починаються з букви „а”. Перший предикат fronttoken відокремлює слово від рядку. Предикат frontchar перевіряє чи починається слово на букву „а”. Предикат concat приєднує слово, що починається на букву „а” в кінець рядку, що одержується. Після чого процедура Do_new викликається з залишком рядку і одержаним новим рядком.

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

Граничною умовою є факт, в якому рядок, що вводився, стає порожнім.

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

2.2.2 Виконайте завдання свого варіанту за № в журналі. Налагодьте вашу програму за допомогою трасування. Під час трасування переконайтесь, що ваша програма не має зайвих розв'язків або не виконує непотрібних дій. Використовуйте для цього відсік.

2.3 Завдання на лабораторну роботу

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

2. Ввести речення з клавіатури. Підрахувати кількість слів у реченні в яких перший і останній символи однакові.

3. Ввести речення з клавіатури. Перетворити речення так, щоб у нього всі склади "ЦЕ" було замінено на "ТО".

4. Ввести речення з клавіатури. Знайти довжину найдовшого слова речення.

5. Ввести рядок з клавіатури. Вилучити з даного рядку всі символи, що належать до цифр та пропуски.

6. Ввести рядок з клавіатури. Замінити в ньому всі малі букви однойменними великими, не використовуючи стандартний предикат.

7. Ввести рядок з клавіатури. Вилучити з нього всі символи, що належать до цифр, та замінити всі крапки на знак оклику.

8. Ввести рядок з клавіатури. Вилучити з кожної групи цифр, якій не передує крапка, всі початкові нулі (крім останнього ), якщо за ним йде крапка. Наприклад: з рядку “000. 0010” треба зробити “0.0010”.

9. Ввести рядок з клавіатури. Вилучити з кожної групи цифр, в якій більше двох цифр і якій передує крапка, всі цифри, починаючи з третьої. Наприклад, “123+ab+0.1973–1.1” перетворюється у “123+ab+0.19–1.1”.

10. Ввести речення з клавіатури. Замінити у реченні усі прийменники "і" на "та", якщо попереднє слово закінчується на голосний.

11. Утворити програмно рядок за допомогою датчика випадкових чисел. Використовуйте наступний алгоритм: якщо код символу менше 32, то додайте до коду 100, інакше вважайте число за код символу. Перевірте, чи вірно, що рядок починається двома однаковими символами.

12. Ввести рядок з клавіатури. Підрахувати найбільшу кількість пропусків у рядку, що йдуть підряд.

13. Ввести рядок з клавіатури. Підрахувати кількість входжень в рядок груп букв „abc” і „aba”.

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

15. Ввести речення з клавіатури. Вставити між словами, що починаються з тієї ж букви, на яку закінчується попереднє слово, символ '*'.

16. Ввести речення з клавіатури. Вивести на екран слово, в якому буква 'а' зустрічається у найбільшій кількості.

17. Ввести рядок з клавіатури. Замінити кожну з груп крапок, що розташовані одна біля одної, і кількість яких більше трьох, на одну крапку.

18. Ввести з клавіатури рядок чисел, які розділяються пропусками. Одержати з нього новий рядок, вилучивши числа, які знаходяться на парних місцях, а числа, які знаходяться на місцях з непарними номерами збільшити удвічі.

19. Ввести рядок з клавіатури. Перевірити, чи входять в рядок всі букви слова "then".

20. Ввести рядок з клавіатури. Замінити пари букв "nо" на "on" і навпаки.

21. Ввести з клавіатури рядок чисел, які розділяються пропусками. Одержати з даного рядку чисел суму цих чисел і додати цю суму в кінець рядка.

22. Ввести рядок з клавіатури. Вилучити групи пропусків, якими починається і закінчується рядок, а також замінити кожну внутрішню групу пропусків одним пропуском. Якщо вказаних груп нема в даному рядку, то залишити його без змін.

23. Ввести речення з клавіатури. Вилучити з нього усі слова з непарними порядковими номерами та записати усі слова з парними номерами в зворотному порядку. Наприклад, якщо № слова "then" парний, то слово перетворюється у слово "neht".

24. Ввести речення з клавіатури. Одержати з даного речення нове, слова якого записані в зворотному порядку, а порядок слів той же.

25. Ввести рядок з клавіатури. Перевірити, чи входить в рядок всі букви слова “grand”.

2.4 Зміст звіту

Звіт повинен мати наступні пункти:

2.4.1 Тему, мету роботи

2.4.2 Завдання

2.4.3 Текст програми

2.4.4 Вхідний дані і результат роботи програми

При захисті лабораторних робіт враховується:

- якість програми;

- знання роботи програми;

- знання матеріалу лекцій за темою.

2.5 Контрольні запитання

2.5.1 Що таке рекурсія? Чому вона така важлива у Пролозі?

2.5.2 Які методи рекурсії вам відомі? Яку роль відіграють у рекурсії граничні умови? Що буде, якщо значення аргументів рекурсивного виклику не буде сходитись до значень аргументів граничної умови?

2.5.3 Який метод рекурсії вивчили ви? Опишіть роботу цього методу.

2.5.4 Як висхідна рекурсія використовує стек і механізм зчеплення?

2.5.5 Чи передається через анонімну змінну у рекурсивному виклику значення?

2.5.6 Які ви знаєте стандартні предикати роботи з рядками, з якими типами даних вони працюють?

2.5.7 Вказати режими роботи стандартних предикатів роботи з рядками.

3 ЛАБОРАТОРНА РОБОТА № 3

РОБОТА ЗІ СПИСКАМИ МЕТОДОМ НИЗХІДНОЇ РЕКУРСІЇ

3.1 Мета роботи

Мета роботи:

- навчитися використовувати при програмуванні основну операцію на списках та стандартні процедури обробки списків;

- навчитися писати та налагоджувати програми, які оброблюють списки за допомогою низхідної рекурсії.

3.2 Методичні вказівки до виконання лабораторної роботи

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

Задавайте ціль для стандартної процедури Append різними способами і перевіряйте, як це впливає на роботу процедури Append.

Наши рекомендации