Мегаобучалка Главная | О нас | Обратная связь


Практическое занятие №8



2015-12-04 347 Обсуждений (0)
Практическое занятие №8 0.00 из 5.00 0 оценок




Тема: Предикаты Турбо-Пролога для работы с файлами.

Описание файлового домена.

Задание 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-12-04 347 Обсуждений (0)
Практическое занятие №8 0.00 из 5.00 0 оценок









Обсуждение в статье: Практическое занятие №8

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (347)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)