Вывести из файла строки, длина которых больше заданной

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

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

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

    Нужно решить на Visual Prolog задачу с файлами. Из файла f1.txt нужно выбрать строки, длина которых больше заданного значения. Результат вывести в файл f2.txt.

    domains
      file = infile;outfile
    predicates
      longer_file_string(integer)
      print_longer_string(string, integer)
    clauses
      longer_file_string(_Length):- 
        eof(infile), !.
      longer_file_string(Length):-
        readln(String),
        print_longer_string(String, Length),
        longer_file_string(Length).
    
      print_longer_string(String, LimitLength):-
        str_len(String, Length),
        Length >= LimitLength, !,
        write(String), nl; !.
    
    goal
      write("Input the minimal length of string:"), readint(Length),
    
      openread(infile,"f1.txt"), readdevice(infile),
      openwrite(outfile, "f2.txt"), writedevice(outfile),
    
      longer_file_string(Length),
    
      closefile(infile),
      closefile(outfile).

    В секции domains описывает два типа файла, с которыми будем работать. В секции goal – открываем файлы, связывая их с заданными нами идентификаторами. Указываем файлы через идентификаторы как текущие устройства ввода и вывода – теперь все операции типа write выводят результат в f2.txt, а readln будет считывать строки с файла f1.txt. После обработки не забываем закрыть файлы (если не закрыть файл, открытый для записи – информация не сохранится).

    Функция longer_file_string(Length) считывает строки пока файл не кончится (функция eof не завершится успешно) – eof(infile). Строка передается вспомогательной функции print_longer_string, а остальные строки обрабатываются рекурсивно.

    Функция print_longer_string использует встроенную str_len для определения длины строки и сравнивает полученное значение с ограничением, введенным пользователем. Если сравнение проходит успешно – строка выводится на экран, а затем выводим символ перевод строки (nl) – без него все строки будут записаны в одну. Если же текущая строка короче чем надо – управление передается коду, расположенному после оператора “точка с запятой” (см. “Введение в логическое программирование“). Чтобы функция всегда завершалась успешно – поместим туда оператор отсечения.

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