BEGIN {копируем последнюю серию из In1 или In2 (если такая имеется) в Result}
IF EOLN(In1) AND EOLN(In2)
THEN
WRITELN(In1);
ELSE
IF NOT EOLN(In1)
THEN {копируем оставшуюся серию из In1 (если такая имеется) в Result}
CopyOpen(In1, Result)
ELSE {копируем оставшуюся серию из In2 (если такая имеется) в Result}
CopyOpen(In2, Result)
END
10.2.3 Разделение серий.
Процедура также скрывает детали разделения одного файла на два. Часть
{разделить n/k серий длины k из Txt в n/2k серий в файлах Temp1 и Temp2}
будет спроектирована как оператор вызова процедуры
SplitIntoRuns(Txt, Temp1, Temp2)
Design Part 2.2
PROCEDURE SplitIntoRuns(VAR FileIn, Result1, Result2: TEXT)
{разделяем серии из FileIn в серии в каждом из файлов Result1 и Result2}
VAR
Switch, Ch: CHAR;
BEGIN {SplitIntoRuns}
RESET(FileIn);
REWRITE(Result1);
REWRITE(Result2);
{копируем серии попеременно в Result1 и Result2}
WRITELN(Result1);
RESET(Result1);
WRITELN(Result2);
RESET(Result2)
END {SplitIntoRuns}
Процедура SplitIntoRuns требует 2 символьные переменные: Ch для копирования символов и Switch для запоминания файла, в который происходит копирование в настоящий момент.
Design Part 2.2.1
BEGIN {копируем серии попеременно в Result1 и Result2}
Switch:= ‘1’;
WHILE NOT EOLN(FileIn)
DO
BEGIN
Read(FileIn, Ch);
{копируем Ch в Result1, если Switch=’1’, иначе – в Result2}
{Если встречен конец серии (Ch = ‘#’), то переключаем Switch на другой файл}
END
END
Завершение MergeSort1
Склеенный файл проверяется в двух местах программы, для того, чтобы определить, является он отсортированным или нет, поэтому эта проверка является естественным кандидатом для оформления в виде оператора процедуры:
{присвоить переменной Sorted значение ‘Y’ если Txt отсортирован, иначе - ‘N’ }
будет оформлено в
CheckIfSorted(Txt, Sorted)
Процедура CheckIfSorted устанавливает Sorted в ‘Y’, если в файле существует только одна серия (т.е. если за первым встреченным символом # сразу же следует символ конца строки).
Design Part 2.3
PROCEDURE CheckIfSorted(VAR FileIn: TEXT; VAR Sorted: Char);
{присвоить переменной Sorted значение ‘Y’ если Txt отсортирован, иначе - ‘N’ }
VAR
Ch, EndRun: CHAR;
BEGIN {CheckIfSorted}
RESET(FileIn);
IF EOLN(FileIn)
THEN {пустой файл отсортирован по определению}
Sorted:= ‘Y’
ELSE
{установить Sorted=’Y’, если в файле есть всего одна серия, и ‘N’ в противном случае}
END {CheckIfSorted}
И, наконец, для того, чтобы начать процесс разделения-слияния, Txt разделяется на односимвольные серии, разделенные символом #. С этой целью мы добавляем новую переменную Ch символьного типа к локальным переменным процедуры MergeSort1.