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

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

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

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

  • Автор
    Сообщения
  • #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

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