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


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



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




Использование файлов прямого доступа в среде Турбо-Пролог. Запись в файл прямого доступа. Чтение из файла прямого доступа в среде Турбо-Пролог.

Задание 1.

В программе «Чтение данных с клавиатуры» рекурсивное правило дополняет строку до 38 символов, сцепляет ее с комбинацией спецсимволов СR-LF и записывает эту удлиннившуюся строку в файл:

 

write_read_more(_,"done") :-

nl, write(" Press the space bar."),

readchar(_),exit.

 

write_read_more(Index,Dstring) :-

writedevice(datafile),

filepos(datafile,Index,0),

pad_string(Dstring,Padstring,38),

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

write(Cstring),

writedevice(screen),

write("Type in data string"),nl,

readln(Dstring1),

Index1 = Index + 40,

write_read_more(Index1,Dstring1).

 

Отметим, что значение переменной Index (используемой предикатом filepos) увеличивается на 40 перед очередным кругом рекурсии. При помощи устроенной таким образом индесксной переменной указатель файла каждый раз перед занесением новой

записи помещается в нужное место.

Правило write_read_more использует правило pad_string для дополнения строки дефисами. Это правило выглядит так:

 

pad_string(Instring,Instring,Length) :-

str_len(Instring,Testlength),

Testlength >= Length,!.

pad_string(Instring,Padstring,Length) :-

concat(Instring,"-",Newstring),

pad_string(Newstring,Padstring,Length).

 

Окончание рекурсий связано с выравниванием значений длины текущей строки и переменной Length.

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

Файл прямого доступа имеет здесь имя PLAYERS.DAT .

Все строки данных имеют длину 38.

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

Задание 2.

Напишите на Турбо-Прологе программу, заводящую на диске файл, описанный в предыдущем утверждении.

Задание 3.

Программа содержит одно единственное правило, которое используется в целевом утверждении:

 

read_a_random_access_file :-

 

write("Please enter filename:"),nl,

readln(Filename),

openread(datafile,Filename),

write("Type in record number: "),nl,

readreal(Record),

Index = (Record - 1) * 40,

readdevice(datafile),

filepos(datafile,Index,0),

readln(Cstring),

write(Cstring), nl,nl,

write("Press the space bar."),nl,

readdevice(keyboard),

readchar(_),

closefile(datafile),

exit.

 

Проследим, как вычисляется значение переменной Index. В теле правила введенный номер записи уменьшается на единицу, а затем умножается на длину строки, т. е. 40; это значение присваивается переменной Index. Если полученное число задает позицию в пределах файла, то правило успешно, и строка данных высвечивается на экране. Далее программа выдает приглашение продолжить работу и закрывает входной файл.

Для считывания была выбрана первая строка,и на экран вывелись сведения об игроке по имени John Elway. Измените программу "Чтение файла прямого доступа" так, чтобы она распечатывала содержимое всего файла.

Задание 4.

Модифицируйте программу "Чтение файла прямого доступа" так, чтобы она печатала данные из считанной строки в таком формате:

 

Имя: <имя игрока>

Номер: <номер>

Команда: <название команды>

 

(Замечание: Выделить нужные данные из считанной строки можно при помощи предиката substring.)

 

Листинг 7.11

/* Программа: Создание файла прямого доступа */

/* Файл: PROG0711.PRO */

/* Назначение: Чтение данных с клавиатуры и */

/* запись их на диск в файл прямого */

/* доступа. */

 

domains

 

file = datafile

 

predicates

 

create_a_random_access_file

write_read_more(real,string)

pad_string(string,string,integer)

 

goal

 

create_a_random_access_file.

 

clauses

 

create_a_random_access_file :-

 

write("Please enter filename:"),nl,

readln(Filename),

openwrite(datafile,Filename),

closefile(datafile),

openmodify(datafile,Filename),

write("Type in data string."),nl,

readln(Dstring),

write_read_more(0,Dstring),

closefile(datafile).

 

write_read_more(_,"done") :-

nl, write(" Press the space bar."),

readchar(_),exit.

 

write_read_more(Index,Dstring) :-

writedevice(datafile),

filepos(datafile,Index,0),

pad_string(Dstring,Padstring,38),

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

write(Cstring),

writedevice(screen),

write("Type in data string"),nl,

readln(Dstring1),

Index1 = Index + 40,

write_read_more(Index1,Dstring1).

 

pad_string(Instring,Instring,Length) :-

str_len(Instring,Testlength),

Testlength >= Length,!.

pad_string(Instring,Padstring,Length) :-

concat(Instring,"-",Newstring),

pad_string(Newstring,Padstring,Length).

 

/***** конец программы *****/

____________________________

 

 

Листинг 7.12

/* Программа: Чтение файла прямого доступа */

/* Файл: PROG0712.PRO */

/* Назначение: Чтение данных из файла прямого */

/* доступа и выдача их на экран. */

 

domains

 

file = datafile

 

predicates

 

read_a_random_access_file

 

goal

 

read_a_random_access_file.

 

clauses

 

read_a_random_access_file :-

 

write("Please enter filename:"),nl,

readln(Filename),

openread(datafile,Filename),

write("Type in record number: "),nl,

readreal(Record),

Index = (Record - 1) * 40,

readdevice(datafile),

filepos(datafile,Index,0),

readln(Cstring),

write(Cstring), nl,nl,

write("Press the space bar."),nl,

readdevice(keyboard),

readchar(_),

closefile(datafile),

exit.

 

/***** конец программы *****/

____________________________

 

 




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









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

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

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

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



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

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

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

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

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

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



(0.009 сек.)