Вывести каждый десятый символ текстового файла — Turbo/Visual Prolog

      Комментарии к записи Вывести каждый десятый символ текстового файла — Turbo/Visual Prolog отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на строки и файлы Вывести каждый десятый символ текстового файла — Turbo/Visual Prolog

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

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

    questioner
    Участник

    Нужно решить задачу на Turbo Prolog или Visual Prolog 5.2:

    Напишите программу, которая выводит на экран каждый десятый символ из текстового файла.

    domains
    n=integer*
    predicates
    readtolist(n).
    clauses
    readtolist([]):-eof(f1),!.
    readtolist(N):-
    not(eof(f1)),
    readint(X),
    readtolist(N1),
    N=[X|N1].
    goal
    write(«Vvedite imq faila: «), readln(X),
    openread(f1,X),
    readdevice(f1), readtolist(L),
    closefile(f1),
    write(L), nl,
    write(«Ok»).

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

  • #1888

    Посмотрите тему про работу с файлами в Visual Prolog. Можно считать строку с помощью readln, преобразовать ее в список, а затем выполнить следующую функцию вместо стандартного write:

    write_each_10_element(_Iterator, _Limit, []):-!.
    write_each_10_element(0, Limit, [Head|Tail]):-
    write(Head), nl, !,
    write_each_10_element(Limit, Limit, Tail).
    write_each_10_element(Iterator, Limit, [_Head|Tail]):-
    TailIterator = Iterator - 1, 
    write_each_10_element(TailIterator, Limit, Tail).

    Первым аргументом он принимает текущее значение счетчика необработанных элементов (изначально совпадает с Limit), вторым — номер элемента, который надо выводить (в вашем случае — десять), третьим — исходный список.
    Если список пуст — правило завершает работу.
    Если счетчик (итератор) равен нулю — выводится первый элемент списка, а остальные обрабатываются рекурсивно, при этом в качестве счетчика передается Limit, т.к. нам надо обработать следующую «пачку» элементов.
    Во всех остальных случаях правило ничего на экран не выводит, но уменьшает значение итератор и передает его и хвост списка для рекурсивной обработки.

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