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

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

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

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

  • Автор
    Сообщения
  • #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, т.к. нам надо обработать следующую «пачку» элементов.
    Во всех остальных случаях правило ничего на экран не выводит, но уменьшает значение итератор и передает его и хвост списка для рекурсивной обработки.

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