Найти слово с наибольшим количеством гласных букв — Prolog

      Комментарии к записи Найти слово с наибольшим количеством гласных букв — Prolog отключены

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

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

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

    questioner
    Участник

    Нужно решить задачу на строки:

    Создать предикат, находящий в исходной строке слово, в котором наибольшее количество русских гласных букв.

    Я так понимаю, надо разделить строку на символы с помощью frontchar, (который делит строку на первый символ и остаток строки), затем — выделять в символах слова, а в словах — гласные буквы, и всё это делать в циклах? А при выделении в словах букв — сравнивать каждую букву с массивом гласных.Вот только массивов в Прологе нет. И увеличить счетчик гласных, при совпадении. Вот только массивов в прологе нет. Использовать список? Как в Прологе лучше всего выделять определенную букву или группу букв в слове?

    План действий пока таков:

    1. Считываем текст из строки.
    2. Заводим счетчик (сейчас он равен 0)
    3. Делим строку на слова (как? пока идея одна — считать словами то, что слева и справа от пробела)
    4. Берём одну букву из слова. (Frontchar)
    5. Если буква — гласная, то увеличить счётчик, иначе ничего не делать.
    6. Примените пункт 4 до конца слова. Как только слово кончилось — кладем значение счетчика в переменную, например MaxCount, берем следующее слову и также считаем для него.
    7. Если строка закончилась — проверяем счетчик.

    Как потом увязать полученный MaxCount с тем словом, на котором он был получен? Т.е. будет у меня результат MaxCount = 6 (т.е. максимально кол-во гласных в слове было 6), но в каком именно слове?

  • #1855

    Судя по frontchar, вы используете Турбо Пролог — в нем для обработки строк используются особые функции — и это не удобно, т.к. frontchar позволяет получать только первый символ — его было бы удобно заменить операцией отделения головы списка — это более красиво синтаксически, и единообразно.

    Однако, если вы используете Турбо Пролог — для Вашей задачи удобно использовать fronttoken (этот стандартные предикат выделяет первое слово строки). Но у Вас в задании сказано, что текст на русском языке, а fronttoken не поддерживает русский язык. Однако, если Вы используете Вижуал Пролог — то смело можете применять frontoken (он там тоже поддерживается и с русскими буквами работает нормально).

    Более правильное решение — преобразовать строку строку в список символов и работать с ним.

    Если нужно обрабатывать русские символы в Турбо Пролог — можно написать такой предикат для выделения слов (вместо fronttoken) :

    getword(InputStr,Word,Buf,Tail):-
        frontchar(InputStr,Char,StrTail),
        NOT(Char=' '),
        str_char(CharStr,Char),
        concat(Word,CharStr,NewStr),
        getword(StrTail,NewStr,Buf,Tail),!.
    getword(InputStr,Word,Word,Tail):-
        frontchar(InputStr,_,Tail).
    getword(InputStr,Word,Word,InputStr).

    Перво что нужно сделать — разделить строку на список слов — это очень просто, достаточно рекурсивно применить описанное выше правило.

    Затем, надо где-то определить гласные буквы — я бы сделал это примерно так:

    vowel("a").
    vowel("e").

    буквы в кавычках, т.к. по заданию они русские, а турбо не поймет иначе.

    Ну и остается написать предикат, который считает количество гласных букв в слове.
    Берешь букву, преобразуешь ее в строку при помощи встроенного предиката str_char (в правиле выше есть пример использования) и передаешь ее в vowel. Попробуй сам, если не получится — пиши )

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