logo
ответы пролог часть 2

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) обеспечивает вывод

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