
- •40. Программы для обработки файлов.
- •41. Дозапись данных в файл
- •42. Использование файлов прямого доступа
- •44. Использование графики в программе
- •45. Использование звука и музыки
- •46. Базы данных в прологе. Предикаты динамическое бд.
- •48. Создание базы данных, располагающейся на диске.
- •51. Экспертная система на правилах
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) обеспечивает вывод
текста, начиная с верхнего левого угла экрана. Если случайноуказывается позиция курсора, выходящая за рамки текущего окна, то во время выполнения программы Турбо-Пролог выдаст сообщение об ошибке.