Лабораторная работа № 3 Работа с файлами и строками
Цель работы: приобретение навыков работы со строками, файлами, списками, необходимыми для обработки естественно – языковых конструкций.
Пример. Из заданного файла считать строки и сформировать из них список. Полученный список разделить на два списка, при этом в первый список результата попадут те строки, у которых число гласных четное, а во второй те, у которых нечетное.
Назначение предикатов:
read_list(list) – читает из заданного файла строки и формирует из них исходный список;
sort(list_liter,list,list,list) – распределяет строки по спискам результата. Первый параметр – список, задающий число гласных букв в соответствующем списке строк, который связан со вторым параметром. Третий параметр – результирующий список с четным числом гласных букв, а четвертый – с нечетным. Строки, не содержащие ни одной гласной буквы, не попадают в результирующие списки;
анализ(string,integer,integer) – подсчитывает число гласных букв в строке. Первый параметр – строка, второй – текущая сумма гласных букв, третий – используется для передачи результата подсчета вызывающему analiz предикату;
разбор(list,list_liter) – для заданного списка строк формирует соответствующий ему список, содержащий для каждой строки подсчитанное количество гласных букв;
гласная(char) – задает факты, позволяющие идентифицировать гласные буквы;
run – организует общий вычислительный процесс, т.е. задает цель для программы.
DOMAINS
list=string*
list_liter=integer*
file=file_in
PREDICATES
nondeterm read_list(list)
nondeterm sort(list_liter,list,list,list)
nondeterm анализ(string,integer,integer)
nondeterm разбор(list,list_liter)
nondeterm гласная(char)
nondeterm run
CLAUSES
гласная('а').гласная('е').гласная('о').гласная('и').гласная('у'). гласная('ю').гласная('я').гласная('э').
read_list([X|List]) :- not(eof(file_in)),readln(X),read_list(List).
read_list([]).
sort([],[],[],[]) :- !.
sort([K|Q],[_|L],L1,L2) :- K=0,sort(Q,L,L1,L2).
sort([K|Q],[X|L],[X|L1],L2) :- K/2=K div 2,sort(Q,L,L1,L2).
sort([_|Q],[X|L],L1,[X|L2]) :- sort(Q,L,L1,L2).
разбор([],[]) :- !.
разбор([X|L],[K|Q]) :- анализ(X,0,K),разбор(L,Q).
анализ("",N,N) :- !.
анализ(X,N,M) :- frontchar(X,Ch,R),гласная(Ch),N1=N+1,анализ(R,N1,M).
анализ(X,N,M) :- frontchar(X,_,R),анализ(R,N,M).
run :- write("Введите имя файла, содержащего исходные строки - "),
readln(FileIn),openread(file_in,FileIn),
readdevice(file_in),
read_list(List),readdevice(keyboard),closefile(file_in),
разбор(List,Q),sort(Q,List,L1,L2),
write(" Исходный список строк"),nl,write(List),nl,
write(" Список строк с четным числом гласных букв"),nl, write(L1),nl,
write(" Список строк с нечетным числом гласных букв"),nl, write(L2),nl.
GOAL
run.
Рекомендация. Если вам покажутся слишком сложными рекурсивные функции с многими переменными, упростите решение задачи. Соедините рекурсивные вызовы с механизмом assert, findall, аналогичным 2-й работе.
Варианты заданий
(Слово “текст” в задании подразумевает несколько слов в строке)
1. Считать из файла слова (каждое слово записано на отдельной строке), определить число гласных и согласных букв в каждом слове и результаты записать в два списка. По окончании работы списки сохранить в новом файле.
2. Считать из файла некоторый текст, все слова текста разделить на два списка, в первый войдут слова, начинающиеся с гласной, во второй – с согласной. Полученные списки сохранить в некотором файле.
3. Считать из файла слова и разделить их на два списка по следующему правилу: слово попадает в первый список, если в нем больше гласных букв, и во второй, если больше согласных. Полученные списки сохранить в некотором файле.
4. Считать из файла текст и выполнить его синтаксический анализ, определив, сколько использовано гласных букв, результат записать в некоторый файл.
5. Считать слова из файла. Если число согласных букв в слове четное, то его записывают в один список, если нечетное, – в другой. Результаты сохранить в файле.
6. В файле записаны слова, некоторые из них повторяются. Требуется считывать слова из этого файла и формировать из них список, в котором повторов не будет. Результат записать в файл.
7. Считать из файла слова и сформировать список из тех слов, в которых встречается более двух согласных букв подряд. Результат записать в файл.
8. Считать из файла слова и создать список из тех слов, которые содержат внутри себя определенную последовательность из трех или более букв (задается пользователем). Результат вывести в файл.
9. Считать из файла слова и разделить их на два списка по следующему критерию: в первый список попадают слова, имеющие одинаковое количество гласных и согласных, во второй – остальные слова. Результат записать в файл.
10. Считать из файла слова и сформировать два списка из тех слов, в которых количество согласных или гласных (на выбор) букв больше установленного, и из тех, в которых оно меньше установленного (вводится с клавиатуры). Результаты вывести в файл.
11. Считать из файла слова и выписать в список слова по возрастанию общего количества гласных (согласных) букв в слове. Результат вывести в файл.
12. Считать из файла слова и сформировать список из длин всех встречающихся слов (без повторов). Результат вывести в файл.
Контрольные вопросы:
1. Чем принципиально отличается рекурсивная функция read_list от рекурсивной функции печати списка?
2. Как организуется рекурсия с помощью функции frontchar?
