Else
If not (total[j] in ['a','A','b','B']) then
If total[j] in ['A'..'Z','a'..'z'] then
begin writeln(' Файл ',fn,' не найден');readln;halt end
begin setdisc;break end;
end;
repeat readln(ft,str); if str<>'' then
begin symb:=symb+length(str); for j:=1 to length(str) do
begin if alfa then checknm;
if str[j]=pg then begin page:=page+1;alfa:=true end;
if not (str[j] in [pg,' ']) and (not alfa) then inc(a);
if str[j]=' ' then beta:=true;
begin inc(a);beta:=false end;
end;
end;
until eof(ft);
author:=a/40000; clrscr;gotoXY(10,10);
write(' ОБЪЕМ ТЕКСТА ',fn);gotoXY(10,11);
write(' Страниц: ',page);gotoXY(10,12);
write(' Всего символов в тексте: ',symb);gotoXY(10,13);
write(' Объем в авторских листах: ',author:2:3);
gotoXY(10,14); for j:=20 to 80 do write('_');writeln; readln;
END {volume}.
4. Сортировка текстовых файлов.
Сортировка файлов - весьма распространенная процедура, направленная на повышение эффективности многих важных процессов обработки файлов. По сути, сортировка - ключевая процедура для всего цикла обработки. Методы сортировки и их алгоритмизация достаточно хорошо изучены и описаны. Не имея возможности сколько-нибудь детально осветить здесь эту проблему, остановимся лишь на одном распространенном методе сортировки - методе "трёх лент" (названном ещё в старые и добрые времена, когда ленты были распространенным видом внешних носителей).
|
|
Сортировка файла принципиально отличается от сортировки массива данных тем, что файл может иметь любой размер. Поэтому нет гарантии того, что весь файл может быть одновременно помещен в оперативную память. Следовательно, сортировка файла должна использовать дополнительные файлы для хранения промежуточной информации. Метод "трёх лент" использует для этих целей два дополнительных файла, а основной идеей сортировки является чередование фаз "разделения" и "слияния" файлов до получения полностью отсортированного файла. Поясним эту идею более подробно.
Пусть требуется сортировать по возрастанию записей файл F, состоящий из последовательности записей-чисел R1,R2,...Rn, где n - число записей. Чтобы сформулировать эффективный критерий "разделения" файла, введём понятие:
Отрезок монотонности файла - это последовательность записей Ri,Ri+1, Ri+2,... Ri+m файла, удовлетворяющая условию:
Ri <= Ri+1<= Ri+2 <=..Ri+m и Ri-1>Ri, если i>1; Ri+m>Ri+m+1, если i+m<n.
Другими словами, отрезок монотонности - это последовательность упорядоченных записей файла, к которой не может быть добавлена ни одна запись слева или справа без нарушения свойства монотонности (этот отрезок может состоять, в частности, и из одной единственной записи). В файле может быть несколько непересекающихся отрезков монотонности Q1,Q2,...Qt, осуществляющих разбиение файла.
Для " разделения " заданного файла F на два файла F1 и F2 используем следующий критерий: при последовательном просмотре файла F отрезки монотонности с нечётными номерами Q1,Q3,... записываются в F1, а с чётными номерами Q2,Q4,... - в F2.
|
|
" Слиянием " файлов F1 и F2 в файл F назовем процесс записи в F следующей последовательности компонентов F1 и F2:
1) минимальный из первых компонентов F1 и F2;
2) минимальный из оставшегося незаписанным компонента предыдущего шага (сохранённого в буфере) и очередного прочитанного компонента из того файла, компонента которого была записана на предыдущем шаге.
3) если буфер пуст, то записи подлежит каждый прочитанный компонент в оставшейся части файла F1 или F2.
Каждый цикл "разделение-слияние" будет уменьшать количество отрезков монотонности в два раза, так как каждая пара отрезков (отрезок из F1 и отрезок из F2) будет слита в один отрезок в F. Таким образом, процесс сходится к состоянию, содержащему один отрезок монотонности (т.е. к отсортированному файлу F) не более чем за log2 (t) циклов "разделение-слияние".
Ниже приводится процедура сортировки текстового файла, реализующая описанный выше метод "трёх лент", оформленная в виде модуля Турбо Паскаля s_text и пример её использования - сортировка текстового файла по страницам:
UNIT s_text; {Модуль-процедура sort_file}