Количество букв в последнем слове строки visual prolog

Программирование Помощь с решением задач на Prolog Задачи на строки и файлы Количество букв в последнем слове строки visual prolog

В этой теме 1 ответ, 1 участник, последнее обновление  Васильев Владимир Сергеевич 10 мес. назад.

  • Автор
    Сообщения
  • #3251

    Решим задачу на Prolog:

    Дана строка символов. Группа символов, разделенная пробелами и не содержащая пробелов внутри себя, называется словом. Подсчитать количество букв «е» в последнем слове строки.

    При решении нужно использовать Visual Prolog или Turbo Prolog, для обработки строк применять встроенные функции frontchar и fronttoken.

    Разобьем задачу на подзадачи — выделим слово, а затем подсчитаем в нем число нужных символов. Для подсчета символов можно использовать функцию count.

    Получить последнее слово можно по-разному. Например, мы можем считать последним слово, после которого не стоит пробел. Для описания такого правила нам потребуется вспомогательная функция, использующая дополнительный аргумент для накопления результата. Основная функция будет делать только то, что вызывать вспомогательную, передавая ей в качестве буфера пустую строку:

      last_word(String, Word):-
        last_word(String, "", Word).

    Вспомогательная функция:

    • возвращает в качестве результата накопленные значения если исходная строка пуста;
    • если первый символ строки — пробел, то за ним следует слово, которое надо считать, помещая символы в буфер;
    • во всех остальных случаях, считываем символ строки, добавляем его в буфер (также при помощи frontchar), остальные символы обрабатываем рекурсивно, при этом используем новый буфер.

    Реализация алгоритма на Prolog:

      last_word("", Word, Word):-!.
      last_word(String, _, Word):-
        frontchar(String, ' ', TailString), !,
        last_word(TailString, "", Word).
      last_word(String, Buff, Word):-
        frontchar(String, Char, TailString), !,
        frontchar(NewBuff, Char, Buff), !,
        last_word(TailString, NewBuff, Word).

    В такой реализации алгоритма, последнее слово будет получаться перевернутым, но это не важно если нам нужно лишь подсчитать количество символов. Цель может выглядеть так:

    goal 
        write("enter string: "), readln(String),
        last_word(String, ReversedWord),
        count(ReversedWord, 'e', Count).

    Пример запуска программы приведен на рисунке:
    symbol-count-last-word-prolog

    Другой способ получить последнее слово строки на Visual Prolog, причем, не перевернутое — использовать вспомогательную функцию для отделения первого слова (это можно сделать встроенной функцией fronttoken). Алгоритм тогда заключается в том, что если мы считали первое слово и оно было последним (осталась пустая строка) — то это слово нужно вернуть как результат. Иначе, считанное первое слово можно пропустить, результат находится в остальной части строки:

      last_word(String, LastWord):-
        fronttoken(String, LastWord, ""), !.
      last_word(String, LastWord):-
        fronttoken(String, _FirstWord, StringTail), 
        last_word(StringTail, LastWord).

    На рисунке приведены результаты запуска программы:
    symbol-count-last-word-fronttoken

  • #4307

    Если вдруг строка задана списком символов — то код немного изменится (вместо работы со строками будем использовать работу со списками).

    Функция получения последнего слова работает точно также, как описано выше:

    last_word(String, Word):-
      last_word(String, [], Word).
    
    last_word([], Word, Word):-!.
    last_word([' '|TailString], _, Word):-
      !, last_word(TailString, [], Word).
    last_word([Char|TailString], Buff, Word):-
      last_word(TailString, [Char|Buff], Word).
    

    Функция count для списков также уже реализована: см тему «Определите, сколько раз заданный элемент входит в список«

Для ответа в этой теме необходимо авторизоваться.