Строки. Файлы

advertisement
Строки. Файлы
Лекция № 10
Строки










Стандартные предикаты по работе со строками
Преобразование строки в список символов
Преобразование списка символов в строку
Количество вхождений символа в строку
Позиция первого вхождения символа в строку
Замена всех вхождений символа на другой
Удаление части строки
Копирование части строки
Вставка подстроки в строку
Количество цифр, входящих в строку
Стандартные предикаты по
работе со строками
str_len (string, integer) – определение длины строки
concat (string, string, string) – конкатенация строк
frontchar (string, char, string) – разделение строки на
первый символ и «хвост»
frontstr (integer, string, string, string) – разделение
строки на первые символы и «хвост»
fronttoken (string, atom, string) – разделение строки на
первый атом и «хвост»
isname (string) – проверка, является ли
идентификатором аргумент
Преобразование строки в
список символов
str_list(“”,[]).
str_list(S,[H|T]):–
frontchar(S,H,S1),
str_list(S1,T).
Преобразование списка
символов в строку
list_str([],”“).
list_str([H|T],S):–
list_str(T,S1),
frontchar(S,H,S1).
Количество вхождений
символа в строку
char_count(”“,_,0).
char_count(S,C,N):–
frontchar(S,C,S1),!,
char_count(S1,C,N1),
N=N1+1.
char_count(S,C,N):–
frontchar(S,_,S1),
char_count(S1,C,N).
Позиция первого вхождения
символа в строку
str_pos(C,S,1):–
frontchar(S,C,_),!.
str_pos(C,S,N) :–
frontchar(S,_,S1),
str_pos(C,S1,N1),
N1<>0,!,
N=N1+1.
str_pos(_,_,0).
Замена всех вхождений
символа на другой
str_replace(““,_,_,”“):–!.
str_replace(S,C,C1,SO):–
frontchar(S,C,S1),!,
str_replace(S1,C,C1,S2),
frontchar(SO,C1,S2).
str_replace(S,C,C1,SO):–
frontchar(S,C2,S1),
str_replace(S1,C,C1,S2),
frontchar(SO,C2,S2).
Удаление части строки
str_delete(S,I,C,SO) :–
I1=I–1,
frontstr(I1,S,S1,S2),
frontstr(C,S2,_,S3),
concat(S1,S3,SO).
Копирование части строки
str_copy(S,I,C,SO) :–
I1=I–1,
frontstr(I1,S,_,S1),
frontstr(C,S1,SO,_).
Вставка подстроки в строку
str_insert(S,S1,I,SO) :–
I1=I–1,
frontstr(I1,S1,S1_1,S1_2),
concat(S1_1,S,S2),
concat(S2,S1_2,SO).
Количество цифр, входящих в
строку
dig(C,1):–
‘0’<=C,C<=’9’,!.
dig(_,0).
count_digit(““,0):–!.
count_digit(S,N):–
frontchar(S,C,S2),
dig(C,M),
count_digit(S2,N2),
N=N2+M.
Задачи для самостоятельного решения
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Последняя позиция вхождения символа в строку.
Общее количество латинских букв в списке символов.
Количество русских гласных букв в строке.
Слово, в котором наибольшее количество русских гласных букв.
Удалить из данной строки все вхождения заданного символа.
Удалить из данной строки все повторные вхождения символов.
Дублирование вхождения каждого символа в строку.
«Переворот» строки
Проверка, является ли данная строка палиндромом.
Список символов, которые входят одновременно в обе данные строки.
Слово максимальной (минимальной) длины.
Преобразование строки в список слов, состоящих из четного количества символов.
Преобразование строки в список слов, которые упорядочены по длине.
Преобразование строки в список слов, которые упорядочены в лексикографическом
порядке.
Преобразование исходной строки в строку, состоящую из первых букв слов первоначальной
строки.
Преобразование исходной строки в строку, состоящую из последних букв слов
первоначальной строки.
Проверка правильности расстановки скобок в исходной строке.
Замена местами первой и последней буквы в каждом слове исходной строки.
Файлы





Стандартные устройства
Стандартные предикаты по работе с файлами
Замена стандартного предиката openread
Вывод файла на экран
Создание файла из символов, вводимых с
клавиатуры
 Вывод файла на экран и принтер
 Копирование файла с заменой всех английских
букв на заглавные
Стандартные устройства
 stdin (стандартное устройство ввода);
 stdout (стандартное устройство вывода);
 stderror (стандартное устройство вывода
сообщений об ошибках);
 keyboard (клавиатура);
 screen (монитор);
 printer (параллельный порт принтера);
 coml (последовательный порт).
Стандартные предикаты по
работе с файлами










openread
openwrite
openappend
openmodify
existfile
closefile
renamefile
deletefile
disk
dir





eof
filepos
readdevice
writedevice
readln, readchar,
readint, readterm
 file_str
 flush
 filemode
Улучшение предиката openread
openFile(F,N):–
existfile(N),!,
openread(F,N).
openFile(_,N):–
write("Файл с именем ",N," не найден!").
Вывод файла на экран
DOMAINS
file = f
PREDICATES
write_file_to_screen(file)
outputFile(string)
CLAUSES
write_file_to_screen(f):–
not(eof(f)),!,
readchar(C),
write(C,” "),
write_file_to_screen(f).
write_file_to_screen(_).
outputFile(F_N):–
existfile(F_N),!,
openread(f,F_N),
readdevice(f),
write_file_to_screen(f),
closefile(f),
readdevice(keyboard),
nl,nl,
write("Нажмите любую клавишу"),
readchar(_).
outputFile(F_N):–
write("Файл с именем ",F_N," не
найден!").
GOAL
write("Введите имя файла: "),
readln(F_N),
outputFile(F_N).
Создание файла из символов,
вводимых с клавиатуры
DOMAINS
file=f
PREDICATES
Readfile
CLAUSES
readfile:–
writedevice(screen),
write("Введите символ (# — конец
ввода)"), nl,
readchar(C),
C<>'#',!,
writedevice(f),
write(C),
readfile.
readfile:–
closefile(f).
GOAL
write("Введите имя файла: "),
readln(F_N),
openwrite(f,F_N),
readfile(f).
Вывод файла на экран и
принтер
writeFile_to_scr_and_pr(f):–
not(eof(f)),!,
readchar(C),
write(C),
writedevice(printer),
write(C),
flush(printer),
writedevice(screen),
writeFile_to_scr_and_pr(f).
writeFile_to_scr_and_pr:–
closefile(f).
Копирование файла с заменой всех
английских букв на заглавные
transform:–
not(eof(f)),!,
readln(S),
upper_lower(S_U,S),
write(S_U),nl,
transform.
transform:–
closefile(f),
closefile(f_o).
upper_file(N_F,N_o_F):–
existfile(N_F),!,
openread(f,N_F),
readdevice(f),
openwrite(f_o,N_o_F),
writedevice(f_o),
transform.
upper_file(N_F,_):–
write("Файл с именем ",N_F," не наден!").
Задачи для
самостоятельного решения









Напишите замену для стандартного предиката openwrite, который будет открывать
файл на запись, если файл существует, и выводить соответствующее сообщение, если
он отсутствует.
Напишите замену для стандартного предиката openmodify, который будет открывать
файл на чтение и запись, если файл существует, и выводить соответствующее
сообщение, если файл отсутствует.
Напишите замену для стандартного предиката openappend, который будет открывать
файл на дозапись, если файл существует, и выводить соответствующее сообщение,
если он отсутствует.
Создайте предикат, осуществляющий переписывание из одного файла, содержащего
числа, в другой файл только тех чисел, которые являются четными.
Создайте предикат, вычисляющий количество отрицательных чисел в файле.
Создайте предикат, вычисляющий сумму чисел, хранящихся в файле.
Создайте предикат, вычисляющий количество чисел, меньших среднего
арифметического значения всех чисел в файле.
Создайте предикат, формирующий из текста, хранящегося в файле, список слов, в
которых имеются повторяющиеся символы.
Создайте предикат, дополняющий все строки, хранящиеся в файле, символом "*" до
самой длинной строки.
Download