Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы пролог часть 2.docx
Скачиваний:
3
Добавлен:
26.09.2019
Размер:
57.02 Кб
Скачать

40. Программы для обработки файлов.

Принято включать в программу модули, которые

при работе с программой оказывают пользователю посильную помощь. Обычно эти модули предоставляют возможность работать с меню, а также выдают информационные сообщения. Они могут также включать еще некоторые полезные средства в дополнение к этим основным, например, давать пользователю время подумать над тем, какие данные ему вводить.

Запись данных в файл

Программа "Ввод данных" (пример программы из учебника) является примером "дружески настроенной по отношению к пользователю" программы, осуществляющей запись в файл вводимых с клавиатуры данных.

"Ввод данных" содержит несколько вспомогательных модулей для информирования пользователя

Первый и последний из модулей второго уровня снабжают пользователя необходимой ему информацией.

В программе есть сообщ., поясняющее, как ей пользоваться., сообщение об окончании работы программы и о том, что она проделала.

Каждый из модулей отвечает за выполнение вполне определенного задания; общим для них является то, что все они дают пользователю необходимую информацию о своей работе.

Назначение check_for_ready состоит в проверке готовности пользователя к диалогу с программой.

check_for_ready :-

write("PLEASE PRESS SPACE BAR WHEN"),

write(" YOU ARE READY TO BEGIN."),nl,

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

41. Дозапись данных в файл

Добавление данных в конец уже имеющегося на диске файла широко применяется в практике программирования. По мере того как появляется новая информация, ее необходимо добавить в

конец файла с уже оприходованной информацией. Подобным образом устроены экспертные системы и файлы баз данных. Основой программы (пример из учбеника, программа считывает строки , введенные с клавы, и добавляет их в конец файла) является модуль process_input_output.

process_input_output :-

write("Please enter comlete filename."),

write(" Then press the return key."),nl,

write("The format of the file name is"),

write(" <file name>.<extension>."),nl,nl,

readln(Filename),

nl,write("Start typing in . . . "),nl,

openappend(datafile,Filename),

writedevice(datafile),

readln(Dstring),

concat(Dstring,"\13\10",Cstring),

readin(Dstring,Cstring),

closefile(datafile).

Предикат openappend используется здесь для открытия уже существующего файла с целью дозаписи в него новых данных.

Вспомогательные модули данной программы выводят на экран сообщения, содержащие подсказку для пользователя. Для пояснения работы программы предположим, что мы хотим добавить данные в файл с именем BROWNS.DAT, который содержит строчки___________________________________________________

42. Использование файлов прямого доступа

В разделе "Модификация уже существующего файла" говорилось, что каждый символ в файле занимает определенную позицию, которая характеризуется расстоянием, или смещением, от первого символа файла. Указатель файла может быть помещен в любую позицию, тем самым он определяет место, из которого будет считан или в которое будет записан следующий символ. Файлы с такой организацией доступа

к хранящейся в ней информации называются файлами прямого доступа, а операции выборки из такого файла - вводом-выводом из файла прямого доступа.

Произвольный доступ к файлам подобного рода делает возможным чтение и запись логических структур, таких как, например, записи, с любой позиции файла. В файлах, используемых

для этих целей, все записи имеют одинаковую длину. Когда указатель файла перемещается по позициям, номера которых кратны длине записи, он всегда указывает на начало очередной записи. Турбо-Пролог содержит два встроенных предиката, которые удобны для работы с файлами прямого доступа: openmodify и filepos. В настоящем разделе мы поясним, как нужно пользоваться ими.

Предположим, что вы хотите модифицировать файл с именем

PLAYERS.DAT. Тогда предикат openmodify необходимо записать в виде openmodify(players,"PLAYERS.DAT").

Символическое имя players обозначает логический файл

программы. Предикат openmodify связывает логическое имя файла с именем файла в DOS, так что впоследствии все ссылки на

players будут интерпретироваться как ссылки на PLAYERS.DAT.

(Само собой разумеется, что файл с таким именем уже должен

быть создан.)

Предикат filepos записывается в форме

filepos(Logical_filename,File_position,Mode).

Параметру File_position здесь должно быть присвоено

действительное число, обозначающее позицию в файле, из которой будет считан или в которую будет записан символ. (Дробная часть числа отбрасывается.)

Параметру Mode может быть присвоено одно из трех значений: 0, 1 или 2. Эти значения определяют то, как будет интерпретировано значение File_position. Ниже пояснено

употребление каждого допустимого значения параметра Mode.

_________________

0 │ Смещение берется относительно начала файла.

1 │ Смещение берется относительно текущей позиции.

2 │ Смещение берется относительно конца файла.________________________________________ Рассмотрим, для примера, такое употребление предиката

filepos:

filepos(players,100,0).

В этом выражении players есть имя логического файла. Параметр File_position имеет значение 100, что указывает на то, что будет прочитан символ, стоящий в 100-й позиции. Значение 0 параметра Mode свидетельствует о том, что сотня будет отсчитываться от начала файла.__

43. _Использование предикатов для работы с окнами. В систему программирования Турбо-Пролог включено пять предикатов, позволяющих программе управлять окнами различных размеров. Это предикаты makewindow, shiftwindow, removewindow,

clearwindow и gotowindow. С их помощью можно создавать несколько окон, выполнять ввод и вывод в определенные окна и устанавливать атрибуты окон.

Предикат makewindow является основой всех операций над окнами в Турбо-Прологе. Его синтаксическая форма:

makewindow(Window_number,

Screen_attribute,

Frame_attribute,

Frame_string,

Starting_row,

Starting_column,

Window_height,

Window_width)

Значения восьми параметров определяют характеристики окна.

Параметр Window_number, целое число, идентифицирует окно в программе. Это число используется в качестве ссылки предикатом

gotowindow и др. Целочисленное значение, присвоенное аргументу Screen_attribute, определяет цвета символов и фона. Выбираемые

значения атрибута зависят от того, какой монитор используется цветной или монохромный. Аргумент Starting_row предиката makewindow есть целое число, определяющее верхнюю строку (линию) создаваемого окна.

Аргумент Starting_column есть целое число, указывающее крайний левый столбец окна. Максимальное число столбцов, умещающихся на экране, 80. Аргумент Window_height есть целое число, определяющее количество строк, занимаемых создаваемым окном. Максимально возможное значение аргумента 25. И т.д.

Использование других предикатов для работы с окнами. Создание окна требует указания всех его атрибутов; для этого могут потребоваться определенные затраты времени. Однако

после того как атрибуты указаны, самая трудная часть работы может считаться выполненной. Предикаты, рассматриваемые в следующих секциях и используемые для различных методов управления окнами, обычно имеют не более одного аргумента.

Предикат shiftwindow используется для смены текущего окна (переключения). Его форма:

shiftwindow(Window_number)

Параметр Window_number является целым числом, приписываемым окну при его создании. (Это параметр Window_number предика-

та makewindow). Задание предиката shiftwindow(3) вызывает переназначение всех операций ввода и вывода в окно, с номером 3.

В то же время Турбо-Пролог "помнит" предыдущие окна и их атрибуты. Например, если окно 3 имеет такие атрибуты, что оно

будет перекрывать текущее окно (окно 4), то выполнение предиката shiftwindow(3) вызовет появление окна 3, в которое вложено окно 4. Информация из окна 4, частично закрытая окном 3, сохраняется и появится на экране, когда произойдет переключение и окно 4 вновь станет текущим.

Предикат gotowindow позволяет выполнять быстрое переключение между двумя окнами, которые не перекрываются. И т.д.

Использование окон для ввода и вывода

Стандартные предикаты ввода и вывода - read, readint,readchar, write и nl - также работают с любым текущим окном. Это означает, что предикаты ввода и вывода работают с любым окном, которое было сделано текущим при помощи makewindow, gotowindow или shiftwindow. По умолчанию предполагается, что курсор расположен в верхнем левом углу окна. Однако можно использовать предикат cursor

и помещать курсор в любую позицию текущего окна. Этот предикат имеет вид:

cursor(Row_number,Column_number).

Аргументы Row_number и Column_number являются целыми числами, задающими номера строки и столбца, по отношению к верхней

строке и крайнему левому столбцу экрана. Строки и столбцы нумеруются начиная с нуля: предикат cursor(0,0) обеспечивает вывод

текста, начиная с верхнего левого угла экрана. Если случайноуказывается позиция курсора, выходящая за рамки текущего окна, то во время выполнения программы Турбо-Пролог выдаст сообщение об ошибке.