Строки. Файлы Лекция № 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, который будет открывать файл на дозапись, если файл существует, и выводить соответствующее сообщение, если он отсутствует. Создайте предикат, осуществляющий переписывание из одного файла, содержащего числа, в другой файл только тех чисел, которые являются четными. Создайте предикат, вычисляющий количество отрицательных чисел в файле. Создайте предикат, вычисляющий сумму чисел, хранящихся в файле. Создайте предикат, вычисляющий количество чисел, меньших среднего арифметического значения всех чисел в файле. Создайте предикат, формирующий из текста, хранящегося в файле, список слов, в которых имеются повторяющиеся символы. Создайте предикат, дополняющий все строки, хранящиеся в файле, символом "*" до самой длинной строки.