Практическое занятие №8
Тема: Предикаты Турбо-Пролога для работы с файлами. Описание файлового домена. Задание 1. Первый из предикатов этого правила (модуля программы) присваивает переменной Line объект утверждения data. Это значение затем печатается на заданное по умолчанию устройство вывода, т. е. на экран. Следующие три предиката переадресуют вывод в файл, пишут туда данные, потом переадресуют вывод обратно на экран. Предикат fail вызывает откат к следующему утверждению data, так что перебираются все такие утверждения. Последний write_lines позволяет удовлетворить цель, когда первый вариант правила дал неуспех ввиду исчерпания утверждений c data. Выдача приведенной программы на экран полностью совпадает с выдачей "Макбет - 1". Однако она дополнительно создает в текущей директории файл с именем SHAKE1.DAT. Для того чтобы ознакомиться с его содержимым, нужно сначала сохра- нить "Макбет - 2", а затем загрузить SHAKE1.DAT в окно редактора Турбо-Пролога. Содержимое файла должно почти полностью совпадать с исходными строками базы данных, за исключением трех пробелов перед каждой выводимой строкой. Модифицируйте правило write_lines программы "Макбет -2" так, чтобы сначала данные записывались на диск, а уже потом выдавались на экран. Задание 2. Чтение из уже существующего файла. Чтение данных из уже существующего файла является первичным средством для использования хранящихся на внешнем устройстве данных. Этот процесс заключается в открытии дискового файла для чтения, выводе их на выходное устройство, например, экран или принтер, и закрытии файла. (Эти шаги уже были описаны в разделе "Чтение из файла".) Данный процесс реализует программа "Распечатка файла" (листинг 7.3). На рис. 7.7 и 7.8 приведены диаграмма потоков данных и структурная схема этой программы. ДПД показывает поток данных, исходящий из файла SHAKE1.DAT (файл, созданный программой "Макбет - 2"), и идущий на экран через целевой модуль программы. СС показывает, что целевой модуль вызывает три модуля второго уровня. Первый из них производит открытия для чтения файла SHAKE1.DAT. Второй читает из файла записи и выводит их на экран. Третий, последний, закрывает названный файл. Основным звеном программы является правило чтения и вывода данных на экран дисплея.
read_write_lines :- readdevice(datafile), not(eof(datafile)), readln(line), writedevice(screen), write(" ",Line),nl, read_write_lines. read_write_lines.
Правило использует встроенный предикат Турбо-Пролога eof, который дает успех в случае, если обнаружен признак конца файла. Если в процессе чтения из файла данных достигается конец этого файла, то никакие считывания больше не будут производиться, если, конечно, не сместить указатель файла на какую-либо позицию, предшествующую метке конца файла. Неуспешной будет любая подцель, пытающаяся произвести чтение при указателе, стоящем на этой метке. Предикат eof(datafile) таким образом сигнализирует о достижении конца логического файла datafile. Отметим, что в нашем случае этот предикат употреблен вместе с предикатом логического отрицания, т. е. в виде not(eof(datafile)). На естественном языке суть правила можно сформулировать так: "Продолжать чтение и печать до тех пор, пока не будет достигнут конец файла". Используя предикат eof и предусматривая в программе необходимые действия на случай успеха при вызове этого предиката, можно "научить" программу считывать данные из файлов должным образом. Закрытие, а затем повторное открытие устраняют наличие признака конца файла (предикат eof становится неуспешным), а указатель смещается в начало файла. Для считывания строк данных из файла SHAKE1.DAT в программе использован предикат readln. Как легко вспомнить, в программах "Макбет" вслед за предикатом write всегда стоял предикат nl (правило write_lines с листингов 7.1 и 7.2). Когда nl используется в отношении дискового файла, то в этот файл записывается индикатор конца строки. Индикатор конца строки представляет собой пару спецсимволов возврата каретки и перевода строки (коды ASCII 13 и 10). Иногда эту комбинацию обозначают как CR-LF. Так как nl в правилах следует за предикатом write, то комбинация CR-LF ограничивает справа каждую из записанных в файл строк. Когда с этим файлом начинает работать программа "Распечатка файла", то предикат readln считывает все символы вплоть до очередной CR-LF. Эффект здесь в точности такой же, как если бы при вводе строки с клавиатуры нажималась клавиша посылки. Последние два предиката переадресуют вывод на экран и выводят туда данные. Если в программе переадресаций вывода больше нет, то наличие предиката writedevice(screen) не обязательно. Включение его в программу, конечно, и при этом не является ошибкой, более того, явное задание устройства вывода относится к числу приемов надежного пограммирования. Выдача программы "Распечатка файла" полностью совпадает с вы- дачей "Макбет - 2". Проделайте с программой "Распечатка файла" следующее: внесите изменения в правило read_write_lines, так чтобы входной файл высвечивался на экран и печатался на принтере.
Листинг 7.2 /* Программа: Макбет - 2 Файл: PROG0702.PRO */ /* Назначение: Вывод информации на экран дисплея */ /* и в файл на диске. */
domains
str = string file = datafile
predicates
data(str) write_lines
goal
openwrite(datafile,"SHAKE1.DAT"), write_lines, closefile(datafile).
clauses
data("A drum, a drum!"). data("Macbeth does come"). data("The weird sisters, hand in hand,"). data("Posters of the sea and land,"). data("Thus do go about, about:"). data("Thrice to thine and thrice to mine."). data("And thrice again, to make up nine.").
write_lines :- data(Line), write(" ",Line),nl, writedevice(datafile), write(" ",Line),nl, writedevice(screen), fail. write_lines.
/***** конец программы *****/
_____________________________ Листинг 7.3 /* Программа: Распечатка файла Файл: PROG0703.PRO */ /* Назначение: Чтение данных из файла и вывод их */ /* на экран. */
domains
str = string file = datafile
predicates
raed_write_lines
goal
openread(datafile,"SHAKE1.DAT"), read_write_lines, closefile(datafile).
clauses
read_write_lines :- readdevice(datafile), not(eof(datafile)), readln(line), writedevice(screen), write(" ",Line),nl, read_write_lines. read_write_lines.
Популярное: Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (363)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |