9) Быки и коровы. Игрок A выбирает секретный код, представляющий последовательность из N различных десятичных цифр (N=4). Игрок пытается угадать задуманный код и спрашивает игрока А о числе “быков” (“быки” - количество совпадающих цифр в одинаковых позициях предполагаемого и задуманного кодов; число “коров”- количество совпадающих цифр, входящих в предполагаемый и задуманный код, но находящиеся на разных позициях).
Рекомендуемая литература
1.Ин Ц., Соломон Д. Использование Турбо-Пролога: Пер. с англ.-
М.:Мир, 1993.-608 с.,ил.
2.Информатика:Учеб.пособие для студ.пед.вузов/А.В.Могилев, Н.И.Пак, Е.К.Хеннер;Под ред. Е.К.Хеннера.-3-е изд., перераб. и доп.-М.:Издательский центр “Академия”, 2004.-848 с.
51
Лабораторная работа №7. Обработка файлов. Предикаты для работы с файлами
deletefile(DOS_filename)-удаление файла save(DOS_filename) –сохранение файла
-переименовыфвание файла existfile(DOS_filename)-проверка на наличие файла с таким именем flush(file_domain)-сброс данных из внутреннего буфера, отведенного для данного устройства записи
disk(Path) –выбор дисковода и пути доступа
dir(Path, File_spec, File_name) –Переменой Path должен быть присвоен корректный путь доступа, переменная File_spec задает расширение представляющей интерес группы файлов. Данный предикат выдает каталог имен файлов с заданным расширением; вы можете выбрать среди них нужный и нажать Enter. Имя файла будет присвоено переменой File_name.
При описании файловых доменов тип домена записывается по левую сторону от знака равенства, а имя доомена по правую.
Пример:
file=datafile
file=datafile1;datafile2
openwrite(datafile,filename) - открытие файла для записи или создание, где datafileвведеннный пользователем файловый домен, filename-имя файла в DOS, теперь ссылки на datafile будут означать обращение к filename.
writedevice(datafile) -назначение файла в качестве устройства записи
openread(datafile,filename) - открытие файла для чтения.
readdevice(datafile) -назначение файла устройством чтения openmodify(datafile,filename) - открытие файла для редактирования,
указатель помещается в начало файла, сместить указатель можно при помощи предиката filepos.
openappend(datafile,filename) - открытие файла для добавления данных в конец файла.
closefile(datafile) -закрытие файла
52
Рассмотрим примеры работы с файлами.
Пример 1. Вывести информацию на экран дисплея и в файл на диске.
Domains
Программа 27. Запись данных в файл
str = string file = datafile
Predicates data(str) write_lines
Goal openwrite(datafle,"file1.dat"), write_lines, closefile(datafile).
Clauses
data("Старому году оставьте печали,!"). data("Забудьте обиду, беду.").
data("Только успехов, здоровья и счастья,"). data("Мы Вам желаем в Новом году!"). write_lines:-
data(Line), write(" ",Line),nl,
writedevice(datafile), write(" ",Line),nl,
writedevice(screen), /*для вывода данных на экран*/ fail, write_lines.
Пример 2. Вывести данные файла на экран.
Domains
Программа 28. Чтение данныхиз файла
str = string file = datafile
Predicates
read_write_lines
Goal openread(datafile,"file1.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.
Пример 3. Записать в файл данные, вводимые с клавиатуры
Domains
Программа 29. Запись в файл данных, вводимых с клавиатуры
file = datafile
dstring, cstring = string Predicates
readin(dstring,cstring) create_a_file
Goal
create_a_file.
Clauses
create_a_file :-
53
nl,nl,
write("Пожалуйста, введите полное имя файла."), nl,nl,
readln(Filename), openwrite(datafile,Filename), writedevice(datafile),
readln(Dstr),
concat(Dstr,"\13\10",Cstr),
readin(Dstr,Cstr), closefile(datafile).
readin("done",_) :- !.
/*ввод данных завершится после вода слова "done"*/ readin(_,Cstr) :-
write(Cstr),
readln(Dstrl),
concat(Dstrl, "\13\10",Cstr1), writedevice(datafile), readin(Dstrl,Cstr1).
Предикаты для работы с файлами прямого доступа Openmodify(fn,filename)-связывает логическое имя файла fn с именем файла Filepos(fn, pos, mode)-устанавливает указатель файла в заданную позицию
Таблица 12. Действие системы при операциях с файлами прямого доступа
Режим mode |
Действия системы |
0 |
Смещение берется относительно начала файла |
1 |
Смещение берется относительно текущей позиции |
2 |
Смещение берется относительно конца файла |
Пример 4. Данные, вводимые с клавиатуры, записать в файл прямого доступа.
Domains
Программа 30. Запись данных в файл прямого доступа
file = datafile Predicates
create_a_random_access_file write_read_more(real, string) pad_str (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("Введите строку"),nl, readln(Dstr), write_read_more(0,Dstr), closefile(datafile).
write_read_more(_,"done") :-
nl, write(" Press the space bar."), readchar(_),exit.
54
write_read_more(Index,Dstr) :- writedevice(datafile), filepos(datafile,Index,0), pad_str(Dstr,Padstr,38), concat(Padstr, "\10\13", Cstr), write(Cstr), writedevice(screen), write("Введите строку"),nl, readln(Dstr1),
Index1 = Index + 40, write_read_more (Index1, Dstr1).
pad_str (Instr,Instr,Length) :- str_len(Instr,Testlength), Testlength >= Length,!. pad_str (Instr,Padstr,Length) :- concat(Instr,"-",Newstr), pad_str(Newstr,Padstr,Length).
Пример 5. Вывести на экран заданную строку файла прямого доступа и выдача их на экран
Domains
Программа 31. Вывод данных из файла прямого доступа
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 1n record number: "),nl, readreal(Record),
Index = (Record - 1) * 40, readdevice(datafile), filepos(datafile,Index,0), readln(Cstr),
write(Cstr), nl,nl,
write("Press the space bar."),nl, readdevice(keyboard), readchar(_),
closefile(datafile),
exit.
Задание для самостоятельной работы
1)В файле задана последовательность целых чисел, найти сумму чисел, предшествующих первому отрицательному.
2)Переписать данные файла в обратном порядке.
3)Вывести на экран данные файла в неубывающем порядке.
4)Записать результат сложения чисел, содержащихся в файлах в
третий.
5)Переписать числа из файла в другой, дописав за каждым его квадрат.
55